Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
94 ashish 1
'''
2
Created on 23-Mar-2010
3
 
4
@author: ashish
5
'''
6
from elixir import *
7
from shop2020.model.v1.catalog.impl import DataService
122 ashish 8
from shop2020.model.v1.catalog.impl.DataService import Item, \
103 ashish 9
    Warehouse, ItemInventoryHistory, CurrentInventorySnapshot, ItemInfo,\
501 rajveer 10
    ItemChangeLog, Price, LatestArrivals, BestDeals, BestSellers
122 ashish 11
from shop2020.thriftpy.model.v1.catalog.ttypes import \
12
    InventoryServiceException, status
94 ashish 13
from shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItem
122 ashish 14
 
94 ashish 15
from shop2020.thriftpy.model.v1.catalog.ttypes import Warehouse as TWarehouse
16
import datetime
122 ashish 17
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
501 rajveer 18
from sqlalchemy import desc, asc
94 ashish 19
 
20
 
21
def initialize():
22
    DataService.initialize()
23
 
24
 
103 ashish 25
def get_all_items(is_active):
26
    if is_active:
122 ashish 27
        return Item.query.filter_by(status= status.ACTIVE).all()
103 ashish 28
    else:
29
        return Item.query.all()
30
 
31
def get_all_items_by_status(status):
32
    if not status:
33
        #return all items
34
        return get_all_items(False)
35
    else:
122 ashish 36
        return Item.query.filter_by(status=status).all()
103 ashish 37
 
94 ashish 38
def get_Item(item_id):
39
    return Item.get_by(id=item_id)
40
 
379 ashish 41
def get_item_by_catalog_id(catalog_id):
447 rajveer 42
    query = Item.query.filter_by(catalog_item_id=catalog_id)
437 rajveer 43
    try:
44
        return query.one()
45
    except:
46
        raise InventoryServiceException(109, "Item not found")
47
 
483 rajveer 48
def get_item_by_vendor_id(vendor_id):
49
    query = Item.query.filter_by(vendor_item_id=vendor_id)
494 rajveer 50
    #query = Item.query.filter_by(vendor_item_id='6417182037054')
483 rajveer 51
    try:
52
        return query.one()
53
    except:
54
        raise InventoryServiceException(109, "Item not found")
55
 
576 chandransh 56
def is_active(item_id):
57
    try:
58
        item = get_item_by_catalog_id(item_id)
59
        return item.status == status.ACTIVE
60
    except InventoryServiceException:
61
        return False
563 chandransh 62
 
94 ashish 63
def get_Warehouse(warehouse_id):
64
    return Warehouse.get_by(id=warehouse_id)
65
 
122 ashish 66
def get_all_warehouses_by_status(status):
67
    if not status:
68
        return Warehouse.query.all()
69
    else:
70
        return Warehouse.query.filter_by(status=status)
71
 
94 ashish 72
def get_all_warehouses_for_item(item_id):
73
    item = get_Item(item_id)
74
    if not item:
122 ashish 75
        raise InventoryServiceException(108, "Some unforeseen error while obtaining item")
76
    return item.get_all_warehouses
94 ashish 77
 
122 ashish 78
def get_all_items_for_warehouse(warehouse_id):
79
    warehouse = get_Warehouse(warehouse_id)
80
    if not warehouse:
81
        raise InventoryServiceException(108, "bad warehouse")
82
    return warehouse.all_items
83
 
94 ashish 84
def add_warehouse(warehouse):
103 ashish 85
    if not warehouse:
122 ashish 86
        raise InventoryServiceException(108, "Bad warehouse")
103 ashish 87
    if get_Warehouse(warehouse.id):
88
        #warehouse is already present.
122 ashish 89
        raise InventoryServiceException(101, "Warehouse already present")
103 ashish 90
 
94 ashish 91
    ds_warehouse = Warehouse()
92
    ds_warehouse.id = warehouse.id
93
    ds_warehouse.location = warehouse.location
122 ashish 94
    ds_warehouse.status = status.ACTIVE
103 ashish 95
    ds_warehouse.addedOn = datetime.datetime.now()
483 rajveer 96
    ds_warehouse.lastCheckedOn = datetime.datetime.now()
97
    ds_warehouse.tinNumber = warehouse.tinNumber
98
    ds_warehouse.pincode = warehouse.pincode
99
    if warehouse.vendorString:
100
        ds_warehouse.vendorString = warehouse.vendorString
94 ashish 101
    session.commit()
103 ashish 102
    return ds_warehouse.id
94 ashish 103
 
122 ashish 104
def update_item(item):
105
    if not item:
