Subversion Repositories SmartDukaan

Rev

Rev 6762 | Rev 6832 | 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
4754 mandeep.dh 7
from shop2020.clients.CatalogClient import CatalogClient
5944 mandeep.dh 8
from shop2020.clients.InventoryClient import InventoryClient
4754 mandeep.dh 9
from shop2020.clients.TransactionClient import TransactionClient
5443 mandeep.dh 10
from shop2020.purchase.main.model.Invoice import Invoice
4503 mandeep.dh 11
from shop2020.purchase.main.model.LineItem import LineItem
12
from shop2020.purchase.main.model.Purchase import Purchase
6467 amar.kumar 13
from shop2020.purchase.main.model.PurchaseReturn import PurchaseReturn
5110 mandeep.dh 14
from shop2020.purchase.main.model.RevisionedPurchaseOrder import \
15
    RevisionedPurchaseOrder
4503 mandeep.dh 16
from shop2020.purchase.main.model.Supplier import Supplier
6762 amar.kumar 17
from shop2020.purchase.main.model.PurchaseOrder import PurchaseOrder
5768 mandeep.dh 18
from shop2020.thriftpy.generic.ttypes import ExceptionType
5944 mandeep.dh 19
from shop2020.thriftpy.model.v1.inventory.ttypes import WarehouseType, \
5110 mandeep.dh 20
    InventoryType
4754 mandeep.dh 21
from shop2020.thriftpy.model.v1.order.ttypes import OrderStatus
22
from shop2020.thriftpy.purchase.ttypes import PurchaseServiceException, POStatus, \
6821 amar.kumar 23
    PurchaseOrder as TPurchaseOrder, LineItem as TLineItem, POType,\
24
    PurchaseReturnType
5443 mandeep.dh 25
from shop2020.utils.Utils import to_py_date
4503 mandeep.dh 26
from sqlalchemy import create_engine
5238 mandeep.dh 27
from sqlalchemy.sql.expression import or_
4503 mandeep.dh 28
import datetime
29
import logging
4754 mandeep.dh 30
import sys
4503 mandeep.dh 31
 
32
 
33
logging.basicConfig(level=logging.DEBUG)
34
 
35
class PurchaseServiceHandler:
36
    '''
37
    classdocs
38
    '''
39
 
40
    def __init__(self, dbname='warehouse', db_hostname='localhost',  echoOn=True):
41
        '''
42
        Constructor
43
        '''
44
        engine = create_engine('mysql://root:shop2020@' + db_hostname + '/' + dbname, pool_recycle=7200)
45
        metadata.bind = engine
46
        metadata.bind.echo = echoOn
47
        setup_all(True)
48
 
6762 amar.kumar 49
    def getPOforOurExternalBilling(self):
50
        todayDate = datetime.datetime.now()
51
        todayDate = todayDate.replace(hour=0) 
6821 amar.kumar 52
        purchaseOrder = PurchaseOrder.query.filter(PurchaseOrder.supplierId == 1).filter(PurchaseOrder.createdAt > todayDate).filter(PurchaseOrder.type == POType.VIRTUAL).first()
6762 amar.kumar 53
        if purchaseOrder is None:
54
            t_purchaseOrder = TPurchaseOrder()
55
            t_purchaseOrder.supplierId = 1
56
            t_purchaseOrder.createdAt = datetime.datetime.now()
57
            t_purchaseOrder.status = 0
58
            t_purchaseOrder.totalCost = 0
59
            t_purchaseOrder.poNumber = 'Ours-Ext-' + str(todayDate.year) + "-" + str(todayDate.month) + "-" + str(todayDate.day)
6821 amar.kumar 60
            t_purchaseOrder.type = POType.VIRTUAL
6762 amar.kumar 61
            purchaseOrder = PurchaseOrder(t_purchaseOrder)
62
            session.commit()
63
        return purchaseOrder.id    
64
 
65
    def updatelineItemforOursExternalBilling(self, poId, itemId, unitPrice):
66
        lineItem = LineItem.get_by(purchaseOrder_id=poId, itemId=itemId)
67
        if lineItem is None:
