Subversion Repositories SmartDukaan

Rev

Rev 18557 | Rev 20172 | 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)
18555 amit.gupta 219
                itemStockPurchaseParam = None
18010 manish.sha 220
                try:
221
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
222
                except Exception as e:
18464 manish.sha 223
                    if errorsMap.has_key(key):
224
                        errorsMap[key] = errorsMap.get(key) + "| Item Stock Purchase Param Missing"
225
                    else:
226
                        errorsMap[key] = "Item Stock Purchase Param Missing "
227
                    continue
18010 manish.sha 228
                    inventory_client.updateItemStockPurchaseParams(key, 0, 0)
229
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
18555 amit.gupta 230
 
18556 amit.gupta 231
                if itemStockPurchaseParam.numOfDaysStock is None:
18555 amit.gupta 232
                    itemStockPurchaseParam.minStockLevel = 0
233
                    itemStockPurchaseParam.numOfDaysStock = 0
234
                    itemStockPurchaseParam.item_id = key
235
 
18010 manish.sha 236
                advancedPOParameters[key] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2), numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
237
 
238
            cumulativeRequirementsItemIds = list(set(requirements.keys()+SKUListForPO))
239
            netRequirements = {}
240
            for itemId in cumulativeRequirementsItemIds:
241
                print "Item Id for Preferred Vendor", itemId
242
                requirementsCount = requirements.get(itemId)
243
                if requirementsCount is None:
244
                    requirementsCount = 0.0
245
                if  availability.has_key(itemId):
246
                    availabilityCount = availability.get(itemId)[0]
18505 manish.sha 247
                    item = self.get_item_from_master(itemId)
18010 manish.sha 248
                    if requirementsCount > availabilityCount or itemId in SKUListForPO:
249
                        if item.preferredVendor is None:
18467 manish.sha 250
                            if errorsMap.has_key(itemId):
251
                                errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 252
                            else:
18467 manish.sha 253
                                errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 254
                            continue
18010 manish.sha 255
                        if (netRequirements.has_key(item.preferredVendor)):
256
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
257
                        else:
258
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
259
                else:
18505 manish.sha 260
                    item = self.get_item_from_master(itemId)
18010 manish.sha 261
                    if item.preferredVendor is None:
18473 manish.sha 262
                        if errorsMap.has_key(itemId):
18467 manish.sha 263
                            errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 264
                        else:
18467 manish.sha 265
                            errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 266
                        continue
18010 manish.sha 267
                    if (netRequirements.has_key(item.preferredVendor)):
268
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
269
                    else:
270
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
271
 
272
            if not netRequirements:
18474 manish.sha 273
                return purchaseOrders, errorsMap
18010 manish.sha 274
 
275
 
276
            suppliersMap = {}
277
            for supplier in self.getSuppliers():
278
                suppliersMap[supplier.id] = supplier
279
 
280
 
281
            for vendorId in netRequirements.keys():
282
                t_purchase_order = {}
283
                supplier = suppliersMap.get(vendorId)
284
                t_purchase_order['SupplierName'] = supplier.name
285
                t_purchase_order['lineitems']= []
286
                for key in netRequirements.get(vendorId):
287
                    item = key[0]
288
                    quantity = key[1]
289
 
290
                    t_po_lineitem = {}
291
                    t_po_lineitem['productGroup'] = item.productGroup
292
                    t_po_lineitem['brand'] = item.brand
293
                    t_po_lineitem['modelNumber'] = item.modelNumber
294
                    t_po_lineitem['modelName'] = item.modelName
295
                    t_po_lineitem['color'] = item.color
296
                    t_po_lineitem['itemId'] = item.id
297
                    t_po_lineitem['packQuantity'] = item.packQuantity
298
                    if quantity <0: #TODO Check this logic
299
                        quantity=0
300
                    t_po_lineitem['quantity'] = quantity
301
                    t_po_lineitem['availableQuantity'] = 0
302
                    if availability.has_key(item.id):
303
                        if previouslyOrderedQty.has_key(item.id):
304
                            t_po_lineitem['availableQuantity'] = availability[item.id][0] - previouslyOrderedQty[item.id]
305
                        else:
