111 lines
5.0 KiB
Ruby
Executable File
111 lines
5.0 KiB
Ruby
Executable File
class InventoryDefinition < ApplicationRecord
|
|
|
|
scope :active, -> {where(:is_active => true)}
|
|
|
|
def self.calculate_product_count(saleObj=nil,saleobj_after_req_bill=nil)
|
|
# check_sj = StockJournal.where('item_code=?', item.item_instance_code).order("id DESC").first
|
|
logger.debug 'saleObj<<<<<<<<<<<<<<<<<<<<<<<<<<<'
|
|
logger.debug saleObj.sale_items.to_json
|
|
if !saleObj.nil?
|
|
saleObj.sale_items.each do |item|
|
|
found, inventory_definition = find_product_in_inventory(item)
|
|
if found
|
|
check_balance(item,inventory_definition)
|
|
end
|
|
end
|
|
else
|
|
saleobj_after_req_bill.each do |item|
|
|
found, inventory_definition = find_product_in_inventory(item)
|
|
if found
|
|
check_balance(item,inventory_definition)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
def self.find_product_in_inventory(item)
|
|
if product = InventoryDefinition.find_by_item_code(item.item_instance_code)
|
|
if stock_check_item = StockCheckItem.find_by_item_code(item.item_instance_code)
|
|
return true, product
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.check_balance(item, inventory_definition) # item => saleItemOBj
|
|
|
|
stock = StockJournal.where("item_code=?", item.item_instance_code).order("id DESC").first
|
|
unless stock.nil?
|
|
modify_balance(item, stock, inventory_definition)
|
|
else
|
|
StockJournal.add_to_journal(item.item_instance_code, item.qty, 0, "out of stock", inventory_definition, item.id, StockJournal::SALES_TRANS)
|
|
end
|
|
end
|
|
|
|
def self.modify_balance(item, stock, inventory_definition) #saleitemObj
|
|
check_item = StockCheckItem.where('item_code=?', item.item_instance_code).order("id DESC").first
|
|
if item.qty.to_i >= 0
|
|
qty = item.qty - item.qty_was
|
|
if !item.id_was.nil?
|
|
remark = "edit"
|
|
elsif stock.balance.to_i >= qty
|
|
puts ">> stock is greater than order qty"
|
|
remark = "ok"
|
|
else
|
|
puts " << stock is less than order qty"
|
|
remark = "out of stock"
|
|
end
|
|
else # item.qty < 0
|
|
qty = item.qty
|
|
remark = "void"
|
|
end
|
|
if item.is_a? OrderItem
|
|
trans_type = StockJournal::ORDER_TRANS
|
|
elsif item.is_a? SaleItem
|
|
trans_type = StockJournal::SALES_TRANS
|
|
end
|
|
# StockJournal.add_to_journal(instance_code, qty, stock.balance, remark, inventory_definition, item.id, trans_type)
|
|
StockJournal.add_to_journal(item.item_instance_code, qty, stock.balance, remark, inventory_definition, item.id, trans_type)
|
|
check_item.different = check_item.different - qty
|
|
check_item.save
|
|
end
|
|
|
|
def self.search_by_category(cat_id)
|
|
@inventory_definitions = InventoryDefinition.select("inventory_definitions.*,
|
|
mi.name as item_name,mii.item_instance_name as instance_name," +
|
|
"mi.item_code as item_code,mii.item_instance_code as instance_code," +
|
|
"mc.name as menu_category_name,mc.id as menu_category_id ")
|
|
.joins("JOIN menu_item_instances mii ON mii.item_instance_code = inventory_definitions.item_code" +
|
|
" JOIN menu_items mi ON mi.id = mii.menu_item_id" +
|
|
" JOIN menu_categories mc ON mc.id = mi.menu_category_id ")
|
|
.where("mc.id=#{cat_id}")
|
|
.group("mi.menu_category_id,inventory_definitions.item_code")
|
|
.order("mi.menu_category_id desc")
|
|
end
|
|
|
|
def self.get_by_category(filter)
|
|
least_stock = StockJournal.select(:balance).joins("JOIN inventory_definitions ON stock_journals.item_code = inventory_definitions.item_code").order(:id => :desc).limit(1).to_sql
|
|
|
|
@inventory_definitions = InventoryDefinition.select("inventory_definitions.*,
|
|
(CASE WHEN sj.credit IS NULL THEN 0 ELSE sj.credit END) as credit,
|
|
(CASE WHEN sj.debit IS NULL THEN 0 ELSE sj.debit END) as debit,
|
|
(#{least_stock}) as balance,"+
|
|
"acc.title as account_name,mi.name as item_name,
|
|
mii.item_instance_name as instance_name," +
|
|
"mc.name as menu_category_name,mc.id as menu_category_id "
|
|
)
|
|
.joins(" LEFT JOIN stock_journals sj ON sj.inventory_definition_id=inventory_definitions.id")
|
|
.joins("JOIN menu_item_instances mii ON mii.item_instance_code = inventory_definitions.item_code" +
|
|
" JOIN menu_items mi ON mi.id = mii.menu_item_id" +
|
|
" JOIN menu_categories mc ON mc.id = mi.menu_category_id ")
|
|
.joins(" JOIN accounts acc ON acc.id = mi.account_id")
|
|
.where("(inventory_definitions.item_code LIKE ? OR inventory_definitions.min_order_level LIKE ?
|
|
OR inventory_definitions.max_stock_level LIKE ? OR sj.balance LIKE ? OR mi.name LIKE ?
|
|
OR mii.item_instance_name LIKE ? OR mc.name LIKE ?)","%#{filter}%","%#{filter}%","%#{filter}%",
|
|
"%#{filter}%","%#{filter}%","%#{filter}%","%#{filter}%")
|
|
.group("mi.menu_category_id,inventory_definitions.item_code")
|
|
.order("balance asc, mi.name asc,acc.title desc,mi.menu_category_id desc")
|
|
end
|
|
|
|
end
|