optimize query for credit payment report

This commit is contained in:
Thein Lin Kyaw
2019-11-14 18:25:48 +06:30
parent 8ebeff9477
commit dd6e8142b4
5 changed files with 118 additions and 128 deletions

View File

@@ -751,7 +751,6 @@ class Sale < ApplicationRecord
end end
def self.daily_sales_list(from,to) def self.daily_sales_list(from,to)
sales = select(" sales = select("
sales.*, sales.*,
SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount, SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount,
@@ -766,8 +765,9 @@ def self.daily_sales_list(from,to)
SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount,
SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount,
SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount,
CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount else 0 end) < sales.grand_total CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount end) < sales.grand_total
THEN SUM(case when sale_payments.payment_method = 'creditnote' then sale_payments.payment_amount else 0 end) ELSE 0 END as credit_amount, THEN sales.grand_total - SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount end)
ELSE 0 END as credit_amount,
SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount,
SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount")
.joins("LEFT JOIN sale_payments on sales.sale_status != 'void' AND sale_payments.sale_id = sales.sale_id AND DATE(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30')) = DATE(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'))") .joins("LEFT JOIN sale_payments on sales.sale_status != 'void' AND sale_payments.sale_id = sales.sale_id AND DATE(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30')) = DATE(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'))")
@@ -1104,73 +1104,64 @@ def self.get_shift_sales_by_receipt_no_detail(shift_sale_range,shift,from,to,pay
end end
def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,order_source) def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,order_source)
sub_query = "SELECT (CASE WHEN SUM(payment_amount) > 0 order_sources = Order.select("sale_orders.sale_id, orders.source")
THEN DATE_FORMAT(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30'),'%d %b %y %h:%i%p') ELSE '-' END) .joins(:sale_orders).to_sql
FROM `sale_payments`
INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id
WHERE sale_audits.sale_id = s.sale_id"
sub_query1 = "SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) - credit_payments = SalePayment.select("
(SUM(payment_amount) - (SELECT SUM(payment_amount) FROM sale_payments WHERE payment_method='creditnote' AND sale_id=s.sale_id)) ELSE 0 END) sales.sale_id,
FROM `sale_payments` DATE_FORMAT(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30'),'%d %b %y %h:%i%p') as credit_payment_receipt_date,
INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id sale_payments.payment_amount as credit_payment,
WHERE sale_audits.sale_id = s.sale_id" employees.name as credit_payment_cashier_name,
CONCAT(DATE_FORMAT(CONVERT_TZ(shift_started_at,'+00:00','+06:30'),'%d %b %y %h:%i%p'),' - ',DATE_FORMAT(CONVERT_TZ(shift_closed_at,'+00:00','+06:30'),'%d %b %y %h:%i%p')) as credit_payment_shift_name")
.joins("JOIN sales ON sales.sale_id = sale_payments.sale_id")
.joins("JOIN sale_audits ON sale_audits.sale_id = sales.sale_id AND SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id")
.joins("JOIN shift_sales ON shift_sales.id = sales.shift_sale_id")
.joins("JOIN employees ON employees.id = shift_sales.employee_id").to_sql
sub_query2 = "SELECT (CASE WHEN shift_closed_at IS NOT NULL AND credit_payment > 0 credits = SalePayment.select("
THEN CONCAT(DATE_FORMAT(CONVERT_TZ(shift_started_at,'+00:00','+06:30'),'%d %b %y %h:%i%p'),' - ',DATE_FORMAT(CONVERT_TZ(shift_closed_at,'+00:00','+06:30'),'%d %b %y %h:%i%p')) sale_payments.sale_payment_id,
ELSE '-' END) sale_payments.payment_method,
FROM shift_sales sale_payments.payment_amount,
WHERE shift_sales.id = s.shift_sale_id" sale_payments.payment_status,
sales.sale_id,
sales.receipt_no,
sales.receipt_date as sale_date,
order_sources.source as order_source,
sales.cashier_name,
customers.name as customer_name,
IFNULL(credit_payments.credit_payment_receipt_date, '-') as credit_payment_receipt_date,
IFNULL(credit_payments.credit_payment, 0) as credit_payment,
IFNULL(credit_payments.credit_payment_cashier_name, '-') as credit_payment_cashier_name,
IFNULL(credit_payments.credit_payment_shift_name, '-') as credit_payment_shift_name")
.joins("JOIN sales ON sales.sale_id = sale_payments.sale_id")
.joins("JOIN shift_sales ON shift_sales.id = sales.shift_sale_id")
.joins("JOIN customers ON customers.customer_id = sales.customer_id")
.joins("JOIN (#{order_sources}) order_sources ON order_sources.sale_id = sales.sale_id")
.joins("LEFT JOIN (#{credit_payments}) credit_payments ON credit_payments.sale_id = sales.sale_id")
.where("sale_payments.payment_method= ? AND sales.sale_status = ?", 'creditnote', 'completed')
sub_query3 = "SELECT (CASE WHEN shift_closed_at IS NOT NULL OR shift_closed_at IS NULL AND credit_payment > 0 if order_source.present?
THEN employees.name ELSE '-' END)
FROM shift_sales
INNER JOIN employees ON employees.id=shift_sales.employee_id
WHERE shift_sales.id = s.shift_sale_id"
filter_check = ""
if filter == 'paid'
filter_check = " AND (SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) ELSE 0 END)
FROM `sale_payments`
INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id
WHERE sale_audits.sale_id = s.sale_id) > 0"
elsif filter == 'unpaid'
filter_check = " AND (SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) ELSE 0 END)
FROM `sale_payments`
INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id
WHERE sale_audits.sale_id = s.sale_id) = 0"
end
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)"
if order_source.blank?
source = ""
else
if order_source == "cashier" if order_source == "cashier"
source = "and #{order_source_query}='cashier' or #{order_source_query}='emenu'" credits = credits.where("order_sources.source IN (?)", ['cashier', 'emenu'])
else else
source = "and #{order_source_query}='#{order_source}'" credits = credits.where("order_sources.source = ?", order_source)
end end
end end
query = SalePayment.select("s.receipt_no, sale_payments.*,
SUM(sale_payments.payment_amount) as payment_amount, if filter == 'paid'
s.receipt_date as sale_date, credits = credits.where("credit_payment IS NOT NULL")
#{order_source_query} as order_source, elsif filter == 'unpaid'
s.cashier_name as cashier_name, credits = credits.where("credit_payment IS NULL")
(#{sub_query}) as credit_payment_receipt_date, end
(#{sub_query1}) as credit_payment,
(#{sub_query3}) as credit_payment_cashier_name,
(#{sub_query2}) as credit_payment_shift_name")
.joins("INNER JOIN sales s ON s.sale_id = sale_payments.sale_id")
.joins("INNER JOIN shift_sales ss ON ss.id = s.shift_sale_id")
if shift.present? if shift.present?
query = query.where("sale_payments.payment_method= 'creditnote' and s.sale_status = 'completed' #{filter_check} and s.shift_sale_id in (?) #{source}",shift.to_a) credits = credits.where("sales.shift_sale_id in (?)",shift.to_a)
elsif shift_sale_range.present? elsif shift_sale_range.present?
query = query.where("sale_payments.payment_method='creditnote' and s.sale_status = 'completed' #{filter_check} and s.shift_sale_id in (?) #{source}",shift_sale_range.to_a) credits = credits.where("sales.shift_sale_id in (?)",shift_sale_range.to_a)
else else
query = query.where("sale_payments.payment_method='creditnote' and s.sale_status = 'completed' #{filter_check} and s.receipt_date between ? and ? #{source}",from,to) credits = credits.where("sales.receipt_date between ? and ?",from,to)
end end
query = query.group("s.sale_id") credits = credits.group("sales.sale_id")
end end
def self.get_void_sale(shift,from,to) def self.get_void_sale(shift,from,to)

View File

@@ -81,7 +81,7 @@
<% end %> <% end %>
</td> </td>
<td><%= credit.cashier_name rescue '-' %></td> <td><%= credit.cashier_name rescue '-' %></td>
<td><%= credit.sale.customer.name rescue '-' %></td> <td><%= credit.customer_name rescue '-' %></td>
<td><%= number_with_precision(credit.payment_amount, precision: precision.to_i ,delimiter: delimiter) rescue '-' %></td> <td><%= number_with_precision(credit.payment_amount, precision: precision.to_i ,delimiter: delimiter) rescue '-' %></td>
<td> <td>
<%if credit.credit_payment_shift_name == '-' %> <%if credit.credit_payment_shift_name == '-' %>

View File

@@ -53,7 +53,7 @@
<% end %> <% end %>
</td> </td>
<td><%= credit.cashier_name rescue '-' %></td> <td><%= credit.cashier_name rescue '-' %></td>
<td><%= credit.sale.customer.name rescue '-' %></td> <td><%= credit.customer_name rescue '-' %></td>
<td><%= credit.payment_amount rescue '-' %></td> <td><%= credit.payment_amount rescue '-' %></td>
<td> <td>
<%if credit.credit_payment_shift_name == '-' %> <%if credit.credit_payment_shift_name == '-' %>

View File

@@ -138,8 +138,7 @@
delimiter = "" delimiter = ""
end end
%> %>
<% unless @sale_data.empty? %> <% unless @sale_data.blank? %>
<tbody> <tbody>
<% void = 0 %> <% void = 0 %>
<% mpu = 0 %> <% mpu = 0 %>
@@ -322,7 +321,7 @@
</tr> </tr>
<% total_tax = 0 %> <% total_tax = 0 %>
<% net = 0 %> <% net = 0 %>
<% unless @tax.empty? %> <% unless @tax.blank? %>
<% @tax.each do |tax| <% @tax.each do |tax|
total_tax += tax.tax_amount.to_f %> total_tax += tax.tax_amount.to_f %>
<tr style="font-weight:600;"> <tr style="font-weight:600;">

View File

@@ -76,7 +76,7 @@
delimiter = "" delimiter = ""
end end
%> %>
<% unless @sale_data.empty? %> <% unless @sale_data.blank? %>
<tbody> <tbody>
<% void = 0 %> <% void = 0 %>
@@ -235,7 +235,7 @@
</tr> </tr>
<% total_tax = 0 %> <% total_tax = 0 %>
<% net = 0 %> <% net = 0 %>
<% unless @tax.empty? %> <% unless @tax.blank? %>
<% @tax.each do |tax| <% @tax.each do |tax|
total_tax += tax.tax_amount.to_f %> total_tax += tax.tax_amount.to_f %>
<tr style="font-weight:600;"> <tr style="font-weight:600;">