sale payment

This commit is contained in:
Nweni
2019-06-21 14:24:34 +06:30
parent 2a71794529
commit e9b6feb332
4 changed files with 122 additions and 186 deletions

View File

@@ -1,164 +1,27 @@
class Api::Payment::MobilepaymentController < Api::ApiController
# skip_before_action :authenticate
def cash
cash = params[:cash]
sale_id = params[:sale_id]
member_info = nil
type = params[:type]
tax_type = params[:tax_type]
path = request.fullpath
latest_order_no = nil
cashier_id = params[:cashier_id]
current_user = Employee.find(cashier_id)
if(Sale.exists?(sale_id))
saleObj = Sale.find(sale_id)
sale_items = SaleItem.get_all_sale_items(sale_id)
shop_detail = Shop.first
# # rounding adjustment
# if !path.include? ("credit_payment")
# if shop_detail.is_rounding_adj
# a = saleObj.grand_total % 25 # Modulus
# b = saleObj.grand_total / 25 # Division
# #not calculate rounding if modulus is 0 and division is even
# #calculate rounding if modulus is zero or not zero and division are not even
# if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0)
# new_total = Sale.get_rounding_adjustment(saleObj.grand_total)
# rounding_adj = new_total-saleObj.grand_total
# saleObj.update_attributes(grand_total: new_total,old_grand_total: saleObj.grand_total,rounding_adjustment:rounding_adj)
# end
# end
# end
# # end rounding adjustment
sale_payment = SalePayment.new
sale_payment = sale_payment.process_payment(saleObj, current_user, cash, "cash")
if sale_payment[0]
@cash = {"change_amount"=>sale_payment[3],"balance_amount"=>sale_payment[4] ,"receipt_url"=>''}
end
@out = true,@cash
# if !path.include? ("credit_payment")
# rebate_amount = nil
# # For Cashier by Zone
# # bookings = Booking.where("sale_id='#{sale_id}'")
# bookings = Booking.find_by_sale_id(sale_id)
# shift = ShiftSale.current_open_shift(current_user.id)
# if !shift.nil?
# cashier_terminal = CashierTerminal.find(shift.cashier_terminal_id)
# else
# if bookings.dining_facility_id.to_i > 0
# table = DiningFacility.find(bookings.dining_facility_id)
# cashier_zone = CashierTerminalByZone.find_by_zone_id(table.zone_id)
# cashier_terminal = CashierTerminal.find(cashier_zone.cashier_terminal_id)
# type = 'payment'
# from = getCloudDomain #get sub domain in cloud mode
# ActionCable.server.broadcast "order_channel",table: table,type:type,from:from
# else
# shift = ShiftSale.find(saleObj.shift_sale_id)
# cashier_terminal = CashierTerminal.find(shift.cashier_terminal_id)
# end
# end
# # For Print
# # if ENV["SERVER_MODE"] != "cloud" #no print in cloud server
# receipt_bill_a5_pdf = Lookup.collection_of("print_settings") #print_settings with name:ReceiptBillA5Pdf
# unique_code = "ReceiptBillPdf"
# print_settings = PrintSetting.all
# if !print_settings.nil?
# print_settings.each do |setting|
# if setting.unique_code == 'ReceiptBillPdf'
# unique_code = "ReceiptBillPdf"
# elsif setting.unique_code == 'ReceiptBillStarPdf'
# unique_code = "ReceiptBillStarPdf"
# end
# end
# end
# if !receipt_bill_a5_pdf.empty?
# receipt_bill_a5_pdf.each do |receipt_bilA5|
# if receipt_bilA5[0] == 'ReceiptBillA5Pdf'
# if receipt_bilA5[1] == '1'
# unique_code = "ReceiptBillA5Pdf"
# end
# end
# end
# end
# customer= Customer.find(saleObj.customer_id)
# # get member information
# rebate = MembershipSetting.find_by_rebate(1)
# credit_data = SalePayment.find_by_sale_id_and_payment_method(sale_id,'creditnote')
# if customer.membership_id != nil && rebate && credit_data.nil?
# member_info = Customer.get_member_account(customer)
# if member_info["status"] == true
# rebate_amount = Customer.get_membership_transactions(customer,saleObj.receipt_no)
# current_balance = SaleAudit.paymal_search(sale_id)
# end
# end
# #orders print out
# if params[:type] == "quick_service"
# booking = Booking.find_by_sale_id(sale_id)
# if booking.dining_facility_id.to_i>0
# table_id = booking.dining_facility_id
# else
# table_id = 0
# end
# latest_order = booking.booking_orders.order("order_id DESC").limit(1).first()
# if !latest_order.nil?
# latest_order_no = latest_order.order_id
# end
# booking.booking_orders.each do |order|
# # Order.pay_process_order_queue(order.order_id, table_id)
# oqs = OrderQueueStation.new
# oqs.pay_process_order_queue(order.order_id, table_id)
# assign_order = AssignedOrderItem.assigned_order_item_by_job(order.order_id)
# from = getCloudDomain #get sub domain in cloud mode
# ActionCable.server.broadcast "order_queue_station_channel",order: assign_order,from:from
# end
# end
# #for card sale data
# card_data = Array.new
# card_sale_trans_ref_no = Sale.getCardSaleTrans(sale_id)
# if !card_sale_trans_ref_no.nil?
# card_sale_trans_ref_no.each do |cash_sale_trans|
# card_res_date = cash_sale_trans.res_date.strftime("%Y-%m-%d").to_s
# card_res_time = cash_sale_trans.res_time.strftime("%H:%M").to_s
# card_no = cash_sale_trans.pan.last(4)
# card_no = card_no.rjust(19,"**** **** **** ")
# card_data.push({'res_date' => card_res_date, 'res_time' => card_res_time, 'batch_no' => cash_sale_trans.batch_no, 'trace' => cash_sale_trans.trace, 'pan' => card_no, 'app' => cash_sale_trans.app, 'tid' => cash_sale_trans.terminal_id, 'app_code' => cash_sale_trans.app_code, 'ref_no' => cash_sale_trans.ref_no, 'mid' => cash_sale_trans.merchant_id})
# end
# end
# #card_balance amount for Paymal payment
# card_balance_amount = SaleAudit.getCardBalanceAmount(sale_id)
# # get printer info
# print_settings=PrintSetting.find_by_unique_code(unique_code)
# # Calculate Food and Beverage Total
# item_price_by_accounts = SaleItem.calculate_price_by_accounts(saleObj.sale_items)
# discount_price_by_accounts = SaleItem.get_discount_price_by_accounts(saleObj.sale_items)
# other_amount = SaleItem.calculate_other_charges(sale_items)
# printer = Printer::ReceiptPrinter.new(print_settings)
# filename, sale_receipt_no, printer_name = printer.print_receipt_bill(print_settings,cashier_terminal,sale_items,saleObj,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_detail, "Paid",current_balance,card_data,other_amount,latest_order_no,card_balance_amount,nil)
# render json: JSON.generate({:status => saleObj.rebate_status, :message => "Can't Rebate coz of Sever Error ", :filename => filename, :receipt_no => sale_receipt_no, :printer_name => printer_name})
# #end
# end
end
end
def kbz_pay
end
end

