diff --git a/.gitignore b/.gitignore index 02338531..91a498bc 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,6 @@ config/deploy/config/* # Gem files #Gemfile #Gemfile.lock + +# For Redis Server log file +dump.rdb diff --git a/Gemfile b/Gemfile index 0b7c3f11..99489d5b 100644 --- a/Gemfile +++ b/Gemfile @@ -9,9 +9,9 @@ end # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.1.0' # Use mysql as the database for Active Record - gem 'mysql2', '>= 0.3.18', '< 0.5' +#Use PosgreSQL gem 'pg' # redis server for cable @@ -42,12 +42,10 @@ gem 'to_xls-rails' #Reporting gem #gem 'compendium' - -# Pagination -gem 'kaminari', :git => "git://github.com/amatsuda/kaminari.git", :branch => 'master' - +#gem "cancan" # Use jquery as the JavaScript library gem 'jquery-rails' +gem 'jquery-ui-rails' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks gem 'turbolinks', '~> 5' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder @@ -59,8 +57,14 @@ gem 'bcrypt', '~> 3.1.7' gem 'sidekiq' +# XML parser +#gem 'nokogiri', '~> 1.6' + # Pagination -gem 'kaminari', :git => "git://github.com/amatsuda/kaminari.git", :branch => 'master' +gem 'kaminari', '~> 1.0.1' + +# Datatable +gem 'filterrific' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development @@ -90,3 +94,11 @@ end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'httparty', '~> 0.15.5' + +# gem 'momentjs-rails', '>= 2.9.0' +# gem 'bootstrap-datepicker-rails' +# # gem 'momentjs-rails', '>= 2.9.0' +# gem 'bootstrap3-datetimepicker-rails'z +gem 'bootstrap-datepicker-rails' diff --git a/Gemfile.lock b/Gemfile.lock index 5dce67dc..e6f683f6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,21 +1,3 @@ -GIT - remote: git://github.com/amatsuda/kaminari.git - revision: c3c853a944cd2bff072ae05e48c563b2c9a29597 - branch: master - specs: - kaminari (1.0.1) - activesupport (>= 4.1.0) - kaminari-actionview (= 1.0.1) - kaminari-activerecord (= 1.0.1) - kaminari-core (= 1.0.1) - kaminari-actionview (1.0.1) - actionview - kaminari-core (= 1.0.1) - kaminari-activerecord (1.0.1) - activerecord - kaminari-core (= 1.0.1) - kaminari-core (1.0.1) - GEM remote: https://rubygems.org/ specs: @@ -64,6 +46,8 @@ GEM bootstrap (4.0.0.alpha6) autoprefixer-rails (>= 6.0.3) sass (>= 3.4.19) + bootstrap-datepicker-rails (1.6.4.1) + railties (>= 3.0) builder (3.2.3) byebug (9.0.6) coffee-rails (4.2.2) @@ -88,36 +72,54 @@ GEM faker (1.7.3) i18n (~> 0.5) ffi (1.9.18) + filterrific (2.1.2) font-awesome-rails (4.7.0.2) railties (>= 3.2, < 5.2) globalid (0.4.0) activesupport (>= 4.2.0) - i18n (0.8.1) - jbuilder (2.6.4) - activesupport (>= 3.0.0) + httparty (0.15.5) + multi_xml (>= 0.5.2) + i18n (0.8.4) + jbuilder (2.7.0) + activesupport (>= 4.2.0) multi_json (>= 1.2) jquery-rails (4.3.1) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) + jquery-ui-rails (6.0.1) + railties (>= 3.2.16) + kaminari (1.0.1) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.0.1) + kaminari-activerecord (= 1.0.1) + kaminari-core (= 1.0.1) + kaminari-actionview (1.0.1) + actionview + kaminari-core (= 1.0.1) + kaminari-activerecord (1.0.1) + activerecord + kaminari-core (= 1.0.1) + kaminari-core (1.0.1) listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) loofah (2.0.3) nokogiri (>= 1.5.9) - mail (2.6.5) + mail (2.6.6) mime-types (>= 1.16, < 4) method_source (0.8.2) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) - mini_portile2 (2.1.0) + mini_portile2 (2.2.0) minitest (5.10.2) multi_json (1.12.1) + multi_xml (0.6.0) mysql2 (0.4.6) nio4r (2.1.0) - nokogiri (1.7.2) - mini_portile2 (~> 2.1.0) + nokogiri (1.8.0) + mini_portile2 (~> 2.2.0) pdf-core (0.7.0) pg (0.20.0) prawn (2.2.2) @@ -125,7 +127,7 @@ GEM ttfunk (~> 1.5) prawn-table (0.2.2) prawn (>= 1.3.0, < 3.0.0) - puma (3.8.2) + puma (3.9.1) rack (2.0.3) rack-cors (0.4.1) rack-protection (2.0.0) @@ -189,7 +191,7 @@ GEM activesupport (>= 3.2.1) shoulda-matchers (3.1.1) activesupport (>= 4.0.0) - sidekiq (5.0.0) + sidekiq (5.0.2) concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.0) rack-protection (>= 1.5.0) @@ -241,16 +243,20 @@ PLATFORMS DEPENDENCIES bcrypt (~> 3.1.7) bootstrap (~> 4.0.0.alpha3) + bootstrap-datepicker-rails byebug coffee-rails (~> 4.2) cups (~> 0.0.7) database_cleaner factory_girl_rails (~> 4.0) faker + filterrific font-awesome-rails + httparty (~> 0.15.5) jbuilder (~> 2.5) jquery-rails - kaminari! + jquery-ui-rails + kaminari (~> 1.0.1) listen (~> 3.0.5) mysql2 (>= 0.3.18, < 0.5) pg @@ -276,4 +282,4 @@ DEPENDENCIES web-console (>= 3.3.0) BUNDLED WITH - 1.15.0 + 1.15.1 diff --git a/app/assets/javascripts/orgiami.js b/app/assets/javascripts/CRM.js similarity index 91% rename from app/assets/javascripts/orgiami.js rename to app/assets/javascripts/CRM.js index fc91e269..fc535ff7 100644 --- a/app/assets/javascripts/orgiami.js +++ b/app/assets/javascripts/CRM.js @@ -11,7 +11,10 @@ // about supported directives. // //= require jquery +//= require tether //= require bootstrap //= require jquery_ujs //= require turbolinks //= require cable +//= require jquery-ui +//= require bootstrap-datepicker \ No newline at end of file diff --git a/app/assets/javascripts/OQS.js b/app/assets/javascripts/OQS.js index 80a09b47..9ad540ab 100644 --- a/app/assets/javascripts/OQS.js +++ b/app/assets/javascripts/OQS.js @@ -17,6 +17,11 @@ //= require cable $(document).ready(function(){ + // auto refresh every 10 seconds + // setTimeout(function(){ + // window.location.reload(1); + // }, 10000); + $('.queue_station').on('click',function(){ var orderZone=$(this).children().children().children('.order-zone').text(); var orderItem=$(this).children().children().children('.order-item').text(); @@ -39,36 +44,44 @@ $(document).ready(function(){ }); // complete for queue item - $('.order-complete').on('click',function(){ - var _self= $(this); + $('.order-complete').on('click',function(e){ + //e.preventDefault(); + var _self = $(this); // To know in ajax return var assigned_item_id=$(this).attr('id').substr(15); var params = { 'id':assigned_item_id }; - var station=$(this).parent().parent(".queue_station").parent().parent().attr('id'); $.ajax({ type: 'POST', url: '/oqs/update_delivery', data: params, dataType: 'json', - success: function(data){ - var queue_station=_self.parent().parent(".queue_station"); + success: function(data){ + for (i = 0; i < data.length; i++) { + var queue_station = $('#assigned_queue_' + data[i]).parent().parent(".queue_station"); + var station = queue_station.parent().parent().attr('id'); - // Remove a queue card from current station - queue_station.remove(); + // Remove a queue card from current station + queue_station.remove(); - // Remove a queue card from current station - queue_station.children('.card-footer').remove(); - - // Add removed queue card from station to completed - $("#completed").children('.card-columns').append(queue_station); + // Remove a queue card from current station + queue_station.children('.card-footer').remove(); + + // Add removed queue card from station to completed + $("#completed").children('.card-columns').append(queue_station); - // update queue item count in station - $("#"+station+"_count").text(parseInt($("#"+station+"_count").text())-1); - $("#completed_count").text(parseInt($("#completed_count").text())+1); + // update queue item count in each station + var station_count=parseInt($("#"+station+"_count").text()) - 1; + $("#"+station+"_count").text(station_count); + } + + // update queue item count in completed station + $("#completed_count").text(parseInt($("#completed_count").text()) + data.length); alert("updated!"); + // Page reload + location.reload(); } - }); + }); }); $('#print_order_item').on('click',function(){ @@ -80,4 +93,14 @@ $(document).ready(function(){ success: function(data){ } }); }); + + $('#print_order_summary').on('click',function(){ + var assigned_item_id=$('.selected-item').children('.card-block').children('.assigned-order-item').text(); + var params = { 'id':assigned_item_id }; + $.ajax({ + type: 'GET', + url: '/oqs/print/print_order_summary/'+assigned_item_id, + success: function(data){ } + }); + }); }); diff --git a/app/assets/javascripts/origami/request_bills.coffee b/app/assets/javascripts/api/origami/paypar.coffee similarity index 100% rename from app/assets/javascripts/origami/request_bills.coffee rename to app/assets/javascripts/api/origami/paypar.coffee diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index f7b2e2b0..202d4387 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -17,3 +17,141 @@ //= require turbolinks //= require cable //= require settings/processing_items +//= require jquery-ui +//= require bootstrap-datepicker + +$(document).on("focus", "[data-behaviour~='datepicker']", function(e){ + $(this).datepicker({"format": "yyyy-M-dd", "weekStart": 1, "autoclose": true}); + $('.dropdown-toggle').dropdown(); +}); + +/* +* ToDo Move to here from pages +* +* + + + +$(function(){ + $('#custom_excel').hide(); + + $('#custom_excel').click(function(){ + var url = $('#custom_excel').attr('data-url'); + $('#frm_report').attr('action',url) + $('#frm_report').submit(); + // window.location = url; + }); + + var item = $('#item').val(); + var payment_type = $('#payment_type'); + + if(item == 'order'){ + $('#cashier').hide(); + $('#waiter').show(); + if(payment_type){ + $('#payment_type').hide(); + } + } + else if(item == 'sale'){ + $('#waiter').hide(); + $('#cashier').show(); + } + else{ + $('#waiter').hide(); + $('#cashier').show(); + $("#item").val('sale'); + } +}); + +//Reset the form to pervious values +$("#branch").val(<%=params[:branch]%>); +$("#waiter").val("<%=params[:waiter]%>"); +$("#cashier").val(<%=params[:cashier]%>); +$("#product").val(<%=params[:product]%>); +$("#singer").val(<%=params[:singer]%>); +$("#item").val('<%=params[:item]%>'); +$("#guest_role").val('<%=params[:guest_role]%>'); + + +$("#from").val("<%=params[:from]%>"); +$("#to").val("<%=params[:to]%>"); +$("#sel_period").val(<%=params[:period]%>); +$("#sel_sale_type").val(<%=params[:sale_type]%>); + +<% if params[:period_type] == 1 || params[:period_type] == "1" %> + $("#rd_period_type_1").attr("checked","checked"); +<% else %> + $("#rd_period_type_0").attr("checked","checked"); +<% end %> +$(".btn-group button").removeClass("active"); +<% report_type = params[:report_type].blank? ? "0" : params[:report_type] %> +$("#btn_report_type_<%= report_type %>").addClass("active"); + +$('#item').change(function(){ + var item = $('#item').val(); + var payment_type = $('#payment_type'); + + if(item == 'sale'){ + $('#waiter').hide(); + $('#cashier').show(); + if(payment_type){ + $('#payment_type').show(); + } + } + else{ + $('#cashier').hide(); + $('#waiter').show(); + if(payment_type){ + $('#payment_type').hide(); + } + } +}); + +$(function(){ + var check_arr = []; + var search = '<%= params[:period_type] %>'; + if(search){ + if(parseInt(search) == 0){ + search_by_period(); + } + else{ + search_by_date(); + } + }else{ + search_by_period(); + } + $('#sel_period').change(function(){ + search_by_period(); + }); + function search_by_period(){ + var period = $('#sel_period').val(); + var period_type = 0; + var from = ""; + var to = ""; + } + + $('#from').change(function(){ + search_by_date(); + }); + + $('#to').change(function(){ + search_by_date(); + }); + function search_by_date(){ + var from = $('#from').val(); + var to = $('#to').val(); + var period = 0; + var period_type = 1; + if(to != '' && from != ''){ + shift_name = from + ',' + to; + check_arr.push(to); + // console.log(check_arr.length) + if(check_arr.length == 1){ + } + if(check_arr.length == 3){ + check_arr = []; + } + } + } +}); +*/ diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js index 739aa5f0..43efe3f2 100644 --- a/app/assets/javascripts/cable.js +++ b/app/assets/javascripts/cable.js @@ -5,6 +5,7 @@ //= require_self //= require_tree ./channels +// Temp Disable (function() { this.App || (this.App = {}); diff --git a/app/assets/javascripts/crm/dining_queues.coffee b/app/assets/javascripts/crm/dining_queues.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/crm/dining_queues.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/membership_actions.coffee b/app/assets/javascripts/membership_actions.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/membership_actions.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/origami.js b/app/assets/javascripts/origami.js new file mode 100644 index 00000000..b39a4c6e --- /dev/null +++ b/app/assets/javascripts/origami.js @@ -0,0 +1,346 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require jquery +//= require tether +//= require bootstrap +//= require jquery_ujs +//= require turbolinks +//= require cable +//= require jquery-ui +//= require bootstrap-datepicker + +$(document).ready(function(){ + // auto refresh every 60 seconds + // setTimeout(function(){ + // window.location.reload(1); + // }, 60000); + + // For selected order return + var order_status = ""; + order_status = $(".selected-item").children().find(".orders-order-status").text().substr(0,6).trim(); + + // Enable/Disable Button + control_button(order_status); + + $(".orders").on('click', function(){ + $("#order-sub-total").text(''); + // $("#order-food").text(''); + // $("#order-beverage").text(''); + $("#order-discount").text(''); + $("#order-Tax").text(''); + $("#order-grand-total").text(''); + + var zone_name=$(this).find(".orders-table").text(); + var receipt_no=$(this).find(".orders-receipt-no").text(); + var unique_id = $(this).find(".orders-id").text(); + var order_status=$(this).find(".orders-order-status").text().trim(); + + // Enable/Disable Button + control_button(order_status); + + var customer_id=$(this).find(".customer-id").text(); + show_customer_details(customer_id); + + $("#re-print").val(unique_id); + + var cashier=""; + var receipt_date=""; + var sub_total=0; + var discount_amount=0; + var tax_amount=0; + var grand_total_amount=0; + + $("#order-title").text("ORDER DETAILS - " + zone_name); + // clear order items + $("#order-items-table").children("tbody").empty(); + + // AJAX call for order + $.ajax({ + type: "POST", + url: "/origami/" + unique_id, + data: { 'booking_id' : unique_id }, + success:function(result){ + for (i = 0; i < result.length; i++) { + var data = JSON.stringify(result[i]); + var parse_data = JSON.parse(data); + var show_date = ""; + + // Receipt Header + receipt_no = result[i].receipt_no; + cashier = result[i].cashier_name; + if(result[i].receipt_date != null){ + receipt_date = new Date(result[i].receipt_date); + show_date = receipt_date.getDate() + "-" + receipt_date.getMonth() + "-" + receipt_date.getFullYear() + ' ' + receipt_date.getHours()+ ':' + receipt_date.getMinutes() + } + + $("#receipt_no").text(receipt_no); + $("#cashier").text(cashier == null ? "" : cashier); + $("#receipt_date").text(show_date); + + + //Receipt Charges + sub_total += (parse_data.qty*parse_data.price); + + discount_amount = parse_data.discount_amount == null? '0.0' : parse_data.discount_amount; + tax_amount = parse_data.tax_amount; + grand_total_amount = parse_data.grand_total_amount; + + $("#order-sub-total").text(sub_total); + // $("#order-food").text(''); + // $("#order-beverage").text(''); + $("#order-discount").text(discount_amount); + $("#order-Tax").text(tax_amount); + $("#order-grand-total").text(grand_total_amount); + + // Ordered Items + var order_items_rows = "" + + "" + parse_data.item_name + "" + + "" + parse_data.qty + "" + + "" + parse_data.qty*parse_data.price + "" + + ""; + + $("#order-items-table").children("tbody").append(order_items_rows); + } + } + }); + // End AJAX Call + + $('.orders').removeClass('selected-item'); + $(this).addClass('selected-item'); + }); + + // Bill Request + $('#request_bills').click(function() { + var order_id=$(".selected-item").find(".orders-id").text(); + if(order_id!=""){ + window.location.href = '/origami/' + order_id + '/request_bills' + } + else { + alert("Please select an order!"); + } + return false; + }); + + // Discount for Payment + $('#discount').click(function() { + var order_id=$(".selected-item").find(".orders-id").text(); + if(order_id!=""){ + window.location.href = '/origami/' + order_id + '/discount' + } + else { + alert("Please select an order!"); + } + + return false; + }); + + // Pay Discount for Payment + $("#pay-discount").on('click', function(e){ + e.preventDefault(); + var sale_id = $('#sale-id').text(); + var sale_item_id = $('.selected-item').attr('id'); + var sub_total = $('#order-sub-total').text(); + var grand_total = $('#order-grand-total').text(); + var discount_type = $('#discount-type').val(); + var discount_value = $('#discount-amount').val(); + var discount_amount = discount_value; + var ajax_url = "/origami/" + sale_id + "/discount"; + + if(sale_item_id != null){ + ajax_url = "/origami/" + sale_item_id + "/discount"; + sub_total = $("#"+sale_item_id).children().find("#item-total-price").text(); + } + + // For Percentage Discount + if(discount_type == 1){ + discount_amount=(sub_total*discount_value)/100; + } + + var params = {'sale_id': sale_id, 'sale_item_id': sale_item_id, 'grand_total' : grand_total, 'discount_type':discount_type, 'discount_value':discount_value, 'discount_amount':discount_amount}; + $.ajax({ + type: "POST", + url: ajax_url, + data: params, + success:function(result){ } + }); + }); + + + // Payment for Bill + $('#pay-bill').click(function() { + var sale_id=$(".selected-item").find(".orders-id").text(); + if(sale_id!=""){ + window.location.href = '/origami/sale/'+ sale_id + "/payment" + } + else { + alert("Please select an order!"); + } + + return false; + }); + + $('#customer').click(function() { + var sale = $(".selected-item").find(".orders-id").text(); + if (sale.substring(0, 3)=="SAL") { + var sale_id = sale + }else{ + var sale_id = $(".selected-item").find(".order-cid").text(); + } + window.location.href = '/origami/'+ sale_id + "/customers" + + return false; + }); + + $('#re-print').click(function() { + var sale_id = $(".selected-item").find(".orders-id").text(); + + window.location.href = '/origami/'+ sale_id + "/reprint" + + return false; + }); + + function show_customer_details(customer_id){ + + if(window.location.pathname.substring(0, 12) == "/origami/SAL"){ + var url = customer_id+"/get_customer/" + }else{ + var url = "origami/"+customer_id+"/get_customer/" + } + + $('.customer_detail').removeClass('hide'); + + //Start Ajax + $.ajax({ + type: "GET", + url: url, + data: {}, + dataType: "json", + success: function(data) { + $("#customer_name").text(data["customer"].name); + $.each(data["response_data"]["data"], function (i) { + if(data["response_data"]["data"][i]["accountable_type"] == "RebateAccount"){ + var balance = data["response_data"]["data"][i]["balance"]; + if (data["response_data"]["status"]==true) { + $('.rebate_amount').removeClass('hide'); + row = + '' + data["response_data"]["data"][i]["accountable_type"] +'' + +'' + balance + ''; + + $(".rebate_amount").html(row); + } + + } + }); + } + }); + //End Ajax + } + + /* For Receipt - Calculate discount or tax */ + $('.cashier_number').on('click', function(event){ + if(event.handled !== true) { + var original_value=0; + original_value = $('#discount-amount').val(); + + var input_type = $(this).attr("data-type"); + + switch (input_type) { + case 'num': + var input_value = $(this).attr("data-value"); + if (original_value == "0.0"){ + $('#discount-amount').val(input_value); + update_balance(); + } + else{ + $('#discount-amount').val(original_value + '' + input_value); + update_balance(); + } + break; + + case 'add': + var input_value = $(this).attr("data-value"); + amount = parseInt(input_value); + $('#discount-amount').val(amount); + $('#discount-type').val(1); + update_balance(); + break; + + case 'del' : + var discount_text=$('#discount-amount').val(); + $('#discount-amount').val(discount_text.substr(0,discount_text.length-1)); + update_balance(); + break; + + case 'clr': + $('#discount-amount').val("0.0"); + update_balance(); + break; + } + + event.handled = true; + } else { + return false; + } + }); + + $('.discount-item-row').on('click',function(){ + $('.discount-item-row').removeClass('selected-item'); + $(this).addClass('selected-item'); + }); + +}); + +/* Button Control by Status */ +function control_button(order_status){ + if(order_status=="billed"){ + $("#customer").prop('disabled', false); + $("#request_bills").prop('disabled', true); + $("#discount").prop('disabled', false); + $("#pay-bill").prop('disabled', false); + $("#re-print").prop('disabled', true); + } + else if(order_status=="new") { + $("#customer").prop('disabled', false); + $("#request_bills").prop('disabled', false); + $("#discount").prop('disabled', true); + $("#pay-bill").prop('disabled', true); + $("#re-print").prop('disabled', true); + }else if(order_status=="completed"){ + $("#re-print").prop('disabled', false); + } + else { + $("#customer").prop('disabled', true); + $("#request_bills").prop('disabled', true); + $("#discount").prop('disabled', true); + $("#pay-bill").prop('disabled', true); + $("#re-print").prop('disabled', true); + } + +} + +/* For Receipt - Update Balance */ +function update_balance(){ + var discount_type = $('#discount-type').val(); + var discount_amount = $('#discount-amount').val(); + var sub_total = $('#order-sub-total').text(); + var tax = $('#order-Tax').text(); + + // For Percentage Discount + if(discount_type == 1){ + discount_amount=(sub_total*discount_amount)/100; + } + + var total = (parseFloat(sub_total) + parseFloat(tax)) - discount_amount; + $('#order-discount').text(discount_amount); + $('#order-grand-total').text(total); +} diff --git a/app/assets/javascripts/origami/redeem_payments.coffee b/app/assets/javascripts/origami/redeem_payments.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/origami/redeem_payments.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/payment.js b/app/assets/javascripts/payment.js new file mode 100644 index 00000000..b7aadf05 --- /dev/null +++ b/app/assets/javascripts/payment.js @@ -0,0 +1,40 @@ +// number key pad +$(document).on('click', '.cashier_number', function(event){ + event.stopPropagation(); + event.preventDefault(); + if(event.handled !== true) { + var original_value; + original_value = $('#amount').text(); + + var input_value = $(this).attr("data-value"); + + var input_type = $(this).attr("data-type"); + switch (input_type) { + case 'num': + if (original_value == "0.0"){ + $('#amount').text(input_value); + }else{ + $('#amount').append(input_value); + } + break; + + case 'add': + var input_value = $(this).attr("data-value"); + amount = parseInt(input_value) + parseInt(original_value); + $('#amount').html(amount); + + break; + case 'clr': + $('#amount').html("0.0"); + break; + case 'del' : + var cash=$('#amount').text(); + $('#amount').text(cash.substr(0,cash.length-1)); + break; + + } + event.handled = true; + } else { + return false; + } +}); diff --git a/app/assets/javascripts/report.js b/app/assets/javascripts/report.js new file mode 100644 index 00000000..09f74075 --- /dev/null +++ b/app/assets/javascripts/report.js @@ -0,0 +1,4 @@ +$(document).on("focus", "[data-behaviour~='datepicker']", function(e){ + $(this).datepicker({"format": "yyyy-M-dd", "weekStart": 1, "autoclose": true}); + $('.dropdown-toggle').dropdown(); +}); \ No newline at end of file diff --git a/app/assets/javascripts/settings/membership_actions.coffee b/app/assets/javascripts/settings/membership_actions.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/settings/membership_actions.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/settings/orders.coffee b/app/assets/javascripts/settings/orders.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/settings/orders.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/transactions.js b/app/assets/javascripts/transactions.js new file mode 100644 index 00000000..12e8ee44 --- /dev/null +++ b/app/assets/javascripts/transactions.js @@ -0,0 +1,7 @@ +//= require jquery +//= require bootstrap +//= require jquery_ujs +//= require turbolinks +//= require cable +//= require jquery-ui +//= require bootstrap-datepicker \ No newline at end of file diff --git a/app/assets/stylesheets/CRM.scss b/app/assets/stylesheets/CRM.scss index b0f802f1..a88efe96 100644 --- a/app/assets/stylesheets/CRM.scss +++ b/app/assets/stylesheets/CRM.scss @@ -1,9 +1,13 @@ @import "bootstrap"; @import "font-awesome"; @import "theme"; +@import "jquery-ui"; +@import "bootstrap-datepicker3"; /* Show it is fixed to the top */ // body { // min-height: 75rem; // padding-top: 4.5rem; // } + + diff --git a/app/assets/stylesheets/OQS.scss b/app/assets/stylesheets/OQS.scss index 07c98b85..b516836a 100644 --- a/app/assets/stylesheets/OQS.scss +++ b/app/assets/stylesheets/OQS.scss @@ -16,5 +16,6 @@ } .selected-item { + color: #fff !important; background-color: blue; } diff --git a/app/assets/stylesheets/origami/request_bills.scss b/app/assets/stylesheets/api/origami/paypar.scss similarity index 59% rename from app/assets/stylesheets/origami/request_bills.scss rename to app/assets/stylesheets/api/origami/paypar.scss index 20719090..3ce106bb 100644 --- a/app/assets/stylesheets/origami/request_bills.scss +++ b/app/assets/stylesheets/api/origami/paypar.scss @@ -1,3 +1,3 @@ -// Place all the styles related to the origami/RequestBills controller here. +// Place all the styles related to the api/origami/paypar controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 9456be10..a4fa6b9f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -2,6 +2,9 @@ @import "bootstrap"; @import "font-awesome"; @import "theme"; +@import "jquery-ui"; +@import "bootstrap-datepicker3"; + /* Show it is fixed to the top */ // body { @@ -57,3 +60,19 @@ ul.dropdown-menu li a{ /*----- Header Bar -----*/ /*----- Header Bar -----*/ + +/*----- Layout ------ */ + +.margin-top-20 { + margin: 20px 0 0 0; +} + +/*----- Layout ------ */ + +/*--- Reset --- */ + +select.form-control { + height: inherit !important; +} + +/*--- Reset --- */ diff --git a/app/assets/stylesheets/membership_actions.scss b/app/assets/stylesheets/membership_actions.scss new file mode 100644 index 00000000..a916dc5b --- /dev/null +++ b/app/assets/stylesheets/membership_actions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the membership_actions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/orgiami.scss b/app/assets/stylesheets/orgiami.scss deleted file mode 100644 index b0f802f1..00000000 --- a/app/assets/stylesheets/orgiami.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import "bootstrap"; -@import "font-awesome"; -@import "theme"; - -/* Show it is fixed to the top */ -// body { -// min-height: 75rem; -// padding-top: 4.5rem; -// } diff --git a/app/assets/stylesheets/origami.scss b/app/assets/stylesheets/origami.scss new file mode 100644 index 00000000..71a9915e --- /dev/null +++ b/app/assets/stylesheets/origami.scss @@ -0,0 +1,131 @@ +@import "bootstrap"; +@import "font-awesome"; +@import "theme"; +@import "jquery-ui"; +@import "bootstrap-datepicker3"; + +/* Show it is fixed to the top */ +// body { +// min-height: 75rem; +// padding-top: 4.5rem; +// } +.others-payment{ + line-height:100px; + text-align:center; + color:white; + width:300px; + height:100px; + font-size:18px; +} + +.orders-table { + cursor: pointer; +} + +.cashier_number{ + width: 33%; + height:70px; + line-height:70px; + text-align:center; + background:#54A5AF; + // float:left; + // margin:2px; + font-size:20px; + color:white; + // cursor:pointer; +} + +.del_cashier_number{ + opacity:0.6, +} + +.pay{ + width: 98%; + height:211px; + line-height:211px; + text-align:center; + font-size:20px; + color:white; +} + +.cashier_number:hover{ + background:#A9F5F2; +} + +.long{ + width:49%; +} + +.sold { + background-color: red; +} + +.paid { + background-color: green; +} + +.selected-item { + color: #fff !important; + background-color: blue !important; +} + +/* Reciept Style */ +#order-charges-table td { + border-top: none !important; +} + +.charges-name { + width: 80%; + text-align: left; +} + +.item-name { + width: 60%; + text-align: left; +} + +.item-attr { + width: 20%; + text-align: right; +} + + +/* Colors */ +.purple { + background-color:#7a62d3; +} + +.red { + background-color:#ff0000; +} + +.green{ + background-color: #009900 +} + +.left{ + margin-left:1px; +} + +.bottom{ + margin-bottom: 1px; +} +/*----- Reset -----*/ + +select.form-control { + height: inherit !important; +} + +.form-horizontal .form-group { + margin-right: 0px !important; +} + +/* Discount */ + +.discount-item-row { + cursor: pointer; +} + +tr.discount-item-row:hover { + background-color: #e3e3e3 !important; +} diff --git a/app/assets/stylesheets/origami/redeem_payments.scss b/app/assets/stylesheets/origami/redeem_payments.scss new file mode 100644 index 00000000..8fdd1e53 --- /dev/null +++ b/app/assets/stylesheets/origami/redeem_payments.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the origami/redeem_payments controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/settings/membership_actions.scss b/app/assets/stylesheets/settings/membership_actions.scss new file mode 100644 index 00000000..66eafd50 --- /dev/null +++ b/app/assets/stylesheets/settings/membership_actions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the settings/membership_actions controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/settings/orders.scss b/app/assets/stylesheets/settings/orders.scss new file mode 100644 index 00000000..436ceee1 --- /dev/null +++ b/app/assets/stylesheets/settings/orders.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the settings/orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/transactions.scss b/app/assets/stylesheets/transactions.scss new file mode 100644 index 00000000..5ca9b171 --- /dev/null +++ b/app/assets/stylesheets/transactions.scss @@ -0,0 +1,5 @@ +@import "bootstrap"; +@import "font-awesome"; +@import "theme"; +@import "jquery-ui"; +@import "bootstrap-datepicker3"; \ No newline at end of file diff --git a/app/controllers/api/bill_controller.rb b/app/controllers/api/bill_controller.rb index d4940907..6b1fb225 100644 --- a/app/controllers/api/bill_controller.rb +++ b/app/controllers/api/bill_controller.rb @@ -8,12 +8,18 @@ class Api::BillController < Api::ApiController #create Bill by Booking ID if (params[:booking_id]) - @sale = Sale.new - @status = @sale.generate_invoice_from_booking(params[:booking_id], current_login_employee.name) - + booking = Booking.find(params[:booking_id]) + if booking + if booking.sale_id.nil? + @sale = Sale.new + @status, @sale_id = @sale.generate_invoice_from_booking(params[:booking_id], current_login_employee) + else + @status = true + end + end elsif (params[:order_id]) @sale = Sale.new - @status = @sale.generate_invoice_from_order(params[:order_id], current_login_employee.name) + @status, @sale_id = @sale.generate_invoice_from_order(params[:order_id], current_login_employee) end end diff --git a/app/controllers/api/customers_controller.rb b/app/controllers/api/customers_controller.rb index 8ce2041c..2adc7c8a 100644 --- a/app/controllers/api/customers_controller.rb +++ b/app/controllers/api/customers_controller.rb @@ -9,4 +9,9 @@ class Api::CustomersController < ActionController::API def show @customer = Customer.find_by(params[:id]) end + + #Show customer detail by Order item + def get_customer_order + @customer = Customer.find(params[:id]) + end end diff --git a/app/controllers/api/invoices_controller.rb b/app/controllers/api/invoices_controller.rb index 7d6e2cb7..aedfc9f7 100644 --- a/app/controllers/api/invoices_controller.rb +++ b/app/controllers/api/invoices_controller.rb @@ -1,6 +1,6 @@ class Api::InvoicesController < ActionController::API - before :authenticate_token - before :set_sale_params, only:[:show, :update, :destroy] + # before :authenticate_token + # before :set_sale_params, only:[:show, :update, :destroy] #List open invoices for today. def index diff --git a/app/controllers/api/memberships_controller.rb b/app/controllers/api/memberships_controller.rb index 6b125868..ea5b5279 100644 --- a/app/controllers/api/memberships_controller.rb +++ b/app/controllers/api/memberships_controller.rb @@ -1,5 +1,5 @@ class Api::MembershipsController < ActionController::API - before :authenticate_token + #before :authenticate_token #Add Membership to invoice diff --git a/app/controllers/api/orders_controller.rb b/app/controllers/api/orders_controller.rb index 443a754b..08847f6f 100644 --- a/app/controllers/api/orders_controller.rb +++ b/app/controllers/api/orders_controller.rb @@ -28,33 +28,31 @@ class Api::OrdersController < Api::ApiController @order = Order.new @order.source = params[:order_source] @order.order_type = params[:order_type] - @order.customer_id = params[:customer_id] + @order.customer_id = params[:customer_id] == ""? "CUS-000000000001" : params[:customer_id] # for no customer id from mobile @order.items = params[:order_items] @order.guest = params[:guest_info] @order.table_id = params[:table_id] @order.new_booking = true - #@order.employee_name = "Emenu" @order.employee_name = current_login_employee.name - - #Create Table Booking or Room Booking - if !params["booking_id"].nil? && params[:booking_id].to_i > 0 - #@order.new_booking = false - @order.new_booking = true - @order.booking_id = params[:booking_id] + if !params["booking_id"].nil? + # check booking id is already completed. + booking = Booking.find(params[:booking_id]) + if !booking.sale_id.nil? + if booking.sale.sale_status == "completed" || booking.sale.sale_status == "billed" + @order.new_booking = true + else + @order.new_booking = false + @order.booking_id = params[:booking_id] + end + else + @order.new_booking = false + @order.booking_id = params[:booking_id] + puts "booking sale is null" + end end @status, @booking = @order.generate - - # rescue Exception => error - # @status = false - # @error_messages = "Exception has occurs on System" - # - # logger.fatal("Exception Raise - " + error.message) - # end - - - end # Description diff --git a/app/controllers/api/payments_controller.rb b/app/controllers/api/payments_controller.rb index 2c2d219b..39219c6b 100644 --- a/app/controllers/api/payments_controller.rb +++ b/app/controllers/api/payments_controller.rb @@ -29,56 +29,56 @@ class Api::PaymentsController < ActionController::API #:received_amount, :card_payment_reference, :vochure_no, :giftcard_no, #:customer_id, :external_payment_status - switch (payment_method) - case "cash" + case payment_method + when "cash" sale_payment.payment_method = "cash" sale_payment.received_amount = params[:amount] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "creditnote" + when "creditnote" sale_payment.payment_method = "creditnote" sale_payment.received_amount = params[:amount] sale_payment.customer_id = params[:customer_id] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "visa" + when "visa" sale_payment.payment_method = "visa" sale_payment.received_amount = params[:amount] sale_payment.payment_reference = params[:payment_reference] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "master" + when "master" sale_payment.payment_method = "master" sale_payment.received_amount = params[:amount] sale_payment.payment_reference = params[:payment_reference] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "jcb" + when "jcb" sale_payment.payment_method = "jcb" sale_payment.received_amount = params[:amount] sale_payment.payment_reference = params[:payment_reference] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "mpu" + when "mpu" sale_payment.payment_method = "mpu" sale_payment.received_amount = params[:amount] sale_payment.payment_reference = params[:payment_reference] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "unionpay" + when "unionpay" sale_payment.payment_method = "unionpay" sale_payment.received_amount = params[:amount] sale_payment.payment_reference = params[:payment_reference] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "vochure" + when "vochure" sale_payment.payment_method = "vochure" sale_payment.received_amount = params[:amount] sale_payment.customer_id = params[:customer_id] sale_payment.payment_reference = params[:vochure_no] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "giftcard" + when "giftcard" sale_payment.payment_method = "giftcard" sale_payment.received_amount = params[:amount] sale_payment.customer_id = params[:customer_id] sale_payment.payment_reference = params[:giftcard_no] @status, @invoice = sale_payment.process_payment(sale_payment, current_login_employee.name) - case "paypar" + when "paypar" sale_payment.payment_method = "paypar" sale_payment.received_amount = params[:amount] sale_payment.payment_reference = params[:payment_reference] diff --git a/app/controllers/base_report_controller.rb b/app/controllers/base_report_controller.rb new file mode 100644 index 00000000..c1ae1a01 --- /dev/null +++ b/app/controllers/base_report_controller.rb @@ -0,0 +1,77 @@ +class BaseReportController < ActionController::Base + include LoginVerification + layout "application" + + #before_action :check_installation + protect_from_forgery with: :exception + + PERIOD = { + "today" => 0, + "yesterday" => 1, + "this_week" => 2, + "last_week" => 3, + "last_7" => 4, + "this_month" => 5, + "last_month" => 6, + "last_30" => 7, + "this_year" => 8, + "last_year" => 9 + } + + def get_date_range_from_params + period_type = params[:period_type] + period = params[:period] + from = params[:from] + to = params[:to] + day_ref = Time.now + if period_type.to_i == 1 + if params[:from] && params[:to] + if params[:from] != "" && params[:to] !="" + from = DateTime.strptime(params[:from], "%m/%d/%Y") + to = DateTime.strptime(params[:to], "%m/%d/%Y") + else + from = day_ref.beginning_of_day.utc + to = day_ref.end_of_day.utc + end + end + else + case period.to_i + when PERIOD["today"] + + from = day_ref.beginning_of_day.utc + to = day_ref.end_of_day.utc + + when PERIOD["yesterday"] + from = (day_ref - 1.day).beginning_of_day.utc + to = (day_ref - 1.day).end_of_day.utc + + when PERIOD["this_week"] + from = Time.now.beginning_of_week.utc + to = Time.now.utc + when PERIOD["last_week"] + from = (day_ref - 7.day).beginning_of_week.utc + to = (day_ref - 7.day).end_of_week.utc + when PERIOD["last_7"] + from = (day_ref - 7.day).utc + to = Time.now.utc + when PERIOD["this_month"] + from = Time.now.beginning_of_month.utc + to = Time.now.utc + when PERIOD["last_month"] + from = (day_ref - 1.month).beginning_of_month.utc + to = (day_ref - 1.month).end_of_month.utc + when PERIOD["last_30"] + from = (day_ref - 30.day).utc + to = Time.now.utc + when PERIOD["this_year"] + from = Time.now.beginning_of_year.utc + to = Time.now.utc + when PERIOD["last_year"] + from = (day_ref - 1.year).beginning_of_year.utc + to = (day_ref - 1.year).end_of_year.utc + end + end + return from, to + end + +end diff --git a/app/controllers/crm/bookings_controller.rb b/app/controllers/crm/bookings_controller.rb index eeb19f75..65511512 100644 --- a/app/controllers/crm/bookings_controller.rb +++ b/app/controllers/crm/bookings_controller.rb @@ -1,4 +1,4 @@ -class Crm::BookingsController < ApplicationController +class Crm::BookingsController < BaseCrmController def update_booking booking = Booking.find(params[:booking_id]) diff --git a/app/controllers/crm/customers_controller.rb b/app/controllers/crm/customers_controller.rb index 4e97faec..4cacae00 100644 --- a/app/controllers/crm/customers_controller.rb +++ b/app/controllers/crm/customers_controller.rb @@ -1,20 +1,73 @@ -class Crm::CustomersController < ApplicationController +class Crm::CustomersController < BaseCrmController before_action :set_crm_customer, only: [:show, :edit, :update, :destroy] # GET /crm/customers # GET /crm/customers.json def index - @crm_customers = Crm::Customer.all + filter = params[:filter] + + if filter.nil? + @crm_customers = Customer.order("customer_id").page(params[:page]) + #@products = Product.order("name").page(params[:page]).per(5) + else + @crm_customers = Customer.search(filter) + + end + #@crm_customers = Customer.all + @crm_customers = Kaminari.paginate_array(@crm_customers).page(params[:page]).per(50) + @crm_customer = Customer.new + + # if flash["errors"] + # @crm_customer.valid? + # end + # @membership = Customer.get_member_group + # if @membership["status"] == true + # @member_group = @membership["data"] + # end + respond_to do |format| + format.html # index.html.erb + format.json { render json: @crm_customers } + end end # GET /crm/customers/1 # GET /crm/customers/1.json def show + @orders = Order.where("customer_id=?", params[:id]) + @sales = Sale.where("customer_id=?", params[:id]) + + if @orders + @order_items = [] + @orders.each do |order| + @order_items = @order_items + order.order_items + end + end + if @sales + @sale_items = [] + @sales.each do |sale| + @sale_items = @sale_items + sale.sale_items + end + end + + #get customer amount + @customer = Customer.find(params[:id]) + response = Customer.get_member_account(@customer) + + if(response["status"] == true) + @membership = response["data"] + else + @membership = 0 + end + + #end customer amount + end # GET /crm/customers/new def new - @crm_customer = Crm::Customer.new + @crm_customer = Customer.new + @membership = Customer.get_member_group() + end # GET /crm/customers/1/edit @@ -23,31 +76,109 @@ class Crm::CustomersController < ApplicationController # POST /crm/customers # POST /crm/customers.json - def create - @crm_customer = Crm::Customer.new(crm_customer_params) + def create + @crm_customers = Customer.new(customer_params) + respond_to do |format| - if @crm_customer.save - format.html { redirect_to @crm_customer, notice: 'Customer was successfully created.' } - format.json { render :show, status: :created, location: @crm_customer } + puts @crm_customers.errors.to_json + if @crm_customers.save + name = customer_params[:name] + phone = customer_params[:contact_no] + email = customer_params[:email] + dob = customer_params[:date_of_birth] + member_group_id = params[:member_group_id] + + membership = MembershipSetting.find_by_membership_type("paypar_url") + memberaction = MembershipAction.find_by_membership_type("create_membership_customer") + merchant_uid = memberaction.merchant_account_id.to_s + auth_token = memberaction.auth_token.to_s + url = membership.gateway_url.to_s + memberaction.gateway_url.to_s + + response = HTTParty.post(url, :body => { name: name,phone: phone,email: email, + dob: dob, + member_group_id: member_group_id,merchant_uid:merchant_uid,auth_token:auth_token}.to_json, + :headers => { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + } + ) + + if response["status"] == true + + customer = Customer.find(@crm_customers.customer_id) + status = customer.update_attributes(membership_id: response["customer_datas"]["id"]) + + if params[:sale_id] + format.html { redirect_to '/origami/'+params[:sale_id]+'/customers', notice: 'Customer was successfully created.' } + else + format.html { redirect_to crm_customers_path, notice: 'Customer was successfully created'} + end + # format.json { render :index, status: :created, location: @crm_customers } + else + + @crm_customers.destroy + if params[:sale_id] + format.html { redirect_to '/origami/'+params[:sale_id]+'/customers'} + else + format.html { redirect_to crm_customers_path, notice: response["message"] } + end + end else - format.html { render :new } - format.json { render json: @crm_customer.errors, status: :unprocessable_entity } + + if params[:sale_id] + flash[:errors] = @crm_customers.errors + format.html { redirect_to '/origami/'+params[:sale_id]+'/customers'} + format.json { render json: @crm_customers.errors, status: :unprocessable_entity } + else + flash[:errors] = @crm_customers.errors + format.html { redirect_to crm_customers_path} + format.json { render json: @crm_customers.errors, status: :unprocessable_entity } + end end - end + end +end # PATCH/PUT /crm/customers/1 # PATCH/PUT /crm/customers/1.json def update + respond_to do |format| - if @crm_customer.update(crm_customer_params) - format.html { redirect_to @crm_customer, notice: 'Customer was successfully updated.' } + if @crm_customer.update(customer_params) + + name = customer_params[:name] + phone = customer_params[:contact_no] + email = customer_params[:email] + dob = customer_params[:date_of_birth] + id = @crm_customer.membership_id + member_group_id = params[:member_group_id] + + membership = MembershipSetting.find_by_membership_type("paypar_url") + memberaction = MembershipAction.find_by_membership_type("update_membership_customer") + merchant_uid = memberaction.merchant_account_id.to_s + auth_token = memberaction.auth_token.to_s + url = membership.gateway_url.to_s + memberaction.gateway_url.to_s + + response = HTTParty.post(url, :body => { name: name,phone: phone,email: email, + dob: dob, + id: id,member_group_id:member_group_id,merchant_uid:merchant_uid,auth_token:auth_token}.to_json, + :headers => { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + } + ) + + format.html { redirect_to crm_customers_path, notice: 'Customer was successfully updated.' } format.json { render :show, status: :ok, location: @crm_customer } + else - format.html { render :edit } + + flash[:errors] = @crm_customers.errors + format.html { redirect_to crm_customers_path} format.json { render json: @crm_customer.errors, status: :unprocessable_entity } end + end end @@ -64,11 +195,12 @@ class Crm::CustomersController < ApplicationController private # Use callbacks to share common setup or constraints between actions. def set_crm_customer - @crm_customer = Crm::Customer.find(params[:id]) + @crm_customer = Customer.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. - def crm_customer_params - params.require(:crm_customer).permit(:name, :company, :contact_no, :email, :date_of_birth, :membership_id, :membership_type, :membership_authentication_code) + def customer_params + + params.require(:customer).permit(:name, :company, :contact_no, :email, :date_of_birth) end end diff --git a/app/controllers/crm/dining_queues_controller.rb b/app/controllers/crm/dining_queues_controller.rb new file mode 100644 index 00000000..41655d98 --- /dev/null +++ b/app/controllers/crm/dining_queues_controller.rb @@ -0,0 +1,84 @@ +class Crm::DiningQueuesController < BaseCrmController + before_action :set_dining_queue, only: [:show, :edit, :update, :destroy] + + # GET /crm/dining_queues + # GET /crm/dining_queues.json + def index + @dining_queues = DiningQueue.all + end + + # GET /crm/dining_queues/1 + # GET /crm/dining_queues/1.json + def show + end + + # GET /crm/dining_queues/new + def new + @dining_queue = DiningQueue.new + @queue_no = DiningQueue.generate_queue_no + end + + # GET /crm/dining_queues/1/edit + def edit + end + + # POST /crm/dining_queues + # POST /crm/dining_queues.json + def create + @dining_queue = DiningQueue.new(dining_queue_params) + + respond_to do |format| + if @dining_queue.save + + unique_code = "QueueNoPdf" + + # get printer info + print_settings = PrintSetting.find_by_unique_code(unique_code) + + printer = Printer::ReceiptPrinter.new(print_settings) + printer.print_queue_no(print_settings,@dining_queue) + + format.html { redirect_to crm_dining_queues_path, notice: 'Dining queue was successfully created.' } + format.json { render :show, status: :created, location: @dining_queue } + else + format.html { render :new } + format.json { render json: @dining_queue.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /crm/dining_queues/1 + # PATCH/PUT /crm/dining_queues/1.json + def update + respond_to do |format| + if @dining_queue.update(dining_queue_params) + format.html { redirect_to crm_dining_queues_path, notice: 'Dining queue was successfully updated.' } + format.json { render :show, status: :ok, location: @dining_queue } + else + format.html { render :edit } + format.json { render json: @dining_queue.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /crm/dining_queues/1 + # DELETE /crm/dining_queues/1.json + def destroy + @dining_queue.destroy + respond_to do |format| + format.html { redirect_to crm_dining_queues_path, notice: 'Dining queue was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_dining_queue + @dining_queue = DiningQueue.find(params[:id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def dining_queue_params + params.require(:dining_queue).permit(:name, :contact_no, :queue_no) + end +end diff --git a/app/controllers/crm/home_controller.rb b/app/controllers/crm/home_controller.rb index 083f2bf7..c05e7cf3 100644 --- a/app/controllers/crm/home_controller.rb +++ b/app/controllers/crm/home_controller.rb @@ -1,24 +1,60 @@ class Crm::HomeController < BaseCrmController def index - @booking = Booking.all + @booking = Booking.all @customer = Customer.all - - #@booking = Booking.select("bookings.id as booking_id, - # bookings.checkin_at, - # bookings.checkin_by, - # bookings.dining_facility_id, - # od.customer_id as customer, - # od.id as order_id, - # od.item_count as count, - # odt.id as order_item_id, - # odt.item_name as item_name") - # .joins("join booking_orders as bko ON bko.booking_id = bookings.id") - # .joins("right join orders as od ON od.id = bko.order_id") - # .joins("right join order_items as odt ON odt.order_id=od.id") - # .order("bookings.id DESC") + from = Time.now.beginning_of_day.utc + to = Time.now.end_of_day.utc + @queue = DiningQueue.where('created_at BETWEEN ? AND ?', from, to).order('queue_no ASC') + + # .where("dining_facilities.is_active=? and orders.date between ? and ?",true,from,to) end + def show end + + #print for crm + def print_order + + @booking = Booking.find(params[:id]) + + @total_amount = 0.00 + @total_tax = 0.00 + + if @booking.booking_orders + order_items = [] + @booking.booking_orders.each do |bo| + order = Order.find(bo.order_id) + #if (order.status == "new") + order_items = order_items + order.order_items + #end + end + + end + + unique_code="CrmOrderPdf" + + print_settings = PrintSetting.find_by_unique_code(unique_code) + + printer = Printer::ReceiptPrinter.new(print_settings) + + printer.print_crm_order(@booking,order_items,print_settings) + + end + + # def update_sale_by_customer + + # sale = Sale.find(params[:sale_id]) + # status = sale.update_attributes(customer_id: params[:customer_id]) + + # if status == true + # render json: JSON.generate({:status => true}) + # else + # render json: JSON.generate({:status => false, :error_message => "Record not found"}) + + # end + # end + end + diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index c3dba58b..29e9082a 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -10,12 +10,20 @@ class HomeController < ApplicationController @login_form.emp_id = params[:login_form][:emp_id] @login_form.password = params[:login_form][:password] @employee = Employee.login(@login_form.emp_id, @login_form.password) - if @employee - session[:session_token] = @employee.token_session - redirect_to dashboard_path - else - render :index - end + + if @employee != nil + if @employee.role == "administrator" + session[:session_token] = @employee.token_session + redirect_to dashboard_path + elsif @employee.role == "cashier" + session[:session_token] = @employee.token_session + redirect_to origami_root_path + else + render :index + end + else + redirect_to origami_root_path, :notice => "Username and Password dosn't match!" + end end diff --git a/app/controllers/oqs/home_controller.rb b/app/controllers/oqs/home_controller.rb index 1292a5e6..7af42166 100644 --- a/app/controllers/oqs/home_controller.rb +++ b/app/controllers/oqs/home_controller.rb @@ -27,23 +27,31 @@ class Oqs::HomeController < BaseOqsController # update delivery status when complete click def update_delivery_status + removed_item = [] assigned_item_id = params[:id] assigned_item=AssignedOrderItem.find(assigned_item_id) - assigned_item.delivery_status=true - assigned_item.save + assigned_items=AssignedOrderItem.where("item_code='" + assigned_item.item_code + "' AND " + "order_id='" + assigned_item.order_id + "'"); + + # update delivery status for completed same order items + assigned_items.each do |ai| + ai.delivery_status=true + ai.save + removed_item.push(ai.assigned_order_item_id) + end + render :json => removed_item.to_json end # Query for OQS with status def queue_items_query(status) - AssignedOrderItem.select("assigned_order_items.id, oqs.station_name, oqs.is_active, df.name as zone, odt.item_code, odt.item_name, odt.price, odt.qty, odt.item_order_by, cus.name as customer_name, odt.created_at") - .joins("join order_queue_process_by_zones as oqpz ON oqpz.order_queue_station_id = assigned_order_items.order_queue_station_id + AssignedOrderItem.select("assigned_order_items.assigned_order_item_id, oqs.station_name, oqs.is_active, df.name as zone, odt.item_code, odt.item_name, odt.price, odt.qty, odt.item_order_by, cus.name as customer_name, odt.created_at") + .joins(" left join order_queue_process_by_zones as oqpz ON oqpz.order_queue_station_id = assigned_order_items.order_queue_station_id left join dining_facilities as df on df.zone_id = oqpz.zone_id left join order_queue_stations as oqs ON oqs.id = assigned_order_items.order_queue_station_id - left join orders as od ON od.id = assigned_order_items.order_id + left join orders as od ON od.order_id = assigned_order_items.order_id left join order_items as odt ON odt.item_code = assigned_order_items.item_code - left join customers as cus ON cus.id = od.customer_id") + left join customers as cus ON cus.customer_id = od.customer_id") .where("assigned_order_items.delivery_status = #{status}") - .group("assigned_order_items.id") + .group("assigned_order_items.assigned_order_item_id") .order("odt.item_name DESC") end end diff --git a/app/controllers/oqs/print_controller.rb b/app/controllers/oqs/print_controller.rb index 368a513d..ecbc94e7 100644 --- a/app/controllers/oqs/print_controller.rb +++ b/app/controllers/oqs/print_controller.rb @@ -1,16 +1,45 @@ class Oqs::PrintController < ApplicationController + # Print Order Item def print unique_code="OrderItemPdf" assigned_item_id=params[:id] - assigned_order_item=AssignedOrderItem.select("order_id, item_code").where('id='+assigned_item_id) + assigned_item=AssignedOrderItem.find(assigned_item_id) + assigned_items=AssignedOrderItem.where("item_code='" + assigned_item.item_code + "' AND " + "order_id='" + assigned_item.order_id + "'"); + # printer for each stations + printer_name = assigned_item.order_queue_station.printer_name + + # print when complete click print_settings=PrintSetting.find_by_unique_code(unique_code) order_queue_printer= Printer::OrderQueuePrinter.new(print_settings) - order_queue_printer.print_order_item(print_settings,assigned_order_item[0].order_id, assigned_order_item[0].item_code ) + order_queue_printer.print_order_item(printer_name,assigned_item.order_id, assigned_item.item_code ) + + # update print status for completed same order items + assigned_items.each do |ai| + ai.print_status=true + ai.save + end + end - # update print status when complete click - assigned_item=AssignedOrderItem.find(assigned_item_id) - assigned_item.print_status=true - assigned_item.save + # Print Order Details + def print_order_summary + unique_code="OrderSummaryPdf" + assigned_item_id=params[:id] + assigned_item=AssignedOrderItem.find(assigned_item_id) + assigned_items=AssignedOrderItem.where("item_code='" + assigned_item.item_code + "' AND " + "order_id='" + assigned_item.order_id + "'"); + + # printer for each stations + printer_name = assigned_item.order_queue_station.printer_name + + # print when complete click + print_settings=PrintSetting.find_by_unique_code(unique_code) + order_queue_printer= Printer::OrderQueuePrinter.new(print_settings) + order_queue_printer.print_order_summary(printer_name,assigned_item.order_id) + + # update print status for completed same order items + assigned_items.each do |ai| + ai.print_status=true + ai.save + end end end diff --git a/app/controllers/origami/card_payments_controller.rb b/app/controllers/origami/card_payments_controller.rb new file mode 100644 index 00000000..1d18e401 --- /dev/null +++ b/app/controllers/origami/card_payments_controller.rb @@ -0,0 +1,29 @@ +class Origami::CardPaymentsController < BaseOrigamiController + + + def index + @membership_rebate_balance = 0 + @membership_id = 0 + if !@membership_id.nil? + membership_setting = MembershipSetting.find_by_membership_type("paypar_url") + membership_data = SalePayment.get_paypar_account(membership_setting.gateway_url,membership_setting.auth_token,@membership_id) + if membership_data["status"]==true + membership_account_data = membership_data["data"]; + membership_account_data.each do |acc_data| + if acc_data["accountable_type"] == "REBATEACCOUNT" + @membership_rebate_balance=acc_data["balance"] + else + @membership_rebate_balance = 0 + end + end + else + @membership_rebate_balance = 0 + end + end + + end + + def create + end + +end diff --git a/app/controllers/origami/credit_payments_controller.rb b/app/controllers/origami/credit_payments_controller.rb new file mode 100644 index 00000000..a348951e --- /dev/null +++ b/app/controllers/origami/credit_payments_controller.rb @@ -0,0 +1,10 @@ +class Origami::CreditPaymentsController < BaseOrigamiController + + + def index + end + + def create + end + +end diff --git a/app/controllers/origami/customers_controller.rb b/app/controllers/origami/customers_controller.rb index d9bfc39b..601055e5 100644 --- a/app/controllers/origami/customers_controller.rb +++ b/app/controllers/origami/customers_controller.rb @@ -1,7 +1,43 @@ class Origami::CustomersController < BaseOrigamiController #Form to add customer - def index + + end - def create + + # GET /crm/customers/1 + # GET /crm/customers/1.json + def show end + + def add_customer + + @sale_id = params[:sale_id] + filter = params[:filter] + + filter = params[:filter] + + if filter.nil? + @crm_customers = Customer.order("customer_id").page(params[:page]) + #@products = Product.order("name").page(params[:page]).per(5) + else + @crm_customers = Customer.search(filter) + + end + #@crm_customers = Customer.all + @crm_customers = Kaminari.paginate_array(@crm_customers).page(params[:page]).per(50) + @crm_customer = Customer.new + + # if flash["errors"] + # @crm_customer.valid? + # end + + respond_to do |format| + # format.html { render :template => "crm/customers/index" } + format.html { render action: "index"} + format.json { render json: @crm_customers } + end + end + + end diff --git a/app/controllers/origami/discounts_controller.rb b/app/controllers/origami/discounts_controller.rb index 09ab1103..f5f7db9e 100644 --- a/app/controllers/origami/discounts_controller.rb +++ b/app/controllers/origami/discounts_controller.rb @@ -1,6 +1,57 @@ class Origami::DiscountsController < BaseOrigamiController + + #discount page show from origami index with selected order def index + sale_id = params[:id] + if Sale.exists?(sale_id) + @sale_data = Sale.find(sale_id) + end end + + #discount for selected order def create + sale_id = params[:sale_id] + sale_item_id = params[:sale_item_id] + discount_type = params[:discount_type] + discount_value = params[:discount_value] + discount_amount = params[:discount_amount] + grand_total = params[:grand_total] + product_name = "Overall Discount" + + if discount_type == 0 + remark="Discount " + discount_amount + " as net" + else + remark="Discount " + discount_amount + " as percentage" + end + + #update discount for sale + sale = Sale.find(sale_id) + sale.total_discount = sale.total_discount + discount_amount.to_f + sale.grand_total = grand_total + sale.save + + #save sale item for discount + if sale_item_id != nil + origin_sale_item = SaleItem.find(sale_item_id) + product_name = origin_sale_item.product_name + "-Disocunt" + end + sale_item = SaleItem.new + + #pull + sale_item.sale_id = sale_id + sale_item.product_code = origin_sale_item != nil ? origin_sale_item.product_code : sale_id + sale_item.product_name = product_name + sale_item.remark = remark + + sale_item.qty = 1 + sale_item.unit_price = (0-discount_amount.to_f) + sale_item.taxable_price = discount_amount + sale_item.is_taxable = 0 + + sale_item.price = sale_item.qty * sale_item.unit_price + sale_item.save + + redirect_to origami_path(sale_id) end + end diff --git a/app/controllers/origami/home_controller.rb b/app/controllers/origami/home_controller.rb index cbca1424..dbde3293 100644 --- a/app/controllers/origami/home_controller.rb +++ b/app/controllers/origami/home_controller.rb @@ -1,15 +1,83 @@ class Origami::HomeController < BaseOrigamiController def index - @order_table = Order.get_order_table() - @order_rooms = Order.get_order_rooms() - @orders = Order.get_orders() - end - def show - str = [] - @order_details = OrderItem.get_order_items_details(params[:order_id]) - @order_details.each do |ord_detail| - str.push(ord_detail) + if params[:booking_id] != nil + type=params[:booking_id].split('-')[0]; + # Sale + if type == "SAL" + @selected_item = Sale.find(params[:booking_id]) + @selected_item_type="Sale" + # Booking + else + @selected_item = Order.find(params[:booking_id]) + @selected_item_type="Order" + end end - render :json => str.to_json + + @completed_orders = Order.get_completed_order() + @booking_orders = Order.get_booking_order_table() + @booking_rooms = Order.get_booking_order_rooms() + @orders = Order.get_orders() + end + + def item_show + selection(params[:booking_id],1) + end + + def selection(selected_id, is_ajax) + str = [] + type=selected_id.split('-')[0]; + # Sale + if type == "SAL" + @order_details = SaleItem.get_order_items_details(params[:booking_id]) + @order_details.each do |ord_detail| + str.push(ord_detail) + end + # Booking + else + @order_details = OrderItem.get_order_items_details(params[:booking_id]) + @order_details.each do |ord_detail| + str.push(ord_detail) + end + end + if is_ajax == 1 + render :json => str.to_json + else + str + end end + + def update_sale_by_customer + + id = params[:sale_id][0,3] + if(id == "SAL") + sale = Sale.find(params[:sale_id]) + else + sale = Order.find(params[:sale_id]) + end + + status = sale.update_attributes(customer_id: params[:customer_id]) + + if status == true + render json: JSON.generate({:status => true}) + else + render json: JSON.generate({:status => false, :error_message => "Record not found"}) + + end + end + + def get_customer + + @customer = Customer.find(params[:customer_id]) + + response = Customer.get_member_account(@customer) + + respond_to do |format| + format.js do + render :json => { + :response_data => response.as_json, + :customer => @customer} + end + end + end + end diff --git a/app/controllers/origami/jcb_controller.rb b/app/controllers/origami/jcb_controller.rb new file mode 100644 index 00000000..5bed3470 --- /dev/null +++ b/app/controllers/origami/jcb_controller.rb @@ -0,0 +1,32 @@ +class Origami::JcbController < BaseOrigamiController + + def index + @sale_id = params[:sale_id] + + # limit jcb_amount + sale_data = Sale.find_by_sale_id(@sale_id) + total = sale_data.grand_total + @jcbcount = 0 + others = 0 + sale_data.sale_payments.each do |sale_payment| + if sale_payment.payment_method == "jcb" + @jcbcount = @jcbcount + sale_payment.payment_amount + else + others = others + sale_payment.payment_amount + end + end + @can_jcb = total - @jcbcount - others + + end + + def create + cash = params[:amount] + sale_id = params[:sale_id] + if(Sale.exists?(sale_id)) + saleObj = Sale.find(sale_id) + sale_payment = SalePayment.new + @status, @sale = sale_payment.process_payment(saleObj, @user, cash, "jcb") + end + end + +end diff --git a/app/controllers/origami/master_controller.rb b/app/controllers/origami/master_controller.rb new file mode 100644 index 00000000..67107167 --- /dev/null +++ b/app/controllers/origami/master_controller.rb @@ -0,0 +1,31 @@ +class Origami::MasterController < BaseOrigamiController + + def index + @sale_id = params[:sale_id] + + # limit master_amount + sale_data = Sale.find_by_sale_id(@sale_id) + total = sale_data.grand_total + @mastercount = 0 + others = 0 + sale_data.sale_payments.each do |sale_payment| + if sale_payment.payment_method == "master" + @mastercount = @mastercount + sale_payment.payment_amount + else + others = others + sale_payment.payment_amount + end + end + @can_master = total - @mastercount - others + end + + def create + cash = params[:amount] + sale_id = params[:sale_id] + if(Sale.exists?(sale_id)) + saleObj = Sale.find(sale_id) + sale_payment = SalePayment.new + @status, @sale = sale_payment.process_payment(saleObj, @user, cash, "master") + end + end + +end diff --git a/app/controllers/origami/mpu_controller.rb b/app/controllers/origami/mpu_controller.rb new file mode 100644 index 00000000..3707d1f4 --- /dev/null +++ b/app/controllers/origami/mpu_controller.rb @@ -0,0 +1,32 @@ +class Origami::MpuController < BaseOrigamiController + + def index + @sale_id = params[:sale_id] + + # limit mpu_amount + sale_data = Sale.find_by_sale_id(@sale_id) + total = sale_data.grand_total + @mpucount = 0 + others = 0 + sale_data.sale_payments.each do |sale_payment| + if sale_payment.payment_method == "mpu" + @mpucount = @mpucount + sale_payment.payment_amount + else + others = others + sale_payment.payment_amount + end + end + @can_mpu = total - @mpucount - others + + end + + def create + cash = params[:amount] + sale_id = params[:sale_id] + if(Sale.exists?(sale_id)) + saleObj = Sale.find(sale_id) + sale_payment = SalePayment.new + @status, @sale = sale_payment.process_payment(saleObj, @user, cash, "mpu") + end + end + +end diff --git a/app/controllers/origami/others_payments_controller.rb b/app/controllers/origami/others_payments_controller.rb new file mode 100644 index 00000000..c050c3f3 --- /dev/null +++ b/app/controllers/origami/others_payments_controller.rb @@ -0,0 +1,39 @@ +class Origami::OthersPaymentsController < BaseOrigamiController + + + def index + @membership_rebate_balance = 0 + @sale_id = params[:sale_id] + @payment_method_setting = PaymentMethodSetting.all + + # @sale_id = params[:sale_id] + # sale_data = Sale.find_by_sale_id(@sale_id) + + # if sale_data.customer_id + # customer_data= Customer.find_by_customer_id(sale_data.customer_id) + # @membership_id = customer_data.membership_id + # if !@membership_id.nil? + # membership_setting = MembershipSetting.find_by_membership_type("paypar_url") + # membership_data = SalePayment.get_paypar_account(membership_setting.gateway_url,membership_setting.auth_token,@membership_id) + # if membership_data["status"]==true + # membership_account_data = membership_data["data"]; + # membership_account_data.each do |acc_data| + # if acc_data["accountable_type"] == "REBATEACCOUNT" + # @membership_rebate_balance=acc_data["balance"] + # else + # @membership_rebate_balance = 0 + # end + # end + # else + # @membership_rebate_balance = 0 + # end + # end + # else + + # end + end + + def create + end + +end diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 447d1282..ca497b81 100644 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -1,6 +1,104 @@ class Origami::PaymentsController < BaseOrigamiController + + def index end + def create + cash = params[:cash] + sale_id = params[:sale_id] + if(Sale.exists?(sale_id)) + saleObj = Sale.find(sale_id) + sale_payment = SalePayment.new + sale_payment.process_payment(saleObj, @user, cash, "cash") + + unique_code = "ReceiptBillPdf" + customer= Customer.find(saleObj.customer_id) + + # get member information + member_info = Customer.get_member_account(customer) + + # get printer info + print_settings=PrintSetting.find_by_unique_code(unique_code) + + # Calculate Food and Beverage Total + food_total, beverage_total = SaleItem.calculate_food_beverage(saleObj.sale_items) + + printer = Printer::ReceiptPrinter.new(print_settings) + printer.print_receipt_bill(print_settings,saleObj.sale_items,saleObj,customer.name, food_total, beverage_total, member_info) + end end + + def show + sale_id = params[:sale_id] + if Sale.exists?(sale_id) + @cash = 0.0 + @other = 0.0 + @ppamount = 0.0 + @visacount= 0.0 + @jcbcount= 0.0 + @mastercount = 0.0 + @sale_data = Sale.find_by_sale_id(sale_id) + + #get customer amount + @customer = Customer.find(@sale_data.customer_id) + + # get member information + response = Customer.get_member_account(@customer) + + @balance = 0.00 + @accountable_type = '' + if response["data"]==true + response["data"].each do |res| + if res["accountable_type"] == "RebateAccount" + @balance = res["balance"] + @accountable_type = res["accountable_type"] + end + end + end + + #end customer amount + + @sale_data.sale_payments.each do |spay| + if spay.payment_method == "cash" + @cash = spay.payment_amount + end + if spay.payment_method == "mpu" + @other += spay.payment_amount + elsif spay.payment_method == "paypar" + @ppamount += spay.payment_amount + elsif spay.payment_method == "visa" + @visacount += spay.payment_amount + elsif spay.payment_method == "jcb" + @jcbcount += spay.payment_amount + elsif spay.payment_method == "master" + @mastercount += spay.payment_amount + end + end + end + end + + def reprint + + sale_id = params[:sale_id] + + saleObj = Sale.find(sale_id) + + unique_code = "ReceiptBillPdf" + customer= Customer.find(saleObj.customer_id) + + # get member information + member_info = Customer.get_member_account(customer) + + # get printer info + print_settings=PrintSetting.find_by_unique_code(unique_code) + + # Calculate Food and Beverage Total + food_total, beverage_total = SaleItem.calculate_food_beverage(saleObj.sale_items) + + printer = Printer::ReceiptPrinter.new(print_settings) + printer.print_receipt_bill(print_settings,saleObj.sale_items,saleObj,customer.name, food_total, beverage_total, member_info) + end + + end diff --git a/app/controllers/origami/paypar_payments_controller.rb b/app/controllers/origami/paypar_payments_controller.rb new file mode 100644 index 00000000..0c3ea11f --- /dev/null +++ b/app/controllers/origami/paypar_payments_controller.rb @@ -0,0 +1,21 @@ +class Origami::PayparPaymentsController < BaseOrigamiController + def create + sale_id = params[:sale_id] + redeem_amount = params[:redeem_amount] + membership_id = params[:membership_id] + payment_method = "paypar" + if(Sale.exists?(sale_id)) + saleObj = Sale.find(sale_id) + sale_payment = SalePayment.new + status,msg =sale_payment.process_payment(saleObj, @user, redeem_amount,payment_method) + if status == true + @out = true, "Success!" + else + @out =false, "Please try again payment!" + end + else + @out = false, "There has no sale record!" + end + + end +end diff --git a/app/controllers/origami/redeem_payments_controller.rb b/app/controllers/origami/redeem_payments_controller.rb new file mode 100644 index 00000000..99601449 --- /dev/null +++ b/app/controllers/origami/redeem_payments_controller.rb @@ -0,0 +1,67 @@ +class Origami::RedeemPaymentsController < BaseOrigamiController + def index + @sale_id = params[:sale_id] + payment_method = params[:payment_method] + @membership_rebate_balance=0 + sale_data = Sale.find_by_sale_id(@sale_id) + + # limit redeem_amount + food_prices, beverage_prices = SaleItem.calculate_food_beverage(sale_data.sale_items) + @payparcount = 0 + others = 0 + sale_data.sale_payments.each do |sale_payment| + if sale_payment.payment_method == "paypar" + @payparcount = @payparcount + sale_payment.payment_amount + else + others = others + sale_payment.payment_amount + end + end + is_bervage_exceed = others - (beverage_prices + sale_data.total_tax) + if is_bervage_exceed < 0 + @food_prices = food_prices - @payparcount + else + @food_prices = food_prices - @payparcount -is_bervage_exceed + end + + if sale_data + if sale_data.customer_id + customer_data= Customer.find_by_customer_id(sale_data.customer_id) + if customer_data + @membership_id = customer_data.membership_id + if !@membership_id.nil? + membership_setting = MembershipSetting.find_by_membership_type("paypar_url") + if membership_setting.gateway_url + member_actions =MembershipAction.find_by_membership_type("get_account_balance") + if member_actions.gateway_url + @campaign_type_id = member_actions.additional_parameter["campaign_type_id"] + url = membership_setting.gateway_url.to_s + member_actions.gateway_url.to_s + merchant_uid= member_actions.merchant_account_id + auth_token = member_actions.auth_token.to_s + membership_data = SalePayment.get_paypar_account(url,membership_setting.auth_token,@membership_id,@campaign_type_id,merchant_uid,auth_token) + if membership_data["status"]==true + @membership_rebate_balance=membership_data["balance"] + @out = true, @membership_rebate_balance,@membership_id + end + else + @out =false,0 + end + else + @out = false,0 + end + + + else + @out = false, 0 + end + else + @out = false, 0 + end + else + @out = false, 0 + end + else + @out = false, 0 + end + @out = false, 0 + end +end diff --git a/app/controllers/origami/request_bills_controller.rb b/app/controllers/origami/request_bills_controller.rb index 9f971289..e848366c 100644 --- a/app/controllers/origami/request_bills_controller.rb +++ b/app/controllers/origami/request_bills_controller.rb @@ -1,22 +1,37 @@ class Origami::RequestBillsController < BaseOrigamiController - def show + # Print Request Bill and add to sale tables + def print @sale = Sale.new + sale_order=SaleOrder.new - check_order = Order.find_by_id(params[:id]) - if check_order - @order_details = OrderItem.get_order_items_details(check_order.id) - @order_details = OrderItem.get_order_items_details(check_order.id) - @status, @sale_id = @sale.generate_invoice_from_order(check_order.id, nil,current_login_employee.name) - @sale_data = Sale.find_by_id(@sale_id) - @sale_items = SaleItem.where("sale_id=?",@sale_id) - end - unique_code="ReceiptBillPdf" + booking_id = params[:id] + check_booking = Booking.find_by_booking_id(booking_id) + if check_booking.sale_id.nil? + # Create Sale if it doesn't exist + puts "current_login_employee" + puts current_login_employee.name + @status, @sale_id = @sale.generate_invoice_from_booking(check_booking.id,current_login_employee) + @sale_data = Sale.find_by_sale_id(@sale_id) + @sale_items = SaleItem.where("sale_id=?",@sale_id) + else + @sale_data = Sale.find_by_sale_id(check_booking.sale_id) + @sale_items = SaleItem.where("sale_id=?",@sale_data.sale_id) + end + + unique_code = "ReceiptBillPdf" + customer= Customer.where('customer_id=' + @sale_data.customer_id) + + # get printer info print_settings=PrintSetting.find_by_unique_code(unique_code) + # find order id by sale id + # sale_order = SaleOrder.find_by_sale_id(@sale_data.sale_id) + + # Calculate Food and Beverage Total + food_total, beverage_total = SaleItem.calculate_food_beverage(@sale_items) + printer = Printer::ReceiptPrinter.new(print_settings) - - printer.print_receipt_bill(print_settings,@sale_items,@sale) - - + printer.print_receipt_bill(print_settings,@sale_items,@sale_data,customer.name, food_total, beverage_total) + redirect_to origami_path(@sale_data.sale_id) end end diff --git a/app/controllers/origami/visa_controller.rb b/app/controllers/origami/visa_controller.rb new file mode 100644 index 00000000..3cb8cabb --- /dev/null +++ b/app/controllers/origami/visa_controller.rb @@ -0,0 +1,31 @@ +class Origami::VisaController < BaseOrigamiController + + def index + @sale_id = params[:sale_id] + + # limit visa_amount + sale_data = Sale.find_by_sale_id(@sale_id) + total = sale_data.grand_total + @visacount = 0 + others = 0 + sale_data.sale_payments.each do |sale_payment| + if sale_payment.payment_method == "visa" + @visacount = @visacount + sale_payment.payment_amount + else + others = others + sale_payment.payment_amount + end + end + @can_visa = total - @visacount - others + end + + def create + cash = params[:amount] + sale_id = params[:sale_id] + if(Sale.exists?(sale_id)) + saleObj = Sale.find(sale_id) + sale_payment = SalePayment.new + @status, @sale = sale_payment.process_payment(saleObj, @user, cash, "visa") + end + end + +end diff --git a/app/controllers/reports/daily_sale_controller.rb b/app/controllers/reports/daily_sale_controller.rb new file mode 100644 index 00000000..b487c269 --- /dev/null +++ b/app/controllers/reports/daily_sale_controller.rb @@ -0,0 +1,9 @@ +class Reports::DailySaleController < BaseReportController + + def index + from, to = get_date_range_from_params + @sale_data = Sale.get_receipt_no_list(from,to) + @sale_data = Kaminari.paginate_array(@sale_data).page(params[:page]).per(50) + end + +end \ No newline at end of file diff --git a/app/controllers/reports/receipt_no_controller.rb b/app/controllers/reports/receipt_no_controller.rb new file mode 100644 index 00000000..8569c051 --- /dev/null +++ b/app/controllers/reports/receipt_no_controller.rb @@ -0,0 +1,15 @@ +class Reports::ReceiptNoController < BaseReportController + def index + from, to = get_date_range_from_params + puts "from..." + puts from + puts "to..." + puts to + @sale_data = Sale.get_receipt_no_list(from,to) + @sale_data = Kaminari.paginate_array(@sale_data).page(params[:page]).per(50) + end + + def show + + end +end \ No newline at end of file diff --git a/app/controllers/settings/accounts_controller.rb b/app/controllers/settings/accounts_controller.rb index 74f27c84..90e6a304 100644 --- a/app/controllers/settings/accounts_controller.rb +++ b/app/controllers/settings/accounts_controller.rb @@ -68,6 +68,6 @@ class Settings::AccountsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def account_params - params.require(:account).permit(:title, :account_type) + params.require(:account).permit(:title, :account_type,:discount,:point,:bonus,:rebate) end end diff --git a/app/controllers/settings/membership_actions_controller.rb b/app/controllers/settings/membership_actions_controller.rb new file mode 100644 index 00000000..ad7311f2 --- /dev/null +++ b/app/controllers/settings/membership_actions_controller.rb @@ -0,0 +1,74 @@ +class Settings::MembershipActionsController < ApplicationController + before_action :set_settings_membership_action, only: [:show, :edit, :update, :destroy] + + # GET /settings/membership_actions + # GET /settings/membership_actions.json + def index + @settings_membership_actions = MembershipAction.all + end + + # GET /settings/membership_actions/1 + # GET /settings/membership_actions/1.json + def show + end + + # GET /settings/membership_actions/new + def new + @settings_membership_action = MembershipAction.new + end + + # GET /settings/membership_actions/1/edit + def edit + end + + # POST /settings/membership_actions + # POST /settings/membership_actions.json + def create + @settings_membership_action = MembershipAction.new(settings_membership_action_params) + + respond_to do |format| + if @settings_membership_action.save + format.html { redirect_to settings_membership_actions_path, notice: 'Membership action was successfully created.' } + format.json { render :show, status: :created, location: @settings_membership_action } + else + format.html { render :new } + format.json { render json: @settings_membership_action.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /settings/membership_actions/1 + # PATCH/PUT /settings/membership_actions/1.json + def update + respond_to do |format| + if @settings_membership_action.update(settings_membership_action_params) + format.html { redirect_to settings_membership_action_path, notice: 'Membership action was successfully updated.' } + format.json { render :show, status: :ok, location: @settings_membership_action } + else + format.html { render :edit } + format.json { render json: @settings_membership_action.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /settings/membership_actions/1 + # DELETE /settings/membership_actions/1.json + def destroy + @settings_membership_action.destroy + respond_to do |format| + format.html { redirect_to settings_membership_actions_url, notice: 'Membership action was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_settings_membership_action + @settings_membership_action = MembershipAction.find(params[:id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def settings_membership_action_params + params.require(:membership_action).permit(:membership_type, :is_active, :gateway_communication_type, :gateway_url, :auth_token, :merchant_account_id, :created_by, :additional_parameter) + end +end diff --git a/app/controllers/settings/menu_categories_controller.rb b/app/controllers/settings/menu_categories_controller.rb index d7f373aa..c2a521ae 100644 --- a/app/controllers/settings/menu_categories_controller.rb +++ b/app/controllers/settings/menu_categories_controller.rb @@ -63,7 +63,14 @@ class Settings::MenuCategoriesController < ApplicationController # DELETE /settings/menu_categories/1 # DELETE /settings/menu_categories/1.json def destroy + # instances = MenuItemInstance.where("menu_item_id=?",@settings_menu_item.id) + # instances.each do |instance| + # instance.destroy + # end + # @settings_menu_item.destroy + # @settings_menu_category.destroy + abc = MenuCategory.destroyCategory(@settings_menu_category) respond_to do |format| format.html { redirect_to settings_menu_categories_path, notice: 'Menu category was successfully destroyed.' } format.json { head :no_content } diff --git a/app/controllers/settings/menu_item_instances_controller.rb b/app/controllers/settings/menu_item_instances_controller.rb index 6bd00638..2b1fcecf 100644 --- a/app/controllers/settings/menu_item_instances_controller.rb +++ b/app/controllers/settings/menu_item_instances_controller.rb @@ -11,18 +11,21 @@ class Settings::MenuItemInstancesController < ApplicationController # GET /settings/menu_item_instances/1 # GET /settings/menu_item_instances/1.json def show - @category = MenuCategory.find(@item.menu_category_id) + id = MenuItemInstance.findParentCategory(@item) + @category = MenuCategory.find(id) end # GET /settings/menu_item_instances/new def new - @category = MenuCategory.find(@item.menu_category_id) + id = MenuItemInstance.findParentCategory(@item) + @category = MenuCategory.find(id) @settings_menu_item_instances = MenuItemInstance.new end # GET /settings/menu_item_instances/1/edit def edit - @category = MenuCategory.find(@item.menu_category_id) + id = MenuItemInstance.findParentCategory(@item) + @category = MenuCategory.find(id) end # POST /settings/menu_item_instances @@ -30,6 +33,7 @@ class Settings::MenuItemInstancesController < ApplicationController def create @settings_menu_item_instances = MenuItemInstance.new(settings_menu_item_instance_params) + #check if the menu item type is simple or not( not only the diff of status .. here is different routes) if params[:simple_menu_item_id] @settings_menu_item_instances.menu_item_id = params[:simple_menu_item_id] catID = MenuItem.find(params[:simple_menu_item_id]) @@ -38,10 +42,11 @@ class Settings::MenuItemInstancesController < ApplicationController catID = MenuItem.find(params[:set_menu_item_id]) end - category = MenuCategory.find(catID.menu_category_id) + id = MenuItemInstance.findParentCategory(catID) + category = MenuCategory.find(id) respond_to do |format| if @settings_menu_item_instances.save - @settings_menu_item_instances.item_attributes = params[:menu_item_instance][:item_attributes] + @settings_menu_item_instances.item_attributes = params[:menu_item_instance][:item_attributes].reject(&:blank?) @settings_menu_item_instances.save format.html { redirect_to settings_menu_category_simple_menu_item_path(category,catID), notice: 'Menu item instance was successfully created.' } format.json { render :show, status: :created, location: @settings_menu_item_instances } @@ -55,14 +60,15 @@ class Settings::MenuItemInstancesController < ApplicationController # PATCH/PUT /settings/menu_item_instances/1 # PATCH/PUT /settings/menu_item_instances/1.json def update - puts "params[:menu_item_instance][:item_attributes]" - puts params[:menu_item_instance][:item_attributes] + #check if the menu item type is simple or not( not only the diff of status .. here is different routes) if params[:simple_menu_item_id] catID = MenuItem.find(params[:simple_menu_item_id]) else catID = MenuItem.find(params[:set_menu_item_id]) end - category = MenuCategory.find(catID.menu_category_id) + + id = MenuItemInstance.findParentCategory(catID) + category = MenuCategory.find(id) respond_to do |format| if @settings_menu_item_instances.update(settings_menu_item_instance_params) @@ -86,7 +92,13 @@ class Settings::MenuItemInstancesController < ApplicationController else catID = MenuItem.find(params[:set_menu_item_id]) end - category = MenuCategory.find(catID.menu_category_id) + # check if the menu item is sub of another menu item + if catID.menu_category_id + category = MenuCategory.find(catID.menu_category_id) + else + item = MenuItem.find(catID.menu_item_id) + category = MenuCategory.find(item.menu_category_id) + end respond_to do |format| format.html { redirect_to settings_menu_category_simple_menu_item_path(category,catID), notice: 'Menu item instance was successfully destroyed.' } format.json { head :no_content } diff --git a/app/controllers/settings/menus_controller.rb b/app/controllers/settings/menus_controller.rb index e0ecde30..fa6ac158 100644 --- a/app/controllers/settings/menus_controller.rb +++ b/app/controllers/settings/menus_controller.rb @@ -55,7 +55,8 @@ class Settings::MenusController < ApplicationController # DELETE /settings/menus/1 # DELETE /settings/menus/1.json def destroy - @settings_menu.destroy + # @settings_menu.destroy + abc = Menu.destroyMenu(@settings_menu) respond_to do |format| format.html { redirect_to settings_menus_path, notice: 'Menu was successfully destroyed.' } format.json { head :no_content } diff --git a/app/controllers/settings/order_queue_stations_controller.rb b/app/controllers/settings/order_queue_stations_controller.rb index 46fcb54d..6a0a52ae 100644 --- a/app/controllers/settings/order_queue_stations_controller.rb +++ b/app/controllers/settings/order_queue_stations_controller.rb @@ -4,7 +4,8 @@ class Settings::OrderQueueStationsController < ApplicationController # GET /settings/order_queue_stations # GET /settings/order_queue_stations.json def index - @settings_order_queue_stations = OrderQueueStation.all.active + @settings_order_queue_stations = OrderQueueStation.all + @settings_order_queue_stations = Kaminari.paginate_array(@settings_order_queue_stations).page(params[:page]).per(50) end # GET /settings/order_queue_stations/1 @@ -70,6 +71,6 @@ class Settings::OrderQueueStationsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_order_queue_station_params - params.require(:order_queue_station).permit(:station_name, :is_active, :processing_items, :print_copy, :printer_name, :font_size, :cut_per_item, :use_alternate_name, :created_by) + params.require(:order_queue_station).permit(:station_name, :is_active, :processing_items, :print_copy, :printer_name, :font_size, :cut_per_item, :use_alternate_name, :created_by,{ zone_ids: [] }) end end diff --git a/app/controllers/settings/payment_method_settings_controller.rb b/app/controllers/settings/payment_method_settings_controller.rb index ce27f725..f3ac595e 100644 --- a/app/controllers/settings/payment_method_settings_controller.rb +++ b/app/controllers/settings/payment_method_settings_controller.rb @@ -69,6 +69,6 @@ class Settings::PaymentMethodSettingsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_payment_method_setting_params - params.require(:payment_method_setting).permit(:payment_method, :is_active, :gateway_communication_type, :gateway_url, :auth_token, :merchant_account_id) + params.require(:payment_method_setting).permit(:payment_method, :is_active, :gateway_communication_type, :gateway_url, :auth_token, :merchant_account_id, :additional_parameters) end end diff --git a/app/controllers/settings/rooms_controller.rb b/app/controllers/settings/rooms_controller.rb new file mode 100644 index 00000000..69e3ec22 --- /dev/null +++ b/app/controllers/settings/rooms_controller.rb @@ -0,0 +1,81 @@ +class Settings::RoomsController < ApplicationController + before_action :set_settings_room, only: [:show, :edit, :update, :destroy] + before_action :set_settings_zone, only: [:index, :show, :edit, :new, :update,:create] + # GET /settings/rooms + # GET /settings/rooms.json + def index + @settings_rooms = @zone.rooms + end + + # GET /settings/rooms/1 + # GET /settings/rooms/1.json + def show + @room = Room.find(params[:id]) + end + + # GET /settings/rooms/new + def new + @settings_room = Room.new + end + + # GET /settings/rooms/1/edit + def edit + end + + # POST /settings/rooms + # POST /settings/rooms.json + def create + @settings_room = Room.new(settings_room_params) + @settings_room.type = DiningFacility::ROOM_TYPE + @settings_room.zone_id = params[:zone_id] + respond_to do |format| + if @settings_room.save + format.html { redirect_to settings_zone_rooms_path, notice: 'Room was successfully created.' } + format.json { render :show, status: :created, location: @settings_room } + else + puts "abc" + format.html { render :new } + format.json { render json: @settings_room.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /settings/rooms/1 + # PATCH/PUT /settings/rooms/1.json + def update + respond_to do |format| + if @settings_room.update(settings_room_params) + format.html { redirect_to settings_zone_rooms_path, notice: 'Room was successfully updated.' } + format.json { render :show, status: :ok, location: @settings_room } + else + format.html { render :edit } + format.json { render json: @settings_room.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /settings/rooms/1 + # DELETE /settings/rooms/1.json + def destroy + @settings_room.destroy + respond_to do |format| + format.html { redirect_to settings_zones_path, notice: 'Room was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_settings_room + @settings_room = Room.find(params[:id]) + end + + def set_settings_zone + @zone = Zone.find(params[:zone_id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def settings_room_params + params.require(:room).permit(:name, :status, :seater, :order_by,:is_active ,:id, :zone_id, :created_by) + end +end diff --git a/app/controllers/settings/set_menu_items_controller.rb b/app/controllers/settings/set_menu_items_controller.rb index f6771548..5946ff49 100644 --- a/app/controllers/settings/set_menu_items_controller.rb +++ b/app/controllers/settings/set_menu_items_controller.rb @@ -62,7 +62,7 @@ class Settings::SetMenuItemsController < ApplicationController # DELETE /settings/menu_items/1 # DELETE /settings/menu_items/1.json def destroy - # @settings_menu_item.destroy + abc = MenuItem.deleteRecursive(@settings_menu_item) respond_to do |format| format.html { redirect_to settings_menu_category_set_menu_items_path, notice: 'Menu item was successfully destroyed.' } format.json { head :no_content } @@ -81,6 +81,6 @@ class Settings::SetMenuItemsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_menu_item_params - params.require(:set_menu_item).permit(:item_code, :name, :alt_name, :type, :menu_category_id, :menu_item_id, :min_qty, :min_selectable_item, :max_selectable_item, :created_by) + params.require(:set_menu_item).permit(:item_code, :name, :alt_name, :type, :menu_category_id,:account_id , :menu_item_id, :min_qty, :min_selectable_item, :max_selectable_item, :created_by) end end diff --git a/app/controllers/settings/simple_menu_items_controller.rb b/app/controllers/settings/simple_menu_items_controller.rb index e0d45fcb..05952d0d 100644 --- a/app/controllers/settings/simple_menu_items_controller.rb +++ b/app/controllers/settings/simple_menu_items_controller.rb @@ -59,7 +59,7 @@ class Settings::SimpleMenuItemsController < ApplicationController # DELETE /settings/menu_items/1 # DELETE /settings/menu_items/1.json def destroy - # @settings_menu_item.destroy + abc = MenuItem.deleteRecursive(@settings_menu_item) respond_to do |format| format.html { redirect_to settings_menu_category_simple_menu_items_path, notice: 'Menu item was successfully destroyed.' } format.json { head :no_content } @@ -78,6 +78,6 @@ class Settings::SimpleMenuItemsController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_menu_item_params - params.require(:simple_menu_item).permit(:item_code, :name, :alt_name, :type, :menu_category_id,:item_attributes, :menu_item_id, :min_qty, :min_selectable_item, :max_selectable_item, :created_by) + params.require(:simple_menu_item).permit(:item_code, :name, :alt_name, :type, :menu_category_id,:account_id,:item_attributes, :menu_item_id, :min_qty, :min_selectable_item, :max_selectable_item, :created_by) end end diff --git a/app/controllers/settings/tables_controller.rb b/app/controllers/settings/tables_controller.rb new file mode 100644 index 00000000..124a0d94 --- /dev/null +++ b/app/controllers/settings/tables_controller.rb @@ -0,0 +1,81 @@ +class Settings::TablesController < ApplicationController + before_action :set_settings_table, only: [:show, :edit, :update, :destroy] + before_action :set_settings_zone, only: [:index, :show, :edit, :new, :update,:create] + # GET /settings/tables + # GET /settings/tables.json + def index + @settings_tables = @zone.tables + end + + # GET /settings/tables/1 + # GET /settings/tables/1.json + def show + @table = Table.find(params[:id]) + end + + # GET /settings/tables/new + def new + @settings_table = Table.new + end + + # GET /settings/tables/1/edit + def edit + end + + # POST /settings/tables + # POST /settings/tables.json + def create + @settings_table = Table.new(settings_table_params) + @settings_table.type = DiningFacility::TABLE_TYPE + @settings_table.zone_id = params[:zone_id] + respond_to do |format| + if @settings_table.save + format.html { redirect_to settings_zone_tables_path, notice: 'Table was successfully created.' } + format.json { render :show, status: :created, location: @settings_table } + else + puts "abc" + format.html { render :new } + format.json { render json: @settings_table.errors, status: :unprocessable_entity } + end + end + end + + # PATCH/PUT /settings/tables/1 + # PATCH/PUT /settings/tables/1.json + def update + respond_to do |format| + if @settings_table.update(settings_table_params) + format.html { redirect_to settings_zone_tables_path, notice: 'Table was successfully updated.' } + format.json { render :show, status: :ok, location: @settings_table } + else + format.html { render :edit } + format.json { render json: @settings_table.errors, status: :unprocessable_entity } + end + end + end + + # DELETE /settings/tables/1 + # DELETE /settings/tables/1.json + def destroy + @settings_table.destroy + respond_to do |format| + format.html { redirect_to settings_zones_path, notice: 'Table was successfully destroyed.' } + format.json { head :no_content } + end + end + + private + # Use callbacks to share common setup or constraints between actions. + def set_settings_table + @settings_table = Table.find(params[:id]) + end + + def set_settings_zone + @zone = Zone.find(params[:zone_id]) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def settings_table_params + params.require(:table).permit(:name, :status, :seater, :order_by,:is_active ,:id, :zone_id, :created_by) + end +end diff --git a/app/controllers/settings/zones_controller.rb b/app/controllers/settings/zones_controller.rb index 779c03fe..5752b5e3 100644 --- a/app/controllers/settings/zones_controller.rb +++ b/app/controllers/settings/zones_controller.rb @@ -10,6 +10,8 @@ class Settings::ZonesController < ApplicationController # GET /settings/zones/1 # GET /settings/zones/1.json def show + @settings_tables = @settings_zone.tables + @settings_rooms = @settings_zone.rooms end # GET /settings/zones/new @@ -28,7 +30,7 @@ class Settings::ZonesController < ApplicationController respond_to do |format| if @settings_zone.save - format.html { redirect_to @settings_zone, notice: 'Zone was successfully created.' } + format.html { redirect_to settings_zone_path(@settings_zone), notice: 'Zone was successfully created.' } format.json { render :show, status: :created, location: @settings_zone } else format.html { render :new } @@ -42,7 +44,7 @@ class Settings::ZonesController < ApplicationController def update respond_to do |format| if @settings_zone.update(settings_zone_params) - format.html { redirect_to @settings_zone, notice: 'Zone was successfully updated.' } + format.html { redirect_to settings_zone_path(@settings_zone), notice: 'Zone was successfully updated.' } format.json { render :show, status: :ok, location: @settings_zone } else format.html { render :edit } @@ -56,7 +58,7 @@ class Settings::ZonesController < ApplicationController def destroy @settings_zone.destroy respond_to do |format| - format.html { redirect_to settings_zones_url, notice: 'Zone was successfully destroyed.' } + format.html { redirect_to settings_zones_path, notice: 'Zone was successfully destroyed.' } format.json { head :no_content } end end @@ -69,6 +71,6 @@ class Settings::ZonesController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def settings_zone_params - params.require(:settings_zone).permit(:name, :is_active, :created_by) + params.require(:zone).permit(:name, :is_active, :created_by) end end diff --git a/app/controllers/transactions/manual_sales_controller.rb b/app/controllers/transactions/manual_sales_controller.rb new file mode 100644 index 00000000..77dd4371 --- /dev/null +++ b/app/controllers/transactions/manual_sales_controller.rb @@ -0,0 +1,77 @@ +class Transactions::ManualSalesController < ApplicationController + + def void + @sale = params[:sale_id] + @reason = Lookup.where("lookup_type = 'void_reason'") + respond_to do |format| + format.html # index.html.erb + format.json { render json: @sales } + end + end + + def manual_void_sale + sale_id = params[:sale_id] + reason = params[:reason] + sale = Sale.find(sale_id) + sale.sale_status = 'void' + sale.requested_by = current_login_employee.id + if sale.save + @sale = SaleAudit.record_audit_void(sale_id, current_login_employee.id, current_login_employee.id, reason) + + if sale.sale_orders + + sale.sale_orders.each do |bo| + order =Order.find(bo.order_id) + order.status= 'void' + order.save + booking_order = BookingOrder.find_by_order_id(bo.order_id) + + if booking_order.booking_id + booking = Booking.find(booking_order.booking_id) + dining_facility = booking.dining_facility + dining_facility.status = 'available' + dining_facility.save + end + end + + end + end + respond_to do |format| + format.html { redirect_to transactions_sales_url, notice: 'Sale was successfully void.' } + end + + end + + def manual_complete_sale + sale_id = params[:sale_id] + sale = Sale.find(sale_id) + + sale.sale_status = 'completed' + sale.requested_by = current_login_employee.id + remark = "Complete for Sale ID #{sale_id} By #{current_login_employee.name}" + if sale.save + @sale = SaleAudit.record_audit_complete(sale_id, remark, current_login_employee.id) + + if sale.sale_orders + + sale.sale_orders.each do |bo| + # order =Order.find(bo.order_id) + # order.status= 'void' + # order.save + booking_order = BookingOrder.find_by_order_id(bo.order_id) + + if booking_order.booking_id + booking = Booking.find(booking_order.booking_id) + dining_facility = booking.dining_facility + dining_facility.status = 'available' + dining_facility.save + end + end + + end + + end + redirect_to transactions_sales_path + end + +end diff --git a/app/controllers/transactions/orders_controller.rb b/app/controllers/transactions/orders_controller.rb new file mode 100644 index 00000000..35cefe6f --- /dev/null +++ b/app/controllers/transactions/orders_controller.rb @@ -0,0 +1,32 @@ +class Transactions::OrdersController < ApplicationController + def index + + filter = params[:filter] + if filter.nil? + orders = Order.order("order_id desc") + else + order = Order.search(filter) + if order.count > 0 + orders = order + else + orders = Order.order("order_id desc") + + end + end + @orders = Kaminari.paginate_array(orders).page(params[:page]).per(50) + respond_to do |format| + format.html # index.html.erb + format.json { render json: @orders } + end + end + def show + + @order = Order.find(params[:id]) + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @order } + end + end + +end diff --git a/app/controllers/transactions/sales_controller.rb b/app/controllers/transactions/sales_controller.rb index ea9e8ccd..fed62a34 100644 --- a/app/controllers/transactions/sales_controller.rb +++ b/app/controllers/transactions/sales_controller.rb @@ -4,12 +4,68 @@ class Transactions::SalesController < ApplicationController # GET /transactions/sales # GET /transactions/sales.json def index - @transactions_sales = Sale.all + + search_date = params[:date] + receipt_no = params[:receipt_no] + today = Date.today + + if receipt_no.nil? && search_date.nil? + @sales = Sale.where("NOT sale_status = 'void' " ).order("sale_id desc").limit(500) + @sales = Kaminari.paginate_array(@sales).page(params[:page]).per(50) + else + if !search_date.blank? && receipt_no.blank? + sale = Sale.where("DATE_FORMAT(receipt_date,'%d-%m-%Y') = ? and NOT sale_status = 'void' ", search_date).order("sale_id desc").limit(500).page(params[:page]) + elsif !search_date.blank? && !receipt_no.blank? + sale = Sale.where("receipt_no LIKE ? or DATE_FORMAT(receipt_date,'%d-%m-%Y') = ? and NOT sale_status = 'void' ", "%#{receipt_no}%", search_date).order("sale_id desc").limit(500).page(params[:page]) + else + sale = Sale.where("receipt_no LIKE ? and NOT sale_status = 'void' ", receipt_no).order("sale_id desc").limit(500).page(params[:page]) + end + if sale.count > 0 + @sales = sale + @sales = Kaminari.paginate_array(@sales).page(params[:page]).per(50) + else + @sales = 0 + end + end + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @sales } + end + end # GET /transactions/sales/1 # GET /transactions/sales/1.json def show + + @sale = Sale.find(params[:id]) + + @order_items = [] + @sale.sale_orders.each do |sale_order| + order = Order.find(sale_order.order_id) + #if (order.status == "new") + @order_items = @order_items + order.order_items + #end + end + + @sale_receivables = SalePayment.where('sale_id = ?', @sale.id) + + #get customer amount + @customer = Customer.find(@sale.customer_id) + response = Customer.get_member_account(@customer) + + if(response["status"] == true) + @membership = response["data"] + else + @membership = 0 + end + #end customer amount + + respond_to do |format| + format.html # show.html.erb + format.json { render json: @sale } + end end # GET /transactions/sales/new diff --git a/app/models/login_form.rb b/app/forms/login_form.rb similarity index 100% rename from app/models/login_form.rb rename to app/forms/login_form.rb diff --git a/app/forms/shop_form.rb b/app/forms/shop_form.rb index 19af84a5..179e73fd 100644 --- a/app/forms/shop_form.rb +++ b/app/forms/shop_form.rb @@ -1,7 +1,7 @@ #Form object to use during the installation process - will handle creation of shop model into db after verification from the cloud #provising service through license verification -class ShopForm < ActiveModel - :attr_accessor :logo, :name, :address, :township, :city, :state, :country, :license, :base_currency, :password, :password_confirmation - -end +# class ShopForm < ActiveModel +# # attr_accessor :logo, :name, :address, :township, :city, :state, :country, :license, :base_currency, :password, :password_confirmation +# +# end diff --git a/app/helpers/api/origami/paypar_helper.rb b/app/helpers/api/origami/paypar_helper.rb new file mode 100644 index 00000000..0e102f10 --- /dev/null +++ b/app/helpers/api/origami/paypar_helper.rb @@ -0,0 +1,2 @@ +module Api::Origami::PayparHelper +end diff --git a/app/helpers/crm/dining_queues_helper.rb b/app/helpers/crm/dining_queues_helper.rb new file mode 100644 index 00000000..af60bd52 --- /dev/null +++ b/app/helpers/crm/dining_queues_helper.rb @@ -0,0 +1,2 @@ +module Crm::DiningQueuesHelper +end diff --git a/app/helpers/origami/paypar_helper.rb b/app/helpers/origami/paypar_helper.rb new file mode 100644 index 00000000..fe18e897 --- /dev/null +++ b/app/helpers/origami/paypar_helper.rb @@ -0,0 +1,2 @@ +module Origami::PayparHelper +end diff --git a/app/helpers/origami/redeem_payments_helper.rb b/app/helpers/origami/redeem_payments_helper.rb new file mode 100644 index 00000000..7e9151cb --- /dev/null +++ b/app/helpers/origami/redeem_payments_helper.rb @@ -0,0 +1,2 @@ +module Origami::RedeemPaymentsHelper +end diff --git a/app/helpers/settings/membership_actions_helper.rb b/app/helpers/settings/membership_actions_helper.rb new file mode 100644 index 00000000..038ec51f --- /dev/null +++ b/app/helpers/settings/membership_actions_helper.rb @@ -0,0 +1,2 @@ +module Settings::MembershipActionsHelper +end diff --git a/app/helpers/settings/orders_helper.rb b/app/helpers/settings/orders_helper.rb new file mode 100644 index 00000000..f5825365 --- /dev/null +++ b/app/helpers/settings/orders_helper.rb @@ -0,0 +1,2 @@ +module Settings::OrdersHelper +end diff --git a/app/jobs/order_queue_processor_job.rb b/app/jobs/order_queue_processor_job.rb index e9a8c13f..e92faa36 100644 --- a/app/jobs/order_queue_processor_job.rb +++ b/app/jobs/order_queue_processor_job.rb @@ -5,7 +5,7 @@ class OrderQueueProcessorJob < ApplicationJob # Do something later #Order ID order = Order.find(order_id) - + #Loop through the order stations and process the items #Execute orders and send to order stations if order diff --git a/app/models/account.rb b/app/models/account.rb index e1cdc6d3..5d775b83 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -2,6 +2,8 @@ class Account < ApplicationRecord validates_presence_of :title, :account_type has_many :menu_items - # belongs_to :lookup , :class_name => "Lookup" - + + def self.collection + Account.select("id, title").map { |e| [e.title, e.id] } + end end diff --git a/app/models/assigned_order_item.rb b/app/models/assigned_order_item.rb index c2d2e8b0..3ac84077 100644 --- a/app/models/assigned_order_item.rb +++ b/app/models/assigned_order_item.rb @@ -1,4 +1,9 @@ class AssignedOrderItem < ApplicationRecord + before_create :generate_custom_id + + #primary key - need to be unique + self.primary_key = "assigned_order_item_id" + belongs_to :order belongs_to :order_queue_station @@ -11,4 +16,9 @@ class AssignedOrderItem < ApplicationRecord assigned_order_item.delivery_status = false assigned_order_item.save end + + private + def generate_custom_id + self.assigned_order_item_id = SeedGenerator.generate_id(self.class.name, "AOI") + end end diff --git a/app/models/booking.rb b/app/models/booking.rb index c34ecf42..01cf0f46 100644 --- a/app/models/booking.rb +++ b/app/models/booking.rb @@ -1,9 +1,17 @@ + class Booking < ApplicationRecord + self.primary_key = "booking_id" + #primary key - need to be unique - + before_create :generate_custom_id + belongs_to :dining_facility, :optional => true belongs_to :sale, :optional => true has_many :booking_orders + has_many :orders, :through => :booking_orders - + private + def generate_custom_id + self.booking_id = SeedGenerator.generate_id(self.class.name, "BKI") + end end diff --git a/app/models/booking_order.rb b/app/models/booking_order.rb index c9f748f0..ddf5ed18 100644 --- a/app/models/booking_order.rb +++ b/app/models/booking_order.rb @@ -1,5 +1,5 @@ class BookingOrder < ApplicationRecord - #primary key - need to be unique + #primary key - need to be unique belongs_to :booking belongs_to :order diff --git a/app/models/cashier_login_log.rb b/app/models/cashier_login_log.rb index d64860ce..353e9c90 100644 --- a/app/models/cashier_login_log.rb +++ b/app/models/cashier_login_log.rb @@ -1,4 +1,11 @@ class CashierLoginLog < ApplicationRecord + before_create :generate_custom_id + belongs_to :cashier_station belongs_to :employee + + private + def generate_custom_id + self.cashier_login_log_id = SeedGenerator.generate_id(self.class.name, "CLO") + end end diff --git a/app/models/customer.rb b/app/models/customer.rb index 42247791..0cbf8d58 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,11 +1,74 @@ class Customer < ApplicationRecord + + #self.primary_key = :customer_id + + before_create :generate_custom_id has_many :orders has_many :sales - validates_presence_of :name, :contact_no + validates_presence_of :name, :contact_no, :email validates :contact_no, uniqueness: true + validates :email, uniqueness: true + + paginates_per 50 + + # def self.get_member_group + + # membership = MembershipSetting.find_by_membership_type("paypar_url") + # memberaction = MembershipAction.find_by_membership_type("get_all_member_group") + # app_token = membership.auth_token.to_s + + # url = membership.gateway_url.to_s + memberaction.gateway_url.to_s + # response = HTTParty.get(url, + # :body => { app_token: app_token}.to_json, + # :headers => { + # 'Content-Type' => 'application/json', + # 'Accept' => 'application/json' + # } + # ) + # puts response.body, response.code, response.message, response.headers.inspect + + # return response; + + # end + + def self.get_member_account(customer) + membership = MembershipSetting.find_by_membership_type("paypar_url") + memberaction = MembershipAction.find_by_membership_type("get_all_member_account") + merchant_uid = memberaction.merchant_account_id.to_s + auth_token = memberaction.auth_token.to_s + url = membership.gateway_url.to_s + memberaction.gateway_url.to_s + + response = HTTParty.get(url, :body => { membership_id: customer.membership_id,merchant_uid:merchant_uid,auth_token:auth_token}.to_json, + :headers => { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + } + ) + + return response; + + end + + def self.search(search) + if search + # find(:all, :conditions => ['name LIKE ? OR contact_no LIKE ?', "%#{search}%", "%#{search}%"]) + where("name LIKE ? OR contact_no LIKE ?", "%#{search}%", "%#{search}%",) + else + find(:all) + end + end + + # def self.search(search) + # where("name LIKE ? OR contact_no LIKE ?", "%#{search}%", "%#{search}%",) + # end def lastest_invoices sales.where(:customer_id => self.id).order("created_at desc").limit(5) end + + private + def generate_custom_id + self.customer_id = SeedGenerator.generate_id(self.class.name, "CUS") + end end diff --git a/app/models/dining_facility.rb b/app/models/dining_facility.rb index 9a4f7a75..a3f8948f 100644 --- a/app/models/dining_facility.rb +++ b/app/models/dining_facility.rb @@ -9,10 +9,11 @@ class DiningFacility < ApplicationRecord scope :active, -> {where(is_active: true)} def get_current_booking - booking = Booking.where("dining_facility_id = #{self.id} and booking_status ='occupied' and checkin_at between '#{DateTime.now.utc - 5.hours}' and '#{DateTime.now.utc}' and checkout_at is null").limit(1) + puts "enter booking" + booking = Booking.where("dining_facility_id = #{self.id} and booking_status ='assign' and checkin_at between '#{DateTime.now.utc - 5.hours}' and '#{DateTime.now.utc}' and checkout_at is null").limit(1) if booking.count > 0 then - return booking[0] + return booking[0].booking_id else return nil end diff --git a/app/models/dining_queue.rb b/app/models/dining_queue.rb new file mode 100644 index 00000000..09f8b6b5 --- /dev/null +++ b/app/models/dining_queue.rb @@ -0,0 +1,7 @@ +class DiningQueue < ApplicationRecord + + def self.generate_queue_no + queue_no = DiningQueue.all.count + 1 + return queue_no + end +end diff --git a/app/models/employee.rb b/app/models/employee.rb index 1f3cace0..98b8380b 100644 --- a/app/models/employee.rb +++ b/app/models/employee.rb @@ -6,6 +6,9 @@ class Employee < ApplicationRecord validates :emp_id, uniqueness: true, numericality: true, length: {in: 1..4}, allow_blank: true validates :password, numericality: true, length: {in: 3..9}, allow_blank: true + def self.collection + Employee.select("id, name").map { |e| [e.name, e.id] } + end def self.login(emp_id, password) user = Employee.find_by_emp_id(emp_id) diff --git a/app/models/lookup.rb b/app/models/lookup.rb index e1b141df..5434cedd 100644 --- a/app/models/lookup.rb +++ b/app/models/lookup.rb @@ -17,6 +17,10 @@ class Lookup < ApplicationRecord "Gateway Communication Type" => "gateway_communication_type"} end + # def self.get_by_type( lookup_type) + # Lookup.select("value, name").where("lookup_type = ?", lookup_type ).order("name asc").map { |r| [r.name, r.value] } + # end + def self.collection_of(type) Lookup.select("name, value").where("lookup_type" => type ).map { |l| [l.name, l.value] } diff --git a/app/models/membership_action.rb b/app/models/membership_action.rb new file mode 100644 index 00000000..93a4b3d8 --- /dev/null +++ b/app/models/membership_action.rb @@ -0,0 +1,2 @@ +class MembershipAction < ApplicationRecord +end diff --git a/app/models/menu.rb b/app/models/menu.rb index 0c956a1e..05adfac4 100644 --- a/app/models/menu.rb +++ b/app/models/menu.rb @@ -22,4 +22,13 @@ class Menu < ApplicationRecord return current_menu end + + def self.destroyMenu(menu) + cats = MenuCategory.where("menu_id=?",menu.id) + cats.each do |cat| + abc = MenuCategory.destroyCategory(cat) + end + menu.destroy + return false + end end diff --git a/app/models/menu_category.rb b/app/models/menu_category.rb index 474990f2..e660b4b5 100644 --- a/app/models/menu_category.rb +++ b/app/models/menu_category.rb @@ -8,5 +8,29 @@ class MenuCategory < ApplicationRecord default_scope { order('order_by asc') } + def self.destroyCategory(menu_category) + # find the sub menu item of current item + sub_menu_cat = MenuCategory.where("menu_category_id=?",menu_category.id) + if sub_menu_cat.length != 0 + sub_menu_cat.each do |sub| + if destroyCategory(sub) + end + end + # find the items of current menu item + items = MenuItem.where("menu_category_id=?",menu_category.id) + items.each do |item| + abc = MenuItem.deleteRecursive(item) + end + menu_category.destroy + return true + else + items = MenuItem.where("menu_category_id=?",menu_category.id) + items.each do |item| + abc = MenuItem.deleteRecursive(item) + end + menu_category.destroy + return false + end + end end diff --git a/app/models/menu_item.rb b/app/models/menu_item.rb index 2a4e86be..89967e2e 100644 --- a/app/models/menu_item.rb +++ b/app/models/menu_item.rb @@ -1,9 +1,10 @@ class MenuItem < ApplicationRecord - belongs_to :account + belongs_to :menu_category, :optional => true has_many :menu_item_instances belongs_to :parent, :class_name => "MenuItem", foreign_key: "menu_item_id", :optional => true has_many :children, :class_name => "MenuItem", foreign_key: "menu_item_id" + belongs_to :account validates_presence_of :item_code, :name, :type, :min_qty, :taxable, :min_selectable_item, :max_selectable_item @@ -38,4 +39,31 @@ class MenuItem < ApplicationRecord return nil end + + def self.deleteRecursive(menu_item) + + # find the sub menu item of current item + sub_menu_items = MenuItem.where("menu_item_id=?",menu_item.id) + if sub_menu_items.length != 0 + sub_menu_items.each do |subitem| + if deleteRecursive(subitem) + end + end + # find the instances of current menu item + instances = MenuItemInstance.where("menu_item_id=?",menu_item.id) + instances.each do |instance| + instance.destroy + end + menu_item.destroy + return true + else + instances = MenuItemInstance.where("menu_item_id=?",menu_item.id) + instances.each do |instance| + instance.destroy + end + menu_item.destroy + return false + end + + end end diff --git a/app/models/menu_item_instance.rb b/app/models/menu_item_instance.rb index e7f7775e..09225a23 100644 --- a/app/models/menu_item_instance.rb +++ b/app/models/menu_item_instance.rb @@ -1,4 +1,12 @@ class MenuItemInstance < ApplicationRecord belongs_to :menu_item + def self.findParentCategory(item) + if item.menu_category_id + return item.menu_category_id + else + parentitem = MenuItem.find(item.menu_item_id) + findParentCategory(parentitem) + end + end end diff --git a/app/models/order.rb b/app/models/order.rb index f571faa9..f3ae798c 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,8 @@ class Order < ApplicationRecord - #primary key - need to be unique + self.primary_key = "order_id" + #primary key - need to be unique + before_create :generate_custom_id before_create :set_order_date belongs_to :customer @@ -23,14 +25,15 @@ class Order < ApplicationRecord booking = nil if self.new_booking + booking = Booking.create({:dining_facility_id => self.table_id,:type => "TableBooking", :checkin_at => Time.now.utc, :checkin_by => self.employee_name, :booking_status => "assign" }) + table = DiningFacility.find(self.table_id) + table.status = "occupied" + table.save else - if (self.booking_id.to_i > 0 ) - booking = Booking.find(self.booking_id) - end - + booking = Booking.find(self.booking_id) end booking.save! @@ -40,13 +43,13 @@ class Order < ApplicationRecord self.adding_line_items #Add Order Table and Room relation afrer order creation - BookingOrder.create({:booking_id => booking.id, :order => self}) + BookingOrder.create({:booking_id => booking.booking_id, :order => self}) #Send order to queue one it done! process_order_queue #send order to broadcast job - send_order_broadcast + #send_order_broadcast return true, booking @@ -182,14 +185,6 @@ class Order < ApplicationRecord return new_items_list end - private - def validate_api_inputs - - end - - def set_order_date - self.date = Time.now.utc - end #Update Items Count and Quantity changes whenever there is changes def update_products_and_quantity_count @@ -198,7 +193,7 @@ class Order < ApplicationRecord # Count number of different items self.item_count = self.order_items.item_count self.quantity_count = quantity_count - # Counter number of quantity + # Counter number of quantityf end #Process order items and send to order queue @@ -214,42 +209,125 @@ class Order < ApplicationRecord OrderBroadcastJob.perform_later(self.id) end - #Origami: Cashier : to view order type Table + #Origami: Cashier : to view order Table def self.get_order_table - order_table = Order.select("orders.id as order_id,sum(order_items.qty*order_items.price) as total_price, - order_items.id as order_items_id,dining_facilities.name as table_name") - .joins("left join booking_orders on booking_orders.order_id = orders.id - left join bookings on bookings.id = booking_orders.id + order_table = Order.select("orders.order_id as order_id,sum(order_items.qty*order_items.price) as total_price, + order_items.order_items_id as order_items_id,dining_facilities.name as table_name") + .joins("left join booking_orders on booking_orders.order_id = orders.order_id + left join bookings on bookings.booking_id = booking_orders.booking_order_id left join dining_facilities on dining_facilities.id = bookings.dining_facility_id - left join order_items on order_items.order_id = orders.id") + left join order_items on order_items.order_id = orders.order_id") .where("dining_facilities.type=? and orders.order_type=? and dining_facilities.is_active=?",DiningFacility::TABLE_TYPE,"dine_in",true) - - .group("orders.id") - + .group("orders.order_id, order_items.order_items_id,dining_facilities.name") end + + #Origami: Cashier : to view booking order Table + def self.get_booking_order_table + booking_orders = Booking.select("sales.receipt_no,orders.status as order_status, sales.sale_status as sale_status, + orders.order_id as order_id,sales.customer_id as sale_customer_id,orders.customer_id as order_customer_id, + bookings.booking_id,sales.sale_id as sale_id,dining_facilities.name as table_name") + .joins("left join booking_orders on booking_orders.booking_id = bookings.booking_id") + .joins("left join dining_facilities on dining_facilities.id = bookings.dining_facility_id") + .joins("left join orders on orders.order_id = booking_orders.order_id") + .joins("left join sales on sales.sale_id = bookings.sale_id") + .where("(orders.status = 'new' or orders.status = 'billed') and (dining_facilities.type=? and dining_facilities.is_active=?)",DiningFacility::TABLE_TYPE,true) + .group("bookings.booking_id") + # For PG + # booking_orders.order_id IS NOT NULL and dining_facilities.type=? and dining_facilities.is_active=?",DiningFacility::TABLE_TYPE,true + # sales.receipt_no,orders.status,sales.sale_id,dining_facilities.name,orders.status,orders.order_id + end + + #Origami: Cashier : to view booking order Table + def self.get_completed_order + completed_orders = Booking.select("sales.receipt_no, sales.sale_status, orders.status as order_status,orders.order_id, + bookings.booking_id,sales.sale_id as sale_id,dining_facilities.name as table_name,sales.customer_id as sale_customer_id,orders.customer_id as order_customer_id") + .joins("left join booking_orders on booking_orders.booking_id = bookings.booking_id") + .joins("left join dining_facilities on dining_facilities.id = bookings.dining_facility_id") + .joins("left join orders on orders.order_id = booking_orders.order_id") + .joins("left join sales on sales.sale_id = bookings.sale_id") + .where("sales.sale_status='completed'") + .group("sales.sale_id,bookings.booking_id,sales.receipt_no,orders.status,sales.sale_id,dining_facilities.name,orders.status,orders.order_id") + # For PG + #bookings.booking_id,sales.receipt_no,orders.status,sales.sale_id,dining_facilities.name,orders.status,orders.order_id + end + + #Origami: Cashier : to view order type Room + def self.get_booking_order_rooms + booking_rooms = Booking.select("sales.receipt_no,orders.status as order_status, sales.sale_status as sale_status, + orders.order_id as order_id,sales.customer_id as sale_customer_id,orders.customer_id as order_customer_id, + bookings.booking_id,orders.customer_id as customer_id, + sales.sale_id as sale_id,dining_facilities.name as room_name") + .joins("left join booking_orders on booking_orders.booking_id = bookings.booking_id") + .joins("left join dining_facilities on dining_facilities.id = bookings.dining_facility_id") + .joins("left join orders on orders.order_id = booking_orders.order_id") + .joins("left join sales on sales.sale_id = bookings.sale_id") + .where("(orders.status = 'new' or orders.status = 'billed') and (dining_facilities.type=? and dining_facilities.is_active=?)",DiningFacility::ROOM_TYPE,true) + .group("bookings.booking_id") + # For PG + # booking_orders.order_id IS NOT NULL and dining_facilities.type=? and dining_facilities.is_active=?",DiningFacility::ROOM_TYPE,true + # sales.receipt_no,orders.status,sales.sale_id,dining_facilities.name,orders.customer_id,orders.order_id + end + #Origami: Cashier : to view order type Room def self.get_order_rooms - order_rooms = Order.select("orders.id as order_id,sum(order_items.qty*order_items.price) as total_price, - order_items.id as order_items_id,dining_facilities.name as room_name") - .joins("left join booking_orders on booking_orders.order_id = orders.id - left join bookings on bookings.id = booking_orders.id + order_rooms = Order.select("orders.order_id as order_id,sum(order_items.qty*order_items.price) as total_price, + order_items.id as order_items_id,dining_facilities.name as room_name") + .joins("left join booking_orders on booking_orders.order_id = orders.order_id + left join bookings on bookings.booking_id = booking_orders.order_id left join dining_facilities on dining_facilities.id = bookings.dining_facility_id - left join order_items on order_items.order_id = orders.id") + left join order_items on order_items.order_id = orders.order_id") .where("dining_facilities.type=? and orders.order_type=? and dining_facilities.is_active=?",DiningFacility::ROOM_TYPE,"dine_in",true) - .group("orders.id,order_items.id,dining_facilities.name") + .group("orders.order_id") end + #Origami: Cashier : to view orders def self.get_orders from = Time.now.beginning_of_day.utc to = Time.now.end_of_day.utc - orders = Order.select("orders.id as order_id,sum(order_items.qty*order_items.price) as total_price, - order_items.id as order_items_id,dining_facilities.name as table_or_room_name") - .joins("left join booking_orders on booking_orders.order_id = orders.id - left join bookings on bookings.id = booking_orders.id - left join dining_facilities on dining_facilities.id = bookings.dining_facility_id - left join order_items on order_items.order_id = orders.id") + orders=Booking.select("sales.receipt_no, sales.sale_status as sale_status, orders.status as order_status, + orders.order_id as order_id,sales.customer_id as sale_customer_id,orders.customer_id as order_customer_id, + bookings.booking_id,orders.customer_id as customer_id, + sales.sale_id as sale_id,dining_facilities.name as table_name") + .joins("left join booking_orders on booking_orders.booking_id = bookings.booking_id") + .joins("left join dining_facilities on dining_facilities.id = bookings.dining_facility_id") + .joins("left join orders on orders.order_id = booking_orders.order_id") + .joins("left join sales on sales.sale_id = bookings.sale_id") + .where("(orders.status = 'new' or orders.status = 'billed')") + + # orders = Order.select("orders.order_id as order_id,sales.receipt_no,orders.status as order_status, sales.sale_status as sale_status, + # orders.order_id as order_id,sales.customer_id as sale_customer_id,orders.customer_id as order_customer_id + # ,bookings.booking_id,sales.sale_id as sale_id,dining_facilities.name as table_name") + # .joins("left join booking_orders on booking_orders.order_id = orders.order_id + # left join bookings on bookings.booking_id = booking_orders.order_id + # left join dining_facilities on dining_facilities.id = bookings.dining_facility_id + # left join order_items on order_items.order_id = orders.order_id + # left join sale_orders on sale_orders.order_id = orders.order_id + # left join sales on sales.sale_id = sale_orders.sale_id") + # .where("(orders.status = 'new' or orders.status = 'billed')") + # .group("orders.order_id") + # For PG + # .where("dining_facilities.is_active=? and orders.date between ? and ?",true,from,to) + # .group("orders.order_id,order_items.order_items_id,dining_facilities.name,sales.receipt_no,bookings.booking_id,sales.sale_id,orders.customer_id") - .where("dining_facilities.is_active=? and orders.date between ? and ?",true,from,to) - .group("orders.id") end + + def self.search(search) + if search + # find(:all, :conditions => ['name LIKE ? OR contact_no LIKE ?', "%#{search}%", "%#{search}%"]) + where("order_id LIKE ?", "%#{search}%") + else + find(:all) + end + end + + private + + def generate_custom_id + self.order_id = SeedGenerator.generate_id(self.class.name, "ODR") + end + + def set_order_date + self.date = Time.now.utc + end + end diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 1633c1c4..564aa939 100644 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -1,5 +1,8 @@ class OrderItem < ApplicationRecord + self.primary_key = "order_items_id" + #primary key - need to be unique + before_create :generate_custom_id #Associations belongs_to :order, autosave: true @@ -32,14 +35,33 @@ class OrderItem < ApplicationRecord #logger.debug orderitem.to_yml orderitem.save! - - end + #Origami : Cashier : to show order items details - def self.get_order_items_details(order_id) + def self.get_order_items_details(booking_id) + # booking_orders = BookingOrder.where("booking_id=?",booking.booking_id) + # if booking_orders + # booking_orders.each do |book_order| + # order_details = OrderItem.select("order_items.item_name,order_items.qty,order_items.price,(order_items.qty*order_items.price) as total_price") + # .joins("left join orders on orders.order_id = order_items.order_id") + # .where("order_items.order_id=?",book_order.order) + # return order_details + # end + # else + # return false + # end + order_details = OrderItem.select("order_items.item_name,order_items.qty,order_items.price,(order_items.qty*order_items.price) as total_price") - .joins("left join orders on orders.id = order_items.order_id") - .where("order_items.order_id=?",order_id) - + .joins("left join orders on orders.order_id = order_items.order_id") + .joins("left join booking_orders on booking_orders.order_id = order_items.order_id") + .joins("left join bookings on bookings.booking_id = booking_orders.booking_id") + .where("bookings.booking_id=?",booking_id) + + return order_details + end + + private + def generate_custom_id + self.order_items_id = SeedGenerator.generate_id(self.class.name, "ODI") end end diff --git a/app/models/order_queue_station.rb b/app/models/order_queue_station.rb index b0619af2..874f2fb0 100644 --- a/app/models/order_queue_station.rb +++ b/app/models/order_queue_station.rb @@ -5,10 +5,12 @@ class OrderQueueStation < ApplicationRecord has_many :assigned_order_items has_many :order_items + has_many :order_queue_process_by_zones + has_many :zones, through: :order_queue_process_by_zones scope :active, -> {where(is_active: true)} - def process_order (order) + def process_order (order) oqs_stations = OrderQueueStation.active order_items = order.order_items @@ -20,10 +22,10 @@ class OrderQueueStation < ApplicationRecord #Loop through the processing items pq_items.each do |pq_item| #Processing through the looping items - order_items.each do |order_item| + order_items.each do |order_item| if (pq_item == order_item.item_code) #Same Order_items can appear in two location. - AssignedOrderItem.assigned_order_item(order, order_item.item_code, oqs) + AssignedOrderItem.assigned_order_item(order, order_item.item_code, oqs) end end diff --git a/app/models/printer/order_queue_printer.rb b/app/models/printer/order_queue_printer.rb index 6a8a4b78..9b3f5205 100644 --- a/app/models/printer/order_queue_printer.rb +++ b/app/models/printer/order_queue_printer.rb @@ -1,45 +1,47 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker - def print_order_item(printer_settings,order_id, item_code) + def print_order_item(printer_name,order_id, item_code) #Use CUPS service #Generate PDF #Print order_item= print_query('order_item', item_code) #OrderItem.find_by_item_code(item_code) - pdf = OrderItemPdf.new(order_item[0],printer_settings) + pdf = OrderItemPdf.new(order_item[0]) pdf.render_file "tmp/receipt.pdf" - self.print("tmp/receipt.pdf") + self.print("tmp/receipt.pdf", printer_name) end - def print_order_summary(printer_settings,booking_id) + def print_order_summary(printer_name,order_id) #Use CUPS service #Generate PDF #Print - order=print_query('booking',booking_id) - filename = "tmp/order_summary_#{booking_id}" + ".pdf" - pdf = OrderSummaryPdf.new(order,printer_settings) + order=print_query('order_summary',order_id) + filename = "tmp/order_summary_#{order_id}" + ".pdf" + pdf = OrderSummaryPdf.new(order) pdf.render_file filename - self.print(filename) + self.print(filename, printer_name) end # Query for OQS with status def print_query(type, code) if type == 'order_item' - OrderItem.select("order_items.item_code, order_items.item_name,order_items.item_order_by as order_by, order_items.created_at as order_at, cus.name as customer, df.name as dining") - .joins("left join orders ON orders.id = order_items.order_id + OrderItem.select("order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.item_order_by as order_by, order_items.created_at as order_at, cus.name as customer, df.name as dining") + .joins("left join orders ON orders.order_id = order_items.order_id left join booking_orders AS bo ON bo.order_id=order_items.order_id - left join bookings AS b ON b.id = bo.booking_id + left join bookings AS b ON b.booking_id = bo.booking_id left join dining_facilities AS df ON df.id = b.dining_facility_id - left join customers as cus ON cus.id = orders.customer_id") - .where("order_items.item_code=" + code) + left join customers as cus ON cus.customer_id = orders.customer_id") + .where("order_items.item_code='" + code + "'") .group("order_items.item_code") else - OrderItem.select("order_items.item_code, order_items.item_name, df.name as dining") - .joins("left join orders ON orders.id = order_items.order_id + OrderItem.select("order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.item_order_by as order_by, order_items.created_at as order_at, cus.name as customer, df.name as dining") + .joins("left join orders ON orders.order_id = order_items.order_id left join booking_orders AS bo ON bo.order_id=order_items.order_id - left join bookings AS b ON b.id = bo.booking_id - left join dining_facilities AS df ON df.id = b.dining_facility_id") - .where("booking.id=" + code) + left join bookings AS b ON b.booking_id = bo.booking_id + left join dining_facilities AS df ON df.id = b.dining_facility_id + left join customers as cus ON cus.customer_id = orders.customer_id") + .where("orders.order_id='" + code + "'") + .group("order_items.item_code") end end diff --git a/app/models/printer/receipt_printer.rb b/app/models/printer/receipt_printer.rb index d25dc8c3..92468b0e 100644 --- a/app/models/printer/receipt_printer.rb +++ b/app/models/printer/receipt_printer.rb @@ -63,13 +63,34 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker self.print(filename) end -#Bill Receipt Print - def print_receipt_bill(printer_settings,sale_items,sale) + + #Bill Receipt Print + def print_receipt_bill(printer_settings,sale_items,sale_data, customer_name, food_total, beverage_total, member_info = nil) #Use CUPS service #Generate PDF #Print - pdf = ReceiptBillPdf.new(printer_settings,sale_items,sale) - pdf.render_file "tmp/receipt_bill_#{sale.id}.pdf" - self.print("tmp/receipt_bill_#{sale.id}.pdf") + pdf = ReceiptBillPdf.new(printer_settings, sale_items, sale_data, customer_name, food_total, beverage_total, member_info) + pdf.render_file "tmp/receipt_bill.pdf" + self.print("tmp/receipt_bill.pdf") + end + + #Queue No Print + def print_queue_no(printer_settings,queue) + #Use CUPS service + #Generate PDF + #Print + pdf = QueueNoPdf.new(printer_settings,queue) + pdf.render_file "tmp/print_queue_no.pdf" + self.print("tmp/print_queue_no.pdf") + end + + #Bill Receipt Print + def print_crm_order(booking,order_items,setting) + #Use CUPS service + #Generate PDF + #Print + pdf = CrmOrderPdf.new(booking,order_items,setting) + pdf.render_file "tmp/print_crm_order.pdf" + self.print("tmp/print_crm_order.pdf") end end diff --git a/app/models/room_booking.rb b/app/models/room_booking.rb index fb7c0dac..7efa52cb 100644 --- a/app/models/room_booking.rb +++ b/app/models/room_booking.rb @@ -1,3 +1,4 @@ class RoomBooking < Booking - + has_many :orders + end diff --git a/app/models/sale.rb b/app/models/sale.rb index ca3bd631..9683c2b2 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -1,6 +1,8 @@ -#primary key - need to be unique generated for multiple shops - class Sale < ApplicationRecord + self.primary_key = "sale_id" + + #primary key - need to be unique generated for multiple shops + before_create :generate_custom_id #before_create :generate_receipt_no belongs_to :cashier, :optional => true belongs_to :customer, :optional => true @@ -10,6 +12,7 @@ class Sale < ApplicationRecord has_many :sale_taxes has_many :sale_payments has_many :sale_orders + has_many :bookings scope :open_invoices, -> { where("sale_status = 'new' and receipt_date BETWEEN '#{DateTime.now.utc.end_of_day}' AND '#{DateTime.now.utc.beginning_of_day}'") } @@ -22,18 +25,19 @@ class Sale < ApplicationRecord #get all order attached to this booking and combine into 1 invoice booking.booking_orders.each do |order| if booking.sale_id - status, sale_id = generate_invoice_from_order(order.order_id, nil, requested_by) + status, sale_id = generate_invoice_from_order(order.order_id, nil, booking, requested_by) else - status, sale_id = generate_invoice_from_order(order.order_id, booking.sale_id, requested_by) + status, sale_id = generate_invoice_from_order(order.order_id, booking.sale_id, booking, requested_by) end booking.sale_id = sale_id end - - return status + order = booking.booking_orders.take.order + link_order_sale(order.id) + return status, sale_id end end - def generate_invoice_from_order (order_id, sale_id, requested_by) + def generate_invoice_from_order (order_id, sale_id, booking, requested_by) taxable = true #if sale_id is exsit and validate #add order to that invoice @@ -49,10 +53,14 @@ class Sale < ApplicationRecord generate_receipt_no order = Order.find(order_id) - #Default - Values - self.tax_type = "execlusive" + #Default Tax - Values + self.tax_type = "exclusive" + + # set cashier by current login + self.cashier_id = requested_by.id + self.cashier_name = requested_by.name + self.requested_by = requested_by.name - self.requested_by = requested_by self.requested_at = DateTime.now.utc Rails.logger.debug "Order -> #{order.id} | order_status -> #{order.status}" @@ -70,11 +78,17 @@ class Sale < ApplicationRecord self.save! - #compute summary + + #compute sales summary compute #Update the order items that is billed order.update_items_status_to_billed(nil) + order.status = "billed" + order.save + + booking.sale_id = self.id + booking.save return true, self.id end @@ -172,6 +186,7 @@ class Sale < ApplicationRecord end + # Tax Calculate def apply_tax(total_taxable) #if tax is not apply create new record @@ -207,6 +222,7 @@ class Sale < ApplicationRecord private + def product_get_unit_price(item_code) menu_item_hash =MenuItem.search_by_item_code(item_code) if (menu_instance_code) @@ -217,9 +233,15 @@ class Sale < ApplicationRecord def link_order_sale(order_id) #create if it doesn't exist - if (SaleOrder.where("sale_id = #{self.id} and order_id=#{order_id}").nil?) - SaleOrder.create(:sale_id => self.id, :order_id => order_id) + saleOrder = SaleOrder.where("sale_id=? and order_id=?", self.id, order_id).take + + if saleOrder.nil? + sale_order = SaleOrder.new + sale_order.create_sale_order(self.id, order_id) end + # if (SaleOrder.where("sale_id = #{self.id} and order_id=#{order_id}").nil?) + # SaleOrder.create(:sale_id => self.id, :order_id => order_id) + # end #dosomrting here #puts Time.now.format(":short") end @@ -235,11 +257,29 @@ class Sale < ApplicationRecord if self.receipt_no.nil? prefix = DateTime.now().utc #self.receipt_no = prefix.to_s + "/" + self.shit_id.to_s + "/" + SeedGenerator.new_receipt_no().to_s - self.receipt_no = prefix.strftime("%Y%m%d") + "/" + SeedGenerator.new_receipt_no().to_s + self.receipt_no = prefix.strftime("%Y%m%d") + "-" + SeedGenerator.new_receipt_no().to_s self.receipt_date = prefix Rails.logger.debug "Receipt No #{self.receipt_no} | Date #{ self.receipt_date.to_s}" end end + def self.search(search) + if search + # find(:all, :conditions => ['name LIKE ? OR contact_no LIKE ?', "%#{search}%", "%#{search}%"]) + where("receipt_no LIKE ?", "%#{search}%",) + else + find(:all) + end + end + + private + + def generate_custom_id + self.sale_id = SeedGenerator.generate_id(self.class.name, "SAL") + end + + def self.get_receipt_no_list(from,to) + sale = Sale.where("sale_status=? and receipt_date between ? and ?","completed",from,to) + end end diff --git a/app/models/sale_audit.rb b/app/models/sale_audit.rb index cce6982d..f8c38857 100644 --- a/app/models/sale_audit.rb +++ b/app/models/sale_audit.rb @@ -1,21 +1,35 @@ class SaleAudit < ApplicationRecord -#primary key - need to be unique generated for multiple shops - + self.primary_key = "sale_audit_id" + + #primary key - need to be unique generated for SaleAudit + before_create :generate_custom_id + belongs_to :sale - def record_audit_void(sale_id, void_by, approved_by, reason) + def self.record_audit_void(sale_id, void_by, approved_by, reason) #sale_audit - sale_audit = SaleAudit.new() - sale_audit.sale_id = sale_id - sale_audit.action = "SALEVOID" - sale_audit.action_at = DateTime.now.utc - sale_audit.action_by = void_by + sale_audit = SaleAudit.new() + sale_audit.sale_id = sale_id + sale_audit.action = "SALEVOID" + sale_audit.action_at = DateTime.now.utc + sale_audit.action_by = void_by sale_audit.approved_by = approved_by - sale_audit.remark = reason + sale_audit.remark = reason sale_audit.save! #sale_audit. end + def self.record_audit_complete(sale_id, remark, action_by) + sale_audit = SaleAudit.new() + sale_audit.sale_id = sale_id + sale_audit.action = "SALECOMPLETE" + sale_audit.action_at = DateTime.now.utc + sale_audit.action_by = action_by + sale_audit.remark = remark + sale_audit.approved_by = Time.now + sale_audit.save! + end + def record_audit_discount(sale_id, discount_by, approved_by, reason) #sale_audit sale_audit = SaleAudit.new() @@ -41,13 +55,19 @@ class SaleAudit < ApplicationRecord sale_audit.save! end - def record_payment(sale_id, remark, action_by) + def self.record_payment(sale_id, remark, action_by) sale_audit = SaleAudit.new() sale_audit.sale_id = sale_id sale_audit.action = "SALEPAYMENT" sale_audit.action_at = DateTime.now.utc sale_audit.action_by = action_by sale_audit.remark = remark + sale_audit.approved_by = Time.now sale_audit.save! end + + private + def generate_custom_id + self.sale_audit_id = SeedGenerator.generate_id(self.class.name, "SAI") + end end diff --git a/app/models/sale_item.rb b/app/models/sale_item.rb index c92ed48f..c49e9317 100644 --- a/app/models/sale_item.rb +++ b/app/models/sale_item.rb @@ -1,9 +1,80 @@ class SaleItem < ApplicationRecord -#primary key - need to be unique generated for multiple shops + self.primary_key = "sale_item_id" + + #primary key - need to be unique generated for multiple shops + before_create :generate_custom_id belongs_to :sale #compute items - discount, tax, price_change def compute_item end + + + def self.get_order_items_details(sale_id) + order_details = SaleItem.select("sales.total_tax as tax_amount, sales.grand_total as grand_total_amount , sales.total_discount as discount_amount,sales.receipt_date as receipt_date, + sales.cashier_name,sales.receipt_no,sale_items.product_name as item_name,sale_items.qty,sale_items.price,sale_items.unit_price as total_price") + .joins("left join sales on sales.sale_id = sale_items.sale_id") + .where("sale_items.sale_id=?",sale_id) + + # sale_orders = SaleOrder.where("sale_id=?",sale_id) + # if sale_orders + # sale_orders.each do |sale_order| + # order_details = SaleItem.select("sales.total_discount as discount_amount,DATE_FORMAT(sales.receipt_date,'%Y-%m-%d %h:%m') as receipt_date,sales.cashier_name,sales.receipt_no,sale_items.product_name as item_name,sale_items.qty,sale_items.price,sale_items.unit_price as total_price") + # .joins("left join sales on sales.id = sale_items.sale_id") + # .where("sale_items.sale_id=?",sale_order.sale_id) + # return order_details + # end + # else + # return false + # end + end + + def self.calculate_food_beverage(sale_items) + food_prices=0 + beverage_prices=0 + + sale_items.each do |si| + food_price, beverage_price = self.get_price(si.sale_item_id) + + food_prices = food_prices + food_price + beverage_prices = beverage_prices + beverage_price + end + puts food_prices + puts beverage_prices + return food_prices, beverage_prices + end + + def self.get_price(sale_item_id) + food_price=0 + beverage_price=0 + + item=SaleItem.select("sale_items.price , menu_items.account_id") + .joins("left join menu_items on menu_items.item_code = sale_items.product_code") + .where("sale_items.sale_item_id=?", sale_item_id.to_s) + if item[0].account_id == 1 + food_price = item[0].price + else + beverage_price = item[0].price + end + + return food_price, beverage_price + end + + def self.get_overall_discount(sale_id) + price = 0.0 + item=SaleItem.where("product_code=?", sale_id) + + item.each do|i| + price += i.price + end + + return price + end + + private + def generate_custom_id + self.sale_item_id = SeedGenerator.generate_id(self.class.name, "SLI") + + end end diff --git a/app/models/sale_order.rb b/app/models/sale_order.rb index 23fd39bd..786054c9 100644 --- a/app/models/sale_order.rb +++ b/app/models/sale_order.rb @@ -1,6 +1,23 @@ class SaleOrder < ApplicationRecord -#primary key - need to be unique generated for multiple shops + self.primary_key = "sale_order_id" + + #primary key - need to be unique generated for multiple shops + before_create :generate_sale_order_id belongs_to :sale belongs_to :order + + def create_sale_order(sale, order) + self.sale_id = sale + self.order_id = order + self.save + + end + + private + def generate_sale_order_id + self.class.name + saleOrderId = SeedGenerator.generate_id(self.class.name, "SOI") + self.sale_order_id = saleOrderId + end end diff --git a/app/models/sale_payment.rb b/app/models/sale_payment.rb index 2f7b72ea..465a8e5b 100644 --- a/app/models/sale_payment.rb +++ b/app/models/sale_payment.rb @@ -1,14 +1,19 @@ class SalePayment < ApplicationRecord -#primary key - need to be unique generated for multiple shops + self.primary_key = "sale_payment_id" + + #primary key - need to be unique generated for multiple shops + before_create :generate_custom_id belongs_to :sale - :attr_accessor :received_amount, :card_payment_reference, :voucher_no, :giftcard_no, :customer_id, :external_payment_status + attr_accessor :received_amount, :card_payment_reference, :voucher_no, :giftcard_no, :customer_id, :external_payment_status + + def process_payment(invoice, action_by, cash_amount, payment_method) - def process_payment(invoice, action_by) self.sale = invoice - + self.received_amount = cash_amount amount_due = invoice.grand_total + #get all payment for this invoices invoice.sale_payments.each do |payment| if (payment.payment_status == "paid" ) @@ -19,34 +24,35 @@ class SalePayment < ApplicationRecord if (amount_due > 0) payment_status = false #route to payment type - switch (payment_method) - case "cash" + case payment_method + when "cash" payment_status = cash_payment - case "creditnote" - payment_status = creditnote_payment - case "visa" - payment_status = external_terminal_card_payment(:visa) - case "master" - payment_status = external_terminal_card_payment(:master) - case "jcb" - payment_status = external_terminal_card_payment(:jcb) - case "mpu" - payment_status = external_terminal_card_payment(:mpu) - case "unionpay" - payment_status = external_terminal_card_payment(:unionpay) - case "vochure" - payment_status = vochure_payment - case "giftcard" - payment_status = giftcard_payment - case "paypar" - #TODO: implement paypar implementation + when "creditnote" + if !self.customer_id.nil? + payment_status = creditnote_payment(self.customer_id) + end + when "visa" + payment_status = external_terminal_card_payment(:visa) + when "master" + payment_status = external_terminal_card_payment(:master) + when "jcb" + payment_status = external_terminal_card_payment(:jcb) + when "mpu" + payment_status = external_terminal_card_payment(:mpu) + when "unionpay" + payment_status = external_terminal_card_payment(:unionpay) + when "vochure" + payment_status = vochure_payment + when "giftcard" + payment_status = giftcard_payment + when "paypar" payment_status = paypar_payment + else + puts "it was something else" end - - #record an payment in sale-audit - remark = "Payment #{payment_method}- for Invoice #{invoice.receipt_no} Due [#{amount_due}]| pay amount -> #{amount} | Payment Status ->#{payment_status}" + remark = "Payment #{payment_method}- for Invoice #{invoice.receipt_no} Due [#{amount_due}]| pay amount -> #{cash_amount} | Payment Status ->#{payment_status}" sale_audit = SaleAudit.record_payment(invoice.id, remark, action_by) return true, self.sale @@ -58,24 +64,62 @@ class SalePayment < ApplicationRecord return false, "No outstanding Amount" end + end + + def self.get_paypar_account(url,token,membership_id,campaign_type_id,merchant_uid,auth_token) + response = HTTParty.get(url, + :body => { app_token: token,membership_id:membership_id,campaign_type_id:campaign_type_id,merchant_uid:merchant_uid,auth_token:auth_token}.to_json, + :headers => { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + } + ) + return response; + + end + + def self.redeem(paypar_url,token,membership_id,received_amount,sale_id) + membership_actions_data = MembershipAction.find_by_membership_type("redeem"); + if !membership_actions_data.nil? + url = paypar_url.to_s + membership_actions_data.gateway_url.to_s + merchant_uid = membership_actions_data.merchant_account_id + auth_token = membership_actions_data.auth_token + campaign_type_id = membership_actions_data.additional_parameter["campaign_type_id"] + sale_data = Sale.find_by_sale_id(sale_id) + if sale_data + response = HTTParty.post(url, + :body => { generic_customer_id:membership_id,redeem_amount:received_amount,receipt_no:sale_data.receipt_no,campaign_type_id:campaign_type_id,account_no:"",merchant_uid:merchant_uid,auth_token:auth_token}.to_json, + :headers => { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + } + ) + else + response = false; + end + + else + response =false; + end + return response; + end private def cash_payment payment_status = false - self.payment_method = "cash" self.payment_amount = self.received_amount - self.outstanding_amount = self.sale.grand_total - received_amount + self.outstanding_amount = self.sale.grand_total.to_f - self.received_amount.to_f self.payment_status = "paid" payment_method = self.save! - sale_update_payment_status(self.received_amount) return payment_status end - def creditnote_payment(self.customer_id) + def creditnote_payment(customer_id) + payment_status = false self.payment_method = "creditnote" @@ -96,7 +140,7 @@ class SalePayment < ApplicationRecord self.payment_method = method self.payment_amount = self.received_amount self.payment_reference = self.card_payment_reference - self.outstanding_amount = self.sale.grand_total- self.received_amount + self.outstanding_amount = self.sale.grand_total.to_f - self.received_amount.to_f self.payment_status = "paid" payment_method = self.save! @@ -140,20 +184,101 @@ class SalePayment < ApplicationRecord end def paypar_payment - ##TODO - Integration with Paypar (SmartPay) + payment_status = false + + #Next time - validate if the vochure number is valid - within + + customer_data = Customer.find_by_customer_id(self.sale.customer_id) + membership_setting = MembershipSetting.find_by_membership_type("paypar_url") + membership_data = SalePayment.redeem(membership_setting.gateway_url,membership_setting.auth_token,customer_data.membership_id,self.received_amount,self.sale.sale_id) + if membership_data["status"]==true + self.payment_method = "paypar" + self.payment_amount = self.received_amount + self.payment_reference = self.voucher_no + self.outstanding_amount = self.sale.grand_total.to_f - self.received_amount.to_f + self.payment_status = "pending" + payment_method = self.save! + SalePayment.where(:sale_payment_id => self.sale_payment_id).update_all(:payment_status => 'paid') + sale_update_payment_status(self.received_amount.to_f) + + else + sale_update_payment_status(0) + end + + return payment_status + end def sale_update_payment_status(paid_amount) - #update amount_outstanding - self.sale.amount_received = self.sale.amount_received + paid_amount - self.sale.amount_changed = amount - self.sale.amount_received - if (self.sale.grand_total <= self.sale.amount_received && self.sale.amount_changed > 0) + self.sale.amount_received = self.sale.amount_received.to_f + paid_amount.to_f + self.sale.save! + self.sale.amount_changed = self.sale.amount_received.to_f - self.sale.grand_total.to_f + all_received_amount = 0.0 + sObj = Sale.find(self.sale_id) + sObj.sale_payments.each do |spay| + all_received_amount += spay.payment_amount.to_f + end + if (self.sale.grand_total <= all_received_amount) self.sale.payment_status = "paid" self.sale.sale_status = "completed" self.sale.save! + table_update_status(sObj) + rebat(sObj) end end + def table_update_status(sale_obj) + booking = Booking.find_by_sale_id(sale_obj.id) + if booking + table = DiningFacility.find(booking.dining_facility_id) + if table + table.status = "available" + table.save + end + end + end + + def rebat(sObj) + food_prices, beverage_prices = SaleItem.calculate_food_beverage(sObj.sale_items) + generic_customer_id = sObj.customer.membership_id + if generic_customer_id != nil || generic_customer_id != "" || generic_customer_id != 0 + paypar = sObj.sale_payments + payparcost = 0 + paypar.each do |pp| + if pp.payment_method == "paypar" + payparcost = payparcost + pp.payment_amount + end + end + overall_dis = SaleItem.get_overall_discount(sObj.id) + total_amount = food_prices - payparcost + overall_dis + puts "total_amount" + puts food_prices + puts payparcost + puts total_amount + if total_amount > 0 + receipt_no = sObj.receipt_no + membership = MembershipSetting.find_by_membership_type("paypar_url") + memberaction = MembershipAction.find_by_membership_type("rebate") + merchant_uid = memberaction.merchant_account_id.to_s + campaign_type_id = memberaction.additional_parameter["campaign_type_id"] + auth_token = memberaction.auth_token.to_s + url = membership.gateway_url.to_s + memberaction.gateway_url.to_s + response = HTTParty.post(url, :body => { generic_customer_id:generic_customer_id ,merchant_uid:merchant_uid,total_amount: total_amount,campaign_type_id: campaign_type_id, + receipt_no: receipt_no,auth_token:auth_token}.to_json, + :headers => { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json' + }) + puts "haha" + puts response.to_json + end + end + end + + private + def generate_custom_id + self.sale_payment_id = SeedGenerator.generate_id(self.class.name, "SPI") + end end diff --git a/app/models/sale_tax.rb b/app/models/sale_tax.rb index 6e0a2d47..79de9134 100644 --- a/app/models/sale_tax.rb +++ b/app/models/sale_tax.rb @@ -1,5 +1,12 @@ class SaleTax < ApplicationRecord -#primary key - need to be unique generated for multiple shops + self.primary_key = "sale_tax_id" + #primary key - need to be unique generated for multiple shops + before_create :generate_custom_id belongs_to :sale + + private + def generate_custom_id + self.sale_tax_id = SeedGenerator.generate_id(self.class.name, "STI") + end end diff --git a/app/models/seed_generator.rb b/app/models/seed_generator.rb index 4351e74b..fe896a4d 100644 --- a/app/models/seed_generator.rb +++ b/app/models/seed_generator.rb @@ -1,7 +1,9 @@ class SeedGenerator < ApplicationRecord + def self.generate_id(model, prefix) seed = SeedGenerator.find_by_model(model) new_receipt_no = 0 + if (seed.nil?) seed = SeedGenerator.new() seed.model = model @@ -15,7 +17,10 @@ class SeedGenerator < ApplicationRecord seed.save end - return prefix + "-" + seed.current.to_s + padding_len = 15 - prefix.length + saleOrderId = prefix +"-"+ seed.current.to_s.to_s.rjust((14-prefix.length)+1,'0') + return saleOrderId + end def self.new_receipt_no diff --git a/app/models/test.rb b/app/models/test.rb deleted file mode 100644 index fe0afa77..00000000 --- a/app/models/test.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Test < ApplicationRecord -end diff --git a/app/models/transactions.rb b/app/models/transactions.rb deleted file mode 100644 index 9cffb0d1..00000000 --- a/app/models/transactions.rb +++ /dev/null @@ -1,5 +0,0 @@ -module Transactions - def self.table_name_prefix - 'transactions_' - end -end diff --git a/app/models/zone.rb b/app/models/zone.rb index e5ad15c7..164b80f4 100644 --- a/app/models/zone.rb +++ b/app/models/zone.rb @@ -2,7 +2,12 @@ class Zone < ApplicationRecord # model association has_many :tables, dependent: :destroy has_many :rooms, dependent: :destroy + has_many :order_queue_stations # validations validates_presence_of :name, :created_by + + def self.collection + Zone.select("id, name").map { |e| [e.name, e.id] } + end end diff --git a/app/pdf/crm_order_pdf.rb b/app/pdf/crm_order_pdf.rb new file mode 100644 index 00000000..55d08ecc --- /dev/null +++ b/app/pdf/crm_order_pdf.rb @@ -0,0 +1,136 @@ +class CrmOrderPdf < Prawn::Document + attr_accessor :receipt_width,:price_column_width,:p_width, :page_height, :margin, :price_width, :item_width, :header_font_size, :item_font_size,:item_height,:qty_column_width,:item_description_width + def initialize(booking,order_items,printer_settings) + self.p_width = 200 + self.page_height = 1450 + self.margin = 10 + # self.price_width = self.p_width / 2 + self.price_width=80 + self.item_width = self.p_width - self.price_width + self.item_height = self.item_height + self.qty_column_width = self.p_width / 2 + self.item_description_width=self.p_width - self.price_width + self.receipt_width=130 + + @item_width = self.p_width.to_i / 2 + @qty_width = @item_width.to_i / 3 + @double = @qty_width * 1.3 + @half_qty = @qty_width / 2 + #setting page margin and width + super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.p_width, self.page_height]) + self.header_font_size = 10 + self.item_font_size = 9 + + header( printer_settings.printer_name, printer_settings.name) + stroke_horizontal_rule + cashier_info(booking) + line_items(order_items) + + + end + + def header (printer_name, name) + text "#{printer_name}", :size => self.header_font_size,:align => :center + move_down 5 + text "#{name}", :size => self.header_font_size,:align => :center + # move_down self.item_height + move_down 5 + + stroke_horizontal_rule + + end + + def cashier_info(booking) + move_down 5 + move_down 2 + y_position = cursor + bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do + text "Order By:", :size => self.item_font_size,:align => :left + end + + bounding_box([self.price_width, y_position], :width =>self.receipt_width) do + text "#{booking.checkin_by}" , :size => self.item_font_size, :align => :left + end + move_down 5 + + y_position = cursor + bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do + text "Customer:", :size => self.item_font_size,:align => :left + end + bounding_box([self.price_width,y_position], :width =>self.price_width) do + text "#{booking.customer_id}" , :size => self.item_font_size,:align => :left + end + move_down 5 + + y_position = cursor + bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do + text "Date:", :size => self.item_font_size,:align => :left + end + bounding_box([self.price_width,y_position], :width =>self.price_width) do + text "#{booking.checkin_at.strftime('%Y %m %d %h:%m')}" , :size => self.item_font_size,:align => :left + end + # stroke_horizontal_rule + move_down 5 + end + + def line_items(order_items) + y_position = cursor + qty_column_width = self.p_width * 0.2 + item_description_width = self.p_width * 0.5 + price_column_width = self.p_width * 0.3 + + + + stroke_horizontal_rule + move_down 5 + y_position = cursor + pad_top(15) { + # @item_width.to_i + @half_qty.to_i + text_box "Items", :at =>[0,y_position], :width => @item_width.to_i - @half_qty.to_i , :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size + text_box "Price", :at =>[@item_width.to_i - @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + text_box "Qty", :at =>[@item_width.to_i-@qty_width,y_position], :width => @half_qty, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + text_box "Total", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @double, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + + } + + move_down 5 + stroke_horizontal_rule + + add_line_item_row(order_items) + + + end + + def add_line_item_row(order_items) + y_position = cursor + move_down 5 + sub_total = 0.0 + order_items.each do |item| + + sub_total += item.qty*item.price + qty = item.qty + total_price = item.qty*item.price + price = item.price + item_name = item.item_name + + + y_position = cursor + + pad_top(15) { + # @item_width.to_i + @half_qty.to_i + text_box "#{item_name}", :at =>[0,y_position], :width => @item_width.to_i - @half_qty.to_i , :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size + text_box "#{price}", :at =>[@item_width.to_i - @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + text_box "#{qty.to_i}", :at =>[@item_width.to_i-@qty_width,y_position], :width => @half_qty, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + text_box "#{total_price}", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @double, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + + } + move_down 3 + end + stroke_horizontal_rule + move_down 5 + y_position = cursor + + end + + +end diff --git a/app/pdf/order_item_pdf.rb b/app/pdf/order_item_pdf.rb index 356327b4..96008dfd 100644 --- a/app/pdf/order_item_pdf.rb +++ b/app/pdf/order_item_pdf.rb @@ -1,31 +1,96 @@ class OrderItemPdf < 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 + def initialize(order_item) + self.page_width = 254 + self.page_height = 1450 + self.margin = 10 + self.price_width = 40 # No Need for item + self.qty_width = 34 + self.total_width = 40 # No Need for item + self.item_width = self.page_width - (self.qty_width + (self.margin*4)) + self.item_height = 15 + self.item_description_width = self.page_width - (self.price_width + self.qty_width + self.total_width) + self.label_width=80 - def initialize(order_item, print_settings) - super(:margin => [10, 5, 30, 5], :page_size => [200,400]) + super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.page_width, self.page_height]) + # super(:margin => [10, 5, 30, 5], :page_size => [200,400]) # font "public/fonts/#{font_name}".to_s + ".ttf".to_s # font "public/fonts/Zawgyi-One.ttf" - # font "public/fonts/padauk.ttf" - font_size 9 - text "#{order_item.dining}", :size => 15 + # font "public/fonts/padauk.ttf" + self.header_font_size = 14 + self.item_font_size = 12 + + text "#{order_item.dining}", :size => self.header_font_size,:align => :center, :left_margin => -20 stroke_horizontal_rule move_down 5 - cashier_info(order_item.order_by,order_item.order_at, order_item.customer) + #order_info + order_info(order_item.order_by,order_item.order_at) + # order items + order_items(order_item) end - def cashier_info(order_by, order_at, customer) - move_down 5 + # Write Order Information to PDF + def order_info(order_by, order_at) y_position = cursor - bounding_box([0,y_position], :width =>200, :height => 20) do - text "OrderBy:#{order_by} Customer:#{customer} Date:#{order_at.strftime("%Y %m %d")}", :size => 7,:align => :left + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "OrderBy: #{order_by} ", :size => self.item_font_size,:align => :left + end + + move_down 5 + y_position = cursor + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "Date: #{order_at.strftime("%Y-%m-%d %I:%M %p")}", :size => self.item_font_size,:align => :left end stroke_horizontal_rule + move_down 10 + end + + # Write Order items to PDF + def order_items(order_item) + y_position = cursor + + # No Need for Order Item + # bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + # text "Item", :size => self.item_font_size,:align => :left + # end + + # bounding_box([self.item_width,y_position], :width => self.qty_width, :height => self.item_height) do + # text "Qty", :size => self.item_font_size,:align => :right + # end + + # stroke_horizontal_rule + # move_down 5 + + #Add Order Item + add_order_items(order_item) + + dash(1, :space => 1, :phase => 1) + stroke_horizontal_line 0, self.page_width move_down 5 end + # Add order items under order info + def add_order_items(order_item) + y_position = cursor + + move_down 5 + + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "#{order_item.item_name}", :size => self.item_font_size,:align => :left + end + + bounding_box([self.item_width,y_position], :width => self.qty_width, :height => self.item_height) do + text "[#{order_item.qty.to_i}]", :size => self.item_font_size,:align => :left + end + + move_down 5 + + end + end diff --git a/app/pdf/order_summary_pdf.rb b/app/pdf/order_summary_pdf.rb index 8b79b40e..47c1f6a5 100644 --- a/app/pdf/order_summary_pdf.rb +++ b/app/pdf/order_summary_pdf.rb @@ -1,17 +1,92 @@ class OrderSummaryPdf < 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 + def initialize(order) + self.page_width = 254 + self.page_height = 1450 + self.margin = 10 + self.price_width = 40 # No Need for item + self.qty_width = 34 + self.total_width = 40 # No Need for item + self.item_width = self.page_width - (self.qty_width + (self.margin*4)) + self.item_height = 15 + self.item_description_width = self.page_width - (self.price_width + self.qty_width + self.total_width) + self.label_width=100 - def initialize(order, print_settings) - super(:margin => [10, 5, 30, 5], :page_size => [200,400]) + super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.page_width, self.page_height]) # font "public/fonts/#{font_name}".to_s + ".ttf".to_s # font "public/fonts/Zawgyi-One.ttf" # font "public/fonts/padauk.ttf" + self.header_font_size = 12 + self.item_font_size = 10 - - font_size 9 - text "#{"table_name"}", :size => 15 + text "#{order[0].dining}", :size => self.header_font_size,:align => :center, :left_margin => -20 stroke_horizontal_rule move_down 5 + #order_info + order_info(order[0].order_by,order[0].order_at) + + # order items + order_items(order) + + end + + # Write Order Information to PDF + def order_info(order_by, order_at) + y_position = cursor + + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "OrderBy: #{order_by} ", :size => self.item_font_size,:align => :left + end + + move_down 5 + y_position = cursor + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "Date: #{order_at.strftime("%Y-%m-%d %I:%M %p")}", :size => self.item_font_size,:align => :left + end + + stroke_horizontal_rule + + move_down 10 + end + + # Write Order items to PDF + def order_items(order_item) + y_position = cursor + + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "Item", :size => self.item_font_size,:align => :left + end + + bounding_box([self.item_width,y_position], :width => self.qty_width, :height => self.item_height) do + text "Qty", :size => self.item_font_size,:align => :left + end + + stroke_horizontal_rule + move_down 5 + + #Add Order Item + add_order_items(order_item) + end + + # Add order items under order info + def add_order_items(order_item) + y_position = cursor + + move_down 5 + + order_item.each do|odi| + bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + text "#{odi.item_name}", :size => self.item_font_size,:align => :left + end + + bounding_box([self.item_width,y_position], :width => self.qty_width, :height => self.item_height) do + text "#{odi.qty}", :size => self.item_font_size,:align => :left + end + end + + move_down 5 + end end diff --git a/app/pdf/queue_no_pdf.rb b/app/pdf/queue_no_pdf.rb new file mode 100644 index 00000000..704dbfdb --- /dev/null +++ b/app/pdf/queue_no_pdf.rb @@ -0,0 +1,58 @@ +class QueueNoPdf < 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 + def initialize(printer_settings, queue) + self.page_width = 210 + self.page_height = 2500 + self.margin = 5 + self.price_width = 35 + self.qty_width = 20 + self.total_width = 35 + self.item_width = self.page_width - ((self.price_width + self.qty_width + self.total_width)) + self.item_height = 15 + self.item_description_width = (self.page_width-20) / 2 + self.label_width = 100 + + super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.page_width, self.page_height]) + + self.header_font_size = 10 + self.item_font_size = 8 + + header( "Beauty In the Pot", printer_settings.name) + + queue_no(queue) + stroke_horizontal_rule + + date_info(queue) + + end + + def header (printer_name, name) + text "#{printer_name}", :left_margin => -10, :size => self.header_font_size,:align => :center + text "#{name}", :size => self.header_font_size,:align => :center + # move_down self.item_height + move_down 5 + stroke_horizontal_rule + move_down 5 + end + + def queue_no (queue) + move_down 5 + text "#{queue.queue_no}", :size => 100,:align => :center + end + + def date_info(queue) + move_down 5 + + y_position = cursor + bounding_box([0,y_position], :width =>self.label_width, :height => self.item_height) do + text "Date:", :size => self.item_font_size,:align => :left + end + bounding_box([self.label_width,y_position], :width => self.item_width) do + text "#{queue.created_at.strftime('%Y-%m-%d %I:%M %p')}" , :size => self.item_font_size,:align => :left + end + + move_down 5 + + end + +end diff --git a/app/pdf/receipt_bill_pdf.rb b/app/pdf/receipt_bill_pdf.rb index e9ad042c..2d67989d 100644 --- a/app/pdf/receipt_bill_pdf.rb +++ b/app/pdf/receipt_bill_pdf.rb @@ -1,110 +1,237 @@ class ReceiptBillPdf < Prawn::Document - attr_accessor :receipt_width,:price_column_width,:p_width, :page_height, :margin, :price_width, :item_width, :header_font_size, :item_font_size,:item_height,:qty_column_width,:item_description_width - def initialize(printer_settings, sale_items,sale) - self.p_width = 200 - self.page_height = 1450 - self.margin = 10 - # self.price_width = self.p_width / 2 - self.price_width=90 - self.item_width = self.p_width - self.price_width - self.item_height = self.item_height - self.qty_column_width = self.p_width / 2 - self.item_description_width=self.p_width - self.price_width - self.receipt_width=130 + 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 + def initialize(printer_settings, sale_items, sale_data, customer_name, food_total, beverage_total, member_info = nil) + self.page_width = 210 + self.page_height = 2500 + self.margin = 5 + self.price_width = 35 + self.qty_width = 20 + self.total_width = 35 + self.item_width = self.page_width - ((self.price_width + self.qty_width + self.total_width)) + self.item_height = 15 + self.item_description_width = (self.page_width-20) / 2 + self.label_width = 100 - @item_width = self.p_width.to_i / 2 - @qty_width = @item_width.to_i / 3 - @double = @qty_width * 2 - @half_qty = @qty_width / 2 + # @item_width = self.page_width.to_i / 2 + # @qty_width = @item_width.to_i / 3 + # @double = @qty_width * 1.3 + # @half_qty = @qty_width / 2 #setting page margin and width - super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.p_width, self.page_height]) + super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.page_width, self.page_height]) + + # font "public/fonts/#{font_name}".to_s + ".ttf".to_s + # font "public/fonts/Zawgyi-One.ttf" + # font "public/fonts/padauk.ttf" self.header_font_size = 10 - self.item_font_size = 6 + self.item_font_size = 8 - header( printer_settings.printer_name, printer_settings.name) - stroke_horizontal_rule - cashier_info(sale.receipt_no,sale.customer.name, sale.receipt_date) - line_items(sale_items) + header( "Beauty In the Pot", printer_settings.name) - + stroke_horizontal_rule + + cashier_info(sale_data, customer_name) + line_items(sale_items, food_total, beverage_total) + all_total(sale_data) + + if member_info != nil + member_info(member_info) + end + + footer end def header (printer_name, name) - text "#{printer_name}", :size => self.header_font_size,:align => :center - move_down 5 - text "#{name}", :size => self.header_font_size,:align => :center - # move_down self.item_height - move_down 5 - - stroke_horizontal_rule + text "#{printer_name}", :left_margin => -10, :size => self.header_font_size,:align => :center + move_down 5 + text "#{name}", :size => self.header_font_size,:align => :center + # move_down self.item_height + move_down 5 + stroke_horizontal_rule end - def cashier_info(receipt_no, customer, receipt_date) - move_down 5 - move_down 2 + def cashier_info(sale_data, customer_name) + move_down 7 + # move_down 2 y_position = cursor - bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do + bounding_box([0,y_position], :width =>self.label_width, :height => self.item_height) do text "Receipt No:", :size => self.item_font_size,:align => :left end - bounding_box([self.price_width, y_position], :width =>self.receipt_width) do - text "#{receipt_no}" , :size => self.item_font_size, :align => :left + bounding_box([self.label_width, y_position], :width =>self.item_width) do + text "#{sale_data.receipt_no}" , :size => self.item_font_size, :align => :left end move_down 5 y_position = cursor - bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do + bounding_box([0,y_position], :width =>self.label_width, :height => self.item_height) do text "Customer:", :size => self.item_font_size,:align => :left end - bounding_box([self.price_width,y_position], :width =>self.price_width) do - text "#{customer}" , :size => self.item_font_size,:align => :left + bounding_box([self.label_width,y_position], :width =>self.item_width) do + text "#{customer_name}" , :size => self.item_font_size,:align => :left end move_down 5 y_position = cursor - bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do - text "Date:", :size => self.item_font_size,:align => :left + bounding_box([0,y_position], :width =>self.label_width, :height => self.item_height) do + text "Date:", :size => self.item_font_size,:align => :left end - bounding_box([self.price_width,y_position], :width =>self.price_width) do - text "#{receipt_date}" , :size => self.item_font_size,:align => :left + bounding_box([self.label_width,y_position], :width => self.item_width) do + text "#{sale_data.receipt_date.strftime('%Y-%m-%d %I:%M %p')}" , :size => self.item_font_size,:align => :left end - # stroke_horizontal_rule + + move_down 5 + stroke_horizontal_rule move_down 5 end - def line_items(sale_items) + def line_items(sale_items, food_total, beverage_total) y_position = cursor - qty_column_width = self.p_width * 0.2 - item_description_width = self.p_width * 0.5 - price_column_width = self.p_width * 0.3 - - - stroke_horizontal_rule - move_down 5 - y_position = cursor pad_top(15) { # @item_width.to_i + @half_qty.to_i - text_box "Items", :at =>[0,y_position], :width => @item_width.to_i - @half_qty.to_i , :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size - text_box "Price", :at =>[@item_width.to_i - @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right - text_box "Qty", :at =>[@item_width.to_i-@qty_width,y_position], :width => @half_qty, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right - text_box "Discount", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right - text_box "Total", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @double, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right + text_box "Items", :at =>[0,y_position], :width => self.item_width, :height =>self.item_height, :size => self.item_font_size, :overflow => :shrink_to_fix + text_box "Price", :at =>[self.item_width,y_position], :width => self.price_width, :height =>self.item_height, :size => self.item_font_size, :align => :right, :overflow => :shrink_to_fix + text_box "Qty", :at =>[(self.item_width+self.price_width),y_position], :width => self.qty_width, :height =>self.item_height, :size => self.item_font_size, :align => :center, :overflow => :shrink_to_fix + text_box "Total", :at =>[(self.item_width+self.price_width),y_position], :width => self.total_width+5, :height =>self.item_height, :size => self.item_font_size, :align => :right, :overflow => :shrink_to_fix } move_down 5 stroke_horizontal_rule - add_line_item_row(sale_items) - stroke_horizontal_rule + add_line_item_row(sale_items, food_total, beverage_total) end - def add_line_item_row(sale_items) - y_position = cursor - move_down 5 + def add_line_item_row(sale_items, food_total, beverage_total) + item_name_width = (self.item_width+self.price_width) + y_position = cursor + move_down 5 + sub_total = 0.0 + sale_items.each do |item| + sub_total += (item.qty*item.unit_price) + qty = item.qty + total_price = item.qty*item.unit_price + price = item.unit_price + product_name = item.product_name + + + y_position = cursor + + pad_top(15) { + text_box "#{product_name}", :at =>[0,y_position], :width => self.item_width, :height =>self.item_height, :overflow => :shrink_to_fix, :size => self.item_font_size, :overflow => :shrink_to_fix + text_box "#{price.to_i}", :at =>[self.item_width,y_position], :width => self.price_width, :height =>self.item_height, :size => self.item_font_size, :align => :right, :overflow => :shrink_to_fix + text_box "#{qty.to_i}", :at =>[item_name_width,y_position], :width => self.qty_width, :height =>self.item_height, :size => self.item_font_size, :align => :center, :overflow => :shrink_to_fix + text_box "#{total_price.to_i}", :at =>[(item_name_width),y_position], :width =>self.total_width+5, :height =>self.item_height, :size => self.item_font_size, :align => :right, :overflow => :shrink_to_fix + } + move_down 3 + end + + stroke_horizontal_rule + + move_down 5 + y_position = cursor + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Sub Total", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{ sub_total }" , :size => self.item_font_size,:align => :right + end + + # Food and Beverage + food_beverage_total = food_total.to_s + "/" + beverage_total.to_s + + move_down 5 + + y_position = cursor + bounding_box([0,y_position], :width => self.item_description_width, :height => self.item_height) do + text "Food/Beverage Total", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width => self.label_width) do + text "#{ food_beverage_total }" , :size => self.item_font_size,:align => :right + end + end + + def all_total(sale_data) + item_name_width = self.item_width + move_down 5 + y_position = cursor + + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Discount", :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_discount}" +" )" , :size => self.item_font_size,:align => :right + end + + if sale_data.sale_taxes.length > 1 + sale_data.sale_taxes.each do |st| + move_down 5 + y_position = cursor + + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "#{ st.tax_name }", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "( " +"#{ st.tax_payable_amount }" +" )" , :size => self.item_font_size,:align => :right + 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 + + move_down 5 + y_position = cursor + move_down 5 + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "Grand Total", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{sale_data.grand_total}" , :size => self.item_font_size,:align => :right + end + move_down 5 + # stroke_horizontal_rule + end + + # show member information + def member_info(member_info) + + move_down 7 + if member_info["status"] == true + member_info["data"].each do |res| + + move_down 5 + y_position = cursor + bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do + text "#{ res["accountable_type"] }", :size => self.item_font_size,:align => :left + end + bounding_box([self.item_description_width,y_position], :width =>self.label_width) do + text "#{ res["balance"] }" , :size => self.item_font_size,:align => :right + end + + end + end + end + + def footer + move_down 5 + stroke_horizontal_rule + move_down 5 + + text "*** Thank You ***", :left_margin => -10, :size => self.header_font_size,:align => :center + + move_down 5 end end diff --git a/app/reports/menu_report.rb b/app/reports/menu_report.rb index ca430f0a..2a17e851 100644 --- a/app/reports/menu_report.rb +++ b/app/reports/menu_report.rb @@ -1,5 +1,5 @@ -class MenuReport < Compendium::Report - query :list, collect: :active_record do |params| - Menu.all - end -end +# class MenuReport < Compendium::Report +# query :list, collect: :active_record do |params| +# Menu.all +# end +# end diff --git a/app/views/api/bookings/show.json.jbuilder b/app/views/api/bookings/show.json.jbuilder index c4edb79f..e1ebd5a9 100644 --- a/app/views/api/bookings/show.json.jbuilder +++ b/app/views/api/bookings/show.json.jbuilder @@ -1,7 +1,12 @@ if (@booking) - json.id @booking.id + json.id @booking.booking_id json.status @booking.booking_status - json.checkin_at @booking.checkin_at + if Sale.exists?(@booking.sale_id) + json.sale_status Sale.find(@booking.sale_id).sale_status + else + json.sale_status "" + end + json.checkin_at @booking.checkin_at.strftime("%d-%m-%Y") json.checkin_by @booking.checkin_by json.table_name @booking.dining_facility.name @@ -17,9 +22,9 @@ if (@booking) order_items = [] @booking.booking_orders.each do |bo| order = Order.find(bo.order_id) - if (order.status == "new") + #if (order.status == "new") order_items = order_items + order.order_items - end + #end end json.order_items order_items do |item| diff --git a/app/views/api/customers/get_customer_order.json.jbuilder b/app/views/api/customers/get_customer_order.json.jbuilder new file mode 100644 index 00000000..f00ce173 --- /dev/null +++ b/app/views/api/customers/get_customer_order.json.jbuilder @@ -0,0 +1,38 @@ +if (@customer) + json.id @customer.customer_id + json.name @customer.name + json.email @customer.email + json.contact_no @customer.contact_no + json.date_of_birth @customer.date_of_birth + + + @total_amount = 0.00 + @total_tax = 0.00 + + if @customer.orders + order_items = [] + @customer.orders.each do |bo| + order = Order.find(bo.order_id) + #if (order.status == "new") + order_items = order_items + order.order_items + #end + end + + json.order_items order_items do |item| + json.item_instance_code item.item_code + json.item_name item.item_name + json.price item.price + json.qty item.qty + json.options item.options + json.remark item.remark + json.item_status item.order_item_status + @total_amount = @total_amount + (item.price * item.qty) + end + + end + + json.sub_total @total_amount + json.commerical_tax @total_amount * 0.05 + json.total @total_amount + (@total_amount * 0.05) + +end \ No newline at end of file diff --git a/app/views/crm/customers/_error_messages.html.erb b/app/views/crm/customers/_error_messages.html.erb new file mode 100644 index 00000000..bbff284b --- /dev/null +++ b/app/views/crm/customers/_error_messages.html.erb @@ -0,0 +1,9 @@ +
+ +
diff --git a/app/views/crm/customers/_form.html.erb b/app/views/crm/customers/_form.html.erb index c5adac88..c913651a 100644 --- a/app/views/crm/customers/_form.html.erb +++ b/app/views/crm/customers/_form.html.erb @@ -1,4 +1,5 @@ -<%= simple_form_for(@crm_customer) do |f| %> + +<%= simple_form_for([:crm,@crm_customer]) do |f| %> <%= f.error_notification %>
@@ -7,7 +8,6 @@ <%= f.input :contact_no %> <%= f.input :email %> <%= f.input :date_of_birth %> - <%= f.association :membership %> <%= f.input :membership_type %> <%= f.input :membership_authentication_code %>
@@ -16,3 +16,5 @@ <%= f.button :submit %> <% end %> + + \ No newline at end of file diff --git a/app/views/crm/customers/edit.html.erb b/app/views/crm/customers/edit.html.erb index 62bd18eb..8541aa0d 100644 --- a/app/views/crm/customers/edit.html.erb +++ b/app/views/crm/customers/edit.html.erb @@ -2,5 +2,5 @@ <%= render 'form', crm_customer: @crm_customer %> -<%= link_to 'Show', @crm_customer %> | +<%= link_to 'Show', @crm_customers_path %> | <%= link_to 'Back', crm_customers_path %> diff --git a/app/views/crm/customers/index.html.erb b/app/views/crm/customers/index.html.erb index 3df65eac..f97de091 100644 --- a/app/views/crm/customers/index.html.erb +++ b/app/views/crm/customers/index.html.erb @@ -1,41 +1,242 @@ -

