Subversion Repositories SmartDukaan

Rev

Rev 6821 | Rev 6835 | 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, \
6832 amar.kumar 20
    InventoryType, ItemStockPurchaseParams
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
6832 amar.kumar 297
                avgSales = 0
6821 amar.kumar 298
                for oosStatus in oosStatuses:
6832 amar.kumar 299
                    if oosStatus.is_oos == False:
6821 amar.kumar 300
                        salesCount = salesCount + oosStatus.num_orders
301
                        numDaysInStock = numDaysInStock + 1
6832 amar.kumar 302
                if numDaysInStock>0:
303
                    avgSales = salesCount/numDaysInStock
304
                itemStockPurchaseParam = ItemStockPurchaseParams()
305
                itemStockPurchaseParam = inventory_client.getItemStockPurchaseParams(key)
6821 amar.kumar 306
                advancedPOParameters[key] = [avgSales * itemStockPurchaseParam.numOfDaysStock, avgSales, numDaysInStock, itemStockPurchaseParam.minStockLevel, itemStockPurchaseParam.numOfDaysStock]
307
 
4754 mandeep.dh 308
            netRequirements = {}
309
            for itemId in requirements.keys():
310
                requirementsCount = requirements.get(itemId)
311
                if  availability.has_key(itemId):
312
                    availabilityCount = availability.get(itemId)[0]
6762 amar.kumar 313
                    item = availability.get(itemId)[1]
4754 mandeep.dh 314
                    if requirementsCount > availabilityCount:
5238 mandeep.dh 315
                        if item.preferredVendor is None:
316
                            raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
4754 mandeep.dh 317
                        if (netRequirements.has_key(item.preferredVendor)):
318
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
319
                        else:
320
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
321
                else:
5944 mandeep.dh 322
                    item = self.__get_item_from_master(itemId)
4754 mandeep.dh 323
                    if item.preferredVendor is None:
5238 mandeep.dh 324
                        raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([str(item.brand), str(item.modelName), str(item.modelNumber), str(item.color)]))
4754 mandeep.dh 325
                    if (netRequirements.has_key(item.preferredVendor)):
326
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
327
                    else:
328
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
5238 mandeep.dh 329
 
4754 mandeep.dh 330
            if not netRequirements:
331
                return purchaseOrders
332
 
333
            for vendorId in netRequirements.keys():
334
                t_purchase_order = TPurchaseOrder()
335
                t_purchase_order.supplierId = vendorId
336
                t_purchase_order.warehouseId = warehouseId
337
                t_purchase_order.lineitems = []
338
                for key in netRequirements.get(vendorId):
6762 amar.kumar 339
                    item = key[0]
4754 mandeep.dh 340
                    quantity = key[1]
341
                    t_po_lineitem = TLineItem()
342
                    t_po_lineitem.productGroup = item.productGroup
343
                    t_po_lineitem.brand = item.brand
344
                    t_po_lineitem.modelNumber = item.modelNumber
345
                    t_po_lineitem.modelName = item.modelName
346
                    t_po_lineitem.color = item.color
347
                    t_po_lineitem.itemId = item.id
348
                    t_po_lineitem.quantity = quantity
6821 amar.kumar 349
 
6832 amar.kumar 350
                    t_po_lineitem.availableQuantity = 0
351
                    if availability.has_key(item.id):
352
                        t_po_lineitem.availableQuantity = availability[item.id][0]
6821 amar.kumar 353
                    t_po_lineitem.reservedQuantity = requirements[lineitem.item_id]
354
                    t_po_lineitem.suggestedQuantity = advancedPOParameters[item.id][0]
355
                    t_po_lineitem.avgSales = advancedPOParameters[item.id][1]
356
                    t_po_lineitem.numberOfDaysInStock = advancedPOParameters[item.id][2] 
357
                    t_po_lineitem.minStockLevel = advancedPOParameters[item.id][3]
6832 amar.kumar 358
                    t_po_lineitem.numberOfDaysStock = advancedPOParameters[item.id][4] 
