Subversion Repositories SmartDukaan

Rev

Rev 103 | Rev 379 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 103 Rev 122
Line 3... Line 3...
3
 
3
 
4
@author: ashish
4
@author: ashish
5
'''
5
'''
6
from elixir import *
6
from elixir import *
7
from shop2020.model.v1.catalog.impl import DataService
7
from shop2020.model.v1.catalog.impl import DataService
8
from shop2020.model.v1.catalog.impl.DataService import Category, Item, Vendor,\
8
from shop2020.model.v1.catalog.impl.DataService import Item, \
9
    Warehouse, ItemInventoryHistory, CurrentInventorySnapshot, ItemInfo,\
9
    Warehouse, ItemInventoryHistory, CurrentInventorySnapshot, ItemInfo,\
10
    ItemChangeLog
10
    ItemChangeLog, Price
11
from shop2020.thriftpy.model.v1.catalog.ttypes import Category as TCategory,\
11
from shop2020.thriftpy.model.v1.catalog.ttypes import \
12
    CatalogServiceException
12
    InventoryServiceException, status
13
from shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItem
13
from shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItem
14
from shop2020.thriftpy.model.v1.catalog.ttypes import Vendor as TVendor
-
 
-
 
14
 
15
from shop2020.thriftpy.model.v1.catalog.ttypes import Warehouse as TWarehouse
15
from shop2020.thriftpy.model.v1.catalog.ttypes import Warehouse as TWarehouse
16
import datetime
16
import datetime
17
from shop2020.utils.Utils import status_active, status_added, status_retired
17
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
18
 
18
 
19
 
19
 
20
def initialize():
20
def initialize():
21
    DataService.initialize()
21
    DataService.initialize()
22
    
22
    
23
def is_category_present(id_key):
-
 
24
    category = Category.get_by(id=id_key)
-
 
25
    if category:
-
 
26
        return True    
-
 
27
    return False
-
 
28
 
-
 
29
def get_category(id_key):
-
 
30
    category = Category.get_by(id=id_key)
-
 
31
    return category
-
 
32
 
-
 
33
def get_all_categories():
-
 
34
    return Category.query.all()
-
 
35
 
-
 
36
def get_all_items_for_category(category_id):
-
 
37
    category = Category.get_by(id=category_id)
-
 
38
    if not category:
-
 
39
        raise CatalogServiceException(108, "Some unforeseen error while obtaining")
-
 
40
    return category.items
-
 
41
 
23
 
42
def get_all_items(is_active):
24
def get_all_items(is_active):
43
    if is_active:
25
    if is_active:
44
        return Item.get_by(status=status_active)
26
        return Item.query.filter_by(status= status.ACTIVE).all()
45
    else:
27
    else:
46
        return Item.query.all()
28
        return Item.query.all()
47
    
29
    
48
def get_all_items_by_status(status):
30
def get_all_items_by_status(status):
49
    if not status:
31
    if not status:
50
        #return all items
32
        #return all items
51
        return get_all_items(False)
33
        return get_all_items(False)
52
    else:
34
    else:
53
        return Item.get_by(status=status).all()
35
        return Item.query.filter_by(status=status).all()
54
 
36
 
55
def get_Item(item_id):
37
def get_Item(item_id):
56
    return Item.get_by(id=item_id)
38
    return Item.get_by(id=item_id)
57
 
39
 
58
def get_all_vendors():
-
 
59
    return Vendor.query.all()
-
 
60
 
-
 
61
def get_all_active_vendors():
-
 
62
    return Vendor.get_by(status=status_active).all()
-
 
63
 
-
 
64
def get_Vendor(vendor_id):
-
 
65
    return Vendor.get_by(id=vendor_id)
-
 
66
 
-
 
67
def get_Warehouse(warehouse_id):
40
def get_Warehouse(warehouse_id):
68
    return Warehouse.get_by(id=warehouse_id)
