diff --git a/app/controllers/requests_controller.rb b/app/controllers/requests_controller.rb index 82aa5567f7..982f6bb1d3 100644 --- a/app/controllers/requests_controller.rb +++ b/app/controllers/requests_controller.rb @@ -23,7 +23,7 @@ def index 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, current_organization).generate_csv, filename: "Requests-#{Time.zone.today}.csv" } end end diff --git a/app/services/exports/export_request_service.rb b/app/services/exports/export_request_service.rb index 02da2c4c83..d2e6052c88 100644 --- a/app/services/exports/export_request_service.rb +++ b/app/services/exports/export_request_service.rb @@ -2,8 +2,11 @@ module Exports class ExportRequestService DELETED_ITEMS_COLUMN_HEADER = ''.freeze - def initialize(requests) + # @param requests [Array] + # @param organization [Organization] + def initialize(requests, organization) @requests = requests.includes(:partner, {item_requests: :item}) + @organization_items = organization.items.select("DISTINCT ON (LOWER(name)) items.name").order("LOWER(name) ASC") end def generate_csv @@ -84,11 +87,18 @@ def compute_item_headers end end + # Include inactive items or items that are otherwise not in any item_requests + @organization_items.each do |item| + if item_names.exclude?(item.name) + item_names << item.name + end + end + # Adding this to handle cases in which a requested item # has been deleted. Normally this wouldn't be necessary, # but previous versions of the application would cause # this orphaned data - item_names.sort.uniq << DELETED_ITEMS_COLUMN_HEADER + item_names.to_a.sort_by(&:downcase) << DELETED_ITEMS_COLUMN_HEADER end def build_row_data(request) diff --git a/spec/services/exports/export_request_service_spec.rb b/spec/services/exports/export_request_service_spec.rb index 100994f0e7..85730972c0 100644 --- a/spec/services/exports/export_request_service_spec.rb +++ b/spec/services/exports/export_request_service_spec.rb @@ -11,8 +11,26 @@ let(:item_deleted1) { create :item, :inactive, name: "Inactive Diapers1" } let(:item_deleted2) { create :item, :inactive, name: "Inactive Diapers2" } + let!(:unrequested_item) { create :item, name: "Unrequested Item", organization: org } + let!(:inactive_item) { create :item, name: "Inactive Item", active: false, organization: org } + + # Added to ensure sorting is working correctly, otherwise is duplicate behavior + let!(:apple_item) { create :item, name: "apple", organization: org } + let!(:banana_item) { create :item, name: "Banana", organization: org } + let!(:zebra_item) { create :item, name: "Zebra", organization: org } let!(:partner) { create :partner, organization: org, name: "Howdy Partner" } + + let!(:inactive_item_request) do + create(:request, + :started, + :child, + :with_item_requests, + organization: org, + partner: partner, + request_items: [{ item_id: inactive_item.id, quantity: 777 }]) + end + let!(:request_3t) do create(:request, :started, @@ -91,7 +109,7 @@ end subject do - described_class.new(Request.all).generate_csv_data + described_class.new(Request.all, organization: org).generate_csv_data end context "with custom units feature enabled" do @@ -110,12 +128,17 @@ "3T Diapers", "4T Diapers", "4T Diapers - packs", + "apple", + "Banana", + "Inactive Item", + "Unrequested Item", + "Zebra", "" ]) end it "includes rows for each request" do - expect(subject.count).to eq(7) + expect(subject.count).to eq(8) end it "has expected data for the 3T Diapers request" do @@ -128,6 +151,11 @@ 150, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -142,6 +170,11 @@ 0, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -156,6 +189,11 @@ 0, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 400 # ]) end @@ -170,6 +208,11 @@ 2, # 3T Diapers 0, # 4T Diapers 4, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -184,6 +227,11 @@ 0, # 3T Diapers 77, # 4T Diapers 0, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -198,6 +246,11 @@ 0, # 3T Diapers 0, # 4T Diapers 1, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -213,6 +266,11 @@ 0, # 3T Diapers 0, # 4T Diapers 1, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -234,12 +292,17 @@ "2T Diapers -- UPDATED", "3T Diapers", "4T Diapers", + "apple", + "Banana", + "Inactive Item", + "Unrequested Item", + "Zebra", "" ]) end it "includes rows for each request" do - expect(subject.count).to eq(7) + expect(subject.count).to eq(8) end it "has expected data for the 3T Diapers request" do @@ -251,6 +314,11 @@ 0, # 2T Diapers 150, # 3T Diapers 0, # 4T Diapers + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -264,6 +332,11 @@ 100, # 2T Diapers 0, # 3T Diapers 0, # 4T Diapers + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -277,6 +350,11 @@ 0, # 2T Diapers 0, # 3T Diapers 0, # 4T Diapers + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 400 # ]) end @@ -290,6 +368,11 @@ 3, # 2T Diapers 2, # 3T Diapers 4, # 4T Diapers + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -303,6 +386,11 @@ 0, # 2T Diapers 0, # 3T Diapers 77, # 4T Diapers + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -316,6 +404,11 @@ 0, # 2T Diapers 0, # 3T Diapers 1, # 4T Diapers + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end