From ed2b8e9b9f1e93fe9b3200ebbc5cf8cc455d267b Mon Sep 17 00:00:00 2001 From: Kristina Lim Date: Wed, 3 Oct 2018 18:40:29 +0800 Subject: [PATCH] Add CSV renderer for enterprise fee summary report --- config/locales/en.yml | 11 +++ .../reports/renderers/base.rb | 13 ++++ .../renderers/csv_renderer.rb | 57 +++++++++++++++ .../enterprise_fee_summary/report_service.rb | 10 ++- .../renderers/csv_renderer_spec.rb | 73 +++++++++++++++++++ .../report_service_spec.rb | 2 +- 6 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 lib/open_food_network/reports/renderers/base.rb create mode 100644 lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer.rb create mode 100644 spec/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer_spec.rb diff --git a/config/locales/en.yml b/config/locales/en.yml index 9f82e41894..119a0fe200 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2689,6 +2689,17 @@ See the %{link} to find out more about %{sitename}'s features and to start using supplier: "Incoming" distributor: "Outgoing" coordinator: "Coordinator" + formats: + csv: + header: + fee_type: "Fee Type" + enterprise_name: "Enterprise Owner" + fee_name: "Fee Name" + customer_name: "Customer" + fee_placement: "Fee Placement" + fee_calculated_on_transfer_through_name: "Fee Calc on Transfer Through" + tax_category_name: "Tax Category" + total_amount: "$$ SUM" spree: # TODO: remove `email` key once we get to Spree 2.0 diff --git a/lib/open_food_network/reports/renderers/base.rb b/lib/open_food_network/reports/renderers/base.rb new file mode 100644 index 0000000000..be720366a6 --- /dev/null +++ b/lib/open_food_network/reports/renderers/base.rb @@ -0,0 +1,13 @@ +module OpenFoodNetwork + module Reports + module Renderers + class Base + attr_accessor :report_data + + def initialize(report_data) + @report_data = report_data + end + end + end + end +end diff --git a/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer.rb b/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer.rb new file mode 100644 index 0000000000..a06bcf634b --- /dev/null +++ b/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer.rb @@ -0,0 +1,57 @@ +require "open_food_network/reports/renderers/base" + +module OrderManagement + module Reports + module EnterpriseFeeSummary + module Renderers + class CsvRenderer < OpenFoodNetwork::Reports::Renderers::Base + def render + CSV.generate do |csv| + render_header(csv) + + report_data.enterprise_fee_type_totals.list.each do |data| + render_data_row(csv, data) + end + end + end + + private + + def render_header(csv) + csv << [ + header_label(:fee_type), + header_label(:enterprise_name), + header_label(:fee_name), + header_label(:customer_name), + header_label(:fee_placement), + header_label(:fee_calculated_on_transfer_through_name), + header_label(:tax_category_name), + header_label(:total_amount) + ] + end + + def render_data_row(csv, data) + csv << [ + data.fee_type, + data.enterprise_name, + data.fee_name, + data.customer_name, + data.fee_placement, + data.fee_calculated_on_transfer_through_name, + data.tax_category_name, + data.total_amount + ] + end + + def header_label(attribute) + I18n.t("header.#{attribute}", scope: i18n_scope) + end + + def i18n_scope + "order_management.reports.enterprise_fee_summary.formats.csv" + end + end + end + end + end +end diff --git a/lib/order_management/reports/enterprise_fee_summary/report_service.rb b/lib/order_management/reports/enterprise_fee_summary/report_service.rb index a5668a7d69..15ab2a64f0 100644 --- a/lib/order_management/reports/enterprise_fee_summary/report_service.rb +++ b/lib/order_management/reports/enterprise_fee_summary/report_service.rb @@ -7,10 +7,11 @@ module OrderManagement module Reports module EnterpriseFeeSummary class ReportService - attr_accessor :parameters + attr_accessor :parameters, :renderer_klass - def initialize(parameters) + def initialize(parameters, renderer_klass) @parameters = parameters + @renderer_klass = renderer_klass end def enterprise_fees_by_customer @@ -21,6 +22,11 @@ module OrderManagement ReportData::EnterpriseFeeTypeTotals.new(list: enterprise_fee_type_total_list.sort) end + def render + renderer = renderer_klass.new(self) + renderer.render + end + private def enterprise_fee_type_total_list diff --git a/spec/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer_spec.rb b/spec/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer_spec.rb new file mode 100644 index 0000000000..4ed3e9ba21 --- /dev/null +++ b/spec/lib/order_management/reports/enterprise_fee_summary/renderers/csv_renderer_spec.rb @@ -0,0 +1,73 @@ +require "spec_helper" + +require "order_management/reports/enterprise_fee_summary/parameters" +require "order_management/reports/enterprise_fee_summary/report_service" +require "order_management/reports/enterprise_fee_summary/renderers/csv_renderer" + +describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::CsvRenderer do + let(:report_klass) { OrderManagement::Reports::EnterpriseFeeSummary } + + let!(:parameters) { report_klass::Parameters.new } + let!(:service) { report_klass::ReportService.new(parameters, described_class) } + + let!(:enterprise_fee_type_totals) do + instance = report_klass::ReportData::EnterpriseFeeTypeTotals.new + instance.tap do |totals| + totals.list << report_klass::ReportData::EnterpriseFeeTypeTotal.new( + fee_type: "Fee Type A", + enterprise_name: "Enterprise A", + fee_name: "Fee A", + customer_name: "Custoemr A", + fee_placement: "Fee Placement A", + fee_calculated_on_transfer_through_name: "Transfer Enterprise A", + tax_category_name: "Tax Category A", + total_amount: "1.00" + ) + + totals.list << report_klass::ReportData::EnterpriseFeeTypeTotal.new( + fee_type: "Fee Type B", + enterprise_name: "Enterprise B", + fee_name: "Fee C", + customer_name: "Custoemr D", + fee_placement: "Fee Placement E", + fee_calculated_on_transfer_through_name: "Transfer Enterprise F", + tax_category_name: "Tax Category G", + total_amount: "2.00" + ) + end + end + + before do + allow(service).to receive(:enterprise_fee_type_totals) { enterprise_fee_type_totals } + end + + it "generates CSV header" do + result = service.render + csv = CSV.parse(result) + header_row = csv[0] + + # Test all header cells have values + expect(header_row.length).to eq(8) + expect(header_row.all?(&:present?)).to be_truthy + end + + it "generates CSV data rows" do + result = service.render + csv = CSV.parse(result, headers: true) + + expect(csv.length).to eq(2) + + # Test random cells + expect(csv[0][i18n_translate("header.fee_type")]).to eq("Fee Type A") + expect(csv[0][i18n_translate("header.total_amount")]).to eq("1.00") + expect(csv[1][i18n_translate("header.total_amount")]).to eq("2.00") + end + + def i18n_translate(key) + I18n.t(key, scope: i18n_scope) + end + + def i18n_scope + "order_management.reports.enterprise_fee_summary.formats.csv" + end +end diff --git a/spec/lib/order_management/reports/enterprise_fee_summary/report_service_spec.rb b/spec/lib/order_management/reports/enterprise_fee_summary/report_service_spec.rb index 09f7d86441..31d1262ca7 100644 --- a/spec/lib/order_management/reports/enterprise_fee_summary/report_service_spec.rb +++ b/spec/lib/order_management/reports/enterprise_fee_summary/report_service_spec.rb @@ -87,7 +87,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do it "groups and sorts entries correctly" do parameters = OrderManagement::Reports::EnterpriseFeeSummary::Parameters.new - service = described_class.new(parameters) + service = described_class.new(parameters, nil) totals = service.enterprise_fee_type_totals