Subversion Repositories SmartDukaan

Rev

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