<%= notice %>

+
+
+ +
+
-

Crm Customers

- - - - - - - - - - - - - - +
+
+ +
+
+
NameCompanyContact noEmailDate of birthMembershipMembership typeMembership authentication code
+ + - - <% @crm_customers.each do |crm_customer| %> - - - - - - - - - - - - - - <% end %> - -
<%= crm_customer.name %><%= crm_customer.company %><%= crm_customer.contact_no %><%= crm_customer.email %><%= crm_customer.date_of_birth %><%= crm_customer.membership %><%= crm_customer.membership_type %><%= crm_customer.membership_authentication_code %><%= link_to 'Show', crm_customer %><%= link_to 'Edit', edit_crm_customer_path(crm_customer) %><%= link_to 'Destroy', crm_customer, method: :delete, data: { confirm: 'Are you sure?' } %>
+ + + <%= form_tag crm_customers_path, :method => :get do %> +
+ + +
+ <% end %> + + + + Select + Name + Company + Contact no + Email + + -
+ + <% if @crm_customers.count > 0 %> + <% @crm_customers.each do |crm_customer| %> + <% if crm_customer.customer_id != "CUS-000000000001" && crm_customer.customer_id != "CUS-000000000002" %> + + + + <%= crm_customer.name %> + <%= crm_customer.company rescue '-' %> + <%= crm_customer.contact_no %> + <%= crm_customer.email %> + <%= link_to 'Show', crm_customer_path(crm_customer) %> + + + <% end %> + <% end %> + <%else%> +

