Rev 483 | Rev 501 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 23-Mar-2010@author: ashish'''from elixir import *from shop2020.model.v1.catalog.impl import DataServicefrom shop2020.model.v1.catalog.impl.DataService import Item, \Warehouse, ItemInventoryHistory, CurrentInventorySnapshot, ItemInfo,\ItemChangeLog, Pricefrom shop2020.thriftpy.model.v1.catalog.ttypes import \InventoryServiceException, statusfrom shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItemfrom shop2020.thriftpy.model.v1.catalog.ttypes import Warehouse as TWarehouseimport datetimefrom shop2020.utils.Utils import log_entry, to_py_date, to_java_datedef initialize():DataService.initialize()def get_all_items(is_active):if is_active:return Item.query.filter_by(status= status.ACTIVE).all()else:return Item.query.all()def get_all_items_by_status(status):if not status:#return all itemsreturn get_all_items(False)else:return Item.query.filter_by(status=status).all()def get_Item(item_id):return Item.get_by(id=item_id)def get_item_by_catalog_id(catalog_id):query = Item.query.filter_by(catalog_item_id=catalog_id)try:return query.one()except:raise InventoryServiceException(109, "Item not found")def get_item_by_vendor_id(vendor_id):query = Item.query.filter_by(vendor_item_id=vendor_id)#query = Item.query.filter_by(vendor_item_id='6417182037054')try:return query.one()except:raise InventoryServiceException(109, "Item not found")def get_Warehouse(warehouse_id):return Warehouse.get_by(id=warehouse_id)def get_all_warehouses_by_status(status):if not status:return Warehouse.query.all()else:return Warehouse.query.filter_by(status=status)def get_all_warehouses_for_item(item_id):item = get_Item(item_id)if not item:raise InventoryServiceException(108, "Some unforeseen error while obtaining item")return item.get_all_warehousesdef get_all_items_for_warehouse(warehouse_id):warehouse = get_Warehouse(warehouse_id)if not warehouse:raise InventoryServiceException(108, "bad warehouse")return warehouse.all_itemsdef add_warehouse(warehouse):if not warehouse:raise InventoryServiceException(108, "Bad warehouse")if get_Warehouse(warehouse.id):#warehouse is already present.raise InventoryServiceException(101, "Warehouse already present")ds_warehouse = Warehouse()ds_warehouse.id = warehouse.idds_warehouse.location = warehouse.locationds_warehouse.status = status.ACTIVEds_warehouse.addedOn = datetime.datetime.now()ds_warehouse.lastCheckedOn = datetime.datetime.now()ds_warehouse.tinNumber = warehouse.tinNumberds_warehouse.pincode = warehouse.pincodeif warehouse.vendorString:ds_warehouse.vendorString = warehouse.vendorStringsession.commit()return ds_warehouse.iddef update_item(item):if not item:raise InventoryServiceException(108, "Bad item in request")if not item.id:raise InventoryServiceException(101, "non existent item")ds_item = get_Item(item.id)if not ds_item:raise InventoryServiceException(101, "Item already exists")if item.manufacturer_name:ds_item.manufacturer_name = item.manufacturer_nameif item.model_name:ds_item.model_name = item.model_nameif item.model_number:ds_item.model_number = item.model_numberif item.category:ds_item.category = item.categoryif item.comments:ds_item.comments = item.commentsif item.catalogItemId:ds_item.catalog_item_id = item.catalogItemIdif item.vendorItemId:ds_item.vendor_item_id = item.vendorItemIdelse:raise InventoryServiceException(101, "vendor item id cannot be missing")if item.mrp:ds_item.mrp = item.mrpif item.mop:ds_item.mop = item.mopif item.sellingPrice:ds_item.sellingPrice = item.sellingPriceif item.weight:ds_item.weight = item.weightif item.weight:ds_item.weight = item.weightif item.featureId:ds_item.feature_id = item.featureIdif item.featureDescription:ds_item.feature_description = item.featureDescriptionsession.commit();return ds_item.iddef add_item(item):if not item:raise InventoryServiceException(108, "Bad item in request")if get_Item(item.id):raise InventoryServiceException(101, "Item already exists")ds_item = Item()if item.id:ds_item.id = item.idif item.manufacturer_name:ds_item.manufacturer_name = item.manufacturer_nameif item.model_name:ds_item.model_name = item.model_nameif item.model_number:ds_item.model_number = item.model_numberif item.category:ds_item.category = item.categoryif item.comments:ds_item.comments = item.commentsif item.catalogItemId:ds_item.catalog_item_id = item.catalogItemIdif item.vendorItemId:ds_item.vendor_item_id = item.vendorItemIdelse:raise InventoryServiceException(101, "vendor item id cannot be missing")if item.itemStatus:ds_item.status = item.itemStatuselse: #this is for update callsds_item.status = status.IN_PROCESSds_item.addedOn = datetime.datetime.now()if item.mrp:ds_item.mrp = item.mrpif item.mop:ds_item.mop = item.mopif item.sellingPrice:ds_item.sellingPrice = item.sellingPriceif item.weight:ds_item.weight = item.weightif item.featureId:ds_item.feature_id = item.featureIdif item.featureDescription:ds_item.feature_description = item.featureDescriptionif item.otherInfo:for k,v in item.otherInfo.iteritems():info = ItemInfo()info.key = kinfo.value = vds_item.iteminfo.append(info)#check if categories present. If yes, add them to systemsession.commit();return ds_item.id#this is no more useddef update_price(item, ds_item):log_entry("update_price", "updating price for item")for k,v in item.price.iteritems():price = Price()price.warehouse_id = kprice.price = vprice.item = ds_itemsession.commit()#this is no more useddef update_price_for_warehouse(item_id, warehouse_id, price):log_entry("update_price", "updating price for item and warehouse")price = Price.query.filter_by(warehouse_id=warehouse_id, item_id=item_id).one()if not price:price = Price()item = get_Item(item_id)price.warehouse_id = warehouse_idprice.item = itemprice.price = pricesession.commit()def update_inventory(warehouse_id, timestamp, availability):warehouse = get_Warehouse(warehouse_id)if not warehouse:raise InventoryServiceException(107, "Warehouse? Where?")time = datetime.datetime.now()warehouse.lastCheckedOn = timewarehouse.vendorString = timestampfor k,v in availability.iteritems():vendor_id = kquantity = vtry:item = Item.query.filter_by(vendor_item_id=vendor_id).one()except:continuetry:item_inventory_history = ItemInventoryHistory()item_inventory_history.warehouse = warehouseitem_inventory_history.item = itemitem_inventory_history.timestamp = timeitem_inventory_history.availibility = quantitycurrent_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)if not current_inventory_snapshot:current_inventory_snapshot = CurrentInventorySnapshot()current_inventory_snapshot.item = itemcurrent_inventory_snapshot.warehouse = warehousecurrent_inventory_snapshot.availibility = 0# added the difference in the current inventorycurrent_inventory_snapshot.availibility = current_inventory_snapshot.availibility + quantityexcept:raise InventoryServiceException(108, "Some unforeseen error while updating inventory")session.commit()#this is no more useddef update_inventory_old(item_id, warehouse_id, quantity, timestamp):item = get_Item(item_id)warehouse = get_Warehouse(warehouse_id)time = to_py_date(timestamp)if not item:raise InventoryServiceException(106, "Item not found, how did you get this?")if not warehouse:raise InventoryServiceException(107, "Warehouse? Where?")try:item_inventory_history = ItemInventoryHistory()item_inventory_history.warehouse = warehouseitem_inventory_history.item = itemitem_inventory_history.timestamp = timeitem_inventory_history.availibility = quantitycurrent_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)if not current_inventory_snapshot:current_inventory_snapshot = CurrentInventorySnapshot()current_inventory_snapshot.item = itemcurrent_inventory_snapshot.warehouse = warehousecurrent_inventory_snapshot.availibility = quantitycurrent_inventory_snapshot.checkedOn = timesession.commit()except:raise InventoryServiceException(108, "Some unforeseen error while updating inventory")def get_item_inventoy(item_id):inventory = Item.get_by(id=item_id).currentInventoryif not inventory:raise InventoryServiceException(108, "Some unforeseen error while updating inventory")return inventorydef get_item_inventory_by_catalog_id(item_id):inventory = Item.get_by(catalog_item_id=item_id).currentInventoryif not inventory:raise InventoryServiceException(108, "Some unforeseen error while updating inventory")return inventorydef retire_warehouse(warehouse_id):if not warehouse_id:raise InventoryServiceException(101, "Bad warehouse id")warehouse = get_Warehouse(warehouse_id)if not warehouse:raise InventoryServiceException(108, "warehouse id not present")warehouse.status = status.DELETED;session.commit()def retire_item(item_id):if not item_id:raise InventoryServiceException(101, "bad item id")item = get_Item(item_id)if not item:raise InventoryServiceException(108, "item id not present")item.status = status.PHASED_OUTitem.retireDate = datetime.datetime.now()session.commit()#need to implement threads based solution heredef start_item_on(item_id, timestamp):if not item_id:raise InventoryServiceException(101, "bad item id")item = get_Item(item_id)if not item:raise InventoryServiceException(108, "item id not present")item.status = status.ACTIVEitem.startDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))add_status_change_log(item, status.ACTIVE)session.commit()#need to implement threads heredef retire_item_on(item_id, timestamp):if not item_id:raise InventoryServiceException(101, "bad item id")item = get_Item(item_id)if not item:raise InventoryServiceException(108, "item id not present")item.status = status.PHASED_OUTitem.retireDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))add_status_change_log(item, status.PHASED_OUT)session.commit()def add_status_change_log(item, new_status):item_change_log = ItemChangeLog()item_change_log.new_status = new_statusitem_change_log.old_status = item.statusitem_change_log.timestamp = datetime.datetime.now()item_change_log.item = itemsession.commit()def change_item_status(item_id, new_status):if not item_id:raise InventoryServiceException(101, "bad item id")item = get_Item(item_id)if not item:raise InventoryServiceException(108, "item id not present")item.status = new_statusadd_status_change_log(item, new_status)session.commit()def get_item_availability_for_warehouse(warehouse_id, item_id):if not warehouse_id:raise InventoryServiceException(101, "bad warehouse_id")if not item_id:raise InventoryServiceException(101, "bad item_id")warehouse = get_Warehouse(warehouse_id)if not warehouse:raise InventoryServiceException(108, "warehouse does not exist")item = get_Item(item_id)if not item:raise InventoryServiceException(108, "item does not exist")query = CurrentInventorySnapshot.query.filter_by(warehouse_id = warehouse_id)query = query.filter_by(item_id = item_id)try:current_inventory_snapshot = query.one()return current_inventory_snapshot.availibilityexcept:return 0"""current_inventory_snapshot = CurrentInventorySnapshot.query.filter(CurrentInventorySnapshot.warehouse_id == warehouse_id, CurrentInventorySnapshot.item_id == item_id).one()if not current_inventory_snapshot:return 0else:return current_inventory_snapshot.availibility"""def get_warehouses_for_item(item_id):if not item_id:raise InventoryServiceException(101, "bad item_id")item = get_Item(item_id)if not item:raise InventoryServiceException(101, "bad item")warehouses = item.currentInventory.warehousereturn warehouses