diff --git a/app/controllers/spree/admin/reports_controller_decorator.rb b/app/controllers/spree/admin/reports_controller_decorator.rb index 78026fad1e..852d35f5ce 100644 --- a/app/controllers/spree/admin/reports_controller_decorator.rb +++ b/app/controllers/spree/admin/reports_controller_decorator.rb @@ -72,14 +72,38 @@ Spree::Admin::ReportsController.class_eval do end def order_cycle_management + + # -- Prepare parameters + params[:q] ||= {} + if params[:q][:completed_at_gt].blank? + params[:q][:completed_at_gt] = Time.zone.now.beginning_of_month + else + params[:q][:completed_at_gt] = Time.zone.parse(params[:q][:completed_at_gt]) rescue Time.zone.now.beginning_of_month + end + if params[:q] && !params[:q][:completed_at_lt].blank? + params[:q][:completed_at_lt] = Time.zone.parse(params[:q][:completed_at_lt]) rescue "" + end + params[:q][:meta_sort] ||= "completed_at.desc" + + # -- Prepare form options + my_distributors = Enterprise.is_distributor.managed_by(spree_current_user) + my_suppliers = Enterprise.is_primary_producer.managed_by(spree_current_user) + + # My distributors and any distributors distributing products I supply + @distributors = my_distributors | Enterprise.with_distributed_products_outer.merge(Spree::Product.in_any_supplier(my_suppliers)) + # My suppliers and any suppliers supplying products I distribute + @suppliers = my_suppliers | my_distributors.map { |d| Spree::Product.in_distributor(d) }.flatten.map(&:supplier).uniq + @order_cycles = OrderCycle.active_or_complete.accessible_by(spree_current_user).order('orders_close_at DESC') + @report_types = REPORT_TYPES[:order_cycle_management] @report_type = params[:report_type] + + # -- Build Report with Order Grouper @report = OpenFoodNetwork::OrderCycleManagementReport.new spree_current_user, params + @table = @report.table_items + csv_file_name = "#{params[:report_type]}_#{timestamp}.csv" - @search = Spree::Order.complete.not_state(:canceled).managed_by(spree_current_user).search(params[:q]) - @orders = @search.result - - render_report(@report.header, @report.table, params[:csv], "order_cycle_management_#{timestamp}.csv") + render_report(@report.header, @table, params[:csv], "order_cycle_management_#{timestamp}.csv") end def packing diff --git a/app/views/spree/admin/reports/order_cycle_management.html.haml b/app/views/spree/admin/reports/order_cycle_management.html.haml index 418cba8b75..5ab379a669 100644 --- a/app/views/spree/admin/reports/order_cycle_management.html.haml +++ b/app/views/spree/admin/reports/order_cycle_management.html.haml @@ -1,47 +1,46 @@ -= form_tag spree.order_cycle_management_admin_reports_url do |f| - %br - = label_tag nil, "Order Cycle: " - = select_tag(:order_cycle_id, - options_for_select(report_order_cycle_options(@order_cycles), params[:order_cycle_id]), - include_blank: true) - %br - %br - = label_tag nil, "Payment Methods (hold Ctrl to select multiple payment methods)" - %br += form_for @report.search, :url => spree.order_cycle_management_admin_reports_path do |f| + = render 'date_range_form', f: f - = select_tag(:payment_method_name, - options_for_select(report_payment_method_options(@orders), params[:payment_method_name]), - multiple: true, include_blank: true, size: 10) - %br - %br - = label_tag nil, "Shipping Method: " - = select_tag(:shipping_method_name, - options_for_select(report_shipping_method_options(@orders), params[:shipping_method_name]), - include_blank: true) - %br - %br - = label_tag nil, "Report Type: " - = select_tag(:report_type, options_for_select(@report_types, @report_type)) - %br - %br - = check_box_tag :csv - = label_tag :csv, "Download as csv" - %br - %br + .row + .alpha.two.columns= label_tag nil, "Hubs: " + .omega.fourteen.columns= f.collection_select(:distributor_id_in, @distributors, :id, :name, {}, {class: "select2 fullwidth", multiple: true}) + + .row + .alpha.two.columns= label_tag nil, "Order Cycles: " + .omega.fourteen.columns + = f.select(:order_cycle_id_in, report_order_cycle_options(@order_cycles), {selected: params[:q][:order_cycle_id_in]}, {class: "select2 fullwidth", multiple: true}) + + .row + .alpha.two.columns= label_tag nil, "Payment Methods: " + .omega.fourteen.columns= select_tag(:payment_method_in, options_for_select(report_payment_method_options(@report.orders), params[:payment_method_in]), {class: "select2 fullwidth", multiple: true}) + + .row + .alpha.two.columns= label_tag nil, "Shipping Methods: " + .omega.fourteen.columns= select_tag(:shipping_method_in, options_for_select(report_shipping_method_options(@report.orders), params[:shipping_method_in]), {class: "select2 fullwidth", multiple: true}) + + .row + .alpha.two.columns= label_tag nil, "Report Type: " + .omega.fourteen.columns= select_tag(:report_type, options_for_select(@report_types, @report_type)) + + .row + = check_box_tag :csv + = label_tag :csv, "Download as csv" + + .row = button t(:search) %br %br -%table#listing_order_payment_methods.index +%table#listing_ocm_orders.index %thead %tr{'data-hook' => "orders_header"} - @report.header.each do |heading| %th=heading %tbody - - @report.table.each do |row| + - @table.each do |row| %tr - row.each do |column| %td= column - - if @report.table.empty? + - if @table.empty? %tr %td{:colspan => "2"}= t(:none) diff --git a/lib/open_food_network/order_cycle_management_report.rb b/lib/open_food_network/order_cycle_management_report.rb index b6e65f0a61..8ee9166cb3 100644 --- a/lib/open_food_network/order_cycle_management_report.rb +++ b/lib/open_food_network/order_cycle_management_report.rb @@ -16,24 +16,28 @@ module OpenFoodNetwork end end - def table + def search + Spree::Order.complete.where("spree_orders.state != ?", :canceled).managed_by(@user).search(params[:q]) + end + + def orders + filter search.result + end + + def table_items if is_payment_methods? orders.map { |o| payment_method_row o } else orders.map { |o| delivery_row o } - end + end end - def orders - filter Spree::Order.managed_by(@user).distributed_by_user(@user).complete.where("spree_orders.state != ?", :canceled) - end - - def filter(orders) - filter_to_order_cycle filter_to_payment_method filter_to_shipping_method orders + def filter(search_result) + filter_to_payment_method filter_to_shipping_method search_result end - private + private def payment_method_row(order) ba = order.billing_address @@ -70,32 +74,28 @@ module OpenFoodNetwork ] end - def filter_to_payment_method(orders) - if params[:payment_method_name].present? - orders.with_payment_method_name(params[:payment_method_name]) + def filter_to_payment_method(search_result) + if params[:payment_method_in].present? + search_result.with_payment_method_name(params[:payment_method_in]) else - orders + search_result end end - def filter_to_shipping_method(orders) - if params[:shipping_method_name].present? - orders.joins(:shipping_method).where("spree_shipping_methods.name = ?", params[:shipping_method_name]) + def filter_to_shipping_method(search_result) + if params[:shipping_method_in].present? + search_result.joins(:shipping_method).where("spree_shipping_methods.name = ?", params[:shipping_method_in]) else - orders - end - end - - def filter_to_order_cycle(orders) - if params[:order_cycle_id].present? - orders.where(order_cycle_id: params[:order_cycle_id]) - else - orders + search_result end end def has_temperature_controlled_items?(order) - order.line_items.any? { |line_item| line_item.product.shipping_category.andand.temperature_controlled } + if order.line_items.any? { |line_item| line_item.product.shipping_category.andand.temperature_controlled } + "Yes" + else + "No" + end end def is_payment_methods?