diff --git a/app/services/reports.rb b/app/services/reports.rb index 507b4e8ece..6af011bfba 100644 --- a/app/services/reports.rb +++ b/app/services/reports.rb @@ -5,7 +5,7 @@ class << self # @return [Array] def all_reports(year:, organization:) [ - Reports::AcquisitionReportService.new(year: year, organization: organization).report, + Reports::DiaperReportService.new(year: year, organization: organization).report, Reports::WarehouseReportService.new(year: year, organization: organization).report, Reports::AdultIncontinenceReportService.new(year: year, organization: organization).report, Reports::PeriodSupplyReportService.new(year: year, organization: organization).report, diff --git a/app/services/reports/acquisition_report_service.rb b/app/services/reports/diaper_report_service.rb similarity index 55% rename from app/services/reports/acquisition_report_service.rb rename to app/services/reports/diaper_report_service.rb index bc24f75330..8c740807f1 100644 --- a/app/services/reports/acquisition_report_service.rb +++ b/app/services/reports/diaper_report_service.rb @@ -1,5 +1,5 @@ module Reports - class AcquisitionReportService + class DiaperReportService include ActionView::Helpers::NumberHelper attr_reader :year, :organization @@ -12,39 +12,39 @@ def initialize(year:, organization:) # @return [Hash] def report - @report ||= { name: 'Diaper Acquisition', - entries: { - 'Disposable diapers distributed' => number_with_delimiter(total_disposable_diapers_distributed), - 'Cloth diapers distributed' => number_with_delimiter(distributed_cloth_diapers), - 'Average monthly disposable diapers distributed' => number_with_delimiter(monthly_disposable_diapers), - 'Total product drives' => annual_drives.count, - 'Disposable diapers collected from drives' => number_with_delimiter(disposable_diapers_from_drives), - 'Cloth diapers collected from drives' => number_with_delimiter(cloth_diapers_from_drives), - 'Money raised from product drives' => number_to_currency(money_from_drives), - 'Total product drives (virtual)' => virtual_product_drives.count, - 'Money raised from product drives (virtual)' => number_to_currency(money_from_virtual_drives), - 'Disposable diapers collected from drives (virtual)' => number_with_delimiter(disposable_diapers_from_virtual_drives), - 'Cloth diapers collected from drives (virtual)' => number_with_delimiter(cloth_diapers_from_virtual_drives), - 'Disposable diapers donated' => number_with_delimiter(donated_disposable_diapers), - '% disposable diapers donated' => "#{percent_disposable_donated.round}%", - '% cloth diapers donated' => "#{percent_cloth_diapers_donated.round}%", - 'Disposable diapers purchased' => number_with_delimiter(purchased_loose_disposable_diapers), - '% disposable diapers purchased' => "#{percent_disposable_diapers_purchased.round}%", - '% cloth diapers purchased' => "#{percent_cloth_diapers_purchased.round}%", - 'Money spent purchasing diapers' => number_to_currency(money_spent_on_diapers), - 'Purchased from' => purchased_from, - 'Vendors diapers purchased through' => vendors_purchased_from - } } + @report ||= {name: "Diapers", + entries: { + "Disposable diapers distributed" => number_with_delimiter(total_disposable_diapers_distributed), + "Cloth diapers distributed" => number_with_delimiter(distributed_cloth_diapers), + "Average monthly disposable diapers distributed" => number_with_delimiter(monthly_disposable_diapers), + "Total product drives" => annual_drives.count, + "Disposable diapers collected from drives" => number_with_delimiter(disposable_diapers_from_drives), + "Cloth diapers collected from drives" => number_with_delimiter(cloth_diapers_from_drives), + "Money raised from product drives" => number_to_currency(money_from_drives), + "Total product drives (virtual)" => virtual_product_drives.count, + "Money raised from product drives (virtual)" => number_to_currency(money_from_virtual_drives), + "Disposable diapers collected from drives (virtual)" => number_with_delimiter(disposable_diapers_from_virtual_drives), + "Cloth diapers collected from drives (virtual)" => number_with_delimiter(cloth_diapers_from_virtual_drives), + "Disposable diapers donated" => number_with_delimiter(donated_disposable_diapers), + "% disposable diapers donated" => "#{percent_disposable_donated.round}%", + "% cloth diapers donated" => "#{percent_cloth_diapers_donated.round}%", + "Disposable diapers purchased" => number_with_delimiter(purchased_loose_disposable_diapers), + "% disposable diapers purchased" => "#{percent_disposable_diapers_purchased.round}%", + "% cloth diapers purchased" => "#{percent_cloth_diapers_purchased.round}%", + "Money spent purchasing diapers" => number_to_currency(money_spent_on_diapers), + "Purchased from" => purchased_from, + "Vendors diapers purchased through" => vendors_purchased_from + }} end # @return [Integer] def distributed_loose_disposable_diapers @distributed_loose_disposable_diapers ||= organization - .distributions - .for_year(year) - .joins(line_items: :item) - .merge(Item.disposable) - .sum('line_items.quantity') + .distributions + .for_year(year) + .joins(line_items: :item) + .merge(Item.disposable) + .sum("line_items.quantity") end def distributed_disposable_diapers_from_kits @@ -71,7 +71,7 @@ def distributed_disposable_diapers_from_kits result = ActiveRecord::Base.connection.execute(sanitized_sql) - result.first['sum'].to_i + result.first["sum"].to_i end def total_disposable_diapers_distributed @@ -80,11 +80,11 @@ def total_disposable_diapers_distributed def distributed_cloth_diapers @distributed_cloth_diapers ||= organization - .distributions - .for_year(year) - .joins(line_items: :item) - .merge(Item.cloth_diapers) - .sum('line_items.quantity') + .distributions + .for_year(year) + .joins(line_items: :item) + .merge(Item.cloth_diapers) + .sum("line_items.quantity") end # @return [Integer] @@ -100,12 +100,12 @@ def annual_drives # @return [Integer] def disposable_diapers_from_drives @disposable_diapers_from_drives ||= - annual_drives.joins(donations: { line_items: :item }).merge(Item.disposable).sum(:quantity) + annual_drives.joins(donations: {line_items: :item}).merge(Item.disposable).sum(:quantity) end def cloth_diapers_from_drives @cloth_diapers_from_drives ||= - annual_drives.joins(donations: { line_items: :item }).merge(Item.cloth_diapers).sum(:quantity) + annual_drives.joins(donations: {line_items: :item}).merge(Item.cloth_diapers).sum(:quantity) end # @return [Float] @@ -126,17 +126,17 @@ def money_from_virtual_drives # @return [Integer] def disposable_diapers_from_virtual_drives @disposable_diapers_from_virtual_drives ||= virtual_product_drives - .joins(donations: { line_items: :item }) - .merge(Item.disposable) - .sum(:quantity) + .joins(donations: {line_items: :item}) + .merge(Item.disposable) + .sum(:quantity) end # @return [Integer] def cloth_diapers_from_virtual_drives @cloth_diapers_from_virtual_drives ||= virtual_product_drives - .joins(donations: { line_items: :item }) - .merge(Item.cloth_diapers) - .sum(:quantity) + .joins(donations: {line_items: :item}) + .merge(Item.cloth_diapers) + .sum(:quantity) end # @return [Float] @@ -181,7 +181,7 @@ def purchased_from .distinct .pluck(:purchased_from) .compact - .join(', ') + .join(", ") end # @return [String] @@ -194,7 +194,7 @@ def vendors_purchased_from .distinct .pluck(:business_name) .compact - .join(', ') + .join(", ") end ###### HELPER METHODS ###### @@ -202,17 +202,17 @@ def vendors_purchased_from # @return [Integer] def purchased_loose_disposable_diapers @purchased_disposable_diapers ||= LineItem.joins(:item) - .merge(Item.disposable) - .where(itemizable: organization.purchases.for_year(year)) - .sum(:quantity) + .merge(Item.disposable) + .where(itemizable: organization.purchases.for_year(year)) + .sum(:quantity) end # @return [Integer] def purchased_cloth_diapers @purchased_cloth_diapers ||= LineItem.joins(:item) - .merge(Item.cloth_diapers) - .where(itemizable: organization.purchases.for_year(year)) - .sum(:quantity) + .merge(Item.cloth_diapers) + .where(itemizable: organization.purchases.for_year(year)) + .sum(:quantity) end # @return [Integer] @@ -228,17 +228,17 @@ def total_cloth_diapers_acquired # @return [Integer] def donated_disposable_diapers @donated_diapers ||= LineItem.joins(:item) - .merge(Item.disposable) - .where(itemizable: organization.donations.for_year(year)) - .sum(:quantity) + .merge(Item.disposable) + .where(itemizable: organization.donations.for_year(year)) + .sum(:quantity) end # @return [Integer] def donated_cloth_diapers @donated_cloth_diapers ||= LineItem.joins(:item) - .merge(Item.cloth_diapers) - .where(itemizable: organization.donations.for_year(year)) - .sum(:quantity) + .merge(Item.cloth_diapers) + .where(itemizable: organization.donations.for_year(year)) + .sum(:quantity) end end end diff --git a/spec/services/reports/acquisition_report_service_spec.rb b/spec/services/reports/diaper_report_service_spec.rb similarity index 56% rename from spec/services/reports/acquisition_report_service_spec.rb rename to spec/services/reports/diaper_report_service_spec.rb index 8ea62471d3..7c1cf77119 100644 --- a/spec/services/reports/acquisition_report_service_spec.rb +++ b/spec/services/reports/diaper_report_service_spec.rb @@ -1,4 +1,4 @@ -RSpec.describe Reports::AcquisitionReportService, type: :service, persisted_data: true do +RSpec.describe Reports::DiaperReportService, type: :service, persisted_data: true do describe "acquisition report" do let(:organization) { create(:organization) } let(:within_time) { Time.zone.parse("2020-05-31 14:00:00") } @@ -45,16 +45,16 @@ # Donations outside drives non_drive_donations = create_list(:donation, 2, - product_drive: nil, - issued_at: within_time, - money_raised: 1000, - organization: organization) + product_drive: nil, + issued_at: within_time, + money_raised: 1000, + organization: organization) non_drive_donations += create_list(:donation, 2, - product_drive: nil, - issued_at: outside_time, - money_raised: 1000, - organization: organization) + product_drive: nil, + issued_at: outside_time, + money_raised: 1000, + organization: organization) non_drive_donations.each do |donation| create_list(:line_item, 3, :donation, quantity: 20, item: disposable_item, itemizable: donation) @@ -63,22 +63,22 @@ # Product drives drives = create_list(:product_drive, 2, - start_date: within_time, - end_date: nil, - virtual: false, - organization: organization) + start_date: within_time, + end_date: nil, + virtual: false, + organization: organization) outside_drives = create_list(:product_drive, 2, - start_date: outside_time - 1.month, - end_date: outside_time, - organization: organization, - virtual: false) + start_date: outside_time - 1.month, + end_date: outside_time, + organization: organization, + virtual: false) donations = (drives + outside_drives).map do |drive| create_list(:product_drive_donation, 3, - product_drive: drive, - issued_at: drive.start_date + 1.day, - money_raised: 1000, - organization: organization) + product_drive: drive, + issued_at: drive.start_date + 1.day, + money_raised: 1000, + organization: organization) end donations.flatten! donations.each do |donation| @@ -88,22 +88,22 @@ # Virtual product drives vdrives = create_list(:product_drive, 2, - start_date: within_time, - end_date: nil, - virtual: true, - organization: organization) + start_date: within_time, + end_date: nil, + virtual: true, + organization: organization) outside_vdrives = create_list(:product_drive, 2, - start_date: outside_time - 1.month, - end_date: outside_time, - organization: organization, - virtual: true) + start_date: outside_time - 1.month, + end_date: outside_time, + organization: organization, + virtual: true) vdonations = (vdrives + outside_vdrives).map do |drive| create(:product_drive_donation, - product_drive: drive, - money_raised: 1000, - issued_at: drive.start_date + 1.day, - organization: organization) + product_drive: drive, + money_raised: 1000, + issued_at: drive.start_date + 1.day, + organization: organization) end vdonations.flatten! vdonations.each do |donation| @@ -114,33 +114,33 @@ # Vendors vendors = [ create(:vendor, business_name: "Vendor 1", organization: organization), - create(:vendor, business_name: "Vendor 2", organization: organization), + create(:vendor, business_name: "Vendor 2", organization: organization) ] # Purchases vendors.each do |vendor| purchases = [ create(:purchase, - issued_at: within_time, - vendor: vendor, - organization: organization, - purchased_from: 'Google', - amount_spent_in_cents: 1000, - amount_spent_on_diapers_cents: 1000), + issued_at: within_time, + vendor: vendor, + organization: organization, + purchased_from: "Google", + amount_spent_in_cents: 1000, + amount_spent_on_diapers_cents: 1000), create(:purchase, - issued_at: within_time, - vendor: vendor, - organization: organization, - purchased_from: 'Walmart', - amount_spent_in_cents: 2000, - amount_spent_on_diapers_cents: 2000), + issued_at: within_time, + vendor: vendor, + organization: organization, + purchased_from: "Walmart", + amount_spent_in_cents: 2000, + amount_spent_on_diapers_cents: 2000) ] purchases += create_list(:purchase, 2, - issued_at: outside_time, - amount_spent_in_cents: 20_000, - amount_spent_on_diapers_cents: 20_000, - vendor: vendor, - organization: organization) + issued_at: outside_time, + amount_spent_in_cents: 20_000, + amount_spent_on_diapers_cents: 20_000, + vendor: vendor, + organization: organization) purchases.each do |purchase| create_list(:line_item, 3, :purchase, quantity: 20, item: disposable_item, itemizable: purchase) create_list(:line_item, 3, :purchase, quantity: 10, item: non_disposable_item, itemizable: purchase) @@ -153,29 +153,29 @@ expect(service.distributed_disposable_diapers_from_kits).to eq(100) end - it 'should return the proper results on #report' do + it "should return the proper results on #report" do expect(subject.report).to eq({ - entries: { "Disposable diapers distributed" => "320", - "Cloth diapers distributed" => "300", - "Average monthly disposable diapers distributed" => "27", - "Total product drives" => 2, - "Disposable diapers collected from drives" => "600", - "Cloth diapers collected from drives" => "900", - "Money raised from product drives" => "$60.00", - "Total product drives (virtual)" => 2, - "Money raised from product drives (virtual)" => "$20.00", - "Disposable diapers collected from drives (virtual)" => "120", - "Cloth diapers collected from drives (virtual)" => "60", - "Disposable diapers donated" => "840", - "% disposable diapers donated" => "78%", - "% cloth diapers donated" => "89%", - "Disposable diapers purchased" => "240", - "% disposable diapers purchased" => "22%", - "% cloth diapers purchased" => "11%", - "Money spent purchasing diapers" => "$60.00", - "Purchased from" => "Google, Walmart", - "Vendors diapers purchased through" => "Vendor 1, Vendor 2"}, - name: "Diaper Acquisition" + entries: {"Disposable diapers distributed" => "320", + "Cloth diapers distributed" => "300", + "Average monthly disposable diapers distributed" => "27", + "Total product drives" => 2, + "Disposable diapers collected from drives" => "600", + "Cloth diapers collected from drives" => "900", + "Money raised from product drives" => "$60.00", + "Total product drives (virtual)" => 2, + "Money raised from product drives (virtual)" => "$20.00", + "Disposable diapers collected from drives (virtual)" => "120", + "Cloth diapers collected from drives (virtual)" => "60", + "Disposable diapers donated" => "840", + "% disposable diapers donated" => "78%", + "% cloth diapers donated" => "89%", + "Disposable diapers purchased" => "240", + "% disposable diapers purchased" => "22%", + "% cloth diapers purchased" => "11%", + "Money spent purchasing diapers" => "$60.00", + "Purchased from" => "Google, Walmart", + "Vendors diapers purchased through" => "Vendor 1, Vendor 2"}, + name: "Diapers" }) end end diff --git a/spec/system/annual_reports_system_spec.rb b/spec/system/annual_reports_system_spec.rb index d673d890c7..8dbc872a82 100644 --- a/spec/system/annual_reports_system_spec.rb +++ b/spec/system/annual_reports_system_spec.rb @@ -26,7 +26,7 @@ visit subject year = 1.year.ago.year click_on(year.to_s) - expect(page).to have_content("Diaper Acquisition") + expect(page).to have_selector("h1", text: "Diapers") expect(page).to have_content("Warehouse and Storage") expect(page).to have_content("Adult Incontinence") expect(page).to have_content("Other Items")