Subversion Repositories SmartDukaan

Rev

Rev 4555 | Rev 4757 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4555 Rev 4754
Line 2... Line 2...
2
Created on 29-Jul-2011
2
Created on 29-Jul-2011
3
 
3
 
4
@author: Chandranshu
4
@author: Chandranshu
5
'''
5
'''
6
from elixir import metadata, setup_all, session
6
from elixir import metadata, setup_all, session
-
 
7
from shop2020.clients.CatalogClient import CatalogClient
-
 
8
from shop2020.clients.TransactionClient import TransactionClient
7
from shop2020.purchase.main.model.LineItem import LineItem
9
from shop2020.purchase.main.model.LineItem import LineItem
8
from shop2020.purchase.main.model.Purchase import Purchase
10
from shop2020.purchase.main.model.Purchase import Purchase
9
from shop2020.purchase.main.model.PurchaseOrder import PurchaseOrder
11
from shop2020.purchase.main.model.PurchaseOrder import PurchaseOrder
-
 
12
from shop2020.purchase.main.model.RevisionedPurchaseOrder import \
-
 
13
    RevisionedPurchaseOrder
10
from shop2020.purchase.main.model.Supplier import Supplier
14
from shop2020.purchase.main.model.Supplier import Supplier
-
 
15
from shop2020.thriftpy.model.v1.order.ttypes import OrderStatus
11
from shop2020.thriftpy.purchase.ttypes import PurchaseServiceException
16
from shop2020.thriftpy.purchase.ttypes import PurchaseServiceException, POStatus, \
-
 
17
    PurchaseOrder as TPurchaseOrder, LineItem as TLineItem
12
from sqlalchemy import create_engine
18
from sqlalchemy import create_engine
13
import datetime
19
import datetime
14
import logging
20
import logging
-
 
21
import sys
15
 
22
 
16
 
23
 
17
logging.basicConfig(level=logging.DEBUG)
24
logging.basicConfig(level=logging.DEBUG)
18
 
25
 
19
class PurchaseServiceHandler:
26
class PurchaseServiceHandler:
Line 148... Line 155...
148
        try:
155
        try:
149
            return self.getPurchaseOrder(Purchase.query.filter_by(id = purchaseId).one().purchaseOrder_id)
156
            return self.getPurchaseOrder(Purchase.query.filter_by(id = purchaseId).one().purchaseOrder_id)
150
        finally:
157
        finally:
151
            self.close_session()
158
            self.close_session()
152
 
159
 
-
 
160
    def getPendingPurchaseOrders(self, warehouseId):
-
 
161
        """
-
 
162
        Creates purchase order objects from pending orders
-
 
163
 
-
 
164
        Parameters:
-
 
165
         - warehouseId
-
 
166
        """
-
 
167
        try:
-
 
168
            purchaseOrders = []
-
 
169
            if not warehouseId:
-
 
170
                raise PurchaseServiceException(101, "bad warehouse id")
-
 
171
 
-
 
172
            transactionClient = TransactionClient().get_client()
-
 
173
            pending_orders = transactionClient.getOrdersInBatch([OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.ACCEPTED], 0, 0, warehouseId)
-
 
174
 
-
 
175
            if not pending_orders:
-
 
176
                return purchaseOrders
-
 
177
 
-
 
178
            catalog_client = CatalogClient().get_client()
-
 
179
            availability = {}
-
 
180
            for item in catalog_client.getAllItemsForWarehouse(warehouseId):
-
 
181
                availability[item.id] = [item.itemInventory.availability[warehouseId], item]
-
 
182
 
-
 
183
            codRequirements = {}
-
 
184
            requirements = {}
-
 
185
            for order in pending_orders:
-
 
186
                for lineitem in order.lineitems:
-
 
187
                    if (requirements.has_key(lineitem.item_id)):
-
 
188
                        requirements[lineitem.item_id] += lineitem.quantity
-
 
189
                    else:
-
 
190
                        requirements[lineitem.item_id] = lineitem.quantity
-
 
191
                    
-
 
192
                    if order.cod:
-
 
193
                        if (codRequirements.has_key(lineitem.item_id)):
