Subversion Repositories SmartDukaan

Rev

Rev 5944 | Rev 5966 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5944 mandeep.dh 1
'''
2
Created on 27-Apr-2010
3
 
4
@author: ashish
5
'''
6
from shop2020.config.client.ConfigClient import ConfigClient
7
from shop2020.model.v1.inventory.impl import DataService
5957 mandeep.dh 8
from shop2020.model.v1.inventory.impl.Convertors import to_t_item_inventory, \
9
    to_t_warehouse, to_t_vendor_item_pricing, to_t_vendor, to_t_vendor_item_mapping
5944 mandeep.dh 10
from shop2020.model.v1.inventory.impl.DataAcessors import add_warehouse, \
11
    update_inventory, retire_warehouse, get_item_availability_for_warehouse, \
12
    get_item_availability_for_location, get_all_warehouses_by_status, get_Warehouse, \
5957 mandeep.dh 13
    get_all_items_for_warehouse, close_session, add_vendor, \
14
    get_item_inventory_by_item_id, reserve_item_in_warehouse, \
15
    reduce_reservation_count, get_all_item_pricing, add_vendor_pricing, \
16
    get_item_pricing, get_all_vendors, get_item_mappings, add_vendor_item_mapping, \
17
    update_inventory_history, is_alive, add_inventory, add_bad_inventory, \
18
    mark_missed_inventory_updates_as_processed, update_vendor_string, \
19
    get_item_keys_to_be_processed, reset_availability, get_shipping_locations, \
5944 mandeep.dh 20
    initialize, get_inventory_snapshot, clear_item_availability_cache, \
5957 mandeep.dh 21
    reset_availability_for_warehouse, get_vendor, get_pending_orders_inventory
5944 mandeep.dh 22
from shop2020.model.v1.inventory.impl.DataService import Warehouse, \
23
    MissedInventoryUpdate, VendorItemMapping
5957 mandeep.dh 24
from shop2020.thriftpy.model.v1.inventory.ttypes import \
25
    InventoryServiceException, WarehouseType, InventoryType, \
26
    AvailableAndReservedStock
5944 mandeep.dh 27
from shop2020.utils.Utils import log_entry, to_java_date
28
 
29
class InventoryServiceHandler:
30
    '''
31
    classdocs
32
    '''
33
 
34
    def __init__(self, dbname='catalog', db_hostname='localhost'):
35
        '''
36
        Constructor
37
        '''
38
        initialize(dbname, db_hostname)
39
        try:
40
            config_client = ConfigClient()
41
            self.latest_arrivals_limit = int(config_client.get_property("LATEST_ARRIVALS_LIMIT"));
42
            self.best_sellers_limit = int(config_client.get_property("BEST_SELLERS_LIMIT"))
43
        except:
44
            self.latest_arrivals_limit = 50
45
            self.best_sellers_limit = 50
46
 
47
    def addWarehouse(self, warehouse):
48
        """
49
        Parameters:
50
         - warehouse
51
        """
52
        log_entry(self, "addWarehouse called")
53
        try:
54
            return add_warehouse(warehouse)
55
        finally:
56
            close_session()
57
 
58
    def updateInventoryHistory(self, warehouse_id, timestamp, availability):
59
        """
60
        Stores the incremental warehouse updates of items.
61
 
62
        Parameters:
63
         - warehouse_id
64
         - timestamp
65
         - availability
66
        """
67
        try:
68
            return update_inventory_history(warehouse_id, timestamp, availability)
69
        finally:
70
            close_session()
71
 
72
    def updateInventory(self, warehouse_id, timestamp, availability):
73
        """
74
        Parameters:
75
         - warehouse_id
76
         - timestamp
77
         - availability
78
        """
79
        log_entry(self, "update Inventory called")
80
        try:
81
            return update_inventory(warehouse_id, timestamp, availability)
82
        finally:
83
            close_session()
84
 
85
    def addInventory(self, itemId, warehouseId, quantity):
86
        """
87
        Add the inventory to existing stock.
88
 
89
        Parameters:
90
         - itemId
91
         - warehouseId
92
         - quantity
93
        """
94
        log_entry(self, "add Inventory called")
95
        try:
96
            return add_inventory(itemId, warehouseId, quantity)
97
        finally:
98
            close_session()
99
 
100
    def retireWarehouse(self, warehouse_id):
101
        """
102
        Parameters:
103
         - warehouse_id
104
        """
105
        log_entry(self, "retire warehouse called")
106
        try:
107
            return retire_warehouse(warehouse_id)
108
        finally:
109
            close_session()
110
 
111
 
112
    def getItemInventoryByItemId(self, item_id):
