merge with r-19
This commit is contained in:
@@ -66,32 +66,26 @@ class SalePayment < ApplicationRecord
|
||||
return self.save
|
||||
end
|
||||
|
||||
def process_payment(invoice, action_by, cash_amount, payment_method,remark=nil,payment_for=false)
|
||||
def process_payment(invoice, action_by, cash_amount, payment_method, remark=nil, payment_for=false)
|
||||
self.sale = invoice
|
||||
self.received_amount = cash_amount
|
||||
self.payment_reference = remark
|
||||
self.action_by = action_by
|
||||
#get all payment for this invoices
|
||||
if payment_for
|
||||
invoice_sale_payments = SalePayment.get_sale_payment_for_credit(invoice)
|
||||
amount_due = SalePayment.get_credit_amount_due_left(self.sale_id)[0] ? SalePayment.get_credit_amount_due_left(self.sale_id)[0].payment_amount.to_f : 0
|
||||
amount_due = SalePayment.get_credit_amount_due_left(self.sale_id).first.payment_amount
|
||||
else
|
||||
invoice_sale_payments = invoice.sale_payments
|
||||
amount_due = invoice.grand_total
|
||||
amount_due = invoice.sale_payments
|
||||
.map(&:payment_amount).reduce(invoice.grand_total, :-)
|
||||
end
|
||||
|
||||
invoice_sale_payments.each do |payment|
|
||||
if (payment.payment_status == "paid" )
|
||||
amount_due = amount_due - payment.payment_amount
|
||||
end
|
||||
end
|
||||
if (amount_due > 0)
|
||||
if amount_due > 0
|
||||
payment_status = false
|
||||
membership_data = nil
|
||||
#route to payment type
|
||||
case payment_method
|
||||
when "cash"
|
||||
payment_status ,outstanding_amount ,balance_amount = cash_payment(payment_for)
|
||||
payment_status, outstanding_amount, balance_amount = cash_payment(payment_for)
|
||||
when "creditnote"
|
||||
if !self.sale.customer_id.nil?
|
||||
payment_status = creditnote_payment(self.customer_id)
|
||||
@@ -156,7 +150,7 @@ class SalePayment < ApplicationRecord
|
||||
# update complete order items in oqs
|
||||
booking = Booking.find_by_sale_id(sale_id)
|
||||
booking.booking_orders.each do |sodr|
|
||||
assigned =AssignedOrderItem.where("order_id = '#{ sodr.order_id }'").pluck(:assigned_order_item_id)
|
||||
assigned = AssignedOrderItem.where("order_id = '#{ sodr.order_id }'").pluck(:assigned_order_item_id)
|
||||
AssignedOrderItem.where('assigned_order_item_id IN (?)', assigned).update_all(delivery_status: true)
|
||||
# AssignedOrderItem.where("order_id = '#{ sodr.order_id }'").find_each do |aoi|
|
||||
# aoi.delivery_status = 1
|
||||
@@ -164,7 +158,7 @@ class SalePayment < ApplicationRecord
|
||||
# end
|
||||
end
|
||||
|
||||
return true, self.save,membership_data, outstanding_amount ,balance_amount
|
||||
return true, self.save, membership_data, outstanding_amount, balance_amount
|
||||
else
|
||||
#record an payment in sale-audit
|
||||
remark = "Payment failed - Grand Total [#{invoice.grand_total}] | Due [#{amount_due}] | Paid [#{invoice.amount_received}]"
|
||||
@@ -173,6 +167,7 @@ class SalePayment < ApplicationRecord
|
||||
return false, self.save,membership_data
|
||||
end
|
||||
else
|
||||
sale_update_payment_status(0)
|
||||
#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.name)
|
||||
@@ -412,19 +407,19 @@ class SalePayment < ApplicationRecord
|
||||
|
||||
def foc_payment
|
||||
payment_status = false
|
||||
|
||||
sale = self.sale
|
||||
# add to sale item with foc
|
||||
sale_items = SaleItem.where("sale_id='#{ self.sale.sale_id }'")
|
||||
sale_items = sale.sale_items
|
||||
|
||||
sale_items.each do|item|
|
||||
SaleItem.update_existing_item(item.qty, item, self.sale.sale_id, "foc", item.unit_price, item.price)
|
||||
SaleItem.update_existing_item(item.qty, item, sale.sale_id, "foc", item.unit_price, item.price)
|
||||
end
|
||||
sale = Sale.find(self.sale.sale_id)
|
||||
|
||||
sale.compute_by_sale_items(sale.total_discount,'','','',"foc")
|
||||
|
||||
self.payment_method = "foc"
|
||||
self.payment_amount = self.received_amount
|
||||
# self.outstanding_amount = self.sale.grand_total.to_f - self.received_amount.to_f
|
||||
|
||||
self.outstanding_amount = 0.00
|
||||
self.payment_status = "paid"
|
||||
payment_status = self.save!
|
||||
@@ -633,85 +628,61 @@ class SalePayment < ApplicationRecord
|
||||
return payment_status
|
||||
end
|
||||
|
||||
def sale_update_payment_status(paid_amount,check_foc = false)
|
||||
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!
|
||||
self.sale.amount_changed = self.sale.amount_received.to_f - self.sale.grand_total.to_f
|
||||
all_received_amount = 0.0
|
||||
sObj = Sale.find(self.sale_id)
|
||||
is_credit = 0
|
||||
is_foc = 0
|
||||
is_kbz_pay = 0
|
||||
method_status = false
|
||||
sObj.sale_payments.each do |spay|
|
||||
all_received_amount += spay.payment_amount.to_f
|
||||
if spay.payment_method == "creditnote"
|
||||
is_credit = 1
|
||||
end
|
||||
if spay.payment_method == "foc"
|
||||
is_foc = 1
|
||||
end
|
||||
if spay.payment_method == KbzPay::KBZ_PAY
|
||||
is_kbz_pay = 1
|
||||
end
|
||||
if spay.payment_method == "cash" || spay.payment_method == "foc" || spay.payment_method == "creditnote" || spay.payment_method == KbzPay::KBZ_PAY || spay.payment_method =="paymal"
|
||||
method_status = true
|
||||
end
|
||||
end
|
||||
if (self.sale.grand_total <= all_received_amount) && method_status
|
||||
if is_credit == 0
|
||||
self.sale.payment_status = "paid"
|
||||
else
|
||||
self.sale.payment_status = "outstanding"
|
||||
sale = self.sale
|
||||
total_payment_amount = sale.sale_payments.reload.sum(&:payment_amount)
|
||||
sale.amount_received = sale.amount_received.to_f + paid_amount.to_f
|
||||
sale.amount_changed = total_payment_amount - sale.grand_total.to_f
|
||||
|
||||
is_credit = sale.sale_payments.any? { |x| x.payment_method == "creditnote" }
|
||||
is_foc = sale.sale_payments.any? { |x| x.payment_method == "foc" }
|
||||
|
||||
if sale.grand_total <= total_payment_amount && sale.sale_status == "new"
|
||||
sale.payment_status = "paid"
|
||||
if is_credit
|
||||
sale.payment_status = "outstanding"
|
||||
end
|
||||
if is_foc
|
||||
sale.payment_status = "foc"
|
||||
end
|
||||
|
||||
if is_foc == 0
|
||||
self.sale.payment_status = "paid"
|
||||
else
|
||||
self.sale.payment_status = "foc"
|
||||
end
|
||||
sale.sale_status = "completed"
|
||||
|
||||
if is_kbz_pay == 1
|
||||
self.sale.payment_status = 'paid'
|
||||
end
|
||||
|
||||
self.sale.sale_status = "completed"
|
||||
|
||||
if MembershipSetting.find_by_rebate_and_shop_code(1,self.sale.shop_code) && is_foc == 0 && is_credit == 0
|
||||
response = rebat(sObj)
|
||||
if MembershipSetting.find_by_rebate(1) && is_foc == 0 && is_credit == 0
|
||||
response = rebat(sale)
|
||||
|
||||
#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)
|
||||
remark = "#{response} Rebate- for Customer #{sale.customer_id} | Sale Id [#{sale.sale_id}]| pay amount -> #{self.received_amount} "
|
||||
sale_audit = SaleAudit.record_paymal(sale.sale_id, remark, 1)
|
||||
|
||||
if !response.nil?
|
||||
if response["status"] == true
|
||||
self.sale.rebate_status = 'true'
|
||||
sale.rebate_status = 'true'
|
||||
end
|
||||
if response["status"] == false
|
||||
self.sale.rebate_status = 'false'
|
||||
sale.rebate_status = 'false'
|
||||
end
|
||||
|
||||
if response[:status] == false
|
||||
self.sale.rebate_status = 'false'
|
||||
sale.rebate_status = 'false'
|
||||
end
|
||||
if response[:status] == "no_member"
|
||||
self.sale.rebate_status = nil
|
||||
sale.rebate_status = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.sale.save!
|
||||
sale.save!
|
||||
|
||||
if check_foc
|
||||
table_update_status(sObj)
|
||||
table_update_status(sale)
|
||||
update_shift
|
||||
elsif paid_amount.to_f > 0 #|| paid_amount != "0.0"
|
||||
table_update_status(sObj)
|
||||
table_update_status(sale)
|
||||
update_shift
|
||||
elsif method_status && paid_amount.to_f == 0 && is_credit == 0
|
||||
table_update_status(sObj)
|
||||
elsif paid_amount.to_f == 0 && !is_credit
|
||||
table_update_status(sale)
|
||||
update_shift
|
||||
end
|
||||
end
|
||||
@@ -745,7 +716,8 @@ class SalePayment < ApplicationRecord
|
||||
|
||||
# update for shift with credit payment
|
||||
def update_shift_for_credit_payment
|
||||
shift = ShiftSale.find_by_id(self.sale.shift_sale_id)
|
||||
shift_credit = ShiftSale.find_by_id(self.sale.shift_sale_id)
|
||||
shift = ShiftSale.find_by_id(ShiftSale.current_shift)
|
||||
if !shift.nil?
|
||||
credit_payment_left = get_credit_payment_left[0].payment_amount.to_f
|
||||
if self.payment_method == "cash"
|
||||
@@ -763,41 +735,28 @@ class SalePayment < ApplicationRecord
|
||||
shift.other_sales = shift.other_sales.to_f + self.received_amount.to_f
|
||||
end
|
||||
if credit_payment_left == 0 || credit_payment_left >= self.received_amount.to_f
|
||||
shift.credit_sales = shift.credit_sales.to_f - self.received_amount.to_f
|
||||
if shift.id == shift_credit.id
|
||||
shift.credit_sales = shift_credit.credit_sales.to_f - self.received_amount.to_f
|
||||
end
|
||||
|
||||
else
|
||||
shift.credit_sales = shift.credit_sales.to_f - (self.received_amount.to_f + credit_payment_left)
|
||||
shift.credit_sales = shift_credit.credit_sales.to_f - (self.received_amount.to_f + credit_payment_left)
|
||||
end
|
||||
shift.save
|
||||
end
|
||||
end
|
||||
|
||||
def table_update_status(sale_obj)
|
||||
status = true
|
||||
sale_count = 0
|
||||
if booking = sale_obj.bookings[0]
|
||||
if booking.dining_facility_id.to_i > 0
|
||||
puts "Update staus 1"
|
||||
if booking = sale_obj.booking
|
||||
puts "Update staus 2"
|
||||
if booking.dining_facility
|
||||
puts "Update staus 3"
|
||||
table = booking.dining_facility
|
||||
if Booking.left_joins(:sale).where(dining_facility_id: booking.dining_facility_id).where.not(booking_status: 'moved').where("sales.sale_status NOT IN ('completed', 'void', 'spoile', 'waste') OR sales.sale_status IS NULL").exists?
|
||||
status = false
|
||||
if !table.current_bookings.exists?
|
||||
puts "Update staus 3"
|
||||
table.update_attributes(status: "available")
|
||||
end
|
||||
|
||||
if status
|
||||
table.update_attributes(status: "available")
|
||||
# table.status = "available"
|
||||
# table.save
|
||||
end
|
||||
|
||||
# type = 'payment'
|
||||
#Send to background job for processing
|
||||
# OrderBroadcastJob.perform_later(table,type)
|
||||
#if ENV["SERVER_MODE"] != 'cloud'
|
||||
# if ENV["SERVER_MODE"] == 'cloud'
|
||||
# from = request.subdomain + "." + request.domain
|
||||
# else
|
||||
# from = ""
|
||||
# end
|
||||
# ActionCable.server.broadcast "order_channel",table: table,type:type,from:from
|
||||
#end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -955,13 +914,16 @@ class SalePayment < ApplicationRecord
|
||||
#credit payment query
|
||||
|
||||
def self.get_credit_sales(params)
|
||||
total_payment_amounts = SalePayment.select("sale_payments.sale_id, SUM(sale_payments.payment_amount) as total_payment_amount").group(:sale_id)
|
||||
|
||||
payments = SalePayment.select("sale_payments.sale_id, sale_payments.sale_payment_id, sale_payments.payment_method, sale_payments.payment_amount")
|
||||
.select("SUM(sale_payments.payment_amount) OVER (PARTITION BY sale_payments.sale_id) total_payment_amount")
|
||||
.select("total_payment_amount")
|
||||
.joins("JOIN (#{total_payment_amounts.to_sql}) AS total_payment_amounts ON total_payment_amounts.sale_id = sale_payments.sale_id")
|
||||
|
||||
credit_sales = Sale.select("sales.sale_id, sales.receipt_no, sales.receipt_date as sale_date, sales.cashier_name")
|
||||
.select("sale_payments.sale_payment_id, sale_payments.payment_amount").select("customers.name as customer_name")
|
||||
.joins("JOIN (#{payments.to_sql}) AS sale_payments ON sale_payments.sale_id = sales.sale_id").joins(:customer).joins(:orders)
|
||||
.completed.paid.where("sale_payments.payment_method = 'creditnote' AND sales.grand_total > sale_payments.total_payment_amount - sale_payments.payment_amount").shop
|
||||
.completed.where("sale_payments.payment_method = 'creditnote' AND sales.grand_total > sale_payments.total_payment_amount - sale_payments.payment_amount")
|
||||
.group(:receipt_no)
|
||||
.order(:receipt_date).order(:receipt_no)
|
||||
|
||||
@@ -984,64 +946,29 @@ 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
|
||||
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}'")
|
||||
return query
|
||||
SalePayment.left_joins(:sale_audit).where(sale_id: sale_id)
|
||||
.select("SUM(CASE WHEN sale_payments.payment_method = 'creditnote' THEN sale_payments.payment_amount ELSE 0 END) - SUM(CASE WHEN sale_audits.sale_audit_id IS NOT NULL THEN sale_payments.payment_amount ELSE 0 END) AS payment_amount")
|
||||
end
|
||||
|
||||
def self.get_credit_total_left(sale_id)
|
||||
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
|
||||
WHERE sale_payments.sale_id = '#{sale_id}')) as payment_amount")
|
||||
.where("sale_payments.payment_method = 'creditnote' AND sale_payments.sale_id = '#{sale_id}'")
|
||||
return query
|
||||
SalePayment.left_joins(:sale_audit).where(sale_id: sale_id)
|
||||
.select("SUM(CASE WHEN sale_payments.payment_method = 'creditnote' THEN sale_payments.payment_amount ELSE 0 END) - SUM(CASE WHEN sale_audits.sale_audit_id IS NOT NULL THEN sale_payments.payment_amount ELSE 0 END) AS payment_amount")
|
||||
end
|
||||
|
||||
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
|
||||
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")
|
||||
return query
|
||||
sale_data.sale_payments
|
||||
.joins(:sale_audit)
|
||||
end
|
||||
|
||||
def get_credit_payment_left
|
||||
sql = "SELECT SUM(payment_amount)
|
||||
from sale_payments
|
||||
join sale_audits on SUBSTRING_INDEX(remark,'||',1)=sale_payment_id
|
||||
where sale_payments.sale_id = '#{self.sale_id}'"
|
||||
|
||||
query = SalePayment.select("(SUM(payment_amount) - (#{sql})) as payment_amount")
|
||||
.where("sale_payments.payment_method = 'creditnote' AND sale_payments.sale_id = '#{self.sale_id}'")
|
||||
return query
|
||||
SalePayment.left_joins(:sale_audit).where(sale_id: sale_id)
|
||||
.select("SUM(CASE WHEN sale_payments.payment_method = 'creditnote' THEN sale_payments.payment_amount ELSE 0 END) - SUM(CASE WHEN sale_audits.sale_audit_id IS NOT NULL THEN sale_payments.payment_amount ELSE 0 END) AS payment_amount")
|
||||
end
|
||||
|
||||
def self.get_sale_payments(sale_data)
|
||||
sql = "SELECT SUM(payment_amount)
|
||||
FROM sale_payments where payment_method='creditnote'
|
||||
and sale_id='#{sale_data.sale_id}'"
|
||||
sql1 = "SELECT CASE WHEN s.amount_changed > 0 and (s.amount_received - s.amount_changed) = s.grand_total THEN ( SELECT SUM(payment_amount)
|
||||
FROM sale_payments where payment_method='creditnote'
|
||||
and sale_id='#{sale_data.sale_id}'"
|
||||
|
||||
query = sale_data.sale_payments
|
||||
.where("CASE WHEN ((#{sql}) - (#{sql1})
|
||||
ELSE SUM(payment_amount) END
|
||||
FROM sale_payments
|
||||
JOIN sales s ON s.sale_id=sale_payments.sale_id
|
||||
JOIN sale_audits sa
|
||||
ON SUBSTRING_INDEX(sa.remark,'||',1)=sale_payment_id
|
||||
where sa.sale_id='#{sale_data.sale_id}')) = 0
|
||||
THEN payment_method!='creditnote' ELSE 1 END")
|
||||
.group("sale_payments.sale_payment_id")
|
||||
return query
|
||||
sale_data.sale_payments
|
||||
.merge(SalePayment.where.not(payment_method: 'creditnote')
|
||||
.or(SalePayment.where.not(SalePayment.arel_table[:payment_amount].lteq(sale_data.sale_payments.joins(:sale_audit).sum(:payment_amount)))))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
Reference in New Issue
Block a user