41
    return Warehouse.get_by(id=warehouse_id)
69
 
42
 
-
 
43
def get_all_warehouses_by_status(status):
-
 
44
    if not status:
-
 
45
        return Warehouse.query.all()
-
 
46
    else:
-
 
47
        return Warehouse.query.filter_by(status=status)
-
 
48
 
70
def get_all_warehouses_for_item(item_id):
49
def get_all_warehouses_for_item(item_id):
71
    item = get_Item(item_id)
50
    item = get_Item(item_id)
72
    if not item:
51
    if not item:
73
        raise CatalogServiceException(108, "Some unforeseen error while obtaining item")
52
        raise InventoryServiceException(108, "Some unforeseen error while obtaining item")
74
    return item.get_all_warehouses()
53
    return item.get_all_warehouses
-
 
54
 
-
 
55
def get_all_items_for_warehouse(warehouse_id):
-
 
56
    warehouse = get_Warehouse(warehouse_id)
-
 
57
    if not warehouse:
-
 
58
        raise InventoryServiceException(108, "bad warehouse")
-
 
59
    return warehouse.all_items
75
 
60
 
76
def add_warehouse(warehouse):
61
def add_warehouse(warehouse):
77
    if not warehouse:
62
    if not warehouse:
78
        raise CatalogServiceException(108, "Bad warehouse")
63
        raise InventoryServiceException(108, "Bad warehouse")
79
    if get_Warehouse(warehouse.id):
64
    if get_Warehouse(warehouse.id):
80
        #warehouse is already present.
65
        #warehouse is already present.
81
        raise CatalogServiceException(101, "Warehouse already present")
66
        raise InventoryServiceException(101, "Warehouse already present")
82
    
67
    
83
    ds_warehouse = Warehouse()
68
    ds_warehouse = Warehouse()
84
    ds_warehouse.id = warehouse.id
69
    ds_warehouse.id = warehouse.id
85
    ds_warehouse.location = warehouse.location
70
    ds_warehouse.location = warehouse.location
86
    ds_warehouse.status = status_active
71
    ds_warehouse.status = status.ACTIVE
87
    ds_warehouse.addedOn = datetime.datetime.now()
72
    ds_warehouse.addedOn = datetime.datetime.now()
88
    session.commit()
73
    session.commit()
89
    return ds_warehouse.id
74
    return ds_warehouse.id
90
 
75
 
91
def add_vendor(vendor):
76
def update_item(item):
-
 
77
    if not item:
-
 
78
        raise InventoryServiceException(108, "Bad item in request")
-
 
79
    
92
    if get_Vendor(vendor.id):
80
    if not item.id:
93
        raise CatalogServiceException(101, "Vendor already present")
81
        raise InventoryServiceException(101, "non existent item")
-
 
82
    
94
    ds_vendor = Vendor()
83
    ds_item = get_Item(item.id)
-
 
84
    
95
    if not vendor:
85
    if not ds_item:
96
        raise CatalogServiceException(108, "Bad vendor in request")
86
        raise InventoryServiceException(101, "Item already exists")
-
 
87
    
-
 
88
    if item.catalogItemId:
-
 
89
        ds_item.catalog_item_id = item.catalogItemId
97
    ds_vendor.id = vendor.id
90
    if item.vendorItemId:
98
    ds_vendor.name = vendor.name
91
        ds_item.vendor_item_id = item.vendorItemId
-
 
92
    else:
-
 
93
        raise InventoryServiceException(101, "vendor item id cannot be missing")
-
 
94
        
-
 
95
    if item.weight:
-
 
96
        ds_item.weight = item.weight
-
 
97
    
-
 
98
    if item.featureId:
-
 
99
        ds_item.feature_id = item.featureId
-
 
100
    if item.featureDescription:
-
 
101
        ds_item.feature_description = item.featureDescription
-
 
102
    
99
    session.commit()
