Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4503 mandeep.dh 1
'''
2
Created on 29-Jul-2011
3
 
4
@author: Chandranshu
5
'''
6
from elixir import metadata, setup_all, session
21844 amit.gupta 7
from expiringdict import ExpiringDict
4754 mandeep.dh 8
from shop2020.clients.CatalogClient import CatalogClient
5944 mandeep.dh 9
from shop2020.clients.InventoryClient import InventoryClient
4754 mandeep.dh 10
from shop2020.clients.TransactionClient import TransactionClient
5443 mandeep.dh 11
from shop2020.purchase.main.model.Invoice import Invoice
4503 mandeep.dh 12
from shop2020.purchase.main.model.LineItem import LineItem
13
from shop2020.purchase.main.model.Purchase import Purchase
21621 amit.gupta 14
from shop2020.purchase.main.model.PurchaseOrder import PurchaseOrder
6467 amar.kumar 15
from shop2020.purchase.main.model.PurchaseReturn import PurchaseReturn
21621 amit.gupta 16
from shop2020.purchase.main.model.PurchaseReturnSettlement import \
17
    PurchaseReturnSettlement
5110 mandeep.dh 18
from shop2020.purchase.main.model.RevisionedPurchaseOrder import \
19
    RevisionedPurchaseOrder
4503 mandeep.dh 20
from shop2020.purchase.main.model.Supplier import Supplier
5768 mandeep.dh 21
from shop2020.thriftpy.generic.ttypes import ExceptionType
5944 mandeep.dh 22
from shop2020.thriftpy.model.v1.inventory.ttypes import WarehouseType, \
6832 amar.kumar 23
    InventoryType, ItemStockPurchaseParams
4754 mandeep.dh 24
from shop2020.thriftpy.model.v1.order.ttypes import OrderStatus
25
from shop2020.thriftpy.purchase.ttypes import PurchaseServiceException, POStatus, \
21621 amit.gupta 26
    PurchaseOrder as TPurchaseOrder, LineItem as TLineItem, POType, \
10864 manish.sha 27
    PurchaseReturnType, PurchaseReturnInventoryType
5443 mandeep.dh 28
from shop2020.utils.Utils import to_py_date
4503 mandeep.dh 29
from sqlalchemy import create_engine
5238 mandeep.dh 30
from sqlalchemy.sql.expression import or_
4503 mandeep.dh 31
import datetime
32
import logging
4754 mandeep.dh 33
import sys
21621 amit.gupta 34
import traceback
4503 mandeep.dh 35
 
36
 
37
logging.basicConfig(level=logging.DEBUG)
38
 
21844 amit.gupta 39
 
40
HOURS=3600
41
CACHE_THREE_HOURS = ExpiringDict(max_len=10, max_age_seconds=3*HOURS)
42
 
43
 
44
 
45
def fetchStateMaster():
46
    if not CACHE_THREE_HOURS.get("statemaster"):
47
        try:
48
            inventory_client = InventoryClient().get_client()
49
            CACHE_THREE_HOURS["statemaster"] = inventory_client.getStateMaster()
50
 
51
        except:
52
            print "Could not fetch"
53
    return CACHE_THREE_HOURS.get("statemaster")
54
 
4503 mandeep.dh 55
class PurchaseServiceHandler:
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
 
6762 amar.kumar 69
    def getPOforOurExternalBilling(self):
70
        todayDate = datetime.datetime.now()
71
        todayDate = todayDate.replace(hour=0) 
6821 amar.kumar 72
        purchaseOrder = PurchaseOrder.query.filter(PurchaseOrder.supplierId == 1).filter(PurchaseOrder.createdAt > todayDate).filter(PurchaseOrder.type == POType.VIRTUAL).first()
6762 amar.kumar 73
        if purchaseOrder is None:
74
            t_purchaseOrder = TPurchaseOrder()
75
            t_purchaseOrder.supplierId = 1
76
            t_purchaseOrder.createdAt = datetime.datetime.now()
77
            t_purchaseOrder.status = 0
78
            t_purchaseOrder.totalCost = 0
8716 amar.kumar 79
            t_purchaseOrder.warehouseId = 9
6762 amar.kumar 80
            t_purchaseOrder.poNumber = 'Ours-Ext-' + str(todayDate.year) + "-" + str(todayDate.month) + "-" + str(todayDate.day)
6821 amar.kumar 81
            t_purchaseOrder.type = POType.VIRTUAL
6762 amar.kumar 82
            purchaseOrder = PurchaseOrder(t_purchaseOrder)
83
            session.commit()
84
        return purchaseOrder.id    
85
 
7672 rajveer 86
    def updatelineItemforOursExternalBilling(self, poId, itemId, unitPrice, nlc):
6762 amar.kumar 87
        lineItem = LineItem.get_by(purchaseOrder_id=poId, itemId=itemId)
88
        if lineItem is None:
89
            purchaseOrder = PurchaseOrder.get_by(id=poId)
90
            t_lineItem = TLineItem()
91
            t_lineItem.itemId = itemId
92
            t_lineItem.quantity = 1
93
            t_lineItem.unfulfilledQuantity = 1
94
            t_lineItem.createdAt = datetime.datetime.now()
95
            t_lineItem.unitPrice = unitPrice
7672 rajveer 96
            t_lineItem.nlc = nlc
6762 amar.kumar 97
            t_lineItem.fulfilled = False
98
            lineItem = LineItem(purchaseOrder, t_lineItem)
99
        else:
100
            lineItem.quantity = lineItem.quantity + 1
101
            lineItem.fulfilled = False
102
            lineItem.unfulfilledQuantity = lineItem.unfulfilledQuantity + 1
103
        session.commit()
104
 
105
    def receiveinvoiceforOursExternalBilling(self, invoiceNumber):
106
        invoice = Invoice()
107
        invoice.invoiceNumber = invoiceNumber
108
        invoice.date = datetime.datetime.now()
109
        invoice.numItems = 1
110
        invoice.receivedFrom = "Hotspot-Billing"
111
        invoice.supplierId = 1
