From 3a99e1bb09e9a21e0861eabd387829a1a3995952 Mon Sep 17 00:00:00 2001 From: Thein Lin Kyaw Date: Mon, 9 Dec 2019 10:33:10 +0630 Subject: [PATCH] update for order process Add activereocrd-import gem for bulk insert --- Gemfile | 3 + Gemfile.lock | 3 + README.md | 4 + .../api/check_in_process_controller.rb | 2 +- app/controllers/oqs/backhome_controller.rb | 12 +- .../origami/addorders_controller.rb | 120 ++++----- app/controllers/origami/home_controller.rb | 109 +++----- .../origami/payments_controller.rb | 150 +++++------ app/models/assigned_order_item.rb | 17 +- app/models/booking.rb | 3 + app/models/dining_facility.rb | 27 +- app/models/lookup.rb | 2 +- app/models/menu_item.rb | 38 ++- app/models/order.rb | 152 ++++------- app/models/order_item.rb | 10 +- app/models/order_queue_station.rb | 243 +++++------------- app/models/printer/order_queue_printer.rb | 219 ++++------------ app/models/printer/receipt_printer.rb | 161 ++---------- app/models/product.rb | 44 ++-- app/models/sale.rb | 8 - app/models/seed_generator.rb | 65 ++--- app/views/origami/addorders/detail.html.erb | 8 +- 22 files changed, 441 insertions(+), 959 deletions(-) diff --git a/Gemfile b/Gemfile index ba568b94..957e9968 100644 --- a/Gemfile +++ b/Gemfile @@ -44,6 +44,9 @@ gem 'rack-cors' # Multi-tenancy for shops gem 'acts_as_tenant' +# Activerecord-Import is a library for bulk inserting data using ActiveRecord. +gem 'activerecord-import' + # image upload gem 'carrierwave', '~> 1.0' gem 'mini_magick' diff --git a/Gemfile.lock b/Gemfile.lock index bbcc1085..76ce8948 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -41,6 +41,8 @@ GEM activemodel (= 5.1.7) activesupport (= 5.1.7) arel (~> 8.0) + activerecord-import (1.0.3) + activerecord (>= 3.2) activesupport (5.1.7) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) @@ -320,6 +322,7 @@ PLATFORMS ruby DEPENDENCIES + activerecord-import acts_as_tenant aescrypt axlsx (= 2.0.1) diff --git a/README.md b/README.md index 54474f5e..67fcc40b 100755 --- a/README.md +++ b/README.md @@ -288,6 +288,10 @@ For Number Formats => settings/lookups => { lookup_type: number_format, name: strip_insignificant_zeros, value: {true: => ['1', 't', 'true', 'on', 'y', 'yes'], false: => ['0', 'f', 'false', 'off', 'n', 'no', ...] } +For Booking checkin time limit + settings/lookups => + { lookup_type: checkin_time_limit, name: CheckinTimeLimit, value: total hours before checkout (e.g., '48')) } + /* Customer Types in lookups */ 1) settings/lookups => { type:customer_type, name: Dinein, value:Dinein } 2) settings/lookups => { type:customer_type, name: Takeaway, value: Takeaway } diff --git a/app/controllers/api/check_in_process_controller.rb b/app/controllers/api/check_in_process_controller.rb index 3e703cc2..2a04ff6b 100644 --- a/app/controllers/api/check_in_process_controller.rb +++ b/app/controllers/api/check_in_process_controller.rb @@ -97,7 +97,7 @@ class Api::CheckInProcessController < Api::ApiController render :json => { :status => false, :error_message => "Operation failed!" } end else - booking = dining_facility.get_current_checkout_booking + booking = dining_facility.current_checkout_booking if booking.nil? lookup_checkout_time = Lookup.collection_of("checkout_time") diff --git a/app/controllers/oqs/backhome_controller.rb b/app/controllers/oqs/backhome_controller.rb index 4ac5f0a2..a66751cf 100755 --- a/app/controllers/oqs/backhome_controller.rb +++ b/app/controllers/oqs/backhome_controller.rb @@ -21,7 +21,7 @@ class Oqs::HomeController < BaseOqsController zone_id = qid.zone_id i=i+1 end - end + end end @queue_stations_items.push({:zone_id => zone_id , :station_name => que.station_name, :is_active => que.is_active , :is_ap => que.auto_print, :item_count => i }) end @@ -57,14 +57,6 @@ class Oqs::HomeController < BaseOqsController end end - # booking_id = dining.get_new_booking - # BookingOrder.where("booking_id='#{ booking_id }'").find_each do |bo| - # order=Order.find(bo.order_id); - # order.order_items.each do |oi| - # items.push(oi) - # end - # end - render :json => items.to_json end @@ -88,7 +80,7 @@ class Oqs::HomeController < BaseOqsController end # Query for OQS with delivery status - def queue_items_query(status) + def queue_items_query(status) AssignedOrderItem.select("assigned_order_items.assigned_order_item_id, oqs.id as station_id, oqs.station_name, oqs.is_active, oqpz.zone_id, df.name as zone, df.type as type, odt.order_id, odt.item_code, odt.item_name, odt.price, odt.qty, odt.item_order_by, odt.options, cus.name as customer_name, odt.created_at") .joins(" left join order_queue_stations as oqs on oqs.id = assigned_order_items.order_queue_station_id left join order_queue_process_by_zones as oqpz on oqpz.order_queue_station_id = oqs.id diff --git a/app/controllers/origami/addorders_controller.rb b/app/controllers/origami/addorders_controller.rb index 597b5d28..90bc9183 100755 --- a/app/controllers/origami/addorders_controller.rb +++ b/app/controllers/origami/addorders_controller.rb @@ -38,10 +38,11 @@ class Origami::AddordersController < BaseOrigamiController @booking = @table.get_booking if @booking @booking_id = @booking.booking_id - @obj_order = @booking.orders.first - @customer = @obj_order.customer - @date = @obj_order.created_at - @order_items = @booking.order_items + if @obj_order = @booking.orders.first + @customer = @obj_order.customer + @date = @obj_order.created_at + @order_items = @booking.order_items + end end end @@ -108,21 +109,21 @@ class Origami::AddordersController < BaseOrigamiController items_arr = [] JSON.parse(params[:order_items]).each { |i| i["item_instance_code"] = i["item_instance_code"].downcase.to_s - if i["item_instance_code"].include? "ext" - is_extra_time = true - arr_exts = i["item_instance_code"].split("_") - if arr_exts[1].match(/^(\d)+$/) + if i["item_instance_code"].include? "ext" + is_extra_time = true + arr_exts = i["item_instance_code"].split("_") + if arr_exts[1].match(/^(\d)+$/) time = arr_exts[1].to_i*60*i["quantity"].to_i extra_time = Time.at(time) - end - end - if i["parent_order_item_id"]; - items = {"order_item_id": i["order_item_id"],"item_instance_code": i["item_instance_code"],"quantity": i["quantity"],"parent_order_item_id": i["parent_order_item_id"],"options": JSON.parse(i["options"])} - else + end + end + if i["parent_order_item_id"] + items = {"order_item_id": i["order_item_id"],"item_instance_code": i["item_instance_code"],"quantity": i["quantity"],"parent_order_item_id": i["parent_order_item_id"],"options": JSON.parse(i["options"])} + else items = {"order_item_id": i["order_item_id"],"item_instance_code": i["item_instance_code"],"quantity": i["quantity"],"options": JSON.parse(i["options"])} - end - items_arr.push(items) - } + end + items_arr.push(items) + } # begin if params[:order_source] == "quick_service" && params[:table_id].to_i == 0 customer_id = "CUS-000000000002" # for no customer id from mobile @@ -159,16 +160,13 @@ class Origami::AddordersController < BaseOrigamiController table = DiningFacility.find(@booking.dining_facility_id) type = 'order' from = getCloudDomain #get sub domain in cloud mode - ActionCable.server.broadcast "order_channel",table: table,type:type,from:from - + ActionCable.server.broadcast "order_channel", table: table,type:type,from:from end - if params[:order_source] != "quick_service" && params[:order_source] != "food_court" process_order_queue(@order.order_id,@order.table_id,@order.source) end end - - # Order.send_customer_view(@booking) + # Order.send_customer_view(@booking) if current_user.role != "waiter" && params[:create_type] == "create_pay" if @status && @booking && (@order.source == 'quick_service') || (@order.source == 'food_court') @@ -232,66 +230,34 @@ class Origami::AddordersController < BaseOrigamiController end def process_order_queue(order_id,table_id,order_source) - print_status = nil - cup_status = nil + #Send to background job for processing + order = Order.find(order_id) + sidekiq = Lookup.find_by_lookup_type("sidekiq") - #Send to background job for processing - order = Order.find(order_id) - sidekiq = Lookup.find_by_lookup_type("sidekiq") - if ENV["SERVER_MODE"] != 'cloud' + if ENV["SERVER_MODE"] != 'cloud' + cup_status = `#{"sudo service cups status"}` + if !check_cup_status(cup_status) + cup_start = `#{"sudo service cups start"}` cup_status = `#{"sudo service cups status"}` - print_status = check_cup_status(cup_status) - end - - if print_status - if !sidekiq.nil? - OrderQueueProcessorJob.perform_later(order_id, table_id) - else - if order - oqs = OrderQueueStation.new - oqs.process_order(order, table_id, order_source) - end - # assign_order = AssignedOrderItem.assigned_order_item_by_job(order_id) - # ActionCable.server.broadcast "order_queue_station_channel",order: assign_order - end - else - if ENV["SERVER_MODE"] != 'cloud' - cup_start = `#{"sudo service cups start"}` - cup_status = `#{"sudo service cups status"}` - print_status = check_cup_status(cup_status) - end - - if print_status - if !sidekiq.nil? - OrderQueueProcessorJob.perform_later(order_id, table_id) - else - if order - oqs = OrderQueueStation.new - oqs.process_order(order, table_id, order_source) - end - # assign_order = AssignedOrderItem.assigned_order_item_by_job(order_id) - # ActionCable.server.broadcast "order_queue_station_channel",order: assign_order - end - else - if ENV["SERVER_MODE"] != 'cloud' - from = "" - msg = ' Print Error ! Please contact to service' - ActionCable.server.broadcast "call_waiter_channel",table: msg,time:'print_error',from:from - end - if !sidekiq.nil? - OrderQueueProcessorJob.perform_later(order_id, table_id) - else - if order - oqs = OrderQueueStation.new - oqs.process_order(order, table_id, order_source) - end - - from = getCloudDomain #get sub domain in cloud mode - assign_order = AssignedOrderItem.assigned_order_item_by_job(order_id) - ActionCable.server.broadcast "order_queue_station_channel",order: assign_order,from:from - end + if !check_cup_status(cup_status) + from = '' + msg = 'Print Error ! Please contact to service' + ActionCable.server.broadcast "call_waiter_channel", table: msg, time:'print_error', from: from end end + end + + if !sidekiq.nil? + OrderQueueProcessorJob.perform_later(order_id, table_id) + else + if order + oqs = OrderQueueStation.new + oqs.process_order(order, table_id, order_source) + end + from = getCloudDomain #get sub domain in cloud mode + assign_order = AssignedOrderItem.assigned_order_item_by_job(order_id) + ActionCable.server.broadcast "order_queue_station_channel", order: assign_order, from: from + end end def check_cup_status(status) diff --git a/app/controllers/origami/home_controller.rb b/app/controllers/origami/home_controller.rb index ac105209..5393dc96 100755 --- a/app/controllers/origami/home_controller.rb +++ b/app/controllers/origami/home_controller.rb @@ -4,9 +4,8 @@ class Origami::HomeController < BaseOrigamiController def index @webview = check_mobile - - @tables = Table.unscope(:order).includes(:zone).all.active.order('status desc') - @rooms = Room.unscope(:order).includes(:zone).all.active.order('status desc') + @tables = Table.unscope(:order).includes(:zone, :current_checkin_booking, :current_checkout_booking, :current_reserved_booking).all.active.order('status desc') + @rooms = Room.unscope(:order).includes(:zone, :current_checkin_booking, :current_checkout_booking, :current_reserved_booking).all.active.order('status desc') @complete = Sale.completed_sale("cashier") @orders = Order.includes("sale_orders").where("DATE_FORMAT(date,'%Y-%m-%d') = ? and status != 'billed' and source != 'quick_service'",DateTime.now.strftime('%Y-%m-%d')).order('date desc') @@ -22,8 +21,8 @@ class Origami::HomeController < BaseOrigamiController @print_settings = PrintSetting.get_precision_delimiter() @webview = check_mobile - @tables = Table.unscope(:order).includes(:zone).all.active.order('status desc') - @rooms = Room.unscope(:order).includes(:zone).all.active.order('status desc') + @tables = Table.unscope(:order).includes(:zone, :current_checkin_booking, :current_checkout_booking, :current_reserved_booking).all.active.order('status desc') + @rooms = Room.unscope(:order).includes(:zone, :current_checkin_booking, :current_checkout_booking, :current_reserved_booking).all.active.order('status desc') @complete = Sale.completed_sale("cashier") @orders = Order.includes("sale_orders").where("DATE_FORMAT(date,'%Y-%m-%d') = ? and status != 'billed' and source != 'quick_service'",DateTime.now.strftime('%Y-%m-%d')).order('date desc') @customers = Customer.pluck("customer_id, name") @@ -36,75 +35,41 @@ class Origami::HomeController < BaseOrigamiController @shop = shop_detail @membership = MembershipSetting::MembershipSetting @payment_methods = PaymentMethodSetting.all - @dining_booking = @dining.bookings.active.where("DATE_FORMAT(created_at,'%Y-%m-%d') = '#{DateTime.now.strftime('%Y-%m-%d')}' OR DATE_FORMAT(created_at,'%Y-%m-%d') = '#{Date.today.prev_day}' ") - #@dining_booking = @dining.bookings.active.where("created_at between '#{DateTime.now.utc - 12.hours}' and '#{DateTime.now.utc}'") - @order_items = Array.new + @dining_booking = @dining.current_bookings + + @order_items = Array.new @dining_booking.each do |booking| - if booking.sale_id.nil? && booking.booking_status != 'moved' - @order_items = Array.new - # @assigned_order_items = Array.new - if booking.booking_orders.empty? - @booking = booking - else - booking.booking_orders.each do |booking_order| - order = Order.find(booking_order.order_id) - if (order.status == "new") - @obj_order = order - @customer = order.customer - @date = order.created_at - @booking= booking - order.order_items.each do |item| - @order_items.push(item) - # assigned_order_items = AssignedOrderItem.find_by_item_code_and_instance_code_and_order_id(item.item_code,item.item_instance_code,item.order_id) - # if !assigned_order_items.nil? - # @assigned_order_items.push({item.order_items_id => assigned_order_items.assigned_order_item_id}) - # end - end - @account_arr = Array.new - if @customer.tax_profiles - accounts = @customer.tax_profiles - @account_arr =[] - accounts.each do |acc| - account = TaxProfile.find_by_id(acc) - if !account.nil? - @account_arr.push(account) - end - end - end - end - end - end - @status_order = 'order' - else - sale = Sale.find(booking.sale_id) - if sale.sale_status != "completed" && sale.sale_status != 'void' && sale.sale_status != 'spoile' && sale.sale_status != 'waste' - @sale_array.push(sale) - if @status_order == 'order' - @status_order = 'sale' - end - @booking= booking - @date = sale.created_at - @status_sale = 'sale' - @obj_sale = sale - @customer = sale.customer - accounts = @customer.tax_profiles - @account_arr =[] - accounts.each do |acc| - account = TaxProfile.find_by_id(acc) - if !account.nil? - @account_arr.push(account) - end - end - end - @sale_taxes = [] - sale_taxes = SaleTax.where("sale_id = ?", sale.sale_id) - if !sale_taxes.empty? - sale_taxes.each do |sale_tax| - @sale_taxes.push(sale_tax) - end - end + if @obj_sale || @booking.blank? + @booking = booking + end + + if booking.sale_id + @obj_sale = booking.sale + @sale_array.push(@obj_sale) + @sale_taxes = @obj_sale.sale_taxes + @status_sale = 'sale' + else + @order_items += booking.order_items + @obj_order = booking.orders.first + end + + if @obj_sale || @customer.blank? + if obj = @obj_sale || @obj_order + @customer = obj.customer + @date = obj.created_at end - end + end + + if @obj_sale + @status_order = 'sale' + else + @status_order = 'order' + end + + if (@obj_sale || @account_arr.blank?) && @customer + @account_arr = TaxProfile.find_by(id: @customer.tax_profiles) + end + end #for bank integration @checkout_time = Lookup.collection_of('checkout_time') diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index b6c3e5be..0ce60790 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -31,100 +31,72 @@ class Origami::PaymentsController < BaseOrigamiController end end - # if ENV["SERVER_MODE"] != "cloud" #no print in cloud server - receipt_bill_a5_pdf = Lookup.collection_of("print_settings") #print_settings with name:ReceiptBillA5Pdf - # Print for First Bill to Customer - unique_code = "ReceiptBillPdf" - print_settings = PrintSetting.all - if !print_settings.nil? - print_settings.each do |setting| - if setting.unique_code == 'ReceiptBillPdf' - unique_code = "ReceiptBillPdf" - elsif setting.unique_code == 'ReceiptBillStarPdf' - unique_code = "ReceiptBillStarPdf" - end - end + #shop detail + ## shop_detail = Shop.current_shop + # customer= Customer.where('customer_id=' +.customer_id) + customer = Customer.find(sale_data.customer_id) + # rounding adjustment + if shop_detail.is_rounding_adj + new_total = Sale.get_rounding_adjustment(sale_data.grand_total) + rounding_adj = new_total - sale_data.grand_total + sale_data.update_attributes(grand_total: new_total,old_grand_total: sale_data.grand_total,rounding_adjustment:rounding_adj) if rounding_adj > 0 + end + #end rounding adjustment + #record for sale audit + action_by = current_user.name + type = "FIRST_BILL" + + remark = "#{action_by} print out first bill for Receipt No #{sale_data.receipt_no}" + sale_audit = SaleAudit.record_audit_sale(sale_id,remark,action_by,type ) + # get member information + rebate = MembershipSetting.find_by_rebate(1) + if customer.membership_id != nil && rebate + # member_info = Customer.get_member_account(customer) + # current_balance = SaleAudit.paymal_search(sale_id) + current_balance = 0 + end + + # find order id by sale id + # sale_order = SaleOrder.find_by_sale_id(@sale_data.sale_id) + + # Calculate price_by_accounts + item_price_by_accounts = SaleItem.calculate_price_by_accounts(sale_items) + discount_price_by_accounts = SaleItem.get_discount_price_by_accounts(sale_items) + + other_amount = SaleItem.calculate_other_charges(sale_items) + + print_settings = PrintSetting.where("unique_code REGEXP ?", "receipt.*bill.*pdf").first + printer = Printer::ReceiptPrinter.new(print_settings) + + #TODO :: KBZPAY ( QR ) + # On/Off setting ( show or not qr ) + # qrCode = "00020101021202021110500346KBZ005ab0ed5c1ed09d1c4585ff1313170389160831435294600062000040732kp1e78f7efddca190042638341afb88d50200006KBZPay0106KBZPay5303MMK5802MM62170813PAY_BY_QRCODE64060002my6304FBBD" + kbz_pay_method = PaymentMethodSetting.where(:payment_method => KbzPay::KBZ_PAY).last + + status = false + qr = nil + + if !kbz_pay_method.nil? + if kbz_pay_method.is_active == true + sale_payment = SalePayment.new + sale_payment.process_kbz_payment(sale_id, sale_data.grand_total, 0, 'pending') + + status, qr = KbzPay.pay(sale_data.grand_total.to_i, sale_payment.sale_payment_id, kbz_pay_method.gateway_url, kbz_pay_method.auth_token, kbz_pay_method.merchant_account_id, kbz_pay_method.additional_parameters) end + end - if !receipt_bill_a5_pdf.empty? - receipt_bill_a5_pdf.each do |receipt_bilA5| - if receipt_bilA5[0] == 'ReceiptBillA5Pdf' - if receipt_bilA5[1] == '1' - unique_code = "ReceiptBillA5Pdf" - else - unique_code = unique_code#{}"ReceiptBillPdf" - end - end - end - end + filename, receipt_no, cashier_printer = printer.print_receipt_bill(print_settings, status, qr, cashier_terminal,sale_items,sale_data,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info, shop_detail, "Frt",current_balance,nil,other_amount,nil,nil,nil) - #shop detail - ## shop_detail = Shop.current_shop - # customer= Customer.where('customer_id=' +.customer_id) - customer = Customer.find(sale_data.customer_id) - # rounding adjustment - if shop_detail.is_rounding_adj - new_total = Sale.get_rounding_adjustment(sale_data.grand_total) - rounding_adj = new_total - sale_data.grand_total - sale_data.update_attributes(grand_total: new_total,old_grand_total: sale_data.grand_total,rounding_adjustment:rounding_adj) if rounding_adj > 0 - end - #end rounding adjustment - #record for sale audit - action_by = current_user.name - type = "FIRST_BILL" + result = { + :filepath => filename, + :printer_model => print_settings.brand_name, + :printer_url => print_settings.api_settings + } - remark = "#{action_by} print out first bill for Receipt No #{sale_data.receipt_no}" - sale_audit = SaleAudit.record_audit_sale(sale_id,remark,action_by,type ) - # get member information - rebate = MembershipSetting.find_by_rebate(1) - if customer.membership_id != nil && rebate - # member_info = Customer.get_member_account(customer) - # current_balance = SaleAudit.paymal_search(sale_id) - current_balance = 0 - end - # get printer info - print_settings=PrintSetting.find_by_unique_code(unique_code) + # status, qr = KbzPay.query(sale_payment.sale_payment_id) - # find order id by sale id - # sale_order = SaleOrder.find_by_sale_id(@sale_data.sale_id) - - # Calculate price_by_accounts - item_price_by_accounts = SaleItem.calculate_price_by_accounts(sale_items) - discount_price_by_accounts = SaleItem.get_discount_price_by_accounts(sale_items) - - other_amount = SaleItem.calculate_other_charges(sale_items) - - printer = Printer::ReceiptPrinter.new(print_settings) - - #TODO :: KBZPAY ( QR ) - # On/Off setting ( show or not qr ) - # qrCode = "00020101021202021110500346KBZ005ab0ed5c1ed09d1c4585ff1313170389160831435294600062000040732kp1e78f7efddca190042638341afb88d50200006KBZPay0106KBZPay5303MMK5802MM62170813PAY_BY_QRCODE64060002my6304FBBD" - kbz_pay_method = PaymentMethodSetting.where(:payment_method => KbzPay::KBZ_PAY).last - - status = false - qr = nil - - if !kbz_pay_method.nil? - if kbz_pay_method.is_active == true - sale_payment = SalePayment.new - sale_payment.process_kbz_payment(sale_id, sale_data.grand_total, 0, 'pending') - - status, qr = KbzPay.pay(sale_data.grand_total.to_i, sale_payment.sale_payment_id, kbz_pay_method.gateway_url, kbz_pay_method.auth_token, kbz_pay_method.merchant_account_id, kbz_pay_method.additional_parameters) - end - end - - filename, receipt_no, cashier_printer = printer.print_receipt_bill(print_settings, status, qr, cashier_terminal,sale_items,sale_data,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info, shop_detail, "Frt",current_balance,nil,other_amount,nil,nil,nil) - - result = { - :filepath => filename, - :printer_model => print_settings.brand_name, - :printer_url => print_settings.api_settings - } - - # status, qr = KbzPay.query(sale_payment.sale_payment_id) - - # Mobile Print - render :json => result.to_json + # Mobile Print + render :json => result.to_json # end end diff --git a/app/models/assigned_order_item.rb b/app/models/assigned_order_item.rb index c1b0162e..d77248d8 100755 --- a/app/models/assigned_order_item.rb +++ b/app/models/assigned_order_item.rb @@ -41,12 +41,12 @@ class AssignedOrderItem < ApplicationRecord def self.assigned_order_item_by_job(order_id) order_item = AssignedOrderItem.select("assigned_order_items.assigned_order_item_id, - assigned_order_items.order_queue_station_id, - oqs.id as station_id, oqs.station_name, - oqs.is_active, oqpz.zone_id, - df.name as zone, df.type as table_type, - odt.order_id, odt.item_code, odt.item_instance_code, odt.item_name, - odt.price, odt.qty, odt.item_order_by, odt.options, + assigned_order_items.order_queue_station_id, + oqs.id as station_id, oqs.station_name, + oqs.is_active, oqpz.zone_id, + df.name as zone, df.type as table_type, + odt.order_id, odt.item_code, odt.item_instance_code, odt.item_name, + odt.price, odt.qty, odt.item_order_by, odt.options, cus.name as customer_name, odt.created_at") .joins(" left join order_queue_stations as oqs on oqs.id = assigned_order_items.order_queue_station_id left join order_queue_process_by_zones as oqpz on oqpz.order_queue_station_id = oqs.id @@ -62,6 +62,11 @@ class AssignedOrderItem < ApplicationRecord return order_item end + protected + def self.generate_ids(count = 1) + SeedGenerator.generate_ids(self.name, "AOI", count) + end + private def generate_custom_id if self.assigned_order_item_id.nil? diff --git a/app/models/booking.rb b/app/models/booking.rb index 9ca45ec4..f99df507 100755 --- a/app/models/booking.rb +++ b/app/models/booking.rb @@ -9,8 +9,11 @@ class Booking < ApplicationRecord has_many :booking_orders has_many :orders, :through => :booking_orders has_many :order_items, :through => :orders + scope :active, -> {where("booking_status != 'moved'")} scope :today, -> {where("created_at >= #{Time.now.utc}")} + scope :assign, -> { where(booking_status: 'assign')} + scope :within_time_limit, -> { where(checkin_at: Lookup.get_checkin_time_limit.hours.ago..DateTime::Infinity.new) } def self.sync_booking_records(bookings) if !bookings.nil? diff --git a/app/models/dining_facility.rb b/app/models/dining_facility.rb index d759ba73..052c4a69 100755 --- a/app/models/dining_facility.rb +++ b/app/models/dining_facility.rb @@ -3,6 +3,12 @@ class DiningFacility < ApplicationRecord has_many :dining_charges has_many :in_juties + has_many :bookings + has_many :current_bookings, -> { left_joins(:sale).assign.within_time_limit.merge(Booking.where(checkout_at: nil).or(Booking.merge(Sale.where(sale_status: ['new', nil])))) }, class_name: "Booking" + has_one :current_checkin_booking, -> { assign.within_time_limit.where(checkout_at: nil) }, class_name: "Booking" + has_one :current_checkout_booking, -> { left_joins(:sale).assign.within_time_limit.where.not(checkout_at: nil).merge(Sale.where(sale_status: ['new', nil])) }, class_name: "Booking" + has_one :current_reserved_booking, -> { left_joins(:sale).assign.within_time_limit.where.not(reserved_at: nil).merge(Sale.where(sale_status: nil)) }, class_name: "Booking" + TABLE_TYPE = "Table" ROOM_TYPE = "Room" @@ -21,7 +27,7 @@ class DiningFacility < ApplicationRecord end def get_booking - booking = self.get_current_booking + booking = self.current_checkin_booking if booking if booking.dining_facility_id.to_i == self.id if booking.booking_status == 'assign' @@ -36,23 +42,8 @@ class DiningFacility < ApplicationRecord Booking.where(dining_facility_id: self.id, booking_status: 'assign', checkout_at: nil).where("checkin_at > ?", checkin_time_lookup.hours.ago).first #and checkout_at is null end - def get_moved_booking - checkin_time_lookup = Lookup.get_checkin_time_limit - Booking.where(dining_facility_id: self.id, booking_status: 'moved', checkout_at: nil).where("checkin_at > ?", checkin_time_lookup.hours.ago).first - end - - def get_new_booking - # query for new - Booking.where(dining_facility_id: self.id, booking_status: 'assign', sale_id: nil, checkout_at: nil).first - end - - def get_current_checkout_booking - checkin_time_lookup = Lookup.get_checkin_time_limit - Booking.where(dining_facility_id: self.id, booking_status: 'assign', checkout_at: nil).where.not(reserved_at: nil).where("checkin_at > ?", checkin_time_lookup.hours.ago).first - end - def get_checkout_booking - booking = self.get_current_checkout_booking + booking = self.current_reserved_booking if booking lookup_checkout_time = Lookup.collection_of("checkout_alert_time") free_time_min = 0 @@ -91,7 +82,7 @@ class DiningFacility < ApplicationRecord def self.get_checkin_booking checkin_time_lookup = Lookup.get_checkin_time_limit - bookings = Booking.where(booking_status: 'assign', checkout_at: nil).where.not(reserved_at: nil).where("checkin_at > ?", checkin_time_lookup.hours.ago) + bookings = self.current_checkin_booking arr_booking = Array.new if bookings lookup_checkout_time = Lookup.collection_of("checkout_alert_time") diff --git a/app/models/lookup.rb b/app/models/lookup.rb index ac7bd6da..a9cb2348 100755 --- a/app/models/lookup.rb +++ b/app/models/lookup.rb @@ -57,7 +57,7 @@ class Lookup < ApplicationRecord end def self.collection_of(type) - Lookup.select("name, value").where("lookup_type" => type ).map { |l| [l.name, l.value] } + Lookup.where("lookup_type" => type ).pluck("name, value") end def self.create_shift_sale_lookup diff --git a/app/models/menu_item.rb b/app/models/menu_item.rb index 59791cb2..4735e6d8 100755 --- a/app/models/menu_item.rb +++ b/app/models/menu_item.rb @@ -31,26 +31,24 @@ class MenuItem < ApplicationRecord # Work with item_code = item_instance_code def self.search_by_item_code(item_code) - menu_item_hash = Hash.new - mt_instance = MenuItemInstance.find_by_item_instance_code(item_code) - if (!mt_instance.nil?) - menu_item = MenuItem.find(mt_instance.menu_item_id) - menu_item_hash[:type] = menu_item.type - menu_item_hash[:account_id] = menu_item.account_id - menu_item_hash[:item_code] = menu_item.item_code - menu_item_hash[:item_instance_code] = mt_instance.item_instance_code - menu_item_hash[:name] = menu_item.name.to_s + " - " + mt_instance.item_instance_name.to_s - menu_item_hash[:alt_name] = menu_item.alt_name.to_s # + " - " + mt_instance.item_instance_name.to_s - menu_item_hash[:price] = mt_instance.price - menu_item_hash[:promotion_price] = mt_instance.promotion_price - menu_item_hash[:is_on_promotion] = mt_instance.is_on_promotion - menu_item_hash[:is_available] = mt_instance.is_available - menu_item_hash[:taxable] = menu_item.taxable - - return menu_item_hash - end - - return nil + MenuItem.joins(:menu_item_instances) + .where(menu_item_instances: {item_instance_code: item_code}) + .pluck(:type, :account_id, :item_code, :item_instance_code, :name, :alt_name, "menu_item_instances.item_instance_name AS item_instance_name", :price, :promotion_price, :is_on_promotion, "menu_item_instances.is_available", :taxable) + .map { |type, account_id, item_code, item_instance_code, item_name, item_alt_name, item_instance_name, price, promotion_price, is_on_promotion, is_available, taxable| + { + type: type, + account_id: account_id, + item_code: item_code, + item_instance_code: item_instance_code, + name: item_name.to_s + (' - ' + item_instance_name.to_s) || '', + alt_name: item_alt_name || '', + price: price, + promotion_price: promotion_price, + is_on_promotion: is_on_promotion, + is_available: is_available, + taxable: taxable + } + } end def self.deleteRecursive(menu_item) diff --git a/app/models/order.rb b/app/models/order.rb index cd350e34..09caef45 100755 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -26,16 +26,11 @@ class Order < ApplicationRecord def generate booking = nil if self.new_booking - if self.table_id.to_i > 0 - table_id = self.table_id - else - table_id = nil - end #add extra time if self.is_extra_time && self.extra_time booking = Booking.create({:dining_facility_id => table_id,:type => "TableBooking", - :checkin_at => Time.now.utc,:checkout_at => Time.now.utc + self.extra_time.to_i, - :checkin_by => self.employee_name, + :checkin_at => Time.now.utc, :checkout_at => Time.now.utc + self.extra_time.to_i, + :checkin_by => self.employee_name, :booking_status => "assign" }) else booking = Booking.create({:dining_facility_id => table_id,:type => "TableBooking", @@ -50,7 +45,6 @@ class Order < ApplicationRecord # table.status = "occupied" # table.save end - else booking = Booking.find(self.booking_id) #add extra time @@ -70,7 +64,7 @@ class Order < ApplicationRecord self.adding_line_items #Add Order Table and Room relation afrer order creation - BookingOrder.create({:booking_id => booking.booking_id, :order => self}) + booking.orders << self #Send order to queue one it done! # if self.source != "quick_service" @@ -107,7 +101,7 @@ class Order < ApplicationRecord self.adding_line_items #Add Order Table and Room relation afrer order creation - BookingOrder.create({:booking_id => booking.booking_id, :order => self}) + booking.orders << self #Send order to queue one it done! # if self.source != "quick_service" @@ -118,7 +112,6 @@ class Order < ApplicationRecord send_order_broadcast(booking) return true, booking - end return false @@ -133,49 +126,49 @@ class Order < ApplicationRecord def adding_line_items if self.items #re-order to - ordered_list = re_order_items(self.items) - + items = re_order_items(self.items) #loop to add all items to order - ordered_list.each do |item| + item_instance_codes = items.map { |i| i[:item_instance_code] } + menu_items = MenuItem.search_by_item_code(item_instance_codes) + menu_items += Product.search_by_product_code(item_instance_codes) if menu_items.length < item_instance_codes.length - menu_item = MenuItem.search_by_item_code(item[:item_instance_code]) - - # For Product while item code not in menu item - if menu_item.nil? - menu_item = Product.search_by_product_code(item[:item_instance_code]) - end - - #if (!menu_item.nil?) - # Rails.logger.debug menu_item - set_order_items = Array.new - ##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") - if (item.include? 'sub_items') || (item.include? :sub_items) - item[:sub_items].each do |si| - # Retrive instance's Price - set_item = MenuItem.search_by_item_code(si[:item_instance_code]) - set_order_items.push({"item_instance_code"=>si[:item_instance_code], "item_instance_name"=>set_item[:name], "quantity"=>si[:quantity], "price"=>set_item[:price], "options"=>si[:options]}) - end - end - set_order_items = set_order_items.to_json - else - set_order_items = nil + new_order_items = [] + items.each do |order_item| + menu_item = menu_items.find { |i| i[:item_instance_code].downcase == order_item[:item_instance_code].downcase } + sub_order_items = [] + if order_item[:sub_items].length > 0 + sub_menu_items = MenuItem.search_by_item_code(order_item[:sub_items].map { |i| i[:item_instance_code] }) + order_item[:sub_items].each do |sub_order_item| + sub_menu_item = sub_menu_items.find { |i| i[:item_instance_code] == sub_order_item[:item_instance_code] } + sub_order_items << { item_instance_code: sub_order_item[:item_instance_code], item_instance_name: sub_menu_item[:name], quantity: sub_order_item[:quantity], price: sub_menu_item[:price], options: sub_order_item[:options] } end + end + sub_order_items = sub_order_items.to_json + new_order_items << OrderItem.new({ + order_id: id, + item_code: menu_item[:item_code], + item_instance_code: order_item[:item_instance_code], + item_name: menu_item[:name], + alt_name: menu_item[:alt_name], + account_id: menu_item[:account_id], + qty: order_item[:quantity], + price: menu_item[:price], + options: order_item[:options], + set_menu_items: sub_order_items, + item_order_by: employee_name, + taxable: menu_item[:taxable] + }) + end - # not insert with price 0 - # puts item[:price] - # puts item - # if(item[:price] != 0 ) - # OrderItem.processs_item(menu_item[:item_code], menu_item[:name], menu_item[:account_id], - # item[:quantity],menu_item[:price], item[:options], set_order_items, self.id, - # self.employee_name) - # end + ids = OrderItem.generate_ids(new_order_items.length) + new_order_items.each_with_index do |order_item, index| + order_item.order_items_id = ids[index] + end - OrderItem.processs_item(menu_item[:item_code], item[:item_instance_code], menu_item[:name], menu_item[:alt_name], menu_item[:account_id], - item[:quantity],menu_item[:price], item[:options], set_order_items, self.id, - self.employee_name, menu_item[:taxable]) + OrderItem.import new_order_items, validate: false - #end + new_order_items.each do |order_item| + order_item.run_callbacks(:save) { true } end self.item_count = self.order_items.count @@ -186,7 +179,6 @@ class Order < ApplicationRecord self.errors.add(:order_items, :blank, message: "Order items cannot be blank") return false end - end def update_items_status_to_billed(items) @@ -213,66 +205,8 @@ class Order < ApplicationRecord end protected - def re_order_items(form_items) #reorder inputs items as parents and child - parent_id = Array.new - parents = Array.new - parents_and_children_items = Array.new - - new_items_list = Array.new - - form_items.each do |parent| - if !parent[:parent_order_item_id].nil? - if (!parent_id.include?(parent[:parent_order_item_id])) - parent_id.push(parent[:parent_order_item_id]) - - end - end - end - Rails.logger.debug "Parent Id count -> " + parent_id.count.to_s - - - parent_id.each do |pid| - form_items.each do |item| - Rails.logger.debug "Adding - Parents -> " + pid.to_s + " - " + item[:order_item_id].to_s - if (pid == item[:order_item_id]) - parents.push(item) - end - end - end - Rails.logger.debug "Parents count -> " + parents.count.to_s - - parents.each do |parent| - children = Array.new - form_items.each do |item| - if (parent[:order_item_id] == item[:parent_order_item_id] ) - children.push(item) - #Items to remove for new list - parents_and_children_items.push(item) - end - end - parent[:sub_items] = children - end - Rails.logger.debug "Parent/children Items to remove -> " + parents_and_children_items.count.to_s - - #Remove process items - #c = a.reject{ |e| b.include? e } - - new_items_list = form_items - parents_and_children_items - - - Rails.logger.debug "New list count -> " + new_items_list.count.to_s - - #Add parent to the list - #new_items_list = new_items_list + parents - - Rails.logger.debug "Re-Order List (Parent)-" - - Rails.logger.debug parents - - Rails.logger.debug "Re-Order List -" - Rails.logger.debug new_items_list - - return new_items_list + def re_order_items(items) #reorder inputs items as parents and child + new_items = items.select { |i| i[:parent_order_item_id].blank? }.map { |x| x[:sub_items] = items.select { |y| x[:order_item_id] == y[:parent_order_item_id] }; x } end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 3e75ecba..e696bf5a 100755 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -5,8 +5,8 @@ class OrderItem < ApplicationRecord before_create :generate_custom_id #Associations - belongs_to :order, autosave: true - # belongs_to :order, counter_cache: true + belongs_to :order, autosave: true + # belongs_to :order, counter_cache: true #Validation validates_presence_of :item_code, :item_name, :qty @@ -102,7 +102,13 @@ class OrderItem < ApplicationRecord end end + protected + def self.generate_ids(count = 1) + SeedGenerator.generate_ids(self.name, "ODI", count) + end + private + def generate_custom_id if self.order_items_id.nil? self.order_items_id = SeedGenerator.generate_id(self.class.name, "ODI") diff --git a/app/models/order_queue_station.rb b/app/models/order_queue_station.rb index 6d8830f8..da7be3c2 100755 --- a/app/models/order_queue_station.rb +++ b/app/models/order_queue_station.rb @@ -5,7 +5,7 @@ class OrderQueueStation < ApplicationRecord has_many :assigned_order_items has_many :order_items - has_many :order_queue_process_by_zones + has_many :order_queue_process_by_zones has_many :zones, through: :order_queue_process_by_zones belongs_to :employee @@ -14,110 +14,53 @@ class OrderQueueStation < ApplicationRecord # 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) + def process_order(order, table_id, order_source = nil, pdf_status = nil ,change_to=nil, current_user=nil) oqs_stations = OrderQueueStation.active - - order_items = order.order_items if table_id.to_i > 0 - # get dining - dining = DiningFacility.find(table_id) - oqs_by_zones = OrderQueueProcessByZone.where("zone_id=#{dining.zone_id}") - booking = Booking.find_by_dining_facility_id(dining.id) - - # ToDo per item per printer + # get dining + dining = DiningFacility.find(table_id) + oqs_by_zones = OrderQueueProcessByZone.where("zone_id=#{dining.zone_id}").pluck(:order_queue_station_id) + oqs_stations = oqs_stations.select { |s| oqs_by_zones.include? s.id } + end - oqs_by_zones.each do |oqpbz| - oqs = OrderQueueStation.find(oqpbz.order_queue_station_id) - is_auto_printed = false - oqs_order_items = [] + assigned_order_items = [] + oqs_order_items_by_zones = [] - if oqs.is_active - #Get List of items - - pq_items = JSON.parse(oqs.processing_items) - #Loop through the processing items - pq_items.each do |pq_item| - #Processing through the looping items - order_items.each do |order_item| - if (pq_item == order_item.item_code) - # if oqs.id == oqpbz.order_queue_station_id - # #Same Order_items can appear in two location. - # AssignedOrderItem.assigned_order_item(order, order_item.item_code, oqs) - # else - - if (order_item.qty > 0) - if pdf_status.nil? - AssignedOrderItem.assigned_order_item(order, order_item.item_code, order_item.item_instance_code, oqs) - end - oqs_order_items.push(order_item) - end - # end - end - end + # ToDo per item per printer + oqs_stations.each do |oqs| + oqs_order_items = nil + oqs_order_items = order_items.select { |i| JSON.parse(oqs.processing_items).include? i.item_code } + assigned_order_items += oqs_order_items.map { |i| AssignedOrderItem.new({ order: order, item_code: i.item_code, instance_code: i.item_instance_code, order_queue_station: oqs, print_status: false, delivery_status: false }) } + oqs_order_items_by_zones << { oqs: oqs, oqs_order_items: oqs_order_items } + + if oqs.auto_print && order_source != "quick_service" + 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 - - if oqs.auto_print && order_source != "quick_service" - 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 - is_auto_printed = true - end - end end end - else - oqs_stations.each do |oqs| - is_auto_printed = false - oqs_order_items = [] + end - if oqs.is_active - #Get List of items - - pq_items = JSON.parse(oqs.processing_items) - #Loop through the processing items - pq_items.each do |pq_item| - #Processing through the looping items - order_items.each do |order_item| - if (pq_item == order_item.item_code) - # if oqs.id == oqpbz.order_queue_station_id - # #Same Order_items can appear in two location. - # AssignedOrderItem.assigned_order_item(order, order_item.item_code, oqs) - # else - - if (order_item.qty > 0) - if pdf_status.nil? - AssignedOrderItem.assigned_order_item(order, order_item.item_code, order_item.item_instance_code, oqs) - end - oqs_order_items.push(order_item) - end - # end - end - end - end - - if oqs.auto_print && order_source != "quick_service" - 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 - is_auto_printed = true - end - end - end + if pdf_status.nil? + ids = AssignedOrderItem.generate_ids(assigned_order_items.length) + assigned_order_items.each_with_index do |assigned_order_item, index| + assigned_order_item.assigned_order_item_id = ids[index] end - end #end else + + AssignedOrderItem.import assigned_order_items, validate: false + end end - def pay_process_order_queue (order_id, table_id) + def pay_process_order_queue (order_id, table_id) oqs_stations = OrderQueueStation.active - + order = Order.find(order_id) order_items = order.order_items @@ -129,22 +72,22 @@ class OrderQueueStation < ApplicationRecord # assign_order = AssignedOrderItem.assigned_order_item_by_job(order_id) # if ENV["SERVER_MODE"] == 'cloud' # from = request.subdomain + "." + request.domain - # else + # else # from = "" # end # ActionCable.server.broadcast "order_queue_station_channel",order: assign_order,from:from if table_id.to_i > 0 - # get dining - dining = DiningFacility.find(table_id) + # get dining + dining = DiningFacility.find(table_id) oqs_by_zones = OrderQueueProcessByZone.where("zone_id=#{dining.zone_id}") - booking = Booking.find_by_dining_facility_id(dining.id) - + booking = Booking.find_by_dining_facility_id(dining.id) + # ToDo per item per printer oqs_by_zones.each do |oqpbz| oqs = OrderQueueStation.find(oqpbz.order_queue_station_id) - is_auto_printed = false + is_auto_printed = false oqs_order_items = [] if oqs.is_active @@ -157,26 +100,26 @@ class OrderQueueStation < ApplicationRecord if (pq_item == order_item.item_code) if (order_item.qty > 0) oqs_order_items.push(order_item) - end + end end end end - + if oqs.auto_print - if oqs_order_items.length > 0 + if oqs_order_items.length > 0 if oqs.cut_per_item print_slip_item(oqs, order, oqs_order_items) - else + else print_slip(oqs, order, oqs_order_items) end is_auto_printed = true end - end + end end end else oqs_stations.each do |oqs| - is_auto_printed = false + is_auto_printed = false oqs_order_items = [] if oqs.is_active @@ -186,107 +129,63 @@ class OrderQueueStation < ApplicationRecord pq_items.each do |pq_item| #Processing through the looping items order_items.each do |order_item| - if (pq_item == order_item.item_code) + if (pq_item == order_item.item_code) if (order_item.qty > 0) oqs_order_items.push(order_item) - end + end end end end - + if oqs.auto_print - if oqs_order_items.length > 0 + if oqs_order_items.length > 0 if oqs.cut_per_item print_slip_item(oqs, order, oqs_order_items) - else + else print_slip(oqs, order, oqs_order_items) end is_auto_printed = true end - end + end end end - end #end else + end #end else 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? - printer = PrintSetting.all.order("id ASC") - unique_code="OrderSummaryPdf" - - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderSummaryPdf' - unique_code="OrderSummaryPdf" - elsif printer_setting.unique_code == 'OrderSummarySlimPdf' - unique_code="OrderSummarySlimPdf" - elsif printer_setting.unique_code == 'OrderSummarySetPdf' - unique_code="OrderSummarySetPdf" - elsif printer_setting.unique_code == 'OrderSummaryCustomisePdf' - unique_code="OrderSummaryCustomisePdf" - elsif printer_setting.unique_code == 'OrderSummarySetCustomisePdf' - unique_code="OrderSummarySetCustomisePdf" - elsif printer_setting.unique_code == 'OrderSummarySlimCustomisePdf' - unique_code="OrderSummarySlimCustomisePdf" - end - end - end - - print_settings=PrintSetting.find_by_unique_code(unique_code) - order_queue_printer= Printer::OrderQueuePrinter.new(print_settings) - order_queue_printer.print_order_summary(print_settings, oqs,order.order_id, order_items, print_status="") + 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 - - assigned =AssignedOrderItem.where("order_id = '#{ order.order_id }'").pluck(:assigned_order_item_id) - AssignedOrderItem.where('assigned_order_item_id IN (?)', assigned).update_all(print_status: true) + + AssignedOrderItem.where("order_id = ?", order.order_id).update_all(print_status: true) 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? - printer = PrintSetting.all.order("id ASC") - unique_code="OrderItemPdf" - - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderItemPdf' - unique_code="OrderItemPdf" - elsif printer_setting.unique_code == 'OrderItemStarPdf' - unique_code="OrderItemStarPdf" - elsif printer_setting.unique_code == 'OrderItemSlimPdf' - unique_code="OrderItemSlimPdf" - elsif printer_setting.unique_code == 'OrderSetItemPdf' - unique_code="OrderSetItemPdf" - elsif printer_setting.unique_code == 'OrderItemCustomisePdf' - unique_code="OrderItemCustomisePdf" - elsif printer_setting.unique_code == 'OrderSetItemCustomisePdf' - unique_code="OrderSetItemCustomisePdf" - elsif printer_setting.unique_code == 'OrderItemSlimCustomisePdf' - unique_code="OrderItemSlimCustomisePdf" - end - end - end - # order_item = OrderItem.where("order_id='#{assigned_item.order_id}' AND item_instance_code='#{assigned_item.instance_code}'").first() - # print when complete click - print_settings=PrintSetting.find_by_unique_code(unique_code) - 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="" ) + # 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 - - assigned =AssignedOrderItem.where("order_id = '#{ order.order_id }'").pluck(:assigned_order_item_id) - AssignedOrderItem.where('assigned_order_item_id IN (?)', assigned).update_all(print_status: true) + + AssignedOrderItem.where("order_id = ?", order.order_id).update_all(print_status: true) end def move_print_pdf(change_to,current_user,change_from,order_items,oqs) @@ -298,7 +197,7 @@ class OrderQueueStation < ApplicationRecord @moved_by = current_user @date = DateTime.now @shop = Shop.current_shop - unique_code = "MoveTablePdf" + unique_code = "MoveTablePdf" # pdf_no = PrintSetting.where(:unique_code => unique_code).count print_settings = PrintSetting.find_by_unique_code(unique_code) # printer_array = [] @@ -307,10 +206,10 @@ class OrderQueueStation < ApplicationRecord # for i in 0..pdf_no # if i != pdf_no # print_settings = printer_array[i] - printer = Printer::ReceiptPrinter.new(print_settings) + 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 end end diff --git a/app/models/printer/order_queue_printer.rb b/app/models/printer/order_queue_printer.rb index 5d72773c..9909539b 100755 --- a/app/models/printer/order_queue_printer.rb +++ b/app/models/printer/order_queue_printer.rb @@ -1,41 +1,18 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker - def print_order_item(print_settings,oqs, order_id, order_item_id, print_status, before_updated_qty="", options="") + def print_order_item(print_settings, oqs, order_id, order_item_id, print_status, before_updated_qty="", options="") # Must be one print if print_settings.print_copies == 0 print_settings.print_copies = 1 print_settings.save! end - order_item = print_query('order_item', order_item_id) #OrderItem.find_by_item_code(item_code) + order_item = print_query('order_item', order_item_id) #OrderItem.find_by_item_code(item_code) options = order_item[0].options - # filename = "tmp/order_item_#{order_id}_#{order_item_id}" + ".pdf" - - # pdf = OrderItemPdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - print_setting = PrintSetting.all # check for item not to show - pdf = '' # if order_item[0].price != 0 - if !print_setting.empty? - print_setting.each do |print_settings| - if print_settings.unique_code == 'OrderItemPdf' - pdf = OrderItemPdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderItemStarPdf' - pdf = OrderItemStarPdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderItemSlimPdf' - pdf = OrderItemSlimPdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderSetItemPdf' - pdf = OrderSetItemPdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderItemCustomisePdf' - pdf = OrderItemCustomisePdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderSetItemCustomisePdf' - pdf = OrderSetItemCustomisePdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderItemSlimCustomisePdf' - pdf = OrderItemSlimCustomisePdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - end - end - end + pdf = print_settings.unique_code.constantize.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) # end shop = Shop.current_shop @@ -77,9 +54,6 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker print_settings.save! end - print_setting = PrintSetting.all.order("id ASC") - order=print_query('order_summary', order_id) - shop = Shop.current_shop directory_name = 'public/orders_'+shop.shop_code Dir.mkdir(directory_name) unless File.exists?(directory_name) @@ -87,8 +61,8 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker # For Print Per Item if oqs.cut_per_item - order_items.each do|odi| - odi_item=print_query('order_item', odi.order_items_id) + order_items.each do |odi| + odi_item = print_query('order_item', odi.order_items_id) filename = directory_name + "/order_item_#{order_id}" + ".pdf" # filename = "tmp/order_item_#{order_id}" + ".pdf" @@ -97,67 +71,33 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker # check for item not to show #if odi.price != 0 - pdf = OrderItemPdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - if !print_setting.empty? - print_setting.each do |print_settings| - if print_settings.unique_code == 'OrderItemPdf' - pdf = OrderItemPdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemStarPdf' - pdf = OrderItemStarPdf.new(print_settings,order_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - elsif print_settings.unique_code == 'OrderItemSlimPdf' - pdf = OrderItemSlimPdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSetItemPdf' - pdf = OrderSetItemPdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemCustomisePdf' - pdf = OrderItemCustomisePdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSetItemCustomisePdf' - pdf = OrderSetItemCustomisePdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemSlimCustomisePdf' - pdf = OrderItemSlimCustomisePdf.new(print_settings,odi_item[0], print_status, options, oqs.use_alternate_name,before_updated_qty) - end - end - end + pdf = print_settings.unique_code.constantize.new(print_settings, odi_item[0], print_status, options, oqs.use_alternate_name, before_updated_qty) - # pdf.render_file "tmp/order_item.pdf" - pdf.render_file filename - if oqs.print_copy - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, oqs.printer_name) - # self.print(filename.gsub(".","-copy."), oqs.printer_name) - end - else - print_settings.print_copies = 1 - print_settings.save! - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, oqs.printer_name) - end + # pdf.render_file "tmp/order_item.pdf" + pdf.render_file filename + if oqs.print_copy + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, oqs.printer_name) + # self.print(filename.gsub(".","-copy."), oqs.printer_name) end + else + print_settings.print_copies = 1 + print_settings.save! + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, oqs.printer_name) + end + end #end end # For Print Order Summary else + order = print_query('order_summary', order_id) + filename = directory_name + "/order_summary_#{order_id}" + ".pdf" # filename = "tmp/order_summary_#{order_id}" + ".pdf" - pdf = OrderSummaryPdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - if !print_setting.empty? - print_setting.each do |print_settings| - if print_settings.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new(print_settings,order, print_status, order_items, oqs.use_alternate_name,before_updated_qty) - end - end - end + pdf = print_settings.unique_code.constantize.new(print_settings, order, print_status, order_items, oqs.use_alternate_name, before_updated_qty) pdf.render_file filename if oqs.print_copy @@ -190,7 +130,7 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker print_setting = PrintSetting.all.order("id ASC") - order=print_query('booking_summary', booking_id) + order = print_query('booking_summary', booking_id) shop = Shop.current_shop directory_name = 'public/orders_'+shop.shop_code @@ -206,69 +146,33 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker # check for item not to show #if odi.price != 0 - pdf = OrderItemPdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - if !print_setting.empty? - print_setting.each do |print_settings| - if print_settings.unique_code == 'OrderItemPdf' - pdf = OrderItemPdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemStarPdf' - pdf = OrderItemStarPdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemSlimPdf' - pdf = OrderItemSlimPdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSetItemPdf' - pdf = OrderSetItemPdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemCustomisePdf' - pdf = OrderItemCustomisePdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSetItemCustomisePdf' - pdf = OrderSetItemCustomisePdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderItemSlimCustomisePdf' - pdf = OrderItemSlimCustomisePdf.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - end - end - end - pdf.render_file filename + pdf = print_settings.unique_code.constantize.new(print_settings,odi, print_status, options,oqs.use_alternate_name,before_updated_qty) - if oqs.print_copy - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, oqs.printer_name) - end - #For print copy - # pdf.render_file filename.gsub(".","-copy.") - # self.print(filename.gsub(".","-copy."), oqs.printer_name) - else - print_settings.print_copies = 1 - print_settings.save! - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, oqs.printer_name) - end + pdf.render_file filename + + if oqs.print_copy + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, oqs.printer_name) end + #For print copy + # pdf.render_file filename.gsub(".","-copy.") + # self.print(filename.gsub(".","-copy."), oqs.printer_name) + else + print_settings.print_copies = 1 + print_settings.save! + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, oqs.printer_name) + end + end #end end # For Print Order Summary else # filename = "tmp/booking_summary_#{booking_id}" + ".pdf" filename = directory_name + "/booking_summary_#{booking_id}" + ".pdf" - pdf = OrderSummaryPdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - - if !print_setting.empty? - print_setting.each do |print_settings| - if print_settings.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - elsif print_settings.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) - end - end - end + pdf = print_settings.unique_code.constantize.new(print_settings,order, print_status,oqs.use_alternate_name,before_updated_qty) pdf.render_file filename if oqs.print_copy @@ -293,36 +197,23 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker # Query for OQS with status def print_query(type, id) + query = OrderItem.select("order_items.order_id, order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.options, order_items.item_order_by as order_by, order_items.created_at as order_at, order_items.set_menu_items, cus.name as customer, df.type, df.name as dining,item.alt_name as alt_name") + .joins("left join orders ON orders.order_id = order_items.order_id") + .joins("left join booking_orders AS bo ON bo.order_id=order_items.order_id") + .joins("left join bookings AS b ON b.booking_id = bo.booking_id") + .joins("left join dining_facilities AS df ON df.id = b.dining_facility_id") + .joins("left join customers as cus ON cus.customer_id = orders.customer_id") + .joins("left join menu_items as item ON item.item_code = order_items.item_code") + if type == "order_item" - OrderItem.select("order_items.order_id, order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.options, order_items.item_order_by as order_by, order_items.created_at as order_at, order_items.set_menu_items, cus.name as customer, df.type, df.name as dining,item.alt_name as alt_name") - .joins("left join orders ON orders.order_id = order_items.order_id - left join booking_orders AS bo ON bo.order_id=order_items.order_id - left join bookings AS b ON b.booking_id = bo.booking_id - left join dining_facilities AS df ON df.id = b.dining_facility_id - left join customers as cus ON cus.customer_id = orders.customer_id - left join menu_items as item ON item.item_code = order_items.item_code") - .where("order_items.order_items_id = '#{ id }'") + query.where("order_items.order_items_id = '#{ id }'") .group("order_items.item_code") elsif type == "order_summary" - OrderItem.select("order_items.order_id, order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.options, order_items.item_order_by as order_by, order_items.created_at as order_at, order_items.set_menu_items, cus.name as customer, df.type, df.name as dining,item.alt_name as alt_name") - .joins("left join orders ON orders.order_id = order_items.order_id - left join booking_orders AS bo ON bo.order_id=order_items.order_id - left join bookings AS b ON b.booking_id = bo.booking_id - left join dining_facilities AS df ON df.id = b.dining_facility_id - left join customers as cus ON cus.customer_id = orders.customer_id - left join menu_items as item ON item.item_code = order_items.item_code") - .where("orders.order_id = '#{ id }'") + query.where("orders.order_id = '#{ id }'") .group("order_items.order_items_id") else # order summary for booking - OrderItem.select("order_items.order_id, order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.options, order_items.item_order_by as order_by, order_items.created_at as order_at, order_items.set_menu_items, cus.name as customer, df.type, df.name as dining,item.alt_name as alt_name") - .joins("left join orders ON orders.order_id = order_items.order_id - left join booking_orders AS bo ON bo.order_id=order_items.order_id - left join bookings AS b ON b.booking_id = bo.booking_id - left join dining_facilities AS df ON df.id = b.dining_facility_id - left join customers as cus ON cus.customer_id = orders.customer_id - left join menu_items as item ON item.item_code = order_items.item_code") - .where("b.booking_id = '#{ id }'") + query.where("b.booking_id = '#{ id }'") end end diff --git a/app/models/printer/receipt_printer.rb b/app/models/printer/receipt_printer.rb index f7b35a5a..4d96112f 100755 --- a/app/models/printer/receipt_printer.rb +++ b/app/models/printer/receipt_printer.rb @@ -4,26 +4,9 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Use CUPS service #Generate PDF #Print - printer = PrintSetting.all - pdf = OrderItemPdf.new + printer = PrintSetting.where("unique_code REGEXP ?", "order.*item.*pdf").first + pdf = printer.unique_code.constantize.new - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderItemPdf' - pdf = OrderItemPdf.new - elsif printer_setting.unique_code == 'OrderItemSlimPdf' - pdf = OrderItemSlimPdf.new - elsif printer_setting.unique_code == 'OrderSetItemPdf' - pdf = OrderSetItemPdf.new - elsif printer_setting.unique_code == 'OrderItemCustomisePdf' - pdf = OrderItemCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSetItemCustomisePdf' - pdf = OrderSetItemCustomisePdf.new - elsif printer_setting.unique_code == 'OrderItemSlimCustomisePdf' - pdf = OrderItemSlimCustomisePdf.new - end - end - end pdf.render_file "tmp/order_item_queue_#{order_id}_#{order_item_id}" + ".pdf" #no print in cloud server if ENV["SERVER_MODE"] != "cloud" @@ -36,26 +19,9 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Generate PDF #Print filename = "tmp/order_summary_#{booking_id}" + ".pdf" - printer = PrintSetting.all - pdf = OrderSummaryPdf.new + printer = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first + pdf = printer.unique_code.constantize.new - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new - elsif printer_setting.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new - elsif printer_setting.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new - end - end - end pdf.render_file filename #no print in cloud server if ENV["SERVER_MODE"] != "cloud" @@ -67,26 +33,10 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Use CUPS service #Generate PDF #Print - printer = PrintSetting.all + printer = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first filename = "tmp/order_summary_#{booking_id}" + ".pdf" - pdf = OrderSummaryPdf.new - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new - elsif printer_setting.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new - elsif printer_setting.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new - end - end - end + pdf = printer.unique_code.constantize.new + pdf.render_file filename #no print in cloud server if ENV["SERVER_MODE"] != "cloud" @@ -98,26 +48,10 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Use CUPS service #Generate PDF #Print - printer = PrintSetting.all + printer = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first filename = "tmp/order_summary_#{booking_id}" + ".pdf" - pdf = OrderSummaryPdf.new - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new - elsif printer_setting.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new - elsif printer_setting.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new - end - end - end + pdf = printer.unique_code.constantize.new + pdf.render_file filename #no print in cloud server if ENV["SERVER_MODE"] != "cloud" @@ -129,26 +63,10 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Use CUPS service #Generate PDF #Print - printer = PrintSetting.all + printer = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first filename = "tmp/order_summary_#{booking_id}" + ".pdf" - pdf = OrderSummaryPdf.new - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new - elsif printer_setting.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new - elsif printer_setting.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new - end - end - end + pdf = printer.unique_code.constantize.new + pdf.render_file filename #no print in cloud server if ENV["SERVER_MODE"] != "cloud" @@ -160,26 +78,10 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Use CUPS service #Generate PDF #Print - printer = PrintSetting.all + printer = PrintSetting.where("unique_code REGEXP ?", "order.*summary.*pdf").first filename = "tmp/order_summary_#{booking_id}" + ".pdf" - pdf = OrderSummaryPdf.new - if !printer.empty? - printer.each do |printer_setting| - if printer_setting.unique_code == 'OrderSummaryPdf' - pdf = OrderSummaryPdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimPdf' - pdf = OrderSummarySlimPdf.new - elsif printer_setting.unique_code == 'OrderSummarySetPdf' - pdf = OrderSummarySetPdf.new - elsif printer_setting.unique_code == 'OrderSummaryCustomisePdf' - pdf = OrderSummaryCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySetCustomisePdf' - pdf = OrderSummarySetCustomisePdf.new - elsif printer_setting.unique_code == 'OrderSummarySlimCustomisePdf' - pdf = OrderSummarySlimCustomisePdf.new - end - end - end + pdf = printer.unique_code.constantize.new + pdf.render_file filename #no print in cloud server if ENV["SERVER_MODE"] != "cloud" @@ -192,31 +94,12 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Use CUPS service #Generate PDF #Print - if !printer_settings.nil? - if !printer_settings.unique_code.strip.downcase.include? ("receiptbillorder") - pdf = ReceiptBillPdf.new(printer_settings, kbz_pay_status, qr_code, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) - settings = PrintSetting.all - if !settings.nil? - settings.each do |setting| - if setting.unique_code == 'ReceiptBillPdf' - pdf = ReceiptBillPdf.new(printer_settings, kbz_pay_status, qr_code, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) - elsif setting.unique_code == 'ReceiptBillStarPdf' - pdf = ReceiptBillStarPdf.new(printer_settings, kbz_pay_status, qr_code, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) - end - end - end - - receipt_bill_a5_pdf = Lookup.collection_of("print_settings") #print_settings with name:ReceiptBillA5Pdf - if !receipt_bill_a5_pdf.empty? - receipt_bill_a5_pdf.each do |receipt_bilA5| - if receipt_bilA5[0] == 'ReceiptBillA5Pdf' - if receipt_bilA5[1] == '1' - pdf = ReceiptBillA5Pdf.new(printer_settings, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) - # else - # pdf = ReceiptBillPdf.new(printer_settings, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) - end - end - end + if printer_settings + if !printer_settings.unique_code.match?(/receiptbillorder/i) + if Lookup.collection_of("print_settings").any? { |x| x == ["ReceiptBillA5Pdf", "1"] } #print_settings with name:ReceiptBillA5Pdf + pdf = ReceiptBillA5Pdf.new(printer_settings, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) + else + pdf = PrintSetting.where("unique_code REGEXP ?", "receipt.*bill.*pdf").first.unique_code.constantize.new(printer_settings, kbz_pay_status, qr_code, sale_items, sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details,printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount) end else #doemal online order pdf template diff --git a/app/models/product.rb b/app/models/product.rb index 3256fe17..5d1a5fe6 100755 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -5,29 +5,23 @@ class Product < ApplicationRecord mount_uploader :image_path, ProductImageUploader def self.search_by_product_code(item_code) - account = Account.find_by_title('Product') - if !account.nil? - account_id = account.id - else - account_id = 1 - end - - menu_item_hash = Hash.new - mt_instance = Product.find_by_item_code(item_code) - if (!mt_instance.nil?) - menu_item_hash[:type] = 'Product' - menu_item_hash[:account_id] = account_id - menu_item_hash[:item_code] = mt_instance.item_code - menu_item_hash[:item_instance_code] = mt_instance.item_code - menu_item_hash[:name] = mt_instance.name.to_s - menu_item_hash[:alt_name] = mt_instance.alt_name.to_s - menu_item_hash[:price] = mt_instance.unit_price - menu_item_hash[:promotion_price] = 0 - menu_item_hash[:is_on_promotion] = 0 - menu_item_hash[:is_available] = 0 - menu_item_hash[:taxable] = mt_instance.taxable - - return menu_item_hash - end -end + Product.joins("JOIN accounts ON accounts.title = 'Product'") + .where(item_code: item_code) + .pluck("accounts.id AS account_id", :item_code, :name, :alt_name, :unit_price, :taxable) + .map { |account_id, item_code, item_name, item_alt_name, price, taxable| + { + type: 'Product', + account_id: account_id, + item_code: item_code, + item_instance_code: item_code, + name: item_name || '', + alt_name: item_name || '', + price: price, + promotion_price: 0, + is_on_promotion: 0, + is_available: 0, + taxable: taxable + } + } + end end diff --git a/app/models/sale.rb b/app/models/sale.rb index c7a05189..27d0416c 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -684,14 +684,6 @@ class Sale < ApplicationRecord self.total_tax = total_tax_amount end - def product_get_unit_price(item_code) - menu_item_hash =MenuItem.search_by_item_code(item_code) - if (menu_instance_code) - return menu_ item_hash[:item_instance_code], menu_item_hash[:price] - end - return nil,nil - end - def link_order_sale(order_id) #create if it doesn't exist saleOrder = SaleOrder.where("sale_id=? and order_id=?", self.id, order_id).take diff --git a/app/models/seed_generator.rb b/app/models/seed_generator.rb index 2a363dd8..b8224377 100755 --- a/app/models/seed_generator.rb +++ b/app/models/seed_generator.rb @@ -9,13 +9,22 @@ class SeedGenerator < ApplicationRecord cur_val, next_val = self.update_seed(model_name) - if (cur_val == 0) - cur_val, next_val = self.execute_query(model_name) + padding_len = 15 - prefix.length + saleOrderId = prefix +"-"+ cur_val.to_s.to_s.rjust(padding_len,'0') + return saleOrderId + end + + def self.generate_ids(model, prefix, count = 1) + model_name = self.get_model_name(model) + + if ENV["SERVER_MODE"] == 'cloud' + prefix = "C#{prefix}" end - padding_len = 15 - prefix.length - saleOrderId = prefix +"-"+ cur_val.to_s.to_s.rjust((14-prefix.length)+1,'0') - return saleOrderId + start = self.update_seed(model_name, count) + stop = start + count - 1 + length = 15 - prefix.length + (start..stop).map { |c| "#{prefix}-#{c.to_s.rjust(length, '0')}" } end def self.sync_seed_generator_records(seed_generators) @@ -58,7 +67,7 @@ class SeedGenerator < ApplicationRecord end end - return new_receipt_no + return new_receipt_no end # Generate for 4 digit Code @@ -85,7 +94,7 @@ class SeedGenerator < ApplicationRecord # padding_len = 6 - prefix.length # count = 5-prefix.length # end - # next_code = prefix + seed.current.to_s.to_s.rjust((count)+1,'0') + # next_code = prefix + seed.current.to_s.to_s.rjust((count)+1,'0') # return next_code # end @@ -100,41 +109,13 @@ class SeedGenerator < ApplicationRecord return model_name end - def self.execute_query(model) - current = 0 - nex = 0 - - sql = "INSERT INTO seed_generators (model, created_at, updated_at) - VALUES('#{ model }', NOW(), NOW()) - ON DUPLICATE KEY UPDATE current = current + 1, next = next + 1;" - - select_sql = "select * from seed_generators where model='#{model}';" - ActiveRecord::Base.connection.execute(sql); - select_result = ActiveRecord::Base.connection.execute(select_sql); - - select_result.each do |row| - current = row [3] - nex = row[4] + def self.update_seed(model, count = 1) + SeedGenerator.transaction do + seed = SeedGenerator.lock.find_by_model(model) + seed.next = seed.next + (count * seed.increase_by) + seed.current = seed.next - seed.increase_by + seed.save! + seed.next_before_last_save end - - return current, nex - end - - def self.update_seed(model) - current = 0 - nex = 0 - - update_sql = "UPDATE seed_generators set current = next, next = next + 1 WHERE model='#{model}';" - select_sql = "select * from seed_generators where model='#{model}';" - update_result = ActiveRecord::Base.connection.execute(update_sql); - - select_result = ActiveRecord::Base.connection.execute(select_sql); - - select_result.each do |row| - current = row [3] - nex = row[4] - end - - return current, nex end end diff --git a/app/views/origami/addorders/detail.html.erb b/app/views/origami/addorders/detail.html.erb index e7abb58b..daa12b33 100644 --- a/app/views/origami/addorders/detail.html.erb +++ b/app/views/origami/addorders/detail.html.erb @@ -52,7 +52,7 @@ <% end%> <% else %> - <% if @table.get_current_checkout_booking.nil? %> + <% if @table.current_checkout_booking.nil? %> <% if !menu.code.include? "SPL" %>