113
        """
114
        Parameters:
115
         - item_id
116
        """
117
        log_entry(self, "item inventory requested")
118
        try:
119
            inventory = get_item_inventory_by_item_id(item_id)
120
            return to_t_item_inventory(inventory, item_id)
121
        finally:
122
            close_session()
123
 
124
    def getItemAvailabilityAtLocation(self, itemId):
125
        """
126
        Determines the warehouse that should be used to fulfil an order for the given item.
127
        It first checks all the warehouses which are in the logistics location given by the
128
        warehouse_loc parameter. If none of the warehouses there have any inventory, then the
129
        preferred warehouse for the item is used.
130
 
131
        Returns an ordered list of size 4 with following elements in the given order:
132
        1. Logistics location of the warehouse which was finally picked up to ship the order.
133
        2. Id of the warehouse which was finally picked up.
134
        3. Inventory size in the selected warehouse.
135
        4. Expected delay added by the category manager.
136
 
137
        Parameters:
138
         - itemId
139
        """
140
        try:
141
            return get_item_availability_for_location(itemId)
142
        finally:
143
            close_session()
144
 
145
    def getItemAvailibilityAtWarehouse(self, warehouse_id, item_id):
146
        """
147
        Parameters:
148
         - warehouse_id
149
         - item_id
150
        """
151
        log_entry(self, "item availability at warehouse requested")
152
        try:
153
            return get_item_availability_for_warehouse(warehouse_id, item_id)
154
        finally:
155
            close_session()
156
 
157
    def getItemInventoryHistory(self, id, item_id, warehouse_id, from_date, to_date):
158
        """
159
        Parameters:
160
         - id
161
         - item_id
162
         - warehouse_id
163
         - from_date
164
         - to_date
165
        """
166
        pass
167
 
168
    def getAllWarehouses(self, isActive):
169
        """
170
        Parameters:
171
        - isActive
172
        """
173
        try:
174
            if isActive:
175
                warehouses = get_all_warehouses_by_status(3)
176
            else:
177
                warehouses = get_all_warehouses_by_status(None)
178
 
179
            ret_warehouses = []
180
 
181
            for warehouse in warehouses:
182
                ret_warehouses.append(to_t_warehouse(warehouse))
183
            return ret_warehouses
184
        finally:
185
            close_session()
186
 
187
    def getWarehouse(self, warehouse_id):
188
        """
189
        Parameters:
190
         - warehouse_id
191
        """
192
        log_entry(self, "get warehouse call")
193
        try:
194
            warehouse = get_Warehouse(warehouse_id)
195
            if warehouse:
196
                return to_t_warehouse(warehouse)
197
            else:
198
                raise InventoryServiceException(101, "no such warehouse: " + str(warehouse_id))
199
        finally:
200
            close_session()
201
 
202
    def getAllItemsForWarehouse(self, warehouse_id):
203
        """
204
        Parameters:
205
         - warehouse_id
206
        """
207
        log_entry(self, "getting all items for warehouse")
208
        try:
209
            all_items = get_all_items_for_warehouse(warehouse_id)
210
            t_items = []
211
            for item in all_items:
212
                t_items.append(item.id)
213
            return t_items
214
        finally:
215
            close_session()
216
 
217
    def reserveItemInWarehouse(self, itemId, warehouseId, quantity):
218
        """
219
        Increases the reservation count for an item in a warehouse. Should always succeed normally.
220
 
221
        Parameters:
222
         - itemId
223
         - warehouseId
224
        """
225
        log_entry(self, "reserveItemInWarehouse called")
226
        try:
227
            return reserve_item_in_warehouse(itemId, warehouseId, quantity)
228
        finally:
229
            close_session()
230
 
231
    def reduceReservationCount(self, itemId, warehouseId, quantity):
232
        """
233
        Decreases the reservation count for an item in a warehouse. Should always succeed normally.
234
 
235
        Parameters:
236
         - itemId
237
         - warehouseId
238
        """
239
        log_entry(self, "reduceReservationCount called")
240
        try:
241
            return reduce_reservation_count(itemId, warehouseId, quantity)
242
        finally:
243
            close_session()
244
 
245
    def getItemPricing(self, itemId, vendorId):
246
        """
247
        Returns the pricing information of an item associated with the vendor of the given warehouse.
248
        Raises an exception if either the item, vendor or the associated pricing information can't be found.
249
 
250
        Parameters:
251
         - itemId
252
         - warehouseId
253
        """
254
        try:
255
            return to_t_vendor_item_pricing(get_item_pricing(itemId, vendorId))
256
        finally:
257
            close_session()
258
 
259
 
260
    def getAllItemPricing(self, itemId):
