Subversion Repositories SmartDukaan

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
122 ashish 1
'''
2
Created on 27-Apr-2010
3
 
4
@author: ashish
5
'''
6
from shop2020.model.v1.catalog.impl import DataService
4295 varun.gupt 7
from shop2020.utils.Utils import log_entry, to_py_date
122 ashish 8
from shop2020.model.v1.catalog.impl.DataAcessors import add_item, add_warehouse,\
9
    update_inventory, retire_warehouse, retire_item, change_item_status,\
4431 phani.kuma 10
    get_item, get_all_items, get_all_items_by_status,\
643 chandransh 11
    get_item_availability_for_warehouse, get_item_availability_for_location, get_all_warehouses_by_status,\
122 ashish 12
    get_Warehouse, get_all_warehouses_for_item, get_all_items_for_warehouse,\
766 rajveer 13
    update_item, start_item_on, close_session, \
4332 anupam.sin 14
    add_vendor, add_warehouse_vendor_mapping, get_warehouses_for_vendor, get_vendors_for_warehouse, \
635 rajveer 15
    retire_item_on, get_item_inventory_by_item_id, get_items_by_catalog_id,\
1308 chandransh 16
    get_best_deals, get_best_deals_catalog_ids, get_best_deals_count, get_best_sellers, get_latest_arrivals, get_latest_arrivals_catalog_ids, get_latest_arrivals_count,\
635 rajveer 17
    is_active, get_best_sellers_catalog_ids, get_best_sellers_count, put_category_object,\
871 chandransh 18
    get_category_object, mark_item_as_content_complete,\
1341 chandransh 19
    reserve_item_in_warehouse, reduce_reservation_count, generate_new_entity_id,\
2116 ankur.sing 20
    get_all_item_pricing, add_vendor_pricing, \
2035 rajveer 21
    get_item_pricing, get_category, get_all_categories, add_category,\
4762 phani.kuma 22
    get_item_status_description, get_all_vendors,\
2286 ankur.sing 23
    get_item_mappings, add_vendor_item_mapping, check_similar_item,\
4957 phani.kuma 24
    change_risky_flag, get_items_for_mastersheet, get_risky_items,\
3086 rajveer 25
    get_similar_items_catalog_ids, add_product_notification,\
3348 varun.gupt 26
    send_product_notifications, update_inventory_history,\
3557 rajveer 27
    get_all_brands_by_category, is_alive, get_item_pricing_by_source,\
28
    add_source_item_pricing, get_all_sources, get_item_for_source,\
4295 varun.gupt 29
    get_all_source_pricing, get_item_count_by_status, search_items, get_search_result_count,\
4320 rajveer 30
    get_pending_orders_inventory, get_product_notifications, get_product_notification_request_count,\
4934 amit.gupta 31
    add_inventory, get_all_similar_items_catalog_ids, add_similar_item_catalog_id, delete_similar_item_catalog_id, add_authorization_log_for_item,\
4988 mandeep.dh 32
    get_thrift_item_list, get_all_brands, mark_missed_inventory_updates_as_processed, \
33
    reset_availability, get_item_keys_to_be_processed
122 ashish 34
from shop2020.model.v1.catalog.impl.Convertors import to_t_item,\
4295 varun.gupt 35
    to_t_item_inventory, to_t_warehouse, to_t_vendor_item_pricing, to_t_category, to_t_vendor,\
36
    to_t_vendor_item_mapping, to_t_source_item_pricing, to_t_product_notification_request,\
37
    to_t_product_notification_request_count
122 ashish 38
from shop2020.thriftpy.model.v1.catalog.ttypes import status,\
4024 chandransh 39
    InventoryServiceException, AvailableAndReservedStock
599 chandransh 40
from shop2020.config.client.ConfigClient import ConfigClient
4370 anupam.sin 41
from shop2020.clients.CatalogClient import CatalogClient
4501 mandeep.dh 42
from shop2020.clients.PurchaseClient import PurchaseClient
43
from shop2020.thriftpy.purchase.ttypes import PurchaseOrder, LineItem
122 ashish 44
 
4370 anupam.sin 45
import xlrd
4934 amit.gupta 46
import datetime
122 ashish 47
 
4370 anupam.sin 48
 
122 ashish 49
class InventoryServiceHandler:
50
    '''
51
    classdocs
52
    '''
599 chandransh 53
 
3187 rajveer 54
    def __init__(self, dbname='catalog', db_hostname='localhost'):
122 ashish 55
        '''
56
        Constructor
57
        '''
3187 rajveer 58
        DataService.initialize(dbname, db_hostname)
599 chandransh 59
        try:
621 chandransh 60
            config_client = ConfigClient()
61
            self.latest_arrivals_limit = int(config_client.get_property("LATEST_ARRIVALS_LIMIT"));
62
            self.best_sellers_limit = int(config_client.get_property("BEST_SELLERS_LIMIT"))
599 chandransh 63
        except:
621 chandransh 64
            self.latest_arrivals_limit = 50
65
            self.best_sellers_limit = 50
122 ashish 66
 
67
    #DONE
68
    def addItem(self, item):
69
        """
70
        Availability and inventory attributes
71
 
72
        Parameters:
73
         - item
74
        """
75
        log_entry(self, "addItem called")
