Subversion Repositories SmartDukaan

Rev

Rev 18466 | Rev 18469 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
18010 manish.sha 1
from elixir import metadata, setup_all, session
2
from shop2020.clients.CatalogClient import CatalogClient
3
from shop2020.clients.InventoryClient import InventoryClient
4
from shop2020.clients.TransactionClient import TransactionClient
5
from shop2020.purchase.main.model.Invoice import Invoice
6
from shop2020.purchase.main.model.LineItem import LineItem
7
from shop2020.purchase.main.model.Purchase import Purchase
8
from shop2020.purchase.main.model.PurchaseReturn import PurchaseReturn
9
from shop2020.purchase.main.model.PurchaseReturnSettlement import PurchaseReturnSettlement
10
from shop2020.purchase.main.model.RevisionedPurchaseOrder import \
11
    RevisionedPurchaseOrder
12
from shop2020.purchase.main.model.Supplier import Supplier
13
from shop2020.purchase.main.model.PurchaseOrder import PurchaseOrder
14
from shop2020.thriftpy.generic.ttypes import ExceptionType
15
from shop2020.thriftpy.model.v1.inventory.ttypes import WarehouseType, \
16
    InventoryType, ItemStockPurchaseParams
17
from shop2020.thriftpy.model.v1.order.ttypes import OrderStatus
18
from shop2020.thriftpy.purchase.ttypes import PurchaseServiceException, POStatus, \
19
    PurchaseOrder as TPurchaseOrder, LineItem as TLineItem, POType,\
20
    PurchaseReturnType, PurchaseReturnInventoryType
21
from shop2020.utils.Utils import to_py_date
22
from sqlalchemy import create_engine
23
from sqlalchemy.sql.expression import or_
24
from datetime import date, datetime, timedelta
25
import logging
26
import sys
27
from xlrd import open_workbook
28
from xlwt.Workbook import Workbook
29
import smtplib
30
import time
31
import xlwt
32
from email import encoders
33
from email.mime.base import MIMEBase
34
from email.mime.multipart import MIMEMultipart
35
from email.mime.text import MIMEText
36
 
37
 
38
XLS_O_FILENAME = "allPendingPOs.xls"
39
SENDER = "adwords@shop2020.in"
40
PASSWORD = "adwords_shop2020"
41
SUBJECT = "Pending Purchase Order " + date.today().isoformat()
42
SMTP_SERVER = "smtp.gmail.com"
43
SMTP_PORT = 587
44
boldStyle = xlwt.XFStyle()
45
f = xlwt.Font()
46
f.bold = True
47
boldStyle.font = f
48
i = -1
18464 manish.sha 49
errorsMap={}
18010 manish.sha 50
 
51
datetime_format = xlwt.XFStyle()
52
datetime_format.num_format_str = 'dd/mm/yyyy HH:MM AM/PM'
53
 
54
class PurchaseHandler:
55
    '''
56
    classdocs
57
    '''
58
 
59
    def __init__(self, dbname='warehouse', db_hostname='localhost',  echoOn=True):
60
        '''
61
        Constructor
62
        '''
63
        engine = create_engine('mysql://root:shop2020@' + db_hostname + '/' + dbname, pool_recycle=7200)
64
        metadata.bind = engine
65
        metadata.bind.echo = echoOn
66
        setup_all(True)
67
 
68
    def getSuppliers(self,):
69
        """
70
        Returns all the valid suppliers
71
        """
72
        return [Supplier.to_thrift_object(supplier) for supplier in Supplier.query.all()]
73
 
74
    def getPendingPurchaseOrders(self, warehouseId):
75
        """
76
        Creates purchase order objects from pending orders
77
 
78
        Parameters:
79
         - warehouseId
80
        """
18466 manish.sha 81
        global errorsMap
18010 manish.sha 82
        try:
83
            purchaseOrders = []
84
 
85
            transactionClient = TransactionClient().get_client()
18425 manish.sha 86
            pending_orders = transactionClient.getOrdersInBatch([OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.ACCEPTED, OrderStatus.COD_VERIFICATION_PENDING], 0, 0, warehouseId, 0)
18010 manish.sha 87
 
88
            if not pending_orders:
89
                return purchaseOrders
90
 
91
            inventory_client = InventoryClient().get_client()
92
            availability = {}
