Subversion Repositories SmartDukaan

Rev

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