class Spree::AdvancedReport::TransactionReport < Spree::AdvancedReport
include ActionView::Helpers::NumberHelper
include ActionView::Helpers::UrlHelper
def name
"Transaction Report"
end
def description
"Top purchasing customers, calculated by revenue"
end
def initialize(params)
super(params)
self.ruportdata = Ruport::Data::Group.new({
:name => "#{self.name} #{self.date_range}",
:column_names => %w[date type id total state]
})
card_listing = {}
orders.each do |order|
order.payments.each do |payment|
# create a direct link for easy inspection
gateway_link = payment.response_code
if payment.payment_method.type == "Spree::Gateway::AuthorizeNetCim" and payment.response_code.present?
gateway_link = link_to(payment.response_code, "https://account.authorize.net/UI/themes/anet/transaction/transactiondetail.aspx?transID=#{payment.response_code}", target: '_blank')
end
if payment.source.class == Spree::Creditcard
credit_cart_type = payment.source.cc_type
else
# it seems as though a previous payment can be used a payment type
# links to the previous payment's credit card
credit_cart_type = payment.source.source.cc_type
end
(card_listing[credit_cart_type] ||= []) << {
"date" => payment.source.created_at.to_formatted_s(:db),
"type" => credit_cart_type.humanize.titlecase,
"id" => gateway_link,
"total" => payment.amount,
"state" => payment.state,
}
end
end
@sales_total = 0
card_listing.keys.sort.each do |card_name|
card_total = card_listing[card_name].map { |c| c["total"] * (c["state"] == 'void' ? 0 : 1) }.sum
@sales_total += card_total
ruportdata << {
"date" => "#{card_name.humanize.titlecase} (#{card_listing[card_name].count}): #{number_to_currency(card_total)}"
}
card_listing[card_name].each do |transaction|
transaction["total"] = number_to_currency(transaction["total"])
ruportdata << transaction
end
end
ruportdata << { "date" => "Sales Total: #{number_to_currency(@sales_total)}" }
# spaces don't seem to work in column names (ruport is old...)
ruportdata.rename_column("date", "Transaction Date")
ruportdata.rename_column("type", "Card Type")
ruportdata.rename_column("id", "Transaction ID")
ruportdata.rename_column("total", "Payment Total")
ruportdata.rename_column("state", "Payment State")
end
def sales_total
@sales_total
end
end