4754 mandeep.dh 359
                    if codRequirements.has_key(item.id):
360
                        t_po_lineitem.codCount = min(codRequirements[item.id], quantity)
361
                    try:
5944 mandeep.dh 362
                        item_pricing = inventory_client.getItemPricing(item.id, vendorId)
4754 mandeep.dh 363
                    except Exception as e:
364
                        vendor = self.getSupplier(vendorId)
365
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
366
                        print e
367
                        raise PurchaseServiceException(101, 'Transfer price missing for ' + vendor.name + ' and ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
368
                    t_po_lineitem.unitPrice = item_pricing.transferPrice
369
                    t_purchase_order.lineitems.append(t_po_lineitem)
370
                purchaseOrders.append(t_purchase_order)
371
            return purchaseOrders
372
        finally:
373
            self.close_session()
374
 
6762 amar.kumar 375
    def getSuppliers(self,):
4754 mandeep.dh 376
        """
377
        Returns all the valid suppliers
378
        """
379
        try:
380
            return [Supplier.to_thrift_object(supplier) for supplier in Supplier.query.all()]
381
        finally:
382
            self.close_session()
383
 
5185 mandeep.dh 384
    def unFulfillPO(self, purchaseId, itemId, quantity):
385
        """
386
        Unfulfills a given purchase id and an item with its quantity.
387
 
388
        Parameters:
389
         - purchaseId
390
         - itemId
391
         - quantity
392
        """
393
        try:
6762 amar.kumar 394
            purchaseOrderId = Purchase.query.filter_by(id=purchaseId).one().purchaseOrder_id
395
            lineitems = LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, itemId=itemId).all()
5185 mandeep.dh 396
            if lineitems:
397
                fulfilledQuantity = lineitems[0].quantity - lineitems[0].unfulfilledQuantity
398
                if fulfilledQuantity < quantity:
399
                    raise PurchaseServiceException(101, 'Can UnFulfill only ' + str(fulfilledQuantity) + 'quantity')
400
                else:
5437 mandeep.dh 401
                    lineitems[0].unfulfilledQuantity = lineitems[0].unfulfilledQuantity + quantity
5185 mandeep.dh 402
                    lineitems[0].fulfilled = 0
403
                    purchaseOrder = PurchaseOrder.get_by(id=purchaseOrderId)
404
                    purchaseOrder.status = POStatus.PARTIALLY_FULFILLED
405
                    session.commit()
406
                    return
407
 
408
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId))
409
        finally:
410
            self.close_session()        
411
 
4754 mandeep.dh 412
    def fulfillPO(self, purchaseOrderId, itemId, quantity):
413
        """
414
        Fulfills a given purchase order with an item.
415
 
416
        Parameters:
417
         - purchaseOrderId
418
         - itemId
419
         - quantity
420
        """
421
        try:
6762 amar.kumar 422
            lineitems = LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, itemId=itemId).all()
4754 mandeep.dh 423
            if lineitems:
424
                if lineitems[0].unfulfilledQuantity < quantity:
5361 mandeep.dh 425
                    raise PurchaseServiceException(101, 'Can fulfill only ' + str(lineitems[0].unfulfilledQuantity) + ' quantity')
4754 mandeep.dh 426
                else:
5361 mandeep.dh 427
                    lineitems[0].unfulfilledQuantity = lineitems[0].unfulfilledQuantity - quantity
4754 mandeep.dh 428
                    if not lineitems[0].unfulfilledQuantity:
429
                        lineitems[0].fulfilled = 1
5361 mandeep.dh 430
                        session.commit()
6762 amar.kumar 431
                        if not LineItem.query.filter_by(purchaseOrder_id=purchaseOrderId, fulfilled=0).all():
5361 mandeep.dh 432
                            purchaseOrder = PurchaseOrder.get_by(id=purchaseOrderId)
4754 mandeep.dh 433
                            purchaseOrder.status = POStatus.CLOSED
434
                    session.commit()
435
                    return
436
 
