[#1110] Use TagsSubstitutionConcern as engine for mail template tags

This commit is contained in:
Frederic Merizen 2018-01-04 10:37:40 +01:00
parent de30b27ad1
commit deea23139f
8 changed files with 55 additions and 60 deletions

View file

@ -3,28 +3,7 @@ module MailTemplateConcern
include Rails.application.routes.url_helpers
include ActionView::Helpers::UrlHelper
TAGS = []
TAGS << TAG_NUMERO_DOSSIER = {
libelle: "numero_dossier",
description: "Permet d'afficher le numéro de dossier de l'utilisateur."
}
TAGS << TAG_LIEN_DOSSIER = {
libelle: "lien_dossier",
description: "Permet d'afficher un lien vers le dossier de l'utilisateur."
}
TAGS << TAG_LIBELLE_PROCEDURE = {
libelle: "libelle_procedure",
description: "Permet d'afficher le libellé de la procédure."
}
TAGS << TAG_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."
}
TAGS << TAG_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."
}
include TagsSubstitutionConcern
def object_for_dossier(dossier)
replace_tags(object, dossier)
@ -34,14 +13,10 @@ module MailTemplateConcern
replace_tags(body, dossier)
end
def tags
self.class.const_get(:ALLOWED_TAGS)
end
def replace_tags(string, dossier)
TAGS.inject(string) do |acc, tag|
acc.gsub("--#{tag[:libelle]}--", replace_tag(tag, dossier)) || acc
end
# TODO: remove legacy argument when removing legacy tags
def tags(reject_legacy: true, is_dossier_termine: self.class.const_get(:IS_DOSSIER_TERMINE))
super(is_dossier_termine: is_dossier_termine)
.reject { |tag| reject_legacy && tag[:is_legacy] }
end
module ClassMethods
@ -53,20 +28,20 @@ module MailTemplateConcern
private
def replace_tag(tag, dossier)
case tag
when TAG_NUMERO_DOSSIER
dossier.id.to_s
when TAG_LIEN_DOSSIER
link_to users_dossier_recapitulatif_url(dossier), users_dossier_recapitulatif_url(dossier), target: '_blank'
when TAG_LIBELLE_PROCEDURE
dossier.procedure.libelle
when TAG_DATE_DE_DECISION
dossier.processed_at.present? ? dossier.processed_at.localtime.strftime("%d/%m/%Y") : ""
when TAG_MOTIVATION
dossier.motivation || ""
else
'--BALISE_NON_RECONNUE--'
end
def dossier_tags
super +
[{ libelle: 'lien dossier', description: '', lambda: -> (d) { users_dossier_recapitulatif_link(d) } },
# TODO: remove legacy tags
{ libelle: 'numero_dossier', description: '', target: :id, is_legacy: true },
{ libelle: 'lien_dossier', description: '', lambda: -> (d) { users_dossier_recapitulatif_link(d) }, is_legacy: true },
{ libelle: 'libelle_procedure', description: '', lambda: -> (d) { d.procedure.libelle }, is_legacy: true },
{ libelle: 'date_de_decision', description: '',
lambda: -> (d) { d.processed_at.present? ? d.processed_at.localtime.strftime('%d/%m/%Y') : '' },
dossier_termine_only: true, is_legacy: true }]
end
def users_dossier_recapitulatif_link(dossier)
url = users_dossier_recapitulatif_url(dossier)
link_to(url, url, target: '_blank')
end
end

View file

@ -8,6 +8,6 @@ module Mails
TEMPLATE_NAME = "mails/closed_mail"
DISPLAYED_NAME = "Accusé d'acceptation"
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été accepté'
ALLOWED_TAGS = [TAG_NUMERO_DOSSIER, TAG_LIEN_DOSSIER, TAG_LIBELLE_PROCEDURE, TAG_DATE_DE_DECISION, TAG_MOTIVATION]
IS_DOSSIER_TERMINE = true
end
end

View file

@ -8,6 +8,6 @@ module Mails
TEMPLATE_NAME = "mails/initiated_mail"
DISPLAYED_NAME = 'Accusé de réception'
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a bien été reçu'
ALLOWED_TAGS = [TAG_NUMERO_DOSSIER, TAG_LIEN_DOSSIER, TAG_LIBELLE_PROCEDURE]
IS_DOSSIER_TERMINE = false
end
end

View file

@ -8,6 +8,6 @@ module Mails
TEMPLATE_NAME = "mails/received_mail"
DISPLAYED_NAME = 'Accusé de passage en instruction'
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- va être instruit'
ALLOWED_TAGS = [TAG_NUMERO_DOSSIER, TAG_LIEN_DOSSIER, TAG_LIBELLE_PROCEDURE]
IS_DOSSIER_TERMINE = false
end
end

View file

@ -8,6 +8,6 @@ module Mails
TEMPLATE_NAME = "mails/refused_mail"
DISPLAYED_NAME = 'Accusé de rejet du dossier'
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été refusé'
ALLOWED_TAGS = [TAG_NUMERO_DOSSIER, TAG_LIEN_DOSSIER, TAG_LIBELLE_PROCEDURE, TAG_DATE_DE_DECISION, TAG_MOTIVATION]
IS_DOSSIER_TERMINE = true
end
end

View file

@ -8,6 +8,6 @@ module Mails
TEMPLATE_NAME = "mails/without_continuation_mail"
DISPLAYED_NAME = 'Accusé de classement sans suite'
DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été classé sans suite'
ALLOWED_TAGS = [TAG_NUMERO_DOSSIER, TAG_LIEN_DOSSIER, TAG_LIBELLE_PROCEDURE, TAG_DATE_DE_DECISION, TAG_MOTIVATION]
IS_DOSSIER_TERMINE = true
end
end

View file

@ -1,21 +1,15 @@
FactoryGirl.define do
factory :mail_template do
factory :mail_template, class: Mails::ClosedMail do
object "Object, voila voila"
body "Blabla ceci est mon body"
type 'MailValidated'
trait :dossier_submitted do
type 'MailSubmitted'
end
factory :dossier_submitted_mail_template, class: Mails::ReceivedMail
trait :dossier_refused do
type 'MailRefused'
end
factory :dossier_refused_mail_template, class: Mails::RefusedMail
trait :dossier_en_instruction do
factory :dossier_en_instruction_mail_template, class: Mails::InitiatedMail do
object "[TPS] Accusé de réception pour votre dossier nº --numero_dossier--"
body "Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--"
type 'MailReceived'
end
end
end

View file

@ -0,0 +1,26 @@
require 'spec_helper'
describe 'admin/mail_templates/edit.html.haml', type: :view do
let(:procedure) { create(:procedure) }
let(:mail_template) { create(:mail_template, procedure: procedure) }
let(:all_tags) { mail_template.tags(reject_legacy: false) }
before do
allow(view).to receive(:admin_procedure_mail_template_path).and_return("/toto")
allow(view).to receive(:admin_procedure_mail_templates_path).and_return("/toto")
assign(:mail_template, mail_template)
end
subject { render }
context "Legacy champs are not listed in the page" do
it { expect(all_tags).to include(include({ libelle: 'numero_dossier', is_legacy: true })) }
it { is_expected.not_to include("numero_dossier") }
end
context "Non-legacy champs are listed in the page" do
it { expect(all_tags).to include(include({ libelle: 'numéro du dossier' })) }
it { is_expected.to include("numéro du dossier") }
end
end