Rev 494 | Rev 504 | 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, Price, LatestArrivals, BestDeals, BestSellersfrom 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_datefrom sqlalchemy import desc, ascdef 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 warehousesdef get_best_sellers():sellers = BestSellers.query.all()t_sellers = []for seller in sellers:t_sellers.append(seller.item_id)return t_sellersdef get_best_deals():deals = BestDeals.query.all()#query = BestDeals.query.all()#deals = query.order_by(asc(BestDeals.priority)).all()t_deals = []for deal in deals:t_deals.append(deal.item_id)return t_dealsdef get_latest_arrivals():arrivals = LatestArrivals.query.all()t_arrivals = []for arrival in arrivals:t_arrivals.append(arrival.item_id)return t_arrivals