Subversion Repositories SmartDukaan

Rev

Rev 122 | Rev 383 | 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 DataService
from shop2020.model.v1.catalog.impl.DataService import Item, \
    Warehouse, ItemInventoryHistory, CurrentInventorySnapshot, ItemInfo,\
    ItemChangeLog, Price
from shop2020.thriftpy.model.v1.catalog.ttypes import \
    InventoryServiceException, status
from shop2020.thriftpy.model.v1.catalog.ttypes import Item as TItem

from shop2020.thriftpy.model.v1.catalog.ttypes import Warehouse as TWarehouse
import datetime
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date


def 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 items
        return 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):
    return Item.get_by(catalog_item_id=catalog_id)

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_warehouses

def get_all_items_for_warehouse(warehouse_id):
    warehouse = get_Warehouse(warehouse_id)
    if not warehouse:
        raise InventoryServiceException(108, "bad warehouse")
    return warehouse.all_items

def 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.id
    ds_warehouse.location = warehouse.location
    ds_warehouse.status = status.ACTIVE
    ds_warehouse.addedOn = datetime.datetime.now()
    session.commit()
    return ds_warehouse.id

def 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.catalogItemId:
        ds_item.catalog_item_id = item.catalogItemId
    if item.vendorItemId:
        ds_item.vendor_item_id = item.vendorItemId
    else:
        raise InventoryServiceException(101, "vendor item id cannot be missing")
        
    if item.weight:
        ds_item.weight = item.weight
    
    if item.featureId:
        ds_item.feature_id = item.featureId
    if item.featureDescription:
        ds_item.feature_description = item.featureDescription
    
    session.commit();
    return ds_item.id

def 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.id
    if item.catalogItemId:
        ds_item.catalog_item_id = item.catalogItemId
    if item.vendorItemId:
        ds_item.vendor_item_id = item.vendorItemId
    else:
        raise InventoryServiceException(101, "vendor item id cannot be missing")
    if item.itemStatus:
        ds_item.status = item.itemStatus
    else: #this is for update calls
        ds_item.status = status.IN_PROCESS
    ds_item.addedOn = datetime.datetime.now()
    if item.price:
        update_price(item, ds_item)
    if item.weight:
        ds_item.weight = item.weight
    
    if item.featureId:
        ds_item.feature_id = item.featureId
    if item.featureDescription:
        ds_item.feature_description = item.featureDescription
    
    if item.otherInfo:
        for k,v in item.otherInfo.iteritems():
            info = ItemInfo()
            info.key = k
            info.value = v
            ds_item.iteminfo.append(info)
    #check if categories present. If yes, add them to system
    
    session.commit();
    return ds_item.id
    
def 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 = k
        price.price = v
        price.item = ds_item 

def 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_id
        price.item = item
    price.price = price    
    session.commit()
        
    
def update_inventory(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 = warehouse
        item_inventory_history.item = item
        item_inventory_history.timestamp = time
        item_inventory_history.availibility = quantity
        
        current_inventory_snapshot = CurrentInventorySnapshot.get_by(item=item, warehouse=warehouse)
        if not current_inventory_snapshot:
            current_inventory_snapshot = CurrentInventorySnapshot()
            current_inventory_snapshot.item = item
            current_inventory_snapshot.warehouse = warehouse
            
        current_inventory_snapshot.availibility = quantity
        current_inventory_snapshot.checkedOn = time
        session.commit()
    except:
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
    
def get_item_inventoy(item_id):
    
    inventory = Item.get_by(id=item_id).currentInventory
    if not inventory:
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
    return inventory

def get_item_inventory(item_id):
    inventory = Item.get_by(catalog_item_id=item_id).currentInventory
    if not inventory:
        raise InventoryServiceException(108, "Some unforeseen error while updating inventory")
    return inventory

    
def 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_OUT
    item.retireDate = datetime.datetime.now()
    session.commit()
    
#need to implement threads based solution here
def 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.ACTIVE
    item.startDate = datetime.datetime.fromtimestamp(to_py_date(timestamp))
    add_status_change_log(item, status.ACTIVE)
    session.commit()
    
#need to implement threads here
def 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_OUT
    item.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_status
    item_change_log.old_status = item.status
    item_change_log.timestamp = datetime.datetime.now()
    item_change_log.item = item
    session.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_status
    add_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")
        
    current_inventory_snapshot = CurrentInventorySnapshot.query.filter(CurrentInventorySnapshot.warehouse.id == warehouse_id, CurrentInventorySnapshot.item.id == item_id).one()
    if not current_inventory_snapshot:
        return 0
    else:
        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.warehouse