There are no record for your search

+ <% end %> + + +
+ + <%= paginate @crm_customers %> + + -<%= link_to 'New Crm Customer', new_crm_customer_path %> + +
+ + <%= simple_form_for @crm_customer,:url => crm_customers_path, :method => :post do |f| %> + + + <%= f.hidden_field :id, :class => "form-control col-md-6 " %> + +
"> + <%= f.input :name, :class => "form-control col-md-6 name" %> + <% flash.each do |name, msg| %> + <%= msg['name'] %> + <% end -%> + +
+
+ <%= f.input :company, :class => "form-control col-md-6 company" %> +
+
"> + <%= f.input :contact_no, :class => "form-control col-md-6 contact_no" %> + <% flash.each do |name, msg| %> + <%= msg['contact_no'] %> + <% end -%> +
+ +
"> + <%= f.input :email, :class => "form-control col-md-6 email" %> + + <% flash.each do |name, msg| %> + <%= msg['email'] %> + <% end -%> +
+ +
+ + <%= f.text_field :date_of_birth,:value=>"01-01-1990",:class=>"form-control datepicker"%> +
+ +
+ + + +
+ + +
+ <%= f.button :submit, "Submit",:class => 'btn btn-primary ', :id => 'submit_customer' %> + <%= f.button :submit, "Update",:class => 'btn btn-primary ', :disabled =>'', :id => 'update_customer' %> + <%= f.button :button, "Reset",:class => 'btn btn-danger ', :id => 'reset' %> +
+ <%end%> +
+
+
+ + Back + +
+ + + + + \ No newline at end of file diff --git a/app/views/crm/customers/show.html.erb b/app/views/crm/customers/show.html.erb index 30341a00..d806ec34 100644 --- a/app/views/crm/customers/show.html.erb +++ b/app/views/crm/customers/show.html.erb @@ -1,44 +1,163 @@ -

