Subversion Repositories SmartDukaan

Rev

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

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