Subversion Repositories SmartDukaan

Rev

Rev 18474 | Rev 18504 | 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
        """
18474 manish.sha 80
        errorsMap={}
18010 manish.sha 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:
18474 manish.sha 88
                return purchaseOrders, errorsMap
18010 manish.sha 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:
18467 manish.sha 242
                            if errorsMap.has_key(itemId):
243
                                errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 244
                            else:
18467 manish.sha 245
                                errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 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:
18473 manish.sha 254
                        if errorsMap.has_key(itemId):
18467 manish.sha 255
                            errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 256
                        else:
18467 manish.sha 257
                            errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 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:
18474 manish.sha 265
                return purchaseOrders, errorsMap
18010 manish.sha 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:
18467 manish.sha 330
                        if errorsMap.has_key(item.id):
331
                            errorsMap[item.id] = errorsMap.get(item.id) + "| Could not find transfer price for vendor id: " + str(vendorId) +" "
18464 manish.sha 332
                        else:
18467 manish.sha 333
                            errorsMap[item.id] = "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)
18474 manish.sha 342
            print errorsMap
343
            return purchaseOrders, errorsMap
18010 manish.sha 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()
18474 manish.sha 423
    pendingPurchaseOrders, errorsMap = purchaseHandler.getPendingPurchaseOrders(7)
18475 manish.sha 424
    print errorsMap
18010 manish.sha 425
    print pendingPurchaseOrders
426
    for purchaseOrder in pendingPurchaseOrders:
427
        for lineitem in purchaseOrder.get('lineitems'):
428
            row += 1
429
            i=-1
430
            worksheet.write(row, inc(), purchaseOrder.get('SupplierName'))
431
            worksheet.write(row, inc(), lineitem.get('itemId'))
432
            worksheet.write(row, inc(), lineitem.get('brand')+" "+lineitem.get('modelName')+" "+lineitem.get('modelNumber')+" "+lineitem.get('color'))
433
            worksheet.write(row, inc(), lineitem.get('suggestedQuantity'))
434
            codCount =0;
435
            if lineitem.get('codCount') is not None:
436
                codCount = lineitem.get('codCount')
437
            worksheet.write(row, inc(), codCount)
438
            worksheet.write(row, inc(), long(lineitem.get('quantity'))-long(codCount))
439
            worksheet.write(row, inc(), lineitem.get('unitPrice'))
440
            worksheet.write(row, inc(), lineitem.get('nlc'))
441
            worksheet.write(row, inc(), float(lineitem.get('suggestedQuantity')) * float(lineitem.get('unitPrice')))
18016 manish.sha 442
            worksheet.write(row, inc(), lineitem.get('packQuantity'))
18010 manish.sha 443
            reservedCount = 0
444
            if lineitem.get('reservedQuantity') is not None:
445
                reservedCount = lineitem.get('reservedQuantity')
18425 manish.sha 446
            worksheet.write(row, inc(), long(lineitem.get('availableQuantity')))
18427 manish.sha 447
            worksheet.write(row, inc(), long(reservedCount))
18425 manish.sha 448
            worksheet.write(row, inc(), lineitem.get('virtualStock'))
449
            worksheet.write(row, inc(), long(reservedCount)-long(lineitem.get('availableQuantity')))
18010 manish.sha 450
            worksheet.write(row, inc(), lineitem.get('previouslyOrderedQty'))
451
            worksheet.write(row, inc(), "("+lineitem.get('lastXdaysSale')+")"+str(lineitem.get('avgSales')))
452
            worksheet.write(row, inc(), lineitem.get('rtoOrders'))
18425 manish.sha 453
            worksheet.write(row, inc(), lineitem.get('verificationPending'))
18010 manish.sha 454
            worksheet.write(row, inc(), lineitem.get('numberOfDaysStock'))
455
            worksheet.write(row, inc(), lineitem.get('minStockLevel'))
456
 
457
            stockThroughAvgSales = float(lineitem.get('avgSales')) * float(lineitem.get('numberOfDaysStock'))
458
            additionalQty = 0
459
            if stockThroughAvgSales > float(lineitem.get('minStockLevel')):
460
                additionalQty = stockThroughAvgSales
461
            else:
462
                additionalQty = float(lineitem.get('minStockLevel'))
463
 
464
            if float(lineitem.get('rtoOrders')) >1:
465
                additionalQty = additionalQty - (float(lineitem.get('rtoOrders'))/2)
466
 
467
            if additionalQty<0:
468
                additionalQty = 0
469
            worksheet.write(row, inc(), additionalQty)
18464 manish.sha 470
            error = "NA"
471
            if errorsMap.has_key(lineitem.get('itemId')):
472
                error = errorsMap.get(lineitem.get('itemId'))
473
            worksheet.write(row, inc(), error)
18010 manish.sha 474
    wb.save(XLS_O_FILENAME)
475
 
476
    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)
477
    #sendmail(["manish.sharma@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
478
 
479
if __name__ == '__main__':
480
    main()