Ajoute des boutons d'actions à tous les emails (#4133)

Usager : ajoute des boutons d'actions aux emails transactionnels
This commit is contained in:
Pierre de La Morinerie 2019-07-25 12:37:53 +02:00 committed by GitHub
commit b3db0a104e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 135 additions and 46 deletions

View file

@ -3,12 +3,14 @@ module NewAdministrateur
include ActionView::Helpers::SanitizeHelper include ActionView::Helpers::SanitizeHelper
def preview def preview
@procedure = procedure mail_template = find_mail_template_by_slug(params[:id])
dossier = Dossier.new(id: '1', procedure: procedure)
@dossier = dossier
@logo_url = procedure.logo.url @logo_url = procedure.logo.url
@service = procedure.service @service = procedure.service
mail_template = find_mail_template_by_slug(params[:id])
@rendered_template = sanitize(mail_template.body) @rendered_template = sanitize(mail_template.body)
@actions = mail_template.actions_for_dossier(dossier)
render(template: 'notification_mailer/send_notification', layout: 'mailers/notifications_layout') render(template: 'notification_mailer/send_notification', layout: 'mailers/notifications_layout')
end end
@ -16,16 +18,16 @@ module NewAdministrateur
private private
def procedure def procedure
@procedure = current_administrateur.procedures.find(params[:procedure_id]) @procedure ||= current_administrateur.procedures.find(params[:procedure_id])
end end
def mail_templates def mail_templates
[ [
@procedure.initiated_mail_template, procedure.initiated_mail_template,
@procedure.received_mail_template, procedure.received_mail_template,
@procedure.closed_mail_template, procedure.closed_mail_template,
@procedure.refused_mail_template, procedure.refused_mail_template,
@procedure.without_continuation_mail_template procedure.without_continuation_mail_template
] ]
end end

View file

@ -1,5 +1,28 @@
module MailerHelper module MailerHelper
def round_button(text, url) def vertical_margin(height)
render 'shared/mailer_round_button', text: text, url: url render 'shared/mailer_vertical_margin', height: height
end
def round_button(text, url, variant)
render 'shared/mailer_round_button', text: text, url: url, theme: theme(variant)
end
private
def theme(variant)
case variant
when :primary
{ color: white, bg_color: blue, border_color: blue }
when :secondary
{ color: blue, bg_color: white, border_color: blue }
end
end
def blue
'#0069CC'
end
def white
'#FFFFFF'
end end
end end

View file

@ -9,6 +9,7 @@ class NotificationMailer < ApplicationMailer
include ActionView::Helpers::SanitizeHelper include ActionView::Helpers::SanitizeHelper
helper ServiceHelper helper ServiceHelper
helper MailerHelper
layout 'mailers/notifications_layout' layout 'mailers/notifications_layout'
@ -46,6 +47,7 @@ class NotificationMailer < ApplicationMailer
@service = dossier.procedure.service @service = dossier.procedure.service
@logo_url = attach_logo(dossier.procedure) @logo_url = attach_logo(dossier.procedure)
@rendered_template = sanitize(body) @rendered_template = sanitize(body)
@actions = mail_template.actions_for_dossier(dossier)
mail(subject: subject, to: email, template_name: 'send_notification') mail(subject: subject, to: email, template_name: 'send_notification')
end end

View file

@ -3,6 +3,12 @@ module MailTemplateConcern
include TagsSubstitutionConcern include TagsSubstitutionConcern
module Actions
SHOW = :show
ASK_QUESTION = :ask_question
REPLY = :reply
end
def subject_for_dossier(dossier) def subject_for_dossier(dossier)
replace_tags(subject, dossier) replace_tags(subject, dossier)
end end
@ -11,6 +17,10 @@ module MailTemplateConcern
replace_tags(body, dossier) replace_tags(body, dossier)
end end
def actions_for_dossier(dossier)
[MailTemplateConcern::Actions::SHOW, MailTemplateConcern::Actions::ASK_QUESTION]
end
def update_rich_body def update_rich_body
self.rich_body = self.body self.rich_body = self.body
end end

View file