54
app/models/kbz_pay.rb Normal file
View File

@@ -0,0 +1,54 @@
class KbzPay
def self.pay(amount, receipt_no)
datetime = DateTime.now.strftime("%d%m%Y%H%M")
kbz_app_id = "kp1e78f7efddca190042638341afb88d"
kbz_merch_code = "200004"
kbz_method = 'kbz.payment.precreate'
kbz_trade_type = "PAY_BY_QRCODE"
kbz_api_key = "code2lab123456"
kbz_version = "1.0"
kbz_provider_url = "http://api.kbzpay.com/payment/gateway/uat/precreate"
kbz_currency = "MMK"
kbz_callback_url = "https://staging-v2.doemal.com/api/v3/ordering/kbz_callback"
nounce_str = SecureRandom.base64(32).first(32).upcase
params = "appid="+kbz_app_id+"&merch_code="+kbz_merch_code+"&merch_order_id="+receipt_no.to_s+"&method="+kbz_method+"&nonce_str="+nounce_str.to_s+"&notify_url="+ kbz_callback_url + "&timestamp="+datetime+"&total_amount="+amount.to_s+"&trade_type="+kbz_trade_type+"&trans_currency="+ kbz_currency+"&version="+kbz_version+"&key="+kbz_api_key
Rails.logger.info params
sign = Digest::SHA256.hexdigest(params)
str = {"timestamp": datetime,
"method": kbz_method,
"notify_url": kbz_callback_url,
"nonce_str": nounce_str.to_s,
"sign_type": "SHA256",
"sign": sign,
"version": kbz_version,
"biz_content": {
"merch_order_id": receipt_no,
"merch_code": kbz_merch_code,
"appid": kbz_app_id,
"trade_type": kbz_trade_type,
"total_amount": amount.to_s,
"trans_currency": kbz_currency
}
}
result = HTTParty.post(kbz_provider_url,
:body => { :Request => str}.to_json,
:headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }
)
Rails.logger.info result
if result['Response']['result'] == "SUCCESS"
#TODO QR return
qr = result['Response']['qrCode']
return true, qr
else
return false, result['Response']
puts result['Response']
end
end
end

