Subversion Repositories SmartDukaan

Rev

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