11219 manish.sha 112
        invoice.invoiceDate = datetime.datetime.now()
6762 amar.kumar 113
        session.commit()
114
 
115
    def createPurchaseforOursExternalBilling(self, poId, invoiceNumber):
116
        purchaseOrder = PurchaseOrder.get_by(id=poId)
117
        purchase = Purchase(purchaseOrder, invoiceNumber, 0)
118
        session.commit()
119
        return purchase.id
120
 
4503 mandeep.dh 121
    def createPurchaseOrder(self, tPurchaseOrder):
122
        """
123
        Creates a purchase order based on the data in the given purchase order object.
124
        This method populates a number of missing fields
125
 
126
        Parameters:
127
         - purchaseOrder
128
        """
129
        try:
130
            purchaseOrder = PurchaseOrder(tPurchaseOrder)
131
            session.commit()
132
            purchaseOrder.set_po_number()
133
            session.commit()
134
            return purchaseOrder.id
135
        finally:
136
            self.close_session()
137
 
138
    def getAllPurchaseOrders(self, status):
139
        """
140
        Returns a list of all the purchase orders in the given state
141
 
142
        Parameters:
143
         - status
144
        """
145
        try:
6821 amar.kumar 146
            pos = PurchaseOrder.query.filter_by(status=status, type=POType.REAL).all()
4503 mandeep.dh 147
            return [po.to_thrift_object() for po in pos ]
148
        finally:
149
            self.close_session()
150
 
151
    def getPurchaseOrder(self, id):
152
        """
153
        Returns the purchase order with the given id. Throws an exception if there is no such purchase order.
154
 
155
        Parameters:
156
         - id
157
        """
158
        try:
159
            purchaseOrder = PurchaseOrder.get_by(id=id)
160
            if not purchaseOrder:
161
                raise PurchaseServiceException(101, "No purchase order can be found with id:" + str(id)) 
162
            return purchaseOrder.to_thrift_object()
163
        finally:
164
            self.close_session()
165
 
166
    def getSupplier(self, id):
167
        """
168
        Returns the supplier with the given order id. Throws an exception if there is no such supplier.
169
 
170
        Parameters:
171
         - id
172
        """
173
        try:
174
            return Supplier.get_by(id=id).to_thrift_object()
175
        finally:
176
            self.close_session()
177
 
11801 manish.sha 178
    def startPurchase(self, purchaseOrderId, invoiceNumber, freightCharges, purchaseComments):
4503 mandeep.dh 179
        """
180
        Creates a purchase for the given purchase order.
181
        Throws an exception if no more purchases are allowed against the given purchase order.
182
 
183
        Parameters:
184
         - purchaseOrderId
185
         - invoiceNumber
186
         - freightCharges
187
        """
188
        try:
6762 amar.kumar 189
            purchase_order = PurchaseOrder.get_by(id=purchaseOrderId)
11801 manish.sha 190
            purchase = Purchase(purchase_order, invoiceNumber, freightCharges, purchaseComments)
4503 mandeep.dh 191
            session.commit()
192
            return purchase.id
193
        finally:
194
            self.close_session()
195
 
196
    def closePurchase(self, purchaseId):
197
        """
198
        Marks a purchase as complete and updates the receivedOn time.
199
        Throws an exception if no such purchase exists.
200
 
201
        Parameters:
202
         - purchaseId
203
        """
204
        try:
205
            purchase = Purchase.get_by(id=purchaseId)
206
            purchase.receivedOn = datetime.datetime.now()
207
            session.commit()
208
        finally:
209
            self.close_session()
210
 
211
    def getAllPurchases(self, purchaseOrderId, open):
212
        """
213
        Returns all open or closed purchases for the given purchase order. Throws an exception if no such purchase order exists
214
 
215
        Parameters:
216
         - purchaseOrderId
217
         - open
218
        """
219
        try:
220
            if open:
6762 amar.kumar 221
                purchases = Purchase.query.filter_by(purchaseOrder_id=purchaseOrderId, receivedOn=None).all()
4503 mandeep.dh 222
            else:
6762 amar.kumar 223
                purchases = Purchase.query.filter_by(purchaseOrder_id=purchaseOrderId).filter(Purchase.receivedOn != None).all()
4503 mandeep.dh 224
 
225
            return [purchase.to_thrift_object() for purchase in purchases]
226
        finally:
227
            self.close_session()
6385 amar.kumar 228
 
229
    def getPurchasesForPO(self, purchaseOrderId):
230
        """
231
        Returns all purchases for the given purchase order. Throws an exception if no such purchase order exists
232
 
233
        Parameters:
234
         - purchaseOrderId
235
         - open
236
        """
237
        try:
6762 amar.kumar 238
            purchases = Purchase.query.filter_by(purchaseOrder_id=purchaseOrderId).all()
6385 amar.kumar 239
            return [purchase.to_thrift_object() for purchase in purchases]
240
        finally:
241
            self.close_session()
4503 mandeep.dh 242
 
6385 amar.kumar 243
 
4555 mandeep.dh 244
    def getPurchaseOrderForPurchase(self, purchaseId):
4503 mandeep.dh 245
        """
4555 mandeep.dh 246
        Returns the purchase order for a given purchase
4503 mandeep.dh 247
 
248
        Parameters:
249
         - purchaseId
250
        """
4555 mandeep.dh 251
        try:
6762 amar.kumar 252
            return self.getPurchaseOrder(Purchase.query.filter_by(id=purchaseId).one().purchaseOrder_id)
4555 mandeep.dh 253
        finally:
254
            self.close_session()
4503 mandeep.dh 255
 
4754 mandeep.dh 256
    def getPendingPurchaseOrders(self, warehouseId):
257
        """
258
        Creates purchase order objects from pending orders
259
 
260
        Parameters:
261
         - warehouseId
262
        """
263
        try:
264
            purchaseOrders = []
265
            if not warehouseId:
266
                raise PurchaseServiceException(101, "bad warehouse id")
267
 
268
            transactionClient = TransactionClient().get_client()