@ -7,7 +7,7 @@ module Mails
SLUG = "initiated_mail" SLUG = "initiated_mail"
DEFAULT_TEMPLATE_NAME = "notification_mailer/default_templates/initiated_mail" DEFAULT_TEMPLATE_NAME = "notification_mailer/default_templates/initiated_mail"
DISPLAYED_NAME = 'Accusé de réception' DISPLAYED_NAME = 'Accusé de réception'
DEFAULT_SUBJECT = 'Votre dossier nº --numéro du dossier-- a bien été reçu (--libellé démarche--)' DEFAULT_SUBJECT = 'Votre dossier nº --numéro du dossier-- a bien été déposé (--libellé démarche--)'
DOSSIER_STATE = Dossier.states.fetch(:en_construction) DOSSIER_STATE = Dossier.states.fetch(:en_construction)
end end
end end

View file

@ -7,7 +7,7 @@ module Mails
SLUG = "received_mail" SLUG = "received_mail"
DEFAULT_TEMPLATE_NAME = "notification_mailer/default_templates/received_mail" DEFAULT_TEMPLATE_NAME = "notification_mailer/default_templates/received_mail"
DISPLAYED_NAME = 'Accusé de passage en instruction' DISPLAYED_NAME = 'Accusé de passage en instruction'
DEFAULT_SUBJECT = 'Votre dossier nº --numéro du dossier-- va être instruit (--libellé démarche--)' DEFAULT_SUBJECT = 'Votre dossier nº --numéro du dossier-- va être examiné (--libellé démarche--)'
DOSSIER_STATE = Dossier.states.fetch(:en_instruction) DOSSIER_STATE = Dossier.states.fetch(:en_instruction)
end end
end end

View file

@ -9,5 +9,9 @@ module Mails
DISPLAYED_NAME = 'Accusé de rejet du dossier' DISPLAYED_NAME = 'Accusé de rejet du dossier'
DEFAULT_SUBJECT = 'Votre dossier nº --numéro du dossier-- a été refusé (--libellé démarche--)' DEFAULT_SUBJECT = 'Votre dossier nº --numéro du dossier-- a été refusé (--libellé démarche--)'
DOSSIER_STATE = Dossier.states.fetch(:refuse) DOSSIER_STATE = Dossier.states.fetch(:refuse)
def actions_for_dossier(dossier)
[MailTemplateConcern::Actions::REPLY, MailTemplateConcern::Actions::SHOW]
end
end end
end end

View file

@ -5,13 +5,14 @@
Bonjour, Bonjour,
%p %p
Ladministration en charge de votre dossier vous a Vous avez reçu un
%strong envoyé un nouveau message. %strong nouveau message
de la part du service en charge de votre dossier.
%p %p
Pour le consulter et y répondre, cliquez sur le bouton ci-dessous : Pour consulter le message et y répondre, cliquez sur le bouton ci-dessous :
= round_button('Lire le message', messagerie_dossier_url(@dossier)) = round_button('Lire le message', messagerie_dossier_url(@dossier), :primary)
= render 'layouts/mailers/signature', service: @service = render 'layouts/mailers/signature', service: @service

View file

@ -5,13 +5,16 @@
Bonjour, Bonjour,
%p %p
Vous avez commencé à remplir un dossier pour la démarche « #{@dossier.procedure.libelle} ». Vous avez commencé à remplir un dossier pour la démarche
= succeed '.' do
%strong « #{@dossier.procedure.libelle} »
%p %p
Vous pouvez Vous pouvez
%strong retrouver et compléter votre dossier %strong retrouver et compléter votre dossier
à ladresse suivante : en cliquant sur le bouton ci-dessous:
= link_to dossier_url(@dossier), dossier_url(@dossier), target: '_blank', rel: 'noopener'
= round_button('Afficher votre dossier', dossier_url(@dossier), :primary)
= render 'layouts/mailers/signature' = render 'layouts/mailers/signature'

View file