106
        raise InventoryServiceException(108, "Bad item in request")
107
 
108
    if not item.id:
109
        raise InventoryServiceException(101, "non existent item")
110
 
111
    ds_item = get_Item(item.id)
112
 
113
    if not ds_item:
114
        raise InventoryServiceException(101, "Item already exists")
115
 
511 rajveer 116
    if item.manufacturerName:
117
        ds_item.manufacturer_name = item.manufacturerName
118
    if item.modelName:
119
        ds_item.model_name = item.modelName
120
    if item.modelNumber:
121
        ds_item.model_number = item.modelNumber
483 rajveer 122
    if item.category:
123
        ds_item.category = item.category
124
    if item.comments:
125
        ds_item.comments = item.comments
511 rajveer 126
 
122 ashish 127
    if item.catalogItemId:
128
        ds_item.catalog_item_id = item.catalogItemId
129
    if item.vendorItemId:
130
        ds_item.vendor_item_id = item.vendorItemId
131
    else:
132
        raise InventoryServiceException(101, "vendor item id cannot be missing")
483 rajveer 133
 
134
    if item.mrp:
135
        ds_item.mrp = item.mrp
136
    if item.mop:
137
        ds_item.mop = item.mop
138
    if item.sellingPrice:
139
        ds_item.sellingPrice = item.sellingPrice
122 ashish 140
    if item.weight:
141
        ds_item.weight = item.weight
511 rajveer 142
    if item.itemStatus:
143
        ds_item.status = item.itemStatus
122 ashish 144
 
511 rajveer 145
    if item.startDate:
146
        ds_item.startDate = item.startDate
147
    if item.retireDate:
148
        ds_item.retireDate = item.retireDate
149
 
122 ashish 150
    if item.featureId:
151
        ds_item.feature_id = item.featureId
152
    if item.featureDescription:
153
        ds_item.feature_description = item.featureDescription
154
 
155
    session.commit();
156
    return ds_item.id
94 ashish 157
 
103 ashish 158
def add_item(item):
159
    if not item:
122 ashish 160
        raise InventoryServiceException(108, "Bad item in request")
103 ashish 161
    if get_Item(item.id):
122 ashish 162
        raise InventoryServiceException(101, "Item already exists")
483 rajveer 163
 
103 ashish 164
    ds_item = Item()
122 ashish 165
    if item.id:
166
        ds_item.id = item.id
515 rajveer 167
    if item.manufacturerName:
168
        ds_item.manufacturer_name = item.manufacturerName
169
    if item.modelName:
170
        ds_item.model_name = item.modelName
171
    if item.modelNumber:
172
        ds_item.model_number = item.modelNumber
483 rajveer 173
    if item.category:
174
        ds_item.category = item.category
175
    if item.comments:
176
        ds_item.comments = item.comments
177
 
122 ashish 178
    if item.catalogItemId:
179
        ds_item.catalog_item_id = item.catalogItemId
180
    if item.vendorItemId:
181
        ds_item.vendor_item_id = item.vendorItemId
182
    else:
183
        raise InventoryServiceException(101, "vendor item id cannot be missing")
184
    if item.itemStatus:
185
        ds_item.status = item.itemStatus
186
    else: #this is for update calls
187
        ds_item.status = status.IN_PROCESS
103 ashish 188
    ds_item.addedOn = datetime.datetime.now()
483 rajveer 189
    if item.mrp:
190
        ds_item.mrp = item.mrp
191
    if item.mop:
192
        ds_item.mop = item.mop
193
    if item.sellingPrice:
194
        ds_item.sellingPrice = item.sellingPrice
122 ashish 195
    if item.weight:
196
        ds_item.weight = item.weight
197
 
198
    if item.featureId:
199
        ds_item.feature_id = item.featureId
200
    if item.featureDescription:
201
        ds_item.feature_description = item.featureDescription
202
 
103 ashish 203
    if item.otherInfo:
204
        for k,v in item.otherInfo.iteritems():
205
            info = ItemInfo()
206
            info.key = k
207
            info.value = v
208
            ds_item.iteminfo.append(info)
209
    #check if categories present. If yes, add them to system
122 ashish 210
 
103 ashish 211
    session.commit();
212
    return ds_item.id
213
 
483 rajveer 214
#this is no more used
122 ashish 215
def update_price(item, ds_item):
216
    log_entry("update_price", "updating price for item")
217
    for k,v in item.price.iteritems():
218
        price = Price()
219
        price.warehouse_id = k
220
        price.price = v
386 ashish 221
        price.item = ds_item
222
        session.commit() 
122 ashish 223
 