-
 
194
                            codRequirements[lineitem.item_id] += lineitem.quantity
-
 
195
                        else:
-
 
196
                            codRequirements[lineitem.item_id] = lineitem.quantity
-
 
197
 
-
 
198
            netRequirements = {}
-
 
199
            for itemId in requirements.keys():
-
 
200
                requirementsCount = requirements.get(itemId)
-
 
201
                if  availability.has_key(itemId):
-
 
202
                    availabilityCount = availability.get(itemId)[0]
-
 
203
                    item              = availability.get(itemId)[1]
-
 
204
                    if item.preferredVendor is None or item.preferredVendor == 1:
-
 
205
                        continue
-
 
206
                    if requirementsCount > availabilityCount:
-
 
207
                        if (netRequirements.has_key(item.preferredVendor)):
-
 
208
                            netRequirements[item.preferredVendor].append([item, requirementsCount - availabilityCount])
-
 
209
                        else:
-
 
210
                            netRequirements[item.preferredVendor] = [[item, requirementsCount - availabilityCount]];
-
 
211
                else:
-
 
212
                    item = catalog_client.getItem(itemId);
-
 
213
                    if item.preferredVendor is None:
-
 
214
                        raise PurchaseServiceException(101, 'Preferred Vendor missing for ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
-
 
215
                    if item.preferredVendor == 1:
-
 
216
                        raise PurchaseServiceException(101, 'Preferred Vendor set to HotSpot for ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
-
 
217
                    if (netRequirements.has_key(item.preferredVendor)):
-
 
218
                        netRequirements[item.preferredVendor].append([item, requirementsCount])
-
 
219
                    else:
-
 
220
                        netRequirements[item.preferredVendor] = [[item, requirementsCount]];
-
 
221
        
-
 
222
            if not netRequirements:
-
 
223
                return purchaseOrders
-
 
224
 
-
 
225
            for vendorId in netRequirements.keys():
-
 
226
                t_purchase_order = TPurchaseOrder()
-
 
227
                t_purchase_order.supplierId = vendorId
-
 
228
                t_purchase_order.warehouseId = warehouseId
-
 
229
                t_purchase_order.lineitems = []
-
 
230
                for key in netRequirements.get(vendorId):
-
 
231
                    item     = key[0]
-
 
232
                    quantity = key[1]
-
 
233
                    t_po_lineitem = TLineItem()
-
 
234
                    t_po_lineitem.productGroup = item.productGroup
-
 
235
                    t_po_lineitem.brand = item.brand
-
 
236
                    t_po_lineitem.modelNumber = item.modelNumber
-
 
237
                    t_po_lineitem.modelName = item.modelName
-
 
238
                    t_po_lineitem.color = item.color
-
 
239
                    t_po_lineitem.itemId = item.id
-
 
240
                    t_po_lineitem.quantity = quantity
-
 
241
                    if codRequirements.has_key(item.id):
-
 
242
                        t_po_lineitem.codCount = min(codRequirements[item.id], quantity)
-
 
243
                    try:
-
 
244
                        item_pricing = catalog_client.getItemPricing(item.id, vendorId)
-
 
245
                    except Exception as e:
-
 
246
                        vendor = self.getSupplier(vendorId)
-
 
247
                        print 'Could not find transfer price for Item id: ' + str(item.id) + ' and vendor id: ' + str(vendorId)
-
 
248
                        print e
-
 
249
                        raise PurchaseServiceException(101, 'Transfer price missing for ' + vendor.name + ' and ' + " ".join([item.brand, item.modelName, item.modelNumber, item.color]))
-
 
250
                    t_po_lineitem.unitPrice = item_pricing.transferPrice
-
 
251
                    t_purchase_order.lineitems.append(t_po_lineitem)
-
 
252
                purchaseOrders.append(t_purchase_order)
-
 
253
            return purchaseOrders
-
 
254
        finally:
-
 
255
            self.close_session()
-
 
256
 
-
 
257
    def getSuppliers(self, ):
-
 
258
        """
-
 
259
        Returns all the valid suppliers
-
 
260
        """
-
 
261
        try:
-
 
262
            return [Supplier.to_thrift_object(supplier) for supplier in Supplier.query.all()]
-
 
263
        finally:
-
 
264
            self.close_session()
-
 
265
 
-
 
266
    def fulfillPO(self, purchaseOrderId, itemId, quantity):
-
 
267
        """
-
 
268
        Fulfills a given purchase order with an item.
-
 
269
 
-
 
270
        Parameters:
-
 
271
         - purchaseOrderId
-
 
272
         - itemId
-
 
273
         - quantity
-
 
274
        """
-
 
275
        try:
-
 
276
            lineitems = LineItem.query.filter_by(purchaseOrder_id = purchaseOrderId, itemId = itemId).all()
-
 
277
            if lineitems:
-
 
278
                if lineitems[0].unfulfilledQuantity < quantity:
-
 
279
                    raise PurchaseServiceException(101, 'Can fulfill only ' + str(lineitems[0].unfulfilledQuantity) + 'quantity')
-
 
280
                else:
-
 
281
                    lineitems[0].unfulfilledQuantity -= quantity
-
 
282
                    if not lineitems[0].unfulfilledQuantity:
-
 
283
                        lineitems[0].fulfilled = 1
-
 
284
                        if not LineItem.query.filter_by(purchaseOrder_id = purchaseOrderId, fulfilled = 0).all():
-
 
285
                            purchaseOrder = self.getPurchaseOrder(purchaseOrderId)
-
 
286
                            purchaseOrder.status = POStatus.CLOSED
-
 
287
                    session.commit()
-
 
288
                    return
-
 
289
    
-
 
290
            raise PurchaseServiceException(101, 'No lineitem found with this itemId: ' + str(itemId) + ' in PO Id: ' + str(purchaseOrderId) )
-
 
291
        finally:
-
 
292
            self.close_session()
-
 
293
 
-
 
294
    def updatePurchaseOrder(self, purchaseOrder):
-
 
295
        """
-
 
296
        Amends a PO sa per the new lineitems passed
-
 
297
 
-
 
298
        Parameters:
-
 
299
         - purchaseOrder
-
 
300
        """
-
 
301
        try:
-
 
302
            existingPurchaseOrder = PurchaseOrder.get_by(id = purchaseOrder.id)
-
 
303
            maxRevision = 0
-
 
304
            existingRevisions = RevisionedPurchaseOrder.query.filter_by(purchaseOrderId = purchaseOrder.id).all()
-
 
305
            if existingRevisions:
-
 
306
                maxRevision = max([a.revision for a in existingRevisions]) + 1
-
 
307
            for lineitem in existingPurchaseOrder.lineitems:
-
 
308
                revisionedPurchaseOrder = RevisionedPurchaseOrder()
-
 
309
                revisionedPurchaseOrder.purchaseOrderId = purchaseOrder.id
-
 
310
                revisionedPurchaseOrder.revision = maxRevision
-
 
311
                revisionedPurchaseOrder.itemId = lineitem.itemId
-
 
312
                revisionedPurchaseOrder.unfulfilledQuantity = lineitem.unfulfilledQuantity
-
 
313
                revisionedPurchaseOrder.unitPrice = lineitem.unitPrice
-
 
314
                revisionedPurchaseOrder.createdAt = lineitem.createdAt
-
 
315
                revisionedPurchaseOrder.quantity = lineitem.quantity
-
 
316
                lineitem.delete()
-
 
317
            existingPurchaseOrder.lineitems = [LineItem(existingPurchaseOrder, t_lineitem) for t_lineitem in purchaseOrder.lineitems]
-
 
318
            existingPurchaseOrder.totalCost = sum([t_lineitem.quantity * t_lineitem.unitPrice for t_lineitem in purchaseOrder.lineitems])
-
 
319
            session.commit()
-
 
320
        finally:
-
 
321
            self.close_session()
-
 
322
 
153
    def close_session(self):
323
    def close_session(self):
154
        if session.is_active:
324
        if session.is_active:
155
            print "session is active. closing it."
325
            print "session is active. closing it."
156
            session.close()
326
            session.close()
157
 
327