Merge pull request #10454 from demarches-simplifiees/9827-add-specs
corrige quelques bugs de la feature export template (renommage dans le zip)
This commit is contained in:
commit
45814fdbfb
14 changed files with 282 additions and 69 deletions
|
@ -15,12 +15,12 @@
|
|||
= link_to download_export_path(export_format: format), role: 'menuitem', data: { turbo_method: :post, turbo: true } do
|
||||
= t(".everything_#{format}_html")
|
||||
|
||||
- if export_templates.present?
|
||||
- export_templates.each do |export_template|
|
||||
- if @procedure.feature_enabled?(:export_template)
|
||||
- if export_templates.present?
|
||||
- export_templates.each do |export_template|
|
||||
- menu.with_item do
|
||||
= link_to download_export_path(export_template_id: export_template.id), role: 'menuitem', data: { turbo_method: :post, turbo: true } do
|
||||
= "Exporter à partir du modèle #{export_template.name}"
|
||||
- menu.with_item do
|
||||
= link_to download_export_path(export_template_id: export_template.id), role: 'menuitem', data: { turbo_method: :post, turbo: true } do
|
||||
= "Exporter à partir du modèle #{export_template.name}"
|
||||
- if feature_enabled?(:export_template)
|
||||
- menu.with_item do
|
||||
= link_to new_instructeur_export_template_path(procedure_id: params[:procedure_id]), role: 'menuitem' do
|
||||
Ajouter un modèle d'export
|
||||
= link_to new_instructeur_export_template_path(procedure_id: params[:procedure_id]), role: 'menuitem' do
|
||||
Ajouter un modèle d'export
|
||||
|
|
|
@ -11,9 +11,10 @@ class Dossiers::ExportLinkComponent < ApplicationComponent
|
|||
@export_url = export_url
|
||||
end
|
||||
|
||||
def download_export_path(export_format:, statut:, no_progress_notification: nil)
|
||||
def download_export_path(export_format:, statut:, export_template_id: nil, no_progress_notification: nil)
|
||||
@export_url.call(@procedure,
|
||||
export_format: export_format,
|
||||
export_template_id:,
|
||||
statut: statut,
|
||||
no_progress_notification: no_progress_notification)
|
||||
end
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
= export_title(export)
|
||||
%span.fr-text-mention--grey.fr-mb-1w
|
||||
= time_info(export)
|
||||
- if export.export_template
|
||||
%span.fr-tag.fr-tag--sm.fr-ml-1w
|
||||
= export.export_template.name
|
||||
.fr-ml-auto
|
||||
= badge(export)
|
||||
|
||||
|
@ -14,4 +17,4 @@
|
|||
= export_button(export)
|
||||
|
||||
- if export.failed?
|
||||
= button_to refresh_button_options(export)[:title], download_export_path(export_format: export.format, statut: export.statut), refresh_button_options(export)
|
||||
= button_to refresh_button_options(export)[:title], download_export_path(export_template_id: export.export_template&.id, export_format: export.format, statut: export.statut), refresh_button_options(export)
|
||||
|
|
|
@ -88,10 +88,6 @@ class Champ < ApplicationRecord
|
|||
parent_id.present?
|
||||
end
|
||||
|
||||
def stable_id_with_row
|
||||
[row_id, stable_id].compact
|
||||
end
|
||||
|
||||
# used for the `required` html attribute
|
||||
# check visibility to avoid hidden required input
|
||||
# which prevent the form from being sent.
|
||||
|
|
|
@ -307,7 +307,8 @@ module TagsSubstitutionConcern
|
|||
|
||||
def format_date(date)
|
||||
if date.present?
|
||||
date.strftime('%d/%m/%Y')
|
||||
format = defined?(self.class::FORMAT_DATE) ? self.class::FORMAT_DATE : '%d/%m/%Y'
|
||||
date.strftime(format)
|
||||
else
|
||||
''
|
||||
end
|
||||
|
|
|
@ -7,6 +7,7 @@ class ExportTemplate < ApplicationRecord
|
|||
validates_with ExportTemplateValidator
|
||||
|
||||
DOSSIER_STATE = Dossier.states.fetch(:en_construction)
|
||||
FORMAT_DATE = "%Y-%m-%d"
|
||||
|
||||
def set_default_values
|
||||
content["default_dossier_directory"] = tiptap_json("dossier-")
|
||||
|
@ -48,7 +49,7 @@ class ExportTemplate < ApplicationRecord
|
|||
def attachment_and_path(dossier, attachment, index: 0, row_index: nil, champ: nil)
|
||||
[
|
||||
attachment,
|
||||
path(dossier, attachment, index, row_index, champ)
|
||||
path(dossier, attachment, index:, row_index:, champ:)
|
||||
]
|
||||
end
|
||||
|
||||
|
@ -116,7 +117,7 @@ class ExportTemplate < ApplicationRecord
|
|||
"#{render_attributes_for(content["pdf_name"], dossier)}.pdf"
|
||||
end
|
||||
|
||||
def path(dossier, attachment, index, row_index, champ)
|
||||
def path(dossier, attachment, index: 0, row_index: nil, champ: nil)
|
||||
if attachment.name == 'pdf_export_for_instructeur'
|
||||
return export_path(dossier)
|
||||
end
|
||||
|
@ -128,6 +129,8 @@ class ExportTemplate < ApplicationRecord
|
|||
'messagerie'
|
||||
when 'Avis'
|
||||
'avis'
|
||||
when 'Attestation', 'Etablissement'
|
||||
'pieces_justificatives'
|
||||
else
|
||||
# for attachment
|
||||
return attachment_path(dossier, attachment, index, row_index, champ)
|
||||
|
|
|
@ -169,7 +169,12 @@ class PiecesJustificativesService
|
|||
.filter { |a| safe_attachment(a) }
|
||||
.map do |a|
|
||||
dossier_id = commentaire_id_dossier_id[a.record_id]
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
if @export_template
|
||||
dossier = dossiers.find { _1.id == dossier_id }
|
||||
@export_template.attachment_and_path(dossier, a)
|
||||
else
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -190,7 +195,12 @@ class PiecesJustificativesService
|
|||
.where(record_type: "Etablissement", record_id: etablissement_id_dossier_id.keys)
|
||||
.map do |a|
|
||||
dossier_id = etablissement_id_dossier_id[a.record_id]
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
if @export_template
|
||||
dossier = dossiers.find { _1.id == dossier_id }
|
||||
@export_template.attachment_and_path(dossier, a)
|
||||
else
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -201,7 +211,12 @@ class PiecesJustificativesService
|
|||
.filter { |a| safe_attachment(a) }
|
||||
.map do |a|
|
||||
dossier_id = a.record_id
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
if @export_template
|
||||
dossier = dossiers.find { _1.id == dossier_id }
|
||||
@export_template.attachment_and_path(dossier, a)
|
||||
else
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -217,7 +232,12 @@ class PiecesJustificativesService
|
|||
.where(record_type: "Attestation", record_id: attestation_id_dossier_id.keys)
|
||||
.map do |a|
|
||||
dossier_id = attestation_id_dossier_id[a.record_id]
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
if @export_template
|
||||
dossier = dossiers.find { _1.id == dossier_id }
|
||||
@export_template.attachment_and_path(dossier, a)
|
||||
else
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -241,7 +261,12 @@ class PiecesJustificativesService
|
|||
.filter { |a| safe_attachment(a) }
|
||||
.map do |a|
|
||||
dossier_id = avis_ids_dossier_id[a.record_id]
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
if @export_template
|
||||
dossier = dossiers.find { _1.id == dossier_id }
|
||||
@export_template.attachment_and_path(dossier, a)
|
||||
else
|
||||
ActiveStorage::DownloadableFile.pj_and_path(dossier_id, a)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
- else
|
||||
= t('.no_export_html', expiration_time: Export::MAX_DUREE_CONSERVATION_EXPORT.in_hours.to_i )
|
||||
|
||||
- if feature_enabled?(:export_template)
|
||||
- if @procedure.feature_enabled?(:export_template)
|
||||
%h2.fr-mb-1w.fr-mt-8w
|
||||
Liste des modèles d'export
|
||||
%p.fr-hint-text
|
||||
|
|
|
@ -21,26 +21,45 @@ describe Instructeurs::ExportTemplatesController, type: :controller do
|
|||
{ "type" => "paragraph", "content" => [{ "text" => "DOSSIER_", "type" => "text" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }, { "text" => " ", "type" => "text" }] }
|
||||
]
|
||||
}.to_json,
|
||||
"pjs" =>
|
||||
[
|
||||
{ path: { "type" => "doc", "content" => [{ "type" => "paragraph", "content" => [{ "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }, { "text" => " _justif", "type" => "text" }] }] }, stable_id: "3" },
|
||||
{
|
||||
path:
|
||||
{ "type" => "doc", "content" => [{ "type" => "paragraph", "content" => [{ "text" => "cni_", "type" => "text" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }, { "text" => " ", "type" => "text" }] }] },
|
||||
stable_id: "5"
|
||||
},
|
||||
{
|
||||
path: { "type" => "doc", "content" => [{ "type" => "paragraph", "content" => [{ "text" => "pj_repet_", "type" => "text" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }, { "text" => " ", "type" => "text" }] }] },
|
||||
stable_id: "10"
|
||||
}
|
||||
]
|
||||
tiptap_pj_3: {
|
||||
"type" => "doc",
|
||||
"content" => [{ "type" => "paragraph", "content" => [{ "type" => "text", "text" => "avis-commission-" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }] }]
|
||||
}.to_json,
|
||||
tiptap_pj_5: {
|
||||
|
||||
"type" => "doc",
|
||||
"content" => [{ "type" => "paragraph", "content" => [{ "type" => "text", "text" => "avis-commission-" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }] }]
|
||||
}.to_json,
|
||||
tiptap_pj_10: {
|
||||
|
||||
"type" => "doc",
|
||||
"content" => [{ "type" => "paragraph", "content" => [{ "type" => "text", "text" => "avis-commission-" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }] }]
|
||||
}.to_json
|
||||
}
|
||||
end
|
||||
|
||||
let(:instructeur) { create(:instructeur) }
|
||||
let(:procedure) { create(:procedure, instructeurs: [instructeur]) }
|
||||
let(:procedure) do
|
||||
create(
|
||||
:procedure, instructeurs: [instructeur],
|
||||
types_de_champ_public: [
|
||||
{ type: :piece_justificative, libelle: "pj1", stable_id: 3 },
|
||||
{ type: :piece_justificative, libelle: "pj2", stable_id: 5 },
|
||||
{ type: :piece_justificative, libelle: "pj3", stable_id: 10 }
|
||||
]
|
||||
)
|
||||
end
|
||||
let(:groupe_instructeur) { procedure.defaut_groupe_instructeur }
|
||||
|
||||
describe '#new' do
|
||||
let(:subject) { get :new, params: { procedure_id: procedure.id } }
|
||||
|
||||
it do
|
||||
subject
|
||||
expect(assigns(:export_template)).to be_present
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
let(:subject) { post :create, params: { procedure_id: procedure.id, export_template: export_template_params } }
|
||||
|
||||
|
@ -130,4 +149,19 @@ describe Instructeurs::ExportTemplatesController, type: :controller do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#preview' do
|
||||
render_views
|
||||
|
||||
let(:export_template) { create(:export_template, groupe_instructeur:) }
|
||||
|
||||
let(:subject) { get :preview, params: { procedure_id: procedure.id, id: export_template.id, export_template: export_template_params }, format: :turbo_stream }
|
||||
|
||||
it '' do
|
||||
dossier = create(:dossier, procedure: procedure, for_procedure_preview: true)
|
||||
subject
|
||||
expect(response.body).to include "DOSSIER_#{dossier.id}"
|
||||
expect(response.body).to include "mon_export_#{dossier.id}.pdf"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -11,24 +11,78 @@ FactoryBot.define do
|
|||
{ "type" => "paragraph", "content" => [{ "text" => "export_", "type" => "text" }, { "type" => "mention", "attrs" => { "id" => "dossier_id", "label" => "id dossier" } }, { "text" => " .pdf", "type" => "text" }] }
|
||||
]
|
||||
},
|
||||
"default_dossier_directory" =>
|
||||
{
|
||||
"type" => "doc",
|
||||
"content" =>
|
||||
[
|
||||
{
|
||||
"type" => "paragraph",
|
||||
"content" =>
|
||||
[
|
||||
{ "text" => "dossier_", "type" => "text" },
|
||||
{ "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } },
|
||||
{ "text" => " ", "type" => "text" }
|
||||
]
|
||||
"default_dossier_directory" => {
|
||||
"type" => "doc",
|
||||
"content" =>
|
||||
[
|
||||
{
|
||||
"type" => "paragraph",
|
||||
"content" =>
|
||||
[
|
||||
{ "text" => "dossier_", "type" => "text" },
|
||||
{ "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } },
|
||||
{ "text" => " ", "type" => "text" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
kind { "zip" }
|
||||
|
||||
to_create do |export_template, _context|
|
||||
export_template.set_default_values
|
||||
export_template.save
|
||||
end
|
||||
|
||||
trait :with_custom_content do
|
||||
to_create do |export_template, context|
|
||||
export_template.set_default_values
|
||||
export_template.content = context.content
|
||||
export_template.save
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_custom_ddd_prefix do
|
||||
transient do
|
||||
ddd_prefix { 'dossier_' }
|
||||
end
|
||||
|
||||
to_create do |export_template, context|
|
||||
export_template.set_default_values
|
||||
export_template.content["default_dossier_directory"]["content"] = [
|
||||
{
|
||||
"type" => "paragraph",
|
||||
"content" =>
|
||||
[
|
||||
{ "text" => context.ddd_prefix, "type" => "text" },
|
||||
{ "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } },
|
||||
{ "text" => " ", "type" => "text" }
|
||||
]
|
||||
}
|
||||
]
|
||||
export_template.save
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_date_depot_for_export_pdf do
|
||||
to_create do |export_template, _|
|
||||
export_template.set_default_values
|
||||
export_template.content["pdf_name"]["content"] = [
|
||||
{
|
||||
"type" => "paragraph",
|
||||
"content" =>
|
||||
[
|
||||
{ "text" => "export_", "type" => "text" },
|
||||
{ "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } },
|
||||
{ "text" => "-", "type" => "text" },
|
||||
{ "type" => "mention", "attrs" => { "id" => "dossier_depose_at", "label" => "date de dépôt" } },
|
||||
{ "text" => " ", "type" => "text" }
|
||||
]
|
||||
}
|
||||
]
|
||||
export_template.save
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
describe ExportTemplate do
|
||||
let(:groupe_instructeur) { create(:groupe_instructeur, procedure:) }
|
||||
let(:export_template) { create(:export_template, groupe_instructeur:, content:) }
|
||||
let(:export_template) { create(:export_template, :with_custom_content, groupe_instructeur:, content:) }
|
||||
let(:procedure) { create(:procedure_with_dossiers, types_de_champ_public:, for_individual:) }
|
||||
let(:dossier) { procedure.dossiers.first }
|
||||
let(:for_individual) { false }
|
||||
|
@ -69,6 +69,22 @@ describe ExportTemplate do
|
|||
end
|
||||
end
|
||||
|
||||
describe '#assign_pj_names' do
|
||||
let(:pj_params) do
|
||||
{
|
||||
"tiptap_pj_1" => {
|
||||
"type" => "doc", "content" => [{ "type" => "paragraph", "content" => [{ "type" => "text", "text" => "avis-commission-" }, { "type" => "mention", "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" } }] }]
|
||||
}.to_json
|
||||
}
|
||||
end
|
||||
it 'values content from pj params' do
|
||||
export_template.assign_pj_names(pj_params)
|
||||
expect(export_template.content["pjs"]).to eq [
|
||||
{ :path => { "content" => [{ "content" => [{ "text" => "avis-commission-", "type" => "text" }, { "attrs" => { "id" => "dossier_number", "label" => "numéro du dossier" }, "type" => "mention" }], "type" => "paragraph" }], "type" => "doc" }, :stable_id => "1" }
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
describe '#tiptap_default_dossier_directory' do
|
||||
it 'returns tiptap_default_dossier_directory from content' do
|
||||
expect(export_template.tiptap_default_dossier_directory).to eq({
|
||||
|
@ -174,6 +190,14 @@ describe ExportTemplate do
|
|||
it 'convert pdf_name' do
|
||||
expect(export_template.tiptap_convert(procedure.dossiers.first, "pdf_name")).to eq "mon_export_#{dossier.id}"
|
||||
end
|
||||
|
||||
context 'for date' do
|
||||
let(:export_template) { create(:export_template, :with_date_depot_for_export_pdf, groupe_instructeur:) }
|
||||
let(:dossier) { create(:dossier, :en_construction, procedure:, depose_at: Date.parse("2024/03/30")) }
|
||||
it 'convert date with dash' do
|
||||
expect(export_template.tiptap_convert(dossier, "pdf_name")).to eq "export_#{dossier.id}-2024-03-30"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#tiptap_convert_pj' do
|
||||
|
@ -297,21 +321,37 @@ describe ExportTemplate do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'specific_tags' do
|
||||
context 'for entreprise procedure' do
|
||||
let(:for_individual) { false }
|
||||
context 'for entreprise procedure' do
|
||||
let(:for_individual) { false }
|
||||
describe 'specific_tags' do
|
||||
it do
|
||||
tags = export_template.specific_tags
|
||||
expect(tags.map { _1[:id] }).to eq ["entreprise_siren", "entreprise_numero_tva_intracommunautaire", "entreprise_siret_siege_social", "entreprise_raison_sociale", "entreprise_adresse", "dossier_depose_at", "dossier_procedure_libelle", "dossier_service_name", "dossier_number", "dossier_groupe_instructeur"]
|
||||
end
|
||||
end
|
||||
|
||||
context 'for individual procedure' do
|
||||
let(:for_individual) { true }
|
||||
describe 'tags_for_pj' do
|
||||
it do
|
||||
tags = export_template.tags_for_pj
|
||||
expect(tags.map { _1[:id] }).to eq ["entreprise_siren", "entreprise_numero_tva_intracommunautaire", "entreprise_siret_siege_social", "entreprise_raison_sociale", "entreprise_adresse", "dossier_depose_at", "dossier_procedure_libelle", "dossier_service_name", "dossier_number", "dossier_groupe_instructeur", "original-filename"]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'for individual procedure' do
|
||||
let(:for_individual) { true }
|
||||
describe 'specific_tags' do
|
||||
it do
|
||||
tags = export_template.specific_tags
|
||||
expect(tags.map { _1[:id] }).to eq ["individual_gender", "individual_last_name", "individual_first_name", "dossier_depose_at", "dossier_procedure_libelle", "dossier_service_name", "dossier_number", "dossier_groupe_instructeur"]
|
||||
end
|
||||
end
|
||||
|
||||
describe 'tags_for_pj' do
|
||||
it do
|
||||
tags = export_template.tags_for_pj
|
||||
expect(tags.map { _1[:id] }).to eq ["individual_gender", "individual_last_name", "individual_first_name", "dossier_depose_at", "dossier_procedure_libelle", "dossier_service_name", "dossier_number", "dossier_groupe_instructeur", "original-filename"]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -110,7 +110,7 @@ describe PiecesJustificativesService do
|
|||
it { expect(subject).to match_array(pj_champ.call(dossier).piece_justificative_file.attachments) }
|
||||
|
||||
context 'with export_template' do
|
||||
let(:export_template) { create(:export_template, groupe_instructeur: procedure.defaut_groupe_instructeur).tap(&:set_default_values) }
|
||||
let(:export_template) { create(:export_template, groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
it { expect(subject).to match_array(pj_champ.call(dossier).piece_justificative_file.attachments) }
|
||||
end
|
||||
end
|
||||
|
@ -164,6 +164,13 @@ describe PiecesJustificativesService do
|
|||
end
|
||||
|
||||
it { expect(subject).to match_array(dossier.commentaires.first.piece_jointe.attachments) }
|
||||
|
||||
context 'with export_template' do
|
||||
let(:export_template) { create(:export_template, :with_custom_ddd_prefix, ddd_prefix: "DOSSIER-", groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
it 'uses specific name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template:).liste_documents(dossiers).map(&:second)[0].starts_with?("DOSSIER-#{dossier.id}/messagerie")).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a pj not safe on a commentaire' do
|
||||
|
@ -180,6 +187,13 @@ describe PiecesJustificativesService do
|
|||
let!(:witness) { create(:dossier, :with_justificatif) }
|
||||
|
||||
it { expect(subject).to match_array(dossier.justificatif_motivation.attachment) }
|
||||
|
||||
context 'with export_template' do
|
||||
let(:export_template) { create(:export_template, :with_custom_ddd_prefix, ddd_prefix: "DOSSIER-", groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
it 'uses specific name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template:).liste_documents(dossiers).map(&:second)[0].starts_with?("DOSSIER-#{dossier.id}/dossier")).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a motivation not safe' do
|
||||
|
@ -195,6 +209,16 @@ describe PiecesJustificativesService do
|
|||
let!(:witness) { create(:dossier, :with_attestation) }
|
||||
|
||||
it { expect(subject).to match_array(dossier.attestation.pdf.attachment) }
|
||||
it 'uses default name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template: nil).liste_documents(dossiers).map(&:second)[0].starts_with?("dossier-#{dossier.id}/pieces_justificatives")).to be true
|
||||
end
|
||||
|
||||
context 'with export_template' do
|
||||
let(:export_template) { create(:export_template, :with_custom_ddd_prefix, ddd_prefix: "DOSSIER-", groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
it 'uses specific name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template:).liste_documents(dossiers).map(&:second)[0].starts_with?("DOSSIER-#{dossier.id}/pieces_justificatives")).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with an etablissement' do
|
||||
|
@ -212,6 +236,17 @@ describe PiecesJustificativesService do
|
|||
end
|
||||
|
||||
it { expect(subject).to match_array([attestation_sociale.attachment, attestation_fiscale.attachment]) }
|
||||
|
||||
it 'uses default name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template: nil).liste_documents(dossiers).map(&:second)[0].starts_with?("dossier-#{dossier.id}/pieces_justificatives")).to be true
|
||||
end
|
||||
|
||||
context 'with export_template' do
|
||||
let(:export_template) { create(:export_template, :with_custom_ddd_prefix, ddd_prefix: "DOSSIER-", groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
it 'uses specific name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template:).liste_documents(dossiers).map(&:second)[0].starts_with?("DOSSIER-#{dossier.id}/pieces_justificatives")).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -323,14 +358,14 @@ describe PiecesJustificativesService do
|
|||
|
||||
context 'given an administrateur' do
|
||||
let(:user_profile) { build(:administrateur) }
|
||||
it "doesn't return confidentiel avis.piece_justificative_file" do
|
||||
it "return confidentiel avis.piece_justificative_file" do
|
||||
expect(subject.size).to eq(2)
|
||||
end
|
||||
end
|
||||
|
||||
context 'given an instructeur' do
|
||||
let(:user_profile) { create(:instructeur) }
|
||||
it "doesn't return confidentiel avis.piece_justificative_file" do
|
||||
it "return confidentiel avis.piece_justificative_file" do
|
||||
expect(subject.size).to eq(2)
|
||||
end
|
||||
end
|
||||
|
@ -346,7 +381,7 @@ describe PiecesJustificativesService do
|
|||
let(:experts_procedure) { create(:experts_procedure, expert: user_profile, procedure:) }
|
||||
let(:avis) { create(:avis, experts_procedure:, dossier: dossier, confidentiel: true) }
|
||||
let(:user_profile) { create(:expert) }
|
||||
it "doesn't return confidentiel avis.piece_justificative_file" do
|
||||
it "return confidentiel avis.piece_justificative_file" do
|
||||
expect(subject.size).to eq(2)
|
||||
end
|
||||
end
|
||||
|
@ -370,21 +405,28 @@ describe PiecesJustificativesService do
|
|||
|
||||
context 'given an administrateur' do
|
||||
let(:user_profile) { build(:administrateur) }
|
||||
it "doesn't return confidentiel avis.piece_justificative_file" do
|
||||
it "return confidentiel avis.piece_justificative_file" do
|
||||
expect(subject.size).to eq(2)
|
||||
end
|
||||
end
|
||||
|
||||
context 'given an instructeur' do
|
||||
let(:user_profile) { create(:instructeur) }
|
||||
it "doesn't return confidentiel avis.piece_justificative_file" do
|
||||
it "return confidentiel avis.piece_justificative_file" do
|
||||
expect(subject.size).to eq(2)
|
||||
end
|
||||
|
||||
context 'with export_template' do
|
||||
let(:export_template) { create(:export_template, :with_custom_ddd_prefix, ddd_prefix: "DOSSIER-", groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
it 'uses specific name for dossier directory' do
|
||||
expect(PiecesJustificativesService.new(user_profile:, export_template:).liste_documents(dossiers).map(&:second)[0].starts_with?("DOSSIER-#{dossier.id}/avis")).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'given an expert' do
|
||||
let(:user_profile) { create(:expert) }
|
||||
it "doesn't return confidentiel avis.piece_justificative_file" do
|
||||
it "return confidentiel avis.piece_justificative_file" do
|
||||
expect(subject.size).to eq(2)
|
||||
end
|
||||
end
|
||||
|
@ -397,7 +439,8 @@ describe PiecesJustificativesService do
|
|||
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :repetition, children: [{ type: :piece_justificative }] }]) }
|
||||
let(:dossier) { create(:dossier, :with_populated_champs, procedure: procedure) }
|
||||
let(:dossiers) { Dossier.where(id: dossier.id) }
|
||||
subject { PiecesJustificativesService.new(user_profile:, export_template: nil).generate_dossiers_export(dossiers) }
|
||||
let(:export_template) { nil }
|
||||
subject { PiecesJustificativesService.new(user_profile:, export_template:).generate_dossiers_export(dossiers) }
|
||||
|
||||
it "doesn't update dossier" do
|
||||
expect { subject }.not_to change { dossier.updated_at }
|
||||
|
@ -409,11 +452,24 @@ describe PiecesJustificativesService do
|
|||
let!(:not_confidentiel_avis) { create(:avis, :not_confidentiel, dossier: dossier) }
|
||||
let!(:expert_avis) { create(:avis, :confidentiel, dossier: dossier, expert: user_profile) }
|
||||
|
||||
subject { PiecesJustificativesService.new(user_profile:, export_template: nil).generate_dossiers_export(dossiers) }
|
||||
subject { PiecesJustificativesService.new(user_profile:, export_template:).generate_dossiers_export(dossiers) }
|
||||
it "includes avis not confidentiel as well as expert's avis" do
|
||||
expect_any_instance_of(Dossier).to receive(:avis_for_expert).with(user_profile).and_return([])
|
||||
subject
|
||||
end
|
||||
|
||||
it 'gives default name to export pdf file' do
|
||||
expect(subject.first.second.starts_with?("dossier-#{dossier.id}/export-#{dossier.id}")).to eq true
|
||||
end
|
||||
end
|
||||
|
||||
context 'with export template' do
|
||||
let(:export_template) { create(:export_template, :with_custom_ddd_prefix, ddd_prefix: "DOSSIER-", groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
subject { PiecesJustificativesService.new(user_profile:, export_template:).generate_dossiers_export(dossiers) }
|
||||
|
||||
it 'gives custom name to export pdf file' do
|
||||
expect(subject.first.second).to eq "DOSSIER-#{dossier.id}/export_#{dossier.id}.pdf"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -529,7 +529,7 @@ describe ProcedureExportService do
|
|||
context 'with export_template' do
|
||||
let!(:dossier) { create(:dossier, :accepte, :with_populated_champs, :with_individual, procedure: procedure) }
|
||||
let(:dossier_exports) { PiecesJustificativesService.new(user_profile: instructeur, export_template:).generate_dossiers_export(Dossier.where(id: dossier)) }
|
||||
let(:export_template) { create(:export_template, groupe_instructeur: procedure.defaut_groupe_instructeur).tap(&:set_default_values) }
|
||||
let(:export_template) { create(:export_template, groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
before do
|
||||
allow_any_instance_of(ActiveStorage::Attachment).to receive(:url).and_return("https://opengraph.githubassets.com/d0e7862b24d8026a3c03516d865b28151eb3859029c6c6c2e86605891fbdcd7a/socketry/async-io")
|
||||
end
|
||||
|
|
|
@ -2,7 +2,7 @@ describe ProcedureExportService do
|
|||
let(:instructeur) { create(:instructeur) }
|
||||
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: :piece_justificative, libelle: 'pj' }, { type: :repetition, children: [{ type: :piece_justificative, libelle: 'repet_pj' }] }]) }
|
||||
let(:dossiers) { create_list(:dossier, 10, procedure: procedure) }
|
||||
let(:export_template) { create(:export_template, groupe_instructeur: procedure.defaut_groupe_instructeur).tap(&:set_default_values) }
|
||||
let(:export_template) { create(:export_template, groupe_instructeur: procedure.defaut_groupe_instructeur) }
|
||||
let(:service) { ProcedureExportService.new(procedure, procedure.dossiers, instructeur, export_template) }
|
||||
|
||||
def pj_champ(d) = d.champs_public.find_by(type: 'Champs::PieceJustificativeChamp')
|
||||
|
|
Loading…
Reference in a new issue