From a2e87cbb56e7b8d7b078f5f5b99f419d5c58dff7 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 8 Dec 2020 16:34:38 +0100 Subject: [PATCH] Add attestation, justificatifs, operation_logs and bill_signatures to dossier export --- app/lib/active_storage/downloadable_file.rb | 26 ++++++++++++++----- app/services/pieces_justificatives_service.rb | 17 +++++++++++- .../instructeurs/dossiers_controller_spec.rb | 2 +- .../features/instructeurs/instruction_spec.rb | 7 +++-- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/app/lib/active_storage/downloadable_file.rb b/app/lib/active_storage/downloadable_file.rb index 914ca478d..92b86784f 100644 --- a/app/lib/active_storage/downloadable_file.rb +++ b/app/lib/active_storage/downloadable_file.rb @@ -23,15 +23,29 @@ class ActiveStorage::DownloadableFile private - def self.timestamped_filename(piece_justificative) + def self.timestamped_filename(attachment) # we pad the original file name with a timestamp # and a short id in order to help identify multiple versions and avoid name collisions - extension = File.extname(piece_justificative.filename.to_s) - basename = File.basename(piece_justificative.filename.to_s, extension) - timestamp = piece_justificative.created_at.strftime("%d-%m-%Y-%H-%M") - id = piece_justificative.id % 10000 + folder = self.folder(attachment) + extension = File.extname(attachment.filename.to_s) + basename = File.basename(attachment.filename.to_s, extension) + timestamp = attachment.created_at.strftime("%d-%m-%Y-%H-%M") + id = attachment.id % 10000 - "#{basename}-#{timestamp}-#{id}#{extension}" + "#{folder}/#{basename}-#{timestamp}-#{id}#{extension}" + end + + def self.folder(attachment) + case attachment.record_type + when 'Dossier' + 'dossier' + when 'DossierOperationLog', 'BillSignature' + 'horodatage' + when 'Commentaire' + 'messagerie' + else + 'pieces_justificatives' + end end def using_local_backend? diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 2c4e6fe80..a5903531b 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -2,8 +2,9 @@ class PiecesJustificativesService def self.liste_pieces_justificatives(dossier) pjs_champs = pjs_for_champs(dossier) pjs_commentaires = pjs_for_commentaires(dossier) + pjs_dossier = pjs_for_dossier(dossier) - (pjs_champs + pjs_commentaires) + (pjs_champs + pjs_commentaires + pjs_dossier) .filter(&:attached?) end @@ -59,4 +60,18 @@ class PiecesJustificativesService .commentaires .map(&:piece_jointe) end + + def self.pjs_for_dossier(dossier) + bill_signatures = dossier.dossier_operation_logs.map(&:bill_signature).compact.uniq + + [ + dossier.justificatif_motivation, + dossier.attestation&.pdf, + dossier.etablissement&.entreprise_attestation_sociale, + dossier.etablissement&.entreprise_attestation_fiscale, + dossier.dossier_operation_logs.map(&:serialized), + bill_signatures.map(&:serialized), + bill_signatures.map(&:signature) + ].flatten.compact + end end diff --git a/spec/controllers/instructeurs/dossiers_controller_spec.rb b/spec/controllers/instructeurs/dossiers_controller_spec.rb index 032057a30..f95471b26 100644 --- a/spec/controllers/instructeurs/dossiers_controller_spec.rb +++ b/spec/controllers/instructeurs/dossiers_controller_spec.rb @@ -306,7 +306,7 @@ describe Instructeurs::DossiersController, type: :controller do context 'when the dossier has an attestation' do before do attestation = Attestation.new - allow(attestation).to receive(:pdf).and_return(double(read: 'pdf', size: 2.megabytes)) + allow(attestation).to receive(:pdf).and_return(double(read: 'pdf', size: 2.megabytes, attached?: false)) allow(attestation).to receive(:pdf_url).and_return('http://some_document_url') allow_any_instance_of(Dossier).to receive(:build_attestation).and_return(attestation) diff --git a/spec/features/instructeurs/instruction_spec.rb b/spec/features/instructeurs/instruction_spec.rb index 22e083ad4..573a562b8 100644 --- a/spec/features/instructeurs/instruction_spec.rb +++ b/spec/features/instructeurs/instruction_spec.rb @@ -146,6 +146,7 @@ feature 'Instructing a dossier:' do let(:commentaire) { create(:commentaire, instructeur: instructeur, dossier: dossier) } before do + dossier.passer_en_instruction!(instructeur) champ.piece_justificative_file.attach(io: File.open(path), filename: "piece_justificative_0.pdf", content_type: "application/pdf") log_in(instructeur.email, password) @@ -163,9 +164,10 @@ feature 'Instructing a dossier:' do files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download)) expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip" - expect(files.size).to be 1 + expect(files.size).to be 2 expect(files[0].filename.include?('piece_justificative_0')).to be_truthy expect(files[0].uncompressed_size).to be File.size(path) + expect(files[1].filename.include?('horodatage/operation')).to be_truthy end scenario 'A instructeur can download an archive containing several identical attachments' do @@ -176,12 +178,13 @@ feature 'Instructing a dossier:' do files = ZipTricks::FileReader.read_zip_structure(io: File.open(DownloadHelpers.download)) expect(DownloadHelpers.download).to include "dossier-#{dossier.id}.zip" - expect(files.size).to be 2 + expect(files.size).to be 3 expect(files[0].filename.include?('piece_justificative_0')).to be_truthy expect(files[1].filename.include?('piece_justificative_0')).to be_truthy expect(files[0].filename).not_to eq files[1].filename expect(files[0].uncompressed_size).to be File.size(path) expect(files[1].uncompressed_size).to be File.size(path) + expect(files[2].filename.include?('horodatage/operation')).to be_truthy end after { DownloadHelpers.clear_downloads }