261
        """
262
        Returns list of the pricing information of an item associated an item.
263
        Raises an exception if the item can't be found.
264
 
265
        Parameters:
266
         - itemId
267
        """
268
        try:
269
            return [to_t_vendor_item_pricing(vid) for vid in get_all_item_pricing(itemId)]
270
        finally:
271
            close_session()
272
 
273
    def addVendorItemPricing(self, vendorItemPricing):
274
        """
275
        Adds vendor prices corresponding to the item. If pricing already exists then updates the prices. 
276
        Raises an exception if either the item or vendor can't be found corresponding to their ids.
277
 
278
        Parameters:
279
         - vendorItemPricing
280
        """
281
        log_entry(self, "updateVendorItemPricing called")
282
        try:
283
            return add_vendor_pricing(vendorItemPricing)
284
        finally:
285
            close_session()
286
 
287
    def getVendor(self, vendorId):
288
        """
289
        Return a vendor for id
290
        """
291
        try:
292
            return to_t_vendor(get_vendor(vendorId))
293
        finally:
294
            close_session()
295
 
296
 
297
    def getAllVendors(self, ):
298
        """
299
        Return list of all vendors
300
        """
301
        try:
302
            return [to_t_vendor(v) for v in get_all_vendors()]
303
        finally:
304
            close_session()
305
 
306
    def addVendorItemMapping(self, key, vendorItemMapping):
307
        """
308
        Adds VendorItemMapping. Updates VendorItemMapping if exists corresponding to the item key.
309
 
310
        Parameters:
311
         - key
312
         - vendorItemMapping
313
        """
314
        log_entry(self, "addVendorItemMapping called")
315
        try:
316
            return add_vendor_item_mapping(key, vendorItemMapping)
317
        finally:
318
            close_session()
319
 
320
    def getVendorItemMappings(self, itemId):
321
        """
322
        Returns the list of vendor item mapping corresponding to itemId passed as parameter.
323
        Raises an exception if item not found corresponding to itemId
324
 
325
        Parameters:
326
         - itemId
327
        """
328
        try:
329
            item_mappings = get_item_mappings(itemId)
330
            return [to_t_vendor_item_mapping(vim) for vim in item_mappings]
331
        finally:
332
            close_session()
333
 
334
    def isAlive(self, ):
335
        """
336
        For checking weather service is active alive or not. It also checks connectivity with database
337
        """
338
        try:
339
            return is_alive()
340
        finally:
341
            close_session()
342
 
343
    def closeSession(self, ):
344
        """
345
        For closing the open session in sqlalchemy
346
        """
347
        close_session()
348
 
349
    def addVendor(self, vendor):
350
        """
351
        add a new vendor
352
        """
353
        try:
354
            return add_vendor(vendor)
355
        finally:
356
            close_session()
357
 
358
    def getWarehouses(self, warehouseType, inventoryType, vendorId, billingWarehouseId, shippingWarehouseId):
359
        """
360
        This method returns all warehouses for a given warehosueType, inventoryType, vendor, billingWarehouse and shippingWarehouse.
361
        getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 3, 7, 7) would return ours warehouse with GOOD type inventory for vendor 1 for billing warehouse 7 and shipping warehouse 7
362
        getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 3, 7, 7) would return ours warehouse with GOOD type inventory for vendor 3 for billing warehouse 7 and shipping warehouse 7
363
        getWarehouses(null, null, 3, 7, 7) would return all type warehouses with all type inventory for vendor 3 for billing warehouse 7 and shipping warehouse 7
364
        getWarehouses(null, null, 0, 0, 7) would return all type warehouses with all type inventory for all vendors for all billing warehouses at shipping warehouse 7
365
 
366
        Parameters:
367
         - warehouseType
368
         - inventoryType
369
         - vendorId
370
         - billingWarehouseId
371
         - shippingWarehouseId
372
        """
373
        try:
374
            query = Warehouse.query
375
            if warehouseType is not None:
376
                query = query.filter_by(warehouseType = WarehouseType._VALUES_TO_NAMES[warehouseType])
377
            if inventoryType is not None:
378
                query = query.filter_by(inventoryType = InventoryType._VALUES_TO_NAMES[inventoryType])
379
            if vendorId:
380
                query = query.filter_by(vendor_id = vendorId)
381
            if billingWarehouseId:
382
                query = query.filter_by(billingWarehouseId = billingWarehouseId)
383
            if shippingWarehouseId:
384
                query = query.filter_by(shippingWarehouseId = shippingWarehouseId)
385
 
386
            return [to_t_warehouse(w) for w in query.all()]
387
        finally:
388
            close_session()
389
 
390
    def getItemKeysToBeProcessed(self, warehouseId):
