Subversion Repositories SmartDukaan

Rev

Rev 383 | Rev 437 | 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):
41
    return Item.get_by(catalog_item_id=catalog_id)
42
 
94 ashish 43
def get_Warehouse(warehouse_id):
44
    return Warehouse.get_by(id=warehouse_id)
45
 
122 ashish 46
def get_all_warehouses_by_status(status):
47
    if not status:
48
        return Warehouse.query.all()
49
    else:
50
        return Warehouse.query.filter_by(status=status)
51
 
94 ashish 52
def get_all_warehouses_for_item(item_id):
53
    item = get_Item(item_id)
54
    if not item:
122 ashish 55
        raise InventoryServiceException(108, "Some unforeseen error while obtaining item")
56
    return item.get_all_warehouses
94 ashish 57
 
122 ashish 58
def get_all_items_for_warehouse(warehouse_id):
59
    warehouse = get_Warehouse(warehouse_id)
60
    if not warehouse:
61
        raise InventoryServiceException(108, "bad warehouse")
62
    return warehouse.all_items
63
 
94 ashish 64
def add_warehouse(warehouse):
103 ashish 65
    if not warehouse:
122 ashish 66
        raise InventoryServiceException(108, "Bad warehouse")
103 ashish 67
    if get_Warehouse(warehouse.id):
68
        #warehouse is already present.
122 ashish 69
        raise InventoryServiceException(101, "Warehouse already present")
103 ashish 70
 
94 ashish 71
    ds_warehouse = Warehouse()
72
    ds_warehouse.id = warehouse.id
73
    ds_warehouse.location = warehouse.location
122 ashish 74
    ds_warehouse.status = status.ACTIVE
103 ashish 75
    ds_warehouse.addedOn = datetime.datetime.now()
94 ashish 76
    session.commit()
103 ashish 77
    return ds_warehouse.id
94 ashish 78
 
122 ashish 79
def update_item(item):
80
    if not item:
81
        raise InventoryServiceException(108, "Bad item in request")
82
 
83
    if not item.id:
84
        raise InventoryServiceException(101, "non existent item")
85
 
86
    ds_item = get_Item(item.id)
87
 
88
    if not ds_item:
89
        raise InventoryServiceException(101, "Item already exists")
90
 
91
    if item.catalogItemId:
92
        ds_item.catalog_item_id = item.catalogItemId
93
    if item.vendorItemId:
94
        ds_item.vendor_item_id = item.vendorItemId
95
    else:
96
        raise InventoryServiceException(101, "vendor item id cannot be missing")
97
 
98
    if item.weight:
99
        ds_item.weight = item.weight
100
 
101
    if item.featureId:
102
        ds_item.feature_id = item.featureId
103
    if item.featureDescription:
104
        ds_item.feature_description = item.featureDescription
105
 
106
    session.commit();
107
    return ds_item.id
94 ashish 108
 
103 ashish 109
def add_item(item):
110
    if not item:
122 ashish 111
        raise InventoryServiceException(108, "Bad item in request")
103 ashish 112
    if get_Item(item.id):
122 ashish 113
        raise InventoryServiceException(101, "Item already exists")
103 ashish 114
 
115
    ds_item = Item()
122 ashish 116
    if item.id:
117
        ds_item.id = item.id
118
    if item.catalogItemId:
119
        ds_item.catalog_item_id = item.catalogItemId
120
    if item.vendorItemId:
121
        ds_item.vendor_item_id = item.vendorItemId
122
    else:
123
        raise InventoryServiceException(101, "vendor item id cannot be missing")
124
    if item.itemStatus:
125
        ds_item.status = item.itemStatus
126
    else: #this is for update calls
127
        ds_item.status = status.IN_PROCESS
103 ashish 128
    ds_item.addedOn = datetime.datetime.now()
122 ashish 129
    if item.price:
130
        update_price(item, ds_item)
131
    if item.weight:
132
        ds_item.weight = item.weight
133
 
134
    if item.featureId:
135
        ds_item.feature_id = item.featureId
136
    if item.featureDescription:
137
        ds_item.feature_description = item.featureDescription
138
 
103 ashish 139
    if item.otherInfo:
140
        for k,v in item.otherInfo.iteritems():
141
            info = ItemInfo()
142
            info.key = k
143
            info.value = v
144
            ds_item.iteminfo.append(info)
145
    #check if categories present. If yes, add them to system
122 ashish 146
 
103 ashish 147
    session.commit();
148
    return ds_item.id
149
 
122 ashish 150
def update_price(item, ds_item):
151
    log_entry("update_price", "updating price for item")
152
    for k,v in item.price.iteritems():
153
        price = Price()
154
        price.warehouse_id = k
155
        price.price = v
386 ashish 156
        price.item = ds_item
157
        session.commit() 
122 ashish 158
 
159
def update_price_for_warehouse(item_id, warehouse_id, price):
160
    log_entry("update_price", "updating price for item and warehouse")
161
    price = Price.query.filter_by(warehouse_id=warehouse_id, item_id=item_id).one()
162
    if not price:
163
        price = Price()
164
        item = get_Item(item_id)
165
        price.warehouse_id = warehouse_id
166
        price.item = item
167
    price.price = price    
168
    session.commit()
94 ashish 169
 
170
 
171
def update_inventory(item_id, warehouse_id, quantity, timestamp):
172
    item = get_Item(item_id)
173
    warehouse = get_Warehouse(warehouse_id) 
122 ashish 174
    time = to_py_date(timestamp)
94 ashish 175
 
176
    if not item:
122 ashish 177
        raise InventoryServiceException(106, "Item not found, how did you get this?")
94 ashish 178
    if not warehouse:
122 ashish 179
        raise InventoryServiceException(107, "Warehouse? Where?")
94 ashish 180
    try:
181
        item_inventory_history = ItemInventoryHistory()
182
        item_inventory_history.warehouse = warehouse
183
        item_inventory_history.item = item
184
        item_inventory_history.timestamp = time
122 ashish 185
        item_inventory_history.availibility = quantity
94 ashish 186
 
187
        current_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)
122 ashish 188
        if not current_inventory_snapshot:
189
            current_inventory_snapshot = CurrentInventorySnapshot()
190
            current_inventory_snapshot.item = item
191
            current_inventory_snapshot.warehouse = warehouse
192
 
94 ashish 193
        current_inventory_snapshot.availibility = quantity
194
        current_inventory_snapshot.checkedOn = time
195
        session.commit()
196
    except:
122 ashish 197
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
94 ashish 198
 
199
def get_item_inventoy(item_id):
200
 
201
    inventory = Item.get_by(id=item_id).currentInventory
202
    if not inventory:
122 ashish 203
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
94 ashish 204
    return inventory
205
 
383 ashish 206
def get_item_inventory_by_catalog_id(item_id):
379 ashish 207
    inventory = Item.get_by(catalog_item_id=item_id).currentInventory
208
    if not inventory:
209
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
210
    return inventory
211
 
103 ashish 212
 
213
def retire_warehouse(warehouse_id):
214
    if not warehouse_id:
122 ashish 215
        raise InventoryServiceException(101, "Bad warehouse id")
103 ashish 216
    warehouse = get_Warehouse(warehouse_id)
217
    if not warehouse:
122 ashish 218
        raise InventoryServiceException(108, "warehouse id not present")
219
    warehouse.status = status.DELETED;
103 ashish 220
    session.commit()
221
 
222
def retire_item(item_id):
223
    if not item_id:
122 ashish 224
        raise InventoryServiceException(101, "bad item id")
103 ashish 225
    item = get_Item(item_id)
226
    if not item:
122 ashish 227
        raise InventoryServiceException(108, "item id not present")
228
    item.status = status.PHASED_OUT
229
    item.retireDate = datetime.datetime.now()
103 ashish 230
    session.commit()
122 ashish 231
 
232
#need to implement threads based solution here
103 ashish 233
def start_item_on(item_id, timestamp):
234
    if not item_id:
122 ashish 235
        raise InventoryServiceException(101, "bad item id")
103 ashish 236
    item = get_Item(item_id)
237
    if not item:
122 ashish 238
        raise InventoryServiceException(108, "item id not present")
103 ashish 239
 
122 ashish 240
    item.status = status.ACTIVE
241
    item.startDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
242
    add_status_change_log(item, status.ACTIVE)
103 ashish 243
    session.commit()
244
 
122 ashish 245
#need to implement threads here
103 ashish 246
def retire_item_on(item_id, timestamp):
247
    if not item_id:
122 ashish 248
        raise InventoryServiceException(101, "bad item id")
103 ashish 249
    item = get_Item(item_id)
250
    if not item:
122 ashish 251
        raise InventoryServiceException(108, "item id not present")
103 ashish 252
 
122 ashish 253
    item.status = status.PHASED_OUT
254
    item.retireDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
255
    add_status_change_log(item, status.PHASED_OUT)
103 ashish 256
    session.commit()
257
 
258
def add_status_change_log(item, new_status):
259
    item_change_log = ItemChangeLog()
260
    item_change_log.new_status = new_status
261
    item_change_log.old_status = item.status
262
    item_change_log.timestamp = datetime.datetime.now()
263
    item_change_log.item = item
264
    session.commit()
265
 
266
def change_item_status(item_id, new_status):
267
    if not item_id:
122 ashish 268
        raise InventoryServiceException(101, "bad item id")
103 ashish 269
    item = get_Item(item_id)
270
    if not item:
122 ashish 271
        raise InventoryServiceException(108, "item id not present")
103 ashish 272
 
122 ashish 273
    item.status = new_status
274
    add_status_change_log(item, new_status)
103 ashish 275
    session.commit()
276
 
277
def get_item_availability_for_warehouse(warehouse_id, item_id):
278
    if not warehouse_id:
122 ashish 279
        raise InventoryServiceException(101, "bad warehouse_id")
103 ashish 280
    if not item_id:
122 ashish 281
        raise InventoryServiceException(101, "bad item_id")
103 ashish 282
 
283
    warehouse = get_Warehouse(warehouse_id)
284
    if not warehouse:
122 ashish 285
        raise InventoryServiceException(108, "warehouse does not exist")
103 ashish 286
    item = get_Item(item_id)
287
 
288
    if not item:
122 ashish 289
            raise InventoryServiceException(108, "item does not exist")
290
 
103 ashish 291
    current_inventory_snapshot = CurrentInventorySnapshot.query.filter(CurrentInventorySnapshot.warehouse.id == warehouse_id, CurrentInventorySnapshot.item.id == item_id).one()
292
    if not current_inventory_snapshot:
293
        return 0
294
    else:
295
        return current_inventory_snapshot.availibility
296
 
122 ashish 297
def get_warehouses_for_item(item_id):
298
    if not item_id:
299
        raise InventoryServiceException(101, "bad item_id")
300
    item = get_Item(item_id)
301
 
302
    if not item:
303
        raise InventoryServiceException(101, "bad item")
304
 
305
    warehouses = item.currentInventory.warehouse