From 9c73bf193281d4afb4b3714082f80f66f6d3320b Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 7 Apr 2022 15:23:18 +0200 Subject: [PATCH 1/8] batch it --- app/lib/active_storage/downloadable_file.rb | 5 ++- app/services/pieces_justificatives_service.rb | 36 +++++++++++-------- .../pieces_justificatives_service_spec.rb | 2 +- .../services/procedure_export_service_spec.rb | 3 +- 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/app/lib/active_storage/downloadable_file.rb b/app/lib/active_storage/downloadable_file.rb index 3f38007be..ac1cb2a8d 100644 --- a/app/lib/active_storage/downloadable_file.rb +++ b/app/lib/active_storage/downloadable_file.rb @@ -1,8 +1,7 @@ class ActiveStorage::DownloadableFile def self.create_list_from_dossiers(dossiers, for_expert = false) - dossiers - .map { |d| pj_and_path(d.id, PiecesJustificativesService.generate_dossier_export(d)) } + - PiecesJustificativesService.liste_documents(dossiers, for_expert) + PiecesJustificativesService.generate_dossier_export(dossiers) + + PiecesJustificativesService.liste_documents(dossiers, for_expert) end private diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 1e0642e82..30743ad20 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -107,21 +107,29 @@ class PiecesJustificativesService end end - def self.generate_dossier_export(dossier) - pdf = ApplicationController - .render(template: 'dossiers/show', formats: [:pdf], - assigns: { - include_infos_administration: true, - dossier: dossier - }) + def self.generate_dossier_export(dossiers) + pdfs = [] - FakeAttachment.new( - file: StringIO.new(pdf), - filename: "export-#{dossier.id}.pdf", - name: 'pdf_export_for_instructeur', - id: dossier.id, - created_at: dossier.updated_at - ) + dossiers.find_each do |dossier| + pdf = ApplicationController + .render(template: 'dossiers/show', formats: [:pdf], + assigns: { + include_infos_administration: true, + dossier: dossier + }) + + a = FakeAttachment.new( + file: StringIO.new(pdf), + filename: "export-#{dossier.id}.pdf", + name: 'pdf_export_for_instructeur', + id: dossier.id, + created_at: dossier.updated_at + ) + + pdfs << ActiveStorage::DownloadableFile.pj_and_path(dossier.id, a) + end + + pdfs end private diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index a7b715786..a262d6817 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -192,7 +192,7 @@ describe PiecesJustificativesService do describe '.generate_dossier_export' do let(:dossier) { create(:dossier) } - subject { PiecesJustificativesService.generate_dossier_export(dossier) } + subject { PiecesJustificativesService.generate_dossier_export(Dossier.where(id: dossier.id)) } it "doesn't update dossier" do expect { subject }.not_to change { dossier.updated_at } diff --git a/spec/services/procedure_export_service_spec.rb b/spec/services/procedure_export_service_spec.rb index cda5a864f..0422bdfa7 100644 --- a/spec/services/procedure_export_service_spec.rb +++ b/spec/services/procedure_export_service_spec.rb @@ -437,6 +437,7 @@ describe ProcedureExportService do context 'with files (and http calls)' do let!(:dossier) { create(:dossier, :accepte, :with_populated_champs, :with_individual, procedure: procedure) } + let(:dossier_exports) { PiecesJustificativesService.generate_dossier_export(Dossier.where(id: dossier)) } before do allow_any_instance_of(ActiveStorage::Attachment).to receive(:url).and_return("https://opengraph.githubassets.com/d0e7862b24d8026a3c03516d865b28151eb3859029c6c6c2e86605891fbdcd7a/socketry/async-io") @@ -454,7 +455,7 @@ describe ProcedureExportService do "#{service.send(:base_filename)}/dossier-#{dossier.id}/", "#{service.send(:base_filename)}/dossier-#{dossier.id}/pieces_justificatives/", "#{service.send(:base_filename)}/dossier-#{dossier.id}/#{ActiveStorage::DownloadableFile.timestamped_filename(ActiveStorage::Attachment.where(record_type: "Champ").first)}", - "#{service.send(:base_filename)}/dossier-#{dossier.id}/#{ActiveStorage::DownloadableFile.timestamped_filename(PiecesJustificativesService.generate_dossier_export(dossier))}" + "#{service.send(:base_filename)}/dossier-#{dossier.id}/#{ActiveStorage::DownloadableFile.timestamped_filename(dossier_exports.first.first)}" ] expect(files.size).to eq(structure.size) expect(files.map(&:filename)).to match_array(structure) From b9ad3bbce170dba556184469aa6dde29cd7795f6 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 6 Apr 2022 00:20:52 +0200 Subject: [PATCH 2/8] extract procedure --- app/services/pieces_justificatives_service.rb | 7 ++++++- app/views/dossiers/show.pdf.prawn | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 30743ad20..537f78897 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -108,14 +108,19 @@ class PiecesJustificativesService end def self.generate_dossier_export(dossiers) + return [] if dossiers.empty? + pdfs = [] + procedure = dossiers.first.procedure + dossiers.find_each do |dossier| pdf = ApplicationController .render(template: 'dossiers/show', formats: [:pdf], assigns: { include_infos_administration: true, - dossier: dossier + dossier: dossier, + procedure: procedure }) a = FakeAttachment.new( diff --git a/app/views/dossiers/show.pdf.prawn b/app/views/dossiers/show.pdf.prawn index b3b86eba6..6b7ea71b6 100644 --- a/app/views/dossiers/show.pdf.prawn +++ b/app/views/dossiers/show.pdf.prawn @@ -205,6 +205,7 @@ def add_etats_dossier(pdf, dossier) end prawn_document(page_size: "A4") do |pdf| + @procedure ||= @dossier.procedure pdf.font_families.update( 'marianne' => { normal: Rails.root.join('lib/prawn/fonts/marianne/marianne-regular.ttf' ), bold: Rails.root.join('lib/prawn/fonts/marianne/marianne-bold.ttf' ), @@ -216,8 +217,8 @@ prawn_document(page_size: "A4") do |pdf| end format_in_2_columns(pdf, 'Dossier Nº', @dossier.id.to_s) - format_in_2_columns(pdf, 'Démarche', @dossier.procedure.libelle) - format_in_2_columns(pdf, 'Organisme', @dossier.procedure.organisation_name) + format_in_2_columns(pdf, 'Démarche', @procedure.libelle) + format_in_2_columns(pdf, 'Organisme', @procedure.organisation_name) add_etat_dossier(pdf, @dossier) From 4dbd44d72a0adb6a8008859ef76cdae6adef0f47 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 7 Apr 2022 15:13:34 +0200 Subject: [PATCH 3/8] includes stuff --- app/services/pieces_justificatives_service.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 537f78897..b195a4bc1 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -114,7 +114,11 @@ class PiecesJustificativesService procedure = dossiers.first.procedure - dossiers.find_each do |dossier| + dossiers + .includes(:champs, :champs_private, :commentaires, :individual, + :traitement, :etablissement, + user: :france_connect_information, avis: :expert) + .find_each do |dossier| pdf = ApplicationController .render(template: 'dossiers/show', formats: [:pdf], assigns: { From ca8dc34196a72b407dba635b224e4e39ddbd8140 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Thu, 7 Apr 2022 15:26:24 +0200 Subject: [PATCH 4/8] preload all tdc once for all --- app/services/pieces_justificatives_service.rb | 8 +++++++- app/views/dossiers/show.pdf.prawn | 16 ++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index b195a4bc1..b24d4cf20 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -113,6 +113,11 @@ class PiecesJustificativesService pdfs = [] procedure = dossiers.first.procedure + tdc_by_id = TypeDeChamp + .joins(:revisions) + .where(revisions: { id: procedure.revisions }) + .to_a + .group_by(&:id) dossiers .includes(:champs, :champs_private, :commentaires, :individual, @@ -124,7 +129,8 @@ class PiecesJustificativesService assigns: { include_infos_administration: true, dossier: dossier, - procedure: procedure + procedure: procedure, + tdc_by_id: tdc_by_id }) a = FakeAttachment.new( diff --git a/app/views/dossiers/show.pdf.prawn b/app/views/dossiers/show.pdf.prawn index 6b7ea71b6..153b194f6 100644 --- a/app/views/dossiers/show.pdf.prawn +++ b/app/views/dossiers/show.pdf.prawn @@ -130,28 +130,30 @@ def add_identite_etablissement(pdf, etablissement) end def add_single_champ(pdf, champ) + tdc = @tdc_by_id[champ.type_de_champ_id].first + case champ.type when 'Champs::PieceJustificativeChamp', 'Champs::TitreIdentiteChamp' return when 'Champs::HeaderSectionChamp' - add_section_title(pdf, champ.libelle) + add_section_title(pdf, tdc.libelle) when 'Champs::ExplicationChamp' - format_in_2_lines(pdf, champ.libelle, champ.description) + format_in_2_lines(pdf, tdc.libelle, tdc.description) when 'Champs::CarteChamp' - format_in_2_lines(pdf, champ.libelle, champ.to_feature_collection.to_json) + format_in_2_lines(pdf, tdc.libelle, champ.to_feature_collection.to_json) when 'Champs::SiretChamp' pdf.font 'marianne', style: :bold do - pdf.text champ.libelle + pdf.text tdc.libelle end if champ.etablissement.present? add_identite_etablissement(pdf, champ.etablissement) end when 'Champs::NumberChamp' value = champ.to_s.empty? ? 'Non communiqué' : number_with_delimiter(champ.to_s) - format_in_2_lines(pdf, champ.libelle, value) + format_in_2_lines(pdf, tdc.libelle, value) else value = champ.to_s.empty? ? 'Non communiqué' : champ.to_s - format_in_2_lines(pdf, champ.libelle, value) + format_in_2_lines(pdf, tdc.libelle, value) end end @@ -206,6 +208,8 @@ end prawn_document(page_size: "A4") do |pdf| @procedure ||= @dossier.procedure + @tdc_by_id ||= @dossier.champs.map(&:type_de_champ).group_by(&:id) + pdf.font_families.update( 'marianne' => { normal: Rails.root.join('lib/prawn/fonts/marianne/marianne-regular.ttf' ), bold: Rails.root.join('lib/prawn/fonts/marianne/marianne-bold.ttf' ), From 821fd2394baf5ef8ff6b7f6c40f984ce56064555 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 6 Apr 2022 00:49:59 +0200 Subject: [PATCH 5/8] small refactor --- app/models/dossier.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 106924547..45b55f0e3 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -553,8 +553,9 @@ class Dossier < ApplicationRecord end def motivation - return nil if !termine? - traitement&.motivation || read_attribute(:motivation) + if termine? + traitement&.motivation || read_attribute(:motivation) + end end def update_search_terms From 5d5f46b4d8055c08c2dd2df4389cc04474770f50 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Mon, 28 Mar 2022 15:10:37 +0200 Subject: [PATCH 6/8] instances : prawn does not like svg win 10% on pdf generation --- Gemfile | 1 - Gemfile.lock | 4 ---- app/assets/images/header/logo-ds-wide.png | Bin 0 -> 18553 bytes app/views/dossiers/dossier_vide.pdf.prawn | 2 +- app/views/dossiers/show.pdf.prawn | 2 +- app/views/users/dossiers/papertrail.pdf.prawn | 2 +- config/env.example.optional | 2 +- config/initializers/images.rb | 2 +- 8 files changed, 5 insertions(+), 10 deletions(-) create mode 100644 app/assets/images/header/logo-ds-wide.png diff --git a/Gemfile b/Gemfile index a26e635c2..40588c9af 100644 --- a/Gemfile +++ b/Gemfile @@ -62,7 +62,6 @@ gem 'openid_connect' gem 'pg' gem 'phonelib' gem 'prawn-rails' # PDF Generation -gem 'prawn-svg' gem 'premailer-rails' gem 'puma' # Use Puma as the app server gem 'pundit' diff --git a/Gemfile.lock b/Gemfile.lock index 22dea5595..e1f373556 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -478,9 +478,6 @@ GEM prawn prawn-table rails (>= 3.1.0) - prawn-svg (0.31.0) - css_parser (~> 1.6) - prawn (>= 0.11.1, < 3) prawn-table (0.2.2) prawn (>= 1.3.0, < 3.0.0) premailer (1.14.2) @@ -868,7 +865,6 @@ DEPENDENCIES pg phonelib prawn-rails - prawn-svg premailer-rails pry-byebug puma diff --git a/app/assets/images/header/logo-ds-wide.png b/app/assets/images/header/logo-ds-wide.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ac0f35319574a377870e6f6150bf2d21b2e8d9 GIT binary patch literal 18553 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 literal 0 HcmV?d00001 diff --git a/app/views/dossiers/dossier_vide.pdf.prawn b/app/views/dossiers/dossier_vide.pdf.prawn index cd2add4a1..3630c5707 100644 --- a/app/views/dossiers/dossier_vide.pdf.prawn +++ b/app/views/dossiers/dossier_vide.pdf.prawn @@ -206,7 +206,7 @@ prawn_document(page_size: "A4") do |pdf| italic: Rails.root.join('lib/prawn/fonts/marianne/marianne-thin.ttf' ), }) pdf.font 'marianne' - pdf.svg IO.read(DOSSIER_PDF_EXPORT_LOGO_SRC), width: 300, position: :center + pdf.image DOSSIER_PDF_EXPORT_LOGO_SRC, width: 300, position: :center pdf.move_down(40) render_in_2_columns(pdf, 'Démarche', @dossier.procedure.libelle) diff --git a/app/views/dossiers/show.pdf.prawn b/app/views/dossiers/show.pdf.prawn index 153b194f6..182d60fc0 100644 --- a/app/views/dossiers/show.pdf.prawn +++ b/app/views/dossiers/show.pdf.prawn @@ -217,7 +217,7 @@ prawn_document(page_size: "A4") do |pdf| pdf.font 'marianne' pdf.pad_bottom(40) do - pdf.svg IO.read(DOSSIER_PDF_EXPORT_LOGO_SRC), width: 300, position: :center + pdf.image DOSSIER_PDF_EXPORT_LOGO_SRC, width: 300, position: :center end format_in_2_columns(pdf, 'Dossier Nº', @dossier.id.to_s) diff --git a/app/views/users/dossiers/papertrail.pdf.prawn b/app/views/users/dossiers/papertrail.pdf.prawn index 275055b09..110872796 100644 --- a/app/views/users/dossiers/papertrail.pdf.prawn +++ b/app/views/users/dossiers/papertrail.pdf.prawn @@ -26,7 +26,7 @@ prawn_document(margin: [top_margin, right_margin, bottom_margin, left_margin], p black = '333333' pdf.float do - pdf.svg IO.read(DOSSIER_DEPOSIT_RECEIPT_LOGO_SRC), height: 64 + pdf.image DOSSIER_PDF_EXPORT_LOGO_SRC, height: 64 end pdf.bounding_box([110, pdf.cursor - 18], width: header_width - 200) do diff --git a/config/env.example.optional b/config/env.example.optional index ad14b402a..73b01bbc5 100644 --- a/config/env.example.optional +++ b/config/env.example.optional @@ -72,7 +72,7 @@ DS_ENV="staging" # DOSSIER_DEPOSIT_RECEIPT_LOGO_SRC="app/assets/images/republique-francaise-logo.svg" # Instance customization: PDF export logo ---> to be put in "app/assets/images" -# DOSSIER_PDF_EXPORT_LOGO_SRC="app/assets/images/header/logo-ds-wide.svg" +# DOSSIER_PDF_EXPORT_LOGO_SRC="app/assets/images/header/logo-ds-wide.png" # Instance customization: watermark for identity documents # WATERMARK_FILE="" diff --git a/config/initializers/images.rb b/config/initializers/images.rb index bfa9e34f3..33c210ab9 100644 --- a/config/initializers/images.rb +++ b/config/initializers/images.rb @@ -20,4 +20,4 @@ PROCEDURE_DEFAULT_LOGO_SRC = ENV.fetch("PROCEDURE_DEFAULT_LOGO_SRC", "republique DOSSIER_DEPOSIT_RECEIPT_LOGO_SRC = ENV.fetch("DOSSIER_DEPOSIT_RECEIPT_LOGO_SRC", "app/assets/images/republique-francaise-logo.svg") # Logo in PDF export of a "Dossier" -DOSSIER_PDF_EXPORT_LOGO_SRC = ENV.fetch("DOSSIER_PDF_EXPORT_LOGO_SRC", "app/assets/images/header/logo-ds-wide.svg") +DOSSIER_PDF_EXPORT_LOGO_SRC = ENV.fetch("DOSSIER_PDF_EXPORT_LOGO_SRC", "app/assets/images/header/logo-ds-wide.png") From 430365768a80c4f28bed974b28263ab59e369608 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 21 Jul 2022 10:01:10 +0200 Subject: [PATCH 7/8] test(dossier.pdf): add a test case with piece_justificative inside repetition --- .../api/v1/dossiers_controller_spec.rb | 6 +++--- spec/factories/champ.rb | 9 +++++---- spec/factories/type_de_champ.rb | 19 +++++++++++-------- .../pieces_justificatives_service_spec.rb | 7 ++++++- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/spec/controllers/api/v1/dossiers_controller_spec.rb b/spec/controllers/api/v1/dossiers_controller_spec.rb index 152b2f38d..08dd00196 100644 --- a/spec/controllers/api/v1/dossiers_controller_spec.rb +++ b/spec/controllers/api/v1/dossiers_controller_spec.rb @@ -263,9 +263,9 @@ describe API::V1::DossiersController do it 'should have rows' do expect(subject.size).to eq(2) expect(subject[0][:id]).to eq(1) - expect(subject[0][:champs].size).to eq(2) - expect(subject[0][:champs].map { |c| c[:value] }).to eq(['text', '42']) - expect(subject[0][:champs].map { |c| c[:type_de_champ][:type_champ] }).to eq(['text', 'number']) + expect(subject[0][:champs].size).to eq(3) + expect(subject[0][:champs].map { |c| c[:value] }).to eq(['text', 'text', '42']) + expect(subject[0][:champs].map { |c| c[:type_de_champ][:type_champ] }).to eq(['text', 'text', 'number']) end end end diff --git a/spec/factories/champ.rb b/spec/factories/champ.rb index 6724c9f91..10e79fcae 100644 --- a/spec/factories/champ.rb +++ b/spec/factories/champ.rb @@ -226,6 +226,7 @@ FactoryBot.define do position: 0, parent: parent, libelle: 'Nom') + types_de_champ.push(type_de_champ_text) end type_de_champ_number = types_de_champ.find { |tdc| tdc.libelle == 'Age' } @@ -235,13 +236,13 @@ FactoryBot.define do position: 1, parent: parent, libelle: 'Age') + types_de_champ.push(type_de_champ_number) end evaluator.rows.times do |row| - champ_repetition.champs << [ - build(:champ_text, dossier: champ_repetition.dossier, row: row, type_de_champ: type_de_champ_text, parent: champ_repetition), - build(:champ_number, dossier: champ_repetition.dossier, row: row, type_de_champ: type_de_champ_number, parent: champ_repetition) - ] + champ_repetition.champs << types_de_champ.map do |type_de_champ| + build(:"champ_#{type_de_champ.type_champ}", dossier: champ_repetition.dossier, row: row, type_de_champ: type_de_champ, parent: champ_repetition) + end end end diff --git a/spec/factories/type_de_champ.rb b/spec/factories/type_de_champ.rb index cc0e18cac..514eafd88 100644 --- a/spec/factories/type_de_champ.rb +++ b/spec/factories/type_de_champ.rb @@ -10,19 +10,22 @@ FactoryBot.define do procedure { nil } position { nil } parent { nil } + no_coordinate { false } end after(:build) do |type_de_champ, evaluator| - revision = evaluator.procedure&.active_revision || build(:procedure_revision) - evaluator.procedure&.save + if !evaluator.no_coordinate + revision = evaluator.procedure&.active_revision || build(:procedure_revision) + evaluator.procedure&.save - revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, - position: evaluator.position || 0, - revision: revision, - type_de_champ: type_de_champ, - parent: evaluator.parent) + revision.revision_types_de_champ << build(:procedure_revision_type_de_champ, + position: evaluator.position || 0, + revision: revision, + type_de_champ: type_de_champ, + parent: evaluator.parent) - revision.save + revision.save + end end trait :private do diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index a262d6817..7b12b1892 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -190,7 +190,12 @@ describe PiecesJustificativesService do end describe '.generate_dossier_export' do - let(:dossier) { create(:dossier) } + let(:procedure) do + create(:procedure, :with_piece_justificative).tap do |procedure| + create(:type_de_champ_repetition, procedure: procedure, types_de_champ: [create(:type_de_champ_piece_justificative, procedure: procedure, no_coordinate: true)]) + end + end + let(:dossier) { create(:dossier, :with_populated_champs, procedure: procedure) } subject { PiecesJustificativesService.generate_dossier_export(Dossier.where(id: dossier.id)) } From 1fe82a956edba4636ca1227e5dd20bca59edabd7 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 21 Jul 2022 11:03:49 +0200 Subject: [PATCH 8/8] fix(dossier.pdf): load all types_de_champ (including repetitions) --- app/services/pieces_justificatives_service.rb | 2 +- app/views/dossiers/show.pdf.prawn | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index b24d4cf20..d65a3d666 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -117,7 +117,7 @@ class PiecesJustificativesService .joins(:revisions) .where(revisions: { id: procedure.revisions }) .to_a - .group_by(&:id) + .index_by(&:id) dossiers .includes(:champs, :champs_private, :commentaires, :individual, diff --git a/app/views/dossiers/show.pdf.prawn b/app/views/dossiers/show.pdf.prawn index 182d60fc0..4faaa12ea 100644 --- a/app/views/dossiers/show.pdf.prawn +++ b/app/views/dossiers/show.pdf.prawn @@ -130,7 +130,7 @@ def add_identite_etablissement(pdf, etablissement) end def add_single_champ(pdf, champ) - tdc = @tdc_by_id[champ.type_de_champ_id].first + tdc = @tdc_by_id[champ.type_de_champ_id] case champ.type when 'Champs::PieceJustificativeChamp', 'Champs::TitreIdentiteChamp' @@ -208,7 +208,7 @@ end prawn_document(page_size: "A4") do |pdf| @procedure ||= @dossier.procedure - @tdc_by_id ||= @dossier.champs.map(&:type_de_champ).group_by(&:id) + @tdc_by_id ||= @dossier.revision.types_de_champ.index_by(&:id) pdf.font_families.update( 'marianne' => { normal: Rails.root.join('lib/prawn/fonts/marianne/marianne-regular.ttf' ),