306
                            t_po_lineitem['availableQuantity'] = availability[item.id][0]
307
                    if requirements.has_key(item.id):
308
                        t_po_lineitem['reservedQuantity'] = requirements[item.id]
309
                    additionalQty = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3])
310
                    additionalQty = max(0,(additionalQty - (advancedPOParameters[item.id][6]/2)))
311
                    suggestedQuantity = additionalQty +key[1]
312
                    t_po_lineitem['suggestedQuantity'] = max(0,suggestedQuantity)
313
                    #t_po_lineitem.suggestedQuantity = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3]) + key[1]
314
                    t_po_lineitem['avgSales'] = advancedPOParameters[item.id][1]
315
                    t_po_lineitem['numberOfDaysInStock'] = advancedPOParameters[item.id][2] 
316
                    t_po_lineitem['minStockLevel'] = advancedPOParameters[item.id][3]
317
                    t_po_lineitem['numberOfDaysStock'] = advancedPOParameters[item.id][4]
318
                    t_po_lineitem['lastXdaysSale'] = advancedPOParameters[item.id][5]
319
                    t_po_lineitem['rtoOrders'] = advancedPOParameters[item.id][6]
18425 manish.sha 320
                    if verificationPendingOrders.has_key(item.id):
321
                        t_po_lineitem['verificationPending'] = verificationPendingOrders[item.id]
322
                    else:
323
                        t_po_lineitem['verificationPending'] = 0
324
 
325
                    if virtualInventory.has_key(item.id):
18429 manish.sha 326
                        t_po_lineitem['virtualStock'] = virtualInventory[item.id][0]
18425 manish.sha 327
                    else:
328
                        t_po_lineitem['virtualStock'] = 0
18010 manish.sha 329
                    if previouslyOrderedQty.has_key(item.id):
330
                        t_po_lineitem['previouslyOrderedQty'] = previouslyOrderedQty[item.id]
331
                    else:
332
                        t_po_lineitem['previouslyOrderedQty'] = 0
333
                    if codRequirements.has_key(item.id):
334
                        t_po_lineitem['codCount'] = min(codRequirements[item.id], quantity)
335
                    try:
336
                        item_pricing = inventory_client.getItemPricing(item.id, vendorId)
337
                    except Exception as e:
18467 manish.sha 338
                        if errorsMap.has_key(item.id):
339
                            errorsMap[item.id] = errorsMap.get(item.id) + "| Could not find transfer price for vendor id: " + str(vendorId) +" "
18464 manish.sha 340
                        else:
18467 manish.sha 341
                            errorsMap[item.id] = "Could not find transfer price for vendor id: " + str(vendorId) +" "
18010 manish.sha 342
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
343
                        print e
18504 manish.sha 344
                        t_po_lineitem['unitPrice'] = item_pricing.transferPrice
345
                        t_po_lineitem['nlc'] = item_pricing.nlc
346
                        t_po_lineitem['mrp'] = item.mrp
347
                        t_purchase_order['lineitems'].append(t_po_lineitem)
348
                        purchaseOrders.append(t_purchase_order)
18464 manish.sha 349
                        continue
18010 manish.sha 350
                    t_po_lineitem['unitPrice'] = item_pricing.transferPrice
351
                    t_po_lineitem['nlc'] = item_pricing.nlc
352
                    t_po_lineitem['mrp'] = item.mrp
353
                    t_purchase_order['lineitems'].append(t_po_lineitem)
354
                purchaseOrders.append(t_purchase_order)
18474 manish.sha 355
            print errorsMap
356
            return purchaseOrders, errorsMap
18010 manish.sha 357
        except Exception as e:
18554 amit.gupta 358
            traceback.print_exc()
18010 manish.sha 359
        finally:
360
            self.close_session()
361
 
362
    def close_session(self):
363
        if session.is_active:
364
            print "session is active. closing it."
365
            session.close()
366
 
18505 manish.sha 367
    def get_item_from_master(self, item_id):
18010 manish.sha 368
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
369
        return client.getItem(item_id)
370
 
371
def inc():
372
    global i
373
    i+=1
374
    return i
375
 
376
def sendmail(email, message, title, *varargs):
377
    if email == "":