68
            purchaseOrder = PurchaseOrder.get_by(id=poId)
69
            t_lineItem = TLineItem()
70
            t_lineItem.itemId = itemId
71
            t_lineItem.quantity = 1
72
            t_lineItem.unfulfilledQuantity = 1
73
            t_lineItem.createdAt = datetime.datetime.now()
74
            t_lineItem.unitPrice = unitPrice
75
            t_lineItem.fulfilled = False
76
            lineItem = LineItem(purchaseOrder, t_lineItem)
77
        else:
78
            lineItem.quantity = lineItem.quantity + 1
79
            lineItem.fulfilled = False
80
            lineItem.unfulfilledQuantity = lineItem.unfulfilledQuantity + 1
81
        session.commit()
82
 
83
    def receiveinvoiceforOursExternalBilling(self, invoiceNumber):
84
        invoice = Invoice()
85
        invoice.invoiceNumber = invoiceNumber
86
        invoice.date = datetime.datetime.now()
87
        invoice.numItems = 1
88
        invoice.receivedFrom = "Hotspot-Billing"
89
        invoice.supplierId = 1
90
        session.commit()
91
 
92
    def createPurchaseforOursExternalBilling(self, poId, invoiceNumber):
93
        purchaseOrder = PurchaseOrder.get_by(id=poId)
94
        purchase = Purchase(purchaseOrder, invoiceNumber, 0)
95
        session.commit()
96
        return purchase.id
97
 
4503 mandeep.dh 98
    def createPurchaseOrder(self, tPurchaseOrder):
99
        """
100
        Creates a purchase order based on the data in the given purchase order object.
101
        This method populates a number of missing fields
102
 
103
        Parameters:
104
         - purchaseOrder
105
        """
106
        try:
107
            purchaseOrder = PurchaseOrder(tPurchaseOrder)
108
            session.commit()
109
            purchaseOrder.set_po_number()
110
            session.commit()
111
            return purchaseOrder.id
112
        finally:
113
            self.close_session()
114
 
115
    def getAllPurchaseOrders(self, status):
116
        """
117
        Returns a list of all the purchase orders in the given state
118
 
119
        Parameters:
120
         - status
121
        """
122
        try:
6821 amar.kumar 123
            pos = PurchaseOrder.query.filter_by(status=status, type=POType.REAL).all()
4503 mandeep.dh 124
            return [po.to_thrift_object() for po in pos ]
125
        finally:
126
            self.close_session()
127
 
128
    def getPurchaseOrder(self, id):
129
        """
130
        Returns the purchase order with the given id. Throws an exception if there is no such purchase order.
131
 
132
        Parameters:
133
         - id
134
        """
135
        try:
136
            purchaseOrder = PurchaseOrder.get_by(id=id)
137
            if not purchaseOrder:
138
                raise PurchaseServiceException(101, "No purchase order can be found with id:" + str(id)) 
139
            return purchaseOrder.to_thrift_object()
140
        finally:
141
            self.close_session()
142
 
143
    def getSupplier(self, id):
144
        """
145
        Returns the supplier with the given order id. Throws an exception if there is no such supplier.
146
 
147
        Parameters:
148
         - id
149
        """
150
        try:
151
            return Supplier.get_by(id=id).to_thrift_object()
152
        finally:
153
            self.close_session()
154
 
155
    def startPurchase(self, purchaseOrderId, invoiceNumber, freightCharges):
156
        """
157
        Creates a purchase for the given purchase order.
158
        Throws an exception if no more purchases are allowed against the given purchase order.
159
 
160
        Parameters:
161
         - purchaseOrderId
162
         - invoiceNumber
163
         - freightCharges
164
        """
165
        try:
6762 amar.kumar 166
            purchase_order = PurchaseOrder.get_by(id=purchaseOrderId)
4503 mandeep.dh 167
            purchase = Purchase(purchase_order, invoiceNumber, freightCharges)
168
            session.commit()
169
            return purchase.id
170
        finally:
171
            self.close_session()
172
 
173
    def closePurchase(self, purchaseId):
174
        """
175
        Marks a purchase as complete and updates the receivedOn time.
176
        Throws an exception if no such purchase exists.
177
 
178
        Parameters:
179
         - purchaseId
180
        """
