Merge pull request #1175 from sgmap/fix_1110-align_mail_and_document_templates
Fix 1110 3. align mail and document templates
This commit is contained in:
commit
de30b27ad1
13 changed files with 88 additions and 35 deletions
|
@ -6,24 +6,24 @@ module MailTemplateConcern
|
||||||
|
|
||||||
TAGS = []
|
TAGS = []
|
||||||
TAGS << TAG_NUMERO_DOSSIER = {
|
TAGS << TAG_NUMERO_DOSSIER = {
|
||||||
name: "numero_dossier",
|
libelle: "numero_dossier",
|
||||||
description: "Permet d'afficher le numéro de dossier de l'utilisateur."
|
description: "Permet d'afficher le numéro de dossier de l'utilisateur."
|
||||||
}
|
}
|
||||||
TAGS << TAG_LIEN_DOSSIER = {
|
TAGS << TAG_LIEN_DOSSIER = {
|
||||||
name: "lien_dossier",
|
libelle: "lien_dossier",
|
||||||
description: "Permet d'afficher un lien vers le dossier de l'utilisateur."
|
description: "Permet d'afficher un lien vers le dossier de l'utilisateur."
|
||||||
}
|
}
|
||||||
TAGS << TAG_LIBELLE_PROCEDURE = {
|
TAGS << TAG_LIBELLE_PROCEDURE = {
|
||||||
name: "libelle_procedure",
|
libelle: "libelle_procedure",
|
||||||
description: "Permet d'afficher le libellé de la procédure."
|
description: "Permet d'afficher le libellé de la procédure."
|
||||||
}
|
}
|
||||||
TAGS << TAG_DATE_DE_DECISION = {
|
TAGS << TAG_DATE_DE_DECISION = {
|
||||||
name: "date_de_decision",
|
libelle: "date_de_decision",
|
||||||
description: "Permet d'afficher la date à laquelle la décision finale (acceptation, refus, classement sans suite) sur le dossier a été prise."
|
description: "Permet d'afficher la date à laquelle la décision finale (acceptation, refus, classement sans suite) sur le dossier a été prise."
|
||||||
}
|
}
|
||||||
TAGS << TAG_MOTIVATION = {
|
TAGS << TAG_MOTIVATION = {
|
||||||
name: "motivation",
|
libelle: "motivation",
|
||||||
description: "Permet d'afficher la motivation associée à la décision finale (acceptation, refus, classement sans suite) sur le dossier. Attention, elle est facultative."
|
description: "Permet d'afficher la motivation associée à la décision finale (acceptation, refus, classement sans suite) sur le dossier. Attention, elle est facultative."
|
||||||
}
|
}
|
||||||
|
|
||||||
def object_for_dossier(dossier)
|
def object_for_dossier(dossier)
|
||||||
|
@ -34,16 +34,20 @@ module MailTemplateConcern
|
||||||
replace_tags(body, dossier)
|
replace_tags(body, dossier)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def tags
|
||||||
|
self.class.const_get(:ALLOWED_TAGS)
|
||||||
|
end
|
||||||
|
|
||||||
def replace_tags(string, dossier)
|
def replace_tags(string, dossier)
|
||||||
TAGS.inject(string) do |acc, tag|
|
TAGS.inject(string) do |acc, tag|
|
||||||
acc.gsub("--#{tag[:name]}--", replace_tag(tag, dossier)) || acc
|
acc.gsub("--#{tag[:libelle]}--", replace_tag(tag, dossier)) || acc
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module ClassMethods
|
module ClassMethods
|
||||||
def default
|
def default_for_procedure(procedure)
|
||||||
body = ActionController::Base.new.render_to_string(template: self.const_get(:TEMPLATE_NAME))
|
body = ActionController::Base.new.render_to_string(template: self.const_get(:TEMPLATE_NAME))
|
||||||
self.new(object: self.const_get(:DEFAULT_OBJECT), body: body)
|
self.new(object: self.const_get(:DEFAULT_OBJECT), body: body, procedure: procedure)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,27 @@
|
||||||
module TagsSubstitutionConcern
|
module TagsSubstitutionConcern
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
def tags
|
def tags(is_dossier_termine: true)
|
||||||
if procedure.for_individual?
|
if procedure.for_individual?
|
||||||
identity_tags = individual_tags
|
identity_tags = individual_tags
|
||||||
else
|
else
|
||||||
identity_tags = entreprise_tags + etablissement_tags
|
identity_tags = entreprise_tags + etablissement_tags
|
||||||
end
|
end
|
||||||
|
|
||||||
identity_tags + dossier_tags + procedure_type_de_champ_public_private_tags
|
tags = identity_tags + dossier_tags + procedure_type_de_champ_public_private_tags
|
||||||
|
filter_tags(tags, is_dossier_termine)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def filter_tags(tags, is_dossier_termine)
|
||||||
|
if !is_dossier_termine
|
||||||
|
tags.reject { |tag| tag[:dossier_termine_only] }
|
||||||
|
else
|
||||||
|
tags
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def procedure_type_de_champ_public_private_tags
|
def procedure_type_de_champ_public_private_tags
|
||||||
(procedure.types_de_champ + procedure.types_de_champ_private)
|
(procedure.types_de_champ + procedure.types_de_champ_private)
|
||||||
.map { |tdc| { libelle: tdc.libelle, description: tdc.description } }
|
.map { |tdc| { libelle: tdc.libelle, description: tdc.description } }
|
||||||
|
@ -21,10 +30,12 @@ module TagsSubstitutionConcern
|
||||||
def dossier_tags
|
def dossier_tags
|
||||||
[{ libelle: 'motivation',
|
[{ libelle: 'motivation',
|
||||||
description: 'Motivation facultative associée à la décision finale d’acceptation, refus ou classement sans suite',
|
description: 'Motivation facultative associée à la décision finale d’acceptation, refus ou classement sans suite',
|
||||||
target: :motivation },
|
target: :motivation,
|
||||||
|
dossier_termine_only: true },
|
||||||
{ libelle: 'date de décision',
|
{ libelle: 'date de décision',
|
||||||
description: 'Date de la décision d’acceptation, refus, ou classement sans suite',
|
description: 'Date de la décision d’acceptation, refus, ou classement sans suite',
|
||||||
lambda: -> (d) { d.processed_at.present? ? d.processed_at.localtime.strftime('%d/%m/%Y') : '' } },
|
lambda: -> (d) { d.processed_at.present? ? d.processed_at.localtime.strftime('%d/%m/%Y') : '' },
|
||||||
|
dossier_termine_only: true },
|
||||||
{ libelle: 'libellé procédure', description: '', lambda: -> (d) { d.procedure.libelle } },
|
{ libelle: 'libellé procédure', description: '', lambda: -> (d) { d.procedure.libelle } },
|
||||||
{ libelle: 'numéro du dossier', description: '', target: :id }]
|
{ libelle: 'numéro du dossier', description: '', target: :id }]
|
||||||
end
|
end
|
||||||
|
@ -60,8 +71,10 @@ module TagsSubstitutionConcern
|
||||||
[entreprise_tags, dossier.entreprise],
|
[entreprise_tags, dossier.entreprise],
|
||||||
[etablissement_tags, dossier.entreprise&.etablissement]]
|
[etablissement_tags, dossier.entreprise&.etablissement]]
|
||||||
|
|
||||||
tags_and_datas.inject(text) { |acc, (tags, data)| replace_tags_with_values_from_data(acc, tags, data) }
|
tags_and_datas
|
||||||
end
|
.map { |(tags, data)| [filter_tags(tags, dossier.termine?), data] }
|
||||||
|
.inject(text) { |acc, (tags, data)| replace_tags_with_values_from_data(acc, tags, data) }
|
||||||
|
end
|
||||||
|
|
||||||
def replace_type_de_champ_tags(text, types_de_champ, dossier_champs)
|
def replace_type_de_champ_tags(text, types_de_champ, dossier_champs)
|
||||||
types_de_champ.inject(text) do |acc, tag|
|
types_de_champ.inject(text) do |acc, tag|
|
||||||
|
|
|
@ -2,6 +2,8 @@ module Mails
|
||||||
class ClosedMail < ApplicationRecord
|
class ClosedMail < ApplicationRecord
|
||||||
include MailTemplateConcern
|
include MailTemplateConcern
|
||||||
|
|
||||||
|
belongs_to :procedure
|
||||||
|
|
||||||
SLUG = "closed_mail"
|
SLUG = "closed_mail"
|
||||||
TEMPLATE_NAME = "mails/closed_mail"
|
TEMPLATE_NAME = "mails/closed_mail"
|
||||||
DISPLAYED_NAME = "Accusé d'acceptation"
|
DISPLAYED_NAME = "Accusé d'acceptation"
|
||||||
|
|
|
@ -2,6 +2,8 @@ module Mails
|
||||||
class InitiatedMail < ApplicationRecord
|
class InitiatedMail < ApplicationRecord
|
||||||
include MailTemplateConcern
|
include MailTemplateConcern
|
||||||
|
|
||||||
|
belongs_to :procedure
|
||||||
|
|
||||||
SLUG = "initiated_mail"
|
SLUG = "initiated_mail"
|
||||||
TEMPLATE_NAME = "mails/initiated_mail"
|
TEMPLATE_NAME = "mails/initiated_mail"
|
||||||
DISPLAYED_NAME = 'Accusé de réception'
|
DISPLAYED_NAME = 'Accusé de réception'
|
||||||
|
|
|
@ -2,6 +2,8 @@ module Mails
|
||||||
class ReceivedMail < ApplicationRecord
|
class ReceivedMail < ApplicationRecord
|
||||||
include MailTemplateConcern
|
include MailTemplateConcern
|
||||||
|
|
||||||
|
belongs_to :procedure
|
||||||
|
|
||||||
SLUG = "received_mail"
|
SLUG = "received_mail"
|
||||||
TEMPLATE_NAME = "mails/received_mail"
|
TEMPLATE_NAME = "mails/received_mail"
|
||||||
DISPLAYED_NAME = 'Accusé de passage en instruction'
|
DISPLAYED_NAME = 'Accusé de passage en instruction'
|
||||||
|
|
|
@ -2,6 +2,8 @@ module Mails
|
||||||
class RefusedMail < ApplicationRecord
|
class RefusedMail < ApplicationRecord
|
||||||
include MailTemplateConcern
|
include MailTemplateConcern
|
||||||
|
|
||||||
|
belongs_to :procedure
|
||||||
|
|
||||||
SLUG = "refused_mail"
|
SLUG = "refused_mail"
|
||||||
TEMPLATE_NAME = "mails/refused_mail"
|
TEMPLATE_NAME = "mails/refused_mail"
|
||||||
DISPLAYED_NAME = 'Accusé de rejet du dossier'
|
DISPLAYED_NAME = 'Accusé de rejet du dossier'
|
||||||
|
|
|
@ -2,6 +2,8 @@ module Mails
|
||||||
class WithoutContinuationMail < ApplicationRecord
|
class WithoutContinuationMail < ApplicationRecord
|
||||||
include MailTemplateConcern
|
include MailTemplateConcern
|
||||||
|
|
||||||
|
belongs_to :procedure
|
||||||
|
|
||||||
SLUG = "without_continuation"
|
SLUG = "without_continuation"
|
||||||
TEMPLATE_NAME = "mails/without_continuation_mail"
|
TEMPLATE_NAME = "mails/without_continuation_mail"
|
||||||
DISPLAYED_NAME = 'Accusé de classement sans suite'
|
DISPLAYED_NAME = 'Accusé de classement sans suite'
|
||||||
|
|
|
@ -167,23 +167,23 @@ class Procedure < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def initiated_mail_template
|
def initiated_mail_template
|
||||||
initiated_mail || Mails::InitiatedMail.default
|
initiated_mail || Mails::InitiatedMail.default_for_procedure(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def received_mail_template
|
def received_mail_template
|
||||||
received_mail || Mails::ReceivedMail.default
|
received_mail || Mails::ReceivedMail.default_for_procedure(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def closed_mail_template
|
def closed_mail_template
|
||||||
closed_mail || Mails::ClosedMail.default
|
closed_mail || Mails::ClosedMail.default_for_procedure(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def refused_mail_template
|
def refused_mail_template
|
||||||
refused_mail || Mails::RefusedMail.default
|
refused_mail || Mails::RefusedMail.default_for_procedure(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def without_continuation_mail_template
|
def without_continuation_mail_template
|
||||||
without_continuation_mail || Mails::WithoutContinuationMail.default
|
without_continuation_mail || Mails::WithoutContinuationMail.default_for_procedure(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def fields
|
def fields
|
||||||
|
|
|
@ -22,9 +22,9 @@
|
||||||
Balise
|
Balise
|
||||||
%th
|
%th
|
||||||
Description
|
Description
|
||||||
- @mail_template.class.const_get(:ALLOWED_TAGS).each do |tag|
|
- @mail_template.tags.each do |tag|
|
||||||
%tr
|
%tr
|
||||||
%td.center
|
%td.center
|
||||||
= "--#{tag[:name]}--"
|
= "--#{tag[:libelle]}--"
|
||||||
%td
|
%td
|
||||||
= tag[:description]
|
= tag[:description]
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Admin::MailTemplatesController, type: :controller do
|
describe Admin::MailTemplatesController, type: :controller do
|
||||||
let(:initiated_mail) { Mails::InitiatedMail.default }
|
|
||||||
let(:procedure) { create :procedure }
|
let(:procedure) { create :procedure }
|
||||||
|
let(:initiated_mail) { Mails::InitiatedMail.default_for_procedure(procedure) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
sign_in procedure.administrateur
|
sign_in procedure.administrateur
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe MailTemplateConcern do
|
describe MailTemplateConcern do
|
||||||
let(:dossier) { create :dossier }
|
let(:procedure) { create(:procedure)}
|
||||||
let(:dossier2) { create :dossier }
|
let(:dossier) { create(:dossier, procedure: procedure) }
|
||||||
let(:initiated_mail) { Mails::InitiatedMail.default }
|
let(:dossier2) { create(:dossier, procedure: procedure) }
|
||||||
|
let(:initiated_mail) { Mails::InitiatedMail.default_for_procedure(procedure) }
|
||||||
|
|
||||||
shared_examples "can replace tokens in template" do
|
shared_examples "can replace tokens in template" do
|
||||||
describe 'with no token to replace' do
|
describe 'with no token to replace' do
|
||||||
|
|
|
@ -117,6 +117,8 @@ describe TagsSubstitutionConcern, type: :model do
|
||||||
context 'when the dossier has a motivation' do
|
context 'when the dossier has a motivation' do
|
||||||
let(:dossier) { create(:dossier, motivation: 'motivation') }
|
let(:dossier) { create(:dossier, motivation: 'motivation') }
|
||||||
|
|
||||||
|
before { dossier.accepte! }
|
||||||
|
|
||||||
context 'and the template has some dossier tags' do
|
context 'and the template has some dossier tags' do
|
||||||
let(:template) { '--motivation-- --numéro du dossier--' }
|
let(:template) { '--motivation-- --numéro du dossier--' }
|
||||||
|
|
||||||
|
@ -208,11 +210,32 @@ describe TagsSubstitutionConcern, type: :model do
|
||||||
it_behaves_like "treat all kinds of space as equivalent"
|
it_behaves_like "treat all kinds of space as equivalent"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when generating a document for a dossier that is not termine' do
|
||||||
|
let(:dossier) { create(:dossier) }
|
||||||
|
let(:template) { '--motivation-- --date de décision--' }
|
||||||
|
|
||||||
|
subject { template_concern.replace_tags(template, dossier) }
|
||||||
|
|
||||||
|
it "does not treat motivation or date de décision as tags" do
|
||||||
|
is_expected.to eq('--motivation-- --date de décision--')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'tags' do
|
describe 'tags' do
|
||||||
subject { template_concern.tags }
|
context 'when generating a document for a dossier terminé' do
|
||||||
|
subject { template_concern.tags }
|
||||||
|
|
||||||
it { is_expected.to include(include({ libelle: 'date de décision' })) }
|
it { is_expected.to include(include({ libelle: 'motivation' })) }
|
||||||
|
it { is_expected.to include(include({ libelle: 'date de décision' })) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when generating a document for a dossier that is not terminé' do
|
||||||
|
subject { template_concern.tags(is_dossier_termine: false) }
|
||||||
|
|
||||||
|
it { is_expected.not_to include(include({ libelle: 'motivation' })) }
|
||||||
|
it { is_expected.not_to include(include({ libelle: 'date de décision' })) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,10 +12,12 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'initiated_mail' do
|
describe 'initiated_mail' do
|
||||||
subject { create(:procedure) }
|
let(:procedure) { create(:procedure) }
|
||||||
|
|
||||||
|
subject { procedure }
|
||||||
|
|
||||||
context 'when initiated_mail is not customize' do
|
context 'when initiated_mail is not customize' do
|
||||||
it { expect(subject.initiated_mail_template.body).to eq(Mails::InitiatedMail.default.body) }
|
it { expect(subject.initiated_mail_template.body).to eq(Mails::InitiatedMail.default_for_procedure(procedure).body) }
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when initiated_mail is customize' do
|
context 'when initiated_mail is customize' do
|
||||||
|
@ -209,7 +211,7 @@ describe Procedure do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should not duplicate default mail_template' do
|
it 'should not duplicate default mail_template' do
|
||||||
expect(subject.initiated_mail_template.attributes).to eq Mails::InitiatedMail.default.attributes
|
expect(subject.initiated_mail_template.attributes).to eq Mails::InitiatedMail.default_for_procedure(subject).attributes
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should not duplicate specific related objects' do
|
it 'should not duplicate specific related objects' do
|
||||||
|
|
Loading…
Add table
Reference in a new issue