18425 manish.sha 93
            virtualInventory = {}
18010 manish.sha 94
 
95
            ourGoodWarehouseIds = [w.id for w in inventory_client.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, None, warehouseId)]
18429 manish.sha 96
            ourVirtualWarehouseIds = [w.id for w in inventory_client.getWarehouses(WarehouseType.THIRD_PARTY, InventoryType.GOOD, 0, None, None)]
18010 manish.sha 97
            itemInventorySnapshot = inventory_client.getInventorySnapshot(0)
98
            for itemId, itemInventory in itemInventorySnapshot.iteritems():
99
                '''item = self.__get_item_from_master(itemId)'''
100
                for warehouseId, quantity in itemInventory.availability.iteritems():
101
                    if warehouseId in ourGoodWarehouseIds:
102
                        if availability.has_key(itemId):
103
                            availability[itemId] = [availability[itemId][0] + quantity]
104
                        else:
105
                            availability[itemId] = [quantity]
18425 manish.sha 106
 
107
                    if warehouseId in ourVirtualWarehouseIds:
108
                        if virtualInventory.has_key(itemId):
109
                            virtualInventory[itemId] = [virtualInventory[itemId][0] + quantity]
110
                        else:
111
                            virtualInventory[itemId] = [quantity]
112
 
18010 manish.sha 113
            previouslyOrderedQty = {}
114
            unfulfilledPurchaseOrders = PurchaseOrder.query.filter(or_(PurchaseOrder.status == POStatus.PARTIALLY_FULFILLED, PurchaseOrder.status == POStatus.READY)).filter(PurchaseOrder.type == POType.REAL).all()
115
            for purchaseOrder in unfulfilledPurchaseOrders:
116
                for lineitem in purchaseOrder.lineitems:
117
                    if previouslyOrderedQty.has_key(lineitem.itemId):
118
                        previouslyOrderedQty[lineitem.itemId] = previouslyOrderedQty[lineitem.itemId] + lineitem.unfulfilledQuantity
119
                    else:
120
                        previouslyOrderedQty[lineitem.itemId] = lineitem.unfulfilledQuantity
121
 
122
                    if availability.has_key(lineitem.itemId):
123
                        availability[lineitem.itemId] = [availability[lineitem.itemId][0] + lineitem.unfulfilledQuantity]
124
                    else:
125
                        '''item = self.__get_item_from_master(lineitem.itemId)'''
126
                        availability[lineitem.itemId] = [lineitem.unfulfilledQuantity]
127
 
128
            codRequirements = {}
129
            requirements = {}
18425 manish.sha 130
            verificationPendingOrders = {}
18010 manish.sha 131
            for order in pending_orders:
132
                if order.purchaseOrderId:
133
                    continue
134
                for lineitem in order.lineitems:
135
                    if (requirements.has_key(lineitem.item_id)):
18425 manish.sha 136
                        requirements[lineitem.item_id] = requirements.get(lineitem.item_id) + lineitem.quantity
18010 manish.sha 137
                    else:
138
                        requirements[lineitem.item_id] = lineitem.quantity
139
 
140
                    if order.cod:
141
                        if (codRequirements.has_key(lineitem.item_id)):
18425 manish.sha 142
                            codRequirements[lineitem.item_id] = codRequirements.get(lineitem.item_id) + lineitem.quantity
18010 manish.sha 143
                        else:
144
                            codRequirements[lineitem.item_id] = lineitem.quantity
18425 manish.sha 145
 
146
                        if order.status == OrderStatus.COD_VERIFICATION_PENDING:
147
                            if (verificationPendingOrders.has_key(lineitem.item_id)):
148
                                verificationPendingOrders[lineitem.item_id] = verificationPendingOrders.get(lineitem.item_id) + lineitem.quantity
149
                            else:
150
                                verificationPendingOrders[lineitem.item_id] = lineitem.quantity
18010 manish.sha 151
 
152
            advancedPOParameters = {}
153
            SKUListForPO = []
154
            inventory_client = InventoryClient().get_client()
155
            itemStockPurchaseParams = inventory_client.getNonZeroItemStockPurchaseParams()
156
            for itemStockPurchaseParam in itemStockPurchaseParams:
157
                inventory_client = InventoryClient().get_client()
158
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(itemStockPurchaseParam.item_id, 0, 3)
159
                salesCount = 0