6762 amar.kumar 437
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId))
4754 mandeep.dh 438
        finally:
439
            self.close_session()
440
 
441
    def updatePurchaseOrder(self, purchaseOrder):
442
        """
443
        Amends a PO sa per the new lineitems passed
444
 
445
        Parameters:
446
         - purchaseOrder
447
        """
448
        try:
6762 amar.kumar 449
            existingPurchaseOrder = PurchaseOrder.get_by(id=purchaseOrder.id)
4754 mandeep.dh 450
            maxRevision = 0
6762 amar.kumar 451
            existingRevisions = RevisionedPurchaseOrder.query.filter_by(purchaseOrderId=purchaseOrder.id).all()
4754 mandeep.dh 452
            if existingRevisions:
453
                maxRevision = max([a.revision for a in existingRevisions]) + 1
5147 mandeep.dh 454
 
455
            newPOItems = {}
456
            for t_lineitem in purchaseOrder.lineitems:
457
                newPOItems[t_lineitem.itemId] = t_lineitem
458
 
4754 mandeep.dh 459
            for lineitem in existingPurchaseOrder.lineitems:
5147 mandeep.dh 460
                fulfilledQuantity = lineitem.quantity - lineitem.unfulfilledQuantity
461
                if fulfilledQuantity:
462
                    if not newPOItems.has_key(lineitem.itemId):
463
                        raise PurchaseServiceException(101, 'Cannot remove fulfilled item id: ' + str(lineitem.itemId) + ' from PO')
464
                    else:
465
                        if newPOItems[lineitem.itemId].quantity < fulfilledQuantity:
466
                            raise PurchaseServiceException(101, 'More quantity already fulfilled for item id: ' + str(lineitem.itemId))
467
                        else:
5437 mandeep.dh 468
                            newPOItems[lineitem.itemId].unfulfilledQuantity = newPOItems[lineitem.itemId].unfulfilledQuantity - fulfilledQuantity
4754 mandeep.dh 469
                revisionedPurchaseOrder = RevisionedPurchaseOrder()
470
                revisionedPurchaseOrder.purchaseOrderId = purchaseOrder.id
471
                revisionedPurchaseOrder.revision = maxRevision
472
                revisionedPurchaseOrder.itemId = lineitem.itemId
473
                revisionedPurchaseOrder.unfulfilledQuantity = lineitem.unfulfilledQuantity
474
                revisionedPurchaseOrder.unitPrice = lineitem.unitPrice
475
                revisionedPurchaseOrder.createdAt = lineitem.createdAt
476
                revisionedPurchaseOrder.quantity = lineitem.quantity
477
                lineitem.delete()
478
            existingPurchaseOrder.lineitems = [LineItem(existingPurchaseOrder, t_lineitem) for t_lineitem in purchaseOrder.lineitems]
479
            existingPurchaseOrder.totalCost = sum([t_lineitem.quantity * t_lineitem.unitPrice for t_lineitem in purchaseOrder.lineitems])
480
            session.commit()
481
        finally:
482
            self.close_session()
483
 
4503 mandeep.dh 484
    def close_session(self):
485
        if session.is_active:
486
            print "session is active. closing it."
487
            session.close()
488
 
5443 mandeep.dh 489
    def getInvoices(self, date):
490
        """
491
        Fetches all invoices for a given date
492
 
493
        Parameters:
494
         - date
495
        """
496
        try:
497
            return [i.to_thrift_object() for i in Invoice.query.filter(Invoice.date > to_py_date(date)).all()]
498
        finally:
499
            self.close_session()
6630 amar.kumar 500
 
501
    def getInvoice(self, invoiceNumber, supplierId):
502
        """
503
        Fetches all invoices for  given invoiceNumber and supplierId 
5443 mandeep.dh 504
 
6630 amar.kumar 505
        Parameters:
506
         - invoiceNumber, supplierId
507
        """
508
        try:
6762 amar.kumar 509
            invoice = Invoice.query.filter_by(invoiceNumber=invoiceNumber, supplierId=supplierId).first()