181
        try:
182
            purchase = Purchase.get_by(id=purchaseId)
183
            purchase.receivedOn = datetime.datetime.now()
184
            session.commit()
185
        finally:
186
            self.close_session()
187
 
188
    def getAllPurchases(self, purchaseOrderId, open):
189
        """
190
        Returns all open or closed purchases for the given purchase order. Throws an exception if no such purchase order exists
191
 
192
        Parameters:
193
         - purchaseOrderId
194
         - open
195
        """
196
        try:
197
            if open:
6762 amar.kumar 198
                purchases = Purchase.query.filter_by(purchaseOrder_id=purchaseOrderId, receivedOn=None).all()
4503 mandeep.dh 199
            else:
6762 amar.kumar 200
                purchases = Purchase.query.filter_by(purchaseOrder_id=purchaseOrderId).filter(Purchase.receivedOn != None).all()
4503 mandeep.dh 201
 
202
            return [purchase.to_thrift_object() for purchase in purchases]
203
        finally:
204
            self.close_session()
6385 amar.kumar 205
 
206
    def getPurchasesForPO(self, purchaseOrderId):
207
        """
208
        Returns all purchases for the given purchase order. Throws an exception if no such purchase order exists
209
 
210
        Parameters:
211
         - purchaseOrderId
212
         - open
213
        """
214
        try:
6762 amar.kumar 215
            purchases = Purchase.query.filter_by(purchaseOrder_id=purchaseOrderId).all()
6385 amar.kumar 216
            return [purchase.to_thrift_object() for purchase in purchases]
217
        finally:
218
            self.close_session()
4503 mandeep.dh 219
 
6385 amar.kumar 220
 
4555 mandeep.dh 221
    def getPurchaseOrderForPurchase(self, purchaseId):
4503 mandeep.dh 222
        """
4555 mandeep.dh 223
        Returns the purchase order for a given purchase
4503 mandeep.dh 224
 
225
        Parameters:
226
         - purchaseId
227
        """
4555 mandeep.dh 228
        try:
6762 amar.kumar 229
            return self.getPurchaseOrder(Purchase.query.filter_by(id=purchaseId).one().purchaseOrder_id)
4555 mandeep.dh 230
        finally:
231
            self.close_session()
4503 mandeep.dh 232
 
4754 mandeep.dh 233
    def getPendingPurchaseOrders(self, warehouseId):
234
        """
235
        Creates purchase order objects from pending orders
236
 
237
        Parameters:
238
         - warehouseId
239
        """
240
        try:
241
            purchaseOrders = []
242
            if not warehouseId:
243
                raise PurchaseServiceException(101, "bad warehouse id")
244
 
245
            transactionClient = TransactionClient().get_client()
246
            pending_orders = transactionClient.getOrdersInBatch([OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.ACCEPTED], 0, 0, warehouseId)
247
 
248
            if not pending_orders:
249
                return purchaseOrders
250
 
5944 mandeep.dh 251
            inventory_client = InventoryClient().get_client()
4754 mandeep.dh 252
            availability = {}
5110 mandeep.dh 253
 
5944 mandeep.dh 254
            ourGoodWarehouseIds = [w.id for w in inventory_client.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, None, warehouseId)]
255
            itemInventorySnapshot = inventory_client.getInventorySnapshot(0)
256
            for itemId, itemInventory in itemInventorySnapshot.iteritems():
257
                item = self.__get_item_from_master(itemId)
258
                for warehouseId, quantity in itemInventory.availability.iteritems():
259
                    if warehouseId in ourGoodWarehouseIds:
260
                        if availability.has_key(item.id):
261
                            availability[item.id] = [availability[item.id][0] + quantity, item]
262
                        else:
263
                            availability[item.id] = [quantity, item]
4754 mandeep.dh 264
 
6821 amar.kumar 265
            unfulfilledPurchaseOrders = PurchaseOrder.query.filter(or_(PurchaseOrder.status == POStatus.PARTIALLY_FULFILLED, PurchaseOrder.status == POStatus.READY)).filter(PurchaseOrder.type == POType.REAL).all()