378
        return
379
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
380
    mailServer.ehlo()
381
    mailServer.starttls()
382
    mailServer.ehlo()
383
 
384
    # Create the container (outer) email message.
385
    msg = MIMEMultipart()
386
    msg['Subject'] = title
387
    msg.preamble = title
388
    html_msg = MIMEText(message, 'html')
389
    msg.attach(html_msg)
390
 
391
    #snapdeal more to be added here
392
    for fileName in varargs:
393
        snapdeal = MIMEBase('application', 'vnd.ms-excel')
394
        snapdeal.set_payload(file(fileName).read())
395
        encoders.encode_base64(snapdeal)
396
        snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)
397
        msg.attach(snapdeal)
398
 
399
 
400
    MAILTO = email 
401
    mailServer.login(SENDER, PASSWORD)
402
    mailServer.sendmail(SENDER, MAILTO, msg.as_string())
403
 
404
def main():
405
    global i
406
    i = -1
407
    row = 0
408
    wb = xlwt.Workbook()
409
    worksheet = wb.add_sheet("All Pending Purchase Orders")
410
    worksheet.write(row, inc(), 'Supplier Name', boldStyle)
411
    worksheet.write(row, inc(), 'Item Id', boldStyle)
412
    worksheet.write(row, inc(), 'Product Name', boldStyle)
413
    worksheet.write(row, inc(), 'Quantity', boldStyle)
414
    worksheet.write(row, inc(), 'COD', boldStyle)
415
    worksheet.write(row, inc(), 'Prepaid', boldStyle)
416
    worksheet.write(row, inc(), 'Transfer price', boldStyle)
417
    worksheet.write(row, inc(), 'Nlc', boldStyle)
418
    worksheet.write(row, inc(), 'Total amount', boldStyle)
18016 manish.sha 419
    worksheet.write(row, inc(), 'Pack Quantity', boldStyle)
18425 manish.sha 420
    worksheet.write(row, inc(), 'Available Quantity', boldStyle)
18427 manish.sha 421
    worksheet.write(row, inc(), 'Reserved Quantity', boldStyle)
18425 manish.sha 422
    worksheet.write(row, inc(), 'Virtual Stock', boldStyle)
18010 manish.sha 423
    worksheet.write(row, inc(), 'NetPendingOrderQty', boldStyle)
424
    worksheet.write(row, inc(), 'PreviouslyOrderedQty', boldStyle)
425
    worksheet.write(row, inc(), 'AverageSale', boldStyle)
426
    worksheet.write(row, inc(), 'Pending RTOs', boldStyle)
18425 manish.sha 427
    worksheet.write(row, inc(), 'COD Pending Orders', boldStyle)
18010 manish.sha 428
    worksheet.write(row, inc(), 'NumDaysStock', boldStyle)
429
    worksheet.write(row, inc(), 'MinStockReq', boldStyle)
430
    worksheet.write(row, inc(), 'Additional Qty', boldStyle)
18464 manish.sha 431
    worksheet.write(row, inc(), 'Errors', boldStyle)
18010 manish.sha 432
 
433
 
434
    purchaseHandler = PurchaseHandler()
18474 manish.sha 435
    pendingPurchaseOrders, errorsMap = purchaseHandler.getPendingPurchaseOrders(7)
18475 manish.sha 436
    print errorsMap
18010 manish.sha 437
    print pendingPurchaseOrders
18504 manish.sha 438
 
439
    for itemId, error in errorsMap.items():
440
        row += 1
441
        i=-1
442
        worksheet.write(row, inc(), "Not_defined")
443
        worksheet.write(row, inc(), str(itemId))
18505 manish.sha 444
        item = purchaseHandler.get_item_from_master(itemId)
18506 manish.sha 445
        worksheet.write(row, inc(), item.brand+" "+item.modelName+" "+item.modelNumber+" "+item.color)
18504 manish.sha 446
        worksheet.write(row, inc(), 0)
447
 
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(), 0)
456
        worksheet.write(row, inc(), 0)
457
        worksheet.write(row, inc(), 0)
458
        worksheet.write(row, inc(), 0)
459
        worksheet.write(row, inc(), "Not_defined")