785 rajveer 76
        try:
77
            return add_item(item)
78
        finally:
79
            close_session()
122 ashish 80
 
81
    def addWarehouse(self, warehouse):
82
        """
83
        Parameters:
84
         - warehouse
85
        """
86
        log_entry(self, "addWarehouse called")
785 rajveer 87
        try:
88
            return add_warehouse(warehouse)
89
        finally:
90
            close_session()
122 ashish 91
 
3325 chandransh 92
    def updateInventoryHistory(self, warehouse_id, timestamp, availability):
93
        """
94
        Stores the incremental warehouse updates of items.
95
 
96
        Parameters:
97
         - warehouse_id
98
         - timestamp
99
         - availability
100
        """
101
        try:
102
            return update_inventory_history(warehouse_id, timestamp, availability)
103
        finally:
104
            close_session()
483 rajveer 105
 
106
    def updateInventory(self, warehouse_id, timestamp, availability):
122 ashish 107
        """
108
        Parameters:
109
         - warehouse_id
110
         - timestamp
483 rajveer 111
         - availability
122 ashish 112
        """
113
        log_entry(self, "update Inventory called")
785 rajveer 114
        try:
115
            return update_inventory(warehouse_id, timestamp, availability)
116
        finally:
117
            close_session()
118
 
4320 rajveer 119
    def addInventory(self, itemId, warehouseId, quantity):
120
        """
121
        Add the inventory to existing stock.
122
 
123
        Parameters:
124
         - itemId
125
         - warehouseId
126
         - quantity
127
        """
128
        log_entry(self, "add Inventory called")
129
        try:
130
            return add_inventory(itemId, warehouseId, quantity)
131
        finally:
132
            close_session()
133
 
785 rajveer 134
 
635 rajveer 135
    def isActive(self, item_id):
563 chandransh 136
        """
137
        Parameters:
635 rajveer 138
         - item_id
563 chandransh 139
        """
785 rajveer 140
        try:
141
            return is_active(item_id)
142
        finally:
143
            close_session()
122 ashish 144
 
2035 rajveer 145
    def getItemStatusDescription(self, itemId):
146
        """
147
        Parameters:
148
         - itemId
149
        """
150
        try:
151
            return get_item_status_description(itemId)
152
        finally:
153
            close_session()
154
 
122 ashish 155
    def retireWarehouse(self, warehouse_id):
156
        """
157
        Parameters:
158
         - warehouse_id
159
        """
160
        log_entry(self, "retire warehouse called")
785 rajveer 161
        try:
162
            return retire_warehouse(warehouse_id)
163
        finally:
164
            close_session()
165
 
122 ashish 166
 
167
    def retireItem(self, item_id):
168
        """
169
        Parameters:
170
        - item_id
171
        """
172
        log_entry(self, "retire item called")
785 rajveer 173
        try:
174
            return retire_item(item_id)
175
        finally:
176
            close_session()
122 ashish 177
 
178
    def startItemOn(self, item_id, timestamp):
179
        """
180
        Parameters:
181
         - item_id
182
         - timestamp
183
        """
785 rajveer 184
        try:
185
            start_item_on(item_id, timestamp)
186
        finally:
187
            close_session()
122 ashish 188
 
189
    def retireItemOn(self, item_id, timestamp):
190
        """
191
        Parameters:
192
         - item_id
193
         - timestamp
194
        """
785 rajveer 195
        try:
196
            retire_item_on(item_id, timestamp)
197
        finally:
198
            close_session()
122 ashish 199
 
200
    def changeItemStatus(self, item_id, timestamp, newstatus):
201
        """
202
        Parameters:
203
         - item_id
204
         - timestamp
205
         - newstatus
206
        """
207
        log_entry(self, "change item status called")
785 rajveer 208
        try:
209
            return change_item_status(item_id, newstatus)
210
        finally:
211
            close_session()
122 ashish 212
 
785 rajveer 213
 
122 ashish 214
    def getItem(self, item_id):
215
        """
216
        Parameters:
217
         - item_id
218
        """
219
        log_entry(self, "item requested")
785 rajveer 220
        try:
2065 ankur.sing 221
            item = to_t_item( get_item(item_id))
222
            return item
785 rajveer 223
        finally:
224
            close_session()
379 ashish 225
 
635 rajveer 226
    def getItemsByCatalogId(self, catalog_item_id):
379 ashish 227
        """
228
        Parameters:
229
        - catalog_item_id
230
        """
386 ashish 231
        log_entry(self, "item requested")
766 rajveer 232
        try:
4934 amit.gupta 233
            return get_thrift_item_list(get_items_by_catalog_id(catalog_item_id))
766 rajveer 234
        finally:
235
            close_session()
122 ashish 236
 
4934 amit.gupta 237
    def getValidItemsByCatalogId(self, catalog_item_id):
238
        """
239
        Parameters:
240
         - catalog_item_id
241
        """
242
        log_entry(self, "items requested for CatalogItem")
243
        try:
244
            return get_thrift_item_list(filter(is_valid, get_items_by_catalog_id(catalog_item_id)))
245
        finally:
246
            close_session()
247
 
122 ashish 248
    def getAllItems(self, isActive):
249
        """
250
        Parameters:
251
         - isActive
252
        """