18426 manish.sha 269
            pending_orders = transactionClient.getOrdersInBatch([OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.ACCEPTED, OrderStatus.COD_VERIFICATION_PENDING], 0, 0, warehouseId, 0)
4754 mandeep.dh 270
 
271
            if not pending_orders:
272
                return purchaseOrders
273
 
5944 mandeep.dh 274
            inventory_client = InventoryClient().get_client()
4754 mandeep.dh 275
            availability = {}
5110 mandeep.dh 276
 
5944 mandeep.dh 277
            ourGoodWarehouseIds = [w.id for w in inventory_client.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, None, warehouseId)]
278
            itemInventorySnapshot = inventory_client.getInventorySnapshot(0)
279
            for itemId, itemInventory in itemInventorySnapshot.iteritems():
7105 amar.kumar 280
                '''item = self.__get_item_from_master(itemId)'''
5944 mandeep.dh 281
                for warehouseId, quantity in itemInventory.availability.iteritems():
282
                    if warehouseId in ourGoodWarehouseIds:
7105 amar.kumar 283
                        if availability.has_key(itemId):
284
                            availability[itemId] = [availability[itemId][0] + quantity]
5944 mandeep.dh 285
                        else:
7105 amar.kumar 286
                            availability[itemId] = [quantity]
4754 mandeep.dh 287
 
6880 amar.kumar 288
            previouslyOrderedQty = {}
6821 amar.kumar 289
            unfulfilledPurchaseOrders = PurchaseOrder.query.filter(or_(PurchaseOrder.status == POStatus.PARTIALLY_FULFILLED, PurchaseOrder.status == POStatus.READY)).filter(PurchaseOrder.type == POType.REAL).all()
5238 mandeep.dh 290
            for purchaseOrder in unfulfilledPurchaseOrders:
291
                for lineitem in purchaseOrder.lineitems:
6880 amar.kumar 292
                    if previouslyOrderedQty.has_key(lineitem.itemId):
293
                        previouslyOrderedQty[lineitem.itemId] = previouslyOrderedQty[lineitem.itemId] + lineitem.unfulfilledQuantity
294
                    else:
295
                        previouslyOrderedQty[lineitem.itemId] = lineitem.unfulfilledQuantity
296
 
5238 mandeep.dh 297
                    if availability.has_key(lineitem.itemId):
7105 amar.kumar 298
                        availability[lineitem.itemId] = [availability[lineitem.itemId][0] + lineitem.unfulfilledQuantity]
5238 mandeep.dh 299
                    else:
7105 amar.kumar 300
                        '''item = self.__get_item_from_master(lineitem.itemId)'''
7106 amar.kumar 301
                        availability[lineitem.itemId] = [lineitem.unfulfilledQuantity]
5238 mandeep.dh 302
 
4754 mandeep.dh 303
            codRequirements = {}
304
            requirements = {}
305
            for order in pending_orders:
4758 mandeep.dh 306
                if order.purchaseOrderId:
4757 mandeep.dh 307
                    continue
4754 mandeep.dh 308
                for lineitem in order.lineitems:
309
                    if (requirements.has_key(lineitem.item_id)):
310
                        requirements[lineitem.item_id] += lineitem.quantity
311
                    else:
312
                        requirements[lineitem.item_id] = lineitem.quantity
313
 
314
                    if order.cod:
315
                        if (codRequirements.has_key(lineitem.item_id)):
316
                            codRequirements[lineitem.item_id] += lineitem.quantity
317
                        else:
318
                            codRequirements[lineitem.item_id] = lineitem.quantity
6821 amar.kumar 319
 
320
            advancedPOParameters = {}
6857 amar.kumar 321
            SKUListForPO = []
322
            inventory_client = InventoryClient().get_client()
323
            itemStockPurchaseParams = inventory_client.getNonZeroItemStockPurchaseParams()
324
            for itemStockPurchaseParam in itemStockPurchaseParams:
325
                inventory_client = InventoryClient().get_client()
9696 amar.kumar 326
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(itemStockPurchaseParam.item_id, 0, 3)
6857 amar.kumar 327
                salesCount = 0
328
                numDaysInStock = 0
8182 amar.kumar 329
                rtoCount = 0
6857 amar.kumar 330
                avgSales = 0.0
331
                lastXdaysSale ="" 
332
                for oosStatus in oosStatuses:
333
                    if oosStatus.is_oos == False:
334
                        salesCount = salesCount + oosStatus.num_orders
335
                        numDaysInStock = numDaysInStock + 1
336
                        lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-" 
337
                    else:
338
                        lastXdaysSale = lastXdaysSale + "X-"
8221 amar.kumar 339
                if oosStatus.rto_orders is not None:
8182 amar.kumar 340
                    rtoCount = oosStatus.rto_orders
6857 amar.kumar 341
                lastXdaysSale = lastXdaysSale[:-1]
342
                if numDaysInStock>0:
343
                    avgSales = float(salesCount)/numDaysInStock
8182 amar.kumar 344
                advancedPOParameters[itemStockPurchaseParam.item_id] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2) , numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
6857 amar.kumar 345
                if itemInventorySnapshot.has_key(itemStockPurchaseParam.item_id):
346
                    itemAvailability = itemInventorySnapshot.get(itemStockPurchaseParam.item_id)
347
                    currentAvailability = 0
348
                    currentReserved = 0
349
                    for wId, rQty in itemAvailability.reserved.iteritems():
350
                        if wId in ourGoodWarehouseIds:
351
                            currentReserved = currentReserved + rQty
9261 manish.sha 352
                    #Key Condition Added By Manish Sharma        
353
                    if availability.has_key(itemStockPurchaseParam.item_id):
354
                        if availability[itemStockPurchaseParam.item_id] is None:
355
                                availability[itemStockPurchaseParam.item_id] = [0]
356
                    else:
8182 amar.kumar 357
                        availability[itemStockPurchaseParam.item_id] = [0]
9261 manish.sha 358
                    if (availability[itemStockPurchaseParam.item_id][0] - currentReserved) < max(advancedPOParameters[itemStockPurchaseParam.item_id][0], advancedPOParameters[itemStockPurchaseParam.item_id][3]):
