Render enterprise fee report directly in renderer

This commit is contained in:
Kristina Lim
2018-12-06 09:37:58 +08:00
committed by luisramos0
parent c8b154b12a
commit 9e035efd50
10 changed files with 49 additions and 57 deletions

View File

@@ -20,9 +20,8 @@ module Spree
@authorizer = report_klass::Authorizer.new(@report_parameters, @permissions)
@authorizer.authorize!
@report = report_klass::ReportService.new(@permissions, @report_parameters,
report_renderer_klass)
render_report
@report = report_klass::ReportService.new(@permissions, @report_parameters)
renderer.render(self)
rescue OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError => e
flash[:error] = e.message
render_report_form
@@ -55,15 +54,6 @@ module Spree
@permissions = report_klass::Permissions.new(spree_current_user)
end
def render_report
return render_html_report unless @report.renderer.independent_file?
send_data(@report.render, filename: @report.filename)
end
def render_html_report
render action: :index
end
def report_renderer_klass
case params[:report_format]
when "csv"
@@ -74,6 +64,10 @@ module Spree
raise OpenFoodNetwork::Reports::UnsupportedReportFormatException
end
end
def renderer
@renderer ||= report_renderer_klass.new(@report)
end
end
end
end

View File

@@ -2,18 +2,18 @@
%table#enterprise_fee_summary_report.report__table
%thead
%tr
- @report.renderer.header.each do |heading|
- @renderer.header.each do |heading|
%th= heading
%tbody
- @report.renderer.data_rows.each do |row|
- @renderer.data_rows.each do |row|
%tr
- row.each do |cell_value|
%td= cell_value
- if @report.renderer.data_rows.empty?
- if @renderer.data_rows.empty?
%tr
%td{colspan: @report.renderer.header.length}= t(:none)
%td{colspan: @renderer.header.length}= t(:none)
- else
%p.report__message
= t(".select_and_search")

View File

