Subversion Repositories SmartDukaan

Rev

Rev 18506 | Rev 18554 | 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]
18505 manish.sha 239
                    item = self.get_item_from_master(itemId)
18010 manish.sha 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:
18505 manish.sha 252
                    item = self.get_item_from_master(itemId)
18010 manish.sha 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
18504 manish.sha 336
                        t_po_lineitem['unitPrice'] = item_pricing.transferPrice
337
                        t_po_lineitem['nlc'] = item_pricing.nlc
338
                        t_po_lineitem['mrp'] = item.mrp
339
                        t_purchase_order['lineitems'].append(t_po_lineitem)
340
                        purchaseOrders.append(t_purchase_order)
18464 manish.sha 341
                        continue
18010 manish.sha 342
                    t_po_lineitem['unitPrice'] = item_pricing.transferPrice
343
                    t_po_lineitem['nlc'] = item_pricing.nlc
344
                    t_po_lineitem['mrp'] = item.mrp
345
                    t_purchase_order['lineitems'].append(t_po_lineitem)
346
                purchaseOrders.append(t_purchase_order)
18474 manish.sha 347
            print errorsMap
348
            return purchaseOrders, errorsMap
18010 manish.sha 349
        except Exception as e:
350
            print e
351
            print sys.exc_info()[0]
352
        finally:
353
            self.close_session()
354
 
355
    def close_session(self):
356
        if session.is_active:
357
            print "session is active. closing it."
358
            session.close()
359
 
18505 manish.sha 360
    def get_item_from_master(self, item_id):
18010 manish.sha 361
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
362
        return client.getItem(item_id)
363
 
364
def inc():
365
    global i
366
    i+=1
367
    return i
368
 
369
def sendmail(email, message, title, *varargs):
370
    if email == "":
371
        return
372
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
373
    mailServer.ehlo()
374
    mailServer.starttls()
375
    mailServer.ehlo()
376
 
377
    # Create the container (outer) email message.
378
    msg = MIMEMultipart()
379
    msg['Subject'] = title
380
    msg.preamble = title
381
    html_msg = MIMEText(message, 'html')
382
    msg.attach(html_msg)
383
 
384
    #snapdeal more to be added here
385
    for fileName in varargs:
386
        snapdeal = MIMEBase('application', 'vnd.ms-excel')
387
        snapdeal.set_payload(file(fileName).read())
388
        encoders.encode_base64(snapdeal)
389
        snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)
390
        msg.attach(snapdeal)
391
 
392
 
393
    MAILTO = email 
394
    mailServer.login(SENDER, PASSWORD)
395
    mailServer.sendmail(SENDER, MAILTO, msg.as_string())
396
 
397
def main():
398
    global i
399
    i = -1
400
    row = 0
401
    wb = xlwt.Workbook()
402
    worksheet = wb.add_sheet("All Pending Purchase Orders")
403
    worksheet.write(row, inc(), 'Supplier Name', boldStyle)
404
    worksheet.write(row, inc(), 'Item Id', boldStyle)
405
    worksheet.write(row, inc(), 'Product Name', boldStyle)
406
    worksheet.write(row, inc(), 'Quantity', boldStyle)
407
    worksheet.write(row, inc(), 'COD', boldStyle)
408
    worksheet.write(row, inc(), 'Prepaid', boldStyle)
409
    worksheet.write(row, inc(), 'Transfer price', boldStyle)
410
    worksheet.write(row, inc(), 'Nlc', boldStyle)
411
    worksheet.write(row, inc(), 'Total amount', boldStyle)
18016 manish.sha 412
    worksheet.write(row, inc(), 'Pack Quantity', boldStyle)
18425 manish.sha 413
    worksheet.write(row, inc(), 'Available Quantity', boldStyle)
18427 manish.sha 414
    worksheet.write(row, inc(), 'Reserved Quantity', boldStyle)
18425 manish.sha 415
    worksheet.write(row, inc(), 'Virtual Stock', boldStyle)
18010 manish.sha 416
    worksheet.write(row, inc(), 'NetPendingOrderQty', boldStyle)
417
    worksheet.write(row, inc(), 'PreviouslyOrderedQty', boldStyle)
418
    worksheet.write(row, inc(), 'AverageSale', boldStyle)
419
    worksheet.write(row, inc(), 'Pending RTOs', boldStyle)
18425 manish.sha 420
    worksheet.write(row, inc(), 'COD Pending Orders', boldStyle)
18010 manish.sha 421
    worksheet.write(row, inc(), 'NumDaysStock', boldStyle)
422
    worksheet.write(row, inc(), 'MinStockReq', boldStyle)
423
    worksheet.write(row, inc(), 'Additional Qty', boldStyle)
18464 manish.sha 424
    worksheet.write(row, inc(), 'Errors', boldStyle)
18010 manish.sha 425
 
426
 
427
    purchaseHandler = PurchaseHandler()
18474 manish.sha 428
    pendingPurchaseOrders, errorsMap = purchaseHandler.getPendingPurchaseOrders(7)
18475 manish.sha 429
    print errorsMap
