From 2d5ae6da930509db39556fd552483a733c9199ce Mon Sep 17 00:00:00 2001 From: NyanLinHtut Date: Fri, 4 Oct 2019 18:20:14 +0630 Subject: [PATCH 01/24] fixed split bill --- app/controllers/origami/split_bill_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/origami/split_bill_controller.rb b/app/controllers/origami/split_bill_controller.rb index 3db5ce94..fb6db35f 100755 --- a/app/controllers/origami/split_bill_controller.rb +++ b/app/controllers/origami/split_bill_controller.rb @@ -333,7 +333,7 @@ class Origami::SplitBillController < BaseOrigamiController end end - Promotion.promo_activate(sale) + Promotion.promo_activate(sale_data) if ENV["SERVER_MODE"] == 'cloud' from = request.subdomain + "." + request.domain else From e2790c1b3b1a757707c57a61cd7b65f7ea70950a Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 16 Oct 2019 10:33:19 +0630 Subject: [PATCH 02/24] get update --- Gemfile | 2 +- Gemfile.lock | 27 ++++++++++++------------ app/controllers/api/api_controller.rb | 2 +- app/models/order_reservation.rb | 2 +- config/initializers/action_controller.rb | 10 ++++----- config/puma.rb | 22 +++++++++---------- 6 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Gemfile b/Gemfile index 66c149ef..1a15a61a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '2.4.1' +ruby '2.3.1' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" diff --git a/Gemfile.lock b/Gemfile.lock index 01c505f6..84791b6b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -62,7 +62,7 @@ GEM builder (3.2.3) byebug (11.0.1) cancancan (1.17.0) - capistrano (3.11.1) + capistrano (3.11.2) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) @@ -99,7 +99,7 @@ GEM factory_girl_rails (4.9.0) factory_girl (~> 4.9.0) railties (>= 3.0.0) - faker (2.4.0) + faker (2.5.0) i18n (~> 1.6.0) ffi (1.11.1) filterrific (5.2.1) @@ -140,7 +140,7 @@ GEM listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - loofah (2.2.3) + loofah (2.3.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -154,7 +154,7 @@ GEM mini_magick (4.9.5) mini_mime (1.0.2) mini_portile2 (2.4.0) - minitest (5.12.0) + minitest (5.12.2) momentjs-rails (2.20.1) railties (>= 3.1) multi_xml (0.6.0) @@ -202,15 +202,15 @@ GEM rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-html-sanitizer (1.2.0) - loofah (~> 2.2, >= 2.2.2) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) railties (5.1.7) actionpack (= 5.1.7) activesupport (= 5.1.7) method_source rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rake (12.3.3) + rake (13.0.0) rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) @@ -225,10 +225,10 @@ GEM rqrcode_core (0.1.0) rspec-core (3.8.2) rspec-support (~> 3.8.0) - rspec-expectations (3.8.4) + rspec-expectations (3.8.5) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) - rspec-mocks (3.8.1) + rspec-mocks (3.8.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.8.0) rspec-rails (3.8.2) @@ -239,7 +239,7 @@ GEM rspec-expectations (~> 3.8.0) rspec-mocks (~> 3.8.0) rspec-support (~> 3.8.0) - rspec-support (3.8.2) + rspec-support (3.8.3) ruby-ole (1.2.12.2) rubyzip (1.0.0) sass (3.7.4) @@ -262,12 +262,13 @@ GEM rack (>= 1.5.0) rack-protection (>= 1.5.0) redis (>= 3.3.5, < 5) - simple_form (4.1.0) + simple_form (5.0.1) actionpack (>= 5.0) activemodel (>= 5.0) spreadsheet (1.2.4) ruby-ole (>= 1.0) - spring (2.1.0) + spring (2.0.2) + activesupport (>= 4.2) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) @@ -370,7 +371,7 @@ DEPENDENCIES whenever RUBY VERSION - ruby 2.4.1p111 + ruby 2.3.1p112 BUNDLED WITH 2.0.2 diff --git a/app/controllers/api/api_controller.rb b/app/controllers/api/api_controller.rb index a5112ffe..ad38376a 100755 --- a/app/controllers/api/api_controller.rb +++ b/app/controllers/api/api_controller.rb @@ -1,5 +1,5 @@ class Api::ApiController < ActionController::API - include TokenVerification + # include TokenVerification # before_action :lookup_domain helper_method :current_token, :current_login_employee, :get_cashier diff --git a/app/models/order_reservation.rb b/app/models/order_reservation.rb index 0be86204..8de88ee2 100644 --- a/app/models/order_reservation.rb +++ b/app/models/order_reservation.rb @@ -75,7 +75,7 @@ class OrderReservation < ApplicationRecord order_reservation.discount_amount = order_reserve[:payment_info][:discount_amount] order_reservation.convenience_charge = order_reserve[:payment_info][:convenience_charge] order_reservation.grand_total = order_reserve[:payment_info][:grand_total] - order_reservation.transaction_fee = order_reserve[:payment_info][:transaction_fee] + # order_reservation.transaction_fee = order_reserve[:payment_info][:transaction_fee] order_reservation.order_remark = order_reserve[:order_info][:order_remark] end if order_reserve[:reservation_info] diff --git a/config/initializers/action_controller.rb b/config/initializers/action_controller.rb index 205c330a..85f38ec5 100644 --- a/config/initializers/action_controller.rb +++ b/config/initializers/action_controller.rb @@ -21,11 +21,11 @@ class ActionController::Base end else # check for license file - if check_license - current_license(ENV["SX_PROVISION_URL"]) - else - redirect_to activate_path - end + # if check_license + # current_license(ENV["SX_PROVISION_URL"]) + # else + # redirect_to activate_path + # end end end diff --git a/config/puma.rb b/config/puma.rb index d24425ae..f0013d25 100755 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,11 +1,11 @@ -application_path="#{File.expand_path("../..", __FILE__)}" -directory application_path -#environment ENV.fetch("RAILS_ENV") { "production" } -environment "production" -pidfile "#{application_path}/tmp/puma/pid" -state_path "#{application_path}/tmp/puma/state" -stdout_redirect "#{application_path}/log/puma.stdout.log", "#{application_path}/log/puma.stderr.log" -port ENV.fetch("PORT") { 62158 } -workers 2 -preload_app! -threads 1,1 +# application_path="#{File.expand_path("../..", __FILE__)}" +# directory application_path +# #environment ENV.fetch("RAILS_ENV") { "production" } +# environment "production" +# pidfile "#{application_path}/tmp/puma/pid" +# state_path "#{application_path}/tmp/puma/state" +# stdout_redirect "#{application_path}/log/puma.stdout.log", "#{application_path}/log/puma.stderr.log" +# port ENV.fetch("PORT") { 62158 } +# workers 2 +# preload_app! +# threads 1,1 From 565c0a5ec48a0e72bc7818f3c1469b75fe366579 Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 23 Oct 2019 11:37:38 +0630 Subject: [PATCH 03/24] production --- Gemfile.lock | 2 +- config/deploy/production.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a64de866..c0dd2cf8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -62,7 +62,7 @@ GEM builder (3.2.3) byebug (11.0.1) cancancan (1.17.0) - capistrano (3.11.2) + capistrano (3.10.1) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) diff --git a/config/deploy/production.rb b/config/deploy/production.rb index 8c23cfa6..23a6daf7 100644 --- a/config/deploy/production.rb +++ b/config/deploy/production.rb @@ -12,6 +12,7 @@ set :stage, :production set :server_name, "svr.sxrestaurant.host" set :full_app_name, "#{fetch(:application)}_#{fetch(:stage)}" + server '52.77.219.228', user: 'deploy', roles: %w{web app db}, primary: true set :deploy_to, "/home/#{fetch(:deploy_user)}/apps/#{fetch(:full_app_name)}" From 1330422b6042dfd4238a5701f7dad20c3b54a7a3 Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 23 Oct 2019 11:56:30 +0630 Subject: [PATCH 04/24] action controller --- config/initializers/action_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/action_controller.rb b/config/initializers/action_controller.rb index 845d363e..205c330a 100644 --- a/config/initializers/action_controller.rb +++ b/config/initializers/action_controller.rb @@ -20,7 +20,7 @@ class ActionController::Base end else - check for license file + # check for license file if check_license current_license(ENV["SX_PROVISION_URL"]) else From b025cc2cfd2b10df84cc1cee458efa4eef108752 Mon Sep 17 00:00:00 2001 From: Aung Ye Kyaw Date: Thu, 24 Oct 2019 05:40:56 +0000 Subject: [PATCH 05/24] Update Gemfile Ruby version change 2.3.1 to 2.4.1 (may be someone changed) --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 1a15a61a..66c149ef 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '2.3.1' +ruby '2.4.1' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" From 0be67f4f121a9a1e850a01cd1432676e4c3d3ff3 Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Fri, 25 Oct 2019 12:33:21 +0630 Subject: [PATCH 06/24] SX cap production setup files --- lib/capistrano/substitute_strings.rb | 12 +++++++ lib/capistrano/tasks/check_revision.cap | 14 ++++++++ .../tasks/compile_assets_locally.cap | 17 ++++++++++ lib/capistrano/tasks/logs.cap | 14 ++++++++ lib/capistrano/tasks/monit.cap | 10 ++++++ lib/capistrano/tasks/nginx.cap | 22 +++++++++++++ lib/capistrano/tasks/restart.cap | 10 ++++++ lib/capistrano/tasks/run_tests.cap | 18 ++++++++++ lib/capistrano/tasks/setup_config.cap | 33 +++++++++++++++++++ lib/capistrano/template.rb | 32 ++++++++++++++++++ 10 files changed, 182 insertions(+) create mode 100644 lib/capistrano/substitute_strings.rb create mode 100644 lib/capistrano/tasks/check_revision.cap create mode 100644 lib/capistrano/tasks/compile_assets_locally.cap create mode 100644 lib/capistrano/tasks/logs.cap create mode 100644 lib/capistrano/tasks/monit.cap create mode 100644 lib/capistrano/tasks/nginx.cap create mode 100644 lib/capistrano/tasks/restart.cap create mode 100644 lib/capistrano/tasks/run_tests.cap create mode 100644 lib/capistrano/tasks/setup_config.cap create mode 100644 lib/capistrano/template.rb diff --git a/lib/capistrano/substitute_strings.rb b/lib/capistrano/substitute_strings.rb new file mode 100644 index 00000000..d4b24432 --- /dev/null +++ b/lib/capistrano/substitute_strings.rb @@ -0,0 +1,12 @@ +# we often want to refer to variables which +# are defined in subsequent stage files. This +# let's us use the {{var}} to represent fetch(:var) +# in strings which are only evaluated at runtime. + +def sub_strings(input_string) + output_string = input_string + input_string.scan(/{{(\w*)}}/).each do |var| + output_string.gsub!("{{#{var[0]}}}", fetch(var[0].to_sym)) + end + output_string +end diff --git a/lib/capistrano/tasks/check_revision.cap b/lib/capistrano/tasks/check_revision.cap new file mode 100644 index 00000000..72b4aa12 --- /dev/null +++ b/lib/capistrano/tasks/check_revision.cap @@ -0,0 +1,14 @@ +namespace :deploy do + desc "checks whether the currently checkout out revision matches the + remote one we're trying to deploy from" + task :check_revision do + branch = fetch(:branch) + unless `git rev-parse HEAD` == `git rev-parse #{branch}` + puts "WARNING: HEAD is not the same as #{branch}" + puts "Run `git push` to sync changes or make sure you've" + puts "checked out the branch: #{branch} as you can only deploy" + puts "if you've got the target branch checked out" + exit + end + end +end diff --git a/lib/capistrano/tasks/compile_assets_locally.cap b/lib/capistrano/tasks/compile_assets_locally.cap new file mode 100644 index 00000000..e6264e81 --- /dev/null +++ b/lib/capistrano/tasks/compile_assets_locally.cap @@ -0,0 +1,17 @@ +namespace :deploy do + desc "compiles assets locally then rsyncs" + task :compile_assets_locally do + run_locally do + execute "RAILS_ENV=#{fetch(:rails_env)} bundle exec rake assets:precompile" + end + on roles(:app) do |role| + run_locally do + execute"rsync -av ./public/assets/ #{role.user}@#{role.hostname}:#{release_path}/public/assets/;" + end + sudo "chmod -R 755 #{release_path}/public/assets/" + end + run_locally do + execute "rm -rf ./public/assets" + end + end +end diff --git a/lib/capistrano/tasks/logs.cap b/lib/capistrano/tasks/logs.cap new file mode 100644 index 00000000..7bbfac2e --- /dev/null +++ b/lib/capistrano/tasks/logs.cap @@ -0,0 +1,14 @@ +namespace :logs do + task :tail, :file do |t, args| + if args[:file] + on roles(:app) do + execute "tail -f #{shared_path}/log/#{args[:file]}.log" + end + else + puts "please specify a logfile e.g: 'rake logs:tail[logfile]" + puts "will tail 'shared_path/log/logfile.log'" + puts "remember if you use zsh you'll need to format it as:" + puts "rake 'logs:tail[logfile]' (single quotes)" + end + end +end diff --git a/lib/capistrano/tasks/monit.cap b/lib/capistrano/tasks/monit.cap new file mode 100644 index 00000000..5dbac6a2 --- /dev/null +++ b/lib/capistrano/tasks/monit.cap @@ -0,0 +1,10 @@ +namespace :monit do + %w(start stop restart).each do |task_name| + desc "#{task_name} Monit" + task task_name do + on roles(:app), in: :sequence, wait: 5 do + sudo "service monit #{task_name}" + end + end + end +end diff --git a/lib/capistrano/tasks/nginx.cap b/lib/capistrano/tasks/nginx.cap new file mode 100644 index 00000000..dfadd5c6 --- /dev/null +++ b/lib/capistrano/tasks/nginx.cap @@ -0,0 +1,22 @@ +namespace :nginx do + %w(start stop restart reload).each do |task_name| + desc "#{task } Nginx" + task task_name do + on roles(:app), in: :sequence, wait: 5 do + sudo "/etc/init.d/nginx #{task_name}" + end + end + end + + desc "Remove default Nginx Virtual Host" + task "remove_default_vhost" do + on roles(:app) do + if test("[ -f /etc/nginx/sites-enabled/default ]") + sudo "rm /etc/nginx/sites-enabled/default" + puts "removed default Nginx Virtualhost" + else + puts "No default Nginx Virtualhost to remove" + end + end + end +end diff --git a/lib/capistrano/tasks/restart.cap b/lib/capistrano/tasks/restart.cap new file mode 100644 index 00000000..ff8c028f --- /dev/null +++ b/lib/capistrano/tasks/restart.cap @@ -0,0 +1,10 @@ +namespace :deploy do + desc 'Commands for unicorn application' + %w(start stop force-stop restart upgrade reopen-logs).each do |command| + task command.to_sym do + on roles(:app), in: :sequence, wait: 5 do + sudo "/etc/init.d/unicorn_#{fetch(:full_app_name)} #{command}" + end + end + end +end diff --git a/lib/capistrano/tasks/run_tests.cap b/lib/capistrano/tasks/run_tests.cap new file mode 100644 index 00000000..32f26f9c --- /dev/null +++ b/lib/capistrano/tasks/run_tests.cap @@ -0,0 +1,18 @@ +namespace :deploy do + desc "Runs test before deploying, can't deploy unless they pass" + task :run_tests do + test_log = "log/capistrano.test.log" + tests = fetch(:tests) + tests.each do |test| + puts "--> Running tests: '#{test}', please wait ..." + unless system "bundle exec rspec #{test} > #{test_log} 2>&1" + puts "--> Tests: '#{test}' failed. Results in: #{test_log} and below:" + system "cat #{test_log}" + exit; + end + puts "--> '#{test}' passed" + end + puts "--> All tests passed" + system "rm #{test_log}" + end +end diff --git a/lib/capistrano/tasks/setup_config.cap b/lib/capistrano/tasks/setup_config.cap new file mode 100644 index 00000000..81ce88d9 --- /dev/null +++ b/lib/capistrano/tasks/setup_config.cap @@ -0,0 +1,33 @@ +namespace :deploy do + task :setup_config do + on roles(:app) do + # make the config dir + execute :mkdir, "-p #{shared_path}/config" + full_app_name = fetch(:full_app_name) + + # config files to be uploaded to shared/config, see the + # definition of smart_template for details of operation. + # Essentially looks for #{filename}.erb in deploy/#{full_app_name}/ + # and if it isn't there, falls back to deploy/#{shared}. Generally + # everything should be in deploy/shared with params which differ + # set in the stage files + config_files = fetch(:config_files) + config_files.each do |file| + smart_template file + end + + # which of the above files should be marked as executable + executable_files = fetch(:executable_config_files) + executable_files.each do |file| + execute :chmod, "+x #{shared_path}/config/#{file}" + end + + # symlink stuff which should be... symlinked + symlinks = fetch(:symlinks) + + symlinks.each do |symlink| + sudo "ln -nfs #{shared_path}/config/#{symlink[:source]} #{sub_strings(symlink[:link])}" + end + end + end +end diff --git a/lib/capistrano/template.rb b/lib/capistrano/template.rb new file mode 100644 index 00000000..07bd0be3 --- /dev/null +++ b/lib/capistrano/template.rb @@ -0,0 +1,32 @@ +# will first try and copy the file: +# config/deploy/#{full_app_name}/#{from}.erb +# to: +# shared/config/to +# if the original source path doesn exist then it will +# search in: +# config/deploy/shared/#{from}.erb +# this allows files which are common to all enviros to +# come from a single source while allowing specific +# ones to be over-ridden +# if the target file name is the same as the source then +# the second parameter can be left out +def smart_template(from, to=nil) + to ||= from + full_to_path = "#{shared_path}/config/#{to}" + if from_erb_path = template_file(from) + from_erb = StringIO.new(ERB.new(File.read(from_erb_path)).result(binding)) + upload! from_erb, full_to_path + info "copying: #{from_erb} to: #{full_to_path}" + else + error "error #{from} not found" + end +end + +def template_file(name) + if File.exist?((file = "config/deploy/#{fetch(:full_app_name)}/#{name}.erb")) + return file + elsif File.exist?((file = "config/deploy/shared/#{name}.erb")) + return file + end + return nil +end From bfc697376286b61049872eee350da51778b4cf27 Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Fri, 25 Oct 2019 13:00:40 +0630 Subject: [PATCH 07/24] Gem lock update --- Gemfile.lock | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0db34edf..7928786c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -62,7 +62,7 @@ GEM builder (3.2.3) byebug (11.0.1) cancancan (1.17.0) - capistrano (3.10.1) + capistrano (3.11.2) airbrussh (>= 1.0.0) i18n rake (>= 10.0.0) @@ -72,15 +72,11 @@ GEM capistrano-rails (1.4.0) capistrano (~> 3.1) capistrano-bundler (~> 1.1) -<<<<<<< HEAD capistrano3-puma (3.1.1) capistrano (~> 3.7) capistrano-bundler puma (~> 3.4) - carrierwave (1.2.1) -======= carrierwave (1.3.1) ->>>>>>> b025cc2cfd2b10df84cc1cee458efa4eef108752 activemodel (>= 4.0.0) activesupport (>= 4.0.0) mime-types (>= 1.16) @@ -107,8 +103,8 @@ GEM factory_girl_rails (4.9.0) factory_girl (~> 4.9.0) railties (>= 3.0.0) - faker (2.5.0) - i18n (~> 1.6.0) + faker (2.6.0) + i18n (>= 1.6, < 1.8) ffi (1.11.1) filterrific (5.2.1) font-awesome-rails (4.7.0.5) @@ -148,7 +144,7 @@ GEM listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - loofah (2.3.0) + loofah (2.3.1) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -231,23 +227,23 @@ GEM chunky_png (~> 1.0) rqrcode_core (~> 0.1.0) rqrcode_core (0.1.0) - rspec-core (3.8.2) - rspec-support (~> 3.8.0) - rspec-expectations (3.8.5) + rspec-core (3.9.0) + rspec-support (~> 3.9.0) + rspec-expectations (3.9.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.8.0) - rspec-mocks (3.8.2) + rspec-support (~> 3.9.0) + rspec-mocks (3.9.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.9.0) rspec-rails (3.9.0) actionpack (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec-core (~> 3.8.0) - rspec-expectations (~> 3.8.0) - rspec-mocks (~> 3.8.0) - rspec-support (~> 3.8.0) - rspec-support (3.8.3) + rspec-core (~> 3.9.0) + rspec-expectations (~> 3.9.0) + rspec-mocks (~> 3.9.0) + rspec-support (~> 3.9.0) + rspec-support (3.9.0) ruby-ole (1.2.12.2) rubyzip (1.0.0) sass (3.7.4) @@ -273,10 +269,9 @@ GEM simple_form (5.0.1) actionpack (>= 5.0) activemodel (>= 5.0) - spreadsheet (1.2.4) + spreadsheet (1.2.5) ruby-ole (>= 1.0) - spring (2.0.2) - activesupport (>= 4.2) + spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) @@ -380,7 +375,7 @@ DEPENDENCIES whenever RUBY VERSION - ruby 2.3.1p112 + ruby 2.4.1p111 BUNDLED WITH 2.0.2 From 77ed76c36864cadee1d17e1adad99eb73a08da08 Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Fri, 25 Oct 2019 13:04:12 +0630 Subject: [PATCH 08/24] Update Gemfile to use ruby 2.6.5 --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 73701b6c..9f51df74 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '2.4.1' +ruby '2.6.5' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" From af3efbe607e68a4fe378ff40c363a2e5d151f88e Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Fri, 25 Oct 2019 13:06:45 +0630 Subject: [PATCH 09/24] Update Gemfile to use ruby 2.6.5 --- Gemfile | 2 +- Gemfile.lock | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 9f51df74..c489fc3e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '2.6.5' + git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" diff --git a/Gemfile.lock b/Gemfile.lock index 7928786c..e28d4fd6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -374,8 +374,5 @@ DEPENDENCIES web-console (>= 3.3.0) whenever -RUBY VERSION - ruby 2.4.1p111 - BUNDLED WITH 2.0.2 From dc1f83ddc9b683c6f09063e442915c94a883ab0b Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Fri, 25 Oct 2019 13:14:49 +0630 Subject: [PATCH 10/24] remove cups installation for cloud in Gemfile --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index c489fc3e..143907b6 100644 --- a/Gemfile +++ b/Gemfile @@ -44,7 +44,7 @@ gem 'mini_magick' gem 'jquery-fileupload-rails', '~> 0.4.7' #Report and Printing gems -gem 'cups' +#gem 'cups' #remove for cloud installation gem 'prawn' gem 'prawn-table' gem 'prawn-qrcode' From 2e2117a8203764bd8c85dc96905eccc85fc37b8b Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Fri, 25 Oct 2019 13:20:26 +0630 Subject: [PATCH 11/24] Remove cups for cloud --- Gemfile.lock | 2 -- 1 file changed, 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index e28d4fd6..db4f94aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -93,7 +93,6 @@ GEM concurrent-ruby (1.1.5) connection_pool (2.2.2) crass (1.0.5) - cups (0.1.10) database_cleaner (1.7.0) diff-lcs (1.3) erubi (1.9.0) @@ -329,7 +328,6 @@ DEPENDENCIES carrierwave (~> 1.0) chartkick coffee-rails (~> 4.2) - cups database_cleaner factory_girl_rails (~> 4.0) faker From cec212bb394dae01f0e7a21946188e27efe0ef8a Mon Sep 17 00:00:00 2001 From: Nweni Date: Tue, 29 Oct 2019 10:06:00 +0630 Subject: [PATCH 12/24] dump --- dump.rdb | Bin 1864 -> 1864 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dump.rdb b/dump.rdb index e4cb2863ade5864c70f85f677175fe6da53f30c9..42a27347f402a7cb6e6710a1d8f90f36e350dfb7 100644 GIT binary patch delta 100 zcmX@XcY<$%0rNul4HJz$Cg-!UPX5AbG`W*adg3Y3$?j}wlU3McC%zQD@1@%}v)pp@=pL3YWBo8*DQqP#|C2N?dFKRMjN((!u- E0OzD65&!@I delta 116 zcmX@XcY<$%0khSYWfP4(Ca-3cU^CY>GCRO9`2d^bWOjCW9`53j#1gBt#LS%3l+6zr zAFxc`z$nUMYyegwK3SDfcH%Ud$y|)m6VI|we5^XTpHXV!2HD9@jOIXvQj-s|NldJk Uo_w86ob&(G?^>_Q<2Q8z02jk4^#A|> From d4a90d6563241c995846c8325532a1ce1c9bbf04 Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Tue, 29 Oct 2019 10:38:50 +0630 Subject: [PATCH 13/24] docker changes --- config/deploy.rb | 1 + docker-compose.yml | 60 ++++++++++++++++++++++++---------------------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/config/deploy.rb b/config/deploy.rb index 6dba4c2d..05bba77d 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -83,6 +83,7 @@ namespace :deploy do before :deploy, "deploy:run_tests" # compile assets locally then rsync after 'deploy:symlink:shared', 'deploy:compile_assets_locally' + Rake::Task["deploy:assets:precompile"].clear_actions after :finishing, 'deploy:cleanup' diff --git a/docker-compose.yml b/docker-compose.yml index d1a961f7..ab61383d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,31 +1,33 @@ version: '3' services: - code2lab: - build: - context: . - dockerfile: ./Dockerfile - links: - - redis - volumes: - - .:/sxrestaurant - env_file: - - .code2lab.env - ports: - - '8082:62158' - environment: - - REDIS_URL=redis://redis:6379/0 - sidekiq: - build: . - command: bundle exec sidekiq -C config/sidekiq.yml - links: - - redis - volumes: - - .:/sxrestaurant - environment: - - REDIS_URL=redis://redis:6379/0 - redis: - image: redis - ports: - - '6380:6379' - volumes: - - ../data/redis:/data \ No newline at end of file + code2lab: + build: + context: . + dockerfile: ./Dockerfile + links: + - redis + volumes: + - .:/sxrestaurant + - "/etc/timezone:/etc/timezone:ro" + - "/etc/localtime:/etc/localtime:ro" + env_file: + - .code2lab.env + ports: + - '62160:62158' + environment: + - REDIS_URL=redis://172.17.0.1:6380/0 + sidekiq: + build: . + command: bundle exec sidekiq -C config/sidekiq.yml + links: + - redis + volumes: + - .:/sxrestaurant + environment: + - REDIS_URL=redis://172.17.0.1:6380/0 + redis: + image: redis + ports: + - '6380:6379' + volumes: + - ../data/redis:/data From 83e7f22b13954d9a92d074c397c2faadb38b32dc Mon Sep 17 00:00:00 2001 From: Min Zeya Phyo Date: Tue, 29 Oct 2019 14:15:43 +0630 Subject: [PATCH 14/24] menu form is_ordering and is_active to data type boolean --- app/views/settings/menus/_form.html.erb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/views/settings/menus/_form.html.erb b/app/views/settings/menus/_form.html.erb index 15842333..770a18b3 100755 --- a/app/views/settings/menus/_form.html.erb +++ b/app/views/settings/menus/_form.html.erb @@ -7,8 +7,8 @@
<%= f.input :name,:input_html=>{:class=>"col-md-9"} %> - <%= f.input :is_active,:input_html=>{:class=>"col-md-9"} %> - <%= f.input :is_ordering,:input_html=>{:class=>"col-md-9"} %> + <%= f.input :is_active,:input_html=>{:class=>"col-md-9"}, as: :boolean %> + <%= f.input :is_ordering,:input_html=>{:class=>"col-md-9"}, as: :boolean %>
@@ -50,7 +50,7 @@ <% end %>
- +
@@ -58,7 +58,7 @@
<% end %> - +
@@ -81,7 +81,7 @@ 2) <%= t("views.right_panel.button.back") %> - <%= t("views.right_panel.detail.back_txt") %> <%= t("views.right_panel.detail.menu_txt") %>