6857 amar.kumar 359
                        SKUListForPO.append(itemStockPurchaseParam.item_id)
360
                else:
361
                    SKUListForPO.append(itemStockPurchaseParam.item_id)
362
 
6821 amar.kumar 363
            for key in requirements:
6857 amar.kumar 364
                if advancedPOParameters.has_key(key):
365
                    continue
12175 manish.sha 366
                print "Item Id ---", key
6821 amar.kumar 367
                inventory_client = InventoryClient().get_client()
9696 amar.kumar 368
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(key, 0, 3)
6821 amar.kumar 369
                salesCount = 0
370
                numDaysInStock = 0
8182 amar.kumar 371
                rtoCount = 0
6857 amar.kumar 372
                avgSales = 0.0
373
                lastXdaysSale = ""
21620 amit.gupta 374
                if not oosStatuses:
375
                    continue
6821 amar.kumar 376
                for oosStatus in oosStatuses:
6832 amar.kumar 377
                    if oosStatus.is_oos == False:
6821 amar.kumar 378
                        salesCount = salesCount + oosStatus.num_orders
379
                        numDaysInStock = numDaysInStock + 1
6857 amar.kumar 380
                        lastXdaysSale = lastXdaysSale + str(oosStatus.num_orders) + "-" 
381
                    else:
382
                        lastXdaysSale = lastXdaysSale + "X-"
8182 amar.kumar 383
                lastXdaysSale = lastXdaysSale[:-1]
384
                if oosStatus.rto_orders:
385
                    rtoCount = oosStatus.rto_orders
6832 amar.kumar 386
                if numDaysInStock>0:
6857 amar.kumar 387
                    avgSales = float(salesCount)/float(numDaysInStock)
18588 manish.sha 388
                itemStockPurchaseParam = None
10864 manish.sha 389
                try:
390
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
391
                except Exception as e:
392
                    inventory_client.updateItemStockPurchaseParams(key, 0, 0)
393
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
18588 manish.sha 394
 
395
                if itemStockPurchaseParam.numOfDaysStock is None:
396
                    itemStockPurchaseParam.minStockLevel = 0
397
                    itemStockPurchaseParam.numOfDaysStock = 0
398
                    itemStockPurchaseParam.item_id = key
399
 
8182 amar.kumar 400
                advancedPOParameters[key] = [round(avgSales * itemStockPurchaseParam.numOfDaysStock), round(avgSales,2), numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock, lastXdaysSale, rtoCount]
6821 amar.kumar 401
 
6857 amar.kumar 402
            cumulativeRequirementsItemIds = list(set(requirements.keys()+SKUListForPO))
4754 mandeep.dh 403
            netRequirements = {}
6857 amar.kumar 404
            for itemId in cumulativeRequirementsItemIds:
12341 manish.sha 405
                print "Item Id for Preferred Vendor", itemId
4754 mandeep.dh 406
                requirementsCount = requirements.get(itemId)
6857 amar.kumar 407
                if requirementsCount is None:
408
                    requirementsCount = 0.0
4754 mandeep.dh 409
                if  availability.has_key(itemId):
410
                    availabilityCount = availability.get(itemId)[0]
7105 amar.kumar 411
                    item = self.__get_item_from_master(itemId)
6857 amar.kumar 412
                    if requirementsCount > availabilityCount or itemId in SKUListForPO:
5238 mandeep.dh 413
                        if item.preferredVendor is None:
414
                            raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
4754 mandeep.dh 415
                        if (netRequirements.has_key(item.preferredVendor)):
416
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
417
                        else:
418
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
419
                else:
5944 mandeep.dh 420
                    item = self.__get_item_from_master(itemId)
4754 mandeep.dh 421
                    if item.preferredVendor is None:
5238 mandeep.dh 422
                        raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
4754 mandeep.dh 423
                    if (netRequirements.has_key(item.preferredVendor)):
424
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
425
                    else:
426
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
5238 mandeep.dh 427
 
4754 mandeep.dh 428
            if not netRequirements:
429
                return purchaseOrders
430
 
431
            for vendorId in netRequirements.keys():
432
                t_purchase_order = TPurchaseOrder()
433
                t_purchase_order.supplierId = vendorId
434
                t_purchase_order.warehouseId = warehouseId
435
                t_purchase_order.lineitems = []
436
                for key in netRequirements.get(vendorId):
6762 amar.kumar 437
                    item = key[0]
21622 amit.gupta 438
                    if not advancedPOParameters.has_key(item.id):
439
                        continue
4754 mandeep.dh 440
                    quantity = key[1]
441
                    t_po_lineitem = TLineItem()
442
                    t_po_lineitem.productGroup = item.productGroup
443
                    t_po_lineitem.brand = item.brand
444
                    t_po_lineitem.modelNumber = item.modelNumber
445
                    t_po_lineitem.modelName = item.modelName
446
                    t_po_lineitem.color = item.color
447
                    t_po_lineitem.itemId = item.id
21844 amit.gupta 448
                    t_po_lineitem.hsnCode = item.hsnCode
6938 amar.kumar 449
                    if quantity <0: #TODO Check this logic
6882 amar.kumar 450
                        quantity=0
6861 amar.kumar 451
                    t_po_lineitem.quantity = quantity
6832 amar.kumar 452
                    t_po_lineitem.availableQuantity = 0
453
                    if availability.has_key(item.id):
6880 amar.kumar 454
                        if previouslyOrderedQty.has_key(item.id):
455
                            t_po_lineitem.availableQuantity = availability[item.id][0] - previouslyOrderedQty[item.id]
456
                        else:
457
                            t_po_lineitem.availableQuantity = availability[item.id][0]
6857 amar.kumar 458
                    if requirements.has_key(item.id):
459
                        t_po_lineitem.reservedQuantity = requirements[item.id]
8221 amar.kumar 460
                    additionalQty = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3])
461
                    additionalQty = max(0,(additionalQty - (advancedPOParameters[item.id][6]/2)))
462
                    suggestedQuantity = additionalQty +key[1]
