From e9b6feb332a86aa3582dfbcaf23fda0ae52f1e97 Mon Sep 17 00:00:00 2001 From: Nweni Date: Fri, 21 Jun 2019 14:24:34 +0630 Subject: [PATCH] sale payment --- .../api/payment/mobilepayment_controller.rb | 153 +----------------- app/models/kbz_pay.rb | 54 +++++++ app/models/sale_payment.rb | 89 +++++----- .../payment/mobilepayment/cash.json.jbuilder | 12 +- 4 files changed, 122 insertions(+), 186 deletions(-) create mode 100644 app/models/kbz_pay.rb diff --git a/app/controllers/api/payment/mobilepayment_controller.rb b/app/controllers/api/payment/mobilepayment_controller.rb index e5688e87..e2f9aba5 100644 --- a/app/controllers/api/payment/mobilepayment_controller.rb +++ b/app/controllers/api/payment/mobilepayment_controller.rb @@ -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 diff --git a/app/models/kbz_pay.rb b/app/models/kbz_pay.rb new file mode 100644 index 00000000..2fb740f2 --- /dev/null +++ b/app/models/kbz_pay.rb @@ -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+"¬ify_url="+ kbz_callback_url + "×tamp="+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 diff --git a/app/models/sale_payment.rb b/app/models/sale_payment.rb index 1c15c363..a4e386ee 100755 --- a/app/models/sale_payment.rb +++ b/app/models/sale_payment.rb @@ -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") diff --git a/app/views/api/payment/mobilepayment/cash.json.jbuilder b/app/views/api/payment/mobilepayment/cash.json.jbuilder index 725395e6..f0b9060b 100644 --- a/app/views/api/payment/mobilepayment/cash.json.jbuilder +++ b/app/views/api/payment/mobilepayment/cash.json.jbuilder @@ -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