<%= notice %>

+
+
+ -

- Name: - <%= @crm_customer.name %> -

+ + + -

- Company: - <%= @crm_customer.company %> -

+
-

- Contact no: - <%= @crm_customer.contact_no %> -

+
+
+
+
+
+

Customer Profile

+
+ + + + + + + + + + + + + + + + + + + + + + + +
Name<%= @crm_customer.name %>
Email<%= @crm_customer.email %>
Contact no<%= @crm_customer.contact_no %>
Company<%= @crm_customer.company %>
Date Of Birth<%= @crm_customer.date_of_birth %>
+
+
+
+
+
+
+
+

Membership Detail

+
+ + + <% if @membership == 0 %> + + + + <% else %> + <% @membership.each do |member| %> + + + + + <% end %> + + <% end %> + +
"There is no membership data"
<%= member["accountable_type"] %><%= member["balance"] %>
+
+
+
+
-

- Email: - <%= @crm_customer.email %> -

+
+

Order Details

+
+ + + + + + + + + + + + + -

- Date of birth: - <%= @crm_customer.date_of_birth %> -

+ + <% @order_items.each do |order_item| %> + + + + + + + + + + + <% end %> + +
Order IDMenu ItemQTYUnit Price OptionStatusWaiterCreated at
<%= order_item.order_id %><%= order_item.item_name %><%= order_item.qty %><%= order_item.price %><%= order_item.options %><%= order_item.order_item_status %><%= order_item.item_order_by %> <%= order_item.created_at.strftime("%d-%m-%y") %>
+
+
-

