Subversion Repositories SmartDukaan

Rev

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