def partial_inventory_check(inventory): """ Given the inventory items, fix the current system stocks to match the physical quantities """ inventory_items = db( db.inventory_item.id_inventory == inventory.id).iterselect() for inventory_item in inventory_items: diff = inventory_item.system_qty - inventory_item.physical_qty # more system stock than actual physical stock (missing items) if diff > 0: _remove_stocks(inventory_item.id_item, diff, request.now, inventory_item=inventory_item) # more physical stock than system stock elif diff < 0: # avg item purchase_price avg = db.stock_item.price.avg() avg_item_price = 0 last_inventory = db( db.inventory.id != inventory.id).select().last() if last_inventory: # the average price is based on the items obtained after the last inventory last_inventory_date = last_inventory.modified_on avg_item_price = db( (db.stock_item.id_store == session.store) & (db.stock_item.id_item == inventory_item.id_item.id) & (db.stock_item.created_on > last_inventory_date)).select( avg).first()[avg] else: # the average price is based on all the obtained items avg_item_price = db( (db.stock_item.id_store == session.store) & (db.stock_item.id_item == inventory_item.id_item.id) ).select(avg).first()[avg] or 0 # add items to an inventory stock db.stock_item.insert( id_item=inventory_item.id_item.id, purchase_qty=DQ(abs(diff)), stock_qty=DQ(abs(diff)), price=avg_item_price, taxes=0 # we do not consider taxes , id_inventory=inventory_item.id_inventory.id, id_store=session.store) return inventory_items
def partial_inventory_check(inventory): """ Given the inventory items, fix the current system stocks to match the physical quantities """ inventory_items = db(db.inventory_item.id_inventory == inventory.id).iterselect() for inventory_item in inventory_items: diff = inventory_item.system_qty - inventory_item.physical_qty # more system stock than actual physical stock (missing items) if diff > 0: item_utils._remove_stocks( inventory_item.id_item, diff, request.now, inventory_item=inventory_item ) # more physical stock than system stock elif diff < 0: # avg item purchase_price avg = db.stock_item.price.avg() avg_item_price = 0 last_inventory = db(db.inventory.id != inventory.id).select().last() if last_inventory: # the average price is based on the items obtained after the last inventory last_inventory_date = last_inventory.modified_on avg_item_price = db( (db.stock_item.id_store == session.store) & (db.stock_item.id_item == inventory_item.id_item.id) & (db.stock_item.created_on > last_inventory_date) ).select(avg).first()[avg] else: # the average price is based on all the obtained items avg_item_price = db( (db.stock_item.id_store == session.store) & (db.stock_item.id_item == inventory_item.id_item.id) ).select(avg).first()[avg] or 0 # add items to an inventory stock db.stock_item.insert( id_item=inventory_item.id_item.id , purchase_qty=DQ(abs(diff)) , stock_qty=DQ(abs(diff)) , price=avg_item_price , taxes=0 # we do not consider taxes , id_inventory=inventory_item.id_inventory.id , id_store=session.store ) return inventory_items
def full_inventory_check(inventory): """ Checks all the inventory items and report items that were missed after the inventory """ partial_inventory_check(inventory) inventory_items = db( db.inventory_item.id_inventory == inventory.id )._select(db.inventory_item.id_item) # get the items with stock in the current store and were not reported in the inventory missing_items = db( (db.stock_item.id_store == session.store) & (db.stock_item.stock_qty > 0) & (~db.stock_item.id_item.belongs(inventory_items)) ).iterselect(db.stock_item.id_item, groupby=db.stock_item.id_item) has_missing_items = False for stock_item in missing_items: has_missing_items = True missing_item = db.item(stock_item.id_item) quantity = item_stock_qty(missing_item, session.store) new_inventory_item_id = db.inventory_item(db.inventory_item.insert( id_inventory=inventory.id , id_item=missing_item.id , system_qty=quantity , physical_qty=0 , is_missing=True )) item_utils._remove_stocks( missing_item, quantity, request.now, inventory_item=new_inventory_item_id ) return has_missing_items