@ -0,0 +1,13 @@
= vertical_margin(12)
- actions.each_with_index do |action, index|
- variant = (index == 0 ? :primary : :secondary)
- case action
- when MailTemplateConcern::Actions::SHOW
= round_button('Consulter mon dossier', dossier_url(@dossier), variant)
- when MailTemplateConcern::Actions::ASK_QUESTION
= round_button('Jai une question', messagerie_dossier_url(@dossier), variant)
- when MailTemplateConcern::Actions::REPLY
= round_button('Répondre à ce message', messagerie_dossier_url(@dossier), variant)
= vertical_margin(5)

View file

@ -2,7 +2,9 @@
Bonjour, Bonjour,
%p %p
Votre dossier nº --numéro du dossier-- a été accepté le --date de décision--. Votre dossier nº --numéro du dossier--
%strong a été accepté
le --date de décision--.
%p %p
À tout moment, vous pouvez consulter votre dossier et les éventuels messages de l'administration à cette adresse : --lien dossier-- À tout moment, vous pouvez consulter votre dossier et les éventuels messages de l'administration à cette adresse : --lien dossier--

View file

@ -2,12 +2,11 @@
Bonjour, Bonjour,
%p %p
Votre dossier nº --numéro du dossier-- a été accepté le --date de décision--. Votre dossier nº --numéro du dossier--
%strong a été accepté
le --date de décision--.
%p %p
Vous pouvez télécharger votre attestation à l'adresse suivante : --lien attestation-- Vous pouvez télécharger votre attestation à l'adresse suivante : --lien attestation--
%p
À tout moment, vous pouvez consulter votre dossier et les éventuels messages de l'administration à cette adresse : --lien dossier--
= render partial: "notification_mailer/default_templates/signature" = render partial: "notification_mailer/default_templates/signature"

View file

@ -2,9 +2,9 @@
Bonjour, Bonjour,
%p %p
Votre administration vous confirme la bonne réception de votre dossier nº --numéro du dossier--. Votre dossier nº --numéro du dossier--
= succeed '.' do
%p %strong a bien été déposé
À tout moment, vous pouvez consulter votre dossier et les éventuels messages de l'administration à cette adresse : --lien dossier-- Si besoin est, vous pouvez encore y apporter des modifications.
= render partial: "notification_mailer/default_templates/signature" = render partial: "notification_mailer/default_templates/signature"

View file

@ -2,6 +2,10 @@
Bonjour, Bonjour,
%p %p
Votre administration vous confirme la bonne réception de votre dossier nº --numéro du dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur. Votre dossier nº --numéro du dossier--
a bien été reçu et
= succeed '.' do
%strong pris en charge
Il va maintenant être examiné par le service.
= render partial: "notification_mailer/default_templates/signature" = render partial: "notification_mailer/default_templates/signature"

View file

@ -2,10 +2,12 @@
Bonjour, Bonjour,
%p %p
Votre dossier nº --numéro du dossier-- a été refusé le --date de décision--. Votre dossier nº --numéro du dossier--
%strong a été refusé
le --date de décision--.
%p %p
Le motif de refus est le suivant : --motivation--. Le motif de refus est le suivant : « <i>--motivation--</i> ».
%p %p
Pour en savoir plus sur le motif du refus, vous pouvez consulter votre dossier et les éventuels messages de l'administration à cette adresse : --lien dossier-- Pour en savoir plus sur le motif du refus, vous pouvez consulter votre dossier et les éventuels messages de l'administration à cette adresse : --lien dossier--

View file

@ -2,7 +2,9 @@
Bonjour, Bonjour,
%p %p
Votre dossier nº --numéro du dossier-- a été classé sans suite le --date de décision--. Votre dossier nº --numéro du dossier--
%strong a été classé sans suite
le --date de décision--.
%p %p
Le motif est le suivant : --motivation--. Le motif est le suivant : --motivation--.

View file

@ -3,5 +3,8 @@
= @rendered_template = @rendered_template
- if @actions.present?
= render 'notification_mailer/actions', actions: @actions, dossier: @dossier
- content_for :footer do - content_for :footer do
= render 'layouts/mailers/service_footer', service: @service, dossier: @dossier = render 'layouts/mailers/service_footer', service: @service, dossier: @dossier

View file

