Files
openfoodnetwork/lib/reporting/reports/customers/base.rb
2025-10-31 15:20:44 +11:00

88 lines
2.8 KiB
Ruby

# frozen_string_literal: true
module Reporting
module Reports
module Customers
class Base < ReportTemplate
def query_result
filter(Spree::Order.managed_by(@user)
.distributed_by_user(@user)
.complete.not_state(:canceled)
.order(:id))
.group_by do |order|
{
customer_id: order.customer_id || order.email,
hub_id: order.distributor_id,
}
end.values
end
# rubocop:disable Metrics/AbcSize
def columns
{
first_name: proc { |orders| last_completed_order(orders).billing_address.firstname },
last_name: proc { |orders| last_completed_order(orders).billing_address.lastname },
billing_address: proc { |orders|
last_completed_order(orders).billing_address.address_and_city
},
email: proc { |orders| last_completed_order(orders).email },
phone: proc { |orders| last_completed_order(orders).billing_address.phone },
hub: proc { |orders| last_completed_order(orders).distributor&.name },
hub_address: proc { |orders|
last_completed_order(orders).distributor&.address&.address_and_city
},
shipping_method: proc { |orders| last_completed_order(orders).shipping_method&.name },
total_orders: proc { |orders| orders.count },
total_incl_tax: proc { |orders| orders.map(&:total).sum(&:to_f) },
last_completed_order_date: proc { |orders| last_completed_order_date(orders) },
}
end
# rubocop:enable Metrics/AbcSize
def filter(orders)
filter_to_completed_at filter_to_distributor filter_to_order_cycle orders
end
def skip_duplicate_rows?
true
end
private
def filter_to_completed_at(orders)
min = params.dig(:q, :completed_at_gt).presence&.in_time_zone
max = params.dig(:q, :completed_at_lt).presence&.in_time_zone
return orders if min.nil? && max.nil?
orders.where(completed_at: [min..max])
end
def filter_to_distributor(orders)
if params[:distributor_id].to_i > 0
orders.where(distributor_id: params[:distributor_id])
else
orders
end
end
def filter_to_order_cycle(orders)
if params[:order_cycle_id].to_i > 0
orders.where(order_cycle_id: params[:order_cycle_id])
else
orders
end
end
def last_completed_order(orders)
orders.max_by(&:completed_at)
end
def last_completed_order_date(orders)
last_completed_order(orders).completed_at&.to_date
end
end
end
end
end