diff --git a/Gemfile b/Gemfile index 92b133de..6d6a2397 100644 --- a/Gemfile +++ b/Gemfile @@ -18,7 +18,7 @@ gem 'pg' gem 'mysql2', '~> 0.5.2' #Use PosgreSQL - +gem "select2-rails" # redis server for cable gem 'redis', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 578d79d3..eff1b2cb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -264,6 +264,7 @@ GEM tilt (>= 1.1, < 3) schema_to_scaffold (0.8.0) activesupport (>= 3.2.1) + select2-rails (4.0.13) shoulda-matchers (3.1.3) activesupport (>= 4.0.0) sidekiq (5.2.7) @@ -367,6 +368,7 @@ DEPENDENCIES rubyzip (= 1.0.0) sass-rails (~> 5.0) schema_to_scaffold + select2-rails shoulda-matchers (~> 3.1) sidekiq simple_form diff --git a/README.md b/README.md index 981a0335..374cecd4 100755 --- a/README.md +++ b/README.md @@ -77,6 +77,9 @@ For Using Star Printer **_ Need to change these print settings 1) settings/print_settings/unique_code => OrderItemStarPdf 2) settings/print_settings/unique_code => ReceiptBillStarPdf 3) settings/print_settings/unique_code => SaleItemsStarPdf _** Other print settings aren't need to change. +For Cloud ActionCable Print +settings/lookups => { type: print_settings, name: ActionCable, value: 1 } + For Show Sale Items Summary at CloseCashierPrint 1) settings/print_settings a) Check => Shift Sale Items diff --git a/app/assets/javascripts/OQS.js b/app/assets/javascripts/OQS.js index 68cf44d7..76413675 100755 --- a/app/assets/javascripts/OQS.js +++ b/app/assets/javascripts/OQS.js @@ -402,17 +402,17 @@ $(document).on('turbolinks:load', function() { url: '/oqs/print/print/'+assigned_item_id, data: params, success: function(result){ - // For Server Print - from jade - if ($("#server_mode").val() == "cloud") { - if(typeof code2lab != 'undefined'){ - code2lab.printFile(result.filepath.substr(6), result.printer_url); - } - } - location.reload(); - + if (!$('#print_settings').data('action-cable')) { + // For Server Print - from jade + if ($("#server_mode").val() == "cloud") { + if(typeof code2lab != 'undefined'){ + code2lab.printFile(result.filepath.substr(6), result.printer_url); + } + } + } + location.reload(); } }); - }); // Print Order Summary @@ -428,13 +428,15 @@ $(document).on('turbolinks:load', function() { url: '/oqs/print/print_order_summary/'+assigned_item_id, data: params, success: function(result){ - // For Server Print - from jade - if ($("#server_mode").val() == "cloud") { - if(typeof code2lab != 'undefined'){ - code2lab.printFile(result.filepath.substr(6), result.printer_url); - } - } - location.reload(); + if (!$('#print_settings').data('action-cable')) { + // For Server Print - from jade + if ($("#server_mode").val() == "cloud") { + if(typeof code2lab != 'undefined'){ + code2lab.printFile(result.filepath.substr(6), result.printer_url); + } + } + } + location.reload(); } }); }); diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index bd9018fb..7317b338 100755 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -36,6 +36,7 @@ //= require custom.js //= require jquery-fileupload/basic //= require induties/induties.js +//= require select2 $(document).ready(function() { $('.count-to').countTo(); @@ -65,7 +66,7 @@ $(document).ready(function() { clearButton: true, date: false }); - + // Image Upload $("#simple_menu_item_image_path").fileinput({ previewFileType: "image", @@ -148,7 +149,7 @@ $(document).ready(function() { '\n', } }); - + $("#commissioner_image_path").fileinput({ previewFileType: "image", allowedFileExtensions: ["jpg", "gif", "png"], @@ -167,7 +168,7 @@ $(document).ready(function() { ' {caption}\n' + '\n', } - }); + }); $("#employee_image_path").fileinput({ previewFileType: "image", @@ -187,7 +188,7 @@ $(document).ready(function() { ' {caption}\n' + '\n', } - }); + }); $("#shop_image").fileinput({ previewFileType: "image", @@ -227,7 +228,7 @@ $(document).ready(function() { ' {caption}\n' + '\n', } - }); + }); // first input focus for all form $('form:first *input[data-behaviour!=datepicker]:input[type!=hidden]:first').focus(); @@ -252,4 +253,4 @@ Chart.scaleService.updateScaleDefaults('linear', { } } }); -/* chartkick js YAxis value override */ \ No newline at end of file +/* chartkick js YAxis value override */ diff --git a/app/assets/javascripts/order_reservation.js b/app/assets/javascripts/order_reservation.js index f74f1fa9..6c141ddc 100644 --- a/app/assets/javascripts/order_reservation.js +++ b/app/assets/javascripts/order_reservation.js @@ -1,6 +1,6 @@ //= require custom.js -$(function() { +$(function() { $("#discount").hide(); $(".expected_time").hide(); $('#accepted').hide(); @@ -11,7 +11,7 @@ $(function() { $(".accepted_time").hide(); $(".kitchen_time").hide(); $(".ready_time").hide(); - $(function() { + $(function() { $('.first-1').click(); }); @@ -213,8 +213,8 @@ $(function() { function warnBeforeRedirect(linkURL) { swal({ - title: "Alert!", - text: "Are you sure you want to close cashier?", + title: "Alert!", + text: "Are you sure you want to close cashier?", type: "warning", showCancelButton: true }, function() { @@ -278,13 +278,13 @@ function refreshDetailData(){ $("#payment_type").text(""); } -//show order list -function show_order_detail(url,sr_no){ +//show order list +function show_order_detail(url,sr_no){ // $('.summary-items').html(""); //Start Ajax - $.ajax({ - type: "GET", - url: url, + $.ajax({ + type: "GET", + url: url, data: {}, dataType: "json", success: function(data) { @@ -334,12 +334,12 @@ function show_order_detail(url,sr_no){ $("#ready_delivery_time").html(ready_time); } } - + var newDate = new Date(data.requested_time); var time = timeFormat(newDate); // var requested_date = newDate.getFullYear() + '-' + (newDate.getMonth() >= 10? newDate.getMonth() : '0' + (newDate.getMonth() + 1)) +'-'+ (newDate.getDate() >= 10? newDate.getDate() : '0' + newDate.getDate()) +' '+time; var requested_date = getOrderMonth(newDate.getMonth()) +' '+ (newDate.getDate() >= 10? newDate.getDate() : '0' + newDate.getDate()) +', '+newDate.getFullYear()+'('+getOrderDay(newDate.getDay())+')'+' '+time; - + if((data.expected_waiting_time!=undefined) && (data.expected_waiting_time!=null)){ // var expDate = new Date(data.expected_waiting_time); // var exptime = timeFormat(expDate); @@ -367,7 +367,7 @@ function show_order_detail(url,sr_no){ if(items!=undefined && items!=""){ if(items.length > 0){ - for(var i in items) { + for(var i in items) { var item_price = 0; if(items[i].price > 0){ item_price = items[i].price; @@ -378,7 +378,7 @@ function show_order_detail(url,sr_no){ var check_mobile =document.getElementsByName("summary_items_mobile")[0].value; if (check_mobile == "true"){ if(items[i].options!='[]' && items[i].options!="" && items[i].options!=null){ - row = + row = '' +''+items[i].item_name +'
' @@ -417,8 +417,8 @@ function show_order_detail(url,sr_no){ } } - - + + $('.summary-items').append(row); } @@ -452,7 +452,7 @@ function show_order_detail(url,sr_no){ }else if(data.payment_type == "dinga"){ $("#payment_type").text("DINGA"); } - + $('#ref_no').text(data.transaction_ref); $('#callback_url').text(data.callback_url); $('#order_id').text(data.order_reservation_id); @@ -494,16 +494,16 @@ function show_order_detail(url,sr_no){ }else{ $("#invoice_no").text(data["order_reservation_id"]); } - + } } } }); - //end Ajax + //end Ajax } -function callback_url(callback,ref_no,order_id,status,min_type,time,exptime,reason,approved_code){ +function callback_url(callback,ref_no,order_id,status,min_type,time,exptime,reason,approved_code){ var url = 'order_reservation/update'; var post_url = "order_reservation/send_status"; var waiting_time = ""; @@ -527,16 +527,16 @@ function callback_url(callback,ref_no,order_id,status,min_type,time,exptime,reas access_code = approved_code; } - // $.ajax({ - // type: "POST", - // url: post_url, + // $.ajax({ + // type: "POST", + // url: post_url, // data: {url: callback, ref_no: ref_no, status: status, waiting_time: waiting_time, min_type: type, reason: reject_reason}, // dataType: "json", // success: function(data) { // if(data.status){ - $.ajax({ - type: "POST", - url: url, + $.ajax({ + type: "POST", + url: url, data: {order_id: order_id, ref_no: ref_no, status: status, min_type: min_type, expected_time: waiting_time, remark: reason, access_code: access_code}, dataType: "json", success: function(data) { @@ -711,7 +711,7 @@ function getOrderDay(day){ function timeFormat(date){ var isPM = date.getHours() >= 12; var isMidday = date.getHours() == 12; - var time = [(date.getHours()>10? date.getHours() : '0'+date.getHours()) - (isPM && !isMidday ? 12 : 0), + var time = [(date.getHours()>10? date.getHours() : '0'+date.getHours()) - (isPM && !isMidday ? 12 : 0), (date.getMinutes()>10? date.getMinutes() : '0'+date.getMinutes()) || '00'].join(':') + (isPM ? ' PM' : ' AM'); return time; @@ -722,8 +722,8 @@ function timeFormat(date){ function getOnlineOrderCount(){ var count = 0; //Start Ajax - $.ajax({ - async: false, + $.ajax({ + async: false, type: "GET", url: "/origami/get_order_info", dataType: "json", @@ -733,7 +733,7 @@ function getOnlineOrderCount(){ } } }); - //end Ajax + //end Ajax // alert(count); return count; } @@ -748,31 +748,33 @@ function print_receipt(){ var params = { 'filename':filename, 'receipt_no':receipt_no, 'printer_name':printer_name }; console.log(params); $.ajax({ - type: "POST", + type: "POST", url: "/origami/sale/"+sale_id+"/doemal_order/payment/print", data: params, success:function(result){ - // For Server Print - from jade - if ($("#server_mode").val() == "cloud") { - if(typeof code2lab != 'undefined'){ - code2lab.printFile(result.filepath.substr(6), result.printer_url); + if (!$('#print_settings').data('action-cable')) { + // For Server Print - from jade + if ($("#server_mode").val() == "cloud") { + if(typeof code2lab != 'undefined'){ + code2lab.printFile(result.filepath.substr(6), result.printer_url); + } + window.location.href = '/origami/order_reservation'; + } + else{ + swal({ + title: "Print Success", + text: "Complete Order", + type: 'success', + html: true, + closeOnConfirm: false, + closeOnCancel: false, + allowOutsideClick: false + }, function () { + window.location.href = '/origami/order_reservation'; + }); } - window.location.href = '/origami/order_reservation'; - } - else{ - swal({ - title: "Print Success", - text: "Complete Order", - type: 'success', - html: true, - closeOnConfirm: false, - closeOnCancel: false, - allowOutsideClick: false - }, function () { - window.location.href = '/origami/order_reservation'; - }); } } }); } -/* pdf print out */ \ No newline at end of file +/* pdf print out */ diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index ee797cf8..3c3de041 100755 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -12,6 +12,8 @@ @import "BSBMaterial/themes/all-themes"; @import "reset"; @import "induties/assign_in_duties"; +@import "select2"; +@import "select2-material"; /*@import "bootstrap-select/css/bootstrap-select.min";*/ diff --git a/app/assets/stylesheets/select2-material.css b/app/assets/stylesheets/select2-material.css new file mode 100644 index 00000000..a52e1654 --- /dev/null +++ b/app/assets/stylesheets/select2-material.css @@ -0,0 +1,231 @@ +.select2-container--material { + width: 100% !important; } + .select2-container--material .select2-selection--single { + background-color: transparent; + border: none; + border-bottom: 1px solid rgba(0,0,0,0.26); + border-radius: 0; + box-shadow: none; + box-sizing: content-box; + height: auto; + margin: 0; + outline: none; + padding: 0.46875rem 0 0.40625rem 0; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + .select2-container--material .select2-selection--single .select2-selection__rendered { + color: #444; + font-size: 1rem; + line-height: 18px; + padding-left: 0; } + .select2-container--material .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--material .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--material .select2-selection--single .select2-selection__arrow { + height: 20px; + margin: 0.5rem 0 0.2rem 0; + position: absolute; + line-height: 1rem; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--material .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } + .select2-container--material[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } + .select2-container--material[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } + .select2-container--material.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--material.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } + .select2-container--material.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } + .select2-container--material .select2-selection--multiple { + background-color: transparent; + border: none; + border-bottom: 1px solid #ced4da; + border-radius: 0; + box-shadow: none; + box-sizing: content-box; + cursor: text; + height: auto; + margin: 0; + outline: none; + padding: 5px 0 0 0; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } + .select2-container--material .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--material .select2-selection--multiple .select2-selection__rendered li { + list-style: none; } + .select2-container--material .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; } + .select2-container--material .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; } + .select2-container--material .select2-selection--multiple .select2-selection__choice { + background-color: #ffca28; + border-radius: 16px; + color: rgba(0, 0, 0, 0.6); + cursor: default; + float: left; + margin-right: 5px; + margin-top: 6px; + padding: 0 12px; } + .select2-container--material .select2-selection--multiple .select2-selection__choice__remove { + cursor: pointer; + display: inline-block; + font-weight: bold; + float: right; + margin-left: 5px; } + .select2-container--material .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } + .select2-container--material[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--material[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--material[dir="rtl"] .select2-selection--multiple .select2-search--inline { + float: right; } + .select2-container--material[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } + .select2-container--material[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } + .select2-container--material.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } + .select2-container--material.select2-container--disabled .select2-selection__choice__remove { + display: none; } + .select2-container--material.select2-container--open.select2-container--above .select2-selection--single, .select2-container--material.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } + .select2-container--material.select2-container--open.select2-container--below .select2-selection--single, .select2-container--material.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + .select2-container--material.select2-container--focus .select2-selection--single { + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + outline: 0; } + .select2-container--material.select2-container--focus .select2-selection--multiple { + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + outline: 0; } + .select2-container--material .select2-search--dropdown .select2-search__field { + border: none; + border-bottom: 1px solid #ced4da; + border-radius: 0; + outline: none; } + .select2-container--material .select2-search--dropdown .select2-search__field:focus:not([readonly]) { + box-shadow: 0 1px 0 0 #ced4da; + border-bottom: 1px solid #ced4da; } + .select2-container--material .select2-search--inline .select2-search__field { + background: transparent; + border: none !important; + outline: 0; + box-shadow: none !important; + -webkit-appearance: textfield; } + .select2-container--material .select2-results > .select2-results__options { + overflow-y: auto; } + .select2-container--material .select2-results__option[role=group] { + padding: 0; } + .select2-container--material .select2-results__option[aria-disabled=true] { + color: #999; } + .select2-container--material .select2-results__option[aria-selected=true] { + background-color: #ddd; } + .select2-container--material .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--material .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--material .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--material .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--material .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--material .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--material .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } + .select2-container--material .select2-results__option--highlighted[aria-selected] { + background-color: #3f729b; + color: white; } + .select2-container--material .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-dropdown { + background-color: white; + border: 1px solid #ced4da; + border-radius: 4px; + box-sizing: border-box; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; + -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } diff --git a/app/channels/print_channel.rb b/app/channels/print_channel.rb new file mode 100644 index 00000000..b27223e1 --- /dev/null +++ b/app/channels/print_channel.rb @@ -0,0 +1,10 @@ +class PrintChannel < ApplicationCable::Channel + def subscribed + stream_from "print_channel_#{params[:shop_code]}" + end + + def unsubscribed + # Any cleanup needed when channel is unsubscribed + stop_all_streams + end +end diff --git a/app/controllers/api/call_waiters_controller.rb b/app/controllers/api/call_waiters_controller.rb index beb676c7..08a322fa 100644 --- a/app/controllers/api/call_waiters_controller.rb +++ b/app/controllers/api/call_waiters_controller.rb @@ -28,6 +28,4 @@ class Api::CallWaitersController < Api::ApiController printer = Printer::ReceiptPrinter.new(print_settings) printer.print_call_waiter(print_settings,@table,@time,@shop) end - - end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 4f161fb4..846640f3 100755 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -27,7 +27,7 @@ private crm_root_path elsif current_user.role == "account" reports_dailysale_index_path - elsif @current_user.role == "kitchen" + elsif current_user.role == "kitchen" oqs_root_path else login_path diff --git a/app/controllers/oqs/print_controller.rb b/app/controllers/oqs/print_controller.rb index 751e1c01..a5eca433 100755 --- a/app/controllers/oqs/print_controller.rb +++ b/app/controllers/oqs/print_controller.rb @@ -51,7 +51,6 @@ class Oqs::PrintController < ApplicationController ai.save end - # filename, receipt_no, cashier_printer = printer.print_receipt_bill(print_settings, false, nil,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) if ENV["SERVER_MODE"] == "cloud" result = { :filepath => filename, @@ -119,7 +118,6 @@ class Oqs::PrintController < ApplicationController ai.save end - # filename, receipt_no, cashier_printer = printer.print_receipt_bill(print_settings, false, nil,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) if ENV["SERVER_MODE"] == "cloud" result = { :filepath => filename, diff --git a/app/controllers/origami/home_controller.rb b/app/controllers/origami/home_controller.rb index ad135e03..d7a0ea49 100755 --- a/app/controllers/origami/home_controller.rb +++ b/app/controllers/origami/home_controller.rb @@ -30,45 +30,40 @@ class Origami::HomeController < BaseOrigamiController @status_order = "" @status_sale = "" - @sale_array = Array.new @shop = shop_detail @membership = MembershipSetting::MembershipSetting @payment_methods = PaymentMethodSetting.all - @dining_booking = @dining.current_bookings - @order_items = Array.new - @dining_booking.each do |booking| - if @obj_sale || @booking.blank? - @booking = booking - end + @sale_array = @dining.current_sales + if (booking = @dining.current_checkin_booking) + @booking = booking + @order_items = booking.order_items + @obj_order = booking.orders.first + 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 (booking = @dining.current_checkout_booking) + @booking = booking + @obj_sale = booking.sale + @sale_taxes = @obj_sale.sale_taxes + @status_sale = 'sale' + end - if @obj_sale || @customer.blank? - if obj = @obj_sale || @obj_order - @customer = obj.customer - @date = obj.created_at - end + if @obj_sale || @customer.blank? + if obj = @obj_sale || @obj_order + @customer = obj.customer + @date = obj.created_at end + end - if @obj_sale - @status_order = 'sale' - else - @status_order = 'order' - end + if @obj_sale + @status_order = 'sale' + elsif @obj_order + @status_order = 'order' + end - if (@obj_sale || @account_arr.blank?) && @customer - @account_arr = TaxProfile.find_by(id: @customer.tax_profiles) - end + if (@obj_sale || @account_arr.blank?) && @customer + @account_arr = TaxProfile.find_by(id: @customer.tax_profiles) end #for bank integration diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 8b5416cf..90130757 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -132,14 +132,6 @@ class Origami::PaymentsController < BaseOrigamiController ) end - # For Print - # if ENV["SERVER_MODE"] != "cloud" #no print in cloud server - if Lookup.collection_of("print_settings").any? { |x| x == ["ReceiptBillA5Pdf", "1"] } #print_settings with name:ReceiptBillA5Pdf - unique_code = "ReceiptBillA5Pdf" - else - unique_code = PrintSetting.where("unique_code REGEXP ?", "receipt.*bill.*pdf").first.unique_code - end - customer = saleObj.customer # get member information @@ -197,12 +189,17 @@ class Origami::PaymentsController < BaseOrigamiController card_balance_amount = SaleAudit.getCardBalanceAmount(sale_id) # get printer info - print_settings = PrintSetting.find_by_unique_code(unique_code) + if type.strip.downcase == 'doemal_order' + print_settings = PrintSetting.where(unique_code: 'ReceiptBillOrderPdf').first + else + print_settings = PrintSetting.where("unique_code REGEXP ?", "receipt.*bill.*pdf").first + end # Calculate Food and Beverage Total item_price_by_accounts = SaleItem.calculate_price_by_accounts(saleObj.sale_items) discount_price_by_accounts = SaleItem.get_discount_price_by_accounts(saleObj.sale_items) other_amount = SaleItem.calculate_other_charges(sale_items) credit_pdf = Lookup.find_by_lookup_type("credit_pdf") + if (path.include? ("credit_payment")) && !credit_pdf.nil? && credit_pdf.value.to_i == 1 printed_status = 'credit_payment' else @@ -211,13 +208,10 @@ class Origami::PaymentsController < BaseOrigamiController printer = Printer::ReceiptPrinter.new(print_settings) filename, sale_receipt_no, printer_name = printer.print_receipt_bill(print_settings, false, nil, cashier_terminal,sale_items,saleObj,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_detail, printed_status,current_balance,card_data,other_amount,latest_order_no,card_balance_amount,nil) - - #end - - if !saleObj.nil? - # InventoryJob.perform_now(self.id) - # InventoryDefinition.calculate_product_count(saleObj) - end + # if !saleObj.nil? + # InventoryJob.perform_now(self.id) + # InventoryDefinition.calculate_product_count(saleObj) + # end end # status, filename, sale_receipt_no, printer_name = Payment.pay(getCloudDomain, cash, sale_id, member_info, type, tax_type, path, latest_order_no, shop_detail, current_user, nil, nil) @@ -275,7 +269,7 @@ class Origami::PaymentsController < BaseOrigamiController @payment_methods = PaymentMethodSetting.where(is_active: true).pluck(:payment_method) @cash = payments.inject(0) { |sum, payment| sum + payment[1] if payment[0] == 'cash' } - @credit = payments.inject(0) { |sum, payment| sum + payment[1] if payment[0] == 'creditnote' } + @credit = payments.inject(0) { |sum, payment| payment[0] == 'creditnote' ? sum + payment[1] : sum } @other_payments = payments.select { |payment| !['cash', 'creditnote', 'foc'].include? payment[0] }.map { |method, amount| [ @payment_methods.find { |payment_method| payment_method.parameterize == method }, amount ] } @other_payment = @other_payments.sum { |payment| payment[1] } @@ -610,34 +604,13 @@ class Origami::PaymentsController < BaseOrigamiController cashier_type = params[:type] if cashier_type.strip.downcase == "doemal_order" - unique_code = "ReceiptBillOrderPdf" + print_settings = PrintSetting.where(unique_code: 'ReceiptBillOrderPdf').first else - receipt_bill_a5_pdf = Lookup.collection_of("print_settings") #print_settings with name:ReceiptBillA5Pdf - 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 - 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 = "ReceiptBillPdf" - end - end - end - end + print_settings = PrintSetting.where("unique_code REGEXP ?", "receipt.*bill.*pdf").first end + # get printer info - print_settings = PrintSetting.find_by_unique_code(unique_code) + # print_settings = PrintSetting.find_by_unique_code(unique_code) printer = Printer::ReceiptPrinter.new(print_settings) printer.print_receipt_pdf(filename,receipt_no,print_settings.print_copies,printer_name) diff --git a/app/controllers/origami/shifts_controller.rb b/app/controllers/origami/shifts_controller.rb index be13f2d0..a4c282d0 100755 --- a/app/controllers/origami/shifts_controller.rb +++ b/app/controllers/origami/shifts_controller.rb @@ -67,10 +67,7 @@ class Origami::ShiftsController < BaseOrigamiController end end - if ENV["SERVER_MODE"] != "cloud" #no print in cloud server - - - + # if ENV["SERVER_MODE"] != "cloud" #no print in cloud server # if !close_cashier_print[0].nil? # @close_cashier_print = close_cashier_print[0][1] # end @@ -90,13 +87,11 @@ class Origami::ShiftsController < BaseOrigamiController end shop_details = shop_detail #get tax - shift_obj = ShiftSale.where('id =?',@shift.id) - sale_items = '' + shift_obj = ShiftSale.where('id = ?', @shift.id) @lookup = Lookup.shift_sale_items_lookup_value if @lookup.to_i == 1 - @sale_items = Sale.get_shift_sale_items(@shift.id) - other_charges = Sale.get_other_charges() - @total_other_charges_info = other_charges.where("sales.shift_sale_id IN (?) and sale_status='completed'",@shift) + @sale_items = Sale.get_shift_sale_items(@shift.id) + @total_other_charges_info = ShiftSale.get_other_charges(@shift) end @sale_taxes = Sale.get_separate_tax(shift_obj,from=nil,to=nil,type='') @total_waste = Sale.get_total_waste(shift_id).sum(:grand_total) @@ -118,16 +113,11 @@ class Origami::ShiftsController < BaseOrigamiController printer = Printer::CashierStationPrinter.new(print_settings) # print close cashier setting - close_cashier_print = Lookup.collection_of('close_cashier_print') - if close_cashier_print.empty? - @settings_lookup = Lookup.new(lookup_type: "close_cashier_print", name: "CloseCashierPrint", value: "1") - @settings_lookup.save - end - find_close_cashier_print = Lookup.collection_of('close_cashier_print') - if find_close_cashier_print[0][1].to_i > 0 - printer.print_close_cashier(print_settings,cashier_terminal,@shift, @sale_items, @total_other_charges_info, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments,@payment_methods) - end - end + if Lookup.collection_of('close_cashier_print').any? { |l| l == ['CloseCashierPrint', '1'] } + printer.print_close_cashier(print_settings, cashier_terminal, @shift, @sale_items, @total_other_charges_info, shop_details, @sale_taxes, @other_payment, @total_amount_by_account, @total_discount_by_account, @total_member_discount, @total_dinein, @total_takeway, @total_other_charges, @total_waste, @total_spoile, @total_credit_payments, @payment_methods) + end + # end + end Employee.logout(session[:session_token]) session[:session_token] = nil diff --git a/app/controllers/reports/shiftsale_controller.rb b/app/controllers/reports/shiftsale_controller.rb index ce927f8e..1434b93c 100755 --- a/app/controllers/reports/shiftsale_controller.rb +++ b/app/controllers/reports/shiftsale_controller.rb @@ -53,28 +53,31 @@ class Reports::ShiftsaleController < BaseReportController @shift = ShiftSale.find_by_id(shift_id) shift_obj = ShiftSale.where('id =?',shift_id) + close_cashier_pdf = Lookup.collection_of("print_settings") - if ENV["SERVER_MODE"] != "cloud" #no print in cloud server + unique_code = "CloseCashierPdf" - close_cashier_pdf = Lookup.collection_of("print_settings") - - unique_code = "CloseCashierPdf" - - if !close_cashier_pdf.empty? - close_cashier_pdf.each do |close_cashier| - if close_cashier[0] == 'CloseCashierCustomisePdf' - if close_cashier[1] == '1' - unique_code="CloseCashierCustomisePdf" - else - unique_code="CloseCashierPdf" - end + if !close_cashier_pdf.empty? + close_cashier_pdf.each do |close_cashier| + if close_cashier[0] == 'CloseCashierCustomisePdf' + if close_cashier[1] == '1' + unique_code="CloseCashierCustomisePdf" + else + unique_code="CloseCashierPdf" end end end - + end shop_details = shop_detail cashier_terminal = @shift.cashier_terminal + + @lookup = Lookup.shift_sale_items_lookup_value + if @lookup.to_i == 1 + @sale_items = Sale.get_shift_sale_items(@shift.id) + @total_other_charges_info = ShiftSale.get_other_charges(@shift) + end + @sale_taxes = Sale.get_separate_tax(shift_obj,from=nil,to=nil,type='') @total_waste = Sale.get_total_waste(shift_id).sum(:grand_total) @total_spoile = Sale.get_total_spoile(shift_id).sum(:grand_total) @@ -96,14 +99,10 @@ class Reports::ShiftsaleController < BaseReportController printer = Printer::CashierStationPrinter.new(print_settings) # printer.print_close_cashier(print_settings,cashier_terminal,@shift, nil, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments) - printer.print_close_cashier(print_settings,cashier_terminal,@shift, @sale_items, @total_other_charges_info, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments,@payment_methods) + printer.print_close_cashier(print_settings, cashier_terminal, @shift, @sale_items, @total_other_charges_info, shop_details, @sale_taxes, @other_payment, @total_amount_by_account, @total_discount_by_account, @total_member_discount, @total_dinein, @total_takeway, @total_other_charges, @total_waste, @total_spoile, @total_credit_payments, @payment_methods) respond_to do |format| format.html { redirect_to '/en/reports/shiftsale/', notice: 'Printing Completed.'} - format - end end end - - end diff --git a/app/helpers/print_settings_helper.rb b/app/helpers/print_settings_helper.rb index 3e712d7c..6f14d22e 100755 --- a/app/helpers/print_settings_helper.rb +++ b/app/helpers/print_settings_helper.rb @@ -1,2 +1,5 @@ module PrintSettingsHelper + def print_settings + tag.div id: 'print_settings', class: 'hidden', data: { action_cable: Lookup.collection_of('print_settings').any? { |x| x == ["ActionCable", "1"] } } + end end diff --git a/app/models/booking.rb b/app/models/booking.rb index 3add744b..760a3350 100755 --- a/app/models/booking.rb +++ b/app/models/booking.rb @@ -58,9 +58,9 @@ class Booking < ApplicationRecord end end - scope :active, -> {where("booking_status != 'moved'")} - scope :today, -> {where("created_at >= #{Time.now.utc}")} - scope :assign, -> { where(booking_status: 'assign')} + scope :active, -> { where('booking_status != ?', 'moved') } + scope :today, -> { where('created_at >= ?', Time.now) } + scope :assign, -> { where(booking_status: 'assign') } def self.sync_booking_records(bookings) if !bookings.nil? @@ -171,6 +171,15 @@ class Booking < ApplicationRecord return @orders, @order_items, @sales, @sale_items, @sale_taxes, @sale_payments, @sale_orders, @sale_audits, @bookings, @assigned_order_items, @shift_sales end + def self.get_booking_id(order_no) + booking = Booking.joins(" JOIN booking_orders bo ON bo.booking_id = bookings.booking_id") + .joins(" JOIN orders o ON o.order_id=bo.order_id") + .where("o.order_id='#{order_no}'") + .first() + + return booking.booking_id + end + private def generate_custom_id if self.booking_id.nil? diff --git a/app/models/order_queue_station.rb b/app/models/order_queue_station.rb index f650b807..b86734a7 100755 --- a/app/models/order_queue_station.rb +++ b/app/models/order_queue_station.rb @@ -176,7 +176,7 @@ class OrderQueueStation < ApplicationRecord end def move_print_pdf(change_to,current_user,change_from,order_items,oqs) - if ENV["SERVER_MODE"] != "cloud" #no print in cloud server + # 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 @@ -197,6 +197,6 @@ class OrderQueueStation < ApplicationRecord printer.print_move_table(print_settings,@to,@from ,@shop,@date,@type,@moved_by,order_items,oqs) # end # end - end + # end end end diff --git a/app/models/printer/cashier_station_printer.rb b/app/models/printer/cashier_station_printer.rb index 63ffc53e..ceff5022 100755 --- a/app/models/printer/cashier_station_printer.rb +++ b/app/models/printer/cashier_station_printer.rb @@ -38,66 +38,108 @@ class Printer::CashierStationPrinter < Printer::PrinterWorker # self.print(filename, cashier_terminal.printer_name) # end - def print_close_cashier(printer_settings,cashier_terminal,shift_sale, sale_items, total_other_charges_info,shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) + def print_close_cashier(printer_settings, cashier_terminal, shift_sale, sale_items, total_other_charges_info, shop_details, sale_taxes, other_payment, amount, discount, member_discount, total_dinein, total_takeway, total_other_charges, total_waste, total_spoile, total_credit_payments, payment_methods) + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + if !sale_items.blank? or !sale_items.nil? + @account_cate_count = Hash.new {|hash, key| hash[key] = 0} + sale_items.each {|acc_cate| @account_cate_count[acc_cate.account_id] += 1} - if !sale_items.blank? or !sale_items.nil? - @account_cate_count = Hash.new {|hash, key| hash[key] = 0} - sale_items.each {|acc_cate| @account_cate_count[acc_cate.account_id] += 1} + @menu_cate_count = Hash.new {|hash, key| hash[key] = 0} + sale_items.each {|cate| @menu_cate_count[cate.menu_category_id] += 1} + @totalByAccount = Hash.new {|hash, key| hash[key] = 0} + sale_items.each {|acc| @totalByAccount[acc.account_id] += acc.grand_total} + end - @menu_cate_count = Hash.new {|hash, key| hash[key] = 0} - sale_items.each {|cate| @menu_cate_count[cate.menu_category_id] += 1} + #Use CUPS service + #Generate PDF + #Print + cashier = shift_sale.employee.name + shift_name = shift_sale.shift_started_at.utc.getlocal.strftime("%d-%m-%Y %I:%M %p") + "_" + shift_sale.shift_closed_at.utc.getlocal.strftime("%d-%m-%Y %I:%M %p") + filename = "tmp/close_cashier_#{cashier}_#{shift_name}.pdf" + pdf = CloseCashierPdf.new(printer_settings, shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details, sale_taxes, other_payment, amount, discount, member_discount, total_dinein, total_takeway, total_other_charges, total_waste, total_spoile, total_credit_payments, payment_methods) + close_cashier_pdf = Lookup.collection_of("print_settings") #print_settings with name:CloseCashierPdf - - @totalByAccount = Hash.new {|hash, key| hash[key] = 0} - sale_items.each {|acc| @totalByAccount[acc.account_id] += acc.grand_total} - end - - #Use CUPS service - #Generate PDF - #Print - cashier = shift_sale.employee.name - shift_name = shift_sale.shift_started_at.utc.getlocal.strftime("%d-%m-%Y %I:%M %p") + "_" + shift_sale.shift_closed_at.utc.getlocal.strftime("%d-%m-%Y %I:%M %p") - filename = "tmp/close_cashier_#{cashier}_#{shift_name}.pdf" - pdf = CloseCashierPdf.new(printer_settings,shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) - close_cashier_pdf = Lookup.collection_of("print_settings") #print_settings with name:CloseCashierPdf - - if !close_cashier_pdf.empty? - close_cashier_pdf.each do |close_cashier| - if close_cashier[0] == 'CloseCashierCustomisePdf' - if close_cashier[1] == '1' - pdf = CloseCashierCustomisePdf.new(printer_settings,shift_sale,shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments) - else - pdf = CloseCashierPdf.new(printer_settings,shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) + if !close_cashier_pdf.empty? + close_cashier_pdf.each do |close_cashier| + if close_cashier[0] == 'CloseCashierCustomisePdf' + if close_cashier[1] == '1' + pdf = CloseCashierCustomisePdf.new(printer_settings, shift_sale, shop_details, sale_taxes, other_payment, amount, discount, member_discount, total_dinein, total_takeway, total_other_charges, total_waste, total_spoile, total_credit_payments) + else + pdf = CloseCashierPdf.new(printer_settings, shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details, sale_taxes, other_payment, amount,discount, member_discount, total_dinein, total_takeway, total_other_charges, total_waste, total_spoile, total_credit_payments, payment_methods) + end end end end - end - pdf.render_file filename - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, cashier_terminal.printer_name) + pdf.render_file filename + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, cashier_terminal.printer_name) + end + else + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: cashier_terminal.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + shop_details: shop_details.as_json, + shift_sale: shift_sale, + cashier_terminal: cashier_terminal, + shift_employee: shift_sale.employee, + sale_items: sale_items, + other_charges: total_other_charges_info, + sale_taxes: sale_taxes, + other_payment: other_payment, + total_amount_by_account: amount, + total_discount_by_account: discount, + total_member_discount: member_discount, + total_waste: total_waste, + total_spoile: total_spoile, + total_other_charges: total_other_charges, + total_credit_payments: total_credit_payments + } + ) end end def print_sale_items_report(print_settings, shop_details, period_name, type, account, from_date, to_date, shift_name, sale_items, total_other_charges) - filename = "tmp/reports_sale_items.pdf" + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + filename = "tmp/reports_sale_items.pdf" - if print_settings.unique_code == "SaleItemsPdf" - pdf = SaleItemsPdf.new(print_settings, shop_details, period_name, type, account, from_date, to_date, shift_name, sale_items, total_other_charges) - puts 'Printing!!!!' - end - if print_settings.unique_code == "SaleItemsStarPdf" - pdf = SaleItemsStarPdf.new(print_settings, shop_details, period_name, type, account, from_date, to_date, shift_name, sale_items, total_other_charges) - puts 'PrintingStar!!!!' - end + if print_settings.unique_code == "SaleItemsPdf" + pdf = SaleItemsPdf.new(print_settings, shop_details, period_name, type, account, from_date, to_date, shift_name, sale_items, total_other_charges) + end - pdf.render_file filename + if print_settings.unique_code == "SaleItemsStarPdf" + pdf = SaleItemsStarPdf.new(print_settings, shop_details, period_name, type, account, from_date, to_date, shift_name, sale_items, total_other_charges) + end - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, print_settings.printer_name) + pdf.render_file filename + + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, print_settings.printer_name) + end + else + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: print_settings.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + sale_items: sale_items.as_json, + total_other_charges: total_other_charges, + shop_details:shop_details.as_json, + sale_details: { + period: period_name, + type: type, + account: account, + from_date: from_date, + to_date: to_date, + shift: shift_name, + }, + } + ) end end #sqa diff --git a/app/models/printer/order_queue_printer.rb b/app/models/printer/order_queue_printer.rb index 20da8fcd..e254a775 100755 --- a/app/models/printer/order_queue_printer.rb +++ b/app/models/printer/order_queue_printer.rb @@ -1,80 +1,66 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker 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! + booking_id = Booking.get_booking_id(order_id) + order_item = print_query('order_item', order_item_id).first #OrderItem.find_by_item_code(item_code) + + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + # Must be one print + if print_settings.print_copies == 0 + print_settings.print_copies = 1 + print_settings.save! + end + + options = order_item.options + # check for item not to show + pdf = print_settings.unique_code.constantize.new(print_settings, order_item, print_status, options, oqs.use_alternate_name, before_updated_qty) + + shop = Shop.current_shop + directory_name = "public/orders_#{shop.shop_code}" + Dir.mkdir(directory_name) unless File.exists?(directory_name) + + filename = directory_name + "/order_item_#{order_id}_#{order_item_id}" + ".pdf" + + pdf.render_file filename + + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, oqs.printer_name) + end + else + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: oqs.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + order_item: order_item.as_json(methods: :type), + print_status: print_status.gsub(/[()]/, ""), + booking_id: booking_id, + precision: print_settings.precision + } + ) end - order_item = print_query('order_item', order_item_id) #OrderItem.find_by_item_code(item_code) - options = order_item[0].options - - # check for item not to show - # if order_item[0].price != 0 - 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 - directory_name = 'public/orders_'+shop.shop_code - Dir.mkdir(directory_name) unless File.exists?(directory_name) - - filename = directory_name + "/order_item_#{order_id}_#{order_item_id}" + ".pdf" - - pdf.render_file filename - - 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) - return filename, order_id, oqs.printer_name end # Query for per order def print_order_summary(print_settings, oqs, order_id, order_items, print_status, before_updated_qty="", options="") - #Use CUPS service - #Generate PDF - #Print - # Must be one print - if print_settings.print_copies == 0 - print_settings.print_copies = 1 - print_settings.save! - end + booking_id = Booking.get_booking_id(order_id) #order[0].order_id + 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) - - # For Print Per Item - if oqs.cut_per_item - - 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" - # For Item Options - options = odi.options == "[]" ? "" : odi.options - - # check for item not to show - #if odi.price != 0 - 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 - #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 - #end + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + #Use CUPS service + #Generate PDF + #Print + # Must be one print + if print_settings.print_copies == 0 + print_settings.print_copies = 1 + print_settings.save! end - # For Print Order Summary - else - 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) filename = directory_name + "/order_summary_#{order_id}.pdf" # filename = "tmp/order_summary_#{order_id}" + ".pdf" @@ -85,15 +71,26 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker 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 + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: oqs.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + order_item: order_items, + order: order.as_json(methods: :type), + print_status: "", + booking_id: booking_id, + precision: print_settings.precision + } + ) end + return filename, order_id, oqs.printer_name end # Print for orders in booking - def print_booking_summary(print_settings, oqs, booking_id, print_status,before_updated_qty="") + def print_booking_summary(print_settings, oqs, booking_id, print_status, before_updated_qty="") # Must be one print if print_settings.print_copies == 0 print_settings.print_copies = 1 @@ -173,37 +170,51 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker # Check in-out time def print_check_in_out(print_settings, cashier_terminal, booking, table) - #Use CUPS service - #Generate PDF - #Print - sale_id = booking.sale_id - filename = "tmp/check_in_out_#{sale_id}" + ".pdf" + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + #Use CUPS service + #Generate PDF + #Print + sale_id = booking.sale_id + filename = "tmp/check_in_out_#{sale_id}" + ".pdf" - pdf = CheckInOutPdf.new(print_settings,booking, table) - print_setting = PrintSetting.all + pdf = CheckInOutPdf.new(print_settings,booking, table) - # if order_item[0].price != 0 - if !print_setting.empty? - print_setting.each do |print_settings| - if print_settings.unique_code == 'CheckInOutPdf' - pdf = CheckInOutPdf.new(print_settings,booking, table) + print_setting = PrintSetting.all + + # if order_item[0].price != 0 + if !print_setting.empty? + print_setting.each do |print_settings| + if print_settings.unique_code == 'CheckInOutPdf' + pdf = CheckInOutPdf.new(print_settings,booking, table) + end end end - end - pdf.render_file filename + pdf.render_file filename - # Must be one print - if print_settings.print_copies == 0 - print_settings.print_copies = 1 - print_settings.save! - end - # print_settings.print_copies = 1 - # print_settings.save! + # Must be one print + if print_settings.print_copies == 0 + print_settings.print_copies = 1 + print_settings.save! + end + # print_settings.print_copies = 1 + # print_settings.save! - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, print_settings.printer_name) + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, print_settings.printer_name) + end + else + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: cashier_terminal.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + booking: booking, + table: table, + table_type: table.type, + } + ) end end end diff --git a/app/models/printer/receipt_printer.rb b/app/models/printer/receipt_printer.rb index ac3e6f3f..c5f23512 100755 --- a/app/models/printer/receipt_printer.rb +++ b/app/models/printer/receipt_printer.rb @@ -91,10 +91,10 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Bill Receipt Print def print_receipt_bill(printer_settings, kbz_pay_status, qr_code, cashier_terminal,sale_items,sale_data, customer_name, item_price_by_accounts, discount_price_by_accounts, member_info = nil,rebate_amount=nil,shop_details, printed_status,balance,card_data,other_amount,latest_order_no,card_balance_amount,order_reservation) - #Use CUPS service - #Generate PDF - #Print - if printer_settings + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + #Use CUPS service + #Generate PDF + #Print 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) @@ -109,48 +109,97 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker # print as print copies in printer setting count = printer_settings.print_copies - # override print copies for print worker loop - # print_settings.print_copies = 1 - # print_settings.save! - end - directory_name = 'public/receipts' - Dir.mkdir(directory_name) unless File.exists?(directory_name) - Rails.logger.debug "############## dir::" + directory_name - if count == 1 - filename = directory_name + "/receipt_bill_#{sale_data.receipt_no}.pdf" - pdf.render_file filename - if printed_status != 'Paid' && printed_status != 'credit_payment' - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(directory_name + "/receipt_bill_#{sale_data.receipt_no}.pdf", cashier_terminal.printer_name) - end - elsif printed_status == 'credit_payment' - filename = directory_name + "/receipt_bill_credit_#{sale_data.receipt_no}.pdf" - pdf.render_file filename - self.print(directory_name + "/receipt_bill_credit_#{sale_data.receipt_no}.pdf", cashier_terminal.printer_name) - end - else - filename = directory_name + "/receipt_bill_#{sale_data.receipt_no}_#{count}.pdf" - pdf.render_file filename - if printed_status != 'Paid' - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(directory_name + "/receipt_bill_#{sale_data.receipt_no}_#{count}.pdf", cashier_terminal.printer_name) - end + directory_name = 'public/receipts' + Dir.mkdir(directory_name) unless File.exists?(directory_name) + Rails.logger.debug "############## dir::" + directory_name + + filename = "#{directory_name}/receipt_bill_#{sale_data.receipt_no}#{count != 1 ? "_#{count}" : ''}.pdf" + pdf.render_file filename + + if printed_status != 'Paid' || !Lookup.where(lookup_type: "ReceiptPdfView").pluck(:value).include?('1') + #no print in cloud server + puts "SERVER_MODE #{ENV["SERVER_MODE"]}" + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, cashier_terminal.printer_name) end end - Rails.logger.debug "############## filename::" + filename - return filename, sale_data.receipt_no, cashier_terminal.printer_name + + Rails.logger.debug "############## filename::" + filename + else + if printed_status != 'Paid' || !Lookup.where(lookup_type: "ReceiptPdfView").pluck(:value).include?('1') + sale_payments = SalePayment + .select(:payment_method, 'SUM(`sale_payments`.`payment_amount`) AS `payment_amount`') + .where(sale_id: sale_data.sale_id).group(:payment_method) + + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: cashier_terminal.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + shop_details: shop_details.as_json, + body: { sale_data: sale_data, + booking: sale_data.bookings, + dining_facility: sale_data.booking.dining_facility.as_json(methods: :type), + sale_taxes: sale_data.sale_taxes, + latest_order_no: latest_order_no, + sale_items: sale_items, + precision: print_settings.precision, + delimiter: print_settings.delimiter, + member_info: member_info, + customer_name: customer_name, + rebate_amount: rebate_amount, + current_balance: balance, + card_data: card_data, + card_balance_amount: card_balance_amount, + discount_price_by_accounts: discount_price_by_accounts, + item_price_by_accounts: item_price_by_accounts, + sale_payments: sale_payments.as_json + }, + footer: { + printed_status: printed_status, footer_text: "Thank You! See you Again" + } + } + ) + end + end + + return filename || '', sale_data.receipt_no, cashier_terminal.printer_name end # stock check - def print_stock_check_result(print_settings,stockcheck, stockcheck_items,checker_name, shop_details) - pdf = StockResultPdf.new(print_settings,stockcheck, stockcheck_items,checker_name, shop_details) - pdf.render_file "tmp/print_stock_check_result.pdf" - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print("tmp/print_stock_check_result.pdf") + def print_stock_check_result(print_settings, stockcheck, stockcheck_items, checker_name, shop_details) + stock_items= [] + if stockcheck_items.length > 0 + stockcheck_items.each do |sc| + stock_item= { + count: sc.stock_count.to_s, + item_name: MenuItemInstance.get_item_name(sc.item_code) + } + stock_items.push(stock_item) + end + end + + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + pdf = StockCheckPdf.new(print_settings,stockcheck, stockcheck_items,checker_name, shop_details) + + pdf.render_file "tmp/print_stock_check_result.pdf" + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print("tmp/print_stock_check_result.pdf") end + else + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: print_settings.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + stockcheck: stockcheck, + stockcheck_items: stock_items, + checker_name: checker_name, + shop_details: shop_details, + } + ) + end end #Queue No Print @@ -167,21 +216,40 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker end #Move Table Print - def print_move_table(printer_settings,to,from,shop_detail,date,type,moved_by,order_items,oqs) - #Use CUPS service - #Generate PDF - #Print + def print_move_table(printer_settings, to, from, shop_detail, date, type, moved_by, order_items, oqs) + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + #Use CUPS service + #Generate PDF + #Print + pdf = MoveTablePdf.new(printer_settings, to, from, shop_detail, date, type, moved_by, order_items) + pdf.render_file "tmp/print_move_table.pdf" - pdf = MoveTablePdf.new(printer_settings,to,from,shop_detail,date,type,moved_by,order_items) - pdf.render_file "tmp/print_move_table.pdf" - - if oqs.print_copy - self.print("tmp/print_move_table.pdf",oqs.printer_name) + if ENV["SERVER_MODE"] != "cloud" + if oqs.print_copy + self.print("tmp/print_move_table.pdf",oqs.printer_name) + else + print_settings.print_copies = 1 + print_settings.save! + #no print in cloud server + self.print("tmp/print_move_table.pdf", oqs.printer_name) + end + end else - print_settings.print_copies = 1 - print_settings.save! - #no print in cloud server - self.print("tmp/print_move_table.pdf", oqs.printer_name) + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: oqs.station_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + type: type, + body: { + to: to, + from: from, + date: date, + moved_by: moved_by, + order_items: order_items.as_json, + }, + } + ) end end @@ -200,14 +268,29 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker #Queue No Print def print_call_waiter(printer_settings,table,time,shop_detail) - #Use CUPS service - #Generate PDF - #Print - pdf = CallWaiterPdf.new(printer_settings,table,time,shop_detail) - pdf.render_file "tmp/print_call_waiter.pdf" - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print("tmp/print_call_waiter.pdf") + if Lookup.collection_of('print_settings').none? { |x| x == ["ActionCable", "1"] } + #Use CUPS service + #Generate PDF + #Print + pdf = CallWaiterPdf.new(printer_settings,table,time,shop_detail) + + pdf.render_file "tmp/print_call_waiter.pdf" + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print("tmp/print_call_waiter.pdf") + end + else + ActionCable.server.broadcast("print_channel_#{Shop.current_shop.shop_code}", + queue: print_settings.printer_name, + unique_code: print_settings.unique_code, + print_copies: print_settings.print_copies, + data: { + shop_name: shop_detail.name, + name: print_settings.name, + table: table.name, + time: time, + } + ) end end @@ -217,18 +300,18 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker # if count == 0 # self.print(filename, printer_name) # else - if count == 1 - #no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, printer_name) - end - else - filename = "public/receipts/receipt_bill_#{receipt_no}_#{count}.pdf" - # no print in cloud server - if ENV["SERVER_MODE"] != "cloud" - self.print(filename, printer_name) - end - end + if count == 1 + #no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, printer_name) + end + else + filename = "public/receipts/receipt_bill_#{receipt_no}_#{count}.pdf" + # no print in cloud server + if ENV["SERVER_MODE"] != "cloud" + self.print(filename, printer_name) + end + end # end end diff --git a/app/models/sale.rb b/app/models/sale.rb index 247ef00c..07bd3665 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -764,7 +764,7 @@ class Sale < ApplicationRecord SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") .sale_payments_with_audit_except_void_between(from, to) .where("(sale_status = ? OR sale_status = ?) AND sales.receipt_date between ? AND ? ", 'completed', 'void', from, to) - .group("sale_id").to_sql + .group("sale_id") sale_taxes = Sale.select('sales.sale_id, sale_taxes.tax_name') .joins(:sale_taxes) @@ -789,13 +789,13 @@ class Sale < ApplicationRecord (IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0)) + (IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0)) as gross_sale, CAST((CONVERT_TZ(receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, #{payment_methods.map { |method| pm = method == 'paypar' ? 'redeem' : method; "SUM(`#{pm}`) as `#{pm}`"}.push('').join(', ')} - SUM(cash_amount) as cash_amount, - SUM(credit_amount) as credit_amount, - SUM(foc_amount) as foc_amount + SUM(`cash_amount`) as `cash_amount`, + SUM(`credit_amount`) as `credit_amount`, + SUM(`foc_amount`) as `foc_amount` FROM ( - #{sales} + #{sales.to_sql} ) as s - JOIN (#{sale_taxes.to_sql}) AS st ON s.sale_id = st.sale_id + LEFT JOIN (#{sale_taxes.to_sql}) AS st ON s.sale_id = st.sale_id GROUP BY DATE(CONVERT_TZ(receipt_date,'+00:00','+06:30'))").to_hash.map(&:symbolize_keys) return daily_total end @@ -974,7 +974,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) discount_query = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = select(Sale.column_names).select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -997,7 +997,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) discount_query = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = select(Sale.column_names).select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1021,7 +1021,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou discount_query = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:total_discount) change_amount = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = select(Sale.column_names).select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1080,7 +1080,7 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) discount_query = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = select(Sale.column_names).select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1103,7 +1103,7 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) discount_query = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = select(Sale.column_names).select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1127,7 +1127,7 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account discount_query = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:total_discount) change_amount = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = select(Sale.column_names).select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.empty? ? '""' : payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") diff --git a/app/models/seed_generator.rb b/app/models/seed_generator.rb index 482a65a1..ee99820f 100755 --- a/app/models/seed_generator.rb +++ b/app/models/seed_generator.rb @@ -1,14 +1,12 @@ class SeedGenerator < ApplicationRecord # Generate ID for Tables def self.generate_id(model, prefix) - model_name = self.get_model_name(model) - prefix ||= '' prefix << '-' if prefix.present? if ENV["SERVER_MODE"] == 'cloud' prefix << 'C' - else + # else prefix << 'L' end @@ -16,14 +14,12 @@ class SeedGenerator < ApplicationRecord prefix << shop.shop_code end - seed = self.update_seed(model_name) + seed = self.update_seed(model) length = 16 - prefix.length prefix + seed.to_s.rjust(length, '0') end def self.generate_ids(model, prefix, count = 1) - model_name = self.get_model_name(model) - prefix ||= '' prefix << '-' if prefix.present? @@ -37,7 +33,7 @@ class SeedGenerator < ApplicationRecord prefix << shop.shop_code end - start = self.update_seed(model_name, count) + start = self.update_seed(model, count) stop = start + count - 1 length = 16 - prefix.length (start..stop).map { |c| prefix + c.to_s.rjust(length, '0') } @@ -127,7 +123,8 @@ class SeedGenerator < ApplicationRecord def self.update_seed(model, count = 1) SeedGenerator.transaction do - seed = SeedGenerator.lock.find_by_model(model) + seed = SeedGenerator.lock.find_by_model(get_model_name(model)) || + SeedGenerator.lock.find_by_model(model) seed.next = seed.next + (count * seed.increase_by) seed.current = seed.next - seed.increase_by seed.save! diff --git a/app/models/shift_sale.rb b/app/models/shift_sale.rb index bbc7cc20..b35ddac8 100755 --- a/app/models/shift_sale.rb +++ b/app/models/shift_sale.rb @@ -152,7 +152,7 @@ class ShiftSale < ApplicationRecord def self.get_by_shift_other_payment(shift) payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) - shift_other_payments = Sale.select("sales.sale_id,sale_payments.payment_method as name") + shift_other_payments = Sale.select("sales.sale_id, sale_payments.payment_method as name") if payment_methods.present? shift_other_payments = shift_other_payments.select("#{payment_methods.map { |method| "SUM(case when (sale_payments.payment_method='#{method}') then sale_payments.payment_amount else 0 end) as `#{method == 'paypar' ? 'redeem' : method}`"}.join(', ')}") end @@ -210,6 +210,11 @@ class ShiftSale < ApplicationRecord .first() end + def self.get_other_charges(shift) + query = SaleItem.joins("JOIN sales as s ON s.sale_id = sale_items.sale_id") + .where('shift_sale_id =? and s.sale_status = "completed" and sale_items.product_code = "Other Charges" and sale_items.item_instance_code is null',shift.id) + end + def self.search(filter,from,to) if filter.blank? keyword = '' diff --git a/app/models/shop.rb b/app/models/shop.rb index 41110515..dbe6c58b 100755 --- a/app/models/shop.rb +++ b/app/models/shop.rb @@ -8,7 +8,7 @@ class Shop < ApplicationRecord accepts_nested_attributes_for :display_images def file_data=(input_data) - self.data = input_data.read + self.data = input_data.read end def self.current_shop diff --git a/app/pdf/close_cashier_pdf.rb b/app/pdf/close_cashier_pdf.rb index 11cb139b..1afc13e4 100755 --- a/app/pdf/close_cashier_pdf.rb +++ b/app/pdf/close_cashier_pdf.rb @@ -597,7 +597,8 @@ class CloseCashierPdf < Prawn::Document def other_charges_detail(total_other_charges) total_charges = 0 total_charges_items = 0 - + p "total other charges<=========================" + p total_other_charges unless total_other_charges.nil? y_position = cursor bounding_box([0,y_position], :width =>self.page_width - 10, :height => 20) do @@ -611,6 +612,7 @@ class CloseCashierPdf < Prawn::Document total_other_charges.each do |charges| move_down 3 + p charges['product_name'] add_item_line(charges['product_name'], charges['unit_price'].to_i, charges['total_item'].to_i, charges['grand_total'].to_i) total_charges_items += charges['total_item'].to_i diff --git a/app/pdf/receipt_bill_pdf.rb b/app/pdf/receipt_bill_pdf.rb index 198c0a12..8defeb30 100755 --- a/app/pdf/receipt_bill_pdf.rb +++ b/app/pdf/receipt_bill_pdf.rb @@ -96,7 +96,7 @@ class ReceiptBillPdf < Prawn::Document if kbz_pay_status if printed_status == 'credit_payment' printed_status = 'Paid' - end + end kbzpay_qr_generator(printed_status, qr_code) end @@ -309,146 +309,144 @@ class ReceiptBillPdf < Prawn::Document end def all_total(sale_data,precision,delimiter,printed_status) - move_down line_move - item_name_width = self.item_width - y_position = cursor - if sale_data.discount_type == 'member_discount' - dis_type = "Member Discount:" + move_down line_move + item_name_width = self.item_width + y_position = cursor + if sale_data.discount_type == 'member_discount' + dis_type = "Member Discount:" + else + dis_type = "Overall Discount:" + end + + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "#{ dis_type }", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "( #{number_format(sale_data.total_discount, :precision => precision.to_i, :delimiter => delimiter)} )" , :size => self.item_font_size,:align => :right + end + + service_tax_desc = "" + service_tax_amount = 0 + service_tax_rate = 0 + com_tax_desc = "" + com_tax_amount = 0 + com_tax_rate = 0 + if sale_data.sale_taxes.length > 0 + incl_tax = "" + if sale_data.tax_type == "inclusive" + incl_tax = "Incl." + end + + find_lookup = Lookup.find_by_lookup_type('show_total_before_tax') + if find_lookup.nil? || find_lookup == nil + lookup = Lookup.new(lookup_type: 'show_total_before_tax', name: 'Show Total Before Tax', value: '0') + lookup.save + end + check_lookup_type = Lookup.find_by_lookup_type('show_total_before_tax') + if check_lookup_type.value == '1' + sale_data.sale_taxes.each do |st| + if (st.tax_name.include? "Service") + service_tax_desc = st.tax_name + service_tax_amount = st.tax_payable_amount + if incl_tax + service_tax_rate = st.tax_rate.to_i + end + end + if (st.tax_name.include? "Commercial") + com_tax_desc = st.tax_name + com_tax_amount = st.tax_payable_amount + if incl_tax + com_tax_rate = st.tax_rate.to_i + end + end + end + move_down line_move + y_position = cursor + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "#{ service_tax_desc } (#{incl_tax} #{ service_tax_rate }%)", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{number_format(service_tax_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right + end + move_down line_move + y_position = cursor + stroke_horizontal_rule + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Total Before Tax", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{service_tax_amount.to_i + @sub_total.to_i}" , :size => self.item_font_size,:align => :right + end + move_down line_move + y_position = cursor + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "#{ com_tax_desc } (#{incl_tax} #{ com_tax_rate.to_i }%)", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{number_format(com_tax_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right + end else - dis_type = "Overall Discount:" - end - - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "#{ dis_type }", :size => self.item_font_size,:align => :left - end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "( #{number_format(sale_data.total_discount, :precision => precision.to_i, :delimiter => delimiter)} )" , :size => self.item_font_size,:align => :right - end - - service_tax_desc = "" - service_tax_amount = 0 - service_tax_rate = 0 - com_tax_desc = "" - com_tax_amount = 0 - com_tax_rate = 0 - if sale_data.sale_taxes.length > 0 - incl_tax = "" - if sale_data.tax_type == "inclusive" - incl_tax = "Incl." - end - - find_lookup = Lookup.find_by_lookup_type('show_total_before_tax') - if find_lookup.nil? || find_lookup == nil - lookup = Lookup.new(lookup_type: 'show_total_before_tax', name: 'Show Total Before Tax', value: '0') - lookup.save - end - check_lookup_type = Lookup.find_by_lookup_type('show_total_before_tax') - if check_lookup_type.value == '1' - sale_data.sale_taxes.each do |st| - if (st.tax_name.include? "Service") - service_tax_desc = st.tax_name - service_tax_amount = st.tax_payable_amount - if incl_tax - service_tax_rate = st.tax_rate.to_i - end - end - if (st.tax_name.include? "Commercial") - com_tax_desc = st.tax_name - com_tax_amount = st.tax_payable_amount - if incl_tax - com_tax_rate = st.tax_rate.to_i - end - end - end - move_down line_move - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "#{ service_tax_desc } (#{incl_tax} #{ service_tax_rate }%)", :size => self.item_font_size,:align => :left - end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{number_format(service_tax_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right - end - move_down line_move - y_position = cursor - stroke_horizontal_rule - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "Total Before Tax", :size => self.item_font_size,:align => :left - end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{service_tax_amount.to_i + @sub_total.to_i}" , :size => self.item_font_size,:align => :right - end - move_down line_move - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "#{ com_tax_desc } (#{incl_tax} #{ com_tax_rate.to_i }%)", :size => self.item_font_size,:align => :left - end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{number_format(com_tax_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right - end - else - sale_data.sale_taxes.each do |st| - move_down line_move - y_position = cursor - - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "#{ st.tax_name } (#{incl_tax} #{ st.tax_rate.to_i }%)", :size => self.item_font_size,:align => :left - end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{number_format(st.tax_payable_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right - end - end - end - else - - end - - # move_down 5 - # y_position = cursor - - # bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - # text "Total Tax", :size => self.item_font_size,:align => :left - # end - # bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - # text "( " +"#{sale_data.total_tax}" +" )" , :size => self.item_font_size,:align => :right - # end - - if sale_data.rounding_adjustment != 0.0 - move_down line_move + sale_data.sale_taxes.each do |st| + move_down line_move y_position = cursor bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "Rounding Adjustment", :size => self.item_font_size,:align => :left + text "#{ st.tax_name } (#{incl_tax} #{ st.tax_rate.to_i }%)", :size => self.item_font_size,:align => :left end bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{sale_data.rounding_adjustment}", :size => self.item_font_size,:align => :right + text "#{number_format(st.tax_payable_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right end + end end + end + # move_down 5 + # y_position = cursor + + # bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + # text "Total Tax", :size => self.item_font_size,:align => :left + # end + # bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + # text "( " +"#{sale_data.total_tax}" +" )" , :size => self.item_font_size,:align => :right + # end + + if sale_data.rounding_adjustment != 0.0 move_down line_move y_position = cursor - move_down line_move - bounding_box([0,y_position], :width =>self.item_description_width) do - text "Grand Total",:style => :bold, :size => self.header_font_size,:align => :left + + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Rounding Adjustment", :size => self.item_font_size,:align => :left end bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{number_format(sale_data.grand_total, :precision => precision.to_i, :delimiter => delimiter)}" , :style => :bold, :size => self.header_font_size,:align => :right + text "#{sale_data.rounding_adjustment}", :size => self.item_font_size,:align => :right end - move_down line_move + end - sale_payment(sale_data,precision,delimiter,printed_status) + move_down line_move + y_position = cursor + move_down line_move + bounding_box([0,y_position], :width =>self.item_description_width) do + text "Grand Total",:style => :bold, :size => self.header_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{number_format(sale_data.grand_total, :precision => precision.to_i, :delimiter => delimiter)}" , :style => :bold, :size => self.header_font_size,:align => :right + end + move_down line_move + + sale_payment(sale_data,precision,delimiter,printed_status) end def sale_payment(sale_data,precision,delimiter,printed_status) - stroke_horizontal_rule - #move_down line_move - # sql = "SELECT SUM(payment_amount) - # FROM sale_payments where payment_method='creditnote' - # and sale_id='#{sale_data.sale_id}'" - - if printed_status == 'credit_payment' + stroke_horizontal_rule + #move_down line_move + # sql = "SELECT SUM(payment_amount) + # FROM sale_payments where payment_method='creditnote' + # and sale_id='#{sale_data.sale_id}'" + + if printed_status == 'credit_payment' sale_payments = SalePayment.select(:payment_amount, :payment_method, :updated_at) .where("sale_id = '#{sale_data.sale_id}' AND payment_method != 'creditnote'") - else + else sql = SalePayment.select("(SUM(payment_amount))").where("payment_method='creditnote' and sale_id='#{sale_data.sale_id}'").to_sql # sql1 = "SELECT CASE WHEN s.amount_changed > 0 and (s.amount_received - s.amount_changed) = s.grand_total THEN ( SELECT SUM(payment_amount) # FROM sale_payments where payment_method='creditnote' @@ -466,38 +464,38 @@ class ReceiptBillPdf < Prawn::Document where sa.sale_id='#{sale_data.sale_id}')) = 0 THEN payment_method!='creditnote' ELSE 1 END) AND sale_id = ?", sale_data.sale_id) .group("payment_method") - end - - sale_payments.each do |payment| - y_position = cursor - if payment.payment_method == "paypar" - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "Redeem Payment", :size => self.item_font_size,:align => :left - end - elsif printed_status == 'credit_payment' - text "#{payment.payment_method.capitalize} Payment on #{payment.updated_at.strftime('%d-%m-%Y')}", :left_margin => -10, :size => self.item_font_size,:align => :left - else - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "#{payment.payment_method.capitalize} Payment", :size => self.item_font_size,:align => :left - end - end + end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{number_format(payment.payment_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right - end - move_down line_move + sale_payments.each do |payment| + y_position = cursor + if payment.payment_method == "paypar" + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Redeem Payment", :size => self.item_font_size,:align => :left + end + elsif printed_status == 'credit_payment' + text "#{payment.payment_method.capitalize} Payment on #{payment.updated_at.strftime('%d-%m-%Y')}", :left_margin => -10, :size => self.item_font_size,:align => :left + else + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "#{payment.payment_method.capitalize} Payment", :size => self.item_font_size,:align => :left + end end - if sale_data.amount_received > 0 - y_position = cursor - move_down line_move - bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do - text "Change Amount", :size => self.item_font_size,:align => :left - end - bounding_box([self.item_description_width,y_position], :width =>self.label_width) do - text "#{number_format(sale_data.amount_changed, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right - end - # move_down line_move + + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{number_format(payment.payment_amount, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right end + move_down line_move + end + if sale_data.amount_received > 0 + y_position = cursor + move_down line_move + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Change Amount", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{number_format(sale_data.amount_changed, :precision => precision.to_i, :delimiter => delimiter)}" , :size => self.item_font_size,:align => :right + end + # move_down line_move + end end # show member information @@ -677,7 +675,7 @@ class ReceiptBillPdf < Prawn::Document query = sale_data.sale_payments .merge(SalePayment.where.not(payment_method: 'creditnote') .or(SalePayment.where.not(SalePayment.arel_table[:payment_amount].lteq(sale_data.sale_payments.joins(:sale_audit).sum(:payment_amount))))) - + query.each do |payment| if payment.payment_method == "creditnote" diff --git a/app/pdf/stock_result_pdf.rb b/app/pdf/stock_check_pdf.rb similarity index 99% rename from app/pdf/stock_result_pdf.rb rename to app/pdf/stock_check_pdf.rb index 1da06dd2..d04cd82e 100755 --- a/app/pdf/stock_result_pdf.rb +++ b/app/pdf/stock_check_pdf.rb @@ -1,4 +1,4 @@ -class StockResultPdf < Prawn::Document +class StockCheckPdf < Prawn::Document attr_accessor :label_width, :price_column_width, :page_width, :page_height, :margin, :price_width, :item_width, :header_font_size, :item_font_size, :item_height, :qty_width, :total_width, :item_description_width, :text_width def initialize(printer_settings, stockcheck, stockcheck_items, checker_name, shop_details) diff --git a/app/views/crm/customers/_new_form.html.erb b/app/views/crm/customers/_new_form.html.erb index e401aef6..b5bbc39c 100644 --- a/app/views/crm/customers/_new_form.html.erb +++ b/app/views/crm/customers/_new_form.html.erb @@ -57,7 +57,7 @@
<%= f.input :name, :class => "form-control name", :required => true %> <% flash.each do |test, msg| %> - <% + <% str="[\"#{msg['name']}\"]" str.gsub!('["', '') str.gsub!('"]', '') %> @@ -94,7 +94,7 @@
-
+
@@ -107,12 +107,12 @@ <% if f.object.image_path? %>

