Subversion Repositories SmartDukaan

Rev

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