Subversion Repositories SmartDukaan

Rev

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