From 216dfe4f2f8e1ebe36806898936b4812d7788db6 Mon Sep 17 00:00:00 2001 From: NyanLinHtut Date: Wed, 13 Nov 2019 13:34:11 +0630 Subject: [PATCH] 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 ------------#