5238 mandeep.dh 266
            for purchaseOrder in unfulfilledPurchaseOrders:
267
                for lineitem in purchaseOrder.lineitems:
268
                    if availability.has_key(lineitem.itemId):
269
                        availability[lineitem.itemId] = [availability[lineitem.itemId][0] + lineitem.unfulfilledQuantity, availability[lineitem.itemId][1]]
270
                    else:
5944 mandeep.dh 271
                        item = self.__get_item_from_master(lineitem.itemId)
5238 mandeep.dh 272
                        availability[item.id] = [lineitem.unfulfilledQuantity, item]
273
 
4754 mandeep.dh 274
            codRequirements = {}
275
            requirements = {}
276
            for order in pending_orders:
4758 mandeep.dh 277
                if order.purchaseOrderId:
4757 mandeep.dh 278
                    continue
4754 mandeep.dh 279
                for lineitem in order.lineitems:
280
                    if (requirements.has_key(lineitem.item_id)):
281
                        requirements[lineitem.item_id] += lineitem.quantity
282
                    else:
283
                        requirements[lineitem.item_id] = lineitem.quantity
284
 
285
                    if order.cod:
286
                        if (codRequirements.has_key(lineitem.item_id)):
287
                            codRequirements[lineitem.item_id] += lineitem.quantity
288
                        else:
289
                            codRequirements[lineitem.item_id] = lineitem.quantity
6821 amar.kumar 290
 
291
            advancedPOParameters = {}
292
            for key in requirements:
293
                inventory_client = InventoryClient().get_client()
294
                oosStatuses = inventory_client.getOosStatusesForXDaysForItem(key,5)
295
                salesCount = 0
296
                numDaysInStock = 0
297
                for oosStatus in oosStatuses:
298
                    if oosStatus.status == False:
299
                        salesCount = salesCount + oosStatus.num_orders
300
                        numDaysInStock = numDaysInStock + 1
301
                avgSales = salesCount/numDaysInStock
302
                if avgSales>1:
303
                    itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
304
                advancedPOParameters[key] = [avgSales * itemStockPurchaseParam.numOfDaysStock, avgSales, numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock]
305
 
4754 mandeep.dh 306
            netRequirements = {}
307
            for itemId in requirements.keys():
308
                requirementsCount = requirements.get(itemId)
309
                if  availability.has_key(itemId):
310
                    availabilityCount = availability.get(itemId)[0]
6762 amar.kumar 311
                    item = availability.get(itemId)[1]
4754 mandeep.dh 312
                    if requirementsCount > availabilityCount:
5238 mandeep.dh 313
                        if item.preferredVendor is None:
314
                            raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
4754 mandeep.dh 315
                        if (netRequirements.has_key(item.preferredVendor)):
316
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
317
                        else:
318
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
319
                else:
5944 mandeep.dh 320
                    item = self.__get_item_from_master(itemId)
4754 mandeep.dh 321
                    if item.preferredVendor is None:
5238 mandeep.dh 322
                        raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
4754 mandeep.dh 323
                    if (netRequirements.has_key(item.preferredVendor)):
324
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
325
                    else:
326
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
5238 mandeep.dh 327
 
4754 mandeep.dh 328
            if not netRequirements:
329
                return purchaseOrders
330
 
331
            for vendorId in netRequirements.keys():
332
                t_purchase_order = TPurchaseOrder()
333
                t_purchase_order.supplierId = vendorId
334
                t_purchase_order.warehouseId = warehouseId
335
                t_purchase_order.lineitems = []
336
                for key in netRequirements.get(vendorId):
6762 amar.kumar 337
                    item = key[0]
4754 mandeep.dh 338
                    quantity = key[1]
339
                    t_po_lineitem = TLineItem()
340
                    t_po_lineitem.productGroup = item.productGroup
341
                    t_po_lineitem.brand = item.brand
342
                    t_po_lineitem.modelNumber = item.modelNumber
343
                    t_po_lineitem.modelName = item.modelName
344
                    t_po_lineitem.color = item.color
345
                    t_po_lineitem.itemId = item.id