460
        worksheet.write(row, inc(), 0)
461
        worksheet.write(row, inc(), 0)
462
        worksheet.write(row, inc(), 0)
463
        worksheet.write(row, inc(), 0)
464
        worksheet.write(row, inc(), 0)
465
        worksheet.write(row, inc(), error)
466
 
18010 manish.sha 467
    for purchaseOrder in pendingPurchaseOrders:
468
        for lineitem in purchaseOrder.get('lineitems'):
469
            row += 1
470
            i=-1
471
            worksheet.write(row, inc(), purchaseOrder.get('SupplierName'))
472
            worksheet.write(row, inc(), lineitem.get('itemId'))
473
            worksheet.write(row, inc(), lineitem.get('brand')+" "+lineitem.get('modelName')+" "+lineitem.get('modelNumber')+" "+lineitem.get('color'))
474
            worksheet.write(row, inc(), lineitem.get('suggestedQuantity'))
475
            codCount =0;
476
            if lineitem.get('codCount') is not None:
477
                codCount = lineitem.get('codCount')
478
            worksheet.write(row, inc(), codCount)
479
            worksheet.write(row, inc(), long(lineitem.get('quantity'))-long(codCount))
480
            worksheet.write(row, inc(), lineitem.get('unitPrice'))
481
            worksheet.write(row, inc(), lineitem.get('nlc'))
482
            worksheet.write(row, inc(), float(lineitem.get('suggestedQuantity')) * float(lineitem.get('unitPrice')))
18016 manish.sha 483
            worksheet.write(row, inc(), lineitem.get('packQuantity'))
18010 manish.sha 484
            reservedCount = 0
485
            if lineitem.get('reservedQuantity') is not None:
486
                reservedCount = lineitem.get('reservedQuantity')
18425 manish.sha 487
            worksheet.write(row, inc(), long(lineitem.get('availableQuantity')))
18427 manish.sha 488
            worksheet.write(row, inc(), long(reservedCount))
18425 manish.sha 489
            worksheet.write(row, inc(), lineitem.get('virtualStock'))
490
            worksheet.write(row, inc(), long(reservedCount)-long(lineitem.get('availableQuantity')))
18010 manish.sha 491
            worksheet.write(row, inc(), lineitem.get('previouslyOrderedQty'))
492
            worksheet.write(row, inc(), "("+lineitem.get('lastXdaysSale')+")"+str(lineitem.get('avgSales')))
493
            worksheet.write(row, inc(), lineitem.get('rtoOrders'))
18425 manish.sha 494
            worksheet.write(row, inc(), lineitem.get('verificationPending'))
18010 manish.sha 495
            worksheet.write(row, inc(), lineitem.get('numberOfDaysStock'))
496
            worksheet.write(row, inc(), lineitem.get('minStockLevel'))
497
 
498
            stockThroughAvgSales = float(lineitem.get('avgSales')) * float(lineitem.get('numberOfDaysStock'))
499
            additionalQty = 0
500
            if stockThroughAvgSales > float(lineitem.get('minStockLevel')):
501
                additionalQty = stockThroughAvgSales
502
            else:
503
                additionalQty = float(lineitem.get('minStockLevel'))
504
 
505
            if float(lineitem.get('rtoOrders')) >1:
506
                additionalQty = additionalQty - (float(lineitem.get('rtoOrders'))/2)
507
 
508
            if additionalQty<0:
509
                additionalQty = 0
510
            worksheet.write(row, inc(), additionalQty)
18464 manish.sha 511
            error = "NA"
512
            if errorsMap.has_key(lineitem.get('itemId')):
513
                error = errorsMap.get(lineitem.get('itemId'))
514
            worksheet.write(row, inc(), error)
18010 manish.sha 515
    wb.save(XLS_O_FILENAME)
516
 
20169 amit.gupta 517
    sendmail(["amit.gupta@shop2020.in", "rajneesh.arora@saholic.com", "chaitnaya.vats@saholic.com", "ritesh.chauhan@shop2020.in", "muvin.khan@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
18010 manish.sha 518
    #sendmail(["manish.sharma@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
519
 
520
if __name__ == '__main__':
521
    main()