-
+ - From 6b6c945af7fa25bda39cd53bc8e18830eecc08f2 Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 30 Oct 2019 10:23:28 +0630 Subject: [PATCH 15/24] gemfile --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 143907b6..5df23eb0 100644 --- a/Gemfile +++ b/Gemfile @@ -45,6 +45,7 @@ gem 'jquery-fileupload-rails', '~> 0.4.7' #Report and Printing gems #gem 'cups' #remove for cloud installation +# gem 'cups' gem 'prawn' gem 'prawn-table' gem 'prawn-qrcode' From 41178978d23b5959cb242590c6a3063327308e7a Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 30 Oct 2019 10:38:49 +0630 Subject: [PATCH 16/24] gem lock --- Gemfile | 2 +- Gemfile.lock | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 5df23eb0..a49cf828 100644 --- a/Gemfile +++ b/Gemfile @@ -45,7 +45,7 @@ gem 'jquery-fileupload-rails', '~> 0.4.7' #Report and Printing gems #gem 'cups' #remove for cloud installation -# gem 'cups' +gem 'cups', '~>0.0.7' gem 'prawn' gem 'prawn-table' gem 'prawn-qrcode' diff --git a/Gemfile.lock b/Gemfile.lock index db4f94aa..3a70c5bd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,7 +80,7 @@ GEM activemodel (>= 4.0.0) activesupport (>= 4.0.0) mime-types (>= 1.16) - chartkick (3.2.1) + chartkick (3.2.2) chronic (0.10.2) chunky_png (1.3.11) coffee-rails (4.2.2) @@ -93,6 +93,7 @@ GEM concurrent-ruby (1.1.5) connection_pool (2.2.2) crass (1.0.5) + cups (0.0.7) database_cleaner (1.7.0) diff-lcs (1.3) erubi (1.9.0) @@ -270,7 +271,8 @@ GEM activemodel (>= 5.0) spreadsheet (1.2.5) ruby-ole (>= 1.0) - spring (2.1.0) + spring (2.0.2) + activesupport (>= 4.2) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) @@ -328,6 +330,7 @@ DEPENDENCIES carrierwave (~> 1.0) chartkick coffee-rails (~> 4.2) + cups (~> 0.0.7) database_cleaner factory_girl_rails (~> 4.0) faker From 359679d41906c7bbb4bfd25d38b37ac6d9e381f2 Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 30 Oct 2019 16:52:16 +0630 Subject: [PATCH 17/24] CBKI --- app/controllers/api/authenticate_controller.rb | 2 +- app/controllers/origami/addorders_controller.rb | 2 +- app/controllers/origami/payments_controller.rb | 2 +- app/controllers/origami/pending_order_controller.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/authenticate_controller.rb b/app/controllers/api/authenticate_controller.rb index 8fb10040..02043be9 100755 --- a/app/controllers/api/authenticate_controller.rb +++ b/app/controllers/api/authenticate_controller.rb @@ -1,5 +1,5 @@ class Api::AuthenticateController < Api::ApiController - skip_before_action :authenticate + # skip_before_action :authenticate def create emp_id = params[:emp_id] diff --git a/app/controllers/origami/addorders_controller.rb b/app/controllers/origami/addorders_controller.rb index ba302f88..597b5d28 100755 --- a/app/controllers/origami/addorders_controller.rb +++ b/app/controllers/origami/addorders_controller.rb @@ -305,7 +305,7 @@ class Origami::AddordersController < BaseOrigamiController def getCloudDomain from = "" if ENV["SERVER_MODE"] == 'cloud' - from = request.subdomain + "." + request.domain + from = request.subdomain.to_s + "." + request.domain.to_s end return from diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 5de37662..963d6ee3 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -839,7 +839,7 @@ class Origami::PaymentsController < BaseOrigamiController def getCloudDomain from = "" if ENV["SERVER_MODE"] == 'cloud' - from = request.subdomain + "." + request.domain + from = request.subdomain.to_s + "." + request.domain.to_s end return from diff --git a/app/controllers/origami/pending_order_controller.rb b/app/controllers/origami/pending_order_controller.rb index 4b412c17..773a217e 100644 --- a/app/controllers/origami/pending_order_controller.rb +++ b/app/controllers/origami/pending_order_controller.rb @@ -22,7 +22,7 @@ class Origami::PendingOrderController < BaseOrigamiController else redirect_to "/origami/#{params[:type]}" and return end - elsif id.start_with?("BKI") + elsif (id.start_with?("BKI") || id.start_with?("CBKI")) @bookings = Booking.find(id) @order = @bookings.orders.where(status: "new").first @order_items = @bookings.order_items From d95499f24d9399f272813671e3782c79c252e272 Mon Sep 17 00:00:00 2001 From: Nweni Date: Wed, 30 Oct 2019 17:58:17 +0630 Subject: [PATCH 18/24] authenticate --- app/controllers/api/api_controller.rb | 2 +- app/controllers/api/authenticate_controller.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/api_controller.rb b/app/controllers/api/api_controller.rb index ad38376a..a5112ffe 100755 --- a/app/controllers/api/api_controller.rb +++ b/app/controllers/api/api_controller.rb @@ -1,5 +1,5 @@ class Api::ApiController < ActionController::API - # include TokenVerification + include TokenVerification # before_action :lookup_domain helper_method :current_token, :current_login_employee, :get_cashier diff --git a/app/controllers/api/authenticate_controller.rb b/app/controllers/api/authenticate_controller.rb index 02043be9..8fb10040 100755 --- a/app/controllers/api/authenticate_controller.rb +++ b/app/controllers/api/authenticate_controller.rb @@ -1,5 +1,5 @@ class Api::AuthenticateController < Api::ApiController - # skip_before_action :authenticate + skip_before_action :authenticate def create emp_id = params[:emp_id] From d2cf13cd3b8d48732f3e37c9086caddceef6fe77 Mon Sep 17 00:00:00 2001 From: Nweni Date: Fri, 1 Nov 2019 12:08:15 +0630 Subject: [PATCH 19/24] dump --- dump.rdb | Bin 1864 -> 1864 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dump.rdb b/dump.rdb index 42a27347f402a7cb6e6710a1d8f90f36e350dfb7..2b0eb54ec77065e59631cfc96f9a0a9087d16625 100644 GIT binary patch delta 195 zcmX@XcY<$%f%xsbU9rD7N{drdbaPX44}Dn6$MBEgx9H?`jN&ZD1_u}>doUVK=3zGw z0f{GD Date: Fri, 1 Nov 2019 16:28:18 +0630 Subject: [PATCH 20/24] print copies --- app/models/printer/receipt_printer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/printer/receipt_printer.rb b/app/models/printer/receipt_printer.rb index b45c722b..f7b35a5a 100755 --- a/app/models/printer/receipt_printer.rb +++ b/app/models/printer/receipt_printer.rb @@ -227,8 +227,8 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker count = printer_settings.print_copies # override print copies for print worker loop - print_settings.print_copies = 1 - print_settings.save! + # print_settings.print_copies = 1 + # print_settings.save! end directory_name = 'public/receipts' Dir.mkdir(directory_name) unless File.exists?(directory_name) From 8046b7210bf7765c36c3f6446b97c882f8a5662b Mon Sep 17 00:00:00 2001 From: Thein Lin Kyaw Date: Fri, 8 Nov 2019 20:35:26 +0630 Subject: [PATCH 21/24] request bill error on promotion. fix for compute sale's totals on promotion. --- app/controllers/api/void_controller.rb | 9 ++- .../origami/customers_controller.rb | 28 ++++---- .../origami/discounts_controller.rb | 11 ++- .../origami/other_charges_controller.rb | 30 ++++---- .../origami/payments_controller.rb | 4 +- .../origami/sale_edit_controller.rb | 20 +++--- app/controllers/origami/void_controller.rb | 2 +- .../origami/waste_spoile_controller.rb | 1 - .../transactions/sales_controller.rb | 70 +++++++++---------- app/models/promotion.rb | 11 +-- app/models/sale.rb | 54 ++++++-------- app/models/sale_item.rb | 2 +- app/models/sale_payment.rb | 2 +- 13 files changed, 117 insertions(+), 127 deletions(-) diff --git a/app/controllers/api/void_controller.rb b/app/controllers/api/void_controller.rb index ab5d87f0..80bda5fa 100644 --- a/app/controllers/api/void_controller.rb +++ b/app/controllers/api/void_controller.rb @@ -8,7 +8,7 @@ class Api::VoidController < Api::ApiController if sale.discount_type == "member_discount" sale.update_attributes(total_discount: 0) - sale.compute_by_sale_items(sale_id, sale.sale_items,0,order_source) + sale.compute_by_sale_items(0, nil, order_source) end # update count for shift sale @@ -25,18 +25,17 @@ class Api::VoidController < Api::ApiController shift.save end end - + sale.rounding_adjustment = 0.0 sale.payment_status = 'void' sale.sale_status = 'void' sale.save - + # remark = "Void Sale ID #{sale_id} | Receipt No #{sale.receipt_no} | Receipt No #{sale.receipt_no} | Table ->#{table.name}" sale_audit = SaleAudit.record_audit_for_edit(sale_id,current_login_employee.name, current_login_employee.name,nil,"SALEVOID" ) render json: JSON.generate({:status => true, :message => "Void successful."}) else render json: JSON.generate({:status => false, :error_message => "There is no sale for '#{params[:sale_id]}'!"}) end - end + end end - diff --git a/app/controllers/origami/customers_controller.rb b/app/controllers/origami/customers_controller.rb index d5e6b524..97f35339 100644 --- a/app/controllers/origami/customers_controller.rb +++ b/app/controllers/origami/customers_controller.rb @@ -48,44 +48,44 @@ class Origami::CustomersController < BaseOrigamiController def add_customer @webview = false if check_mobile - @webview = true + @webview = true end - + @sale_id = params[:sale_id] @cashier_type = params[:type] @page = params[:dir_page] - + if(@sale_id[0,3] == "SAL") @booking = Booking.find_by_sale_id(@sale_id) if @booking.dining_facility_id.to_i > 0 @dining_facility = DiningFacility.find(@booking.dining_facility_id) else - @dining_facility = nil + @dining_facility = nil end - + else @booking_order = BookingOrder.find_by_order_id(@sale_id) @booking = Booking.find(@booking_order.booking_id) if @booking.dining_facility_id.to_i > 0 @dining_facility = DiningFacility.find(@booking.dining_facility_id) else - @dining_facility = nil + @dining_facility = nil end - end + end 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) + @crm_customers = Customer.search(filter) end #@crm_customers = Customer.all @crm_customers = Kaminari.paginate_array(@crm_customers).page(params[:page]).per(20) @crm_customer = Customer.new @count_customer = Customer.count_customer - + # @taxes = TaxProfile.where(:group_type => 'cashier') @taxes = TaxProfile.unscoped.select("id, (CONCAT(name,'(',(SELECT name FROM lookups WHERE lookup_type='tax_profiles' AND value=group_type),')')) as name") .order("group_type ASC,order_by ASC") @@ -100,7 +100,7 @@ class Origami::CustomersController < BaseOrigamiController lookup_customer = Lookup.collection_of('customer_settings') if !lookup_customer.empty? lookup_customer.each do |create_setting| - if create_setting[0].downcase == "create" + if create_setting[0].downcase == "create" if create_setting[1] == '0' && current_login_employee.role == 'cashier' @create_flag = false end @@ -154,13 +154,13 @@ class Origami::CustomersController < BaseOrigamiController if status == true render json: JSON.generate({:status => true}) if(id == "SAL") - sale.compute_by_sale_items(sale.sale_id, sale.sale_items, sale.total_discount, nil, order_source) - end + sale.compute_by_sale_items(sale.total_discount, nil, order_source) + end else render json: JSON.generate({:status => false, :error_message => "Record not found"}) end end - + def send_account amount = params[:amount] account_no = params[:account_no] diff --git a/app/controllers/origami/discounts_controller.rb b/app/controllers/origami/discounts_controller.rb index 827d26c7..6f4690f0 100755 --- a/app/controllers/origami/discounts_controller.rb +++ b/app/controllers/origami/discounts_controller.rb @@ -33,7 +33,6 @@ class Origami::DiscountsController < BaseOrigamiController overall_discount = params[:overall_discount] sub_total = params[:sub_total] - if Sale.exists?(sale_id) sale = Sale.find(sale_id) if sale.bookings[0].dining_facility_id.to_i > 0 @@ -88,7 +87,7 @@ class Origami::DiscountsController < BaseOrigamiController remark = "Discount Item Name ->#{sale_item.product_name}-Product Code ->#{sale_item.product_code} | Price [#{sale_item.price}] | Receipt No #{sale.receipt_no} " sale_audit = SaleAudit.record_audit_discount(sale_item.sale_id,sale.cashier_name, action_by,remark,"ITEMDISCOUNT" ) - + end end @@ -103,7 +102,7 @@ class Origami::DiscountsController < BaseOrigamiController sale_audit = SaleAudit.record_audit_discount(sale.sale_id,sale.cashier_name, action_by,remark,"OVERALLDISCOUNT" ) end - sale.compute_by_sale_items(sale_id, sale.sale_items, overall_discount.to_f, nil,order_source) + sale.compute_by_sale_items(overall_discount.to_f, nil,order_source) if !table.nil? result = {:status=> "Success", :table_id => table_id, :table_type => table.type } else @@ -158,7 +157,7 @@ class Origami::DiscountsController < BaseOrigamiController # sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax; # sale.save # Re-calc All Amount in Sale - sale.compute_by_sale_items(sale_id, sale.sale_items, sale.total_discount, nil, order_source) + sale.compute_by_sale_items(sale.total_discount, nil, order_source) if table.nil? result = {:status=> "Success"} else @@ -220,7 +219,7 @@ class Origami::DiscountsController < BaseOrigamiController sale_audit = SaleAudit.record_audit_discount(sale.sale_id,sale.cashier_name, action_by,remark,"REMOVEALLDISCOUNT" ) # Re-calc All Amount in Sale - sale.compute_by_sale_items(sale_id, sale.sale_items, 0, nil, order_source) + sale.compute_by_sale_items(0, nil, order_source) if table.nil? result = {:status=> "Success"} else @@ -321,7 +320,7 @@ class Origami::DiscountsController < BaseOrigamiController if response["discount_bonus_earned"] discount_amount = discount_amount + response["discount_bonus_earned"] end - sale.compute_by_sale_items(sale_id, sale.sale_items, discount_amount, 'member_discount', order_source, tax_type) + sale.compute_by_sale_items(discount_amount, 'member_discount', order_source, tax_type) result = {:status=> "Success",:title=>"Member Discount", :table_id => table_id,:table_type => table_type } elsif response["status"] == "500" result = {:status=> response["error"],:title=>"Alert", :table_id => table_id,:table_type => table_type } diff --git a/app/controllers/origami/other_charges_controller.rb b/app/controllers/origami/other_charges_controller.rb index 36fbffb8..fbcd2ec1 100755 --- a/app/controllers/origami/other_charges_controller.rb +++ b/app/controllers/origami/other_charges_controller.rb @@ -4,9 +4,9 @@ class Origami::OtherChargesController < BaseOrigamiController def index @webview = false if check_mobile - @webview = true + @webview = true end - + sale_id = params[:sale_id] @cashier_type = params[:type] if Sale.exists?(sale_id) @@ -15,11 +15,11 @@ class Origami::OtherChargesController < BaseOrigamiController @table = DiningFacility.find(@sale_data.bookings[0].dining_facility_id) else @table = nil - end + end end end - def create + def create sale_id = params[:sale_id] other_charges_items = JSON.parse(params[:other_charges_items]) sub_total = params[:sub_total] @@ -34,11 +34,11 @@ class Origami::OtherChargesController < BaseOrigamiController table_id = nil table = nil end - + # sale.total_amount = sub_total.to_f - # sale.grand_total = sub_total.to_f + sale.total_tax; - # sale.save + # sale.grand_total = sub_total.to_f + sale.total_tax; + # sale.save if other_charges_items.length > 0 #save sale item for discount other_charges_items.each do |di| @@ -68,18 +68,18 @@ class Origami::OtherChargesController < BaseOrigamiController else remark = "Add Other Charges - Receipt No #{sale.receipt_no} | Sale ID #{sale.sale_id} |Charges ->#{di["price"]} For ->#{di["name"]}- Table ->#{table.name}" end - + sale_audit = SaleAudit.record_audit_for_edit(sale.sale_id,sale.cashier_name, action_by,remark,"ADDOTHERCHARGES" ) - end - end + end + end # Re-calc All Amount in Sale - sale.compute_by_sale_items(sale_id, sale.sale_items, sale.total_discount, nil, cashier_type) - end + sale.compute_by_sale_items(sale.total_discount, nil, cashier_type) + end if !table.nil? dining = {:table_id => table_id, :table_type => table.type } render :json => dining.to_json - end - end -end \ No newline at end of file + end + end +end diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 78de240d..49f1a124 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -643,7 +643,7 @@ class Origami::PaymentsController < BaseOrigamiController if saleObj.discount_type == "member_discount" saleObj.update_attributes(grand_total: 0, rounding_adjustment: 0, amount_received: 0, amount_changed: 0) - saleObj.compute_by_sale_items(sale_id, saleObj.sale_items,0,order_source) + saleObj.compute_by_sale_items(0, nil, order_source) end saleObj.update_attributes(grand_total: 0, rounding_adjustment: 0, amount_received: 0, amount_changed: 0) @@ -818,7 +818,7 @@ class Origami::PaymentsController < BaseOrigamiController order_source = params[:cashier_type] tax_type = params[:tax_type] sale = Sale.find(sale_id) - sale.compute_by_sale_items(sale.sale_id, sale.sale_items, sale.total_discount,nil,order_source,tax_type) + sale.compute_by_sale_items(sale.total_discount, nil, order_source, tax_type) render json: JSON.generate({:status => true}) end diff --git a/app/controllers/origami/sale_edit_controller.rb b/app/controllers/origami/sale_edit_controller.rb index d537f8e9..7f456f35 100755 --- a/app/controllers/origami/sale_edit_controller.rb +++ b/app/controllers/origami/sale_edit_controller.rb @@ -59,7 +59,7 @@ class Origami::SaleEditController < BaseOrigamiController remark = "Void Sale Item ID #{saleitemObj.sale_item_id} | Receipt No #{saleObj.receipt_no} | Item Name ->#{saleitemObj.product_name}-Product Code ->#{saleitemObj.product_code}-Instance Code ->#{saleitemObj.item_instance_code}" sale_audit = SaleAudit.record_audit_for_edit(saleitemObj.sale_id,current_user.name, action_by,remark,"SALEITEMVOID" ) - saleObj.compute_by_sale_items(saleObj.sale_id, saleObj.sale_items, saleObj.total_discount,order_source) + saleObj.compute_by_sale_items(saleObj.total_discount, nil, order_source) ProductCommission.create_product_commission(@newsaleitem, saleitemObj) end @@ -95,7 +95,7 @@ class Origami::SaleEditController < BaseOrigamiController remark = "FOC Sale Item ID #{saleitemObj.sale_item_id} | Receipt No #{saleObj.receipt_no} | Item Name ->#{saleitemObj.product_name}-Product Code ->#{saleitemObj.product_code}-Instance Code ->#{saleitemObj.item_instance_code}Receipt No #{saleObj.receipt_no}" sale_audit = SaleAudit.record_audit_for_edit(saleitemObj.sale_id,current_user.name, action_by,remark,"SALEITEMFOC" ) - saleObj.compute_by_sale_items(saleObj.sale_id, saleObj.sale_items, saleObj.total_discount,order_source) + saleObj.compute_by_sale_items(saleObj.total_discount, nil, order_source) ProductCommission.create_product_commission(@newsaleitem, saleitemObj) end @@ -150,10 +150,10 @@ class Origami::SaleEditController < BaseOrigamiController saleitemObj.save # re-calc tax - saleObj = Sale.find(saleitemObj.sale_id) + # saleObj = Sale.find(saleitemObj.sale_id) - order_id = SaleOrder.find_by_sale_id(saleitemObj.sale_id).order_id - order = Order.find(order_id) + # order_id = SaleOrder.find_by_sale_id(saleitemObj.sale_id).order_id + # order = Order.find(order_id) # order.order_items.each do |o| # if saleitemObj.product_code == o.item_code @@ -163,7 +163,7 @@ class Origami::SaleEditController < BaseOrigamiController # end # end - saleObj.compute_by_sale_items(saleObj.sale_id, saleObj.sale_items, saleObj.total_discount,order_source) + sale.compute_by_sale_items(saleObj.total_discount, nil, order_source) ProductCommission.edit_product_commission(saleitemObj) end @@ -195,8 +195,8 @@ class Origami::SaleEditController < BaseOrigamiController end remark = "Cancle Void Sale Item ID #{saleitemObj.sale_item_id} | Item Name ->#{saleitemObj.product_name}-Product Code ->#{saleitemObj.product_code}-Instance Code ->#{saleitemObj.item_instance_code}|Receipt No #{saleObj.receipt_no}" sale_audit = SaleAudit.record_audit_for_edit(saleitemObj.sale_id,current_user.name, action_by,remark,"ITEMCANCELVOID" ) - - saleObj.compute_by_sale_items(saleObj.sale_id, saleObj.sale_items, saleObj.total_discount, order_source) + + saleObj.compute_by_sale_items(saleObj.total_discount, nil, order_source) ProductCommission.remove_product_commission(saleitemObj) end @@ -214,9 +214,9 @@ class Origami::SaleEditController < BaseOrigamiController item.save ProductCommission.remove_product_commission(item) end - + saleObj.sale_items.reset # re-calc tax - saleObj.compute_by_sale_items(saleObj.sale_id, saleObj.sale_items, saleObj.total_discount,order_source) + saleObj.compute_by_sale_items(saleObj.total_discount,nil, order_source) end def apply_void diff --git a/app/controllers/origami/void_controller.rb b/app/controllers/origami/void_controller.rb index 6af6c275..5352b7c3 100755 --- a/app/controllers/origami/void_controller.rb +++ b/app/controllers/origami/void_controller.rb @@ -10,7 +10,7 @@ class Origami::VoidController < BaseOrigamiController sale = Sale.find_by_sale_id(sale_id) if sale.discount_type == "member_discount" sale.update_attributes(total_discount: 0) - sale.compute_by_sale_items(sale_id, sale.sale_items,0,order_source) + sale.compute_by_sale_items(0, nil, order_source) end # update count for shift sale diff --git a/app/controllers/origami/waste_spoile_controller.rb b/app/controllers/origami/waste_spoile_controller.rb index 2d4c9367..6a68a2b9 100755 --- a/app/controllers/origami/waste_spoile_controller.rb +++ b/app/controllers/origami/waste_spoile_controller.rb @@ -15,7 +15,6 @@ class Origami::WasteSpoileController < BaseOrigamiController sale.sale_status = remark sale.save - # sale.compute_by_sale_items(sale_id, sale.sale_items,0,order_source) # add to sale item with foc # sale_items = SaleItem.where("sale_id='#{ sale_id }' and status is null") diff --git a/app/controllers/transactions/sales_controller.rb b/app/controllers/transactions/sales_controller.rb index e8a2d9e4..83efc401 100755 --- a/app/controllers/transactions/sales_controller.rb +++ b/app/controllers/transactions/sales_controller.rb @@ -6,7 +6,7 @@ class Transactions::SalesController < ApplicationController # GET /transactions/sales # GET /transactions/sales.json def index - + receipt_no = params[:receipt_no] # from = params[:from] # to = params[:to] @@ -19,18 +19,18 @@ class Transactions::SalesController < ApplicationController if receipt_no.nil? && from.nil? && to.nil? if @shift.blank? @sales = Sale.where("NOT sale_status='new'").order("sale_id desc") - else + else @sales = Sale.where("NOT sale_status='new' and shift_sale_id ='#{@shift.id}'").order("sale_id desc") end @sales = Kaminari.paginate_array(@sales).page(params[:page]).per(20) else sale = Sale.search(receipt_no,from,to,@shift) if sale.count > 0 - @sales = sale + @sales = sale @sales = Kaminari.paginate_array(@sales).page(params[:page]).per(20) else @sales = 0 - end + end end @receipt_no = receipt_no @from = from @@ -41,20 +41,20 @@ class Transactions::SalesController < ApplicationController @shift_to = @shift.shift_closed_at.nil? ? '-' : @shift.shift_closed_at.utc.getlocal.strftime("%e %b %I:%M%p") @shift_data = @shift end - + # if receipt_no.nil? && search_date.nil? - # @sales = Sale.where("NOT sale_status = 'void' " ).order("sale_id desc").limit(500) + # @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? + # 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? + # 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 + # 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 = sale # @sales = Kaminari.paginate_array(@sales).page(params[:page]).per(50) # else # @sales = 0 @@ -182,7 +182,7 @@ class Transactions::SalesController < ApplicationController period_type = params[:period_type] period = params[:period] from = params[:from] - to = params[:to] + to = params[:to] day_ref = Time.now.utc.getlocal if from.present? && to.present? @@ -191,8 +191,8 @@ class Transactions::SalesController < ApplicationController f_time = Time.mktime(f_date.year,f_date.month,f_date.day,f_date.hour,f_date.min,f_date.sec) t_time = Time.mktime(t_date.year,t_date.month,t_date.day,t_date.hour,t_date.min,t_date.sec) from = f_time.beginning_of_day.utc.getlocal - to = t_time.end_of_day.utc.getlocal - else + to = t_time.end_of_day.utc.getlocal + else case period.to_i when PERIOD["today"] from = day_ref.beginning_of_day.utc @@ -226,10 +226,10 @@ class Transactions::SalesController < ApplicationController when PERIOD["last_year"] from = (day_ref - 1.year).beginning_of_year.utc to = (day_ref - 1.year).end_of_year.utc - end + end end - return from, to + return from, to end def check_user @@ -248,7 +248,7 @@ class Transactions::SalesController < ApplicationController if sale.discount_type == "member_discount" sale.update_attributes(total_discount: 0) - sale.compute_by_sale_items(sale_id, sale.sale_items,0,order_source) + sale.compute_by_sale_items(0, nil, order_source) end # update count for shift sale @@ -265,7 +265,7 @@ class Transactions::SalesController < ApplicationController shift.save end end - + sale.rounding_adjustment = 0.0 sale.payment_status = 'void' sale.sale_status = 'void' @@ -308,16 +308,16 @@ class Transactions::SalesController < ApplicationController table = nil end - # FOr Sale Audit + # FOr Sale Audit action_by = current_user.name if access_code != "null" && current_user.role == "cashier" action_by = Employee.find_by_emp_id(access_code).name end - + # remark = "Void Sale ID #{sale_id} | Receipt No #{sale.receipt_no} | Receipt No #{sale.receipt_no} | Table ->#{table.name}" sale_audit = SaleAudit.record_audit_for_edit(sale_id,sale.cashier_id, action_by,remark,"SALEVOID" ) - # For Print + # For Print member_info = nil rebate_amount = nil @@ -325,7 +325,7 @@ class Transactions::SalesController < ApplicationController # For Cashier by Zone bookings = Booking.where("sale_id='#{sale_id}'") - if bookings.count > 1 + if bookings.count > 1 # for Multiple Booking if bookings[0].dining_facility_id.to_i>0 table = DiningFacility.find(bookings[0].dining_facility_id) @@ -339,12 +339,12 @@ class Transactions::SalesController < ApplicationController shift = ShiftSale.find(sale.shift_sale_id) cashier_terminal = CashierTerminal.find(shift.cashier_terminal_id) end - + # if ENV["SERVER_MODE"] != "cloud" #no print in cloud server unique_code = "ReceiptBillPdf" customer= Customer.find(sale.customer_id) - + #shop detail shop_details = Shop.find_by_id(1) # get member information @@ -363,31 +363,31 @@ class Transactions::SalesController < ApplicationController discount_price_by_accounts = SaleItem.get_discount_price_by_accounts(sale.sale_items) other_amount = SaleItem.calculate_other_charges(sale.sale_items) #other charges - printer = Printer::ReceiptPrinter.new(print_settings) - filename, sale_receipt_no, printer_name = printer.print_receipt_bill(print_settings, false, nil,cashier_terminal,sale.sale_items,sale,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details, "VOID",current_balance,nil,other_amount,nil,nil,nil) - result = { - :filepath => filename, - :printer_model => print_settings.brand_name, - :printer_url => print_settings.api_settings + printer = Printer::ReceiptPrinter.new(print_settings) + filename, sale_receipt_no, printer_name = printer.print_receipt_bill(print_settings, false, nil,cashier_terminal,sale.sale_items,sale,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_details, "VOID",current_balance,nil,other_amount,nil,nil,nil) + result = { + :filepath => filename, + :printer_model => print_settings.brand_name, + :printer_url => print_settings.api_settings } # Mobile Print render :json => result.to_json # end - + #end print # update complete order items in oqs - SaleOrder.where("sale_id = '#{ sale_id }'").find_each do |sodr| + SaleOrder.where("sale_id = '#{ sale_id }'").find_each do |sodr| AssignedOrderItem.where("order_id = '#{ sodr.order_id }'").find_each do |aoi| aoi.delivery_status = 1 aoi.save end end end - end + end + - private # Use callbacks to share common setup or constraints between actions. def set_transactions_sale diff --git a/app/models/promotion.rb b/app/models/promotion.rb index 0fa2b3e9..6d5a7039 100755 --- a/app/models/promotion.rb +++ b/app/models/promotion.rb @@ -109,7 +109,7 @@ class Promotion < ApplicationRecord item = saleObj.order_items.where(item_instance_code: promo_product).first if !item.nil? - update_existing_item(foc_qty, item, sale_id, "promotion", item[:price], source) + update_existing_item(foc_qty, item, saleObj, "promotion", item[:price], source) end end # AA - 10 # 3 # BB # orderList, #S34345 @@ -128,7 +128,7 @@ class Promotion < ApplicationRecord item = saleObj.order_items.where(item_instance_code: promo_product).first if !item.nil? - update_existing_item(promotion_qty, item, sale_id, "promotion", item[:price],source) + update_existing_item(promotion_qty, item, saleObj, "promotion", item[:price],source) end end @@ -157,8 +157,9 @@ class Promotion < ApplicationRecord sale_item.is_taxable = 1 sale_item.sale = saleObj sale_item.save - - saleObj.compute_by_sale_items(saleObj.id, saleObj.sale_items, saleObj.total_discount,nil,source) + + saleObj.sale_items << sale_item + saleObj.compute_by_sale_items(saleObj.total_discount, nil, source) end end @@ -180,7 +181,7 @@ class Promotion < ApplicationRecord item = saleObj.order_items.where(item_instance_code: promo_product.item_code).first if !item.nil? - update_existing_item(foc_qty, item, sale_id, "promotion nett off", promo_product.net_off,source) + update_existing_item(foc_qty, item, saleObj, "promotion nett off", promo_product.net_off,source) end end diff --git a/app/models/sale.rb b/app/models/sale.rb index ae350e80..d8c73ec3 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -361,8 +361,8 @@ class Sale < ApplicationRecord sale_item.save # Re-calc - sale = Sale.find(self.id) - self.compute_by_sale_items(self.id, sale.sale_items, self.total_discount, nil, order_source) + self.sale_items << sale_item + self.compute_by_sale_items(self.total_discount, nil, order_source) end def create_saleitem_indutycharges(chargeObj, current_checkin_induties_count, induties_pay_amount, dining_name, dining_time, order_source = nil, basic_pay_amount) sale_item = SaleItem.new @@ -380,8 +380,8 @@ class Sale < ApplicationRecord sale_item.price = induties_pay_amount sale_item.save # Re-calc - sale = Sale.find(self.id) - self.compute_by_sale_items(self.id, sale.sale_items, self.total_discount, nil, order_source) + self.sale_items << sale_item + self.compute_by_sale_items(self.total_discount, nil, order_source) end def update_item (item) #save sale_audit @@ -403,14 +403,12 @@ class Sale < ApplicationRecord #compute - invoice total def compute(order_source = nil, tax_type = nil) - sales_items = self.sale_items - #Computation Fields subtotal_price = 0 total_taxable = 0 rounding_adjustment = 0 - sales_items.each do |item| + self.sale_items.each do |item| #compute each item and added to total subtotal_price = subtotal_price + item.price @@ -429,60 +427,54 @@ class Sale < ApplicationRecord # self.grand_total_round #compute rounding adjustment # adjust_rounding - self.save! - end #compute - invoice total - def compute_by_sale_items(sale_id, sale_itemss, total_discount,discount_type=nil,order_source=nil,tax_type=nil,type=nil) + def compute_by_sale_items(total_discount, discount_type=nil, order_source=nil, tax_type=nil, type=nil) shop = Shop.first - sale = Sale.find(sale_id) - sales_items = sale_itemss #Computation Fields subtotal_price = 0 total_taxable = 0 rounding_adjustment = 0 - sales_items.each do |item| + self.sale_items.each do |item| #compute each item and added to total - subtotal_price = subtotal_price + item.price + subtotal_price = subtotal_price + item.price # check for item is taxable and calculate if item.is_taxable total_taxable = total_taxable + item.taxable_price end end - compute_tax(sale, total_taxable, total_discount, order_source, tax_type) - sale.total_amount = subtotal_price - sale.total_discount = total_discount + + compute_tax(total_taxable, total_discount, order_source, tax_type) + self.total_amount = subtotal_price + self.total_discount = total_discount if type =="foc" - sale.grand_total = 0 + self.grand_total = 0 else - sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax + self.grand_total = (self.total_amount - self.total_discount) + self.total_tax # sale.grand_total_round end if discount_type == "member_discount" - sale.discount_type = discount_type + self.discount_type = discount_type end #compute rounding adjustment # adjust_rounding - - sale.save! + self.save! end # No Use too many wrong def compute_without_void(order_source = nil) - sales_items = self.sale_items - #Computation Fields subtotal_price = 0 total_taxable = 0 rounding_adjustment = 0 - sales_items.each do |item| + self.sale_items.each do |item| if item.status != 'void' && item.status != 'foc' #compute each item and added to total subtotal_price = subtotal_price + item.price @@ -506,7 +498,7 @@ class Sale < ApplicationRecord end # Tax Re-Calculte - def compute_tax(sale, total_taxable, total_discount = 0, order_source = nil, tax_type=nil) + def compute_tax(total_taxable, total_discount = 0, order_source = nil, tax_type=nil) shop = Shop.first #if tax is not apply create new record @@ -529,9 +521,9 @@ class Sale < ApplicationRecord tax_profiles = unique_tax_profiles(order_source, self.customer_id) # #Creat new tax records - if sale.payment_status != 'foc' + if self.payment_status != 'foc' tax_profiles.each do |tax| - sale_tax = SaleTax.new(:sale => sale) + sale_tax = SaleTax.new(:sale => self) sale_tax.tax_name = tax.name sale_tax.tax_rate = tax.rate @@ -555,8 +547,8 @@ class Sale < ApplicationRecord sale_tax.save end end - sale.tax_type = tax_incl_exec - sale.total_tax = total_tax_amount + self.tax_type = tax_incl_exec + self.total_tax = total_tax_amount end # Tax Calculate @@ -2727,7 +2719,7 @@ def self.get_hourly_item_query(type) "i.status as status_type,i.remark as remark,"+ "i.unit_price,i.price as price,i.product_name as product_name, " + "i.menu_category_name,i.menu_category_code as menu_category_id, " + - + "concat(hour(CONVERT_TZ(receipt_date,'+00:00', '+06:30')), ':00 - ', hour(CONVERT_TZ(receipt_date,'+00:00', '+06:30')) + 1, ':00') as date_format," + "hour(CONVERT_TZ(receipt_date,'+00:00', '+06:30')) as hour") diff --git a/app/models/sale_item.rb b/app/models/sale_item.rb index 0e073f13..b174bd7c 100755 --- a/app/models/sale_item.rb +++ b/app/models/sale_item.rb @@ -89,7 +89,7 @@ class SaleItem < ApplicationRecord # sale_item.save if type != "foc" sale = Sale.find(sale_id) - sale.compute_by_sale_items(sale.id, sale.sale_items, sale.total_discount) + sale.compute_by_sale_items(sale.total_discount) end end diff --git a/app/models/sale_payment.rb b/app/models/sale_payment.rb index 2e1700f8..5a1fdb72 100755 --- a/app/models/sale_payment.rb +++ b/app/models/sale_payment.rb @@ -419,7 +419,7 @@ class SalePayment < ApplicationRecord SaleItem.update_existing_item(item.qty, item, self.sale.sale_id, "foc", item.unit_price, item.price) end sale = Sale.find(self.sale.sale_id) - sale.compute_by_sale_items(sale.id, sale.sale_items, sale.total_discount,'','','',"foc") + sale.compute_by_sale_items(sale.total_discount,'','','',"foc") self.payment_method = "foc" self.payment_amount = self.received_amount From 216dfe4f2f8e1ebe36806898936b4812d7788db6 Mon Sep 17 00:00:00 2001 From: NyanLinHtut Date: Wed, 13 Nov 2019 13:34:11 +0630 Subject: [PATCH 22/24] add loader service api --- app/controllers/api/api_controller.rb | 23 +-- .../api/authenticate_controller.rb | 2 +- .../loader_service/load_data_controller.rb | 90 ++++++++++++ app/models/sale.rb | 135 +++++++++++++++++- app/models/sale_item.rb | 53 +++++++ config/routes.rb | 8 ++ 6 files changed, 298 insertions(+), 13 deletions(-) create mode 100644 app/controllers/api/loader_service/load_data_controller.rb diff --git a/app/controllers/api/api_controller.rb b/app/controllers/api/api_controller.rb index a5112ffe..0e8ea909 100755 --- a/app/controllers/api/api_controller.rb +++ b/app/controllers/api/api_controller.rb @@ -1,5 +1,6 @@ class Api::ApiController < ActionController::API include TokenVerification + include ActionController::MimeResponds # before_action :lookup_domain helper_method :current_token, :current_login_employee, :get_cashier @@ -23,25 +24,25 @@ class Api::ApiController < ActionController::API @employee = Employee.find_by_token_session(current_token) end - # def lookup_domain - # if request.subdomain.present? && request.subdomain != "www" - # from = request.subdomain.downcase + "." + request.domain.downcase + # def lookup_domain + # if request.subdomain.present? && request.subdomain != "www" + # from = request.subdomain.downcase + "." + request.domain.downcase # @license = cache_license(ENV["SX_PROVISION_URL"], from) # request.subdomain.downcase # if (!@license.nil?) - # logger.info "Location - " + @license.dbhost - # ActiveRecord::Base.establish_connection(website_connection(@license)) - # # authenticate_session_token + # logger.info "Location - " + @license.dbhost + # ActiveRecord::Base.establish_connection(website_connection(@license)) + # # authenticate_session_token # # logger.info "Connecting to - " + @license.subdomain + " - "+ @license.dbhost + "@" + @license.dbschema # else # # reconnect_default_db # logger.info 'License is nil' # # redirect_to root_url(:host => request.domain) + "store_error" # render :json => [{ status: false, message: 'Invalid Access!'}] - # end - # end + # end + # end # end - # def website_connection(license) + # def website_connection(license) # default_connection.dup.update(:host => license.dbhost, :database => license.dbschema.to_s.downcase, # :username => license.dbusername, :password => license.dbpassword) # end @@ -55,8 +56,8 @@ class Api::ApiController < ActionController::API # @default_config ||= ActiveRecord::Base.connection.instance_variable_get("@config").dup # end - # def cache_license(url, lookup) - # @license = License.new(url, lookup) + # def cache_license(url, lookup) + # @license = License.new(url, lookup) # if (@license.detail_with_local_cache(lookup) == true) # return @license diff --git a/app/controllers/api/authenticate_controller.rb b/app/controllers/api/authenticate_controller.rb index 8fb10040..aad8607c 100755 --- a/app/controllers/api/authenticate_controller.rb +++ b/app/controllers/api/authenticate_controller.rb @@ -40,7 +40,7 @@ class Api::AuthenticateController < Api::ApiController @status = false @error_message = "This employee is not active!" # render json: JSON.generate({:status => false, :error_message => "This employee is not active!"}) - end + end else @status = false @error_message = "Bad Emp_ID or Password!" diff --git a/app/controllers/api/loader_service/load_data_controller.rb b/app/controllers/api/loader_service/load_data_controller.rb new file mode 100644 index 00000000..58b89c3d --- /dev/null +++ b/app/controllers/api/loader_service/load_data_controller.rb @@ -0,0 +1,90 @@ +require "net/http" +class Api::LoaderService::LoadDataController < Api::ApiController + skip_before_action :authenticate + + def get_sale_data_rage + load_time_start = params[:load_time] + load_time_end = params[:load_time_end] + unless load_time_start.nil? || load_time_end.nil? + @sale_data = Sale.get_load_sale_range(load_time_start.to_datetime,load_time_end.to_datetime) + if !@sale_data.empty? + @out = {general_status: true, data: @sale_data} + else + @out = {general_status: false, data: "Data is empty."} + end + else + @out = {general_status: false, data: "load_time is missing."} + end + render :json => @out + end + + # SFTP for BreadTalk Start + + # Detail Sale + def get_detail_sale_data + data = params['data'] + transaction_date = data[:transaction_date].to_s + detail_sale_data = SaleItem.get_detail_sale_data(transaction_date) + json = detail_sale_data.to_json + trans_count = JSON.parse(json).count + unless detail_sale_data.empty? + out = { :status => "success", :transaction_count => trans_count, :data => detail_sale_data } + else + out = { :status => "fail", :data => "Data is empty" } + end + respond_to do |format| + format.json {render json: out } + end + end + + # Tender sale + def get_tender_sale_data + data = params['data'] + transaction_date = data['transaction_date'].to_s + tender_sale_data = Sale.get_tender_sale_data(transaction_date) + json = tender_sale_data.to_json + trans_count = JSON.parse(json).count + unless tender_sale_data.empty? + out = { :status => "success", :transaction_count => trans_count, :data => tender_sale_data } + else + out = { :status => "fail", :data => "Data is empty" } + end + respond_to do |format| + format.json { render json: out } + end + end + + # Daily_Sale summary + def get_daily_sale_data + data = params['data'] + transaction_date = data['transaction_date'].to_s + daily_sale_data = Sale.get_daily_sale_data(transaction_date) + unless daily_sale_data.empty? + out = { :status => "success", :data => daily_sale_data} + else + out = { :status => "fail", :data => "Data is empty"} + end + respond_to do |format| + format.json { render json: out } + end + end + + # Check Sale Data + def get_check_sale_data + data = params['data'] + transaction_date = data['transaction_date'].to_s + check_sale_data = Sale.get_check_sale_data(transaction_date) + json = check_sale_data.to_json + trans_count = JSON.parse(json).count + unless check_sale_data.empty? + out = { :status => "success", :transaction_count => trans_count, :data => check_sale_data} + else + out = { :status => "fail", :data => "Data is empty"} + end + respond_to do |format| + format.json { render json: out } + end + end + + # SFTP for BreadTalk End +end diff --git a/app/models/sale.rb b/app/models/sale.rb index 8be79db3..a50aff81 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -2861,7 +2861,7 @@ def self.get_hourly_item_query(type) "i.status as status_type,i.remark as remark,"+ "i.unit_price,i.price as price,i.product_name as product_name, " + "i.menu_category_name,i.menu_category_code as menu_category_id, " + - + "concat(hour(CONVERT_TZ(receipt_date,'+00:00', '+06:30')), ':00 - ', hour(CONVERT_TZ(receipt_date,'+00:00', '+06:30')) + 1, ':00') as date_format," + "hour(CONVERT_TZ(receipt_date,'+00:00', '+06:30')) as hour") @@ -2885,6 +2885,139 @@ def grand_total_round self.grand_total =self.grand_total.round(print_settings.precision.to_i) end end + +# Loader Service SFTP Start +def self.get_load_sale_range(load_time_start,load_time_end) + query = Sale.select("sales.sale_id, + CONVERT(receipt_date, TIME) as transaction_time, + CONVERT(receipt_date, DATE) as transaction_date, + receipt_no as transaction_no, + SUM(i.qty) as item_no, + 'MMK' as currency_salesamount, + IFNULL((total_amount-total_discount)-((total_amount-total_discount)/21),0) as total_salesamount, + IFNULL(amount_changed,0) as change_amt, + IFNULL(total_amount-total_discount,0) as grand_salesamount, + '5' as tax_percent, + 'MMK' as currency_payment, + IFNULL(amount_received,0) as paymentamount, + sp.payment_amount as payment_method, + CASE + WHEN sales.sale_status='completed' THEN 'Sales' + WHEN sales.sale_status='void' THEN 'Void' + END as sale_type, + sales.updated_at as load_time") + .joins("JOIN sale_items i ON i.sale_id = sales.sale_id" + + " JOIN sale_payments sp ON sp.sale_id = sales.sale_id") + .where("(sale_status=? OR sale_status=?) AND sp.payment_method !=? AND sales.updated_at between ? AND ?", 'completed', 'void', 'foc', load_time_start, load_time_end) + .group("receipt_no") + .order("receipt_date") +end + +def self.get_tender_sale_data(transaction_date) + query = Sale.select("sales.receipt_no as check_num, + DATE_FORMAT(sales.receipt_date, '%d %b %Y') as business_date, + sales.receipt_date as transaction_date, + '36017' as item_id, + 'Cash Received' as item_name, + '1' as qty, + 'Tender' as transaction_type, + '0' as sales, + CASE WHEN sales.sale_status = 'void' THEN '1' ELSE '0' END as is_void + ") + .where("DATE(sales.receipt_date)=? AND sales.sale_status != ?", transaction_date, :void) + .order("sales.receipt_no") +end + +def self.get_daily_sale_data(transaction_date) + query = Sale.connection.select_all("SELECT s.receipt_date as business_date, + (SUM(s.grand_total)+SUM(s.total_discount)) as gross_sales, + SUM(s.total_discount) as discount, + SUM(s.grand_total) as sales, + SUM(s.grand_total)/21 as tax, + 0 as service_charge, + SUM(s.grand_total) - (SUM(s.grand_total)/21) as net_sales, + SUM(s.credit_amount) as credit_amount, + SUM(s.voucher_sales) as voucher_sales, + 0 as staff_meal_amt, + 0 as round_amt, + 0 as raw_wastage_amt, + 0 as semi_wastage_amt, + CASE WHEN s.sale_status='waste' THEN SUM(s.total_amount) ELSE 0 END as wastage_amt, + CASE WHEN s.sale_status='spoile' THEN SUM(s.total_amount) ELSE 0 END as spoilage_amt, + 0 as sampling_amt, + 0 as other_amt, + SUM(s.qty) as total_qty, + (SELECT COUNT(sales.sale_id) FROM sales WHERE DATE(sales.receipt_date)='#{transaction_date}') as total_transaction, + (SELECT COUNT(sales.sale_id) FROM sales WHERE (sales.sale_status='completed' OR sales.sale_status='void') AND DATE(sales.receipt_date)='#{transaction_date}') as valid_transaction_count, + (SELECT COUNT(sales.sale_id) FROM sales WHERE (sales.sale_status IN('new','pending',null)) AND DATE(sales.receipt_date)='#{transaction_date}') as invalid_transaction_count, + 0 as overing_transaction_count, + 0 as cancle_transaction_count, + 0 as no_of_pax, + 0 as no_of_adult, + 0 as no_of_child + FROM ( + SELECT s.*, SUM(qty) as qty + FROM ( + SELECT sales.*, + SUM(CASE WHEN sp.payment_method IN('mpu','master','visa','jcb','unionpay','alipay') THEN sp.payment_amount ELSE 0 END) as credit_amount, + SUM(case when (sp.payment_method='giftvoucher') then sp.payment_amount else 0 end) as voucher_sales + FROM sales + LEFT JOIN sale_payments sp ON sp.sale_id = sales.sale_id + WHERE DATE(sales.receipt_date) = '#{transaction_date}' + AND sales.sale_status!='void' + AND sales.sale_status='completed' + GROUP BY sales.sale_id) AS s + LEFT JOIN sale_items si ON si.sale_id = s.sale_id + GROUP BY s.sale_id) as s + GROUP BY DATE(s.receipt_date)").to_hash + end + +def self.get_check_sale_data(transaction_date) + sale_receivables_subquery = "SELECT sale_payments.sale_id, + CASE WHEN sale_payments.payment_method = 'mpu' OR sale_payments.payment_method = 'visa' OR sale_payments.payment_method = 'master' OR sale_payments.payment_method = 'jcb' OR sale_payments.payment_method = 'paypar' OR sale_payments.payment_method = 'unionpay' OR sale_payments.payment_method = 'alipay' OR sale_payments.payment_method = 'paymal' OR sale_payments.payment_method = 'dinga' OR sale_payments.payment_method = 'JunctionPay' THEN SUM(sale_payments.payment_amount) ELSE SUM(0) END as credit_card_sales, + CASE WHEN sale_payments.payment_method = 'giftvoucher' THEN SUM(sale_payments.payment_amount) ELSE SUM(0) END as voucher_sales + FROM sale_payments + GROUP BY sale_payments.sale_id, sale_payments.payment_method" + + query = Sale.select(" + sales.receipt_no as check_num, + sales.receipt_date as business_date, + sales.requested_at as check_open_time, + sales.updated_at as check_close_time, + (sales.grand_total + sales.total_discount) as gross_sales, + sales.total_discount as discount_amt, + sales.grand_total as sales, + (sales.grand_total/21) as tax_amt, + 0 as service_charges, + (sales.grand_total - (sales.grand_total/21)) as net_sales, + receivables.credit_card_sales as credit_card_sales, + receivables.voucher_sales as voucher_sales, + 0 as staff_meal_amt, + sales.rounding_adjustment as rounding_amt, + CASE WHEN sales.sale_status='waste' THEN sales.total_amount ELSE 0 END as wastage_amt, + CASE WHEN sales.sale_status='spoile' THEN sales.total_amount ELSE 0 END as spoilage_amt, + 0 as sampling_amt, + SUM(i.qty) as qty, + 0 as no_of_pax, + 0 as no_of_adult, + 0 as no_of_child, + shift_sales.cashier_terminal_id as pos_id, + sales.cashier_id as employee_code, + employees.name as employee_name, + CASE WHEN sales.sale_status='completed' THEN 1 ELSE 0 END is_valid, + 0 as overing, + 0 as cancle, + CONCAT( employees.name, ' Cash&Go receipt generated and completed.') as remarks") + .joins("LEFT JOIN shift_sales ON shift_sales.id = sales.shift_sale_id") + .joins("LEFT JOIN sale_items i ON i.sale_id = sales.sale_id") + .joins("LEFT JOIN (" + sale_receivables_subquery + ") as receivables ON receivables.sale_id = sales.sale_id") + .joins("LEFT JOIN employees ON employees.id = sales.cashier_id") + .where("DATE(sales.receipt_date) = ? AND sales.sale_status != ?", transaction_date, :void) + .group("sales.receipt_no,sales.sale_status") +end + +# Loader Service SFTP End + private def generate_custom_id diff --git a/app/models/sale_item.rb b/app/models/sale_item.rb index d17edc6e..fee930f4 100755 --- a/app/models/sale_item.rb +++ b/app/models/sale_item.rb @@ -275,4 +275,57 @@ class SaleItem < ApplicationRecord end end + # Loader Service SFTP Start + # Detail Sale Data + def self.get_detail_sale_data(transaction_date) + query = SaleItem.select(" + sale_items.sale_item_id as id, + sale_items.sale_id as parent_id, + s.receipt_no as check_num, + s.receipt_date as business_date, + s.receipt_date as transaction_date, + '' as item_seq, + sale_items.menu_category_code as category_code, + sale_items.menu_category_name as category_name, + '' as sub_category_code, + '' as sub_category_name, + '' as report_group_code, + '' as report_group_name, + sale_items.product_code as item_id, + sale_items.product_name as item_name, + sale_items.qty as qty, + CASE + WHEN s.sale_status = 'completed' OR s.sale_status = 'void' THEN 'Sales' + WHEN s.sale_status = 'waste' THEN 'Waste' + WHEN s.sale_status = 'spoile' THEN 'Spoil' + END as transaction_type, + sale_items.price as gross_sales, + '' as discount_code, + CASE + WHEN i.unit_price IS NOT NULL THEN i.unit_price ELSE 0 + END as discount_amt, + (sale_items.price - (CASE WHEN i.unit_price IS NOT NULL THEN i.unit_price ELSE 0 END)) as sales, + ((sale_items.price - (CASE WHEN i.unit_price IS NOT NULL THEN i.unit_price ELSE 0 END))/21) as tax_amt, + '' as service_charges, + ((sale_items.price - (CASE WHEN i.unit_price IS NOT NULL THEN i.unit_price ELSE 0 END)) - ((sale_items.price - (CASE WHEN i.unit_price IS NOT NULL THEN i.unit_price ELSE 0 END))/21)) as net_sales, + '0' as is_set_item, + '0' as is_staff_meal, + '0' as is_raw_wastage, + '0' as is_semi_wastage, + CASE WHEN s.sale_status = 'waste' THEN 1 ELSE 0 END as is_wastage, + CASE WHEN s.sale_status = 'spoile' THEN 1 ELSE 0 END as is_spoilage, + '0' as is_sampling, + '1' as tax_able, + CASE + WHEN s.sale_status = 'void' THEN 1 ELSE 0 + END as is_void + ") + .joins("LEFT JOIN sales s ON s.sale_id = sale_items.sale_id") + .joins("LEFT JOIN sale_items i ON sale_items.sale_id = i.sale_id AND sale_items.item_instance_code = i.item_instance_code AND i.status = 'Discount' AND sale_items.qty = abs(i.qty)") + .where("DATE(s.receipt_date) = ? AND s.sale_status != 'void' AND (sale_items.status NOT IN('Discount', 'void','foc') OR sale_items.status IS NULL)", transaction_date) + .order("s.receipt_no") + end + + # Loader Service SFTP End + end diff --git a/config/routes.rb b/config/routes.rb index bbc7a816..b3c5ff6e 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -117,6 +117,14 @@ scope "(:locale)", locale: /en|mm/ do #API for sync cloud post 'sync_data' => 'sync#sync_data' + + namespace :loader_service do + post "get_sale_data" => "load_data#get_sale_data_rage" + post "get_detail_sale_data" => "load_data#get_detail_sale_data" + post "get_tender_sale_data" => "load_data#get_tender_sale_data" + post "get_daily_sale_data" => "load_data#get_daily_sale_data" + post "get_check_sale_data" => "load_data#get_check_sale_data" + end end #--------- Cashier ------------# From 36b61a9d515944c841a1aa54605c542a0c47d707 Mon Sep 17 00:00:00 2001 From: Thein Lin Kyaw Date: Wed, 13 Nov 2019 15:43:56 +0630 Subject: [PATCH 23/24] optmize daily sales report --- app/models/sale.rb | 124 ++++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 75 deletions(-) diff --git a/app/models/sale.rb b/app/models/sale.rb index d8c73ec3..cfc573b2 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -751,84 +751,58 @@ class Sale < ApplicationRecord end def self.daily_sales_list(from,to) - sub_query = "SELECT (CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN - (SUM(sale_payments.payment_amount) + SUM(sale_payments.outstanding_amount)) ELSE 0 END) - FROM sale_payments - INNER JOIN sale_audits sa ON SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id - INNER JOIN sales s ON s.sale_id=sa.sale_id - WHERE s.sale_status='completed' - AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') = DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d')" - payments_total = Sale.select("CAST((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, - SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount, - SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, - SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, - SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, - SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, - SUM(case when (sale_payments.payment_method='paypar') then sale_payments.payment_amount else 0 end) as paypar_amount, - SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, - SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, - SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, - SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, - SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, - SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, - (CASE WHEN (SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end)) > 0 THEN (SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end) - (#{sub_query})) ELSE 0 END) as credit_amount, - SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, - SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") - .joins(" join sale_payments on sale_payments.sale_id = sales.sale_id") - .where("sale_status = ? AND sales.receipt_date between ? and ? ", 'completed', from, to) - .group("DATE_FORMAT((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')),'%Y-%m-%d')") + sales = select(" + sales.*, + SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount, + SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, + SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, + SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, + SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, + SUM(case when (sale_payments.payment_method='paypar') then sale_payments.payment_amount else 0 end) as paypar_amount, + SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, + SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, + SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, + SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, + SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, + SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, + CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount else 0 end) < sales.grand_total + THEN SUM(case when sale_payments.payment_method = 'creditnote' then sale_payments.payment_amount else 0 end) ELSE 0 END as credit_amount, + SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, + SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") + .joins("LEFT JOIN sale_payments on sales.sale_status != 'void' AND sale_payments.sale_id = sales.sale_id AND DATE(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30')) = DATE(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'))") + .where("(sale_status = ? OR sale_status = ?) AND sales.receipt_date between ? AND ? ", 'completed', 'void', from, to) + .group("sale_id").to_sql - daily_total = Array.new + daily_total = connection.select_all("SELECT + IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as grand_total, + IFNULL(SUM(case when (sale_status='completed') then old_grand_total else 0 end),0) as old_grand_total, + IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0) as total_discount, + IFNULL(SUM(case when (sale_status='completed') then amount_changed else 0 end),0) as total_change_amount, + IFNULL(SUM(case when (sale_status='void') then grand_total else 0 end),0) as void_amount, + IFNULL(SUM(case when (sale_status='completed') then rounding_adjustment else 0 end),0) as rounding_adj, + CAST((CONVERT_TZ(receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, + SUM(kbzpay_amount) as kbzpay_amount, + SUM(mpu_amount) as mpu_amount, + SUM(master_amount) as master_amount, + SUM(visa_amount) as visa_amount, + SUM(jcb_amount) as jcb_amount, + SUM(paypar_amount) as paypar_amount, + SUM(unionpay_amount) as unionpay_amount, + SUM(alipay_amount) as alipay_amount, + SUM(paymal_amount) as paymal_amount, + SUM(dinga_amount) as dinga_amount, + SUM(junctionpay_amount) as junctionpay_amount, + SUM(cash_amount) as cash_amount, + SUM(credit_amount) as credit_amount, + SUM(giftvoucher_amount) as giftvoucher_amount, + SUM(foc_amount) as foc_amount + FROM ( + #{sales} + ) as s + GROUP BY DATE(CONVERT_TZ(receipt_date,'+00:00','+06:30'))").to_hash.map(&:symbolize_keys) - payments_total.each do |pay| - sale_date = pay.sale_date - diff_time = payments_total.first.sale_date.beginning_of_day.utc - from - diff = diff_time % 86400 - from_date = sale_date.beginning_of_day.utc - diff - to_date = sale_date.end_of_day.utc - diff - - total_sale = Sale.select("IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as grand_total, - IFNULL(SUM(case when (sale_status='completed') then old_grand_total else 0 end),0) as old_grand_total, - IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0) as total_discount, - IFNULL(SUM(case when (sale_status='completed') then amount_changed else 0 end),0) as total_change_amount, - IFNULL(SUM(case when (sale_status='void') then grand_total else 0 end),0) as void_amount, - IFNULL(SUM(case when (sale_status='completed') then rounding_adjustment else 0 end),0) as rounding_adj") - .where("(sale_status = ? OR sale_status = ?) AND receipt_date between ? and ? AND total_amount != 0", 'completed', 'void', from_date, to_date) - - total_sale.each do |sale| - grand_total = sale.grand_total - old_grand_total = sale.old_grand_total - total_discount = sale.total_discount - void_amount = sale.void_amount - total_change_amount = sale.total_change_amount - total = {:sale_date => pay.sale_date, - :mpu_amount => pay.mpu_amount, - :master_amount => pay.master_amount, - :visa_amount => pay.visa_amount, - :jcb_amount => pay.jcb_amount, - :paypar_amount => pay.paypar_amount, - :unionpay_amount => pay.unionpay_amount, - :alipay_amount => pay.alipay_amount, - :kbzpay_amount => pay.kbzpay_amount, - :paymal_amount => pay.paymal_amount, - :dinga_amount => pay.dinga_amount, - :junctionpay_amount => pay.junctionpay_amount, - :cash_amount => pay.cash_amount, - :credit_amount => pay.credit_amount, - :foc_amount => pay.foc_amount, - :giftvoucher_amount => pay.giftvoucher_amount, - :total_discount => total_discount, - :total_change_amount => total_change_amount, - :grand_total => grand_total, - :old_grand_total => old_grand_total, - :void_amount => void_amount, - :rounding_adj => sale.rounding_adj} - daily_total.push(total) - end - - end - return daily_total + return daily_total end def self.get_by_range_by_saleitems(from,to,status,report_type) From dd6e8142b47fc900c8ba1d196396f95f555c3bab Mon Sep 17 00:00:00 2001 From: Thein Lin Kyaw Date: Thu, 14 Nov 2019 18:25:48 +0630 Subject: [PATCH 24/24] optimize query for credit payment report --- app/models/sale.rb | 107 ++++++++---------- .../reports/credit_payment/index.html.erb | 68 +++++------ .../reports/credit_payment/index.xls.erb | 12 +- app/views/reports/dailysale/index.html.erb | 5 +- app/views/reports/dailysale/index.xls.erb | 54 ++++----- 5 files changed, 118 insertions(+), 128 deletions(-) diff --git a/app/models/sale.rb b/app/models/sale.rb index af80b292..98457d0e 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -751,7 +751,6 @@ class Sale < ApplicationRecord end def self.daily_sales_list(from,to) - sales = select(" sales.*, SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount, @@ -766,8 +765,9 @@ def self.daily_sales_list(from,to) SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, - CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount else 0 end) < sales.grand_total - THEN SUM(case when sale_payments.payment_method = 'creditnote' then sale_payments.payment_amount else 0 end) ELSE 0 END as credit_amount, + CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount end) < sales.grand_total + THEN sales.grand_total - SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount end) + ELSE 0 END as credit_amount, SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") .joins("LEFT JOIN sale_payments on sales.sale_status != 'void' AND sale_payments.sale_id = sales.sale_id AND DATE(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30')) = DATE(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'))") @@ -1104,73 +1104,64 @@ def self.get_shift_sales_by_receipt_no_detail(shift_sale_range,shift,from,to,pay end def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,order_source) - sub_query = "SELECT (CASE WHEN SUM(payment_amount) > 0 - THEN DATE_FORMAT(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30'),'%d %b %y %h:%i%p') ELSE '-' END) - FROM `sale_payments` - INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id - WHERE sale_audits.sale_id = s.sale_id" + order_sources = Order.select("sale_orders.sale_id, orders.source") + .joins(:sale_orders).to_sql - sub_query1 = "SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) - - (SUM(payment_amount) - (SELECT SUM(payment_amount) FROM sale_payments WHERE payment_method='creditnote' AND sale_id=s.sale_id)) ELSE 0 END) - FROM `sale_payments` - INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id - WHERE sale_audits.sale_id = s.sale_id" + credit_payments = SalePayment.select(" + sales.sale_id, + DATE_FORMAT(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30'),'%d %b %y %h:%i%p') as credit_payment_receipt_date, + sale_payments.payment_amount as credit_payment, + employees.name as credit_payment_cashier_name, + CONCAT(DATE_FORMAT(CONVERT_TZ(shift_started_at,'+00:00','+06:30'),'%d %b %y %h:%i%p'),' - ',DATE_FORMAT(CONVERT_TZ(shift_closed_at,'+00:00','+06:30'),'%d %b %y %h:%i%p')) as credit_payment_shift_name") + .joins("JOIN sales ON sales.sale_id = sale_payments.sale_id") + .joins("JOIN sale_audits ON sale_audits.sale_id = sales.sale_id AND SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id") + .joins("JOIN shift_sales ON shift_sales.id = sales.shift_sale_id") + .joins("JOIN employees ON employees.id = shift_sales.employee_id").to_sql - sub_query2 = "SELECT (CASE WHEN shift_closed_at IS NOT NULL AND credit_payment > 0 - THEN CONCAT(DATE_FORMAT(CONVERT_TZ(shift_started_at,'+00:00','+06:30'),'%d %b %y %h:%i%p'),' - ',DATE_FORMAT(CONVERT_TZ(shift_closed_at,'+00:00','+06:30'),'%d %b %y %h:%i%p')) - ELSE '-' END) - FROM shift_sales - WHERE shift_sales.id = s.shift_sale_id" + credits = SalePayment.select(" + sale_payments.sale_payment_id, + sale_payments.payment_method, + sale_payments.payment_amount, + sale_payments.payment_status, + sales.sale_id, + sales.receipt_no, + sales.receipt_date as sale_date, + order_sources.source as order_source, + sales.cashier_name, + customers.name as customer_name, + IFNULL(credit_payments.credit_payment_receipt_date, '-') as credit_payment_receipt_date, + IFNULL(credit_payments.credit_payment, 0) as credit_payment, + IFNULL(credit_payments.credit_payment_cashier_name, '-') as credit_payment_cashier_name, + IFNULL(credit_payments.credit_payment_shift_name, '-') as credit_payment_shift_name") + .joins("JOIN sales ON sales.sale_id = sale_payments.sale_id") + .joins("JOIN shift_sales ON shift_sales.id = sales.shift_sale_id") + .joins("JOIN customers ON customers.customer_id = sales.customer_id") + .joins("JOIN (#{order_sources}) order_sources ON order_sources.sale_id = sales.sale_id") + .joins("LEFT JOIN (#{credit_payments}) credit_payments ON credit_payments.sale_id = sales.sale_id") + .where("sale_payments.payment_method= ? AND sales.sale_status = ?", 'creditnote', 'completed') - sub_query3 = "SELECT (CASE WHEN shift_closed_at IS NOT NULL OR shift_closed_at IS NULL AND credit_payment > 0 - THEN employees.name ELSE '-' END) - FROM shift_sales - INNER JOIN employees ON employees.id=shift_sales.employee_id - WHERE shift_sales.id = s.shift_sale_id" - - filter_check = "" - if filter == 'paid' - filter_check = " AND (SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) ELSE 0 END) - FROM `sale_payments` - INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id - WHERE sale_audits.sale_id = s.sale_id) > 0" - elsif filter == 'unpaid' - filter_check = " AND (SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) ELSE 0 END) - FROM `sale_payments` - INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id - WHERE sale_audits.sale_id = s.sale_id) = 0" - end - order_source_query = "(select orders.source FROM orders JOIN sale_orders so ON so.order_id=orders.order_id WHERE so.sale_id=s.sale_id GROUP BY so.sale_id)" - - if order_source.blank? - source = "" - else + if order_source.present? if order_source == "cashier" - source = "and #{order_source_query}='cashier' or #{order_source_query}='emenu'" + credits = credits.where("order_sources.source IN (?)", ['cashier', 'emenu']) else - source = "and #{order_source_query}='#{order_source}'" + credits = credits.where("order_sources.source = ?", order_source) end end - query = SalePayment.select("s.receipt_no, sale_payments.*, - SUM(sale_payments.payment_amount) as payment_amount, - s.receipt_date as sale_date, - #{order_source_query} as order_source, - s.cashier_name as cashier_name, - (#{sub_query}) as credit_payment_receipt_date, - (#{sub_query1}) as credit_payment, - (#{sub_query3}) as credit_payment_cashier_name, - (#{sub_query2}) as credit_payment_shift_name") - .joins("INNER JOIN sales s ON s.sale_id = sale_payments.sale_id") - .joins("INNER JOIN shift_sales ss ON ss.id = s.shift_sale_id") + + if filter == 'paid' + credits = credits.where("credit_payment IS NOT NULL") + elsif filter == 'unpaid' + credits = credits.where("credit_payment IS NULL") + end if shift.present? - query = query.where("sale_payments.payment_method= 'creditnote' and s.sale_status = 'completed' #{filter_check} and s.shift_sale_id in (?) #{source}",shift.to_a) + credits = credits.where("sales.shift_sale_id in (?)",shift.to_a) elsif shift_sale_range.present? - query = query.where("sale_payments.payment_method='creditnote' and s.sale_status = 'completed' #{filter_check} and s.shift_sale_id in (?) #{source}",shift_sale_range.to_a) + credits = credits.where("sales.shift_sale_id in (?)",shift_sale_range.to_a) else - query = query.where("sale_payments.payment_method='creditnote' and s.sale_status = 'completed' #{filter_check} and s.receipt_date between ? and ? #{source}",from,to) + credits = credits.where("sales.receipt_date between ? and ?",from,to) end - query = query.group("s.sale_id") + credits = credits.group("sales.sale_id") end def self.get_void_sale(shift,from,to) diff --git a/app/views/reports/credit_payment/index.html.erb b/app/views/reports/credit_payment/index.html.erb index 53a101d4..d5621850 100755 --- a/app/views/reports/credit_payment/index.html.erb +++ b/app/views/reports/credit_payment/index.html.erb @@ -17,7 +17,7 @@ + @@ -34,7 +34,7 @@ else delimiter = "" end - %> + %> <% unless @sale_data.blank? %> @@ -43,7 +43,7 @@ - <% end %> + <% end %> @@ -61,10 +61,10 @@ <% total_credit_amount = 0 total_credit_payment = 0 %> - <% @sale_data.each do |credit| %> + <% @sale_data.each do |credit| %> <% total_credit_amount += credit.payment_amount %> <% total_credit_payment += credit.credit_payment %> - + <% if @shift_from.nil? && @shift_to.nil? %> <% else %> @@ -78,10 +78,10 @@ Quick Service <% else %> Online Order - <% end %> + <% end %> - + - <% end %> + <% end %> @@ -33,10 +33,10 @@ <% total_credit_amount = 0 total_credit_payment = 0 %> - <% @sale_data.each do |credit| %> + <% @sale_data.each do |credit| %> <% total_credit_amount += credit.payment_amount total_credit_payment += credit.credit_payment %> - + <% if @shift_from.nil? && @shift_to.nil? %> <% else %> @@ -50,10 +50,10 @@ Quick Service <% else %> Online Order - <% end %> + <% end %> - + <% void = 0 %> <% mpu = 0 %> @@ -322,7 +321,7 @@ <% total_tax = 0 %> <% net = 0 %> - <% unless @tax.empty? %> + <% unless @tax.blank? %> <% @tax.each do |tax| total_tax += tax.tax_amount.to_f %> diff --git a/app/views/reports/dailysale/index.xls.erb b/app/views/reports/dailysale/index.xls.erb index 45e0264d..1e3871cf 100755 --- a/app/views/reports/dailysale/index.xls.erb +++ b/app/views/reports/dailysale/index.xls.erb @@ -10,7 +10,7 @@
<%= t("views.right_panel.detail.from_date") %> : <%= params[:from] rescue '-'%> , <%= t("views.right_panel.detail.to_date") %> : <%= params[:to] rescue '-'%>
<%= t("views.right_panel.detail.shift_name") %> <%= t("views.right_panel.detail.receipt_no") %>
<%= credit.sale_date.utc.getlocal.strftime("%e %b %I:%M%p") rescue '-'%> <%= credit.cashier_name rescue '-' %><%= credit.sale.customer.name rescue '-' %><%= credit.customer_name rescue '-' %> <%= number_with_precision(credit.payment_amount, precision: precision.to_i ,delimiter: delimiter) rescue '-' %> <%if credit.credit_payment_shift_name == '-' %> @@ -112,20 +112,20 @@ var check_arr = []; 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 = ""; - show_shift_name(period,period_type,from,to,'shift_item'); - } - + show_shift_name(period,period_type,from,to,'shift_item'); + } + // OK button is clicked $('#from').bootstrapMaterialDatePicker().on('beforeChange', function(e, date){ new_date = new Date(date) ; @@ -140,32 +140,32 @@ to = new_date.getDate() + "-" + month + "-" + new_date.getFullYear(); $('#to').val(to) search_by_date(); - }); - + }); + function search_by_date(){ - + from = $("#from").val(); - to = $("#to").val(); + to = $("#to").val(); var period = 0; - var period_type = 1; + 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){ - show_shift_name(period,period_type,from,to,'shift_item'); + show_shift_name(period,period_type,from,to,'shift_item'); } if(check_arr.length == 3){ check_arr = []; } } - + } - + function show_shift_name(period,period_type,from,to,shift_item){ var shift = $('#shift_name'); if (from == '' && to == '') { @@ -173,18 +173,18 @@ to = $("#to").val(); } shift.empty(); - + var str = ''; - var param_shift = ''; + var param_shift = ''; var param_shift = '<%= params[:shift_name] rescue '-'%>'; url = '<%= reports_get_shift_by_date_path %>'; - + $.get(url, {period :period, period_type :period_type, from :from, to :to, report_type :shift_item} , function(data){ str = ''; - $(data.message).each(function(index){ - + $(data.message).each(function(index){ + var local_date = data.message[index].local_opening_date + ' - ' + data.message[index].local_closing_date; var sh_date = data.message[index].opening_date + ' - ' + data.message[index].closing_date; var shift_id = data.message[index].shift_id ; @@ -193,18 +193,18 @@ selected = 'selected = "selected"'; } else{ - selected = ''; - } + selected = ''; + } }else{ - selected = ''; - } + selected = ''; + } str += ''; - + // console.log(sh_date) - }) + }) shift.append(str); }); } }); - \ No newline at end of file + diff --git a/app/views/reports/credit_payment/index.xls.erb b/app/views/reports/credit_payment/index.xls.erb index 41d4620f..6568e086 100755 --- a/app/views/reports/credit_payment/index.xls.erb +++ b/app/views/reports/credit_payment/index.xls.erb @@ -15,7 +15,7 @@
<%= t("views.right_panel.detail.from_date") %> : <%= params[:from] rescue '-'%> , <%= t("views.right_panel.detail.to_date") %> : <%= params[:to] rescue '-'%>
<%= t("views.right_panel.detail.shift_name") %> <%= t("views.right_panel.detail.receipt_no") %>
<%= credit.sale_date.utc.getlocal.strftime("%e %b %I:%M%p") rescue '-'%> <%= credit.cashier_name rescue '-' %><%= credit.sale.customer.name rescue '-' %><%= credit.customer_name rescue '-' %> <%= credit.payment_amount rescue '-' %> <%if credit.credit_payment_shift_name == '-' %> @@ -78,4 +78,4 @@ - \ No newline at end of file + diff --git a/app/views/reports/dailysale/index.html.erb b/app/views/reports/dailysale/index.html.erb index 3347408a..592a8cca 100755 --- a/app/views/reports/dailysale/index.html.erb +++ b/app/views/reports/dailysale/index.html.erb @@ -138,8 +138,7 @@ delimiter = "" end %> - <% unless @sale_data.empty? %> - + <% unless @sale_data.blank? %>
- + @@ -58,8 +58,8 @@ <% end %> - - + + @@ -75,8 +75,8 @@ else delimiter = "" end - %> - <% unless @sale_data.empty? %> + %> + <% unless @sale_data.blank? %> <% void = 0 %> @@ -97,8 +97,8 @@ <% discount = 0 %> <% kbzpay = 0 %> <% total = 0 %> - <% grand_total = 0 %> - <% old_grand_total = 0 %> + <% grand_total = 0 %> + <% old_grand_total = 0 %> <% count = 1 %> <% rounding_adj = 0 %> <% @sale_data.each do |sale| %> <% void += sale[:void_amount] %> @@ -114,14 +114,14 @@ <% giftvoucher += sale[:giftvoucher_amount] %> <% paypar += sale[:paypar_amount] %> <% cash += sale[:cash_amount]-sale[:total_change_amount] %> - <% credit += sale[:credit_amount] %> + <% credit += sale[:credit_amount] %> <% foc += sale[:foc_amount] %> <% discount += sale[:total_discount] %> <% kbzpay += sale[:kbzpay_amount] %> <% total += sale[:grand_total].to_f + sale[:rounding_adj].to_f %> - <% grand_total += sale[:grand_total].to_f %> - <% old_grand_total += sale[:old_grand_total].to_f %> - <% rounding_adj += sale[:rounding_adj].to_f %> + <% grand_total += sale[:grand_total].to_f %> + <% old_grand_total += sale[:old_grand_total].to_f %> + <% rounding_adj += sale[:rounding_adj].to_f %> @@ -161,13 +161,13 @@ <% end %> - + <% if @payment_methods.include? ("GiftVoucher") %> - + <% end %> - - + + @@ -175,7 +175,7 @@ <% end %> <% colspan = 7 %> - + <% if @payment_methods.include? ("MPU") %> <% colspan += 1 %> @@ -222,21 +222,21 @@ <% end %> - - <% if @payment_methods.include? ("GiftVoucher") %> - <% colspan += 1 %> - - <% end %> + + <% if @payment_methods.include? ("GiftVoucher") %> + <% colspan += 1 %> + + <% end %> - - + + <% total_tax = 0 %> <% net = 0 %> - <% unless @tax.empty? %> - <% @tax.each do |tax| + <% unless @tax.blank? %> + <% @tax.each do |tax| total_tax += tax.tax_amount.to_f %> @@ -252,7 +252,7 @@ - + <% end %> @@ -264,4 +264,4 @@ - \ No newline at end of file +
<%= t("views.right_panel.detail.from_date") %> : <%= @from.utc.getlocal.strftime("%Y-%b-%d") rescue '-' %> - <%= t("views.right_panel.detail.to_date") %> : <%= @to.utc.getlocal.strftime("%Y-%b-%d") rescue '-'%>
<%= t("views.right_panel.detail.giftvoucher_sales") %>(<%= t("views.right_panel.detail.discount") %>)<%= t("views.right_panel.detail.grand_total") %><%= t("views.right_panel.detail.grand_total") %> <%= t("views.right_panel.detail.rnd_adj_sh") %>
<%= count %> <%= sale[:sale_date].strftime("#{sale[:sale_date].day.ordinalize} %b") rescue '-' %><%= number_with_delimiter(sprintf("%.2f",sale[:cash_amount]-sale[:total_change_amount]), delimiter: delimiter) rescue '-'%> <%= number_with_delimiter(sprintf("%.2f",sale[:credit_amount]),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",sale[:foc_amount]),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",sale[:foc_amount]),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",sale[:giftvoucher_amount]),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",sale[:giftvoucher_amount]),delimiter => ',') rescue '-'%>(<%= number_with_delimiter(sprintf("%.2f",sale[:total_discount]), delimiter => ',') rescue '-'%>)<%= number_with_delimiter(sprintf("%.2f",sale[:grand_total]),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",sale[:grand_total]),delimiter => ',') rescue '-'%> <%= number_with_delimiter(sprintf("%.2f",sale[:rounding_adj].to_f),delimiter => ',') rescue '-'%>
TotalTotal<%= number_with_delimiter(sprintf("%.2f",mpu),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",cash),delimiter => ',') rescue '-'%> <%= number_with_delimiter(sprintf("%.2f",credit),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",foc), delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",giftvoucher), delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",foc), delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",giftvoucher), delimiter => ',') rescue '-'%>(<%= number_with_delimiter(discount,delimiter => ',') rescue '-'%>) <%= number_with_delimiter(sprintf("%.2f",grand_total),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",rounding_adj),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",grand_total),delimiter => ',') rescue '-'%><%= number_with_delimiter(sprintf("%.2f",rounding_adj),delimiter => ',') rescue '-'%>
<%= tax.tax_name rescue '-'%>
<%= t("views.right_panel.detail.net_amount") %> <%= number_with_delimiter(sprintf("%.2f",net),delimiter => ',') rescue '-'%>