253
        log_entry(self, "all items requested")
766 rajveer 254
        try:
255
            items = get_all_items(isActive)
256
            ret_items = []
257
            for item in items:
258
                if item:
259
                    ret_items.append(to_t_item(item))
260
            return ret_items
261
        finally:
262
            close_session()
263
 
122 ashish 264
    def getAllItemsByStatus(self, itemStatus):
265
        """
266
        Parameters:
267
         - itemStatus
268
        """
269
        log_entry(self, "all items requested")
766 rajveer 270
        try:
271
            items = get_all_items_by_status(itemStatus)
272
            ret_items = []
273
            for item in items:
274
                if item:
275
                    ret_items.append(to_t_item(item))
276
            return ret_items
277
        finally:
278
            close_session()
122 ashish 279
 
4431 phani.kuma 280
    '''
122 ashish 281
    def getItemInventory(self, item_id):
282
        """
283
        Parameters:
284
        - item_id
285
        """
286
        log_entry(self, "item inventory requested")
766 rajveer 287
        try:
288
            inventory = get_item_inventoy(item_id)
289
            return to_t_item_inventory(inventory, item_id)
290
        finally:
291
            close_session()
4431 phani.kuma 292
    '''
122 ashish 293
 
635 rajveer 294
    def getItemInventoryByItemId(self, item_id):
295
        """
296
        Parameters:
297
         - item_id
298
        """
299
        log_entry(self, "item inventory requested")
766 rajveer 300
        try:
301
            inventory = get_item_inventory_by_item_id(item_id)
302
            return to_t_item_inventory(inventory, item_id)
303
        finally:
304
            close_session()
635 rajveer 305
 
3348 varun.gupt 306
    def getAllBrandsByCategory(self, categoryId):
307
        """
308
        Parameters:
309
         - categoryId
310
        """
311
        try:
312
            return get_all_brands_by_category(categoryId)
313
        finally:
314
            close_session()
315
 
4957 phani.kuma 316
    def getAllBrands(self):
317
        try:
318
            return get_all_brands()
319
        finally:
320
            close_session()
321
 
635 rajveer 322
    '''
379 ashish 323
    def getItemInventoryByCatalogId(self, item_id):
324
        """
325
        Parameters:
326
         - item_id
327
        """
383 ashish 328
        log_entry(self, "item inventory requested")
329
        inventory = get_item_inventory_by_catalog_id(item_id)
330
        return to_t_item_inventory(inventory, item_id)
635 rajveer 331
    '''
332
 
3849 chandransh 333
    def getAllItemsInRange(self, offset, limit):
334
        """
335
        Gets at most 'limit' items starting at the given offset. Returns an empty list if there are no more items at the given offset.
336
 
337
        Parameters:
338
         - offset
339
         - limit
340
        """
341
        try:
342
            items = get_all_items(False, offset, limit)
343
            return [to_t_item(item) for item in items]
344
        finally:
345
            close_session()
379 ashish 346
 
3849 chandransh 347
    def getAllItemsByStatusInRange(self, itemStatus, offset, limit):
348
        """
349
        Gets at most 'limit' items starting at the given offset in the given status. Returns an empty list if there are no more items at the given offset.
350
 
351
        Parameters:
352
         - itemStatus
353
         - offset
354
         - limit
355
        """
356
        log_entry(self, "all items requested")
357
        try:
358
            items = get_all_items_by_status(itemStatus, offset, limit)
359
            return [to_t_item(item) for item in items]
360
        finally:
361
            close_session()
362
 
363
    def getItemCountByStatus(self, useStatus, itemStatus):
364
        """
365
        Gets a count of all items by status
366
 
367
        Parameters:
368
         - useStatus
369
         - itemStatus
370
        """
371
        try:
372
            return get_item_count_by_status(useStatus, itemStatus)
373
        finally:
374
            close_session()
375
 
643 chandransh 376
    def getItemAvailabilityAtLocation(self, warehouse_loc, item_id):
377
        """
3355 chandransh 378
        Determines the warehouse that should be used to fulfil an order for the given item.
379
        It first checks all the warehouses which are in the logistics location given by the
380
        warehouse_loc parameter. If none of the warehouses there have any inventory, then the
381
        preferred warehouse for the item is used.
643 chandransh 382
 
3355 chandransh 383
        Returns an ordered list of size 4 with following elements in the given order:
384
        1. Logistics location of the warehouse which was finally picked up to ship the order.
385
        2. Id of the warehouse which was finally picked up.
386
        3. Inventory size in the selected warehouse.
387
        4. Expected delay added by the category manager.
388
 
643 chandransh 389
        Parameters:
390
         - warehouse_loc
391
         - item_id
392
        """
766 rajveer 393
        try:
394
            return get_item_availability_for_location(warehouse_loc, item_id)
395
        finally:
396
            close_session()
397
 
122 ashish 398
    def getItemAvailibilityAtWarehouse(self, warehouse_id, item_id):
399
        """
400
        Parameters:
401
         - warehouse_id
402
         - item_id
403
        """
404
        log_entry(self, "item availability at warehouse requested")
766 rajveer 405
        try:
406
            return get_item_availability_for_warehouse(warehouse_id, item_id)
407
        finally:
408
            close_session()
409
 
