Files
sx-fc/app/models/order_queue_station.rb
2023-08-24 10:40:31 +06:30

141 lines
5.1 KiB
Ruby
Executable File

# Order Queue station is where order are submitted to
# Order can send from tablet | table
# Source of order will determin where it will appear
class OrderQueueStation < ApplicationRecord
has_many :assigned_order_items
has_many :order_items
has_many :order_queue_process_by_zones
has_many :zones, through: :order_queue_process_by_zones
belongs_to :employee
scope :active, -> {where(is_active: true)}
# validations
validates_presence_of :station_name, :printer_name
def process_order(order, table_id, order_source = nil, pdf_status = nil ,change_to=nil, current_user=nil)
order_items = order.order_items
if table_id.to_i > 0
# get dining
dining = DiningFacility.find(table_id)
oqs_stations = dining.order_queue_stations
else
oqs_stations = OrderQueueStation.active
end
assigned_order_items = []
oqs_order_items_by_zones = []
# ToDo per item per printer
oqs_stations.each do |oqs|
oqs_order_items = order_items.select { |i| JSON.parse(oqs.processing_items).include? i.item_code }
oqs_order_items_by_zones << { oqs: oqs, oqs_order_items: oqs_order_items }
print_status = false
if oqs.auto_print && order_source != "quick_service"
print_status = true
if oqs_order_items.length > 0
if oqs.cut_per_item
print_slip_item(oqs, order, oqs_order_items, pdf_status, change_to, current_user, table_id)
else
print_slip(oqs, order, oqs_order_items, pdf_status, change_to, current_user, table_id)
end
end
end
oqs_order_items.each { |i| AssignedOrderItem.create({ order: order, item_code: i.item_code, instance_code: i.item_instance_code, order_queue_station: oqs, print_status: print_status, delivery_status: false }) }
end
end
def pay_process_order_queue (order_id, table_id = nil)
if table_id.to_i > 0
# get dining
dining = DiningFacility.find(table_id)
oqs_stations = dining.order_queue_stations
else
oqs_stations = OrderQueueStation.active
end
order = Order.find(order_id)
order_items = order.order_items
assigned_order_items = []
oqs_order_items_by_zones = []
oqs_stations.each do |oqs|
oqs_order_items = order_items.select { |i| JSON.parse(oqs.processing_items).include? i.item_code }
oqs_order_items_by_zones << { oqs: oqs, oqs_order_items: oqs_order_items }
if oqs.auto_print
if oqs_order_items.length > 0
if oqs.cut_per_item
print_slip_item(oqs, order, oqs_order_items)
else
print_slip(oqs, order, oqs_order_items)
end
end
end
end
end
private
#Print order_items in 1 slip
def print_slip(oqs, order, order_items ,pdf_status=nil,change_to=nil,current_user=nil,table_id=nil)
if pdf_status.nil?
if print_settings = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first
order_queue_printer = Printer::OrderQueuePrinter.new(print_settings)
order_queue_printer.print_order_summary(print_settings, oqs, order.order_id, order_items, print_status="")
end
else
move_print_pdf(change_to,current_user,table_id,order_items,oqs)
end
end
#Print order_item in 1 slip per item
def print_slip_item(oqs, order, assigned_items,pdf_status=nil,change_to=nil,current_user=nil,table_id=nil)
if pdf_status.nil?
# order_item = OrderItem.where("order_id='#{assigned_item.order_id}' AND item_instance_code='#{assigned_item.instance_code}'").first()
# print when complete click
if print_settings = PrintSetting.where("unique_code REGEXP ?", "order.*item.*pdf").first
order_queue_printer = Printer::OrderQueuePrinter.new(print_settings)
if !assigned_items.nil?
assigned_items.each do |order_item|
order_queue_printer.print_order_item(print_settings, oqs,order_item.order_id, order_item.order_items_id, print_status="" )
end
end
end
else
move_print_pdf(change_to,current_user,table_id,assigned_items,oqs)
end
end
def move_print_pdf(change_to,current_user,change_from,order_items,oqs)
# if ENV["SERVER_MODE"] != "cloud" #no print in cloud server
# get printer info
@from = (DiningFacility.find(change_from)).name
@to = (DiningFacility.find(change_to)).name
@type = (DiningFacility.find(change_to)).type
@moved_by = current_user
@date = Time.current
@shop = Shop.current_shop
unique_code = "MoveTablePdf"
# pdf_no = PrintSetting.where(:unique_code => unique_code).count
print_settings = PrintSetting.find_by_unique_code(unique_code)
# printer_array = []
# printer_array = PrintSetting.where(:unique_code => unique_code)
# for i in 0..pdf_no
# if i != pdf_no
# print_settings = printer_array[i]
printer = Printer::ReceiptPrinter.new(print_settings)
printer.print_move_table(print_settings,@to,@from ,@shop,@date,@type,@moved_by,order_items,oqs)
# end
# end
# end
end
end