Add CSV renderer for enterprise fee summary report

This commit is contained in:
Kristina Lim
2018-10-03 18:40:29 +08:00
committed by luisramos0
parent 00e70733b0
commit ed2b8e9b9f
6 changed files with 163 additions and 3 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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