class Centra::OrderStats
Attributes
order_filter[R]
result[R]
Public Class Methods
calculate(centra_data)
click to toggle source
# File lib/centra/order_stats.rb, line 6 def self.calculate(centra_data) new(centra_data).calculate end
new(centra_data, order_filter = OrderFilter.new)
click to toggle source
# File lib/centra/order_stats.rb, line 12 def initialize(centra_data, order_filter = OrderFilter.new) @data = centra_data @order_filter = order_filter @result = nil end
Public Instance Methods
calculate()
click to toggle source
# File lib/centra/order_stats.rb, line 18 def calculate return self if @result orders_per_email = Hash.new(0) currencies = Set.new payment_method_codes = Set.new billing_countries = Set.new total_revenue = 0 total_pcs = 0 first_order_date = Time.new(3000, 1, 1) last_order_date = Time.new(1, 1, 1) total_orders_in_stats = 0 @data.each_order do |order| next unless order_filter.allow?(order) total_orders_in_stats += 1 email = order.delivery_email orders_per_email[email] += 1 currencies << order.currency payment_method_codes << order.payment_method_code billing_countries << order.billing_country order_date = order.order_date first_order_date = order_date if first_order_date > order_date last_order_date = order_date if last_order_date < order_date total_revenue += order.total_order_value_sek total_pcs += order.pcs end total_orders = @data.rows.length total_unique_emails = orders_per_email.keys.length total_currencies = currencies.length @result = { orders_per_email: orders_per_email, currencies: currencies, payment_method_codes: payment_method_codes, billing_countries: billing_countries, first_order_date: first_order_date, last_order_date: last_order_date, total_revenue: total_revenue, total_pcs: total_pcs, total_orders: total_orders, total_orders_in_stats: total_orders_in_stats, total_unique_emails: total_unique_emails, total_currencies: total_currencies, avg_order_value: total_revenue / total_orders.to_f, avg_value_per_email: total_revenue / total_unique_emails.to_f, avg_order_per_email: total_orders / total_unique_emails.to_f, avg_pcs_per_order: total_pcs / total_orders.to_f, } self end