@@ -1,14 +1,15 @@
require "open_food_network/reports/renderers/base"
require "open_food_network/reports/renderers/independent_file"
module OrderManagement
module Reports
module EnterpriseFeeSummary
module Renderers
class CsvRenderer < OpenFoodNetwork::Reports::Renderers::Base
include OpenFoodNetwork::Reports::Renderers::IndependentFile
def render(context)
context.send_data(generate, filename: filename)
end
def render
def generate
CSV.generate do |csv|
render_header(csv)
@@ -18,13 +19,13 @@ module OrderManagement
end
end
private
def filename
timestamp = Time.zone.now.strftime("%Y%m%d")
"enterprise_fee_summary_#{timestamp}.csv"
end
private
def render_header(csv)
csv << [
header_label(:fee_type),

View File

@@ -5,6 +5,11 @@ module OrderManagement
module EnterpriseFeeSummary
module Renderers
class HtmlRenderer < OpenFoodNetwork::Reports::Renderers::Base
def render(context)
context.instance_variable_set :@renderer, self
context.render(action: :create, renderer: self)
end
def header
data_row_attributes.map do |attribute|
header_label(attribute)

View File

@@ -7,14 +7,11 @@ module OrderManagement
module Reports
module EnterpriseFeeSummary
class ReportService
delegate :render, :filename, to: :renderer
attr_accessor :permissions, :parameters
attr_accessor :permissions, :parameters, :renderer_klass
def initialize(permissions, parameters, renderer_klass)
def initialize(permissions, parameters)
@permissions = permissions
@parameters = parameters
@renderer_klass = renderer_klass
end
def enterprise_fees_by_customer
@@ -25,10 +22,6 @@ module OrderManagement
ReportData::EnterpriseFeeTypeTotals.new(list: enterprise_fee_type_total_list.sort)
end
def renderer
@renderer ||= renderer_klass.new(self)
end
private
def permission_filters

View File

@@ -10,7 +10,17 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::CsvRenderer
let!(:permissions) { report_klass::Permissions.new(current_user) }
let!(:parameters) { report_klass::Parameters.new }
let!(:service) { report_klass::ReportService.new(permissions, parameters, described_class) }
let!(:service) { report_klass::ReportService.new(permissions, parameters) }
let!(:renderer) { described_class.new(service) }
# Context which will be passed to the renderer. The response object is not automatically prepared,
# so this has to be assigned explicitly.
let!(:response) { ActionController::TestResponse.new }
let!(:controller) do
ActionController::Base.new.tap do |controller_mock|
controller_mock.instance_variable_set(:@_response, response)
end
end
let!(:enterprise_fee_type_totals) do
instance = report_klass::ReportData::EnterpriseFeeTypeTotals.new
@@ -46,7 +56,8 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::CsvRenderer
end
it "generates CSV header" do
result = service.render
renderer.render(controller)
result = response.body
csv = CSV.parse(result)
header_row = csv[0]
@@ -56,7 +67,8 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::CsvRenderer
end
it "generates CSV data rows" do
result = service.render
renderer.render(controller)
result = response.body
csv = CSV.parse(result, headers: true)
expect(csv.length).to eq(2)
@@ -69,7 +81,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::CsvRenderer
it "generates filename correctly" do
Timecop.freeze(Time.zone.local(2018, 10, 9, 7, 30, 0)) do
filename = service.filename
filename = renderer.__send__(:filename)
expect(filename).to eq("enterprise_fee_summary_20181009.csv")
end
end

View File

@@ -10,7 +10,9 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::HtmlRenderer
let!(:permissions) { report_klass::Permissions.new(current_user) }
let!(:parameters) { report_klass::Parameters.new }
let!(:service) { report_klass::ReportService.new(permissions, parameters, described_class) }
let!(:controller) { Spree::Admin::Reports::EnterpriseFeeSummariesController.new }
let!(:service) { report_klass::ReportService.new(permissions, parameters) }
let!(:renderer) { described_class.new(service) }
let!(:enterprise_fee_type_totals) do
instance = report_klass::ReportData::EnterpriseFeeTypeTotals.new
@@ -46,7 +48,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::HtmlRenderer
end
it "generates header values" do
header_row = service.renderer.header
header_row = renderer.header
# Test all header cells have values
expect(header_row.length).to eq(8)
@@ -54,8 +56,8 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::Renderers::HtmlRenderer
end
it "generates data rows" do
header_row = service.renderer.header
result = service.renderer.data_rows
header_row = renderer.header
result = renderer.data_rows
expect(result.length).to eq(2)

View File

@@ -86,7 +86,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do
let(:permissions) { report_klass::Permissions.new(current_user) }
let(:parameters) { report_klass::Parameters.new }
let(:service) { described_class.new(permissions, parameters, nil) }
let(:service) { described_class.new(permissions, parameters) }
it "groups and sorts entries correctly" do
totals = service.enterprise_fee_type_totals
@@ -165,7 +165,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do
let(:permissions) { report_klass::Permissions.new(current_user) }
let(:parameters) { report_klass::Parameters.new({}) }
let(:service) { described_class.new(permissions, parameters, nil) }
let(:service) { described_class.new(permissions, parameters) }
context "when admin" do
let!(:current_user) { create(:admin_user) }
@@ -194,7 +194,7 @@ describe OrderManagement::Reports::EnterpriseFeeSummary::ReportService do
describe "filters entries correctly" do
let(:permissions) { report_klass::Permissions.new(current_user) }
let(:parameters) { report_klass::Parameters.new(parameters_attributes) }
let(:service) { described_class.new(permissions, parameters, nil) }
let(:service) { described_class.new(permissions, parameters) }
context "filtering by completion date" do
let(:timestamp) { Time.zone.local(2018, 1, 5, 14, 30, 5) }

View File

@@ -2,15 +2,11 @@ module OpenFoodNetwork
module Reports
module Renderers
class Base
attr_accessor :report_data
attr_reader :report_data
def initialize(report_data)
@report_data = report_data
end
def independent_file?
false
end
end
end
end

View File

@@ -1,11 +0,0 @@
module OpenFoodNetwork
module Reports
module Renderers
module IndependentFile
def independent_file?
true
end
end
end
end
end