103
    session.commit();
100
    return ds_vendor.id
104
    return ds_item.id
101
 
105
 
102
def add_item(item):
106
def add_item(item):
103
    if not item:
107
    if not item:
104
        raise CatalogServiceException(108, "Bad item in request")
108
        raise InventoryServiceException(108, "Bad item in request")
105
    if get_Item(item.id):
109
    if get_Item(item.id):
106
        raise CatalogServiceException(101, "Item already exists")
110
        raise InventoryServiceException(101, "Item already exists")
107
    
111
    
108
    ds_item = Item()
112
    ds_item = Item()
-
 
113
    if item.id:
109
    ds_item.id = item.id
114
        ds_item.id = item.id
-
 
115
    if item.catalogItemId:
-
 
116
        ds_item.catalog_item_id = item.catalogItemId
-
 
117
    if item.vendorItemId:
-
 
118
        ds_item.vendor_item_id = item.vendorItemId
-
 
119
    else:
-
 
120
        raise InventoryServiceException(101, "vendor item id cannot be missing")
-
 
121
    if item.itemStatus:
-
 
122
        ds_item.status = item.itemStatus
-
 
123
    else: #this is for update calls
110
    ds_item.status = status_added
124
        ds_item.status = status.IN_PROCESS
111
    ds_item.addedOn = datetime.datetime.now()
125
    ds_item.addedOn = datetime.datetime.now()
-
 
126
    if item.price:
-
 
127
        update_price(item, ds_item)
-
 
128
    if item.weight:
112
    ds_item.price = item.price
129
        ds_item.weight = item.weight
-
 
130
    
-
 
131
    if item.featureId:
-
 
132
        ds_item.feature_id = item.featureId
-
 
133
    if item.featureDescription:
-
 
134
        ds_item.feature_description = item.featureDescription
-
 
135
    
113
    if item.otherInfo:
136
    if item.otherInfo:
114
        for k,v in item.otherInfo.iteritems():
137
        for k,v in item.otherInfo.iteritems():
115
            info = ItemInfo()
138
            info = ItemInfo()
116
            info.key = k
139
            info.key = k
117
            info.value = v
140
            info.value = v
118
            ds_item.iteminfo.append(info)
141
            ds_item.iteminfo.append(info)
119
    #check if categories present. If yes, add them to system
142
    #check if categories present. If yes, add them to system
120
    if item.categories:
-
 
121
        for category_id in item.categories:
-
 
122
            category = get_category(category_id)
-
 
123
            if category:
-
 
124
                ds_item.category.append(category)
-
 
125
            else:
143
    
126
                raise CatalogServiceException(108, "Category not found ".category_id)
-
 
127
    session.commit();
144
    session.commit();
128
    return ds_item.id
145
    return ds_item.id
129
    
146
    
130
def add_category(category):
147
def update_price(item, ds_item):
-
 
148
    log_entry("update_price", "updating price for item")
-
 
149
    for k,v in item.price.iteritems():
131
    try: 
150
        price = Price()
132
        ds_category = Category()
151
        price.warehouse_id = k
133
        
152
        price.price = v
134
        ds_category.id = category.id
153
        price.item = ds_item 
-
 
154
 
-
 
155
def update_price_for_warehouse(item_id, warehouse_id, price):
-
 
156
    log_entry("update_price", "updating price for item and warehouse")
-
 
157
    price = Price.query.filter_by(warehouse_id=warehouse_id, item_id=item_id).one()
-
 
158
    if not price:
135
        ds_category.name = category.name
159
        price = Price()
136
        ds_category.addedOn = datetime.datetime.now()
160
        item = get_Item(item_id)
137
        ds_category.isRoot = category.isTopLevel
161
        price.warehouse_id = warehouse_id
138
        if category.parent_id:
162
        price.item = item
139
            ds_category.parent= Category.get_by(id=category.parent_id)
163
    price.price = price    