346
                    t_po_lineitem.quantity = quantity
6821 amar.kumar 347
 
348
                    t_po_lineitem.availableQuantity = availability[item.id][0]
349
                    t_po_lineitem.reservedQuantity = requirements[lineitem.item_id]
350
                    t_po_lineitem.suggestedQuantity = advancedPOParameters[item.id][0]
351
                    t_po_lineitem.avgSales = advancedPOParameters[item.id][1]
352
                    t_po_lineitem.numberOfDaysInStock = advancedPOParameters[item.id][2] 
353
                    t_po_lineitem.minStockLevel = advancedPOParameters[item.id][3]
354
                    t_po_lineitem.numberOfDaysStock = advancedPOParameters[item.id][2] 
4754 mandeep.dh 355
                    if codRequirements.has_key(item.id):
356
                        t_po_lineitem.codCount = min(codRequirements[item.id], quantity)
357
                    try:
5944 mandeep.dh 358
                        item_pricing = inventory_client.getItemPricing(item.id, vendorId)
4754 mandeep.dh 359
                    except Exception as e:
360
                        vendor = self.getSupplier(vendorId)
361
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
362
                        print e
363
                        raise PurchaseServiceException(101, 'Transfer price missing for ' + vendor.name + ' and ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
364
                    t_po_lineitem.unitPrice = item_pricing.transferPrice
365
                    t_purchase_order.lineitems.append(t_po_lineitem)
366
                purchaseOrders.append(t_purchase_order)
367
            return purchaseOrders
368
        finally:
369
            self.close_session()
370
 
6762 amar.kumar 371
    def getSuppliers(self,):
4754 mandeep.dh 372
        """
373
        Returns all the valid suppliers
374
        """
375
        try:
376
            return [Supplier.to_thrift_object(supplier) for supplier in Supplier.query.all()]
377
        finally:
378
            self.close_session()
379
 
5185 mandeep.dh 380
    def unFulfillPO(self, purchaseId, itemId, quantity):
381
        """
382
        Unfulfills a given purchase id and an item with its quantity.
383
 
384
        Parameters:
385
         - purchaseId
386
         - itemId
387
         - quantity
388
        """
389
        try:
6762 amar.kumar 390
            purchaseOrderId = Purchase.query.filter_by(id=purchaseId).one().purchaseOrder_id
391
            lineitems = LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, itemId=itemId).all()
5185 mandeep.dh 392
            if lineitems:
393
                fulfilledQuantity = lineitems[0].quantity - lineitems[0].unfulfilledQuantity
394
                if fulfilledQuantity < quantity:
395
                    raise PurchaseServiceException(101, 'Can UnFulfill only ' + str(fulfilledQuantity) + 'quantity')
396
                else:
5437 mandeep.dh 397
                    lineitems[0].unfulfilledQuantity = lineitems[0].unfulfilledQuantity + quantity
5185 mandeep.dh 398
                    lineitems[0].fulfilled = 0
399
                    purchaseOrder = PurchaseOrder.get_by(id=purchaseOrderId)
400
                    purchaseOrder.status = POStatus.PARTIALLY_FULFILLED
401
                    session.commit()
402
                    return
403
 
404
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId))
405
        finally:
406
            self.close_session()        
407
 
4754 mandeep.dh 408
    def fulfillPO(self, purchaseOrderId, itemId, quantity):
409
        """
410
        Fulfills a given purchase order with an item.
411
 
412
        Parameters:
413
         - purchaseOrderId
414
         - itemId
415
         - quantity
416
        """
417
        try:
6762 amar.kumar 418
            lineitems = LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, itemId=itemId).all()
4754 mandeep.dh 419
            if lineitems:
420
                if lineitems[0].unfulfilledQuantity < quantity:
5361 mandeep.dh 421
                    raise PurchaseServiceException(101, 'Can fulfill only ' + str(lineitems[0].unfulfilledQuantity) + ' quantity')
4754 mandeep.dh 422
                else:
5361 mandeep.dh 423
                    lineitems[0].unfulfilledQuantity = lineitems[0].unfulfilledQuantity - quantity