2080 rajveer 410
    def markItemAsContentComplete(self, entityId, category, brand, modelName, modelNumber):
411
        """
412
        Parameters:
413
         - entityId
414
         - category
415
         - brand
416
         - modelName
417
         - modelNumber
418
        """
419
        try:
420
            return mark_item_as_content_complete(entityId, category, brand, modelName, modelNumber)
421
        finally:
422
            close_session()
2075 rajveer 423
 
424
 
122 ashish 425
    def getItemInventoryHistory(self, id, item_id, warehouse_id, from_date, to_date):
426
        """
427
        Parameters:
428
         - id
429
         - item_id
430
         - warehouse_id
431
         - from_date
432
         - to_date
433
        """
434
        pass
435
 
436
    def getAllWarehouses(self, isActive):
437
        """
438
        Parameters:
439
        - isActive
440
        """
766 rajveer 441
        try:
442
            if isActive:
443
                warehouses = get_all_warehouses_by_status(status.ACTIVE)
444
            else:
445
                warehouses = get_all_warehouses_by_status(None)
446
 
447
            ret_warehouses = []
448
 
449
            for warehouse in warehouses:
450
                ret_warehouses.append(to_t_warehouse(warehouse))
451
            return ret_warehouses
452
        finally:
453
            close_session()
454
 
122 ashish 455
    def getWarehouse(self, warehouse_id):
456
        """
457
        Parameters:
458
         - warehouse_id
459
        """
460
        log_entry(self, "get warehouse call")
766 rajveer 461
        try:
462
            warehouse = get_Warehouse(warehouse_id)
463
            if warehouse:
464
                return to_t_warehouse(warehouse)
465
            else:
466
                raise InventoryServiceException(101, "no such warehouse")
467
        finally:
468
            close_session()
469
 
122 ashish 470
    def getAllWarehousesForItem(self, item_id):
471
        """
472
        Parameters:
473
         - item_id
474
        """
475
        log_entry(self, "getting all warehouses for item")
766 rajveer 476
        try:
477
            all_warehouses = get_all_warehouses_for_item(item_id)
478
            t_warehouses = []
479
            for warehouse in all_warehouses:
480
                t_warehouses.append(to_t_warehouse(warehouse))
481
            return t_warehouses
482
        finally:
483
            close_session()
484
 
122 ashish 485
    def getAllItemsForWarehouse(self, warehouse_id):
486
        """
487
        Parameters:
488
         - warehouse_id
489
        """
490
        log_entry(self, "getting all items for warehouse")
766 rajveer 491
        try:
492
            all_items = get_all_items_for_warehouse(warehouse_id)
493
            t_items = []
494
            for item in all_items:
495
                t_items.append(to_t_item(item))
496
            return t_items
497
        finally:
498
            close_session()
871 chandransh 499
 
500
    def reserveItemInWarehouse(self, itemId, warehouseId, quantity):
501
        """
502
        Increases the reservation count for an item in a warehouse. Should always succeed normally.
503
 
504
        Parameters:
505
         - itemId
506
         - warehouseId
507
        """
508
        log_entry(self, "reserveItemInWarehouse called")
509
        try:
510
            return reserve_item_in_warehouse(itemId, warehouseId, quantity)
511
        finally:
512
            close_session()
513
 
514
    def reduceReservationCount(self, itemId, warehouseId, quantity):
515
        """
516
        Decreases the reservation count for an item in a warehouse. Should always succeed normally.
517
 
518
        Parameters:
519
         - itemId
520
         - warehouseId
521
        """
522
        log_entry(self, "reduceReservationCount called")
523
        try:
524
            return reduce_reservation_count(itemId, warehouseId, quantity)
525
        finally:
526
            close_session()
766 rajveer 527
 
122 ashish 528
    def updateItem(self, item):
529
        """
530
        Parameters:
531
         - item
532
        """
533
        log_entry(self, "addItem called")
766 rajveer 534
        try:
535
            return update_item(item)
536
        finally:
537
            close_session()
538
 
626 chandransh 539
    def getBestSellers(self, start_index=0, total_items=None, category=-1):
766 rajveer 540
        try:
541
            if total_items is None:
542
                total_items = self.best_sellers_limit
543
            stop_index = start_index + total_items
544
            return get_best_sellers(start_index, stop_index, category)
545
        finally:
546
            close_session()
547
 
1926 rajveer 548
    def getBestSellersCatalogIds(self, start_index, total_items, brand, category=-1):
548 rajveer 549
        """
550
        Parameters:
551
         - beginIndex
552
         - totalItems
553
        """
766 rajveer 554
        try:
555
            if total_items is None:
556
                total_items = self.best_sellers_limit
557
            stop_index = start_index + total_items
1926 rajveer 558
            return get_best_sellers_catalog_ids(start_index, stop_index, brand, category)
766 rajveer 559
        finally:
560
            close_session()
561
 
591 chandransh 562
    def getBestSellersCount(self, ):
766 rajveer 563
        try:
2093 chandransh 564
            return get_best_sellers_count()
766 rajveer 565
        finally:
566
            close_session()
567
 
591 chandransh 568
    def getBestDeals(self,):
766 rajveer 569
        try:
570
            return get_best_deals()
571
        finally:
572
            close_session()
573
 
