Merge pull request #1802 from SocialGouv/issue-1494
Warn a user before accepting a dossier if fields of the attestation are empty
This commit is contained in:
commit
f2f7fae6c9
5 changed files with 126 additions and 0 deletions
|
@ -27,4 +27,21 @@
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
margin-bottom: $default-spacer * 2;
|
margin-bottom: $default-spacer * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
background-color: $orange-bg;
|
||||||
|
padding: $default-spacer;
|
||||||
|
margin-bottom: $default-spacer * 2;
|
||||||
|
border-radius: 3px;
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
margin-top: $default-spacer;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: disc;
|
||||||
|
padding-left: $default-spacer * 1.5;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,20 @@ class AttestationTemplate < ApplicationRecord
|
||||||
Attestation.new(title: replace_tags(title, dossier), pdf: build_pdf(dossier))
|
Attestation.new(title: replace_tags(title, dossier), pdf: build_pdf(dossier))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def unspecified_champs_for_dossier(dossier)
|
||||||
|
all_champs_with_libelle_index = (dossier.champs + dossier.champs_private)
|
||||||
|
.reduce({}) do |acc, champ|
|
||||||
|
acc[champ.libelle] = champ
|
||||||
|
acc
|
||||||
|
end
|
||||||
|
|
||||||
|
used_tags.map do |used_tag|
|
||||||
|
corresponding_champ = all_champs_with_libelle_index[used_tag]
|
||||||
|
|
||||||
|
corresponding_champ.value.blank? ? corresponding_champ : nil
|
||||||
|
end.compact
|
||||||
|
end
|
||||||
|
|
||||||
def dup
|
def dup
|
||||||
result = AttestationTemplate.new(title: title, body: body, footer: footer, activated: activated)
|
result = AttestationTemplate.new(title: title, body: body, footer: footer, activated: activated)
|
||||||
|
|
||||||
|
@ -33,6 +47,14 @@ class AttestationTemplate < ApplicationRecord
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def used_tags
|
||||||
|
delimiters_regex = /--(?<capture>((?!--).)*)--/
|
||||||
|
|
||||||
|
[title, body]
|
||||||
|
.map { |str| str.scan(delimiters_regex) }
|
||||||
|
.flatten
|
||||||
|
end
|
||||||
|
|
||||||
def logo_signature_file_size
|
def logo_signature_file_size
|
||||||
%i[logo signature]
|
%i[logo signature]
|
||||||
.select { |file_name| send(file_name).present? }
|
.select { |file_name| send(file_name).present? }
|
||||||
|
|
|
@ -283,6 +283,16 @@ class Dossier < ApplicationRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def unspecified_attestation_champs
|
||||||
|
attestation_template = procedure.attestation_template
|
||||||
|
|
||||||
|
if attestation_template.present? && attestation_template.activated?
|
||||||
|
attestation_template.unspecified_champs_for_dossier(self)
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def build_attestation
|
def build_attestation
|
||||||
if procedure.attestation_template.present? && procedure.attestation_template.activated?
|
if procedure.attestation_template.present? && procedure.attestation_template.activated?
|
||||||
procedure.attestation_template.attestation_for(self)
|
procedure.attestation_template.attestation_for(self)
|
||||||
|
|
|
@ -8,6 +8,25 @@
|
||||||
- if title == 'Accepter'
|
- if title == 'Accepter'
|
||||||
%p.help
|
%p.help
|
||||||
L'acceptation du dossier envoie automatiquement une attestation à l'usager.
|
L'acceptation du dossier envoie automatiquement une attestation à l'usager.
|
||||||
|
|
||||||
|
- unspecified_attestation_champs = dossier.unspecified_attestation_champs
|
||||||
|
- if unspecified_attestation_champs.present?
|
||||||
|
.warning
|
||||||
|
Attention, les valeurs suivantes n'ont pas été renseignées mais sont nécessaires pour pouvoir envoyer une attestation valide :
|
||||||
|
- unspecified_champs, unspecified_annotations_privees = unspecified_attestation_champs.partition(&:private)
|
||||||
|
|
||||||
|
- if unspecified_champs.present?
|
||||||
|
%h4 Champs de la demande
|
||||||
|
%ul
|
||||||
|
- unspecified_attestation_champs.each do |unspecified_champ|
|
||||||
|
%li= unspecified_champ.libelle
|
||||||
|
|
||||||
|
- if unspecified_annotations_privees.present?
|
||||||
|
%h4 Annotations privées
|
||||||
|
%ul
|
||||||
|
- unspecified_annotations_privees.each do |unspecified_annotations_privee|
|
||||||
|
%li= unspecified_annotations_privee.libelle
|
||||||
|
|
||||||
.text-right
|
.text-right
|
||||||
%span.button{ onclick: 'DS.motivationCancel();' } Annuler
|
%span.button{ onclick: 'DS.motivationCancel();' } Annuler
|
||||||
= button_tag 'Valider la décision', name: :process_action, value: process_action, class: 'button primary', title: title, data: { confirm: confirm }
|
= button_tag 'Valider la décision', name: :process_action, value: process_action, class: 'button primary', title: title, data: { confirm: confirm }
|
||||||
|
|
|
@ -643,6 +643,64 @@ describe Dossier do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#unspecified_attestation_champs" do
|
||||||
|
let(:procedure) { create(:procedure, attestation_template: attestation_template) }
|
||||||
|
let(:dossier) { create(:dossier, procedure: procedure, state: :en_instruction) }
|
||||||
|
|
||||||
|
subject { dossier.unspecified_attestation_champs.map(&:libelle) }
|
||||||
|
|
||||||
|
context "without attestation template" do
|
||||||
|
let(:attestation_template) { nil }
|
||||||
|
|
||||||
|
it { is_expected.to eq([]) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "with attestation template" do
|
||||||
|
# Test all combinations:
|
||||||
|
# - with tag specified and unspecified
|
||||||
|
# - with tag in body and tag in title
|
||||||
|
# - with tag correponsing to a champ and an annotation privée
|
||||||
|
# - with a dash in the champ libelle / tag
|
||||||
|
let(:title) { "voici --specified champ-in-title-- un --unspecified champ-in-title-- beau --specified annotation privée-in-title-- titre --unspecified annotation privée-in-title-- non" }
|
||||||
|
let(:body) { "voici --specified champ-in-body-- un --unspecified champ-in-body-- beau --specified annotation privée-in-body-- body --unspecified annotation privée-in-body-- non ?" }
|
||||||
|
let(:attestation_template) { create(:attestation_template, title: title, body: body, activated: activated) }
|
||||||
|
|
||||||
|
context "which is disabled" do
|
||||||
|
let(:activated) { false }
|
||||||
|
|
||||||
|
it { is_expected.to eq([]) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context "wich is enabled" do
|
||||||
|
let(:activated) { true }
|
||||||
|
|
||||||
|
let!(:tdc_1) { create(:type_de_champ, libelle: "specified champ-in-title", procedure: procedure) }
|
||||||
|
let!(:tdc_2) { create(:type_de_champ, libelle: "unspecified champ-in-title", procedure: procedure) }
|
||||||
|
let!(:tdc_3) { create(:type_de_champ, libelle: "specified champ-in-body", procedure: procedure) }
|
||||||
|
let!(:tdc_4) { create(:type_de_champ, libelle: "unspecified champ-in-body", procedure: procedure) }
|
||||||
|
let!(:tdc_5) { create(:type_de_champ, private: true, libelle: "specified annotation privée-in-title", procedure: procedure) }
|
||||||
|
let!(:tdc_6) { create(:type_de_champ, private: true, libelle: "unspecified annotation privée-in-title", procedure: procedure) }
|
||||||
|
let!(:tdc_7) { create(:type_de_champ, private: true, libelle: "specified annotation privée-in-body", procedure: procedure) }
|
||||||
|
let!(:tdc_8) { create(:type_de_champ, private: true, libelle: "unspecified annotation privée-in-body", procedure: procedure) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
(dossier.champs + dossier.champs_private)
|
||||||
|
.select { |c| c.libelle.match?(/^specified/) }
|
||||||
|
.each { |c| c.update_attribute(:value, "specified") }
|
||||||
|
end
|
||||||
|
|
||||||
|
it do
|
||||||
|
is_expected.to eq([
|
||||||
|
"unspecified champ-in-title",
|
||||||
|
"unspecified annotation privée-in-title",
|
||||||
|
"unspecified champ-in-body",
|
||||||
|
"unspecified annotation privée-in-body"
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#build_attestation' do
|
describe '#build_attestation' do
|
||||||
let(:attestation_template) { nil }
|
let(:attestation_template) { nil }
|
||||||
let(:procedure) { create(:procedure, attestation_template: attestation_template) }
|
let(:procedure) { create(:procedure, attestation_template: attestation_template) }
|
||||||
|
|
Loading…
Add table
Reference in a new issue