mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-27 06:05:19 +00:00
Report Refactor 3: Payments
This commit is contained in:
committed by
Jean-Baptiste Bellet
parent
93751f9ccb
commit
3808398807
17
lib/reporting/reports/payments/base.rb
Normal file
17
lib/reporting/reports/payments/base.rb
Normal 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
|
||||
22
lib/reporting/reports/payments/itemised_payment_totals.rb
Normal file
22
lib/reporting/reports/payments/itemised_payment_totals.rb
Normal 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
|
||||
32
lib/reporting/reports/payments/payment_totals.rb
Normal file
32
lib/reporting/reports/payments/payment_totals.rb
Normal 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
|
||||
27
lib/reporting/reports/payments/payments_by_payment_type.rb
Normal file
27
lib/reporting/reports/payments/payments_by_payment_type.rb
Normal 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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user