View File

@@ -23,7 +23,7 @@ class SalePayment < ApplicationRecord
invoice_sale_payments = invoice.sale_payments
amount_due = invoice.grand_total
end
invoice_sale_payments.each do |payment|
if (payment.payment_status == "paid" )
amount_due = amount_due - payment.payment_amount
@@ -69,6 +69,8 @@ class SalePayment < ApplicationRecord
payment_status,membership_data = dinga_payment
when "GiftVoucher"
payment_status = giftvoucher_payment
when "KbzPay"
payment_status = giftvoucher_payment
else
puts "it was something else"
end
@@ -84,7 +86,7 @@ class SalePayment < ApplicationRecord
shift = ShiftSale.current_shift
shift_sale_id = shift.id
end
remark = "#{self.sale_payment_id}||#{shift_sale_id} -> #{remark}"
sale_audit = SaleAudit.record_payment(invoice.id, remark, action_by.name)
@@ -311,7 +313,7 @@ class SalePayment < ApplicationRecord
if sp.payment_method == "jcb" || sp.payment_method == "mpu" || sp.payment_method == "visa" || sp.payment_method == "master" || sp.payment_method == "unionpay" || sp.payment_method == "alipay"
return true;
end
end
end
end
private
@@ -321,7 +323,7 @@ class SalePayment < ApplicationRecord
if sale_payments_data.nil?
status = true
end
payment_status = false
self.payment_method = "cash"
self.payment_amount = self.received_amount
@@ -353,7 +355,7 @@ class SalePayment < ApplicationRecord
# add to sale item with foc
sale_items = SaleItem.where("sale_id='#{ self.sale.sale_id }'")
sale_items.each do|item|
SaleItem.update_existing_item(item.qty, item, self.sale.sale_id, "foc", item.unit_price, item.price)
end
@@ -364,11 +366,11 @@ class SalePayment < ApplicationRecord
self.outstanding_amount = 0.00
self.payment_status = "paid"
payment_status = self.save!
# sale_update_payment_status(self.received_amount)
sale_update_payment_status(0)
# sale_update_payment_status(self.received_amount)
sale_update_payment_status(0)
return payment_status
end
def creditnote_payment(customer_id)
payment_status = false
@@ -383,7 +385,7 @@ class SalePayment < ApplicationRecord
return payment_status
end
def external_terminal_card_payment(method, payment_for=false)
def external_terminal_card_payment(method, payment_for=false)
payment_status = false
self.payment_method = method
self.payment_amount = self.received_amount
@@ -561,7 +563,16 @@ class SalePayment < ApplicationRecord
return payment_status
end
def sale_update_payment_status(paid_amount,check_foc = false)
def kbz_payment
payment_status = false
status, response = KbzPay.pay(amount, receipt_no)
if status
payment_status = true
return
end
end
def sale_update_payment_status(paid_amount,check_foc = false)
#update amount_outstanding
self.sale.amount_received = self.sale.amount_received.to_f + paid_amount.to_f
self.sale.save!
@@ -596,12 +607,12 @@ class SalePayment < ApplicationRecord
else
self.sale.payment_status = "foc"
end
self.sale.sale_status = "completed"
if MembershipSetting.find_by_rebate(1) && is_foc == 0 && is_credit == 0
response = rebat(sObj)
#record an payment in sale-audit
remark = "#{response} Rebate- for Customer #{self.sale.customer_id} | Sale Id [#{self.sale.sale_id}]| pay amount -> #{self.received_amount} "
sale_audit = SaleAudit.record_paymal(sObj.sale_id, remark, 1)
@@ -624,7 +635,7 @@ class SalePayment < ApplicationRecord
end
self.sale.save!
if check_foc
table_update_status(sObj)
update_shift
@@ -640,13 +651,13 @@ class SalePayment < ApplicationRecord
# update for cashier shift
def update_shift
shift = ShiftSale.current_open_shift(self.action_by.id)
if shift.nil?
shift = ShiftSale.current_open_shift(self.sale.cashier_id)
end
if !shift.nil?
shift.update(self.sale)
self.sale.shift_sale_id = shift.id
@@ -674,7 +685,7 @@ class SalePayment < ApplicationRecord
else
# extra_changed_amount = self.received_amount.to_f + credit_payment_left
shift.cash_sales = shift.cash_sales.to_f + (self.received_amount.to_f + credit_payment_left)
self.sale.amount_received = self.sale.amount_received.to_f - credit_payment_left
self.sale.amount_changed = self.sale.amount_changed.to_f - credit_payment_left
self.sale.save!
@@ -686,7 +697,7 @@ class SalePayment < ApplicationRecord
shift.credit_sales = shift.credit_sales.to_f - self.received_amount.to_f
else
shift.credit_sales = shift.credit_sales.to_f - (self.received_amount.to_f + credit_payment_left)
end
end
shift.save
end
end
@@ -702,7 +713,7 @@ class SalePayment < ApplicationRecord
bookings.each do |tablebooking|
if tablebooking.booking_status != 'moved'
if tablebooking.sale_id
if tablebooking.sale.sale_status != 'completed' && tablebooking.sale.sale_status != 'void' && tablebooking.sale.sale_status != 'spoile' && tablebooking.sale.sale_status != 'waste'
if tablebooking.sale.sale_status != 'completed' && tablebooking.sale.sale_status != 'void' && tablebooking.sale.sale_status != 'spoile' && tablebooking.sale.sale_status != 'waste'
status = false
sale_count += 1
else
@@ -726,7 +737,7 @@ class SalePayment < ApplicationRecord
#if ENV["SERVER_MODE"] != 'cloud'
# if ENV["SERVER_MODE"] == 'cloud'
# from = request.subdomain + "." + request.domain
# else
# else
# from = ""
# end
# ActionCable.server.broadcast "order_channel",table: table,type:type,from:from
@@ -755,7 +766,7 @@ class SalePayment < ApplicationRecord
end
# overall_dis = SaleItem.get_overall_discount(sObj.id)
overall_dis = sObj.total_discount
if credit != 1
membership = MembershipSetting.find_by_membership_type("paypar_url")
memberaction = MembershipAction.find_by_membership_type("get_member_campaign")
@@ -766,8 +777,8 @@ class SalePayment < ApplicationRecord
# Control for Paypar Cloud
begin
response = HTTParty.get(url,
:body => {
response = HTTParty.get(url,
:body => {
member_group_id:sObj.customer.membership_type,
merchant_uid:merchant_uid,
campaign_type_id: campaign_type_id,
@@ -781,7 +792,7 @@ class SalePayment < ApplicationRecord
response = { "status": false , "message": " Connection timeout" }
rescue OpenURI::HTTPError
response = { "status": false, "message": "Can't connect server"}
rescue SocketError
response = { "status": false, "message": "Can't connect server"}
end
@@ -801,7 +812,7 @@ class SalePayment < ApplicationRecord
if cm[:amount] > 0
data = {:type => a["rules_type"], :percentage => a["change_unit"].to_i * a["base_unit"].to_i}
total_percentage = total_percentage + a["change_unit"].to_i * a["base_unit"].to_i
type_arr.push(data)
end
end
@@ -813,7 +824,7 @@ class SalePayment < ApplicationRecord
Rails.logger.debug type_arr.to_json
rebate_arr =[]
campaign_method.each do |a|
data = {:type => a[:type], :amount => a[:amount]}
type_arr.each do |si|
@@ -825,14 +836,14 @@ class SalePayment < ApplicationRecord
actual = a[:amount].to_f - amount.to_f
data[:amount] = actual
end
end
end
rebate_arr.push(data)
end
Rails.logger.debug "---------------Rebate Response----------------"
Rails.logger.debug rebate_arr.to_json
total_amount = rebate_prices - payparcost - overall_dis
Rails.logger.debug total_amount
@@ -851,8 +862,8 @@ class SalePayment < ApplicationRecord
# Control for Paypar Cloud
begin
response = HTTParty.post(url,
:body => {
response = HTTParty.post(url,
:body => {
generic_customer_id:generic_customer_id ,
total_sale_transaction_amount: sObj.grand_total,
merchant_uid:merchant_uid,
@@ -870,7 +881,7 @@ class SalePayment < ApplicationRecord
response = { "status": false , "message": "Connect To" }
rescue OpenURI::HTTPError
response = { "status": false, "message": "Can't connect server"}
rescue SocketError
response = { "status": false, "message": "Can't connect server"}
end
@@ -880,7 +891,7 @@ class SalePayment < ApplicationRecord
end
end
else
response = { "status": "no_member", "message": "Not membership"}
response = { "status": "no_member", "message": "Not membership"}
end
end
@@ -899,18 +910,18 @@ class SalePayment < ApplicationRecord
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)"
query = SalePayment.select("s.receipt_no, sale_payments.sale_payment_id,
sale_payments.payment_method,
query = SalePayment.select("s.receipt_no, sale_payments.sale_payment_id,
sale_payments.payment_method,
SUM(sale_payments.payment_amount) as payment_amount,
s.receipt_date as sale_date,
s.sale_id,
s.cashier_name as cashier_name, c.name as customer_name")
.joins("INNER JOIN sales s ON s.sale_id = sale_payments.sale_id")
.joins("INNER JOIN customers c ON c.customer_id = s.customer_id")
if params[:type].nil?
query = query.where("(CASE WHEN (s.grand_total + s.amount_changed)=(select SUM(payment_amount) FROM sale_payments WHERE sale_id=s.sale_id AND payment_method!='creditnote') THEN NULL ELSE payment_method='creditnote' END) and s.sale_status = 'completed' and s.payment_status='paid' #{receipt_no} #{customer}")
elsif params[:type] == "cashier"
elsif params[:type] == "cashier"
query = query.where("(CASE WHEN (s.grand_total + s.amount_changed)=(select SUM(payment_amount) FROM sale_payments WHERE sale_id=s.sale_id AND payment_method!='creditnote') THEN NULL ELSE payment_method='creditnote' AND #{order_source_query}='#{params[:type]}' OR #{order_source_query}='emenu' END) and s.sale_status = 'completed' and s.payment_status='paid' #{receipt_no} #{customer}")
else
query = query.where("(CASE WHEN (s.grand_total + s.amount_changed)=(select SUM(payment_amount) FROM sale_payments WHERE sale_id=s.sale_id AND payment_method!='creditnote') THEN NULL ELSE payment_method='creditnote' AND #{order_source_query}='#{params[:type]}' END) and s.sale_status = 'completed' and s.payment_status='paid' #{receipt_no} #{customer}")
@@ -921,8 +932,8 @@ class SalePayment < ApplicationRecord
end
def self.get_credit_amount_due_left(sale_id)
query = SalePayment.select("(SUM(sale_payments.payment_amount) -
(CASE WHEN SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id
query = SalePayment.select("(SUM(sale_payments.payment_amount) -
(CASE WHEN SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id
THEN SUM(sale_payments.payment_amount) ELSE 0 END)) as payment_amount")
.joins(" LEFT JOIN sale_audits sa on SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id")
.where("sale_payments.payment_method = 'creditnote' AND sale_payments.sale_id = '#{sale_id}'")
@@ -930,7 +941,7 @@ class SalePayment < ApplicationRecord
end
def self.get_credit_total_left(sale_id)
query = SalePayment.select("(SUM(sale_payments.payment_amount) -
query = SalePayment.select("(SUM(sale_payments.payment_amount) -
(SELECT (CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN SUM(sale_payments.payment_amount) ELSE 0 END) AS payment_amount
FROM sale_payments
INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id
@@ -942,7 +953,7 @@ class SalePayment < ApplicationRecord
def self.get_sale_payment_for_credit(sale_data)
query = sale_data.sale_payments
.joins(" JOIN sale_audits sa on SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id")
.where("sa.action='SALEPAYMENT' AND sa.remark IS NOT NULL
.where("sa.action='SALEPAYMENT' AND sa.remark IS NOT NULL
AND DATE_FORMAT(sale_payments.created_at,'%Y-%m-%d') = '#{DateTime.now.strftime('%Y-%m-%d')}' OR DATE_FORMAT(sale_payments.created_at,'%Y-%m-%d') = '#{Date.today.prev_day}'
") #AND sale_payments.payment_method!='cash'
.group("sale_payments.sale_payment_id")

View File

@@ -1,2 +1,10 @@
json.set! :status, @out[0]
json.set! :data, @out[1]
# json.set! :status, @out[0]
# json.set! :data, @out[1]
#
if @cash
json.status true
else
json.status false
json.data @cash
end