160
                numDaysInStock = 0
161
                rtoCount = 0
162
                avgSales = 0.0
163
                lastXdaysSale ="" 
164
                for oosStatus in oosStatuses:
165
                    if oosStatus.is_oos == False:
166
                        salesCount = salesCount + oosStatus.num_orders
167
                        numDaysInStock = numDaysInStock + 1
168
                        lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-" 
169
                    else:
170
                        lastXdaysSale = lastXdaysSale + "X-"
171
                if oosStatus.rto_orders is not None:
172
                    rtoCount = oosStatus.rto_orders
173
                lastXdaysSale = lastXdaysSale[:-1]
174
                if numDaysInStock>0:
175
                    avgSales = float(salesCount)/numDaysInStock
176
                advancedPOParameters[itemStockPurchaseParam.item_id] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2) , numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
177
                if itemInventorySnapshot.has_key(itemStockPurchaseParam.item_id):
178
                    itemAvailability = itemInventorySnapshot.get(itemStockPurchaseParam.item_id)
179
                    currentAvailability = 0
180
                    currentReserved = 0
181
                    for wId, rQty in itemAvailability.reserved.iteritems():
182
                        if wId in ourGoodWarehouseIds:
183
                            currentReserved = currentReserved + rQty
184
                    #Key Condition Added By Manish Sharma        
185
                    if availability.has_key(itemStockPurchaseParam.item_id):
186
                        if availability[itemStockPurchaseParam.item_id] is None:
187
                                availability[itemStockPurchaseParam.item_id] = [0]
188
                    else:
189
                        availability[itemStockPurchaseParam.item_id] = [0]
190
                    if (availability[itemStockPurchaseParam.item_id][0] - currentReserved) < max(advancedPOParameters[itemStockPurchaseParam.item_id][0], advancedPOParameters[itemStockPurchaseParam.item_id][3]):
191
                        SKUListForPO.append(itemStockPurchaseParam.item_id)
192
                else:
193
                    SKUListForPO.append(itemStockPurchaseParam.item_id)
194
 
195
            for key in requirements:
196
                if advancedPOParameters.has_key(key):
197
                    continue
198
                print "Item Id ---", key
199
                inventory_client = InventoryClient().get_client()
200
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(key, 0, 3)
201
                salesCount = 0
202
                numDaysInStock = 0
203
                rtoCount = 0
204
                avgSales = 0.0
205
                lastXdaysSale = ""
206
                for oosStatus in oosStatuses:
207
                    if oosStatus.is_oos == False:
208
                        salesCount = salesCount + oosStatus.num_orders
209
                        numDaysInStock = numDaysInStock + 1
210
                        lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-" 
211
                    else:
212
                        lastXdaysSale = lastXdaysSale + "X-"
213
                lastXdaysSale = lastXdaysSale[:-1]
214
                if oosStatus.rto_orders:
215
                    rtoCount = oosStatus.rto_orders
216
                if numDaysInStock>0:
217
                    avgSales = float(salesCount)/float(numDaysInStock)
218
                itemStockPurchaseParam = ItemStockPurchaseParams()
219
                try:
220
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
221
                except Exception as e:
18464 manish.sha 222
                    if errorsMap.has_key(key):
223
                        errorsMap[key] = errorsMap.get(key) + "| Item Stock Purchase Param Missing"
224
                    else:
225
                        errorsMap[key] = "Item Stock Purchase Param Missing "
226
                    continue
18010 manish.sha 227
                    inventory_client.updateItemStockPurchaseParams(key, 0, 0)
228
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
229
                advancedPOParameters[key] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2), numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
230
 
231
            cumulativeRequirementsItemIds = list(set(requirements.keys()+SKUListForPO))
232
            netRequirements = {}
233
            for itemId in cumulativeRequirementsItemIds:
234
                print "Item Id for Preferred Vendor", itemId
235
                requirementsCount = requirements.get(itemId)
236
                if requirementsCount is None:
237
                    requirementsCount = 0.0
238
                if  availability.has_key(itemId):
239
                    availabilityCount = availability.get(itemId)[0]
240
                    item = self.__get_item_from_master(itemId)
241
                    if requirementsCount > availabilityCount or itemId in SKUListForPO:
242
                        if item.preferredVendor is None:
