require "open_food_network/reports/line_items" module OpenFoodNetwork class PackingReport attr_reader :params def initialize(user, params = {}, render_table = false) @params = params @user = user @render_table = render_table end def header if is_by_customer? [ I18n.t(:report_header_hub), I18n.t(:report_header_code), I18n.t(:report_header_first_name), I18n.t(:report_header_last_name), I18n.t(:report_header_supplier), I18n.t(:report_header_product), I18n.t(:report_header_variant), I18n.t(:report_header_quantity), I18n.t(:report_header_temp_controlled), ] else [ I18n.t(:report_header_hub), I18n.t(:report_header_supplier), I18n.t(:report_header_code), I18n.t(:report_header_first_name), I18n.t(:report_header_last_name), I18n.t(:report_header_product), I18n.t(:report_header_variant), I18n.t(:report_header_quantity), I18n.t(:report_header_temp_controlled), ] end end def search Reports::LineItems.search_orders(permissions, params) end def table_items return [] unless @render_table Reports::LineItems.list(permissions, params) end def rules if is_by_customer? [ { group_by: proc { |line_item| line_item.order.distributor }, sort_by: proc { |distributor| distributor.name } }, { group_by: proc { |line_item| line_item.order }, sort_by: proc { |order| order.bill_address.lastname }, summary_columns: [proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| I18n.t('admin.reports.total_items') }, proc { |_line_items| "" }, proc { |line_items| line_items.sum(&:quantity) }, proc { |_line_items| "" }] }, { group_by: proc { |line_item| line_item.product.supplier }, sort_by: proc { |supplier| supplier.name } }, { group_by: proc { |line_item| line_item.product }, sort_by: proc { |product| product.name } }, { group_by: proc { |line_item| line_item.full_name }, sort_by: proc { |full_name| full_name } } ] else [{ group_by: proc { |line_item| line_item.order.distributor }, sort_by: proc { |distributor| distributor.name } }, { group_by: proc { |line_item| line_item.product.supplier }, sort_by: proc { |supplier| supplier.name }, summary_columns: [proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| "" }, proc { |_line_items| I18n.t('admin.reports.total_items') }, proc { |_line_items| "" }, proc { |line_items| line_items.sum(&:quantity) }, proc { |_line_items| "" }] }, { group_by: proc { |line_item| line_item.product }, sort_by: proc { |product| product.name } }, { group_by: proc { |line_item| line_item.full_name }, sort_by: proc { |full_name| full_name } }, { group_by: proc { |line_item| line_item.order }, sort_by: proc { |order| order.bill_address.lastname } }] end end def columns if is_by_customer? [proc { |line_items| line_items.first.order.distributor.name }, proc { |line_items| customer_code(line_items.first.order.email) }, proc { |line_items| line_items.first.order.bill_address.firstname }, proc { |line_items| line_items.first.order.bill_address.lastname }, proc { |line_items| line_items.first.product.supplier.name }, proc { |line_items| line_items.first.product.name }, proc { |line_items| line_items.first.full_name }, proc { |line_items| line_items.sum(&:quantity) }, proc { |line_items| is_temperature_controlled?(line_items.first) }] else [ proc { |line_items| line_items.first.order.distributor.name }, proc { |line_items| line_items.first.product.supplier.name }, proc { |line_items| customer_code(line_items.first.order.email) }, proc { |line_items| line_items.first.order.bill_address.firstname }, proc { |line_items| line_items.first.order.bill_address.lastname }, proc { |line_items| line_items.first.product.name }, proc { |line_items| line_items.first.full_name }, proc { |line_items| line_items.sum(&:quantity) }, proc { |line_items| is_temperature_controlled?(line_items.first) } ] end end private def permissions return @permissions unless @permissions.nil? @permissions = OpenFoodNetwork::Permissions.new(@user) end def is_temperature_controlled?(line_item) if line_item.product.shipping_category.andand.temperature_controlled "Yes" else "No" end end def is_by_customer? params[:report_type] == "pack_by_customer" end def customer_code(email) customer = Customer.where(email: email).first customer.nil? ? "" : customer.code end end end