4754 mandeep.dh 424
                    if not lineitems[0].unfulfilledQuantity:
425
                        lineitems[0].fulfilled = 1
5361 mandeep.dh 426
                        session.commit()
6762 amar.kumar 427
                        if not LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, fulfilled=0).all():
5361 mandeep.dh 428
                            purchaseOrder = PurchaseOrder.get_by(id=purchaseOrderId)
4754 mandeep.dh 429
                            purchaseOrder.status = POStatus.CLOSED
430
                    session.commit()
431
                    return
432
 
6762 amar.kumar 433
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId))
4754 mandeep.dh 434
        finally:
435
            self.close_session()
436
 
437
    def updatePurchaseOrder(self, purchaseOrder):
438
        """
439
        Amends a PO sa per the new lineitems passed
440
 
441
        Parameters:
442
         - purchaseOrder
443
        """
444
        try:
6762 amar.kumar 445
            existingPurchaseOrder = PurchaseOrder.get_by(id=purchaseOrder.id)
4754 mandeep.dh 446
            maxRevision = 0
6762 amar.kumar 447
            existingRevisions = RevisionedPurchaseOrder.query.filter_by(purchaseOrderId=purchaseOrder.id).all()
4754 mandeep.dh 448
            if existingRevisions:
449
                maxRevision = max([a.revision for a in existingRevisions]) + 1
5147 mandeep.dh 450
 
451
            newPOItems = {}
452
            for t_lineitem in purchaseOrder.lineitems:
453
                newPOItems[t_lineitem.itemId] = t_lineitem
454
 
4754 mandeep.dh 455
            for lineitem in existingPurchaseOrder.lineitems:
5147 mandeep.dh 456
                fulfilledQuantity = lineitem.quantity - lineitem.unfulfilledQuantity
457
                if fulfilledQuantity:
458
                    if not newPOItems.has_key(lineitem.itemId):
459
                        raise PurchaseServiceException(101, 'Cannot remove fulfilled item id: ' + str(lineitem.itemId) + ' from PO')
460
                    else:
461
                        if newPOItems[lineitem.itemId].quantity < fulfilledQuantity:
462
                            raise PurchaseServiceException(101, 'More quantity already fulfilled for item id: ' + str(lineitem.itemId))
463
                        else:
5437 mandeep.dh 464
                            newPOItems[lineitem.itemId].unfulfilledQuantity = newPOItems[lineitem.itemId].unfulfilledQuantity - fulfilledQuantity
4754 mandeep.dh 465
                revisionedPurchaseOrder = RevisionedPurchaseOrder()
466
                revisionedPurchaseOrder.purchaseOrderId = purchaseOrder.id
467
                revisionedPurchaseOrder.revision = maxRevision
468
                revisionedPurchaseOrder.itemId = lineitem.itemId
469
                revisionedPurchaseOrder.unfulfilledQuantity = lineitem.unfulfilledQuantity
470
                revisionedPurchaseOrder.unitPrice = lineitem.unitPrice
471
                revisionedPurchaseOrder.createdAt = lineitem.createdAt
472
                revisionedPurchaseOrder.quantity = lineitem.quantity
473
                lineitem.delete()
474
            existingPurchaseOrder.lineitems = [LineItem(existingPurchaseOrder, t_lineitem) for t_lineitem in purchaseOrder.lineitems]
475
            existingPurchaseOrder.totalCost = sum([t_lineitem.quantity * t_lineitem.unitPrice for t_lineitem in purchaseOrder.lineitems])
476
            session.commit()
477
        finally:
478
            self.close_session()
479
 
4503 mandeep.dh 480
    def close_session(self):
481
        if session.is_active:
482
            print "session is active. closing it."
483
            session.close()
484
 
5443 mandeep.dh 485
    def getInvoices(self, date):
486
        """
487
        Fetches all invoices for a given date
488
 
489
        Parameters:
490
         - date
491
        """
492
        try:
493
            return [i.to_thrift_object() for i in Invoice.query.filter(Invoice.date > to_py_date(date)).all()]
494
        finally:
495
            self.close_session()
6630 amar.kumar 496
 
497
    def getInvoice(self, invoiceNumber, supplierId):