18467 manish.sha 243
                            if errorsMap.has_key(itemId):
244
                                errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 245
                            else:
18467 manish.sha 246
                                errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 247
                            continue
18010 manish.sha 248
                        if (netRequirements.has_key(item.preferredVendor)):
249
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
250
                        else:
251
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
252
                else:
253
                    item = self.__get_item_from_master(itemId)
254
                    if item.preferredVendor is None:
18464 manish.sha 255
                        if errorsMap.has_key(key):
18467 manish.sha 256
                            errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 257
                        else:
18467 manish.sha 258
                            errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 259
                        continue
18010 manish.sha 260
                    if (netRequirements.has_key(item.preferredVendor)):
261
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
262
                    else:
263
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
264
 
265
            if not netRequirements:
266
                return purchaseOrders
267
 
268
 
269
            suppliersMap = {}
270
            for supplier in self.getSuppliers():
271
                suppliersMap[supplier.id] = supplier
272
 
273
 
274
            for vendorId in netRequirements.keys():
275
                t_purchase_order = {}
276
                supplier = suppliersMap.get(vendorId)
277
                t_purchase_order['SupplierName'] = supplier.name
278
                t_purchase_order['lineitems']= []
279
                for key in netRequirements.get(vendorId):
280
                    item = key[0]
281
                    quantity = key[1]
282
 
283
                    t_po_lineitem = {}
284
                    t_po_lineitem['productGroup'] = item.productGroup
285
                    t_po_lineitem['brand'] = item.brand
286
                    t_po_lineitem['modelNumber'] = item.modelNumber
287
                    t_po_lineitem['modelName'] = item.modelName
288
                    t_po_lineitem['color'] = item.color
289
                    t_po_lineitem['itemId'] = item.id
290
                    t_po_lineitem['packQuantity'] = item.packQuantity
291
                    if quantity <0: #TODO Check this logic
292
                        quantity=0
293
                    t_po_lineitem['quantity'] = quantity
294
                    t_po_lineitem['availableQuantity'] = 0
295
                    if availability.has_key(item.id):
296
                        if previouslyOrderedQty.has_key(item.id):
297
                            t_po_lineitem['availableQuantity'] = availability[item.id][0] - previouslyOrderedQty[item.id]
298
                        else:
299
                            t_po_lineitem['availableQuantity'] = availability[item.id][0]
300
                    if requirements.has_key(item.id):
301
                        t_po_lineitem['reservedQuantity'] = requirements[item.id]
302
                    additionalQty = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3])
303
                    additionalQty = max(0,(additionalQty - (advancedPOParameters[item.id][6]/2)))
304
                    suggestedQuantity = additionalQty +key[1]
305
                    t_po_lineitem['suggestedQuantity'] = max(0,suggestedQuantity)
306
                    #t_po_lineitem.suggestedQuantity = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3]) + key[1]
307
                    t_po_lineitem['avgSales'] = advancedPOParameters[item.id][1]
308
                    t_po_lineitem['numberOfDaysInStock'] = advancedPOParameters[item.id][2] 
309
                    t_po_lineitem['minStockLevel'] = advancedPOParameters[item.id][3]
310
                    t_po_lineitem['numberOfDaysStock'] = advancedPOParameters[item.id][4]
311
                    t_po_lineitem['lastXdaysSale'] = advancedPOParameters[item.id][5]
312
                    t_po_lineitem['rtoOrders'] = advancedPOParameters[item.id][6]
18425 manish.sha 313
                    if verificationPendingOrders.has_key(item.id):
314
                        t_po_lineitem['verificationPending'] = verificationPendingOrders[item.id]
315
                    else:
316
                        t_po_lineitem['verificationPending'] = 0
317
 
318
                    if virtualInventory.has_key(item.id):
18429 manish.sha 319
                        t_po_lineitem['virtualStock'] = virtualInventory[item.id][0]
18425 manish.sha 320
                    else:
321
                        t_po_lineitem['virtualStock'] = 0
18010 manish.sha 322
                    if previouslyOrderedQty.has_key(item.id):
323
                        t_po_lineitem['previouslyOrderedQty'] = previouslyOrderedQty[item.id]
324
                    else:
325
                        t_po_lineitem['previouslyOrderedQty'] = 0
326
                    if codRequirements.has_key(item.id):
