Files
sx-fc/app/models/order.rb
2017-04-19 18:37:07 +06:30

138 lines
3.5 KiB
Ruby

class Order < ApplicationRecord
before_create :set_order_date
belongs_to :customer
has_many :order_items, autosave: true , inverse_of: :order
has_many :assigned_order_items
#internal references attributes for business logic control
attr_accessor :items, :guest, :table_id, :new_booking, :booking_type, :employee_name, :booking_id
#Main Controller method to create new order - validate all inputs and generate new order
# order_item : {
# order_item_code : "",
# item_instance_code : "",
# quantity : 0,
# option_values : [],
# sub_order_items : [],
# }
def generate
booking = nil
if self.new_booking
booking = Booking.create({:dining_facility_id => self.table_id,:type => "TableBooking",
:checkin_at => Time.now.utc, :checkin_by => self.employee_name,
:booking_status => "new" })
else
if (self.booking_id.to_i > 0 )
booking = Booking.find(self.booking_id)
end
end
booking.save!
self.default_values
if self.save!
self.adding_line_items
#Add Order Table and Room relation afrer order creation
BookingOrder.create({:booking_id => booking.id, :order => self})
#Send order to queue one it done!
process_order_queue
return true, booking
end
return false
end
#Main Method - to update order / add items
def modify
end
def adding_line_items
if self.items
#loop to add all items to order
self.items.each do |item|
menu_item = MenuItem.search_by_item_code(item[:item_instance_code])
Rails.logger.debug menu_item
set_order_items = nil
##If menu Item set item - must add child items to order as well, where price is only take from menu_item
if (menu_item[:type] == "SetMenuItem")
set_order_items
end
if (menu_item)
OrderItem.processs_item(menu_item[:item_code], menu_item[:name],
item[:quantity],menu_item[:price], item[:options], set_order_items, self.id,
self.employee_name)
end
end
self.item_count = self.order_items.count
self.save!
return true
else
self.errors.add(:order_items, :blank, message: "Order items cannot be blank")
return false
end
end
def update_items_status_to_billed(items)
if (items.nil?)
##Update the order status to ensure that reflect the stage
self.order_items.each do |item|
item.order_item_status = "billed"
item.save
end
else
items.each do |item|
item.order_item_status = "billed"
item.save
end
end
end
def default_values
self.customer = Customer.find(1) if self.customer_id.nil?
self.source = "emenu" if self.source.nil?
self.order_type = "dine-in" if self.order_type.nil?
end
private
def validate_api_inputs
end
def set_order_date
self.date = Time.now.utc
end
#Update Items Count and Quantity changes whenever there is changes
def update_products_and_quantity_count
item_count = 0
quantity_count = 0
# Count number of different items
self.item_count = self.order_items.item_count
self.quantity_count = quantity_count
# Counter number of quantity
end
#Process order items and send to order queue
def process_order_queue
#Send to background job for processing
OrderQueueProcessorJob.perform_later(self.id)
end
end