Subversion Repositories SmartDukaan

Rev

Rev 23124 | Rev 23241 | 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)
23124 ashik.ali 88
 
89
 
18010 manish.sha 90
            if not pending_orders:
23124 ashik.ali 91
                print "pendingOrders empty"
18474 manish.sha 92
                return purchaseOrders, errorsMap
18010 manish.sha 93
 
94
            inventory_client = InventoryClient().get_client()
95
            availability = {}
18425 manish.sha 96
            virtualInventory = {}
18010 manish.sha 97
 
98
            ourGoodWarehouseIds = [w.id for w in inventory_client.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, None, warehouseId)]
18429 manish.sha 99
            ourVirtualWarehouseIds = [w.id for w in inventory_client.getWarehouses(WarehouseType.THIRD_PARTY, InventoryType.GOOD, 0, None, None)]
18010 manish.sha 100
            itemInventorySnapshot = inventory_client.getInventorySnapshot(0)
101
            for itemId, itemInventory in itemInventorySnapshot.iteritems():
102
                '''item = self.__get_item_from_master(itemId)'''
103
                for warehouseId, quantity in itemInventory.availability.iteritems():
104
                    if warehouseId in ourGoodWarehouseIds:
105
                        if availability.has_key(itemId):
106
                            availability[itemId] = [availability[itemId][0] + quantity]
107
                        else:
108
                            availability[itemId] = [quantity]
18425 manish.sha 109
 
110
                    if warehouseId in ourVirtualWarehouseIds:
111
                        if virtualInventory.has_key(itemId):
112
                            virtualInventory[itemId] = [virtualInventory[itemId][0] + quantity]
113
                        else:
114
                            virtualInventory[itemId] = [quantity]
115
 
18010 manish.sha 116
            previouslyOrderedQty = {}
117
            unfulfilledPurchaseOrders = PurchaseOrder.query.filter(or_(PurchaseOrder.status == POStatus.PARTIALLY_FULFILLED, PurchaseOrder.status == POStatus.READY)).filter(PurchaseOrder.type == POType.REAL).all()
118
            for purchaseOrder in unfulfilledPurchaseOrders:
119
                for lineitem in purchaseOrder.lineitems:
120
                    if previouslyOrderedQty.has_key(lineitem.itemId):
121
                        previouslyOrderedQty[lineitem.itemId] = previouslyOrderedQty[lineitem.itemId] + lineitem.unfulfilledQuantity
122
                    else:
123
                        previouslyOrderedQty[lineitem.itemId] = lineitem.unfulfilledQuantity
124
 
125
                    if availability.has_key(lineitem.itemId):
126
                        availability[lineitem.itemId] = [availability[lineitem.itemId][0] + lineitem.unfulfilledQuantity]
127
                    else:
128
                        '''item = self.__get_item_from_master(lineitem.itemId)'''
129
                        availability[lineitem.itemId] = [lineitem.unfulfilledQuantity]
130
 
131
            codRequirements = {}
132
            requirements = {}
18425 manish.sha 133
            verificationPendingOrders = {}
18010 manish.sha 134
            for order in pending_orders:
135
                if order.purchaseOrderId:
136
                    continue
137
                for lineitem in order.lineitems:
138
                    if (requirements.has_key(lineitem.item_id)):
18425 manish.sha 139
                        requirements[lineitem.item_id] = requirements.get(lineitem.item_id) + lineitem.quantity
18010 manish.sha 140
                    else:
141
                        requirements[lineitem.item_id] = lineitem.quantity
142
 
143
                    if order.cod:
144
                        if (codRequirements.has_key(lineitem.item_id)):
18425 manish.sha 145
                            codRequirements[lineitem.item_id] = codRequirements.get(lineitem.item_id) + lineitem.quantity
18010 manish.sha 146
                        else:
147
                            codRequirements[lineitem.item_id] = lineitem.quantity
18425 manish.sha 148
 
149
                        if order.status == OrderStatus.COD_VERIFICATION_PENDING:
150
                            if (verificationPendingOrders.has_key(lineitem.item_id)):