1926 rajveer 574
    def getBestDealsCatalogIds(self, start_index, total_items, brand,category=-1):
548 rajveer 575
        """
576
        Parameters:
577
         - beginIndex
578
         - totalItems
579
        """
766 rajveer 580
        try:
581
            stop_index = start_index + total_items
1926 rajveer 582
            return get_best_deals_catalog_ids(start_index, stop_index, brand, category)
766 rajveer 583
        finally:
584
            close_session()
585
 
591 chandransh 586
    def getBestDealsCount(self, ):
766 rajveer 587
        try:
588
            return get_best_deals_count()
589
        finally:
590
            close_session()
591
 
591 chandransh 592
    def getLatestArrivals(self,):
766 rajveer 593
        try:
594
            return get_latest_arrivals(self.latest_arrivals_limit)
595
        finally:
596
            close_session()
2975 chandransh 597
 
598
    def getLatestArrivalsCatalogIds(self, beginIndex, totalItems, brand, categories):
548 rajveer 599
        """
2975 chandransh 600
        Returns the list of catalog ids of latest arrivals in the given categories of the given brand.
601
        To ignore the categories, pass the list as empty. To ignore brand, pass it as null.
602
 
548 rajveer 603
        Parameters:
604
         - beginIndex
605
         - totalItems
2975 chandransh 606
         - brand
607
         - categories
548 rajveer 608
        """
766 rajveer 609
        try:
2975 chandransh 610
            if beginIndex > self.latest_arrivals_limit:
766 rajveer 611
                return []
2975 chandransh 612
            stopIndex = beginIndex + totalItems
613
            if stopIndex > self.latest_arrivals_limit:
614
                stopIndex = self.latest_arrivals_limit
615
            return get_latest_arrivals_catalog_ids(beginIndex, stopIndex, brand, categories)
766 rajveer 616
        finally:
617
            close_session()
618
 
591 chandransh 619
    def getLatestArrivalsCount(self, ):
766 rajveer 620
        try:
621
            return get_latest_arrivals_count(self.latest_arrivals_limit)
622
        finally:
623
            close_session()
591 chandransh 624
 
4283 anupam.sin 625
    def getItemPricing(self, itemId, vendorId):
1334 chandransh 626
        """
627
        Returns the pricing information of an item associated with the vendor of the given warehouse.
628
        Raises an exception if either the item, vendor or the associated pricing information can't be found.
629
 
630
        Parameters:
631
         - itemId
632
         - warehouseId
633
        """
1341 chandransh 634
        try:
4283 anupam.sin 635
            return to_t_vendor_item_pricing(get_item_pricing(itemId, vendorId))
1341 chandransh 636
        finally:
637
            close_session()
1991 ankur.sing 638
 
639
 
640
    def getAllItemPricing(self, itemId):
641
        """
642
        Returns list of the pricing information of an item associated an item.
643
        Raises an exception if the item can't be found.
644
 
645
        Parameters:
646
         - itemId
647
        """
648
        try:
649
            return [to_t_vendor_item_pricing(vid) for vid in get_all_item_pricing(itemId)]
650
        finally:
651
            close_session()
1334 chandransh 652
 
1155 rajveer 653
    def generateNewEntityID(self, ):
654
        try:
655
            return generate_new_entity_id()
656
        finally:
657
            close_session()
658
 
635 rajveer 659
    def putCategoryObject(self, object):
660
        """
661
        Parameters:
662
         - object
663
        """
766 rajveer 664
        try:
665
            return put_category_object(object)
666
        finally:
667
            close_session()
668
 
635 rajveer 669
    def getCategoryObject(self, ):
766 rajveer 670
        try:
671
            return get_category_object()
672
        finally:
673
            close_session()
1970 rajveer 674
 
675
    def addCategory(self, category):
676
        """
677
        Parameters:
678
         - category
679
        """
680
        try:
681
            return add_category(category)
682
        finally:
683
            close_session()
684
 
685
    def getCategory(self, id):
686
        """
687
        Parameters:
688
         - id
689
        """
690
        try:
691
            return to_t_category(get_category(id))
692
        finally:
693
            close_session()
694
 
695
    def getAllCategories(self, ):
696
        try:
697
            categories = get_all_categories()
698
            return [to_t_category(category) for category in categories]
699
        finally:
700
            close_session()
701
 
702
 
2116 ankur.sing 703
    def addVendorItemPricing(self, vendorItemPricing):
1991 ankur.sing 704
        """
2116 ankur.sing 705
        Adds vendor prices corresponding to the item. If pricing already exists then updates the prices. 
1991 ankur.sing 706
        Raises an exception if either the item or vendor can't be found corresponding to their ids.
707
 
708
        Parameters:
709
         - vendorItemPricing
710
        """
711
        log_entry(self, "updateVendorItemPricing called")
712
        try:
2116 ankur.sing 713
            return add_vendor_pricing(vendorItemPricing)
1991 ankur.sing 714
        finally:
715
            close_session()
716
 
2065 ankur.sing 717
    def getAllVendors(self, ):
718
        """
719
        Return list of all vendors
720
        """
4432 rajveer 721
        try:
722
            return [to_t_vendor(v) for v in get_all_vendors()]
723
        finally:
724
            close_session()
725
 
