Files
sx-fc/app/models/order_item.rb
2019-09-30 16:53:02 +06:30

157 lines
5.5 KiB
Ruby
Executable File

class OrderItem < ApplicationRecord
self.primary_key = "order_items_id"
#primary key - need to be unique
before_create :generate_custom_id
#Associations
belongs_to :order, autosave: true
# belongs_to :order, counter_cache: true
#Validation
validates_presence_of :item_code, :item_name, :qty
# validates :qty, numericality: { :greater_than => 0 }
validates_associated :order
after_save :update_stock_journal
# after_save :add_to_journal, if: Proc.new { !self.id_changed? }
# after_save :update_stock_journal, if: Proc.new { self.id_changed? }
#This Method - handle how items is added into order
# order_item : {
# order_item_code : "",
# item_instance_code : "",
# quantity : 0,
# option_values : [],
# sub_order_items : [],
# }
def self.processs_item (item_code, instance_code, menu_name, alt_name, account_id, qty,price, options, set_menu_items, order_id, item_order_by, taxable)
orderitem = OrderItem.create do |oitem|
oitem.order_id = order_id
oitem.item_code = item_code
oitem.item_instance_code = instance_code
oitem.item_name = menu_name
oitem.alt_name = alt_name
oitem.account_id = account_id
oitem.qty = qty
oitem.price = price
oitem.taxable = taxable
oitem.options = options
oitem.set_menu_items = set_menu_items
oitem.item_order_by = item_order_by #person who order this. * If emenu - it will be login user on the app
end
#logger.debug orderitem.to_yml
orderitem.save!
end
#Origami : Cashier : to show order items details
def self.get_order_items_details(booking_id)
# booking_orders = BookingOrder.where("booking_id=?",booking.booking_id)
# if booking_orders
# booking_orders.each do |book_order|
# order_details = OrderItem.select("order_items.item_name,order_items.qty,order_items.price,(order_items.qty*order_items.price) as total_price")
# .joins("left join orders on orders.order_id = order_items.order_id")
# .where("order_items.order_id=?",book_order.order)
# return order_details
# end
# else
# return false
# end
order_details = OrderItem.select("order_items.item_name,order_items.qty,order_items.price,(order_items.qty*order_items.price) as total_price")
.joins("left join orders on orders.order_id = order_items.order_id")
.joins("left join booking_orders on booking_orders.order_id = order_items.order_id")
.joins("left join bookings on bookings.booking_id = booking_orders.booking_id")
.where("bookings.booking_id=?",booking_id)
return order_details
end
def self.sync_order_item_records(order_items)
if !order_items.nil?
order_items.each do |item|
order_item = OrderItem.find_by_order_items_id(item['order_items_id'])
# unless OrderItem.exists?(item['order_items_id'])
if order_item.nil?
order_item = OrderItem.new
end
order_item.order_items_id = item['order_items_id']
order_item.order_id = item['order_id']
order_item.order_item_status = item['order_item_status']
order_item.item_order_by = item['item_order_by']
order_item.item_code = item['item_code']
order_item.item_instance_code = item['item_instance_code']
order_item.item_name = item['item_name']
order_item.alt_name = item['alt_name']
order_item.account_id = item['account_id']
order_item.qty = item['qty']
order_item.price = item['price']
order_item.remark = item['remark']
order_item.options = item['options']
order_item.set_menu_items = item['set_menu_items']
order_item.taxable = item['taxable']
order_item.completed_by = item['completed_by']
order_item.save
end
Rails.logger.debug '...... order item sync completed. .....'
end
end
private
def generate_custom_id
if self.order_items_id.nil?
self.order_items_id = SeedGenerator.generate_id(self.class.name, "ODI")
end
end
def add_to_journal
defination = InventoryDefinition.find_by_item_code(self.item_instance_code)
stock = StockJournal.where('item_code = ?', self.item_instance_code).order("id DESC").first
journal = StockJournal.create(
item_code: self.item_instance_code,
credit: 0,
debit: self.qty,
balance: stock.balance - self.qty,
inventory_definition_id: defination.id,
remark: 'ok',
trans_ref: self.order.id,
trans_type: StockJournal::SALES_TRANS
)
end
def update_stock_journal
if self.qty != self.qty_before_last_save
found, inventory_definition = InventoryDefinition.find_product_in_inventory(self)
if found
InventoryDefinition.check_balance(self, inventory_definition)
end
end
# if self.qty > self.qty_was
# credit = 0
# debit = self.qty.to_i - self.qty_was.to_i
# else
# credit = self.qty_was.to_i - self.qty.to_i
# debit = 0
# end
# if credit != debit
# defination = InventoryDefinition.find_by_item_code(self.item_instance_code)
# stock = StockJournal.where('item_code = ?', self.item_instance_code).order("id DESC").first
# journal = StockJournal.create(
# item_code: self.item_instance_code,
# credit: credit,
# debit: debit,
# balance: stock.balance - debit + credit,
# inventory_definition_id: defination.id,
# remark: 'ok',
# trans_ref: self.order.id,
# trans_type: StockJournal::SALES_TRANS
# )
# end
end
end