327
                        t_po_lineitem['codCount'] = min(codRequirements[item.id], quantity)
328
                    try:
329
                        item_pricing = inventory_client.getItemPricing(item.id, vendorId)
330
                    except Exception as e:
18467 manish.sha 331
                        if errorsMap.has_key(item.id):
332
                            errorsMap[item.id] = errorsMap.get(item.id) + "| Could not find transfer price for vendor id: " + str(vendorId) +" "
18464 manish.sha 333
                        else:
18467 manish.sha 334
                            errorsMap[item.id] = "Could not find transfer price for vendor id: " + str(vendorId) +" "
18010 manish.sha 335
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
336
                        print e
18464 manish.sha 337
                        continue
18010 manish.sha 338
                    t_po_lineitem['unitPrice'] = item_pricing.transferPrice
339
                    t_po_lineitem['nlc'] = item_pricing.nlc
340
                    t_po_lineitem['mrp'] = item.mrp
341
                    t_purchase_order['lineitems'].append(t_po_lineitem)
342
                purchaseOrders.append(t_purchase_order)
343
            return purchaseOrders
344
        except Exception as e:
345
            print e
346
            print sys.exc_info()[0]
347
        finally:
348
            self.close_session()
349
 
350
    def close_session(self):
351
        if session.is_active:
352
            print "session is active. closing it."
353
            session.close()
354
 
355
    def __get_item_from_master(self, item_id):
356
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
357
        return client.getItem(item_id)
358
 
359
def inc():
360
    global i
361
    i+=1
362
    return i
363
 
364
def sendmail(email, message, title, *varargs):
365
    if email == "":
366
        return
367
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
368
    mailServer.ehlo()
369
    mailServer.starttls()
370
    mailServer.ehlo()
371
 
372
    # Create the container (outer) email message.
373
    msg = MIMEMultipart()
374
    msg['Subject'] = title
375
    msg.preamble = title
376
    html_msg = MIMEText(message, 'html')
377
    msg.attach(html_msg)
378
 
379
    #snapdeal more to be added here
380
    for fileName in varargs:
381
        snapdeal = MIMEBase('application', 'vnd.ms-excel')
382
        snapdeal.set_payload(file(fileName).read())
383
        encoders.encode_base64(snapdeal)
384
        snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)
385
        msg.attach(snapdeal)
386
 
387
 
388
    MAILTO = email 
389
    mailServer.login(SENDER, PASSWORD)
390
    mailServer.sendmail(SENDER, MAILTO, msg.as_string())
391
 
392
def main():
393
    global i
394
    i = -1
395
    row = 0
396
    wb = xlwt.Workbook()
397
    worksheet = wb.add_sheet("All Pending Purchase Orders")
398
    worksheet.write(row, inc(), 'Supplier Name', boldStyle)
399
    worksheet.write(row, inc(), 'Item Id', boldStyle)
400
    worksheet.write(row, inc(), 'Product Name', boldStyle)
401
    worksheet.write(row, inc(), 'Quantity', boldStyle)
402
    worksheet.write(row, inc(), 'COD', boldStyle)
403
    worksheet.write(row, inc(), 'Prepaid', boldStyle)
404
    worksheet.write(row, inc(), 'Transfer price', boldStyle)
405
    worksheet.write(row, inc(), 'Nlc', boldStyle)
406
    worksheet.write(row, inc(), 'Total amount', boldStyle)
18016 manish.sha 407
    worksheet.write(row, inc(), 'Pack Quantity', boldStyle)
18425 manish.sha 408
    worksheet.write(row, inc(), 'Available Quantity', boldStyle)
18427 manish.sha 409
    worksheet.write(row, inc(), 'Reserved Quantity', boldStyle)
18425 manish.sha 410
    worksheet.write(row, inc(), 'Virtual Stock', boldStyle)
18010 manish.sha 411
    worksheet.write(row, inc(), 'NetPendingOrderQty', boldStyle)
412
    worksheet.write(row, inc(), 'PreviouslyOrderedQty', boldStyle)
413
    worksheet.write(row, inc(), 'AverageSale', boldStyle)
414
    worksheet.write(row, inc(), 'Pending RTOs', boldStyle)
18425 manish.sha 415
    worksheet.write(row, inc(), 'COD Pending Orders', boldStyle)