498
        """
499
        Fetches all invoices for  given invoiceNumber and supplierId 
5443 mandeep.dh 500
 
6630 amar.kumar 501
        Parameters:
502
         - invoiceNumber, supplierId
503
        """
504
        try:
6762 amar.kumar 505
            invoice = Invoice.query.filter_by(invoiceNumber=invoiceNumber, supplierId=supplierId).first()
6638 amar.kumar 506
            if invoice is None:
6762 amar.kumar 507
                return None
6638 amar.kumar 508
            else:
509
                return invoice.to_thrift_object()
6630 amar.kumar 510
        finally:
511
            self.close_session()
512
 
5443 mandeep.dh 513
    def createInvoice(self, invoice):
514
        """
515
        Creates an invoice object
516
 
517
        Parameters:
518
         - invoice
519
        """
520
        try:
6762 amar.kumar 521
            if Invoice.query.filter_by(supplierId=invoice.supplierId, date=to_py_date(invoice.date), invoiceNumber=invoice.invoiceNumber).all():
5768 mandeep.dh 522
                raise PurchaseServiceException(ExceptionType.ILLEGAL_ARGUMENTS, "Already received such invoice")
5443 mandeep.dh 523
            invoiceObj = Invoice()
524
            invoiceObj.invoiceNumber = invoice.invoiceNumber
525
            invoiceObj.date = to_py_date(invoice.date)
526
            invoiceObj.receivedFrom = invoice.receivedFrom
527
            invoiceObj.numItems = invoice.numItems
528
            invoiceObj.supplierId = invoice.supplierId
529
            session.commit()
530
        finally:
531
            self.close_session()        
532
 
5591 mandeep.dh 533
    def addSupplier(self, supplier):
534
        """
535
        Creates a supplier
536
 
537
        Parameters:
538
         - supplier
539
        """
540
        try:
541
            supplierObj = Supplier()
542
            supplierObj.communicationAddress = supplier.communicationAddress
543
            supplierObj.contactEmail = supplier.contactEmail
544
            supplierObj.contactFax = supplier.contactFax
545
            supplierObj.contactName = supplier.contactName
546
            supplierObj.contactPhone = supplier.contactPhone
547
            supplierObj.fax = supplier.fax
548
            supplierObj.headDesignation = supplier.headDesignation
549
            supplierObj.headEmail = supplier.headEmail
550
            supplierObj.headName = supplier.headName
551
            supplierObj.name = supplier.name
552
            supplierObj.pan = supplier.pan
553
            supplierObj.phone = supplier.phone
554
            supplierObj.registeredAddress = supplier.registeredAddress
555
            supplierObj.tin = supplier.tin
556
            session.commit()
557
            return self.getSupplier(supplierObj.id)
558
        finally:
559
            self.close_session()
560
 
561
    def updateSupplier(self, supplier):
562
        """
563
        Updates a supplier
564
 
565
        Parameters:
566
         - supplier
567
        """
568
        try:
569
            supplierObj = Supplier.get(supplier.id)
570
            supplierObj.communicationAddress = supplier.communicationAddress
571
            supplierObj.contactEmail = supplier.contactEmail
572
            supplierObj.contactFax = supplier.contactFax
573
            supplierObj.contactName = supplier.contactName
574
            supplierObj.contactPhone = supplier.contactPhone
575
            supplierObj.fax = supplier.fax
576
            supplierObj.headDesignation = supplier.headDesignation
577
            supplierObj.headEmail = supplier.headEmail
578
            supplierObj.headName = supplier.headName
579
            supplierObj.name = supplier.name
580
            supplierObj.pan = supplier.pan
581
            supplierObj.phone = supplier.phone
582
            supplierObj.registeredAddress = supplier.registeredAddress
583
            supplierObj.tin = supplier.tin
584
            session.commit()
585
        finally:
586
            self.close_session()
587
 
6385 amar.kumar 588
    def getInvoicesForPO(self, poNumber):
589
        '''
590
        For getting invoiceNumbers for a Purchase Order
591
        '''
592
        try:
593
 
6762 amar.kumar 594
            purchases = Purchase.query.filter_by(purchaseOrder=poNumber)