463
                    t_po_lineitem.suggestedQuantity = max(0,suggestedQuantity)
464
                    #t_po_lineitem.suggestedQuantity = max(advancedPOParameters[item.id][0], advancedPOParameters[item.id][3]) + key[1]
6821 amar.kumar 465
                    t_po_lineitem.avgSales = advancedPOParameters[item.id][1]
466
                    t_po_lineitem.numberOfDaysInStock = advancedPOParameters[item.id][2] 
467
                    t_po_lineitem.minStockLevel = advancedPOParameters[item.id][3]
6857 amar.kumar 468
                    t_po_lineitem.numberOfDaysStock = advancedPOParameters[item.id][4]
6880 amar.kumar 469
                    t_po_lineitem.lastXdaysSale = advancedPOParameters[item.id][5]
8182 amar.kumar 470
                    t_po_lineitem.rtoOrders = advancedPOParameters[item.id][6]
6880 amar.kumar 471
                    if previouslyOrderedQty.has_key(item.id):
472
                        t_po_lineitem.previouslyOrderedQty = previouslyOrderedQty[item.id]
473
                    else:
474
                        t_po_lineitem.previouslyOrderedQty = 0
4754 mandeep.dh 475
                    if codRequirements.has_key(item.id):
476
                        t_po_lineitem.codCount = min(codRequirements[item.id], quantity)
477
                    try:
5944 mandeep.dh 478
                        item_pricing = inventory_client.getItemPricing(item.id, vendorId)
4754 mandeep.dh 479
                    except Exception as e:
480
                        vendor = self.getSupplier(vendorId)
481
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
482
                        print e
483
                        raise PurchaseServiceException(101, 'Transfer price missing for ' + vendor.name + ' and ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
484
                    t_po_lineitem.unitPrice = item_pricing.transferPrice
7672 rajveer 485
                    t_po_lineitem.nlc = item_pricing.nlc
9416 amar.kumar 486
                    t_po_lineitem.mrp = item.mrp
4754 mandeep.dh 487
                    t_purchase_order.lineitems.append(t_po_lineitem)
488
                purchaseOrders.append(t_purchase_order)
489
            return purchaseOrders
7105 amar.kumar 490
        except Exception as e:
491
            print e
8199 amar.kumar 492
            print sys.exc_info()[0]
21621 amit.gupta 493
            traceback.print_exc()
4754 mandeep.dh 494
        finally:
495
            self.close_session()
496
 
6762 amar.kumar 497
    def getSuppliers(self,):
4754 mandeep.dh 498
        """
499
        Returns all the valid suppliers
500
        """
501
        try:
21844 amit.gupta 502
            return [Supplier.to_thrift_object(supplier) for supplier in Supplier.query.filter(Supplier.gstin != None).all()]
4754 mandeep.dh 503
        finally:
504
            self.close_session()
505
 
5185 mandeep.dh 506
    def unFulfillPO(self, purchaseId, itemId, quantity):
507
        """
508
        Unfulfills a given purchase id and an item with its quantity.
509
 
510
        Parameters:
511
         - purchaseId
512
         - itemId
513
         - quantity
514
        """
515
        try:
6762 amar.kumar 516
            purchaseOrderId = Purchase.query.filter_by(id=purchaseId).one().purchaseOrder_id
517
            lineitems = LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, itemId=itemId).all()
5185 mandeep.dh 518
            if lineitems:
519
                fulfilledQuantity = lineitems[0].quantity - lineitems[0].unfulfilledQuantity
520
                if fulfilledQuantity < quantity:
521
                    raise PurchaseServiceException(101, 'Can UnFulfill only ' + str(fulfilledQuantity) + 'quantity')
522
                else:
5437 mandeep.dh 523
                    lineitems[0].unfulfilledQuantity = lineitems[0].unfulfilledQuantity + quantity
5185 mandeep.dh 524
                    lineitems[0].fulfilled = 0
525
                    purchaseOrder = PurchaseOrder.get_by(id=purchaseOrderId)
526
                    purchaseOrder.status = POStatus.PARTIALLY_FULFILLED
527
                    session.commit()
528
                    return
529
 
530
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId))
531
        finally:
532
            self.close_session()        
533
 
4754 mandeep.dh 534
    def fulfillPO(self, purchaseOrderId, itemId, quantity):
535
        """
536
        Fulfills a given purchase order with an item.
537
 
538
        Parameters:
539
         - purchaseOrderId
540
         - itemId
541
         - quantity
542
        """
543
        try:
6762 amar.kumar 544
            lineitems = LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, itemId=itemId).all()
4754 mandeep.dh 545
            if lineitems:
546
                if lineitems[0].unfulfilledQuantity < quantity:
5361 mandeep.dh 547
                    raise PurchaseServiceException(101, 'Can fulfill only ' + str(lineitems[0].unfulfilledQuantity) + ' quantity')
4754 mandeep.dh 548
                else:
5361 mandeep.dh 549
                    lineitems[0].unfulfilledQuantity = lineitems[0].unfulfilledQuantity - quantity
4754 mandeep.dh 550
                    if not lineitems[0].unfulfilledQuantity:
551
                        lineitems[0].fulfilled = 1
5361 mandeep.dh 552
                        session.commit()
6762 amar.kumar 553
                        if not LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, fulfilled=0).all():
5361 mandeep.dh 554
                            purchaseOrder = PurchaseOrder.get_by(id=purchaseOrderId)
4754 mandeep.dh 555
                            purchaseOrder.status = POStatus.CLOSED
556
                    session.commit()
557
                    return
558
 
6762 amar.kumar 559
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId))
4754 mandeep.dh 560
        finally:
561
            self.close_session()
562
 
563
    def updatePurchaseOrder(self, purchaseOrder):
564
        """
565
        Amends a PO sa per the new lineitems passed
566
 
567
        Parameters:
568
         - purchaseOrder
569
        """
570
        try:
6762 amar.kumar 571
            existingPurchaseOrder = PurchaseOrder.get_by(id=purchaseOrder.id)