6638 amar.kumar 510
            if invoice is None:
6762 amar.kumar 511
                return None
6638 amar.kumar 512
            else:
513
                return invoice.to_thrift_object()
6630 amar.kumar 514
        finally:
515
            self.close_session()
516
 
5443 mandeep.dh 517
    def createInvoice(self, invoice):
518
        """
519
        Creates an invoice object
520
 
521
        Parameters:
522
         - invoice
523
        """
524
        try:
6762 amar.kumar 525
            if Invoice.query.filter_by(supplierId=invoice.supplierId, date=to_py_date(invoice.date), invoiceNumber=invoice.invoiceNumber).all():
5768 mandeep.dh 526
                raise PurchaseServiceException(ExceptionType.ILLEGAL_ARGUMENTS, "Already received such invoice")
5443 mandeep.dh 527
            invoiceObj = Invoice()
528
            invoiceObj.invoiceNumber = invoice.invoiceNumber
529
            invoiceObj.date = to_py_date(invoice.date)
530
            invoiceObj.receivedFrom = invoice.receivedFrom
531
            invoiceObj.numItems = invoice.numItems
532
            invoiceObj.supplierId = invoice.supplierId
533
            session.commit()
534
        finally:
535
            self.close_session()        
536
 
5591 mandeep.dh 537
    def addSupplier(self, supplier):
538
        """
539
        Creates a supplier
540
 
541
        Parameters:
542
         - supplier
543
        """
544
        try:
545
            supplierObj = Supplier()
546
            supplierObj.communicationAddress = supplier.communicationAddress
547
            supplierObj.contactEmail = supplier.contactEmail
548
            supplierObj.contactFax = supplier.contactFax
549
            supplierObj.contactName = supplier.contactName
550
            supplierObj.contactPhone = supplier.contactPhone
551
            supplierObj.fax = supplier.fax
552
            supplierObj.headDesignation = supplier.headDesignation
553
            supplierObj.headEmail = supplier.headEmail
554
            supplierObj.headName = supplier.headName
555
            supplierObj.name = supplier.name
556
            supplierObj.pan = supplier.pan
557
            supplierObj.phone = supplier.phone
558
            supplierObj.registeredAddress = supplier.registeredAddress
559
            supplierObj.tin = supplier.tin
560
            session.commit()
561
            return self.getSupplier(supplierObj.id)
562
        finally:
563
            self.close_session()
564
 
565
    def updateSupplier(self, supplier):
566
        """
567
        Updates a supplier
568
 
569
        Parameters:
570
         - supplier
571
        """
572
        try:
573
            supplierObj = Supplier.get(supplier.id)
574
            supplierObj.communicationAddress = supplier.communicationAddress
575
            supplierObj.contactEmail = supplier.contactEmail
576
            supplierObj.contactFax = supplier.contactFax
577
            supplierObj.contactName = supplier.contactName
578
            supplierObj.contactPhone = supplier.contactPhone
579
            supplierObj.fax = supplier.fax
580
            supplierObj.headDesignation = supplier.headDesignation
581
            supplierObj.headEmail = supplier.headEmail
582
            supplierObj.headName = supplier.headName
583
            supplierObj.name = supplier.name
584
            supplierObj.pan = supplier.pan
585
            supplierObj.phone = supplier.phone
586
            supplierObj.registeredAddress = supplier.registeredAddress
587
            supplierObj.tin = supplier.tin
588
            session.commit()
589
        finally:
590
            self.close_session()
591
 
6385 amar.kumar 592
    def getInvoicesForPO(self, poNumber):
593
        '''
594
        For getting invoiceNumbers for a Purchase Order
595
        '''
596
        try:
597
 
6762 amar.kumar 598
            purchases = Purchase.query.filter_by(purchaseOrder=poNumber)
6385 amar.kumar 599
            for purchase in purchases:
600
                invoice = purchase.invoiceNumber
601
        except:
602
            return None
603
        finally:
604
            self.close_session()