151
                                verificationPendingOrders[lineitem.item_id] = verificationPendingOrders.get(lineitem.item_id) + lineitem.quantity
152
                            else:
153
                                verificationPendingOrders[lineitem.item_id] = lineitem.quantity
18010 manish.sha 154
 
155
            advancedPOParameters = {}
156
            SKUListForPO = []
157
            inventory_client = InventoryClient().get_client()
158
            itemStockPurchaseParams = inventory_client.getNonZeroItemStockPurchaseParams()
159
            for itemStockPurchaseParam in itemStockPurchaseParams:
160
                inventory_client = InventoryClient().get_client()
161
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(itemStockPurchaseParam.item_id, 0, 3)
162
                salesCount = 0
163
                numDaysInStock = 0
164
                rtoCount = 0
165
                avgSales = 0.0
166
                lastXdaysSale ="" 
167
                for oosStatus in oosStatuses:
168
                    if oosStatus.is_oos == False:
169
                        salesCount = salesCount + oosStatus.num_orders
170
                        numDaysInStock = numDaysInStock + 1
171
                        lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-" 
172
                    else:
173
                        lastXdaysSale = lastXdaysSale + "X-"
174
                if oosStatus.rto_orders is not None:
175
                    rtoCount = oosStatus.rto_orders
176
                lastXdaysSale = lastXdaysSale[:-1]
177
                if numDaysInStock>0:
178
                    avgSales = float(salesCount)/numDaysInStock
179
                advancedPOParameters[itemStockPurchaseParam.item_id] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2) , numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
180
                if itemInventorySnapshot.has_key(itemStockPurchaseParam.item_id):
181
                    itemAvailability = itemInventorySnapshot.get(itemStockPurchaseParam.item_id)
182
                    currentAvailability = 0
183
                    currentReserved = 0
184
                    for wId, rQty in itemAvailability.reserved.iteritems():
185
                        if wId in ourGoodWarehouseIds:
186
                            currentReserved = currentReserved + rQty
187
                    #Key Condition Added By Manish Sharma        
188
                    if availability.has_key(itemStockPurchaseParam.item_id):
189
                        if availability[itemStockPurchaseParam.item_id] is None:
190
                                availability[itemStockPurchaseParam.item_id] = [0]
191
                    else:
192
                        availability[itemStockPurchaseParam.item_id] = [0]
193
                    if (availability[itemStockPurchaseParam.item_id][0] - currentReserved) < max(advancedPOParameters[itemStockPurchaseParam.item_id][0], advancedPOParameters[itemStockPurchaseParam.item_id][3]):
194
                        SKUListForPO.append(itemStockPurchaseParam.item_id)
195
                else:
196
                    SKUListForPO.append(itemStockPurchaseParam.item_id)
197
 
198
            for key in requirements:
199
                if advancedPOParameters.has_key(key):
200
                    continue
201
                print "Item Id ---", key
202
                inventory_client = InventoryClient().get_client()
203
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(key, 0, 3)
204
                salesCount = 0
205
                numDaysInStock = 0
206
                rtoCount = 0
207
                avgSales = 0.0
208
                lastXdaysSale = ""
23124 ashik.ali 209
                oosStatus = None
18010 manish.sha 210
                for oosStatus in oosStatuses:
211
                    if oosStatus.is_oos == False:
212
                        salesCount = salesCount + oosStatus.num_orders
213
                        numDaysInStock = numDaysInStock + 1
214
                        lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-" 
215
                    else:
216
                        lastXdaysSale = lastXdaysSale + "X-"
217
                lastXdaysSale = lastXdaysSale[:-1]
23124 ashik.ali 218
                if oosStatus and oosStatus.rto_orders:
18010 manish.sha 219
                    rtoCount = oosStatus.rto_orders
220
                if numDaysInStock>0:
221
                    avgSales = float(salesCount)/float(numDaysInStock)
18555 amit.gupta 222
                itemStockPurchaseParam = None
18010 manish.sha 223
                try:
224
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
225
                except Exception as e:
18464 manish.sha 226
                    if errorsMap.has_key(key):