4754 mandeep.dh 572
            maxRevision = 0
6762 amar.kumar 573
            existingRevisions = RevisionedPurchaseOrder.query.filter_by(purchaseOrderId=purchaseOrder.id).all()
4754 mandeep.dh 574
            if existingRevisions:
575
                maxRevision = max([a.revision for a in existingRevisions]) + 1
5147 mandeep.dh 576
 
577
            newPOItems = {}
578
            for t_lineitem in purchaseOrder.lineitems:
579
                newPOItems[t_lineitem.itemId] = t_lineitem
580
 
4754 mandeep.dh 581
            for lineitem in existingPurchaseOrder.lineitems:
5147 mandeep.dh 582
                fulfilledQuantity = lineitem.quantity - lineitem.unfulfilledQuantity
583
                if fulfilledQuantity:
584
                    if not newPOItems.has_key(lineitem.itemId):
585
                        raise PurchaseServiceException(101, 'Cannot remove fulfilled item id: ' + str(lineitem.itemId) + ' from PO')
586
                    else:
587
                        if newPOItems[lineitem.itemId].quantity < fulfilledQuantity:
588
                            raise PurchaseServiceException(101, 'More quantity already fulfilled for item id: ' + str(lineitem.itemId))
589
                        else:
5437 mandeep.dh 590
                            newPOItems[lineitem.itemId].unfulfilledQuantity = newPOItems[lineitem.itemId].unfulfilledQuantity - fulfilledQuantity
4754 mandeep.dh 591
                revisionedPurchaseOrder = RevisionedPurchaseOrder()
592
                revisionedPurchaseOrder.purchaseOrderId = purchaseOrder.id
593
                revisionedPurchaseOrder.revision = maxRevision
594
                revisionedPurchaseOrder.itemId = lineitem.itemId
595
                revisionedPurchaseOrder.unfulfilledQuantity = lineitem.unfulfilledQuantity
596
                revisionedPurchaseOrder.unitPrice = lineitem.unitPrice
7672 rajveer 597
                revisionedPurchaseOrder.nlc = lineitem.nlc
4754 mandeep.dh 598
                revisionedPurchaseOrder.createdAt = lineitem.createdAt
599
                revisionedPurchaseOrder.quantity = lineitem.quantity
600
                lineitem.delete()
601
            existingPurchaseOrder.lineitems = [LineItem(existingPurchaseOrder, t_lineitem) for t_lineitem in purchaseOrder.lineitems]
602
            existingPurchaseOrder.totalCost = sum([t_lineitem.quantity * t_lineitem.unitPrice for t_lineitem in purchaseOrder.lineitems])
603
            session.commit()
604
        finally:
605
            self.close_session()
606
 
4503 mandeep.dh 607
    def close_session(self):
608
        if session.is_active:
609
            print "session is active. closing it."
610
            session.close()
611
 
5443 mandeep.dh 612
    def getInvoices(self, date):
613
        """
614
        Fetches all invoices for a given date
615
 
616
        Parameters:
617
         - date
618
        """
619
        try:
620
            return [i.to_thrift_object() for i in Invoice.query.filter(Invoice.date > to_py_date(date)).all()]
621
        finally:
622
            self.close_session()
6630 amar.kumar 623
 
7410 amar.kumar 624
    def getInvoicesForWarehouse(self, warehouseId, supplierId, date):
625
        """
626
        Fetches all invoices for a given date for specified physical warehouse
627
 
628
        Parameters:
629
         - date
630
        """
631
        try:
632
            return [i.to_thrift_object() for i in Invoice.query.filter(Invoice.date > to_py_date(date)).filter(Invoice.warehouseId == warehouseId).filter(Invoice.supplierId == supplierId).all()]
633
        finally:
634
            self.close_session()
635
 
6630 amar.kumar 636
    def getInvoice(self, invoiceNumber, supplierId):
637
        """
638
        Fetches all invoices for  given invoiceNumber and supplierId 
5443 mandeep.dh 639
 
6630 amar.kumar 640
        Parameters:
641
         - invoiceNumber, supplierId
642
        """
643
        try:
6762 amar.kumar 644
            invoice = Invoice.query.filter_by(invoiceNumber=invoiceNumber, supplierId=supplierId).first()
6638 amar.kumar 645
            if invoice is None:
6762 amar.kumar 646
                return None
6638 amar.kumar 647
            else:
648
                return invoice.to_thrift_object()
6630 amar.kumar 649
        finally:
650
            self.close_session()
651
 
5443 mandeep.dh 652
    def createInvoice(self, invoice):
653
        """
654
        Creates an invoice object
655
 
656
        Parameters:
657
         - invoice
658
        """
659
        try:
6762 amar.kumar 660
            if Invoice.query.filter_by(supplierId=invoice.supplierId, date=to_py_date(invoice.date), invoiceNumber=invoice.invoiceNumber).all():
5768 mandeep.dh 661
                raise PurchaseServiceException(ExceptionType.ILLEGAL_ARGUMENTS, "Already received such invoice")
5443 mandeep.dh 662
            invoiceObj = Invoice()
663
            invoiceObj.invoiceNumber = invoice.invoiceNumber
664
            invoiceObj.date = to_py_date(invoice.date)
665
            invoiceObj.receivedFrom = invoice.receivedFrom
666
            invoiceObj.numItems = invoice.numItems
667
            invoiceObj.supplierId = invoice.supplierId
7410 amar.kumar 668
            invoiceObj.warehouseId = invoice.warehouseId
11219 manish.sha 669
            invoiceObj.invoiceDate = to_py_date(invoice.invoiceDate)
5443 mandeep.dh 670
            session.commit()
671
        finally:
672
            self.close_session()        
673
 
5591 mandeep.dh 674
    def addSupplier(self, supplier):
675
        """
676
        Creates a supplier
677
 
678
        Parameters:
679
         - supplier
680
        """
681
        try:
682
            supplierObj = Supplier()
683
            supplierObj.communicationAddress = supplier.communicationAddress
684
            supplierObj.contactEmail = supplier.contactEmail