@ -1,9 +1,10 @@
/# From https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design /# From https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design
%table{ width: "100%", border: "0", cellspacing:"0", cellpadding:"0" } %table{ width: "100%", border: "0", cellspacing:"0", cellpadding:"5" }
%tr %tr
%td %td{ align: "center" }
%table{ border:"0", cellspacing:"0", cellpadding:"0", style:"margin: auto" } %table{ border:"0", cellspacing:"0", cellpadding:"0" }
%tr %tr
%td{ align:"center", style:"border-radius: 5px;", bgcolor:"#0069cc" } %td{ align:"center", style:"border-radius: 5px;", color: theme[:color], bgcolor: theme[:bg_color] }
%a{ href: url, target:"_blank", style:"font-size: 16px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; text-decoration: none; border-radius: 5px; padding: 12px 25px; border: 1px solid #0069cc; display: inline-block;" } %a{ href: url, target:"_blank", rel: "noopener", style:"font-size: 16px; font-family: Helvetica, Arial, sans-serif; color: #{theme[:color]}; text-decoration: none; text-decoration: none; border-radius: 5px; padding: 12px 25px; border: 1px solid #{theme[:border_color]}; display: inline-block; min-width: 250px" }
= text = text

View file

@ -0,0 +1,4 @@
%table{ cellspacing: "0", cellpadding: (height / 2), border: "0" }
%tr
%td
%div

View file

@ -13,9 +13,17 @@ describe NewAdministrateur::MailTemplatesController, type: :controller do
it { expect(response).to have_http_status(:ok) } it { expect(response).to have_http_status(:ok) }
it { expect(response.body).to have_css("img[src*='#{procedure.logo.filename}']") } it 'displays the procedure logo' do
expect(response.body).to have_css("img[src*='#{procedure.logo.filename}']")
end
it { expect(response.body).to include(procedure.service.nom) } it 'displays the action buttons' do
it { expect(response.body).to include(procedure.service.telephone) } expect(response.body).to have_link('Consulter mon dossier')
end
it 'displays the service in the footer' do
expect(response.body).to include(procedure.service.nom)
expect(response.body).to include(procedure.service.telephone)
end
end end
end end

View file

@ -28,6 +28,11 @@ RSpec.describe NotificationMailer, type: :mailer do
expect(mail.body).to have_link('messagerie') expect(mail.body).to have_link('messagerie')
end end
it 'renders the actions' do
expect(mail.body).to have_link('Consulter mon dossier', href: dossier_url(dossier))
expect(mail.body).to have_link('Jai une question', href: messagerie_dossier_url(dossier))
end
context 'when the template body contains tags' do context 'when the template body contains tags' do
let(:email_template) { create(:received_mail, subject: 'Email subject', body: 'Hello --nom--, your dossier --lien dossier-- was processed.') } let(:email_template) { create(:received_mail, subject: 'Email subject', body: 'Hello --nom--, your dossier --lien dossier-- was processed.') }

View file

@ -1,19 +1,20 @@
class NotificationMailerPreview < ActionMailer::Preview class NotificationMailerPreview < ActionMailer::Preview
def send_dossier_received
NotificationMailer.send_dossier_received(Dossier.last)
end
def send_initiated_notification def send_initiated_notification
p = Procedure.where(id: Mails::InitiatedMail.where("body like ?", "%<img%").pluck(:procedure_id).uniq).order("RANDOM()").first p = Procedure.where(id: Mails::InitiatedMail.where("body like ?", "%<img%").pluck(:procedure_id).uniq).order("RANDOM()").first
NotificationMailer.send_initiated_notification(p.dossiers.last) NotificationMailer.send_initiated_notification(p.dossiers.last)
end end
def send_dossier_received
NotificationMailer.send_dossier_received(Dossier.last)
end
def send_closed_notification def send_closed_notification
NotificationMailer.send_closed_notification(Dossier.last) NotificationMailer.send_closed_notification(Dossier.last)
end end
def send_refused_notification def send_refused_notification
NotificationMailer.send_refused_notification(Dossier.last) dossier = Dossier.last.tap { |d| d.assign_attributes(motivation: 'Le montant demandé dépasse le plafond autorisé') }
NotificationMailer.send_refused_notification(dossier)
end end
def send_without_continuation_notification def send_without_continuation_notification