- Membership: - <%= @crm_customer.membership %> -

+
+

Sale Details

+
+ + + + + + + + + + + -

- Membership type: - <%= @crm_customer.membership_type %> -

+ + <% @sale_items.each do |sale_item| %> + + + + + + + + + + <% end %> + +
Sale ID Menu ItemQTYUnit Price Tax PriceCreated At
<%= sale_item.sale_id %><%= sale_item.product_name %><%= sale_item.qty %><%= sale_item.unit_price %><%= sale_item.taxable_price %><%= sale_item.created_at %>
+
+
+ +
+ +
+ +
+

+ + Back + +
+ +
-

- Membership authentication code: - <%= @crm_customer.membership_authentication_code %> -

-<%= link_to 'Edit', edit_crm_customer_path(@crm_customer) %> | -<%= link_to 'Back', crm_customers_path %> diff --git a/app/views/crm/customers/show.json.jbuilder b/app/views/crm/customers/show.json.jbuilder index 24d20eca..bd9680de 100644 --- a/app/views/crm/customers/show.json.jbuilder +++ b/app/views/crm/customers/show.json.jbuilder @@ -1 +1,2 @@ -json.partial! "crm_customers/crm_customer", crm_customer: @crm_customer +json.extract! @crm_customer, :id, :name, :company, :contact_no, :email, :date_of_birth, :membership_id, :membership_type, :membership_authentication_code, :created_at, :updated_at +json.url crm_customer_url(@crm_customer, format: :json) diff --git a/app/views/crm/customers/showbackup.html.erb b/app/views/crm/customers/showbackup.html.erb new file mode 100644 index 00000000..936192cf --- /dev/null +++ b/app/views/crm/customers/showbackup.html.erb @@ -0,0 +1,85 @@ +
+
+ +
+
+ + +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
NameEmailContact noCompanyDate Of BirthMembership Account
<%= @crm_customer.name %><%= @crm_customer.email %><%= @crm_customer.contact_no %><%= @crm_customer.company %><%= @crm_customer.date_of_birth %>
+
+ + +