685
            supplierObj.contactFax = supplier.contactFax
686
            supplierObj.contactName = supplier.contactName
687
            supplierObj.contactPhone = supplier.contactPhone
688
            supplierObj.fax = supplier.fax
689
            supplierObj.headDesignation = supplier.headDesignation
690
            supplierObj.headEmail = supplier.headEmail
691
            supplierObj.headName = supplier.headName
692
            supplierObj.name = supplier.name
693
            supplierObj.pan = supplier.pan
694
            supplierObj.phone = supplier.phone
695
            supplierObj.registeredAddress = supplier.registeredAddress
696
            supplierObj.tin = supplier.tin
10295 amar.kumar 697
            supplierObj.stateId = supplier.stateId
14072 manish.sha 698
            supplierObj.poValidityLimit = supplier.poValidityLimit
5591 mandeep.dh 699
            session.commit()
700
            return self.getSupplier(supplierObj.id)
701
        finally:
702
            self.close_session()
703
 
704
    def updateSupplier(self, supplier):
705
        """
706
        Updates a supplier
707
 
708
        Parameters:
709
         - supplier
710
        """
711
        try:
712
            supplierObj = Supplier.get(supplier.id)
713
            supplierObj.communicationAddress = supplier.communicationAddress
714
            supplierObj.contactEmail = supplier.contactEmail
715
            supplierObj.contactFax = supplier.contactFax
716
            supplierObj.contactName = supplier.contactName
717
            supplierObj.contactPhone = supplier.contactPhone
718
            supplierObj.fax = supplier.fax
719
            supplierObj.headDesignation = supplier.headDesignation
720
            supplierObj.headEmail = supplier.headEmail
721
            supplierObj.headName = supplier.headName
722
            supplierObj.name = supplier.name
723
            supplierObj.pan = supplier.pan
724
            supplierObj.phone = supplier.phone
725
            supplierObj.registeredAddress = supplier.registeredAddress
21844 amit.gupta 726
            supplierObj.gstin = supplier.gstin
13965 manish.sha 727
            supplierObj.stateId = supplierObj.stateId
14072 manish.sha 728
            supplierObj.poValidityLimit = supplier.poValidityLimit
5591 mandeep.dh 729
            session.commit()
730
        finally:
731
            self.close_session()
732
 
6385 amar.kumar 733
    def getInvoicesForPO(self, poNumber):
734
        '''
735
        For getting invoiceNumbers for a Purchase Order
736
        '''
737
        try:
738
 
6762 amar.kumar 739
            purchases = Purchase.query.filter_by(purchaseOrder=poNumber)
6385 amar.kumar 740
            for purchase in purchases:
741
                invoice = purchase.invoiceNumber
742
        except:
743
            return None
744
        finally:
745
            self.close_session()
6467 amar.kumar 746
 
747
    def createPurchaseReturn(self, t_purchaseReturn):
748
        '''
749
        For creating a new Purchase Return
750
        '''
751
        try:
6762 amar.kumar 752
            purchaseReturn = PurchaseReturn(t_purchaseReturn.vendorId, t_purchaseReturn.amount)
6467 amar.kumar 753
            purchaseReturn.vendorId = t_purchaseReturn.vendorId
754
            purchaseReturn.amount = t_purchaseReturn.amount
755
            purchaseReturn.returnTimestamp = to_py_date(t_purchaseReturn.returnTimestamp)
756
            purchaseReturn.isSettled = False
6821 amar.kumar 757
            purchaseReturn.type = t_purchaseReturn.type
10864 manish.sha 758
            purchaseReturn.returnInventoryType = t_purchaseReturn.returnInventoryType
13600 manish.sha 759
            purchaseReturn.unsettledAmount = t_purchaseReturn.amount
6467 amar.kumar 760
            session.commit()
761
            return purchaseReturn.id
762
        except Exception as e:
763
            print e
764
            raise PurchaseServiceException(101, 'Exception while creating  Purchase Return for ' + purchaseReturn.vendorId + ' for Rs' + purchaseReturn.amount)
765
        finally:
766
            self.close_session()
767
 
768
    def getUnsettledPurchaseReturns(self):
769
        '''
770
        For getting all unsettled Purchase Returns
771
        '''
772
        try:
6821 amar.kumar 773
            purchaseReturns = PurchaseReturn.query.filter_by(isSettled=False).filter_by(type=PurchaseReturnType.REAL).all()
6467 amar.kumar 774
            return [purchasereturn.to_thrift_object() for purchasereturn in purchaseReturns]
775
        except Exception as e:
776
            print e
777
            raise PurchaseServiceException(101, 'Exception while fetching all Unsettled Purchase Returns')
778
        finally:
779
            self.close_session()
6385 amar.kumar 780
 
6467 amar.kumar 781
    def settlePurchaseReturn(self, returnId):
782
        '''
783
        For marking a Purchase Return as settled
784
        '''
785
        try:
6762 amar.kumar 786
            purchaseReturn = PurchaseReturn.query.filter_by(id=returnId).one()
6467 amar.kumar 787
            purchaseReturn.isSettled = True
788
            session.commit()
789
        except Exception as e:
790
            print e
791
            raise PurchaseServiceException(101, 'Exception while settling Purchase Return Id : ' + id)
792
        finally:
793
            self.close_session()
6762 amar.kumar 794
 
7672 rajveer 795
    def createPurchaseForOurExtBilling(self, invoiceNumber, unitPrice, nlc, itemId):
6762 amar.kumar 796
        try:
797
            poId = self.getPOforOurExternalBilling()
7672 rajveer 798
            self.updatelineItemforOursExternalBilling(poId, itemId, unitPrice, nlc)
6762 amar.kumar 799
            self.receiveinvoiceforOursExternalBilling(invoiceNumber)
800
            return self.createPurchaseforOursExternalBilling(poId, invoiceNumber)
801
        except Exception as e:
802
            print e
803
            raise PurchaseServiceException(101, '')
804
        finally:
805
            self.close_session()
806
 
807
    def fulfillPOForExtBilling(self, itemId, quantity):
