mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
88 lines
2.8 KiB
Ruby
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
|