18010 manish.sha 430
    print pendingPurchaseOrders
18504 manish.sha 431
 
432
    for itemId, error in errorsMap.items():
433
        row += 1
434
        i=-1
435
        worksheet.write(row, inc(), "Not_defined")
436
        worksheet.write(row, inc(), str(itemId))
18505 manish.sha 437
        item = purchaseHandler.get_item_from_master(itemId)
18506 manish.sha 438
        worksheet.write(row, inc(), item.brand+" "+item.modelName+" "+item.modelNumber+" "+item.color)
18504 manish.sha 439
        worksheet.write(row, inc(), 0)
440
 
441
        worksheet.write(row, inc(), 0)
442
        worksheet.write(row, inc(), 0)
443
        worksheet.write(row, inc(), 0)
444
        worksheet.write(row, inc(), 0)
445
        worksheet.write(row, inc(), 0)
446
        worksheet.write(row, inc(), 0)
447
        worksheet.write(row, inc(), 0)
448
        worksheet.write(row, inc(), 0)
449
        worksheet.write(row, inc(), 0)
450
        worksheet.write(row, inc(), 0)
451
        worksheet.write(row, inc(), 0)
452
        worksheet.write(row, inc(), "Not_defined")
453
        worksheet.write(row, inc(), 0)
454
        worksheet.write(row, inc(), 0)
455
        worksheet.write(row, inc(), 0)
456
        worksheet.write(row, inc(), 0)
457
        worksheet.write(row, inc(), 0)
458
        worksheet.write(row, inc(), error)
459
 
18010 manish.sha 460
    for purchaseOrder in pendingPurchaseOrders:
461
        for lineitem in purchaseOrder.get('lineitems'):
462
            row += 1
463
            i=-1
464
            worksheet.write(row, inc(), purchaseOrder.get('SupplierName'))
465
            worksheet.write(row, inc(), lineitem.get('itemId'))
466
            worksheet.write(row, inc(), lineitem.get('brand')+" "+lineitem.get('modelName')+" "+lineitem.get('modelNumber')+" "+lineitem.get('color'))
467
            worksheet.write(row, inc(), lineitem.get('suggestedQuantity'))
468
            codCount =0;
469
            if lineitem.get('codCount') is not None:
470
                codCount = lineitem.get('codCount')
471
            worksheet.write(row, inc(), codCount)
472
            worksheet.write(row, inc(), long(lineitem.get('quantity'))-long(codCount))
473
            worksheet.write(row, inc(), lineitem.get('unitPrice'))
474
            worksheet.write(row, inc(), lineitem.get('nlc'))
475
            worksheet.write(row, inc(), float(lineitem.get('suggestedQuantity')) * float(lineitem.get('unitPrice')))
18016 manish.sha 476
            worksheet.write(row, inc(), lineitem.get('packQuantity'))
18010 manish.sha 477
            reservedCount = 0
478
            if lineitem.get('reservedQuantity') is not None:
479
                reservedCount = lineitem.get('reservedQuantity')
18425 manish.sha 480
            worksheet.write(row, inc(), long(lineitem.get('availableQuantity')))
18427 manish.sha 481
            worksheet.write(row, inc(), long(reservedCount))
18425 manish.sha 482
            worksheet.write(row, inc(), lineitem.get('virtualStock'))
483
            worksheet.write(row, inc(), long(reservedCount)-long(lineitem.get('availableQuantity')))
18010 manish.sha 484
            worksheet.write(row, inc(), lineitem.get('previouslyOrderedQty'))
485
            worksheet.write(row, inc(), "("+lineitem.get('lastXdaysSale')+")"+str(lineitem.get('avgSales')))
486
            worksheet.write(row, inc(), lineitem.get('rtoOrders'))
18425 manish.sha 487
            worksheet.write(row, inc(), lineitem.get('verificationPending'))
18010 manish.sha 488
            worksheet.write(row, inc(), lineitem.get('numberOfDaysStock'))
489
            worksheet.write(row, inc(), lineitem.get('minStockLevel'))
490
 
491
            stockThroughAvgSales = float(lineitem.get('avgSales')) * float(lineitem.get('numberOfDaysStock'))
492
            additionalQty = 0
493
            if stockThroughAvgSales > float(lineitem.get('minStockLevel')):
494
                additionalQty = stockThroughAvgSales
495
            else:
496
                additionalQty = float(lineitem.get('minStockLevel'))
497
 
498
            if float(lineitem.get('rtoOrders')) >1:
499
                additionalQty = additionalQty - (float(lineitem.get('rtoOrders'))/2)
500
 
501
            if additionalQty<0:
502
                additionalQty = 0
503
            worksheet.write(row, inc(), additionalQty)
18464 manish.sha 504
            error = "NA"
505
            if errorsMap.has_key(lineitem.get('itemId')):
506
                error = errorsMap.get(lineitem.get('itemId'))
507
            worksheet.write(row, inc(), error)
18010 manish.sha 508
    wb.save(XLS_O_FILENAME)
509
 
510
    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)
511
    #sendmail(["manish.sharma@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
512
 
513
if __name__ == '__main__':
514
    main()