808
        poId = self.getPOforOurExternalBilling()
809
        lineItem = LineItem.get_by(purchaseOrder_id=poId, itemId=itemId)
810
        lineItem.unfulfilledQuantity = lineItem.unfulfilledQuantity - 1
811
        if not lineItem.unfulfilledQuantity:
812
            lineItem.fulfilled = 1
813
        session.commit()
7410 amar.kumar 814
 
815
    def closePO(self, poId):
816
        purchaseOrder = PurchaseOrder.get_by(id=poId)
817
        if not purchaseOrder:
818
                raise PurchaseServiceException(101, "No purchase order can be found with id:" + str(id))
819
        purchaseOrder.status = 4
820
        session.commit()
9925 amar.kumar 821
 
822
    def changePOStatus(self, poId, poStatus):
823
        purchaseOrder = PurchaseOrder.get_by(id=poId)
824
        if not purchaseOrder:
825
                raise PurchaseServiceException(101, "No purchase order can be found with id:" + str(id))
826
        purchaseOrder.status = POStatus.READY
827
        session.commit()
6467 amar.kumar 828
 
7410 amar.kumar 829
    def isInvoiceReceived(self, invoiceNumber, supplierId):
830
        """
831
        Returns whether invoice is already received for given invoiceNumber and supplierId 
832
 
833
        Parameters:
834
         - invoiceNumber, supplierId
835
        """
836
        try:
837
            invoice = Invoice.query.filter_by(invoiceNumber=invoiceNumber, supplierId=supplierId).first()
838
            if invoice is None:
839
                return False
840
            else:
841
                return True
842
        finally:
843
            self.close_session()
9829 amar.kumar 844
 
845
    def changeWarehouseForPO(self, poId, warehouseId):
846
        try:
847
            purchaseOrder = PurchaseOrder.get_by(id = poId)
848
            for lineitem in purchaseOrder.lineitems:
849
                if lineitem.quantity!=lineitem.unfulfilledQuantity:
850
                    raise PurchaseServiceException(101, 'Items have already been received for this PO and hence cant change warehouse')
851
            purchaseOrder.warehouseId = warehouseId
852
            session.commit()
853
        finally:
11751 manish.sha 854
            self.close_session()  
855
 
856
    def getPurchaseReturn(self, id):
857
        """
858
        Returns the purchase return with the given id. Throws an exception if there is no such purchase return.
859
 
860
        Parameters:
861
         - id
862
        """
863
        try:
864
            purchaseReturn = PurchaseReturn.get_by(id=id)
865
            if not purchaseReturn:
866
                raise PurchaseServiceException(101, "No purchase return can be found with id:" + str(id)) 
867
            return purchaseReturn.to_thrift_object()
868
        finally:
869
            self.close_session()
9829 amar.kumar 870
 
13600 manish.sha 871
    def markPurchasereturnSettled(self, id, settlementType, documentNumber, settlementBy, settledAmount):
872
        try:
873
            currentTime = datetime.datetime.now()
874
            purchaseReturn = PurchaseReturn.get_by(id=id)
875
            if not purchaseReturn:
876
                raise PurchaseServiceException(101, "No purchase return can be found with id:" + str(id)) 
877
            if settledAmount > purchaseReturn.unsettledAmount:
878
                raise PurchaseServiceException(101, "Purchase Return Settled Amount Can't be Greater than Unsettled Amount Purchase Return id:" + str(id))
879
            purchaseReturn.currentSettlementType = settlementType
880
            purchaseReturn.latestSettlementDate = currentTime
881
            if purchaseReturn.documentNumber : 
882
                purchaseReturn.documentNumber = purchaseReturn.documentNumber +";"+documentNumber
883
            else:
884
                purchaseReturn.documentNumber = documentNumber
885
            unsettledAmount = purchaseReturn.unsettledAmount - settledAmount
886
            purchaseReturn.unsettledAmount = purchaseReturn.unsettledAmount - settledAmount
887
            if unsettledAmount ==0:
888
                purchaseReturn.isSettled = 1
889
 
890
            purchaseReturnSettlement = PurchaseReturnSettlement()
891
            purchaseReturnSettlement.purchaseReturnId = id
892
            purchaseReturnSettlement.settlementType = settlementType
893
            purchaseReturnSettlement.settlementBy = settlementBy
894
            purchaseReturnSettlement.settlementAmount = settledAmount
895
            purchaseReturnSettlement.settlementDate = currentTime
896
            purchaseReturnSettlement.documentNumber = documentNumber
897
            session.commit()
898
            return True
899
        finally:
900
            self.close_session()
901
 
902
    def getPrSettlementsForPurchaseReturn(self, purchaseReturnId):
903
        try:
904
            settlements = PurchaseReturnSettlement.query.filter_by(purchaseReturnId=purchaseReturnId).all()
905
            prSettlements = []
906
            for settlement in settlements:
907
                prSettlements.append(settlement.to_thrift_object())
908
            return prSettlements
909
        finally:
910
            self.close_session()
911
 
912
    def updatePurchaseReturn(self, t_purchaseReturn):
913
        '''
914
        Updating a Purchase Return
915
        '''
916
        try:
917
            purchaseReturn = PurchaseReturn.get_by(id=t_purchaseReturn.id)
918
            purchaseReturn.purchaseReturnType = t_purchaseReturn.purchaseReturnType
919
            purchaseReturn.reasonText = t_purchaseReturn.reasonText
920
            purchaseReturn.createdBy = t_purchaseReturn.createdBy
921
            session.commit()
922
        finally:
923
            self.close_session()
924
 
6762 amar.kumar 925
    def isAlive(self,):
4503 mandeep.dh 926
        """
927
        For checking weather service is active alive or not. It also checks connectivity with database
928
        """
929
        try:
930
            session.query(Supplier.id).limit(1).all()
931
            return True
932
        except:
933
            return False
934
        finally:
935
            self.close_session()
5944 mandeep.dh 936
 
937
    def __get_item_from_master(self, item_id):
938
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
6762 amar.kumar 939
        return client.getItem(item_id)
13600 manish.sha 940