diff --git a/app/controllers/requests_controller.rb b/app/controllers/requests_controller.rb index ce5677da0c..0df37c5993 100644 --- a/app/controllers/requests_controller.rb +++ b/app/controllers/requests_controller.rb @@ -3,39 +3,16 @@ class RequestsController < ApplicationController def index setup_date_range_picker - @requests = current_organization - .ordered_requests - .undiscarded - .during(helpers.selected_range) - .class_filter(filter_params) - @unfulfilled_requests_count = current_organization.requests.where(status: [:pending, :started]).during(helpers.selected_range).class_filter(filter_params).count - @paginated_requests = @requests.includes(:partner).page(params[:page]) - @calculate_product_totals = RequestsTotalItemsService.new(requests: @requests).calculate - @items = current_organization.items.alphabetized.select(:id, :name) - @partners = current_organization.partners.alphabetized.select(:id, :name, :status) - @statuses = Request.statuses.transform_keys(&:humanize) - @partner_users = User.where(id: @paginated_requests.map(&:partner_user_id)).select(:id, :name, :email) - @request_types = Request.request_types.transform_keys(&:humanize) - @selected_request_type = filter_params[:by_request_type] - @selected_request_item = filter_params[:by_request_item_id] - @selected_partner = filter_params[:by_partner] - @selected_status = filter_params[:by_status] + @requests_info = View::Requests.new(params: params, organization: current_organization, helpers: helpers) respond_to do |format| format.html - format.csv { send_data Exports::ExportRequestService.new(@requests).generate_csv, filename: "Requests-#{Time.zone.today}.csv" } + format.csv { send_data Exports::ExportRequestService.new(@requests_info.requests).generate_csv, filename: "Requests-#{Time.zone.today}.csv" } end end def show - @request = current_organization.requests.find(params[:id]) - @item_requests = @request.item_requests.includes(:item) - - @inventory = View::Inventory.new(@request.organization_id) - @default_storage_location = @request.partner.default_storage_location_id || @request.organization.default_storage_location - @location = StorageLocation.find_by(id: @default_storage_location) - - @custom_units = Flipper.enabled?(:enable_packs) && @request.item_requests.any? { |item| item.request_unit } + @request_info = View::RequestInfo.new(params:, organization: current_organization) end # Clicking the "New Distribution" button will set the the request to started diff --git a/app/models/view/donations.rb b/app/models/view/donations.rb index 9518e98047..24e52d16f1 100644 --- a/app/models/view/donations.rb +++ b/app/models/view/donations.rb @@ -31,7 +31,6 @@ def from_params(params:, organization:, helpers:) .includes(:storage_location, :donation_site, :product_drive, - :product_drive_participant, :manufacturer, line_items: [:item]) .order(created_at: :desc) diff --git a/app/models/view/request_info.rb b/app/models/view/request_info.rb new file mode 100644 index 0000000000..682a34eefd --- /dev/null +++ b/app/models/view/request_info.rb @@ -0,0 +1,33 @@ +module View + class RequestInfo + attr_reader :request + + def initialize(params:, organization:) + @request = organization.requests.find(params[:id]) + end + + def item_requests + @item_requests ||= @request.item_requests.includes(:item) + end + + def inventory + @inventory ||= View::Inventory.new(@request.organization_id) + end + + def default_storage_location + return @default_storage_location if defined?(@default_storage_location) + + @efault_storage_location ||= @request.partner.default_storage_location_id || @request.organization.default_storage_location + end + + def location + return @location if defined?(@location) + + @location ||= StorageLocation.find_by(id: default_storage_location) + end + + def custom_units + Flipper.enabled?(:enable_packs) && request.item_requests.any? { |item| item.request_unit } + end + end +end diff --git a/app/models/view/requests.rb b/app/models/view/requests.rb new file mode 100644 index 0000000000..a82153a304 --- /dev/null +++ b/app/models/view/requests.rb @@ -0,0 +1,79 @@ +module View + class Requests + include DateRangeHelper + + attr_reader :filters, :helpers, :organization, :paginated_requests, :params, :requests + + def initialize(params:, organization:, helpers:) + @params = params + @organization = organization + @filters = filter_params(params) + @helpers = helpers + + @requests = organization + .ordered_requests + .undiscarded + .during(helpers.selected_range) + .class_filter(filters) + + @paginated_requests = requests.includes(:partner).page(params[:page]) + end + + def filter_params(params = {}) + if params.key?(:filters) + params.require(:filters).permit(:by_request_item_id, :by_partner, :by_status, :by_request_type) + else + {} + end + end + + def unfulfilled_requests_count + @unfulfilled_requests_count ||= organization + .requests + .where(status: [:pending, :started]) + .during(helpers.selected_range) + .class_filter(filters) + .count + end + + def calculate_product_totals + @calculate_product_totals ||= RequestsTotalItemsService.new(requests: requests).calculate + end + + def items + @items ||= organization.items.alphabetized.select(:id, :name) + end + + def partners + @partners ||= organization.partners.alphabetized.select(:id, :name, :status) + end + + def statuses + @statuses ||= Request.statuses.transform_keys(&:humanize) + end + + def partner_users + @partner_users ||= User.where(id: paginated_requests.map(&:partner_user_id)).select(:id, :name, :email) + end + + def request_types + @request_types ||= Request.request_types.transform_keys(&:humanize) + end + + def selected_request_type + filters[:by_request_type] + end + + def selected_request_item + filters[:by_request_item_id] + end + + def selected_partner + filters[:by_partner] + end + + def selected_status + filters[:by_status] + end + end +end diff --git a/app/views/requests/_calculate_product_totals.html.erb b/app/views/requests/_calculate_product_totals.html.erb index 5410923fb9..add383533f 100644 --- a/app/views/requests/_calculate_product_totals.html.erb +++ b/app/views/requests/_calculate_product_totals.html.erb @@ -16,7 +16,7 @@
- <% @calculate_product_totals.sort_by { |name, quantity| name.downcase }.each do |name, quantity| %> + <% @requests_info.calculate_product_totals.sort_by { |name, quantity| name.downcase }.each do |name, quantity| %>| <%= @request.partner.name %> | -<%= @request.partner_user&.formatted_email %> | -<%= @request.request_type&.humanize %> | -<%= render partial: "status", locals: {status: @request.status} %> | -<%= @request.comments || 'None' %> | +<%= @request_info.request.partner.name %> | +<%= @request_info.request.partner_user&.formatted_email %> | +<%= @request_info.request.request_type&.humanize %> | +<%= render partial: "status", locals: {status: @request_info.request.status} %> | +<%= @request_info.request.comments || 'None' %> |