4423 phani.kuma 726
    def getAllSimilarItems(self, itemId):
727
        """
728
        Returns list of similar items.
729
 
730
        Parameters:
731
         - itemId
732
        """
4432 rajveer 733
        try:
734
            return get_all_similar_items_catalog_ids(itemId)
735
        finally:
736
            close_session()
737
 
4423 phani.kuma 738
    def addSimilarItem(self, itemId, catalogItemId):
739
        """
740
        add similar item.
741
 
742
        Parameters:
743
         - itemId, catalogItemId
744
        """
745
        try:
746
            return add_similar_item_catalog_id(itemId, catalogItemId)
747
        finally:
748
            close_session()
749
 
750
    def deleteSimilarItem(self, itemId, catalogItemId):
751
        """
752
        delete similar items.
753
 
754
        Parameters:
755
         - itemId, catalogItemIds
756
        """
757
        try:
758
            return delete_similar_item_catalog_id(itemId, catalogItemId)
759
        finally:
760
            close_session()
4762 phani.kuma 761
 
2358 ankur.sing 762
    def addVendorItemMapping(self, key, vendorItemMapping):
2116 ankur.sing 763
        """
2358 ankur.sing 764
        Adds VendorItemMapping. Updates VendorItemMapping if exists corresponding to the item key.
2116 ankur.sing 765
 
766
        Parameters:
2358 ankur.sing 767
         - key
2116 ankur.sing 768
         - vendorItemMapping
769
        """
770
        log_entry(self, "addVendorItemMapping called")
771
        try:
2358 ankur.sing 772
            return add_vendor_item_mapping(key, vendorItemMapping)
2116 ankur.sing 773
        finally:
774
            close_session()
775
 
776
    def getVendorItemMappings(self, itemId):
777
        """
778
        Returns the list of vendor item mapping corresponding to itemId passed as parameter.
779
        Raises an exception if item not found corresponding to itemId
780
 
781
        Parameters:
782
         - itemId
783
        """
784
        try:
2120 ankur.sing 785
            item_mappings = get_item_mappings(itemId)
786
            return [to_t_vendor_item_mapping(vim) for vim in item_mappings]
2116 ankur.sing 787
        finally:
788
            close_session()
789
 
4725 phani.kuma 790
    def checkSimilarItem(self, brand, modelNumber, modelName, color):
2116 ankur.sing 791
        """
4725 phani.kuma 792
        Checks if similar item exists (with same Brand, ModelNumber, ModelName, Color)
2116 ankur.sing 793
        If yes, returns the itemId else returns 0
794
 
795
        Parameters:
796
         - brand
797
         - modelNumber
4725 phani.kuma 798
         - modelName
2116 ankur.sing 799
         - color
800
        """
801
        try:
4725 phani.kuma 802
            return check_similar_item(brand, modelNumber, modelName, color)
2116 ankur.sing 803
        finally:
804
            close_session()
805
 
2286 ankur.sing 806
    def changeItemRiskyFlag(self, itemId, risky):
807
        """
808
        Marks/Unmarks an item as risky. This flag is used for automatic marking of an item as INACTIVE in case of zero inventory.
809
 
810
        Parameters:
811
         - itemId
812
         - risky
813
        """
814
        try:
815
            change_risky_flag(itemId, risky)
816
        finally:
817
            close_session()
2116 ankur.sing 818
 
4957 phani.kuma 819
    def getItemsForMasterSheet(self, category, brand):
2358 ankur.sing 820
        """
4957 phani.kuma 821
        Returns list of items with any status except PHASED_OUT and filtered by category, brand.
2358 ankur.sing 822
 
823
        Parameters:
4762 phani.kuma 824
         - category
4957 phani.kuma 825
         - vendor
826
         - brand
2358 ankur.sing 827
        """
828
        try:
4957 phani.kuma 829
            return [to_t_item(item) for item in get_items_for_mastersheet(category, brand)]
2358 ankur.sing 830
        finally:
831
            close_session()
832
 
833
    def getItemsByRiskyFlag(self, ):
834
        """
835
        Returns list of items marked as risky.
836
        """
837
        try:
838
            return [to_t_item(item) for item in get_risky_items()]
839
        finally:
840
            close_session()
2809 rajveer 841
 
842
    def getSimilarItemsCatalogIds(self, beginIndex, totalItems, itemId):
843
        """
844
        Returns list of catalog ids of items with same similarity index as of the given itemId
845
 
846
        Parameters:
847
         - beginIndex
848
         - totalItems
849
         - itemId
850
        """
851
        try:
852
            return get_similar_items_catalog_ids(beginIndex, beginIndex+totalItems, itemId)
853
        finally:
854
            close_session()
3079 rajveer 855
 
856
    def addProductNotification(self, itemId, email):
857
        """
858
        Add user requests for out of stock items. Once user will ask for notify me an entry will
859
 
860
        Parameters:
861
        - itemId
862
        - email
863
        """
864
        try:
865
            return add_product_notification(itemId, email)
866
        finally:
867
            close_session()
2358 ankur.sing 868
 
3086 rajveer 869
    def sendProductNotifications(self, ):
870
        """
871
        Send the product notifications to the users for items which has stock.
872
        """
873
        try:
874
            return send_product_notifications()