Sale Items

+ + + + + + + + + + + + + + + <% @sale_items.each do |sale_item| %> + + + + + + + + + + <% end %> + +
Sale ID Menu ItemQTYUnit Price Tax PriceCreated At
<%= sale_item.sale_id %><%= sale_item.product_name %><%= sale_item.qty %><%= sale_item.unit_price %><%= sale_item.taxable_price %><%= sale_item.created_at %>
+
+
+ +
+ + +
+ + + + + diff --git a/app/views/crm/dining_queues/_crm_dining_queue.json.jbuilder b/app/views/crm/dining_queues/_crm_dining_queue.json.jbuilder new file mode 100644 index 00000000..f2580e52 --- /dev/null +++ b/app/views/crm/dining_queues/_crm_dining_queue.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! crm_dining_queue, :id, :name, :contact, :queue_no, :created_at, :updated_at +json.url crm_dining_queue_url(crm_dining_queue, format: :json) diff --git a/app/views/crm/dining_queues/_form.html.erb b/app/views/crm/dining_queues/_form.html.erb new file mode 100644 index 00000000..7f02ac15 --- /dev/null +++ b/app/views/crm/dining_queues/_form.html.erb @@ -0,0 +1,25 @@ + +<%= simple_form_for([:crm,@dining_queue]) do |f| %> + <%= f.error_notification %> + +
+ <%= f.input :name %> + <%= f.input :contact_no %> + <%= f.input :queue_no , :class => "dining",:id => "dining", :readonly => true%> + +
+
+
+ <%= f.button :submit %> +
+<% end %> + + + diff --git a/app/views/crm/dining_queues/edit.html.erb b/app/views/crm/dining_queues/edit.html.erb new file mode 100644 index 00000000..e5ca3b9f --- /dev/null +++ b/app/views/crm/dining_queues/edit.html.erb @@ -0,0 +1,11 @@ + +
+ + <%= render 'form', dining_queue: @dining_queue %> +
diff --git a/app/views/crm/dining_queues/index.html.erb b/app/views/crm/dining_queues/index.html.erb new file mode 100644 index 00000000..e7834b98 --- /dev/null +++ b/app/views/crm/dining_queues/index.html.erb @@ -0,0 +1,38 @@ + + + + +
+
+ + + + + + + + + + + + <% @dining_queues.each do |dining_queue| %> + + + + + + + <% end %> + +
NameContact NoQueue NoAction
<%= dining_queue.name %><%= dining_queue.contact_no %><%= dining_queue.queue_no %> + <%= link_to 'Edit', edit_crm_dining_queue_path(dining_queue) %> | <%= link_to 'Destroy', crm_dining_queue_path(dining_queue), method: :delete, data: { confirm: 'Are you sure?' } %>
+
+ diff --git a/app/views/crm/dining_queues/index.json.jbuilder b/app/views/crm/dining_queues/index.json.jbuilder new file mode 100644 index 00000000..979087b7 --- /dev/null +++ b/app/views/crm/dining_queues/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @crm_dining_queues, partial: 'crm_dining_queues/crm_dining_queue', as: :crm_dining_queue diff --git a/app/views/crm/dining_queues/new.html.erb b/app/views/crm/dining_queues/new.html.erb new file mode 100644 index 00000000..280a59b2 --- /dev/null +++ b/app/views/crm/dining_queues/new.html.erb @@ -0,0 +1,11 @@ + +
+ + <%= render 'form', dining_queue: @dining_queue %> +
\ No newline at end of file diff --git a/app/views/crm/dining_queues/show.html.erb b/app/views/crm/dining_queues/show.html.erb new file mode 100644 index 00000000..5e52a611 --- /dev/null +++ b/app/views/crm/dining_queues/show.html.erb @@ -0,0 +1,19 @@ +