227
                        errorsMap[key] = errorsMap.get(key) + "| Item Stock Purchase Param Missing"
228
                    else:
229
                        errorsMap[key] = "Item Stock Purchase Param Missing "
230
                    continue
18010 manish.sha 231
                    inventory_client.updateItemStockPurchaseParams(key, 0, 0)
232
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
18555 amit.gupta 233
 
18556 amit.gupta 234
                if itemStockPurchaseParam.numOfDaysStock is None:
18555 amit.gupta 235
                    itemStockPurchaseParam.minStockLevel = 0
236
                    itemStockPurchaseParam.numOfDaysStock = 0
237
                    itemStockPurchaseParam.item_id = key
238
 
18010 manish.sha 239
                advancedPOParameters[key] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2), numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
240
 
241
            cumulativeRequirementsItemIds = list(set(requirements.keys()+SKUListForPO))
242
            netRequirements = {}
243
            for itemId in cumulativeRequirementsItemIds:
244
                print "Item Id for Preferred Vendor", itemId
245
                requirementsCount = requirements.get(itemId)
246
                if requirementsCount is None:
247
                    requirementsCount = 0.0
248
                if  availability.has_key(itemId):
249
                    availabilityCount = availability.get(itemId)[0]
18505 manish.sha 250
                    item = self.get_item_from_master(itemId)
18010 manish.sha 251
                    if requirementsCount > availabilityCount or itemId in SKUListForPO:
252
                        if item.preferredVendor is None:
18467 manish.sha 253
                            if errorsMap.has_key(itemId):
254
                                errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 255
                            else:
18467 manish.sha 256
                                errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 257
                            continue
18010 manish.sha 258
                        if (netRequirements.has_key(item.preferredVendor)):
259
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
260
                        else:
261
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
262
                else:
18505 manish.sha 263
                    item = self.get_item_from_master(itemId)
18010 manish.sha 264
                    if item.preferredVendor is None:
18473 manish.sha 265
                        if errorsMap.has_key(itemId):
18467 manish.sha 266
                            errorsMap[itemId] = errorsMap.get(itemId) + "| Preferred Vendor is Missing"
18464 manish.sha 267
                        else:
18467 manish.sha 268
                            errorsMap[itemId] = "Preferred Vendor is Missing "
18464 manish.sha 269
                        continue
18010 manish.sha 270
                    if (netRequirements.has_key(item.preferredVendor)):
271
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
272
                    else:
273
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
274
 
275
            if not netRequirements:
18474 manish.sha 276
                return purchaseOrders, errorsMap
18010 manish.sha 277
 
278
 
279
            suppliersMap = {}
280
            for supplier in self.getSuppliers():
281
                suppliersMap[supplier.id] = supplier
282
 
283
 
284
            for vendorId in netRequirements.keys():
285
                t_purchase_order = {}
286
                supplier = suppliersMap.get(vendorId)
287
                t_purchase_order['SupplierName'] = supplier.name
288
                t_purchase_order['lineitems']= []
289
                for key in netRequirements.get(vendorId):
290
                    item = key[0]
291
                    quantity = key[1]
292
 
293
                    t_po_lineitem = {}
294
                    t_po_lineitem['productGroup'] = item.productGroup
295
                    t_po_lineitem['brand'] = item.brand
296
                    t_po_lineitem['modelNumber'] = item.modelNumber
297
                    t_po_lineitem['modelName'] = item.modelName
298
                    t_po_lineitem['color'] = item.color
299
                    t_po_lineitem['itemId'] = item.id
300
                    t_po_lineitem['packQuantity'] = item.packQuantity
301
                    if quantity <0: #TODO Check this logic
302
                        quantity=0
303
                    t_po_lineitem['quantity'] = quantity
304
                    t_po_lineitem['availableQuantity'] = 0
305
                    if availability.has_key(item.id):
306
                        if previouslyOrderedQty.has_key(item.id):
307
                            t_po_lineitem['availableQuantity'] = availability[item.id][0] - previouslyOrderedQty[item.id]
308
                        else:
309
                            t_po_lineitem['availableQuantity'] = availability[item.id][0]
310
                    if requirements.has_key(item.id):
311
                        t_po_lineitem['reservedQuantity'] = requirements[item.id]
312
                    additionalQty = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3])
313
                    additionalQty = max(0,(additionalQty - (advancedPOParameters[item.id][6]/2)))
314
                    suggestedQuantity = additionalQty +key[1]
315
                    t_po_lineitem['suggestedQuantity'] = max(0,suggestedQuantity)
316
                    #t_po_lineitem.suggestedQuantity = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3]) + key[1]
317
                    t_po_lineitem['avgSales'] = advancedPOParameters[item.id][1]
318
                    t_po_lineitem['numberOfDaysInStock'] = advancedPOParameters[item.id][2] 
319
                    t_po_lineitem['minStockLevel'] = advancedPOParameters[item.id][3]
320
                    t_po_lineitem['numberOfDaysStock'] = advancedPOParameters[item.id][4]
321
                    t_po_lineitem['lastXdaysSale'] = advancedPOParameters[item.id][5]
322
                    t_po_lineitem['rtoOrders'] = advancedPOParameters[item.id][6]
18425 manish.sha 323
                    if verificationPendingOrders.has_key(item.id):
324
                        t_po_lineitem['verificationPending'] = verificationPendingOrders[item.id]
325
                    else:
326
                        t_po_lineitem['verificationPending'] = 0
327
 
328
                    if virtualInventory.has_key(item.id):
18429 manish.sha 329
                        t_po_lineitem['virtualStock'] = virtualInventory[item.id][0]
18425 manish.sha 330
                    else:
331
                        t_po_lineitem['virtualStock'] = 0
18010 manish.sha 332
                    if previouslyOrderedQty.has_key(item.id):
333
                        t_po_lineitem['previouslyOrderedQty'] = previouslyOrderedQty[item.id]
334
                    else:
335
                        t_po_lineitem['previouslyOrderedQty'] = 0
336
                    if codRequirements.has_key(item.id):
337
                        t_po_lineitem['codCount'] = min(codRequirements[item.id], quantity)
338
                    try:
339
                        item_pricing = inventory_client.getItemPricing(item.id, vendorId)
340
                    except Exception as e:
18467 manish.sha 341
                        if errorsMap.has_key(item.id):
342
                            errorsMap[item.id] = errorsMap.get(item.id) + "| Could not find transfer price for vendor id: " + str(vendorId) +" "
18464 manish.sha 343
                        else:
18467 manish.sha 344
                            errorsMap[item.id] = "Could not find transfer price for vendor id: " + str(vendorId) +" "
18010 manish.sha 345
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
346
                        print e
18504 manish.sha 347
                        t_po_lineitem['unitPrice'] = item_pricing.transferPrice
348
                        t_po_lineitem['nlc'] = item_pricing.nlc
349
                        t_po_lineitem['mrp'] = item.mrp
350
                        t_purchase_order['lineitems'].append(t_po_lineitem)
351
                        purchaseOrders.append(t_purchase_order)
18464 manish.sha 352
                        continue
18010 manish.sha 353
                    t_po_lineitem['unitPrice'] = item_pricing.transferPrice
354
                    t_po_lineitem['nlc'] = item_pricing.nlc
355
                    t_po_lineitem['mrp'] = item.mrp
356
                    t_purchase_order['lineitems'].append(t_po_lineitem)
357
                purchaseOrders.append(t_purchase_order)
23124 ashik.ali 358
            print "errorMap : ", errorsMap
18474 manish.sha 359
            return purchaseOrders, errorsMap
18010 manish.sha 360
        except Exception as e:
18554 amit.gupta 361
            traceback.print_exc()
18010 manish.sha 362
        finally:
363
            self.close_session()
364
 
365
    def close_session(self):
366
        if session.is_active:
367
            print "session is active. closing it."
368
            session.close()
369
 
18505 manish.sha 370
    def get_item_from_master(self, item_id):
18010 manish.sha 371
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
372
        return client.getItem(item_id)