<%= f.object.name %>

<%= image_tag f.object.image_path.url, :class => "img-thumbnail" %> - <% else %> + <% else %> <%= image_tag "/image/menu_images/default.png", :class => "img-thumbnail" %> - <% end %> + <% end %>
<%= f.file_field :image_path, :class => "img-thumbnail" %> - +
@@ -160,7 +160,7 @@ <%end %> - +
@@ -185,7 +185,7 @@
-
+
@@ -201,7 +201,7 @@ <%end %> - +
@@ -212,7 +212,7 @@ -
+
@@ -259,13 +259,10 @@ console.log(paypar_account_no); // Read Card Reader - $("#paypar_account_no").on('focus', function(e){ + $("#paypar_account_no").on('focus', function(e){ if($(this).val() == ''){ $("#sxModal").show(); - setTimeout(function(){ - getCardNo(); - $("#sxModal").hide(); - },100); + getCardNo(); } }); @@ -289,6 +286,7 @@ $("#paypar_account_no").val(cardNo); $("#search").val(cardNo); $("#type").val("card"); + $("#filter_form").submit(); }else{ if($.inArray(cardNo, paypar_account_no) !== -1){ swal({ @@ -309,9 +307,10 @@ } } } + $("#sxModal").hide(); } $("#sxModal .btn_cancel").on('click',function(){ $("#sxModal").hide(); }); - \ No newline at end of file + diff --git a/app/views/crm/customers/index.html.erb b/app/views/crm/customers/index.html.erb index 815335f2..593c3a27 100644 --- a/app/views/crm/customers/index.html.erb +++ b/app/views/crm/customers/index.html.erb @@ -1,9 +1,9 @@ - + + <%= link_to 'Back', crm_customers_path %> @@ -15,7 +15,7 @@