875
        finally:
876
            close_session()
3557 rajveer 877
 
878
 
879
    def getAllSources(self, ):
880
        """
881
        Return list of all sources
882
        """
883
        try:
884
            return get_all_sources()
885
        finally:
886
            close_session()
887
 
888
    def getItemPricingBySource(self, itemId, sourceId):
889
        """
890
        Returns the pricing information of an item. If no information is found, exception will be thrown.
3376 rajveer 891
 
3557 rajveer 892
        Parameters:
893
         - itemId
894
         - sourceId
895
        """
896
        try:
897
            return to_t_source_item_pricing(get_item_pricing_by_source(itemId, sourceId))
898
        finally:
899
            close_session()
900
 
901
    def addSourceItemPricing(self, sourceItemPricing):
902
        """
903
        Adds prices to be displayed corresponding to the item if user comes from a source.
904
 
905
        Parameters:
906
         - sourceItemPricing
907
        """
908
        try:
909
            add_source_item_pricing(sourceItemPricing)
910
        finally:
911
            close_session()
912
 
913
    def getAllSourcePricing(self, itemId):
914
        """
915
        Returns the list of source pricing information of an item.
916
        Raises an exception if item not found corresponding to itemId
917
 
918
        Parameters:
919
         - itemId
920
        """
921
        try:
922
            return [to_t_source_item_pricing(source_item_pricing) for source_item_pricing in get_all_source_pricing(itemId)]
923
#        return [to_t_item(item) for item in get_risky_items()]
924
        finally:
925
            close_session()
926
 
927
    def getItemForSource(self, item_id, sourceId):
928
        """
929
        Parameters:
930
         - item_id
931
         - sourceId
932
        """
933
        try:
934
            return to_t_item(get_item_for_source(item_id, sourceId))
935
        finally:
936
            close_session()
3872 chandransh 937
 
938
    def searchItemsInRange(self, searchTerms, offset, limit):
939
        """
940
        Searches items matching the the given terms in the catalog
3557 rajveer 941
 
3872 chandransh 942
        Parameters:
943
         - searchTerms
944
        """
945
        try:
946
            return [to_t_item(item) for item in search_items(searchTerms, offset, limit)]
947
        finally:
948
            close_session()
949
 
950
    def getSearchResultCount(self, searchTerms):
951
        """
952
        Gets the count of search results for the given search terms so that the user can go through all the pages.
953
 
954
        Parameters:
955
         - searchTerms
956
        """
957
        try:
958
            return get_search_result_count(searchTerms)
959
        finally:
960
            close_session()
961
 
4063 chandransh 962
    def getPendingOrdersInventory(self, vendorId):
4024 chandransh 963
        """
4063 chandransh 964
        Returns a list of inventory stock for items for which there are pending orders for the given vendor.
4024 chandransh 965
        """
966
        try:
4063 chandransh 967
            pending_items_inventory = get_pending_orders_inventory(vendorId)
4024 chandransh 968
            return [AvailableAndReservedStock(itemId = i[0], available=i[1], reserved=i[2], minimumStock=0) for i in pending_items_inventory]
969
        finally:
970
            close_session()
971
 
4295 varun.gupt 972
    def getProductNotifications(self, startDateTime):
973
        '''
974
        Returns a list of Product Notification objects each representing user requests for notification
975
        '''
976
        try:
977
            return [to_t_product_notification_request(notification) for notification in get_product_notifications(to_py_date(startDateTime))]
978
        finally:
979
            close_session()
980
 
981
    def getProductNotificationRequestCount(self, startDateTime):
982
        '''
983
        Returns list of items and the counts of product notification requests
984
        '''
985
        try:
986
            notification_request_counts = [(notification.item, count) for notification, count in get_product_notification_request_count(to_py_date(startDateTime))]
987
 
988
            return [to_t_product_notification_request_count(count) for count in notification_request_counts]
989
 
990
        finally:
991
            close_session()
992
 
3376 rajveer 993
    def isAlive(self, ):
994
        """
995
        For checking weather service is active alive or not. It also checks connectivity with database
996
        """
997
        try:
998
            return is_alive()
999
        finally:
1000
            close_session()
1001
 
766 rajveer 1002
    def closeSession(self, ):
3376 rajveer 1003
        """
1004
        For closing the open session in sqlalchemy
1005
        """
4332 anupam.sin 1006
        close_session()
1007
 
1008
    def addVendor(self, vendor):
1009
        """
1010
        add a new vendor
1011
        """
1012
        try:
1013
            return add_vendor(vendor)
1014
        finally:
1015
            close_session()
1016
 
1017
    def addWarehouseVendorMapping(self, warehouse_id, vendorId):
1018
        """
1019
        map given warehouse id to given vendor id
1020
        """
1021
        try:
1022
            return add_warehouse_vendor_mapping(warehouse_id, vendorId)
1023
        finally:
1024
            close_session()
1025
 
1026
    def getVendorsForWarehouse(self, warehouse_id):
1027
        """
1028
        get all vendors for the given warehouse_id
1029
        """
1030
        try:
1031
            vendors = get_vendors_for_warehouse(warehouse_id)
1032
            ret_vendors = []
1033
            for vendor in vendors:
1034
                if vendor:
1035
                    ret_vendors.append(to_t_vendor(vendor))
1036
            return ret_vendors
1037
        finally:
1038
            close_session()
1039
 
1040
    def getWarehousesForVendor(self, vendorId):
1041
        '''
1042
        get all warehouses for the given vendorId
1043
        '''
1044
        try:
1045
            warehouses = get_warehouses_for_vendor(vendorId)
1046
            ret_warehouses = []
1047
            for warehouse in warehouses:
1048
                if warehouse:
1049
                    ret_warehouses.append(to_t_warehouse(warehouse))
1050
            return ret_warehouses
1051
        finally:
4370 anupam.sin 1052
            close_session()
1053
 
1054
    def processPurchaseOrder(self, filename, vendorId):
1055
        '''
1056
        create purchase order for given filename
1057
        '''
1058
        workbook = xlrd.open_workbook(filename)
1059
        sheet = workbook.sheet_by_index(0)
1060
        num_rows = sheet.nrows
1061
        if(sheet.ncols != 2):
1062
            raise InventoryServiceException(101, "Sheet format Invalid")
1063
        catalogClient = CatalogClient().get_client()
1064
        lineitems = []
1065
        purchaseOrder = PurchaseOrder()
1066
        purchaseOrder.supplierId = vendorId
1067
        purchaseOrder.warehouseId = 7
1068
        totalCost = 0
1069
 
1070
        for rownum in range(1, num_rows):
1071
            itemId = sheet.row_values(rownum)[0]
1072
            quantity = sheet.row_values(rownum)[1]
1073
 
1074
            lineitem = LineItem()
1075
            item = catalogClient.getItem(itemId)
1076
            lineitem.itemId = item.id
1077
            lineitem.productGroup = item.productGroup
1078
            lineitem.brand = item.brand
1079
            lineitem.modelNumber = item.modelNumber
1080
            lineitem.modelName = item.modelName
1081
            lineitem.color = item.color
1082
            lineitem.quantity = quantity
1083
            lineitem.unfulfilledQuantity = quantity
1084
            try:
1085
                item_pricing = catalogClient.getItemPricing(itemId, vendorId)
1086
                lineitem.unitPrice = item_pricing.transferPrice
1087
            except:
1088
                raise InventoryServiceException(101, "Unable to get pricing for " + item.brand + " " + item.modelName \
1089
                                + " " + item.modelNumber + "(Item id : " + str(int(itemId)) + \
1090
                                ")" + " for VendorId : " + str(vendorId))
1091
            lineitem.fulfilled = 0
1092
 
1093
            totalCost += quantity*lineitem.unitPrice
1094
 
1095
            lineitems.append(lineitem)
1096
 
1097
        purchaseOrder.totalCost = totalCost
1098
        purchaseOrder.lineitems = lineitems
1099
 
4501 mandeep.dh 1100
        purchaseClient = PurchaseClient().get_client()
1101
        po_id = purchaseClient.createPurchaseOrder(purchaseOrder)
4649 phani.kuma 1102
        return "POId:" + str(po_id)
1103
 
1104
    def addAuthorizationLog(self, itemId, username, reason):
1105
        """
1106
        add a log to authorize table.
1107
 
1108
        Parameters:
1109
         - itemId, username, reason
1110
        """
1111
        try:
1112
            return add_authorization_log_for_item(itemId, username, reason)
1113
        finally:
4934 amit.gupta 1114
            close_session()
1115
 
4985 mandeep.dh 1116
    def getItemKeysToBeProcessed(self, warehouseId):
1117
        """
1118
        Returns the list of item keys which need to be processed for a given warehouse.
1119
        This is currently used by Support application to send item keys whose inventory needs
1120
        to be updated from PLB
1121
 
1122
        Parameters:
1123
         - warehouseId
1124
        """
1125
        try:
1126
            return get_item_keys_to_be_processed(warehouseId)
1127
        finally:
1128
            close_session()
1129
 
1130
    def markMissedInventoryUpdatesAsProcessed(self, itemKey, warehouseId):
1131
        """
1132
        Marks/Deletes missed inventory updates for a given key and warehouse.
1133
        This generally happens when updates from PLB are applied on the currentinventorysnapshot for an item
1134
 
1135
        Parameters:
1136
         - itemKey
1137
         - warehouseId
1138
        """
1139
        try:
1140
            mark_missed_inventory_updates_as_processed(itemKey, warehouseId)
1141
        finally:
1142
            close_session()
1143
 
1144
    def resetAvailability(self, itemKey, vendorId, quantity, warehouseId):
1145
        """
1146
        Resets availability of an item to the quantity mentioned in a warehouse.
1147
 
1148
        Parameters:
1149
         - itemKey
1150
         - vendorId
1151
         - quantity
1152
         - warehouseId
1153
        """
1154
        try:
1155
            reset_availability(itemKey, vendorId, quantity, warehouseId)
1156
        finally:
1157
            close_session()
1158
 
4934 amit.gupta 1159
def is_valid(item):
1160
    if item.status in [status.ACTIVE, status.PAUSED, status.PAUSED_BY_RISK]:
4936 amit.gupta 1161
        if item.startDate:
1162
            return not(datetime.datetime.now() < item.startDate or item.sellingPrice == 0)
1163
        else:
1164
            return True