373
 
374
def inc():
375
    global i
376
    i+=1
377
    return i
378
 
379
def sendmail(email, message, title, *varargs):
380
    if email == "":
381
        return
382
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
383
    mailServer.ehlo()
384
    mailServer.starttls()
385
    mailServer.ehlo()
386
 
387
    # Create the container (outer) email message.
388
    msg = MIMEMultipart()
389
    msg['Subject'] = title
390
    msg.preamble = title
391
    html_msg = MIMEText(message, 'html')
392
    msg.attach(html_msg)
393
 
394
    #snapdeal more to be added here
395
    for fileName in varargs:
396
        snapdeal = MIMEBase('application', 'vnd.ms-excel')
397
        snapdeal.set_payload(file(fileName).read())
398
        encoders.encode_base64(snapdeal)
399
        snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)
400
        msg.attach(snapdeal)
401
 
402
 
403
    MAILTO = email 
404
    mailServer.login(SENDER, PASSWORD)
405
    mailServer.sendmail(SENDER, MAILTO, msg.as_string())
406
 
407
def main():
408
    global i
409
    i = -1
410
    row = 0
411
    wb = xlwt.Workbook()
412
    worksheet = wb.add_sheet("All Pending Purchase Orders")
413
    worksheet.write(row, inc(), 'Supplier Name', boldStyle)
414
    worksheet.write(row, inc(), 'Item Id', boldStyle)
415
    worksheet.write(row, inc(), 'Product Name', boldStyle)
416
    worksheet.write(row, inc(), 'Quantity', boldStyle)
417
    worksheet.write(row, inc(), 'COD', boldStyle)
418
    worksheet.write(row, inc(), 'Prepaid', boldStyle)
419
    worksheet.write(row, inc(), 'Transfer price', boldStyle)
420
    worksheet.write(row, inc(), 'Nlc', boldStyle)
421
    worksheet.write(row, inc(), 'Total amount', boldStyle)
18016 manish.sha 422
    worksheet.write(row, inc(), 'Pack Quantity', boldStyle)
18425 manish.sha 423
    worksheet.write(row, inc(), 'Available Quantity', boldStyle)
18427 manish.sha 424
    worksheet.write(row, inc(), 'Reserved Quantity', boldStyle)
18425 manish.sha 425
    worksheet.write(row, inc(), 'Virtual Stock', boldStyle)
18010 manish.sha 426
    worksheet.write(row, inc(), 'NetPendingOrderQty', boldStyle)
427
    worksheet.write(row, inc(), 'PreviouslyOrderedQty', boldStyle)
428
    worksheet.write(row, inc(), 'AverageSale', boldStyle)
429
    worksheet.write(row, inc(), 'Pending RTOs', boldStyle)
18425 manish.sha 430
    worksheet.write(row, inc(), 'COD Pending Orders', boldStyle)
18010 manish.sha 431
    worksheet.write(row, inc(), 'NumDaysStock', boldStyle)
432
    worksheet.write(row, inc(), 'MinStockReq', boldStyle)
433
    worksheet.write(row, inc(), 'Additional Qty', boldStyle)
18464 manish.sha 434
    worksheet.write(row, inc(), 'Errors', boldStyle)
18010 manish.sha 435
 
436
 
437
    purchaseHandler = PurchaseHandler()
23240 amit.gupta 438
    pendingPurchaseOrders, errorsMap = purchaseHandler.getPendingPurchaseOrders(7573)
18475 manish.sha 439
    print errorsMap
18010 manish.sha 440
    print pendingPurchaseOrders
18504 manish.sha 441
 
442
    for itemId, error in errorsMap.items():
443
        row += 1
444
        i=-1
445
        worksheet.write(row, inc(), "Not_defined")
446
        worksheet.write(row, inc(), str(itemId))
18505 manish.sha 447
        item = purchaseHandler.get_item_from_master(itemId)
18506 manish.sha 448
        worksheet.write(row, inc(), item.brand+" "+item.modelName+" "+item.modelNumber+" "+item.color)
18504 manish.sha 449
        worksheet.write(row, inc(), 0)
