Report Refactor 3: Payments

This commit is contained in:
Sebastian Castro
2022-04-03 17:27:08 +02:00
committed by Jean-Baptiste Bellet
parent 93751f9ccb
commit 3808398807
5 changed files with 98 additions and 140 deletions

View File

@@ -0,0 +1,17 @@
# frozen_string_literal: true
module Reporting
module Reports
module Payments
class Base < ReportObjectTemplate
def search
Spree::Order.complete.not_state(:canceled).managed_by(@user).ransack(params[:q])
end
def query_result
search.result.group_by { |order| [order.payment_state, order.distributor] }.values
end
end
end
end
end

View File

@@ -0,0 +1,22 @@
# frozen_string_literal: true
module Reporting
module Reports
module Payments
class ItemisedPaymentTotals < Base
def columns
{
payment_state: proc { |orders| orders.first.payment_state },
distributor: proc { |orders| orders.first.distributor.name },
product_total_price: proc { |orders| orders.to_a.sum(&:item_total) },
shipping_total_price: proc { |orders| orders.sum(&:ship_total) },
outstanding_balance_price: proc do |orders|
orders.sum { |order| order.outstanding_balance.to_f }
end,
total_price: proc { |orders| orders.map(&:total).sum }
}
end
end
end
end
end

View File

@@ -0,0 +1,32 @@
# frozen_string_literal: true
module Reporting
module Reports
module Payments
class PaymentTotals < Base
def columns
{
payment_state: proc { |orders| orders.first.payment_state },
distributor: proc { |orders| orders.first.distributor.name },
product_total_price: proc { |orders| orders.to_a.sum(&:item_total) },
shipping_total_price: proc { |orders| orders.sum(&:ship_total) },
total_price: proc { |orders| orders.map(&:total).sum },
eft_price: proc { |orders| total_by_payment_method(orders, "EFT") },
paypal_price: proc { |orders| total_by_payment_method(orders, "PayPal") },
outstanding_balance_price: proc { |orders|
orders.sum{ |order| order.outstanding_balance.to_f }
}
}
end
private
def total_by_payment_method(orders, pay_method)
orders.map(&:payments).flatten.select { |payment|
payment.completed? && payment.payment_method.name.to_s.include?(pay_method)
}.sum(&:amount)
end
end
end
end
end

View File

@@ -0,0 +1,27 @@
# frozen_string_literal: true
module Reporting
module Reports
module Payments
class PaymentsByPaymentType < Base
def query_result
payments = search.result.includes(payments: :payment_method).map do |order|
order.payments.select(&:completed?)
end.flatten
payments.group_by { |payment|
[payment.order.payment_state, payment.order.distributor, payment.payment_method]
}.values
end
def columns
{
payment_state: proc { |payments| payments.first.order.payment_state },
distributor: proc { |payments| payments.first.order.distributor.name },
payment_type: proc { |payments| payments.first.payment_method.name },
total_price: proc { |payments| payments.sum(&:amount) }
}
end
end
end
end
end

View File