483 rajveer 224
#this is no more used
122 ashish 225
def update_price_for_warehouse(item_id, warehouse_id, price):
226
    log_entry("update_price", "updating price for item and warehouse")
227
    price = Price.query.filter_by(warehouse_id=warehouse_id, item_id=item_id).one()
228
    if not price:
229
        price = Price()
230
        item = get_Item(item_id)
231
        price.warehouse_id = warehouse_id
232
        price.item = item
233
    price.price = price    
234
    session.commit()
94 ashish 235
 
236
 
483 rajveer 237
def update_inventory(warehouse_id, timestamp, availability):
238
    warehouse = get_Warehouse(warehouse_id)
239
    if not warehouse:
240
        raise InventoryServiceException(107, "Warehouse? Where?")
241
 
242
    time = datetime.datetime.now()
243
    warehouse.lastCheckedOn = time
244
    warehouse.vendorString = timestamp
245
 
246
    for k,v in availability.iteritems():
247
        vendor_id = k
248
        quantity = v
249
        try:
494 rajveer 250
            item = Item.query.filter_by(vendor_item_id=vendor_id).one()
251
        except:
252
            continue  
253
        try:
483 rajveer 254
            item_inventory_history = ItemInventoryHistory()
255
            item_inventory_history.warehouse = warehouse
256
            item_inventory_history.item = item
257
            item_inventory_history.timestamp = time
258
            item_inventory_history.availibility = quantity
259
 
260
            current_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)
261
            if not current_inventory_snapshot:
262
                current_inventory_snapshot = CurrentInventorySnapshot()
263
                current_inventory_snapshot.item = item
264
                current_inventory_snapshot.warehouse = warehouse
265
                current_inventory_snapshot.availibility = 0
266
            # added the difference in the current inventory    
267
            current_inventory_snapshot.availibility = current_inventory_snapshot.availibility + quantity
268
        except:
269
            raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
270
    session.commit() 
271
 
272
 
273
 
274
#this is no more used
275
def update_inventory_old(item_id, warehouse_id, quantity, timestamp):
94 ashish 276
    item = get_Item(item_id)
277
    warehouse = get_Warehouse(warehouse_id) 
122 ashish 278
    time = to_py_date(timestamp)
94 ashish 279
 
280
    if not item:
122 ashish 281
        raise InventoryServiceException(106, "Item not found, how did you get this?")
94 ashish 282
    if not warehouse:
122 ashish 283
        raise InventoryServiceException(107, "Warehouse? Where?")
94 ashish 284
    try:
285
        item_inventory_history = ItemInventoryHistory()
286
        item_inventory_history.warehouse = warehouse
287
        item_inventory_history.item = item
288
        item_inventory_history.timestamp = time
122 ashish 289
        item_inventory_history.availibility = quantity
94 ashish 290
 
291
        current_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)
122 ashish 292
        if not current_inventory_snapshot:
293
            current_inventory_snapshot = CurrentInventorySnapshot()
294
            current_inventory_snapshot.item = item
295
            current_inventory_snapshot.warehouse = warehouse
296
 
94 ashish 297
        current_inventory_snapshot.availibility = quantity
298
        current_inventory_snapshot.checkedOn = time
299
        session.commit()
300
    except:
122 ashish 301
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
94 ashish 302
 
303
def get_item_inventoy(item_id):
304
 
305
    inventory = Item.get_by(id=item_id).currentInventory
306
    if not inventory:
122 ashish 307
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
94 ashish 308
    return inventory
309
 
383 ashish 310
def get_item_inventory_by_catalog_id(item_id):
379 ashish 311
    inventory = Item.get_by(catalog_item_id=item_id).currentInventory
312
    if not inventory:
313
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
314
    return inventory
315
 
103 ashish 316
 
317
def retire_warehouse(warehouse_id):
318
    if not warehouse_id:
122 ashish 319
        raise InventoryServiceException(101, "Bad warehouse id")
103 ashish 320
    warehouse = get_Warehouse(warehouse_id)
321
    if not warehouse:
122 ashish 322
        raise InventoryServiceException(108, "warehouse id not present")
323
    warehouse.status = status.DELETED;
103 ashish 324
    session.commit()
325
 
326
def retire_item(item_id):
327
    if not item_id:
122 ashish 328
        raise InventoryServiceException(101, "bad item id")
103 ashish 329
    item = get_Item(item_id)
330
    if not item:
122 ashish 331
        raise InventoryServiceException(108, "item id not present")
332
    item.status = status.PHASED_OUT
333
    item.retireDate = datetime.datetime.now()