-
 
164
    session.commit()
140
        
165
        
141
        if category.childCategories:
-
 
142
            for child in category.childCategories:
-
 
143
                ds_category.children.append(get_category(child))
-
 
144
        ds_category.status = status_active
-
 
145
        #save the category now
-
 
146
        session.commit()
-
 
147
        return ds_category.id
-
 
148
    except:
-
 
149
        return 0
-
 
150
 
-
 
151
def add_item_to_category(id, item):
-
 
152
    category = get_category(id)
-
 
153
    if not category:
-
 
154
        raise CatalogServiceException(101, "no such category exists")
-
 
155
    if not item:
-
 
156
        raise CatalogServiceException(104, "bad item")
-
 
157
    try:
-
 
158
        item_id = add_item(item)
-
 
159
        added_item = get_Item(item_id)
-
 
160
        added_item.categories.append(category)
-
 
161
        session.commit()
-
 
162
        return item_id
-
 
163
    except:
-
 
164
        raise CatalogServiceException(101, "intenral error")
-
 
165
    
166
    
166
def add_item_to_category_by_id(category_id, item_id):
-
 
167
    category = get_category(category_id)
-
 
168
    item = get_Item(item_id)
-
 
169
    if not category:
-
 
170
        raise CatalogServiceException(101, "no such category exists")
-
 
171
    if not item:
-
 
172
        raise CatalogServiceException(104, "bad item")
-
 
173
    item.categories.append(category)
-
 
174
    session.commit()
-
 
175
 
-
 
176
def update_inventory(item_id, warehouse_id, quantity, timestamp):
167
def update_inventory(item_id, warehouse_id, quantity, timestamp):
177
    item = get_Item(item_id)
168
    item = get_Item(item_id)
178
    warehouse = get_Warehouse(warehouse_id) 
169
    warehouse = get_Warehouse(warehouse_id) 
179
    time = datetime.datetime.fromtimestamp(timestamp)
170
    time = to_py_date(timestamp)
180
    
171
    
181
    if not item:
172
    if not item:
182
        raise CatalogServiceException(106, "Item not found, how did you get this?")
173
        raise InventoryServiceException(106, "Item not found, how did you get this?")
183
    if not warehouse:
174
    if not warehouse:
184
        raise CatalogServiceException(107, "Warehouse? Where?")
175
        raise InventoryServiceException(107, "Warehouse? Where?")
185
    try:
176
    try:
186
        item_inventory_history = ItemInventoryHistory()
177
        item_inventory_history = ItemInventoryHistory()
187
        item_inventory_history.warehouse = warehouse
178
        item_inventory_history.warehouse = warehouse
188
        item_inventory_history.item = item
179
        item_inventory_history.item = item
189
        item_inventory_history.timestamp = time
180
        item_inventory_history.timestamp = time
190
        item_inventory_history.availability = quantity
181
        item_inventory_history.availibility = quantity
191
        
182
        
192
        current_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)
183
        current_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)
-
 
184
        if not current_inventory_snapshot:
-
 
185
            current_inventory_snapshot = CurrentInventorySnapshot()
-
 
186
            current_inventory_snapshot.item = item
-
 
187
            current_inventory_snapshot.warehouse = warehouse
-
 
188
            
193
        current_inventory_snapshot.availibility = quantity
189
        current_inventory_snapshot.availibility = quantity
194
        current_inventory_snapshot.checkedOn = time
190
        current_inventory_snapshot.checkedOn = time
195
        session.commit()
191
        session.commit()
196
    except:
192
    except:
197
        raise CatalogServiceException(108, "Some unforeseen error while updating inventory")
193
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
198
    
194
    
199
def get_item_inventoy(item_id):
195
def get_item_inventoy(item_id):
200
    
196
    
201
    inventory = Item.get_by(id=item_id).currentInventory
197
    inventory = Item.get_by(id=item_id).currentInventory
