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:
gregoirenovel 2018-01-05 17:23:20 +01:00 committed by GitHub
commit de30b27ad1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 88 additions and 35 deletions

View file

@ -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

View file

@ -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 dacceptation, refus ou classement sans suite', description: 'Motivation facultative associée à la décision finale dacceptation, 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 dacceptation, refus, ou classement sans suite', description: 'Date de la décision dacceptation, 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|

View file

@ -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"

View file

@ -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'

View file

@ -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'

View file

@ -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'

View file

@ -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'

View file

@ -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

View file

@ -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]

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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