add loader service api

This commit is contained in:
NyanLinHtut
2019-11-13 13:34:11 +06:30
parent fbaf63f073
commit 216dfe4f2f
6 changed files with 298 additions and 13 deletions

View File

@@ -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

View File

@@ -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!"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 ------------#