diff --git a/lib/reporting/reports/payments/base.rb b/lib/reporting/reports/payments/base.rb new file mode 100644 index 0000000000..aa3b74701c --- /dev/null +++ b/lib/reporting/reports/payments/base.rb @@ -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 diff --git a/lib/reporting/reports/payments/itemised_payment_totals.rb b/lib/reporting/reports/payments/itemised_payment_totals.rb new file mode 100644 index 0000000000..b571b2b97d --- /dev/null +++ b/lib/reporting/reports/payments/itemised_payment_totals.rb @@ -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 diff --git a/lib/reporting/reports/payments/payment_totals.rb b/lib/reporting/reports/payments/payment_totals.rb new file mode 100644 index 0000000000..f194aa2aa4 --- /dev/null +++ b/lib/reporting/reports/payments/payment_totals.rb @@ -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 diff --git a/lib/reporting/reports/payments/payments_by_payment_type.rb b/lib/reporting/reports/payments/payments_by_payment_type.rb new file mode 100644 index 0000000000..766e0efa20 --- /dev/null +++ b/lib/reporting/reports/payments/payments_by_payment_type.rb @@ -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 diff --git a/lib/reporting/reports/payments/payments_report.rb b/lib/reporting/reports/payments/payments_report.rb deleted file mode 100644 index c7f02b6b12..0000000000 --- a/lib/reporting/reports/payments/payments_report.rb +++ /dev/null @@ -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