@@ -1,140 +0,0 @@
# frozen_string_literal: true
module Reporting
module Reports
module Payments
class PaymentsReport < ReportObjectTemplate
def table_headers
case params[:report_subtype]
when "payments_by_payment_type"
I18n.t(:report_header_payment_type)
[I18n.t(:report_header_payment_state), I18n.t(:report_header_distributor), I18n.t(:report_header_payment_type),
I18n.t(:report_header_total_price, currency: currency_symbol)]
when "itemised_payment_totals"
[I18n.t(:report_header_payment_state), I18n.t(:report_header_distributor),
I18n.t(:report_header_product_total_price, currency: currency_symbol),
I18n.t(:report_header_shipping_total_price, currency: currency_symbol),
I18n.t(:report_header_outstanding_balance_price, currency: currency_symbol),
I18n.t(:report_header_total_price, currency: currency_symbol)]
when "payment_totals"
[I18n.t(:report_header_payment_state), I18n.t(:report_header_distributor),
I18n.t(:report_header_product_total_price, currency: currency_symbol),
I18n.t(:report_header_shipping_total_price, currency: currency_symbol),
I18n.t(:report_header_total_price, currency: currency_symbol),
I18n.t(:report_header_eft_price, currency: currency_symbol),
I18n.t(:report_header_paypal_price, currency: currency_symbol),
I18n.t(:report_header_outstanding_balance_price, currency: currency_symbol)]
else
[I18n.t(:report_header_payment_state), I18n.t(:report_header_distributor), I18n.t(:report_header_payment_type),
I18n.t(:report_header_total_price, currency: currency_symbol)]
end
end
def search
Spree::Order.complete.not_state(:canceled).managed_by(@user).ransack(params[:q])
end
def table_items
orders = search.result
payments = orders.includes(:payments).map do |order|
order.payments.select(&:completed?)
end.flatten
case params[:report_subtype]
when "payments_by_payment_type"
payments
when "itemised_payment_totals"
orders
when "payment_totals"
orders
else
payments
end
end
def table_rows
order_grouper = Reporting::OrderGrouper.new rules, columns, self
order_grouper.table(table_items)
end
def rules
case params[:report_subtype]
when "payments_by_payment_type"
[{ group_by: proc { |payment| payment.order.payment_state },
sort_by: proc { |payment_state| payment_state } },
{ group_by: proc { |payment| payment.order.distributor },
sort_by: proc { |distributor| distributor.name } },
{ group_by: proc { |payment|
Spree::PaymentMethod.unscoped {
payment.payment_method
}
},
sort_by: proc { |method| method.name } }]
when "itemised_payment_totals"
[{ group_by: proc { |order| order.payment_state },
sort_by: proc { |payment_state| payment_state } },
{ group_by: proc { |order| order.distributor },
sort_by: proc { |distributor| distributor.name } }]
when "payment_totals"
[{ group_by: proc { |order| order.payment_state },
sort_by: proc { |payment_state| payment_state } },
{ group_by: proc { |order| order.distributor },
sort_by: proc { |distributor| distributor.name } }]
else
[{ group_by: proc { |payment| payment.order.payment_state },
sort_by: proc { |payment_state| payment_state } },
{ group_by: proc { |payment| payment.order.distributor },
sort_by: proc { |distributor| distributor.name } },
{ group_by: proc { |payment| payment.payment_method },
sort_by: proc { |method| method.name } }]
end
end
def columns
case params[:report_subtype]
when "payments_by_payment_type"
[proc { |payments| payments.first.order.payment_state },
proc { |payments| payments.first.order.distributor.name },
proc { |payments| payments.first.payment_method.name },
proc { |payments| payments.sum(&:amount) }]
when "itemised_payment_totals"
[proc { |orders| orders.first.payment_state },
proc { |orders| orders.first.distributor.name },
proc { |orders| orders.to_a.sum(&:item_total) },
proc { |orders| orders.sum(&:ship_total) },
proc { |orders| orders.sum{ |order| order.outstanding_balance.to_f } },
proc { |orders| orders.map(&:total).sum }]
when "payment_totals"
[proc { |orders| orders.first.payment_state },
proc { |orders| orders.first.distributor.name },
proc { |orders| orders.to_a.sum(&:item_total) },
proc { |orders| orders.sum(&:ship_total) },
proc { |orders| orders.map(&:total).sum },
proc { |orders|
orders.sum { |o|
o.payments.select { |payment|
payment.completed? &&
(payment.payment_method.name.to_s.include? "EFT")
}.sum(&:amount)
}
},
proc { |orders|
orders.sum { |o|
o.payments.select { |payment|
payment.completed? &&
(payment.payment_method.name.to_s.include? "PayPal")
}.sum(&:amount)
}
},
proc { |orders| orders.sum{ |order| order.outstanding_balance.to_f } }]
else
[proc { |payments| payments.first.order.payment_state },
proc { |payments| payments.first.order.distributor.name },
proc { |payments| payments.first.payment_method.name },
proc { |payments| payments.sum(&:amount) }]
end
end
end
end
end
end