103 ashish 334
    session.commit()
122 ashish 335
 
336
#need to implement threads based solution here
103 ashish 337
def start_item_on(item_id, timestamp):
338
    if not item_id:
122 ashish 339
        raise InventoryServiceException(101, "bad item id")
103 ashish 340
    item = get_Item(item_id)
341
    if not item:
122 ashish 342
        raise InventoryServiceException(108, "item id not present")
103 ashish 343
 
122 ashish 344
    item.status = status.ACTIVE
345
    item.startDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
346
    add_status_change_log(item, status.ACTIVE)
103 ashish 347
    session.commit()
348
 
122 ashish 349
#need to implement threads here
103 ashish 350
def retire_item_on(item_id, timestamp):
351
    if not item_id:
122 ashish 352
        raise InventoryServiceException(101, "bad item id")
103 ashish 353
    item = get_Item(item_id)
354
    if not item:
122 ashish 355
        raise InventoryServiceException(108, "item id not present")
103 ashish 356
 
122 ashish 357
    item.status = status.PHASED_OUT
358
    item.retireDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
359
    add_status_change_log(item, status.PHASED_OUT)
103 ashish 360
    session.commit()
361
 
362
def add_status_change_log(item, new_status):
363
    item_change_log = ItemChangeLog()
364
    item_change_log.new_status = new_status
365
    item_change_log.old_status = item.status
366
    item_change_log.timestamp = datetime.datetime.now()
367
    item_change_log.item = item
368
    session.commit()
369
 
370
def change_item_status(item_id, new_status):
371
    if not item_id:
122 ashish 372
        raise InventoryServiceException(101, "bad item id")
103 ashish 373
    item = get_Item(item_id)
374
    if not item:
122 ashish 375
        raise InventoryServiceException(108, "item id not present")
103 ashish 376
 
122 ashish 377
    item.status = new_status
378
    add_status_change_log(item, new_status)
103 ashish 379
    session.commit()
380
 
381
def get_item_availability_for_warehouse(warehouse_id, item_id):
382
    if not warehouse_id:
122 ashish 383
        raise InventoryServiceException(101, "bad warehouse_id")
103 ashish 384
    if not item_id:
122 ashish 385
        raise InventoryServiceException(101, "bad item_id")
103 ashish 386
 
387
    warehouse = get_Warehouse(warehouse_id)
388
    if not warehouse:
122 ashish 389
        raise InventoryServiceException(108, "warehouse does not exist")
504 rajveer 390
    item = get_item_by_catalog_id(item_id)
391
 
103 ashish 392
    if not item:
122 ashish 393
            raise InventoryServiceException(108, "item does not exist")
394
 
494 rajveer 395
    query = CurrentInventorySnapshot.query.filter_by(warehouse_id = warehouse_id)
504 rajveer 396
    query = query.filter_by(item_id = item.id)
494 rajveer 397
    try:
398
        current_inventory_snapshot = query.one()
399
        return current_inventory_snapshot.availibility
400
    except:
401
        return 0
402
    """
403
    current_inventory_snapshot = CurrentInventorySnapshot.query.filter(CurrentInventorySnapshot.warehouse_id == warehouse_id, CurrentInventorySnapshot.item_id == item_id).one()
103 ashish 404
    if not current_inventory_snapshot:
405
        return 0
406
    else:
407
        return current_inventory_snapshot.availibility
494 rajveer 408
    """
122 ashish 409
def get_warehouses_for_item(item_id):
410
    if not item_id:
411
        raise InventoryServiceException(101, "bad item_id")
412
    item = get_Item(item_id)
413
 
414
    if not item:
415
        raise InventoryServiceException(101, "bad item")
416
 
483 rajveer 417
    warehouses = item.currentInventory.warehouse
501 rajveer 418
    return warehouses
419
 
420
def get_best_sellers():
421
    sellers = BestSellers.query.all()
422
 
423
    t_sellers = []
424
    for seller in sellers:
425
        t_sellers.append(seller.item_id)
426
    return t_sellers   
427
 
428
def get_best_deals():
429
    deals = BestDeals.query.all()
430
 
431
    #query = BestDeals.query.all()
432
    #deals = query.order_by(asc(BestDeals.priority)).all()
433
 
434
 
435
    t_deals = []
436
    for deal in deals:
437
        t_deals.append(deal.item_id)
438
    return t_deals   
439
 
440
def get_latest_arrivals():
441
    arrivals = LatestArrivals.query.all()
442
 
443
    t_arrivals = []
444
    for arrival in arrivals:
445
        t_arrivals.append(arrival.item_id)
446
    return t_arrivals