6385 amar.kumar 595
            for purchase in purchases:
596
                invoice = purchase.invoiceNumber
597
        except:
598
            return None
599
        finally:
600
            self.close_session()
6467 amar.kumar 601
 
602
    def createPurchaseReturn(self, t_purchaseReturn):
603
        '''
604
        For creating a new Purchase Return
605
        '''
606
        try:
6762 amar.kumar 607
            purchaseReturn = PurchaseReturn(t_purchaseReturn.vendorId, t_purchaseReturn.amount)
6467 amar.kumar 608
            purchaseReturn.vendorId = t_purchaseReturn.vendorId
609
            purchaseReturn.amount = t_purchaseReturn.amount
610
            purchaseReturn.returnTimestamp = to_py_date(t_purchaseReturn.returnTimestamp)
611
            purchaseReturn.isSettled = False
6821 amar.kumar 612
            purchaseReturn.type = t_purchaseReturn.type
6467 amar.kumar 613
            session.commit()
614
            return purchaseReturn.id
615
        except Exception as e:
616
            print e
617
            raise PurchaseServiceException(101, 'Exception while creating  Purchase Return for ' + purchaseReturn.vendorId + ' for Rs' + purchaseReturn.amount)
618
        finally:
619
            self.close_session()
620
 
621
    def getUnsettledPurchaseReturns(self):
622
        '''
623
        For getting all unsettled Purchase Returns
624
        '''
625
        try:
6821 amar.kumar 626
            purchaseReturns = PurchaseReturn.query.filter_by(isSettled=False).filter_by(type=PurchaseReturnType.REAL).all()
6467 amar.kumar 627
            return [purchasereturn.to_thrift_object() for purchasereturn in purchaseReturns]
628
        except Exception as e:
629
            print e
630
            raise PurchaseServiceException(101, 'Exception while fetching all Unsettled Purchase Returns')
631
        finally:
632
            self.close_session()
6385 amar.kumar 633
 
6467 amar.kumar 634
    def settlePurchaseReturn(self, returnId):
635
        '''
636
        For marking a Purchase Return as settled
637
        '''
638
        try:
6762 amar.kumar 639
            purchaseReturn = PurchaseReturn.query.filter_by(id=returnId).one()
6467 amar.kumar 640
            purchaseReturn.isSettled = True
641
            session.commit()
642
        except Exception as e:
643
            print e
644
            raise PurchaseServiceException(101, 'Exception while settling Purchase Return Id : ' + id)
645
        finally:
646
            self.close_session()
6762 amar.kumar 647
 
648
    def createPurchaseForOurExtBilling(self, invoiceNumber, unitPrice, itemId):
649
        try:
650
            poId = self.getPOforOurExternalBilling()
651
            self.updatelineItemforOursExternalBilling(poId, itemId, unitPrice)
652
            self.receiveinvoiceforOursExternalBilling(invoiceNumber)
653
            return self.createPurchaseforOursExternalBilling(poId, invoiceNumber)
654
        except Exception as e:
655
            print e
656
            raise PurchaseServiceException(101, '')
657
        finally:
658
            self.close_session()
659
 
660
    def fulfillPOForExtBilling(self, itemId, quantity):
661
        poId = self.getPOforOurExternalBilling()
662
        lineItem = LineItem.get_by(purchaseOrder_id=poId, itemId=itemId)
663
        lineItem.unfulfilledQuantity = lineItem.unfulfilledQuantity - 1
664
        if not lineItem.unfulfilledQuantity:
665
            lineItem.fulfilled = 1
666
        session.commit()
6467 amar.kumar 667
 
6762 amar.kumar 668
    def isAlive(self,):
4503 mandeep.dh 669
        """
670
        For checking weather service is active alive or not. It also checks connectivity with database
671
        """
672
        try:
673
            session.query(Supplier.id).limit(1).all()
674
            return True
675
        except:
676
            return False
677
        finally:
678
            self.close_session()
5944 mandeep.dh 679
 
680
    def __get_item_from_master(self, item_id):
681
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
6762 amar.kumar 682
        return client.getItem(item_id)