6467 amar.kumar 605
 
606
    def createPurchaseReturn(self, t_purchaseReturn):
607
        '''
608
        For creating a new Purchase Return
609
        '''
610
        try:
6762 amar.kumar 611
            purchaseReturn = PurchaseReturn(t_purchaseReturn.vendorId, t_purchaseReturn.amount)
6467 amar.kumar 612
            purchaseReturn.vendorId = t_purchaseReturn.vendorId
613
            purchaseReturn.amount = t_purchaseReturn.amount
614
            purchaseReturn.returnTimestamp = to_py_date(t_purchaseReturn.returnTimestamp)
615
            purchaseReturn.isSettled = False
6821 amar.kumar 616
            purchaseReturn.type = t_purchaseReturn.type
6467 amar.kumar 617
            session.commit()
618
            return purchaseReturn.id
619
        except Exception as e:
620
            print e
621
            raise PurchaseServiceException(101, 'Exception while creating  Purchase Return for ' + purchaseReturn.vendorId + ' for Rs' + purchaseReturn.amount)
622
        finally:
623
            self.close_session()
624
 
625
    def getUnsettledPurchaseReturns(self):
626
        '''
627
        For getting all unsettled Purchase Returns
628
        '''
629
        try:
6821 amar.kumar 630
            purchaseReturns = PurchaseReturn.query.filter_by(isSettled=False).filter_by(type=PurchaseReturnType.REAL).all()
6467 amar.kumar 631
            return [purchasereturn.to_thrift_object() for purchasereturn in purchaseReturns]
632
        except Exception as e:
633
            print e
634
            raise PurchaseServiceException(101, 'Exception while fetching all Unsettled Purchase Returns')
635
        finally:
636
            self.close_session()
6385 amar.kumar 637
 
6467 amar.kumar 638
    def settlePurchaseReturn(self, returnId):
639
        '''
640
        For marking a Purchase Return as settled
641
        '''
642
        try:
6762 amar.kumar 643
            purchaseReturn = PurchaseReturn.query.filter_by(id=returnId).one()
6467 amar.kumar 644
            purchaseReturn.isSettled = True
645
            session.commit()
646
        except Exception as e:
647
            print e
648
            raise PurchaseServiceException(101, 'Exception while settling Purchase Return Id : ' + id)
649
        finally:
650
            self.close_session()
6762 amar.kumar 651
 
652
    def createPurchaseForOurExtBilling(self, invoiceNumber, unitPrice, itemId):
653
        try:
654
            poId = self.getPOforOurExternalBilling()
655
            self.updatelineItemforOursExternalBilling(poId, itemId, unitPrice)
656
            self.receiveinvoiceforOursExternalBilling(invoiceNumber)
657
            return self.createPurchaseforOursExternalBilling(poId, invoiceNumber)
658
        except Exception as e:
659
            print e
660
            raise PurchaseServiceException(101, '')
661
        finally:
662
            self.close_session()
663
 
664
    def fulfillPOForExtBilling(self, itemId, quantity):
665
        poId = self.getPOforOurExternalBilling()
666
        lineItem = LineItem.get_by(purchaseOrder_id=poId, itemId=itemId)
667
        lineItem.unfulfilledQuantity = lineItem.unfulfilledQuantity - 1
668
        if not lineItem.unfulfilledQuantity:
669
            lineItem.fulfilled = 1
670
        session.commit()
6467 amar.kumar 671
 
6762 amar.kumar 672
    def isAlive(self,):
4503 mandeep.dh 673
        """
674
        For checking weather service is active alive or not. It also checks connectivity with database
675
        """
676
        try:
677
            session.query(Supplier.id).limit(1).all()
678
            return True
679
        except:
680
            return False
681
        finally:
682
            self.close_session()
5944 mandeep.dh 683
 
684
    def __get_item_from_master(self, item_id):
685
        client = CatalogClient("catalog_service_server_host_master", "catalog_service_server_port").get_client()
6762 amar.kumar 686
        return client.getItem(item_id)