450
 
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(), 0)
462
        worksheet.write(row, inc(), "Not_defined")
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(), 0)
468
        worksheet.write(row, inc(), error)
469
 
18010 manish.sha 470
    for purchaseOrder in pendingPurchaseOrders:
471
        for lineitem in purchaseOrder.get('lineitems'):
472
            row += 1
473
            i=-1
474
            worksheet.write(row, inc(), purchaseOrder.get('SupplierName'))
475
            worksheet.write(row, inc(), lineitem.get('itemId'))
476
            worksheet.write(row, inc(), lineitem.get('brand')+" "+lineitem.get('modelName')+" "+lineitem.get('modelNumber')+" "+lineitem.get('color'))
477
            worksheet.write(row, inc(), lineitem.get('suggestedQuantity'))
478
            codCount =0;
479
            if lineitem.get('codCount') is not None:
480
                codCount = lineitem.get('codCount')
481
            worksheet.write(row, inc(), codCount)
482
            worksheet.write(row, inc(), long(lineitem.get('quantity'))-long(codCount))
483
            worksheet.write(row, inc(), lineitem.get('unitPrice'))
484
            worksheet.write(row, inc(), lineitem.get('nlc'))
485
            worksheet.write(row, inc(), float(lineitem.get('suggestedQuantity')) * float(lineitem.get('unitPrice')))
18016 manish.sha 486
            worksheet.write(row, inc(), lineitem.get('packQuantity'))
18010 manish.sha 487
            reservedCount = 0
488
            if lineitem.get('reservedQuantity') is not None:
489
                reservedCount = lineitem.get('reservedQuantity')
18425 manish.sha 490
            worksheet.write(row, inc(), long(lineitem.get('availableQuantity')))
18427 manish.sha 491
            worksheet.write(row, inc(), long(reservedCount))
18425 manish.sha 492
            worksheet.write(row, inc(), lineitem.get('virtualStock'))
493
            worksheet.write(row, inc(), long(reservedCount)-long(lineitem.get('availableQuantity')))
18010 manish.sha 494
            worksheet.write(row, inc(), lineitem.get('previouslyOrderedQty'))
495
            worksheet.write(row, inc(), "("+lineitem.get('lastXdaysSale')+")"+str(lineitem.get('avgSales')))
496
            worksheet.write(row, inc(), lineitem.get('rtoOrders'))
18425 manish.sha 497
            worksheet.write(row, inc(), lineitem.get('verificationPending'))
18010 manish.sha 498
            worksheet.write(row, inc(), lineitem.get('numberOfDaysStock'))
499
            worksheet.write(row, inc(), lineitem.get('minStockLevel'))
500
 
501
            stockThroughAvgSales = float(lineitem.get('avgSales')) * float(lineitem.get('numberOfDaysStock'))
502
            additionalQty = 0
503
            if stockThroughAvgSales > float(lineitem.get('minStockLevel')):
504
                additionalQty = stockThroughAvgSales
505
            else:
506
                additionalQty = float(lineitem.get('minStockLevel'))
507
 
508
            if float(lineitem.get('rtoOrders')) >1:
509
                additionalQty = additionalQty - (float(lineitem.get('rtoOrders'))/2)
510
 
511
            if additionalQty<0:
512
                additionalQty = 0
513
            worksheet.write(row, inc(), additionalQty)
18464 manish.sha 514
            error = "NA"
515
            if errorsMap.has_key(lineitem.get('itemId')):
516
                error = errorsMap.get(lineitem.get('itemId'))
517
            worksheet.write(row, inc(), error)
18010 manish.sha 518
    wb.save(XLS_O_FILENAME)
519
 
23240 amit.gupta 520
    sendmail(["amit.gupta@shop2020.in", "ritesh.chauhan@shop2020.in", "rahul.kandpal@profitmandi.com"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
18010 manish.sha 521
    #sendmail(["manish.sharma@shop2020.in"], "", "All Pending Purchase Orders", XLS_O_FILENAME)
522
 
523
if __name__ == '__main__':
524
    main()