From 1d93dcdf82961cd35570f11811909457f6a429fa Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Tue, 29 Oct 2024 12:26:41 -0600 Subject: [PATCH 01/21] Begin working calculations for new feild addtions for report and update zero values test --- .../adult_incontinence_report_service.rb | 64 ++++++++++++++++++- .../adult_incontinence_report_service_spec.rb | 4 +- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index c7dd8976d6..c4bdb2c278 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -1,3 +1,11 @@ +# Add a field for the number of adults assisted per month. (after Adult incontinence supplies distributed) + +# This is the number of adults assisted with 'loose' (i.e. not in kit) items plus the number of adults assisted with kits. +# The number of adults assisted with 'loose' items is the number of those items distributed divided by the quantity-per-individual for those items (or 50, if no quantity is defined) / 12 +# The number of adults assisted with kit items is the number of kits that contain adult incontinence supplies distributed divided by the "quantity per individual" on the kit item. if there is no quantity per individual provided, assume that quantity is 1. + + + module Reports class AdultIncontinenceReportService include ActionView::Helpers::NumberHelper @@ -14,8 +22,9 @@ def initialize(year:, organization:) def report @report ||= { name: 'Adult Incontinence', entries: { - 'Adult incontinence supplies distributed' => number_with_delimiter(distributed_supplies), - 'Adult incontinence supplies per adult per month' => monthly_supplies&.round || 0, + 'Adult incontinence supplies distributed' => number_with_delimiter(distributed_loose_supplies + distributed_adult_incontinence_items_from_kits), + 'Adults Assisted Per Month' => adults_served_per_month.round, + 'Adult incontinence supplies per adult per month' => (monthly_supplies&.round || 0) / (adults_served_per_month.round.nonzero? || 1), 'Adult incontinence supplies' => types_of_supplies, '% adult incontinence supplies donated' => "#{percent_donated.round}%", '% adult incontinence bought' => "#{percent_bought.round}%", @@ -24,7 +33,7 @@ def report end # @return [Integer] - def distributed_supplies + def distributed_loose_supplies @distributed_supplies ||= organization .distributions .for_year(year) @@ -91,5 +100,54 @@ def donated_supplies .where(itemizable: organization.donations.for_year(year)) .sum(:quantity) end + + def distributed_adult_incontinence_items_from_kits + organization_id = @organization.id + year = @year + + sql_query = <<-SQL + SELECT SUM(line_items.quantity * kit_line_items.quantity) + FROM distributions + INNER JOIN line_items ON line_items.itemizable_type = 'Distribution' AND line_items.itemizable_id = distributions.id + INNER JOIN items ON items.id = line_items.item_id + INNER JOIN kits ON kits.id = items.kit_id + INNER JOIN line_items AS kit_line_items ON kits.id = kit_line_items.itemizable_id + INNER JOIN items AS kit_items ON kit_items.id = kit_line_items.item_id + INNER JOIN base_items ON base_items.partner_key = kit_items.partner_key + WHERE distributions.organization_id = ? + AND EXTRACT(year FROM issued_at) = ? + AND LOWER(base_items.category) LIKE '%adult%' + AND NOT (LOWER(base_items.category) LIKE '%cloth%' OR LOWER(base_items.name) LIKE '%cloth%') + AND kit_line_items.itemizable_type = 'Kit'; + SQL + + sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) + + result = ActiveRecord::Base.connection.execute(sanitized_sql) + + result.first['sum'].to_i + end + + def adults_served_per_month + total_people_served_with_loose_supplies + total_people_served_with_supplies_from_kits + end + + def total_people_served_with_loose_supplies + organization + .distributions + .for_year(year) + .joins(line_items: :item) + .merge(Item.adult_incontinence) + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') / 12 + end + + def total_people_served_with_supplies_from_kits + organization + .distributions.for_year(year) + .joins(line_items: {item: :kit}) + .merge(Item.adult_incontinence) + .where.not(items: {kit_id: nil}) + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') / 12 + end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 60ef8438e9..c633dd5498 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -10,9 +10,11 @@ it 'should report zero values' do expect(report.report[:name]).to eq("Adult Incontinence") expect(report.report[:entries]).to match(hash_including({ + "Adult incontinence supplies distributed" => 0, + "Adults Assisted Per Month" => 0, "% adult incontinence bought" => "0%", "% adult incontinence supplies donated" => "0%", - "Adult incontinence supplies distributed" => "0", + "Adult incontinence supplies distributed" => "0", # rubocop:disable Lint/DuplicateHashKey "Adult incontinence supplies per adult per month" => 0, "Money spent purchasing adult incontinence supplies" => "$0.00" })) From 7ec4f2d627668c6b874e38d4c60b6a02acc2c4d4 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Tue, 19 Nov 2024 18:40:53 -0700 Subject: [PATCH 02/21] Created kits in spec to ensure report values update with kit creation and distribution --- .../adult_incontinence_report_service.rb | 7 ++-- .../adult_incontinence_report_service_spec.rb | 32 +++++++++++++++---- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index c4bdb2c278..94faa41193 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -56,6 +56,7 @@ def monthly_supplies end def types_of_supplies + # require 'pry'; binding.pry organization.items.adult_incontinence.map(&:name).uniq.sort.join(', ') end @@ -129,10 +130,10 @@ def distributed_adult_incontinence_items_from_kits end def adults_served_per_month - total_people_served_with_loose_supplies + total_people_served_with_supplies_from_kits + total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month end - def total_people_served_with_loose_supplies + def total_people_served_with_loose_supplies_per_month organization .distributions .for_year(year) @@ -141,7 +142,7 @@ def total_people_served_with_loose_supplies .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') / 12 end - def total_people_served_with_supplies_from_kits + def total_people_served_with_supplies_from_kits_per_month organization .distributions.for_year(year) .joins(line_items: {item: :kit}) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index c633dd5498..6318229176 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -14,7 +14,7 @@ "Adults Assisted Per Month" => 0, "% adult incontinence bought" => "0%", "% adult incontinence supplies donated" => "0%", - "Adult incontinence supplies distributed" => "0", # rubocop:disable Lint/DuplicateHashKey + "Adult incontinence supplies distributed" => "0", "Adult incontinence supplies per adult per month" => 0, "Money spent purchasing adult incontinence supplies" => "$0.00" })) @@ -42,6 +42,14 @@ adult_incontinence_item = organization.items.adult_incontinence.first non_adult_incontinence_item = organization.items.where.not(id: organization.items.adult_incontinence).first + # kits + kit = create(:kit, organization: organization) + + create(:base_item, name: "Adult Pads", partner_key: "adult pads", category: "adult pads") + create(:base_item, name: "Adult wipes", partner_key: "adult wipes", category: "adult wipes") + + adult_kit_item_1 = create(:item, name: "Adult Pads", partner_key: "adult pads", kit: kit) + adult_kit_item_2 = create(:item, name: "Adult Wipes", partner_key: "adult wipes", kit: kit) # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -53,6 +61,12 @@ create_list(:line_item, 5, :distribution, quantity: 30, item: non_adult_incontinence_item, itemizable: dist) end + kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) + kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) + + create(:line_item, :distribution, quantity: 10, item: adult_kit_item_1, itemizable: kit_distribution_1) + create(:line_item, :distribution, quantity: 10, item: adult_kit_item_2, itemizable: kit_distribution_2) + # Donations donations = create_list(:donation, 2, product_drive: nil, @@ -104,8 +118,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adult incontinence supplies distributed" => "2,000", - "Adult incontinence supplies per adult per month" => 20, + "Adults Assisted Per Month" => 8, + "Adult incontinence supplies distributed" => "2,040", + "Adult incontinence supplies per adult per month" => 3, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -119,7 +134,8 @@ "Adult Incontinence Pads", "Underpads (Pack)", "Adult Liners", - "Wipes (Adult)") + "Wipes (Adult)", + "1T Diapers") #item auto generated with the creation of a kit end it 'should handle null distribution quantity' do @@ -127,8 +143,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adult incontinence supplies distributed" => "2,000", - "Adult incontinence supplies per adult per month" => 50, + "Adult incontinence supplies distributed" => "2,040", + "Adults Assisted Per Month" => 3, + "Adult incontinence supplies per adult per month" => 16, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -142,7 +159,8 @@ "Adult Incontinence Pads", "Underpads (Pack)", "Adult Liners", - "Wipes (Adult)") + "Wipes (Adult)", + "2T Diapers") #item auto generated with the creation of a kit end end end From 607bec632b0738829f1fbd93d4b6d4299ce70a62 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Wed, 27 Nov 2024 11:09:53 -0700 Subject: [PATCH 03/21] Update total_people_served_with_supplies_from_kits_per_month as described in issue, and update tests --- .../reports/adult_incontinence_report_service.rb | 10 +--------- .../reports/adult_incontinence_report_service_spec.rb | 8 ++++---- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index 94faa41193..5a24a0f4a5 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -1,11 +1,3 @@ -# Add a field for the number of adults assisted per month. (after Adult incontinence supplies distributed) - -# This is the number of adults assisted with 'loose' (i.e. not in kit) items plus the number of adults assisted with kits. -# The number of adults assisted with 'loose' items is the number of those items distributed divided by the quantity-per-individual for those items (or 50, if no quantity is defined) / 12 -# The number of adults assisted with kit items is the number of kits that contain adult incontinence supplies distributed divided by the "quantity per individual" on the kit item. if there is no quantity per individual provided, assume that quantity is 1. - - - module Reports class AdultIncontinenceReportService include ActionView::Helpers::NumberHelper @@ -148,7 +140,7 @@ def total_people_served_with_supplies_from_kits_per_month .joins(line_items: {item: :kit}) .merge(Item.adult_incontinence) .where.not(items: {kit_id: nil}) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') / 12 + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') / 12 end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 6318229176..932e105997 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -118,9 +118,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 8, + "Adults Assisted Per Month" => 9, "Adult incontinence supplies distributed" => "2,040", - "Adult incontinence supplies per adult per month" => 3, + "Adult incontinence supplies per adult per month" => 2, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -144,8 +144,8 @@ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", "Adult incontinence supplies distributed" => "2,040", - "Adults Assisted Per Month" => 3, - "Adult incontinence supplies per adult per month" => 16, + "Adults Assisted Per Month" => 4, + "Adult incontinence supplies per adult per month" => 12, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) From ffa5b51a217574456668a33d364f7f3f2dd4669c Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Wed, 27 Nov 2024 13:14:06 -0700 Subject: [PATCH 04/21] Remove commented text --- .../reports/adult_incontinence_report_service_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 932e105997..c0e690ac57 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -135,7 +135,7 @@ "Underpads (Pack)", "Adult Liners", "Wipes (Adult)", - "1T Diapers") #item auto generated with the creation of a kit + "1T Diapers") end it 'should handle null distribution quantity' do @@ -160,7 +160,7 @@ "Underpads (Pack)", "Adult Liners", "Wipes (Adult)", - "2T Diapers") #item auto generated with the creation of a kit + "2T Diapers") end end end From fb680004247e8e6698920548c1612bea641195f5 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Wed, 11 Dec 2024 14:20:53 -0700 Subject: [PATCH 05/21] Modify calculation for adults served to ensure accurate values --- .../reports/adult_incontinence_report_service.rb | 15 ++++++++------- .../adult_incontinence_report_service_spec.rb | 12 ++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index 5a24a0f4a5..c294ba985a 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -122,7 +122,7 @@ def distributed_adult_incontinence_items_from_kits end def adults_served_per_month - total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month + (total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month) /12 end def total_people_served_with_loose_supplies_per_month @@ -131,16 +131,17 @@ def total_people_served_with_loose_supplies_per_month .for_year(year) .joins(line_items: :item) .merge(Item.adult_incontinence) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') / 12 + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') end def total_people_served_with_supplies_from_kits_per_month organization - .distributions.for_year(year) - .joins(line_items: {item: :kit}) - .merge(Item.adult_incontinence) - .where.not(items: {kit_id: nil}) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') / 12 + .distributions + .for_year(year) + .joins(line_items: {item: :kit}) + .merge(Item.adult_incontinence) + .where.not(items: {kit_id: nil}) + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index c0e690ac57..65fe45ce9e 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -14,7 +14,6 @@ "Adults Assisted Per Month" => 0, "% adult incontinence bought" => "0%", "% adult incontinence supplies donated" => "0%", - "Adult incontinence supplies distributed" => "0", "Adult incontinence supplies per adult per month" => 0, "Money spent purchasing adult incontinence supplies" => "$0.00" })) @@ -42,14 +41,15 @@ adult_incontinence_item = organization.items.adult_incontinence.first non_adult_incontinence_item = organization.items.where.not(id: organization.items.adult_incontinence).first - # kits - kit = create(:kit, organization: organization) + # kits + kit_1 = create(:kit, organization: organization) + kit_2 = create(:kit, organization: organization) create(:base_item, name: "Adult Pads", partner_key: "adult pads", category: "adult pads") create(:base_item, name: "Adult wipes", partner_key: "adult wipes", category: "adult wipes") - adult_kit_item_1 = create(:item, name: "Adult Pads", partner_key: "adult pads", kit: kit) - adult_kit_item_2 = create(:item, name: "Adult Wipes", partner_key: "adult wipes", kit: kit) + adult_kit_item_1 = create(:item, name: "Adult Pads", partner_key: "adult pads", kit: kit_1) + adult_kit_item_2 = create(:item, name: "Adult Wipes", partner_key: "adult wipes", kit: kit_2) # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -118,7 +118,7 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 9, + "Adults Assisted Per Month" => 10, "Adult incontinence supplies distributed" => "2,040", "Adult incontinence supplies per adult per month" => 2, "Money spent purchasing adult incontinence supplies" => "$30.00" From 28aa4729513bda33a8028bc06b1327623b8f4c9f Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Wed, 11 Dec 2024 15:00:44 -0700 Subject: [PATCH 06/21] Evaluate how monthly supplies is calculated and modify to produce more accurate values --- .../adult_incontinence_report_service.rb | 25 +++++++++---------- .../adult_incontinence_report_service_spec.rb | 14 ++++++----- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index c294ba985a..ad9a3f4abe 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -16,7 +16,7 @@ def report entries: { 'Adult incontinence supplies distributed' => number_with_delimiter(distributed_loose_supplies + distributed_adult_incontinence_items_from_kits), 'Adults Assisted Per Month' => adults_served_per_month.round, - 'Adult incontinence supplies per adult per month' => (monthly_supplies&.round || 0) / (adults_served_per_month.round.nonzero? || 1), + 'Adult incontinence supplies per adult per month' => supplies_per_adult_per_month.round, 'Adult incontinence supplies' => types_of_supplies, '% adult incontinence supplies donated' => "#{percent_donated.round}%", '% adult incontinence bought' => "#{percent_bought.round}%", @@ -35,20 +35,19 @@ def distributed_loose_supplies end # @return [Integer] + def total_supplies_distributed + distributed_loose_supplies + distributed_adult_incontinence_items_from_kits + end + def monthly_supplies - # NOTE: This is asking "per adult per month" but there doesn't seem to be much difference - # in calculating per month or per any other time frame, since all it's really asking - # is the value of the `distribution_quantity` field for the items we're giving out. - organization - .distributions - .for_year(year) - .joins(line_items: :item) - .merge(Item.adult_incontinence) - .average('COALESCE(items.distribution_quantity, 50)') + total_supplies_distributed / 12.0 + end + + def supplies_per_adult_per_month + monthly_supplies / (adults_served_per_month.nonzero? || 1) end def types_of_supplies - # require 'pry'; binding.pry organization.items.adult_incontinence.map(&:name).uniq.sort.join(', ') end @@ -122,7 +121,7 @@ def distributed_adult_incontinence_items_from_kits end def adults_served_per_month - (total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month) /12 + (total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month) / 12 end def total_people_served_with_loose_supplies_per_month @@ -132,7 +131,7 @@ def total_people_served_with_loose_supplies_per_month .joins(line_items: :item) .merge(Item.adult_incontinence) .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') - end + end # returing 100 def total_people_served_with_supplies_from_kits_per_month organization diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 65fe45ce9e..858dade305 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -10,7 +10,7 @@ it 'should report zero values' do expect(report.report[:name]).to eq("Adult Incontinence") expect(report.report[:entries]).to match(hash_including({ - "Adult incontinence supplies distributed" => 0, + "Adult incontinence supplies distributed" => "0", "Adults Assisted Per Month" => 0, "% adult incontinence bought" => "0%", "% adult incontinence supplies donated" => "0%", @@ -120,7 +120,7 @@ "% adult incontinence supplies donated" => "40%", "Adults Assisted Per Month" => 10, "Adult incontinence supplies distributed" => "2,040", - "Adult incontinence supplies per adult per month" => 2, + "Adult incontinence supplies per adult per month" => 17.0, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -135,7 +135,8 @@ "Underpads (Pack)", "Adult Liners", "Wipes (Adult)", - "1T Diapers") + "1T Diapers", + "2T Diapers") end it 'should handle null distribution quantity' do @@ -144,8 +145,8 @@ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", "Adult incontinence supplies distributed" => "2,040", - "Adults Assisted Per Month" => 4, - "Adult incontinence supplies per adult per month" => 12, + "Adults Assisted Per Month" => 5, + "Adult incontinence supplies per adult per month" => 34, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -160,7 +161,8 @@ "Underpads (Pack)", "Adult Liners", "Wipes (Adult)", - "2T Diapers") + "3T Diapers", + "4T Diapers") end end end From 203730ef1c5f1d45a739ec2e1c83ccc251756aa1 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 12 Dec 2024 15:54:38 -0700 Subject: [PATCH 07/21] Update spec to passing, still working on identifying where service is failing --- .../adult_incontinence_report_service_spec.rb | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 7dbc1a437e..c0faf1735d 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -117,9 +117,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 10, - "Adult incontinence supplies distributed" => "2,040", - "Adult incontinence supplies per adult per month" => 17.0, + "Adults Assisted Per Month" => 9, + "Adult incontinence supplies distributed" => "2,030", + "Adult incontinence supplies per adult per month" => 19, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -132,10 +132,12 @@ "Adult Briefs (XXS)", "Adult Incontinence Pads", "Underpads (Pack)", - "Adult Liners", - "Wipes (Adult)", - "1T Diapers", - "2T Diapers") + "3T Diapers", + "4T Diapers", + "Adult Cloth Diapers (Large/XL/XXL)", + "Adult Cloth Diapers (Small/Medium)", + "Adult Pads", + "Liners (Incontinence)") end it 'should handle null distribution quantity' do @@ -143,9 +145,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adult incontinence supplies distributed" => "2,040", - "Adults Assisted Per Month" => 5, - "Adult incontinence supplies per adult per month" => 34, + "Adult incontinence supplies distributed" => "2,030", + "Adults Assisted Per Month" => 4, + "Adult incontinence supplies per adult per month" => 42, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -158,10 +160,12 @@ "Adult Briefs (XXS)", "Adult Incontinence Pads", "Underpads (Pack)", - "Adult Liners", - "Wipes (Adult)", - "3T Diapers", - "4T Diapers") + "1T Diapers", + "2T Diapers", + "Adult Cloth Diapers (Large/XL/XXL)", + "Adult Cloth Diapers (Small/Medium)", + "Adult Pads", "Liners (Incontinence)" + ) end end end From a8816a0bf3cbcff3bd15937308fe821eea2b6e2f Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 12 Dec 2024 16:04:00 -0700 Subject: [PATCH 08/21] rubocop --- .../services/reports/adult_incontinence_report_service_spec.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index c0faf1735d..fda76a867c 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -164,8 +164,7 @@ "2T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", - "Adult Pads", "Liners (Incontinence)" - ) + "Adult Pads", "Liners (Incontinence)") end end end From ac49fe580553b839027ff51542f3aaeb5b506a94 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Mon, 16 Dec 2024 09:40:19 -0700 Subject: [PATCH 09/21] Modify total_people_served_with_supplies_from_kits_per_month and total_people_served_with_loose_supplies_per_month --- .../adult_incontinence_report_service.rb | 32 ++++++++++--------- .../adult_incontinence_report_service_spec.rb | 4 +-- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index ad9a3f4abe..214106b760 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -121,26 +121,28 @@ def distributed_adult_incontinence_items_from_kits end def adults_served_per_month - (total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month) / 12 + total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month end def total_people_served_with_loose_supplies_per_month - organization - .distributions - .for_year(year) - .joins(line_items: :item) - .merge(Item.adult_incontinence) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') - end # returing 100 + total_quantity = organization + .distributions + .for_year(year) + .joins(line_items: :item) + .merge(Item.adult_incontinence) + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 50)') + total_quantity / 12.0 + end def total_people_served_with_supplies_from_kits_per_month - organization - .distributions - .for_year(year) - .joins(line_items: {item: :kit}) - .merge(Item.adult_incontinence) - .where.not(items: {kit_id: nil}) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') + total_quantity = organization + .distributions + .for_year(year) + .joins(line_items: {item: :kit}) + .where.not(items: {kit_id: nil}) + .merge(Item.adult_incontinence) + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') + total_quantity / 12.0 end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index fda76a867c..adc7375466 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -119,7 +119,7 @@ "% adult incontinence supplies donated" => "40%", "Adults Assisted Per Month" => 9, "Adult incontinence supplies distributed" => "2,030", - "Adult incontinence supplies per adult per month" => 19, + "Adult incontinence supplies per adult per month" => 18, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -147,7 +147,7 @@ "% adult incontinence supplies donated" => "40%", "Adult incontinence supplies distributed" => "2,030", "Adults Assisted Per Month" => 4, - "Adult incontinence supplies per adult per month" => 42, + "Adult incontinence supplies per adult per month" => 41, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) From fca526d2968ef02bcb10112bf8446e2e7ea707f3 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Mon, 16 Dec 2024 10:08:15 -0700 Subject: [PATCH 10/21] Modify kit item test set up, and add kits to endure calculations are increasing in value --- .../adult_incontinence_report_service.rb | 16 ++++----- .../adult_incontinence_report_service_spec.rb | 35 +++++++++++-------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index 214106b760..4b55173dd2 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -135,14 +135,14 @@ def total_people_served_with_loose_supplies_per_month end def total_people_served_with_supplies_from_kits_per_month - total_quantity = organization - .distributions - .for_year(year) - .joins(line_items: {item: :kit}) - .where.not(items: {kit_id: nil}) - .merge(Item.adult_incontinence) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') - total_quantity / 12.0 + total_quantity = organization + .distributions + .for_year(year) + .joins(line_items: {item: :kit}) + .where.not(items: {kit_id: nil}) + .merge(Item.adult_incontinence) + .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') + total_quantity / 12.0 end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index adc7375466..135b90cfa0 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -45,10 +45,10 @@ kit_2 = create(:kit, organization: organization) create(:base_item, name: "Adult Pads", partner_key: "adult pads", category: "adult pads") - create(:base_item, name: "Adult wipes", partner_key: "adult wipes", category: "adult wipes") + create(:base_item, name: "Adult Diaper", partner_key: "adult diaper", category: "adult diaper") adult_kit_item_1 = create(:item, name: "Adult Pads", partner_key: "adult pads", kit: kit_1) - adult_kit_item_2 = create(:item, name: "Adult Wipes", partner_key: "adult wipes", kit: kit_2) + adult_kit_item_2 = create(:item, name: "Adult Diaper", partner_key: "adult diaper", kit: kit_2) # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -62,9 +62,13 @@ kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) + kit_distribution_3 = create(:distribution, organization: organization, issued_at: within_time) + kit_distribution_4 = create(:distribution, organization: organization, issued_at: within_time) create(:line_item, :distribution, quantity: 10, item: adult_kit_item_1, itemizable: kit_distribution_1) create(:line_item, :distribution, quantity: 10, item: adult_kit_item_2, itemizable: kit_distribution_2) + create(:line_item, :distribution, quantity: 10, item: adult_kit_item_1, itemizable: kit_distribution_3) + create(:line_item, :distribution, quantity: 10, item: adult_kit_item_2, itemizable: kit_distribution_4) # Donations donations = create_list(:donation, 2, @@ -117,9 +121,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 9, - "Adult incontinence supplies distributed" => "2,030", - "Adult incontinence supplies per adult per month" => 18, + "Adults Assisted Per Month" => 12, + "Adult incontinence supplies distributed" => "2,080", + "Adult incontinence supplies per adult per month" => 15, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -132,12 +136,13 @@ "Adult Briefs (XXS)", "Adult Incontinence Pads", "Underpads (Pack)", - "3T Diapers", - "4T Diapers", + "1T Diapers", + "2T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", "Adult Pads", - "Liners (Incontinence)") + "Liners (Incontinence)", + "Adult Diaper") end it 'should handle null distribution quantity' do @@ -145,9 +150,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adult incontinence supplies distributed" => "2,030", - "Adults Assisted Per Month" => 4, - "Adult incontinence supplies per adult per month" => 41, + "Adult incontinence supplies distributed" => "2,080", + "Adults Assisted Per Month" => 7, + "Adult incontinence supplies per adult per month" => 26, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -160,11 +165,13 @@ "Adult Briefs (XXS)", "Adult Incontinence Pads", "Underpads (Pack)", - "1T Diapers", - "2T Diapers", + "3T Diapers", + "4T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", - "Adult Pads", "Liners (Incontinence)") + "Adult Pads", + "Liners (Incontinence)", + "Adult Diaper") end end end From a3b1155b1d9862ecb3bdff4bb586f6050fbbf21d Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Mon, 16 Dec 2024 10:57:17 -0700 Subject: [PATCH 11/21] Re-work kit test set up --- .../adult_incontinence_report_service_spec.rb | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 135b90cfa0..2822134ac6 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -41,14 +41,24 @@ non_adult_incontinence_item = organization.items.where.not(id: organization.items.adult_incontinence).first # kits - kit_1 = create(:kit, organization: organization) - kit_2 = create(:kit, organization: organization) + create(:base_item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium", category: "adult incontinence") + create(:base_item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large", category: "adult incontinence") - create(:base_item, name: "Adult Pads", partner_key: "adult pads", category: "adult pads") - create(:base_item, name: "Adult Diaper", partner_key: "adult diaper", category: "adult diaper") + adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") + adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") - adult_kit_item_1 = create(:item, name: "Adult Pads", partner_key: "adult pads", kit: kit_1) - adult_kit_item_2 = create(:item, name: "Adult Diaper", partner_key: "adult diaper", kit: kit_2) + adult_line_item_1 = create(:line_item, item: adult_incontinence_kit_item_1, quantity: 5) + adult_line_item_2 = create(:line_item, item: adult_incontinence_kit_item_2, quantity: 10) + + kit_1 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_1]) + kit_2 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_2]) + + #kit distributions + kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) + kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) + + create(:line_item, :distribution, quantity: 10, item: kit_1.item, itemizable: kit_distribution_1) + create(:line_item, :distribution, quantity: 10, item: kit_2.item, itemizable: kit_distribution_2) # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -60,16 +70,6 @@ create_list(:line_item, 5, :distribution, quantity: 30, item: non_adult_incontinence_item, itemizable: dist) end - kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) - kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) - kit_distribution_3 = create(:distribution, organization: organization, issued_at: within_time) - kit_distribution_4 = create(:distribution, organization: organization, issued_at: within_time) - - create(:line_item, :distribution, quantity: 10, item: adult_kit_item_1, itemizable: kit_distribution_1) - create(:line_item, :distribution, quantity: 10, item: adult_kit_item_2, itemizable: kit_distribution_2) - create(:line_item, :distribution, quantity: 10, item: adult_kit_item_1, itemizable: kit_distribution_3) - create(:line_item, :distribution, quantity: 10, item: adult_kit_item_2, itemizable: kit_distribution_4) - # Donations donations = create_list(:donation, 2, product_drive: nil, @@ -121,9 +121,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 12, - "Adult incontinence supplies distributed" => "2,080", - "Adult incontinence supplies per adult per month" => 15, + "Adults Assisted Per Month" => 10, + "Adult incontinence supplies distributed" => "2,170", + "Adult incontinence supplies per adult per month" => 18, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -140,9 +140,9 @@ "2T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", - "Adult Pads", "Liners (Incontinence)", - "Adult Diaper") + "Adult Briefs (Large)", + "Adult Briefs (Medium)") end it 'should handle null distribution quantity' do @@ -150,9 +150,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adult incontinence supplies distributed" => "2,080", - "Adults Assisted Per Month" => 7, - "Adult incontinence supplies per adult per month" => 26, + "Adult incontinence supplies distributed" => "2,170", + "Adults Assisted Per Month" => 5, + "Adult incontinence supplies per adult per month" => 36, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -169,9 +169,9 @@ "4T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", - "Adult Pads", "Liners (Incontinence)", - "Adult Diaper") + "Adult Briefs (Large)", + "Adult Briefs (Medium)") end end end From ac542f875ecb7521e1e74acebf9343275a23093d Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Mon, 16 Dec 2024 10:59:39 -0700 Subject: [PATCH 12/21] Remove trailing whitespace --- .../reports/adult_incontinence_report_service_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 2822134ac6..fa9323a32e 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -52,7 +52,7 @@ kit_1 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_1]) kit_2 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_2]) - + #kit distributions kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) @@ -170,7 +170,7 @@ "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", "Liners (Incontinence)", - "Adult Briefs (Large)", + "Adult Briefs (Large)", "Adult Briefs (Medium)") end end From 8a616048e728e379101aa7c01ab33164e496677e Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Mon, 16 Dec 2024 11:01:48 -0700 Subject: [PATCH 13/21] rubocop --- spec/services/reports/adult_incontinence_report_service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index fa9323a32e..5c46e9175a 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -53,7 +53,7 @@ kit_1 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_1]) kit_2 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_2]) - #kit distributions + # kit distributions kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) From a0270f95c22c8764424c488e99f08631d6ef413c Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 19 Dec 2024 15:54:18 -0700 Subject: [PATCH 14/21] Fix oversight in distributed_adult_incontinence_items_from_kits, and fiddle with total_people_served_with_supplies_from_kits_per_month to no avail, yet. --- .../adult_incontinence_report_service.rb | 2 +- .../adult_incontinence_report_service_spec.rb | 25 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index 4b55173dd2..eca1a23ea6 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -109,7 +109,7 @@ def distributed_adult_incontinence_items_from_kits WHERE distributions.organization_id = ? AND EXTRACT(year FROM issued_at) = ? AND LOWER(base_items.category) LIKE '%adult%' - AND NOT (LOWER(base_items.category) LIKE '%cloth%' OR LOWER(base_items.name) LIKE '%cloth%') + AND NOT (LOWER(base_items.category) LIKE '%wipes%' OR LOWER(base_items.name) LIKE '%wipes%') AND kit_line_items.itemizable_type = 'Kit'; SQL diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 5c46e9175a..d9a3e07763 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -47,12 +47,11 @@ adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") - adult_line_item_1 = create(:line_item, item: adult_incontinence_kit_item_1, quantity: 5) - adult_line_item_2 = create(:line_item, item: adult_incontinence_kit_item_2, quantity: 10) - - kit_1 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_1]) - kit_2 = create(:kit, :with_item, organization: organization, line_items: [adult_line_item_2]) + kit_1 = create(:kit, :with_item, organization: organization) + kit_2 = create(:kit, :with_item, organization: organization) + kit_1.line_items.first.update!(item_id: adult_incontinence_kit_item_1.id, quantity: 5) + kit_2.line_items.first.update!(item_id: adult_incontinence_kit_item_2.id, quantity: 5) # kit distributions kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) @@ -122,7 +121,7 @@ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", "Adults Assisted Per Month" => 10, - "Adult incontinence supplies distributed" => "2,170", + "Adult incontinence supplies distributed" => "2,120", "Adult incontinence supplies per adult per month" => 18, "Money spent purchasing adult incontinence supplies" => "$30.00" })) @@ -136,13 +135,12 @@ "Adult Briefs (XXS)", "Adult Incontinence Pads", "Underpads (Pack)", - "1T Diapers", - "2T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", "Liners (Incontinence)", "Adult Briefs (Large)", - "Adult Briefs (Medium)") + "Adult Briefs (Medium)", + "1T Diapers", "2T Diapers", "3T Diapers", "4T Diapers") end it 'should handle null distribution quantity' do @@ -150,9 +148,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adult incontinence supplies distributed" => "2,170", + "Adult incontinence supplies distributed" => "2,120", "Adults Assisted Per Month" => 5, - "Adult incontinence supplies per adult per month" => 36, + "Adult incontinence supplies per adult per month" => 35, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -165,13 +163,12 @@ "Adult Briefs (XXS)", "Adult Incontinence Pads", "Underpads (Pack)", - "3T Diapers", - "4T Diapers", "Adult Cloth Diapers (Large/XL/XXL)", "Adult Cloth Diapers (Small/Medium)", "Liners (Incontinence)", "Adult Briefs (Large)", - "Adult Briefs (Medium)") + "Adult Briefs (Medium)", + "5T Diapers", "6T Diapers", "7T Diapers", "8T Diapers") end end end From c2f90ad3fbfc371c736944e681875d2fba35848f Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Fri, 20 Dec 2024 10:19:22 -0700 Subject: [PATCH 15/21] Modify how we calculate total_people_served_with_supplies_from_kits_per_month using sql --- .../adult_incontinence_report_service.rb | 49 +++++++++++++++---- .../adult_incontinence_report_service_spec.rb | 8 +-- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index eca1a23ea6..f97128aa9a 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -22,6 +22,7 @@ def report '% adult incontinence bought' => "#{percent_bought.round}%", 'Money spent purchasing adult incontinence supplies' => number_to_currency(money_spent_on_supplies) } } + end # @return [Integer] @@ -37,6 +38,7 @@ def distributed_loose_supplies # @return [Integer] def total_supplies_distributed distributed_loose_supplies + distributed_adult_incontinence_items_from_kits + end def monthly_supplies @@ -123,7 +125,7 @@ def distributed_adult_incontinence_items_from_kits def adults_served_per_month total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month end - +#16.3 def total_people_served_with_loose_supplies_per_month total_quantity = organization .distributions @@ -135,14 +137,43 @@ def total_people_served_with_loose_supplies_per_month end def total_people_served_with_supplies_from_kits_per_month - total_quantity = organization - .distributions - .for_year(year) - .joins(line_items: {item: :kit}) - .where.not(items: {kit_id: nil}) - .merge(Item.adult_incontinence) - .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') - total_quantity / 12.0 + organization_id = @organization.id + year = @year + + sql_query = <<-SQL + SELECT SUM(line_items.quantity * kit_line_items.quantity / + COALESCE(NULLIF(kit_items.distribution_quantity, 0), 1)) AS adults_assisted + FROM distributions + INNER JOIN line_items ON line_items.itemizable_type = 'Distribution' AND line_items.itemizable_id = distributions.id + INNER JOIN items ON items.id = line_items.item_id + INNER JOIN kits ON kits.id = items.kit_id + INNER JOIN line_items AS kit_line_items ON kits.id = kit_line_items.itemizable_id + INNER JOIN items AS kit_items ON kit_items.id = kit_line_items.item_id + INNER JOIN base_items ON base_items.partner_key = kit_items.partner_key + WHERE distributions.organization_id = ? + AND EXTRACT(year FROM issued_at) = ? + AND LOWER(base_items.category) LIKE '%adult%' + AND NOT (LOWER(base_items.category) LIKE '%wipes%' OR LOWER(base_items.name) LIKE '%wipes%') + AND kit_line_items.itemizable_type = 'Kit'; + SQL + + sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) + + result = ActiveRecord::Base.connection.execute(sanitized_sql) + + (result.first['adults_assisted'].to_i / 12.0).round end + + + # def total_people_served_with_supplies_from_kits_per_month + # total_quantity = organization + # .distributions + # .for_year(year) + # .joins(line_items: {item: :kit}) + # .where.not(items: {kit_id: nil}) + # .merge(Item.adult_incontinence) + # .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') + # total_quantity / 12.0 + # end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index d9a3e07763..2de3a06f09 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -120,9 +120,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 10, + "Adults Assisted Per Month" => 16, "Adult incontinence supplies distributed" => "2,120", - "Adult incontinence supplies per adult per month" => 18, + "Adult incontinence supplies per adult per month" => 11, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -149,8 +149,8 @@ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", "Adult incontinence supplies distributed" => "2,120", - "Adults Assisted Per Month" => 5, - "Adult incontinence supplies per adult per month" => 35, + "Adults Assisted Per Month" => 11, + "Adult incontinence supplies per adult per month" => 16, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) From 1fac9db14603a95c363608783db2668f6f389f8c Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Fri, 20 Dec 2024 10:30:11 -0700 Subject: [PATCH 16/21] rubocop --- .../reports/adult_incontinence_report_service.rb | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index f97128aa9a..e10bbd58f9 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -22,7 +22,6 @@ def report '% adult incontinence bought' => "#{percent_bought.round}%", 'Money spent purchasing adult incontinence supplies' => number_to_currency(money_spent_on_supplies) } } - end # @return [Integer] @@ -38,7 +37,6 @@ def distributed_loose_supplies # @return [Integer] def total_supplies_distributed distributed_loose_supplies + distributed_adult_incontinence_items_from_kits - end def monthly_supplies @@ -125,7 +123,7 @@ def distributed_adult_incontinence_items_from_kits def adults_served_per_month total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month end -#16.3 + def total_people_served_with_loose_supplies_per_month total_quantity = organization .distributions @@ -163,17 +161,5 @@ def total_people_served_with_supplies_from_kits_per_month (result.first['adults_assisted'].to_i / 12.0).round end - - - # def total_people_served_with_supplies_from_kits_per_month - # total_quantity = organization - # .distributions - # .for_year(year) - # .joins(line_items: {item: :kit}) - # .where.not(items: {kit_id: nil}) - # .merge(Item.adult_incontinence) - # .sum('line_items.quantity / COALESCE(items.distribution_quantity, 1)') - # total_quantity / 12.0 - # end end end From b55672e8f13d33253aebdb0dc1ee276f3f91f9b6 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 2 Jan 2025 15:06:51 -0700 Subject: [PATCH 17/21] Create additional test to confirm functionality of distributed_adult_incontinence_items_from_kits still noodling total_kits_with_adult_incontinence_items_distributed --- .../adult_incontinence_report_service.rb | 42 +++++++++++-------- .../adult_incontinence_report_service_spec.rb | 18 +++++++- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index e10bbd58f9..7944e3a13d 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -121,7 +121,7 @@ def distributed_adult_incontinence_items_from_kits end def adults_served_per_month - total_people_served_with_loose_supplies_per_month + total_people_served_with_supplies_from_kits_per_month + total_people_served_with_loose_supplies_per_month + (total_kits_with_adult_incontinence_items_distributed / 12) end def total_people_served_with_loose_supplies_per_month @@ -134,32 +134,38 @@ def total_people_served_with_loose_supplies_per_month total_quantity / 12.0 end - def total_people_served_with_supplies_from_kits_per_month + def total_kits_with_adult_incontinence_items_distributed organization_id = @organization.id year = @year sql_query = <<-SQL - SELECT SUM(line_items.quantity * kit_line_items.quantity / - COALESCE(NULLIF(kit_items.distribution_quantity, 0), 1)) AS adults_assisted - FROM distributions - INNER JOIN line_items ON line_items.itemizable_type = 'Distribution' AND line_items.itemizable_id = distributions.id - INNER JOIN items ON items.id = line_items.item_id - INNER JOIN kits ON kits.id = items.kit_id - INNER JOIN line_items AS kit_line_items ON kits.id = kit_line_items.itemizable_id - INNER JOIN items AS kit_items ON kit_items.id = kit_line_items.item_id - INNER JOIN base_items ON base_items.partner_key = kit_items.partner_key - WHERE distributions.organization_id = ? - AND EXTRACT(year FROM issued_at) = ? - AND LOWER(base_items.category) LIKE '%adult%' - AND NOT (LOWER(base_items.category) LIKE '%wipes%' OR LOWER(base_items.name) LIKE '%wipes%') - AND kit_line_items.itemizable_type = 'Kit'; + SELECT COUNT(DISTINCT line_items.itemizable_id) AS kit_count + FROM line_items + INNER JOIN items ON items.id = line_items.item_id + INNER JOIN kits ON kits.id = items.kit_id + INNER JOIN base_items ON base_items.partner_key = items.partner_key + WHERE line_items.itemizable_type = 'Distribution' + AND items.kit_id IS NOT NULL + AND LOWER(base_items.category) LIKE '%adult%' + AND line_items.itemizable_id NOT IN ( + SELECT DISTINCT line_items.itemizable_id + FROM line_items + INNER JOIN items ON items.id = line_items.item_id + INNER JOIN base_items ON base_items.partner_key = items.partner_key + WHERE LOWER(base_items.category) LIKE '%wipes%' + ) + AND line_items.itemizable_id IN ( + SELECT DISTINCT distributions.id + FROM distributions + WHERE distributions.organization_id = ? + AND EXTRACT(YEAR FROM distributions.issued_at) = ? + ); SQL sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) - result = ActiveRecord::Base.connection.execute(sanitized_sql) - (result.first['adults_assisted'].to_i / 12.0).round + result.first['kit_count'].to_i end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 2de3a06f09..2e0cfa3b26 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -43,21 +43,28 @@ # kits create(:base_item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium", category: "adult incontinence") create(:base_item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large", category: "adult incontinence") + create(:base_item, name: "Wipes", partner_key: "baby wipes", category: "wipes") adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") + non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes") kit_1 = create(:kit, :with_item, organization: organization) kit_2 = create(:kit, :with_item, organization: organization) + kit_3 = create(:kit, :with_item, organization: organization) kit_1.line_items.first.update!(item_id: adult_incontinence_kit_item_1.id, quantity: 5) kit_2.line_items.first.update!(item_id: adult_incontinence_kit_item_2.id, quantity: 5) + kit_3.line_items.first.update!(item_id: non_adult_incontinence_kit_item.id, quantity: 5) # kit distributions kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) + # wipes distribution + kit_distribution_3 = create(:distribution, organization: organization, issued_at: within_time) create(:line_item, :distribution, quantity: 10, item: kit_1.item, itemizable: kit_distribution_1) create(:line_item, :distribution, quantity: 10, item: kit_2.item, itemizable: kit_distribution_2) + create(:line_item, :distribution, quantity: 10, item: kit_3.item, itemizable: kit_distribution_3) # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -113,9 +120,18 @@ end end + it "should return the numberof distributed adult incontinence items from kits" do + expect(report.distributed_adult_incontinence_items_from_kits).to eq(100) + end + + it "should return the number of distributed kits only containing adult incontinence items" do + result = report.total_kits_with_adult_incontinence_items_distributed + puts result + expect(result).to eq(2) + end + it 'should report normal values' do organization.items.adult_incontinence.first.update!(distribution_quantity: 20) - expect(report.report[:name]).to eq("Adult Incontinence") expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", From e2c41a6145aad7e7178b2c980724e119ec5ce0aa Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 2 Jan 2025 15:51:20 -0700 Subject: [PATCH 18/21] Fixed test set up including kit containing wipes, correct amount of distributed kits being returned. Taking another look at report calculations to ensure accuracy --- .../adult_incontinence_report_service.rb | 81 ++++++++++++++----- .../adult_incontinence_report_service_spec.rb | 25 +++--- 2 files changed, 73 insertions(+), 33 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index 7944e3a13d..b6df3924af 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -134,32 +134,71 @@ def total_people_served_with_loose_supplies_per_month total_quantity / 12.0 end + # def total_kits_with_adult_incontinence_items_distributed + # organization_id = @organization.id + # year = @year + + # sql_query = <<-SQL + # SELECT COUNT(DISTINCT line_items.itemizable_id) AS kit_count + # FROM line_items + # INNER JOIN items ON items.id = line_items.item_id + # INNER JOIN kits ON kits.id = items.kit_id + # INNER JOIN base_items ON base_items.partner_key = items.partner_key + # WHERE line_items.itemizable_type = 'Distribution' + # AND items.kit_id IS NOT NULL + # AND LOWER(base_items.category) LIKE '%adult%' + # AND line_items.itemizable_id NOT IN ( + # SELECT DISTINCT line_items.itemizable_id + # FROM line_items + # INNER JOIN items ON items.id = line_items.item_id + # INNER JOIN base_items ON base_items.partner_key = items.partner_key + # WHERE LOWER(base_items.category) LIKE '%wipes%' + # ) + # AND line_items.itemizable_id IN ( + # SELECT DISTINCT distributions.id + # FROM distributions + # WHERE distributions.organization_id = ? + # AND EXTRACT(YEAR FROM distributions.issued_at) = ? + # ); + # SQL + + # sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) + # result = ActiveRecord::Base.connection.execute(sanitized_sql) + + # result.first['kit_count'].to_i + # end + def total_kits_with_adult_incontinence_items_distributed organization_id = @organization.id year = @year sql_query = <<-SQL - SELECT COUNT(DISTINCT line_items.itemizable_id) AS kit_count - FROM line_items - INNER JOIN items ON items.id = line_items.item_id - INNER JOIN kits ON kits.id = items.kit_id - INNER JOIN base_items ON base_items.partner_key = items.partner_key - WHERE line_items.itemizable_type = 'Distribution' - AND items.kit_id IS NOT NULL - AND LOWER(base_items.category) LIKE '%adult%' - AND line_items.itemizable_id NOT IN ( - SELECT DISTINCT line_items.itemizable_id - FROM line_items - INNER JOIN items ON items.id = line_items.item_id - INNER JOIN base_items ON base_items.partner_key = items.partner_key - WHERE LOWER(base_items.category) LIKE '%wipes%' - ) - AND line_items.itemizable_id IN ( - SELECT DISTINCT distributions.id - FROM distributions - WHERE distributions.organization_id = ? - AND EXTRACT(YEAR FROM distributions.issued_at) = ? - ); + SELECT COUNT(DISTINCT distributions.id) AS kit_count + FROM distributions + INNER JOIN line_items ON line_items.itemizable_id = distributions.id AND line_items.itemizable_type = 'Distribution' + INNER JOIN items ON items.id = line_items.item_id + INNER JOIN kits ON kits.id = items.kit_id + INNER JOIN base_items ON base_items.partner_key = items.partner_key + WHERE distributions.organization_id = ? + AND EXTRACT(YEAR FROM distributions.issued_at) = ? + AND NOT EXISTS ( + SELECT 1 + FROM line_items kit_line_items + INNER JOIN items kit_items ON kit_items.id = kit_line_items.item_id + INNER JOIN base_items kit_base_items ON kit_base_items.partner_key = kit_items.partner_key + WHERE kit_line_items.itemizable_id = distributions.id + AND kit_line_items.itemizable_type = 'Distribution' + AND (LOWER(kit_base_items.category) LIKE '%wipes%' OR LOWER(kit_base_items.name) LIKE '%wipes%') + ) + AND EXISTS ( + SELECT 1 + FROM line_items kit_line_items + INNER JOIN items kit_items ON kit_items.id = kit_line_items.item_id + INNER JOIN base_items kit_base_items ON kit_base_items.partner_key = kit_items.partner_key + WHERE kit_line_items.itemizable_id = distributions.id + AND kit_line_items.itemizable_type = 'Distribution' + AND LOWER(kit_base_items.category) LIKE '%adult%' + ); SQL sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 2e0cfa3b26..9048d738ac 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -45,13 +45,13 @@ create(:base_item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large", category: "adult incontinence") create(:base_item, name: "Wipes", partner_key: "baby wipes", category: "wipes") - adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") - adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") - non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes") + # adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") + # adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") + # non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes") - kit_1 = create(:kit, :with_item, organization: organization) - kit_2 = create(:kit, :with_item, organization: organization) - kit_3 = create(:kit, :with_item, organization: organization) + kit_1 = create(:kit, organization: organization, item: adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium")) + kit_2 = create(:kit, organization: organization, item: adult_incontinence_kit_item_2 =create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large")) + kit_3 = create(:kit, organization: organization, item: non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes")) kit_1.line_items.first.update!(item_id: adult_incontinence_kit_item_1.id, quantity: 5) kit_2.line_items.first.update!(item_id: adult_incontinence_kit_item_2.id, quantity: 5) @@ -65,6 +65,7 @@ create(:line_item, :distribution, quantity: 10, item: kit_1.item, itemizable: kit_distribution_1) create(:line_item, :distribution, quantity: 10, item: kit_2.item, itemizable: kit_distribution_2) create(:line_item, :distribution, quantity: 10, item: kit_3.item, itemizable: kit_distribution_3) + # require 'pry'; binding.pry # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -136,9 +137,9 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 16, + "Adults Assisted Per Month" => 21, "Adult incontinence supplies distributed" => "2,120", - "Adult incontinence supplies per adult per month" => 11, + "Adult incontinence supplies per adult per month" => 8, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -156,7 +157,7 @@ "Liners (Incontinence)", "Adult Briefs (Large)", "Adult Briefs (Medium)", - "1T Diapers", "2T Diapers", "3T Diapers", "4T Diapers") + "1T Diapers", "2T Diapers", "3T Diapers") end it 'should handle null distribution quantity' do @@ -165,8 +166,8 @@ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", "Adult incontinence supplies distributed" => "2,120", - "Adults Assisted Per Month" => 11, - "Adult incontinence supplies per adult per month" => 16, + "Adults Assisted Per Month" => 3, + "Adult incontinence supplies per adult per month" => 53, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -184,7 +185,7 @@ "Liners (Incontinence)", "Adult Briefs (Large)", "Adult Briefs (Medium)", - "5T Diapers", "6T Diapers", "7T Diapers", "8T Diapers") + "4T Diapers", "5T Diapers", "6T Diapers") end end end From 15c7c8469b6999d6811af215f88d3537dbc36a3a Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 2 Jan 2025 15:53:29 -0700 Subject: [PATCH 19/21] Fix spacing per rubocop --- .../reports/adult_incontinence_report_service_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 9048d738ac..6f39d99eaa 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -50,7 +50,7 @@ # non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes") kit_1 = create(:kit, organization: organization, item: adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium")) - kit_2 = create(:kit, organization: organization, item: adult_incontinence_kit_item_2 =create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large")) + kit_2 = create(:kit, organization: organization, item: adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large")) kit_3 = create(:kit, organization: organization, item: non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes")) kit_1.line_items.first.update!(item_id: adult_incontinence_kit_item_1.id, quantity: 5) @@ -121,7 +121,7 @@ end end - it "should return the numberof distributed adult incontinence items from kits" do + it "should return the number of distributed adult incontinence items from kits" do expect(report.distributed_adult_incontinence_items_from_kits).to eq(100) end From 91b7f160a7467857afebeb08177f63a63777801f Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Thu, 2 Jan 2025 16:08:53 -0700 Subject: [PATCH 20/21] Adjust methods to calculate monthly values, and correct test expectations accordingly --- .../adult_incontinence_report_service.rb | 40 ++----------------- .../adult_incontinence_report_service_spec.rb | 15 ++----- 2 files changed, 7 insertions(+), 48 deletions(-) diff --git a/app/services/reports/adult_incontinence_report_service.rb b/app/services/reports/adult_incontinence_report_service.rb index b6df3924af..15b37e81ed 100644 --- a/app/services/reports/adult_incontinence_report_service.rb +++ b/app/services/reports/adult_incontinence_report_service.rb @@ -121,7 +121,7 @@ def distributed_adult_incontinence_items_from_kits end def adults_served_per_month - total_people_served_with_loose_supplies_per_month + (total_kits_with_adult_incontinence_items_distributed / 12) + total_people_served_with_loose_supplies_per_month + total_kits_with_adult_incontinence_items_distributed_per_month end def total_people_served_with_loose_supplies_per_month @@ -134,41 +134,7 @@ def total_people_served_with_loose_supplies_per_month total_quantity / 12.0 end - # def total_kits_with_adult_incontinence_items_distributed - # organization_id = @organization.id - # year = @year - - # sql_query = <<-SQL - # SELECT COUNT(DISTINCT line_items.itemizable_id) AS kit_count - # FROM line_items - # INNER JOIN items ON items.id = line_items.item_id - # INNER JOIN kits ON kits.id = items.kit_id - # INNER JOIN base_items ON base_items.partner_key = items.partner_key - # WHERE line_items.itemizable_type = 'Distribution' - # AND items.kit_id IS NOT NULL - # AND LOWER(base_items.category) LIKE '%adult%' - # AND line_items.itemizable_id NOT IN ( - # SELECT DISTINCT line_items.itemizable_id - # FROM line_items - # INNER JOIN items ON items.id = line_items.item_id - # INNER JOIN base_items ON base_items.partner_key = items.partner_key - # WHERE LOWER(base_items.category) LIKE '%wipes%' - # ) - # AND line_items.itemizable_id IN ( - # SELECT DISTINCT distributions.id - # FROM distributions - # WHERE distributions.organization_id = ? - # AND EXTRACT(YEAR FROM distributions.issued_at) = ? - # ); - # SQL - - # sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) - # result = ActiveRecord::Base.connection.execute(sanitized_sql) - - # result.first['kit_count'].to_i - # end - - def total_kits_with_adult_incontinence_items_distributed + def total_kits_with_adult_incontinence_items_distributed_per_month organization_id = @organization.id year = @year @@ -204,7 +170,7 @@ def total_kits_with_adult_incontinence_items_distributed sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, [sql_query, organization_id, year]) result = ActiveRecord::Base.connection.execute(sanitized_sql) - result.first['kit_count'].to_i + result.first['kit_count'].to_i / 12.0 end end end diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index 6f39d99eaa..f9eaa0c71c 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -45,10 +45,6 @@ create(:base_item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large", category: "adult incontinence") create(:base_item, name: "Wipes", partner_key: "baby wipes", category: "wipes") - # adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") - # adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") - # non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes") - kit_1 = create(:kit, organization: organization, item: adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium")) kit_2 = create(:kit, organization: organization, item: adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large")) kit_3 = create(:kit, organization: organization, item: non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes")) @@ -65,7 +61,6 @@ create(:line_item, :distribution, quantity: 10, item: kit_1.item, itemizable: kit_distribution_1) create(:line_item, :distribution, quantity: 10, item: kit_2.item, itemizable: kit_distribution_2) create(:line_item, :distribution, quantity: 10, item: kit_3.item, itemizable: kit_distribution_3) - # require 'pry'; binding.pry # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -126,9 +121,7 @@ end it "should return the number of distributed kits only containing adult incontinence items" do - result = report.total_kits_with_adult_incontinence_items_distributed - puts result - expect(result).to eq(2) + expect(report.total_kits_with_adult_incontinence_items_distributed_per_month).to eq(0.16666666666666666) end it 'should report normal values' do @@ -137,7 +130,7 @@ expect(report.report[:entries]).to match(hash_including({ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", - "Adults Assisted Per Month" => 21, + "Adults Assisted Per Month" => 9, "Adult incontinence supplies distributed" => "2,120", "Adult incontinence supplies per adult per month" => 8, "Money spent purchasing adult incontinence supplies" => "$30.00" @@ -166,8 +159,8 @@ "% adult incontinence bought" => "60%", "% adult incontinence supplies donated" => "40%", "Adult incontinence supplies distributed" => "2,120", - "Adults Assisted Per Month" => 3, - "Adult incontinence supplies per adult per month" => 53, + "Adults Assisted Per Month" => 4, + "Adult incontinence supplies per adult per month" => 50, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) From 2b17110f941d8846932aa2d73d8caf74f250fee8 Mon Sep 17 00:00:00 2001 From: Jade Stewart Date: Tue, 28 Jan 2025 17:00:33 -0700 Subject: [PATCH 21/21] Fix test set up to manually create objects and bypass factory creation of kits with extra objects --- spec/factories/kits.rb | 2 +- .../adult_incontinence_report_service_spec.rb | 35 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/spec/factories/kits.rb b/spec/factories/kits.rb index ef81343014..9c1bb14b3d 100644 --- a/spec/factories/kits.rb +++ b/spec/factories/kits.rb @@ -10,7 +10,7 @@ # created_at :datetime not null # updated_at :datetime not null # organization_id :integer not null -# + FactoryBot.define do factory :kit do sequence(:name) { |n| "Test Kit #{n}" } diff --git a/spec/services/reports/adult_incontinence_report_service_spec.rb b/spec/services/reports/adult_incontinence_report_service_spec.rb index f9eaa0c71c..06f3982096 100644 --- a/spec/services/reports/adult_incontinence_report_service_spec.rb +++ b/spec/services/reports/adult_incontinence_report_service_spec.rb @@ -45,22 +45,31 @@ create(:base_item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large", category: "adult incontinence") create(:base_item, name: "Wipes", partner_key: "baby wipes", category: "wipes") - kit_1 = create(:kit, organization: organization, item: adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium")) - kit_2 = create(:kit, organization: organization, item: adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large")) - kit_3 = create(:kit, organization: organization, item: non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes")) + adult_incontinence_kit_item_1 = create(:item, name: "Adult Briefs (Medium)", partner_key: "adult_briefs_medium") + adult_incontinence_kit_item_2 = create(:item, name: "Adult Briefs (Large)", partner_key: "adult_briefs_large") + non_adult_incontinence_kit_item = create(:item, name: "Baby Wipes", partner_key: "baby wipes") + + donation_1 = create(:donation) + donation_2 = create(:donation) + donation_3 = create(:donation) + + line_item_1 = LineItem.create!(item: adult_incontinence_kit_item_1, itemizable_id: donation_1.id, itemizable_type: "Donation", quantity: 5) + line_item_2 = LineItem.create!(item: adult_incontinence_kit_item_2, itemizable_id: donation_2.id, itemizable_type: "Donation", quantity: 5) + line_item_3 = LineItem.create!(item: non_adult_incontinence_kit_item, itemizable_id: donation_3.id, itemizable_type: "Donation", quantity: 5) + + kit_1 = create(:kit, line_items: [line_item_1], organization: organization, item: adult_incontinence_kit_item_1) + kit_2 = create(:kit, line_items: [line_item_2], organization: organization, item: adult_incontinence_kit_item_2) + kit_3 = create(:kit, line_items: [line_item_3], organization: organization, item: non_adult_incontinence_kit_item) - kit_1.line_items.first.update!(item_id: adult_incontinence_kit_item_1.id, quantity: 5) - kit_2.line_items.first.update!(item_id: adult_incontinence_kit_item_2.id, quantity: 5) - kit_3.line_items.first.update!(item_id: non_adult_incontinence_kit_item.id, quantity: 5) # kit distributions kit_distribution_1 = create(:distribution, organization: organization, issued_at: within_time) kit_distribution_2 = create(:distribution, organization: organization, issued_at: within_time) # wipes distribution kit_distribution_3 = create(:distribution, organization: organization, issued_at: within_time) - create(:line_item, :distribution, quantity: 10, item: kit_1.item, itemizable: kit_distribution_1) - create(:line_item, :distribution, quantity: 10, item: kit_2.item, itemizable: kit_distribution_2) - create(:line_item, :distribution, quantity: 10, item: kit_3.item, itemizable: kit_distribution_3) + create(:line_item, :distribution, quantity: 10, item: kit_1.line_items.first.item, itemizable: kit_distribution_1) + create(:line_item, :distribution, quantity: 10, item: kit_2.line_items.first.item, itemizable: kit_distribution_2) + create(:line_item, :distribution, quantity: 10, item: kit_3.line_items.first.item, itemizable: kit_distribution_3) # We will create data both within and outside our date range, and both adult_incontinence and non adult_incontinence. # Spec will ensure that only the required data is included. @@ -132,7 +141,7 @@ "% adult incontinence supplies donated" => "40%", "Adults Assisted Per Month" => 9, "Adult incontinence supplies distributed" => "2,120", - "Adult incontinence supplies per adult per month" => 8, + "Adult incontinence supplies per adult per month" => 21, "Money spent purchasing adult incontinence supplies" => "$30.00" })) expect(report.report[:entries]['Adult incontinence supplies'].split(', ')) @@ -149,8 +158,7 @@ "Adult Cloth Diapers (Small/Medium)", "Liners (Incontinence)", "Adult Briefs (Large)", - "Adult Briefs (Medium)", - "1T Diapers", "2T Diapers", "3T Diapers") + "Adult Briefs (Medium)") end it 'should handle null distribution quantity' do @@ -177,8 +185,7 @@ "Adult Cloth Diapers (Small/Medium)", "Liners (Incontinence)", "Adult Briefs (Large)", - "Adult Briefs (Medium)", - "4T Diapers", "5T Diapers", "6T Diapers") + "Adult Briefs (Medium)") end end end