From f60c124cd28c8448409338e222fad7f237db14a4 Mon Sep 17 00:00:00 2001 From: Brian Bonus Date: Tue, 13 May 2025 19:33:27 -0700 Subject: [PATCH 1/6] Bug-5152 Updates item_request export to take current_org as an argument for initialization --- app/controllers/requests_controller.rb | 2 +- app/services/exports/export_request_service.rb | 5 ++++- spec/services/exports/export_request_service_spec.rb | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) 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..2c5742b801 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 = organization end def generate_csv diff --git a/spec/services/exports/export_request_service_spec.rb b/spec/services/exports/export_request_service_spec.rb index 100994f0e7..09c70df8f3 100644 --- a/spec/services/exports/export_request_service_spec.rb +++ b/spec/services/exports/export_request_service_spec.rb @@ -91,7 +91,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 From 56dfefed7400de3fb1e6606c5f73362d46b2710c Mon Sep 17 00:00:00 2001 From: Brian Bonus Date: Tue, 13 May 2025 20:27:31 -0700 Subject: [PATCH 2/6] Bug-5152 Updates item request export to include inactive/unrequested items --- .../exports/export_request_service.rb | 10 +++- .../exports/export_request_service_spec.rb | 49 +++++++++++++++++-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/app/services/exports/export_request_service.rb b/app/services/exports/export_request_service.rb index 2c5742b801..1bc5141c9d 100644 --- a/app/services/exports/export_request_service.rb +++ b/app/services/exports/export_request_service.rb @@ -4,9 +4,10 @@ class ExportRequestService # @param requests [Array] # @param organization [Organization] - def initialize(requests, organization) + def initialize(requests, organization:) @requests = requests.includes(:partner, {item_requests: :item}) @organization = organization + @organization_items = @organization.items.select("DISTINCT ON (LOWER(name)) items.name").order("LOWER(name) ASC") end def generate_csv @@ -87,6 +88,13 @@ 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 diff --git a/spec/services/exports/export_request_service_spec.rb b/spec/services/exports/export_request_service_spec.rb index 09c70df8f3..83d1260995 100644 --- a/spec/services/exports/export_request_service_spec.rb +++ b/spec/services/exports/export_request_service_spec.rb @@ -11,8 +11,21 @@ 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 } 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, @@ -110,12 +123,14 @@ "3T Diapers", "4T Diapers", "4T Diapers - packs", + "Inactive Item", + "Unrequested Item", "" ]) 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 @@ -127,7 +142,9 @@ 0, # 2T Diapers 150, # 3T Diapers 0, # 4T Diapers - 0, # 4T Diapers - packs + 0, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -142,6 +159,8 @@ 0, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -156,6 +175,8 @@ 0, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 400 # ]) end @@ -170,6 +191,8 @@ 2, # 3T Diapers 0, # 4T Diapers 4, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -184,6 +207,8 @@ 0, # 3T Diapers 77, # 4T Diapers 0, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -198,6 +223,8 @@ 0, # 3T Diapers 0, # 4T Diapers 1, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -213,6 +240,8 @@ 0, # 3T Diapers 0, # 4T Diapers 1, # 4T Diapers - packs + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -234,12 +263,14 @@ "2T Diapers -- UPDATED", "3T Diapers", "4T Diapers", + "Inactive Item", + "Unrequested Item", "" ]) 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 +282,8 @@ 0, # 2T Diapers 150, # 3T Diapers 0, # 4T Diapers + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -264,6 +297,8 @@ 100, # 2T Diapers 0, # 3T Diapers 0, # 4T Diapers + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -277,6 +312,8 @@ 0, # 2T Diapers 0, # 3T Diapers 0, # 4T Diapers + 0, # Inactive Item + 0, # Unrequested Item 400 # ]) end @@ -290,6 +327,8 @@ 3, # 2T Diapers 2, # 3T Diapers 4, # 4T Diapers + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -303,6 +342,8 @@ 0, # 2T Diapers 0, # 3T Diapers 77, # 4T Diapers + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end @@ -316,6 +357,8 @@ 0, # 2T Diapers 0, # 3T Diapers 1, # 4T Diapers + 0, # Inactive Item + 0, # Unrequested Item 0 # ]) end From 2f89103ef9f32d76cd405b3c288d38864ff90226 Mon Sep 17 00:00:00 2001 From: Brian Bonus Date: Tue, 13 May 2025 20:49:28 -0700 Subject: [PATCH 3/6] Bug-5152 Updates sorting logic to be case insensitive, asc to match other exports --- .../exports/export_request_service.rb | 2 +- .../exports/export_request_service_spec.rb | 100 +++++++++++++----- 2 files changed, 76 insertions(+), 26 deletions(-) diff --git a/app/services/exports/export_request_service.rb b/app/services/exports/export_request_service.rb index 1bc5141c9d..10cec96354 100644 --- a/app/services/exports/export_request_service.rb +++ b/app/services/exports/export_request_service.rb @@ -99,7 +99,7 @@ def compute_item_headers # 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 83d1260995..f863aad90f 100644 --- a/spec/services/exports/export_request_service_spec.rb +++ b/spec/services/exports/export_request_service_spec.rb @@ -14,6 +14,11 @@ 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 @@ -123,8 +128,11 @@ "3T Diapers", "4T Diapers", "4T Diapers - packs", + "apple", + "Banana", "Inactive Item", "Unrequested Item", + "Zebra", "" ]) end @@ -142,9 +150,12 @@ 0, # 2T Diapers 150, # 3T Diapers 0, # 4T Diapers - 0, # 4T Diapers - packs - 0, # Inactive Item - 0, # Unrequested Item + 0, # 4T Diapers - packs + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -159,8 +170,11 @@ 0, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -175,8 +189,11 @@ 0, # 3T Diapers 0, # 4T Diapers 0, # 4T Diapers - packs - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 400 # ]) end @@ -191,8 +208,11 @@ 2, # 3T Diapers 0, # 4T Diapers 4, # 4T Diapers - packs - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -207,8 +227,11 @@ 0, # 3T Diapers 77, # 4T Diapers 0, # 4T Diapers - packs - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -223,8 +246,11 @@ 0, # 3T Diapers 0, # 4T Diapers 1, # 4T Diapers - packs - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -240,8 +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 @@ -263,8 +292,11 @@ "2T Diapers -- UPDATED", "3T Diapers", "4T Diapers", + "apple", + "Banana", "Inactive Item", "Unrequested Item", + "Zebra", "" ]) end @@ -282,8 +314,11 @@ 0, # 2T Diapers 150, # 3T Diapers 0, # 4T Diapers - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -297,8 +332,11 @@ 100, # 2T Diapers 0, # 3T Diapers 0, # 4T Diapers - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -312,8 +350,11 @@ 0, # 2T Diapers 0, # 3T Diapers 0, # 4T Diapers - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 400 # ]) end @@ -327,8 +368,11 @@ 3, # 2T Diapers 2, # 3T Diapers 4, # 4T Diapers - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -342,8 +386,11 @@ 0, # 2T Diapers 0, # 3T Diapers 77, # 4T Diapers - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end @@ -357,8 +404,11 @@ 0, # 2T Diapers 0, # 3T Diapers 1, # 4T Diapers - 0, # Inactive Item - 0, # Unrequested Item + 0, # apple + 0, # Banana + 0, # Inactive Item + 0, # Unrequested Item + 0, # Zebra 0 # ]) end From e82948fe7b0f1d157c3afcc87aaa0d2b5060d5e8 Mon Sep 17 00:00:00 2001 From: Brian Bonus Date: Thu, 29 May 2025 14:13:48 -0700 Subject: [PATCH 4/6] Bug-5152 removes unnecessary ivar --- app/services/exports/export_request_service.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/services/exports/export_request_service.rb b/app/services/exports/export_request_service.rb index 10cec96354..0b072fb205 100644 --- a/app/services/exports/export_request_service.rb +++ b/app/services/exports/export_request_service.rb @@ -6,8 +6,7 @@ class ExportRequestService # @param organization [Organization] def initialize(requests, organization:) @requests = requests.includes(:partner, {item_requests: :item}) - @organization = organization - @organization_items = @organization.items.select("DISTINCT ON (LOWER(name)) items.name").order("LOWER(name) ASC") + @organization_items = organization.items.select("DISTINCT ON (LOWER(name)) items.name").order("LOWER(name) ASC") end def generate_csv From d4d29965f3cd99c88da5510baf5bbb54abda9979 Mon Sep 17 00:00:00 2001 From: Brian Bonus Date: Thu, 29 May 2025 14:14:22 -0700 Subject: [PATCH 5/6] Bug-5152 Rubo cop fixes --- spec/services/exports/export_request_service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/services/exports/export_request_service_spec.rb b/spec/services/exports/export_request_service_spec.rb index f863aad90f..85730972c0 100644 --- a/spec/services/exports/export_request_service_spec.rb +++ b/spec/services/exports/export_request_service_spec.rb @@ -25,7 +25,7 @@ create(:request, :started, :child, - :with_item_requests, + :with_item_requests, organization: org, partner: partner, request_items: [{ item_id: inactive_item.id, quantity: 777 }]) From 6f8ffbb14db9b689fa6ce52a2f779ccacc5a70c0 Mon Sep 17 00:00:00 2001 From: Brian Bonus Date: Thu, 29 May 2025 14:27:44 -0700 Subject: [PATCH 6/6] Bug-5152 Fixes initialization mistake --- app/services/exports/export_request_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/exports/export_request_service.rb b/app/services/exports/export_request_service.rb index 0b072fb205..d2e6052c88 100644 --- a/app/services/exports/export_request_service.rb +++ b/app/services/exports/export_request_service.rb @@ -4,7 +4,7 @@ class ExportRequestService # @param requests [Array] # @param organization [Organization] - def initialize(requests, 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