<%= notice %>

+ +

+ Name: + <%= @crm_dining_queue.name %> +

+ +

+ Contact: + <%= @crm_dining_queue.contact %> +

+ +

+ Queue no: + <%= @crm_dining_queue.queue_no %> +

+ +<%= link_to 'Edit', edit_crm_dining_queue_path(@crm_dining_queue) %> | +<%= link_to 'Back', crm_dining_queues_path %> diff --git a/app/views/crm/dining_queues/show.json.jbuilder b/app/views/crm/dining_queues/show.json.jbuilder new file mode 100644 index 00000000..83c09bea --- /dev/null +++ b/app/views/crm/dining_queues/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "crm_dining_queues/crm_dining_queue", crm_dining_queue: @crm_dining_queue diff --git a/app/views/crm/home/_booking.html.erb b/app/views/crm/home/_booking.html.erb index b8d2ba50..fbe837a7 100644 --- a/app/views/crm/home/_booking.html.erb +++ b/app/views/crm/home/_booking.html.erb @@ -6,28 +6,29 @@ <% @booking.each do |booking| %> <% if booking.booking_status == "new" %>
-
-

- <%= @i += 1 %> . <%= booking.dining_facility.name %> - - <%= booking.id %> -

- -

- - Order at <%= booking.checkin_at.strftime("%H,%m") %>, <%= booking.checkin_by %> - -

-
-