18010 manish.sha 416
    worksheet.write(row, inc(), 'NumDaysStock', boldStyle)
417
    worksheet.write(row, inc(), 'MinStockReq', boldStyle)
418
    worksheet.write(row, inc(), 'Additional Qty', boldStyle)
18464 manish.sha 419
    worksheet.write(row, inc(), 'Errors', boldStyle)
18010 manish.sha 420
 
421
 
422
    purchaseHandler = PurchaseHandler()
423
    pendingPurchaseOrders = purchaseHandler.getPendingPurchaseOrders(7)
424
    print pendingPurchaseOrders
425
    for purchaseOrder in pendingPurchaseOrders:
426
        for lineitem in purchaseOrder.get('lineitems'):
427
            row += 1
428
            i=-1
429
            worksheet.write(row, inc(), purchaseOrder.get('SupplierName'))
430
            worksheet.write(row, inc(), lineitem.get('itemId'))
431
            worksheet.write(row, inc(), lineitem.get('brand')+" "+lineitem.get('modelName')+" "+lineitem.get('modelNumber')+" "+lineitem.get('color'))
432
            worksheet.write(row, inc(), lineitem.get('suggestedQuantity'))
433
            codCount =0;
434
            if lineitem.get('codCount') is not None:
435
                codCount = lineitem.get('codCount')
436
            worksheet.write(row, inc(), codCount)
437
            worksheet.write(row, inc(), long(lineitem.get('quantity'))-long(codCount))
438
            worksheet.write(row, inc(), lineitem.get('unitPrice'))
439
            worksheet.write(row, inc(), lineitem.get('nlc'))
440
            worksheet.write(row, inc(), float(lineitem.get('suggestedQuantity')) * float(lineitem.get('unitPrice')))
18016 manish.sha 441
            worksheet.write(row, inc(), lineitem.get('packQuantity'))
18010 manish.sha 442
            reservedCount = 0
443
            if lineitem.get('reservedQuantity') is not None:
444
                reservedCount = lineitem.get('reservedQuantity')
18425 manish.sha 445
            worksheet.write(row, inc(), long(lineitem.get('availableQuantity')))
18427 manish.sha 446
            worksheet.write(row, inc(), long(reservedCount))
18425 manish.sha 447
            worksheet.write(row, inc(), lineitem.get('virtualStock'))
448
            worksheet.write(row, inc(), long(reservedCount)-long(lineitem.get('availableQuantity')))
18010 manish.sha 449
            worksheet.write(row, inc(), lineitem.get('previouslyOrderedQty'))
450
            worksheet.write(row, inc(), "("+lineitem.get('lastXdaysSale')+")"+str(lineitem.get('avgSales')))
451
            worksheet.write(row, inc(), lineitem.get('rtoOrders'))
18425 manish.sha 452
            worksheet.write(row, inc(), lineitem.get('verificationPending'))
18010 manish.sha 453
            worksheet.write(row, inc(), lineitem.get('numberOfDaysStock'))
454
            worksheet.write(row, inc(), lineitem.get('minStockLevel'))
455
 
456
            stockThroughAvgSales = float(lineitem.get('avgSales')) * float(lineitem.get('numberOfDaysStock'))
457
            additionalQty = 0
458
            if stockThroughAvgSales > float(lineitem.get('minStockLevel')):
459
                additionalQty = stockThroughAvgSales
460
            else:
461
                additionalQty = float(lineitem.get('minStockLevel'))
462
 
463
            if float(lineitem.get('rtoOrders')) >1:
464
                additionalQty = additionalQty - (float(lineitem.get('rtoOrders'))/2)
465
 
466
            if additionalQty<0:
467
                additionalQty = 0
468
            worksheet.write(row, inc(), additionalQty)
18464 manish.sha 469
            error = "NA"
470
            if errorsMap.has_key(lineitem.get('itemId')):
471
                error = errorsMap.get(lineitem.get('itemId'))
472
            worksheet.write(row, inc(), error)
18010 manish.sha 473
    wb.save(XLS_O_FILENAME)
474
 
475
    sendmail(["amit.gupta@shop2020.in", "rajneesh.arora@saholic.com", "chaitnaya.vats@saholic.com", "manoj.kumar@saholic.com", "manish.sharma@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
476
    #sendmail(["manish.sharma@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
477
 
478
if __name__ == '__main__':
479
    main()