391
        """
392
        Returns the list of item keys which need to be processed for a given warehouse.
393
        This is currently used by Support application to send item keys whose inventory needs
394
        to be updated from PLB
395
 
396
        Parameters:
397
         - warehouseId
398
        """
399
        try:
400
            return get_item_keys_to_be_processed(warehouseId)
401
        finally:
402
            close_session()
403
 
404
    def markMissedInventoryUpdatesAsProcessed(self, itemKey, warehouseId):
405
        """
406
        Marks/Deletes missed inventory updates for a given key and warehouse.
407
        This generally happens when updates from PLB are applied on the currentinventorysnapshot for an item
408
 
409
        Parameters:
410
         - itemKey
411
         - warehouseId
412
        """
413
        try:
414
            mark_missed_inventory_updates_as_processed(itemKey, warehouseId)
415
        finally:
416
            close_session()
417
 
418
    def resetAvailability(self, itemKey, vendorId, quantity, warehouseId):
419
        """
420
        Resets availability of an item to the quantity mentioned in a warehouse.
421
 
422
        Parameters:
423
         - itemKey
424
         - vendorId
425
         - quantity
426
         - warehouseId
427
        """
428
        try:
429
            reset_availability(itemKey, vendorId, quantity, warehouseId)
430
        finally:
431
            close_session()
432
 
433
    def resetAvailabilityForWarehouse(self, warehouseId):
434
        """
435
        Resets availability of a warehouse to zero.
436
 
437
        Parameters:
438
         - warehouseId
439
        """
440
        try:
441
            reset_availability_for_warehouse(warehouseId)
442
        finally:
443
            close_session()
444
 
445
    def getIgnoredItemKeys(self, ):
446
        """
447
        Returns all the item key mappings that have been ignored until date. Value of map has the warehouse id
448
        and the timestamp from where alert was raised.
449
        """
450
        try:
451
            itemKeysMap = {}
452
            for key in MissedInventoryUpdate.query.filter_by(isIgnored = 1).all():
453
                itemKeysMap[key.itemKey] = { key.warehouseId : to_java_date(key.timestamp) }
454
 
455
            return itemKeysMap
456
        finally:
457
            close_session()
458
 
459
    def addBadInventory(self, itemId, warehouseId, quantity):
460
        """
461
        Add the BAD type inventory to existing stock.
462
 
463
        Parameters:
464
         - itemId
465
         - warehouseId
466
         - quantity
467
        """
468
        try:
469
            add_bad_inventory(itemId, warehouseId, quantity)
470
        finally:
471
            close_session()
472
 
473
    def getShippingLocations(self, ):
474
        """
475
        Returns all shipping locations
476
        """
477
        try:
478
            return [to_t_warehouse(w) for w in get_shipping_locations()]
479
        finally:
480
            close_session()
481
 
482
    def getAllVendorItemMappings(self, ):
483
        """
484
        Fetches all the vendor item mappings present.
485
        """
486
        try:
487
            return [to_t_vendor_item_mapping(m) for m in VendorItemMapping.query.all()]
488
        finally:
489
            close_session()
490
 
491
    def getInventorySnapshot(self, warehouseId):
492
        """
493
        Gets items' inventory for a warehouse
494
        If warehouse is passed as zero, items' inventory across all warehouses is sent
495
 
496
        Parameters:
497
         - warehouseId
498
        """
499
        try:
500
            resultMap = {}
501
            itemInventoryMap = get_inventory_snapshot(warehouseId)
502
            for key, value in itemInventoryMap.items():
503
                resultMap[key] = to_t_item_inventory(value, key)
504
 
505
            return resultMap
506
        finally:
507
            close_session()
508
 
509
    def clearItemAvailabilityCache(self, ):
510
        """
511
        Clear item availability cache.
512
        """
513
        try:
514
            clear_item_availability_cache()
515
        finally:
516
            close_session()
5957 mandeep.dh 517
 
518
    def getPendingOrdersInventory(self, vendorId):
519
        """
520
        Returns a list of inventory stock for items for which there are pending orders for the given vendor.
521
        """
522
        try:
523
            pending_items_inventory = get_pending_orders_inventory(vendorId)
524
            return [AvailableAndReservedStock(itemId = i[0], available=i[1], reserved=i[2], minimumStock=0) for i in pending_items_inventory]
525
        finally:
526
            close_session()
527
 
5944 mandeep.dh 528
    def updateVendorString(self, warehouseId, vendorString):
529
        """
530
        Parameters:
531
         - warehouseId
532
         - vendorString
533
        """
534
        try:
535
            update_vendor_string(warehouseId, vendorString)
536
        finally:
537
            close_session()
538