mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
131 lines
3.5 KiB
Ruby
131 lines
3.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Reporting
|
|
module Reports
|
|
module BulkCoop
|
|
class Base < ReportTemplate
|
|
def message
|
|
I18n.t("spree.admin.reports.hidden_customer_details_tip")
|
|
end
|
|
|
|
def search
|
|
report_line_items.orders
|
|
end
|
|
|
|
def table_items
|
|
report_line_items.list(line_item_includes)
|
|
end
|
|
|
|
private
|
|
|
|
def line_item_includes
|
|
[
|
|
{
|
|
order: [:bill_address],
|
|
variant: [:product, :supplier]
|
|
}
|
|
]
|
|
end
|
|
|
|
def order_permissions
|
|
@order_permissions ||= ::Permissions::Order.new(@user)
|
|
end
|
|
|
|
def report_line_items
|
|
@report_line_items ||= Reporting::LineItems.new(
|
|
order_permissions,
|
|
@params,
|
|
CompleteVisibleOrdersQuery.new(order_permissions).call
|
|
)
|
|
end
|
|
|
|
def empty_cell(_line_items)
|
|
""
|
|
end
|
|
|
|
def full_name(line_items)
|
|
line_items.first.full_name
|
|
end
|
|
|
|
def group_buy_unit_size(line_items)
|
|
unit_size = line_items.first.variant.product.group_buy_unit_size || 0.0
|
|
unit_size / (line_items.first.variant.variant_unit_scale || 1)
|
|
end
|
|
|
|
def max_quantity_excess(line_items)
|
|
max_quantity_amount(line_items) - total_amount(line_items)
|
|
end
|
|
|
|
def max_quantity_amount(line_items)
|
|
line_items.map do |line_item|
|
|
max_quantity = [line_item.max_quantity || 0, line_item.quantity || 0].max
|
|
max_quantity * scaled_unit_value(line_item.variant)
|
|
end.sum(&:to_i)
|
|
end
|
|
|
|
def scaled_unit_value(variant)
|
|
(variant.unit_value || 0) / (variant.variant_unit_scale || 1)
|
|
end
|
|
|
|
def option_value_value(line_items)
|
|
VariantUnits::OptionValueNamer.new(line_items.first).value
|
|
end
|
|
|
|
def option_value_unit(line_items)
|
|
VariantUnits::OptionValueNamer.new(line_items.first).unit
|
|
end
|
|
|
|
def order_billing_address_name(line_items)
|
|
billing_address = line_items.first.order.bill_address
|
|
"#{billing_address.firstname} #{billing_address.lastname}"
|
|
end
|
|
|
|
def product_group_buy_unit_size(line_items)
|
|
line_items.first.product.group_buy_unit_size || 0.0
|
|
end
|
|
|
|
def product_name(line_items)
|
|
line_items.first.product.name
|
|
end
|
|
|
|
def remainder(line_items)
|
|
remainder = total_available(line_items) - total_amount(line_items)
|
|
remainder >= 0 ? remainder : ''
|
|
end
|
|
|
|
def total_amount(line_items)
|
|
line_items.map { |li| scaled_final_weight_volume(li) }.sum(&:to_f)
|
|
end
|
|
|
|
def scaled_final_weight_volume(line_item)
|
|
(line_item.final_weight_volume || 0) / (line_item.variant.variant_unit_scale || 1)
|
|
end
|
|
|
|
def total_available(line_items)
|
|
units_required(line_items) * group_buy_unit_size(line_items)
|
|
end
|
|
|
|
def units_required(line_items)
|
|
if group_buy_unit_size(line_items).zero?
|
|
0
|
|
else
|
|
( total_amount(line_items) / group_buy_unit_size(line_items) ).ceil
|
|
end
|
|
end
|
|
|
|
def variant_product_group_buy_unit_size_f(line_items)
|
|
group_buy_unit_size(line_items).to_i
|
|
end
|
|
|
|
def variant_product_name(line_items)
|
|
line_items.first.variant.product.name
|
|
end
|
|
|
|
def weight_from_unit_value(line_items)
|
|
line_items.first.weight_from_unit_value || 0
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|