class SalePayment < ApplicationRecord #primary key - need to be unique generated for multiple shops belongs_to :sale :attr_accessor :received_amount, :card_payment_reference, :voucher_no, :giftcard_no, :customer_id, :external_payment_status def process_payment(invoice, action_by) self.sale = invoice amount_due = invoice.grand_total #get all payment for this invoices invoice.sale_payments.each do |payment| if (payment.payment_status == "paid" ) amount_due = amount_due - payment.payment_amount end end if (amount_due > 0) payment_status = false #route to payment type switch (payment_method) case "cash" payment_status = cash_payment case "creditnote" payment_status = creditnote_payment case "visa" payment_status = external_terminal_card_payment(:visa) case "master" payment_status = external_terminal_card_payment(:master) case "jcb" payment_status = external_terminal_card_payment(:jcb) case "mpu" payment_status = external_terminal_card_payment(:mpu) case "unionpay" payment_status = external_terminal_card_payment(:unionpay) case "vochure" payment_status = vochure_payment case "giftcard" payment_status = giftcard_payment case "paypar" #TODO: implement paypar implementation payment_status = paypar_payment end #record an payment in sale-audit remark = "Payment #{payment_method}- for Invoice #{invoice.receipt_no} Due [#{amount_due}]| pay amount -> #{amount} | Payment Status ->#{payment_status}" sale_audit = SaleAudit.record_payment(invoice.id, remark, action_by) return true, self.sale else #record an payment in sale-audit remark = "No outstanding Amount - Grand Total [#{invoice.grand_total}] | Due [#{amount_due}] | Paid [#{invoice.amount_received}]" sale_audit = SaleAudit.record_payment(invoice.id, remark,action_by) return false, "No outstanding Amount" end end private def cash_payment payment_status = false self.payment_method = "cash" self.payment_amount = self.received_amount self.outstanding_amount = self.sale.grand_total - received_amount self.payment_status = "paid" payment_method = self.save! sale_update_payment_status(self.received_amount) return payment_status end def creditnote_payment(self.customer_id) payment_status = false self.payment_method = "creditnote" self.payment_amount = self.received_amount self.customer_id = self.customer_id self.outstanding_amount = 0 - self.received_amount self.payment_status = "outstanding" payment_method = self.save! sale_update_payment_status(self.received_amount) return payment_status end def external_terminal_card_payment(method) payment_status = false self.payment_method = method self.payment_amount = self.received_amount self.payment_reference = self.card_payment_reference self.outstanding_amount = self.sale.grand_total- self.received_amount self.payment_status = "paid" payment_method = self.save! sale_update_payment_status(self.received_amount) return payment_status end def voucher_payment payment_status = false #Next time - validate if the vochure number is valid - within self.payment_method = "voucher" self.payment_amount = self.received_amount self.payment_reference = self.voucher_no self.outstanding_amount = self.sale.grand_total- self.received_amount self.payment_status = "paid" payment_method = self.save! sale_update_payment_status(self.received_amount) return payment_status end def giftcard_payment payment_status = false #Next time - validate if the vochure number is valid - within self.payment_method = "giftcard" self.payment_amount = self.received_amount self.payment_reference = self.giftcard_no self.outstanding_amount = self.sale.grand_total- self.received_amount self.payment_status = "paid" payment_method = self.save! sale_update_payment_status(self.received_amount) return payment_status end def paypar_payment ##TODO - Integration with Paypar (SmartPay) end def sale_update_payment_status(paid_amount) #update amount_outstanding self.sale.amount_received = self.sale.amount_received + paid_amount self.sale.amount_changed = amount - self.sale.amount_received if (self.sale.grand_total <= self.sale.amount_received && self.sale.amount_changed > 0) self.sale.payment_status = "paid" self.sale.sale_status = "completed" self.sale.save! end end end