Subversion Repositories SmartDukaan

Rev

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