202
    if not inventory:
198
    if not inventory:
203
        raise CatalogServiceException(108, "Some unforeseen error while updating inventory")
199
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
204
    return inventory
200
    return inventory
205
 
201
 
206
def retire_category(category_id):
-
 
207
    
-
 
208
    if not category_id:
-
 
209
        raise CatalogServiceException(101, "Bad category id")
-
 
210
    category = get_category(category_id)
-
 
211
    
-
 
212
    if not category:
-
 
213
        raise CatalogServiceException(108, "Category not present")
-
 
214
    
-
 
215
    category.status = status_retired
-
 
216
    
-
 
217
    session.commit()
-
 
218
    
202
    
219
def retire_warehouse(warehouse_id):
203
def retire_warehouse(warehouse_id):
220
    if not warehouse_id:
204
    if not warehouse_id:
221
        raise CatalogServiceException(101, "Bad warehouse id")
205
        raise InventoryServiceException(101, "Bad warehouse id")
222
    warehouse = get_Warehouse(warehouse_id)
206
    warehouse = get_Warehouse(warehouse_id)
223
    if not warehouse:
207
    if not warehouse:
224
        raise CatalogServiceException(108, "warehouse id not present")
208
        raise InventoryServiceException(108, "warehouse id not present")
225
    warehouse.status = status_retired;
209
    warehouse.status = status.DELETED;
226
    session.commit()
-
 
227
    
-
 
228
def retire_vendor(vendor_id):
-
 
229
    if not vendor_id:
-
 
230
        raise CatalogServiceException(101, "bad vendor id")
-
 
231
    vendor = get_Vendor(vendor_id)
-
 
232
    
-
 
233
    if not vendor:
-
 
234
        raise CatalogServiceException(108, "vendor id not present")
-
 
235
    
-
 
236
    vendor.status = status_retired
-
 
237
    session.commit()
210
    session.commit()
238
    
211
    
239
def retire_item(item_id):
212
def retire_item(item_id):
240
    if not item_id:
213
    if not item_id:
241
        raise CatalogServiceException(101, "bad item id")
214
        raise InventoryServiceException(101, "bad item id")
242
    item = get_Item(item_id)
215
    item = get_Item(item_id)
243
    if not item:
216
    if not item:
244
        raise CatalogServiceException(108, "item id not present")
217
        raise InventoryServiceException(108, "item id not present")
245
    item.status = status_retired
218
    item.status = status.PHASED_OUT
-
 
219
    item.retireDate = datetime.datetime.now()
246
    session.commit()
220
    session.commit()
247
 
221
    
-
 
222
#need to implement threads based solution here
248
def start_item_on(item_id, timestamp):
223
def start_item_on(item_id, timestamp):
249
    if not item_id:
224
    if not item_id:
250
        raise CatalogServiceException(101, "bad item id")
225
        raise InventoryServiceException(101, "bad item id")
251
    item = get_Item(item_id)
226
    item = get_Item(item_id)
252
    if not item:
227
    if not item:
253
        raise CatalogServiceException(108, "item id not present")
228
        raise InventoryServiceException(108, "item id not present")
254
    
229
    
255
    item.status = status_active
230
    item.status = status.ACTIVE
256
    item.startDate = datetime.datetime.fromtimestamp(timestamp)
231
    item.startDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
257
    add_status_change_log(item, status_active)
232
    add_status_change_log(item, status.ACTIVE)
258
    session.commit()
233
    session.commit()
259
    
234
    
-
 
235
#need to implement threads here
260
def retire_item_on(item_id, timestamp):
236
def retire_item_on(item_id, timestamp):
261
    if not item_id:
237
    if not item_id:
262
        raise CatalogServiceException(101, "bad item id")
238
        raise InventoryServiceException(101, "bad item id")
263
    item = get_Item(item_id)
239
    item = get_Item(item_id)
264
    if not item:
240
    if not item:
265
        raise CatalogServiceException(108, "item id not present")
241
        raise InventoryServiceException(108, "item id not present")
266
    
242
    
267
    item.status = status_retired
243
    item.status = status.PHASED_OUT
268
    item.retireDate = datetime.datetime.fromtimestamp(timestamp)
244
    item.retireDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
269
    add_status_change_log(item, status_retired)
245
    add_status_change_log(item, status.PHASED_OUT)
270
    session.commit()
246
    session.commit()
271
    
247
    
272
def add_status_change_log(item, new_status):
248
def add_status_change_log(item, new_status):
273
    item_change_log = ItemChangeLog()
249
    item_change_log = ItemChangeLog()
274
    item_change_log.new_status = new_status
250
    item_change_log.new_status = new_status
Line 277... Line 253...
277
    item_change_log.item = item
253
    item_change_log.item = item
278
    session.commit()
254
    session.commit()
279
    
255
    
280
def change_item_status(item_id, new_status):
256
def change_item_status(item_id, new_status):
281
    if not item_id:
257
    if not item_id:
282
        raise CatalogServiceException(101, "bad item id")
258
        raise InventoryServiceException(101, "bad item id")
283
    item = get_Item(item_id)
259
    item = get_Item(item_id)
284
    if not item:
260
    if not item:
285
        raise CatalogServiceException(108, "item id not present")
261
        raise InventoryServiceException(108, "item id not present")
286
    
262
    
287
    item.status = status_retired
263
    item.status = new_status
288
    add_status_change_log(item, status_retired)
264
    add_status_change_log(item, new_status)
289
    session.commit()
265
    session.commit()
290
    
266
    
291
def get_item_availability_for_warehouse(warehouse_id, item_id):
267
def get_item_availability_for_warehouse(warehouse_id, item_id):
292
    if not warehouse_id:
268
    if not warehouse_id:
293
        raise CatalogServiceException(101, "bad warehouse_id")
269
        raise InventoryServiceException(101, "bad warehouse_id")
294
    if not item_id:
270
    if not item_id:
295
        raise CatalogServiceException(101, "bad item_id")
271
        raise InventoryServiceException(101, "bad item_id")
296
    
272
    
297
    warehouse = get_Warehouse(warehouse_id)
273
    warehouse = get_Warehouse(warehouse_id)
298
    if not warehouse:
274
    if not warehouse:
299
        raise CatalogServiceException(108, "warehouse does not exist")
275
        raise InventoryServiceException(108, "warehouse does not exist")
300
    item = get_Item(item_id)
276
    item = get_Item(item_id)
301
    
277
    
302
    if not item:
278
    if not item:
303
            raise CatalogServiceException(108, "item does not exist")
279
            raise InventoryServiceException(108, "item does not exist")
-
 
280
        
304
    current_inventory_snapshot = CurrentInventorySnapshot.query.filter(CurrentInventorySnapshot.warehouse.id == warehouse_id, CurrentInventorySnapshot.item.id == item_id).one()
281
    current_inventory_snapshot = CurrentInventorySnapshot.query.filter(CurrentInventorySnapshot.warehouse.id == warehouse_id, CurrentInventorySnapshot.item.id == item_id).one()
305
    if not current_inventory_snapshot:
282
    if not current_inventory_snapshot:
306
        return 0
283
        return 0
307
    else:
284
    else:
308
        return current_inventory_snapshot.availibility
285
        return current_inventory_snapshot.availibility
309
    
286
    
-
 
287
def get_warehouses_for_item(item_id):
-
 
288
    if not item_id:
-
 
289
        raise InventoryServiceException(101, "bad item_id")
-
 
290
    item = get_Item(item_id)
-
 
291
    
-
 
292
    if not item:
-
 
293
        raise InventoryServiceException(101, "bad item")
-
 
294
    
-
 
295
    warehouses = item.currentInventory.warehouse
310
296