Refactor NotificationMailer

This commit is contained in:
Paul Chavard 2021-04-29 19:10:22 +02:00
parent a4fd629f4a
commit f6508899de
9 changed files with 128 additions and 70 deletions

View file

@ -143,7 +143,7 @@ module Users
if passage_en_construction? && errors.blank?
@dossier.passer_en_construction!
NotificationMailer.send_initiated_notification(@dossier).deliver_later
NotificationMailer.send_en_construction_notification(@dossier).deliver_later
@dossier.groupe_instructeur.instructeurs.with_instant_email_dossier_notifications.each do |instructeur|
DossierMailer.notify_new_dossier_depose_to_instructeur(@dossier, instructeur.email).deliver_later
end

View file

@ -8,7 +8,8 @@
class NotificationMailer < ApplicationMailer
include ActionView::Helpers::SanitizeHelper
before_action :prevent_delivery_to_deleted_users
before_action :set_dossier
after_action :create_commentaire_for_notification
helper ServiceHelper
helper MailerHelper
@ -16,52 +17,54 @@ class NotificationMailer < ApplicationMailer
layout 'mailers/notifications_layout'
default from: NO_REPLY_EMAIL
def send_dossier_received(dossier)
send_notification(dossier, dossier.procedure.received_mail_template)
def send_notification
@service = @dossier.procedure.service
@logo_url = attach_logo(@dossier.procedure)
@rendered_template = sanitize(@body)
mail(subject: @subject, to: @email, template_name: 'send_notification')
end
def send_initiated_notification(dossier)
send_notification(dossier, dossier.procedure.initiated_mail_template)
def self.send_en_construction_notification(dossier)
with(dossier: dossier, state: Dossier.states.fetch(:en_construction)).send_notification
end
def send_closed_notification(dossier)
send_notification(dossier, dossier.procedure.closed_mail_template)
def self.send_en_instruction_notification(dossier)
with(dossier: dossier, state: Dossier.states.fetch(:en_instruction)).send_notification
end
def send_refused_notification(dossier)
send_notification(dossier, dossier.procedure.refused_mail_template)
def self.send_accepte_notification(dossier)
with(dossier: dossier, state: Dossier.states.fetch(:accepte)).send_notification
end
def send_without_continuation_notification(dossier)
send_notification(dossier, dossier.procedure.without_continuation_mail_template)
def self.send_refuse_notification(dossier)
with(dossier: dossier, state: Dossier.states.fetch(:refuse)).send_notification
end
def self.send_sans_suite_notification(dossier)
with(dossier: dossier, state: Dossier.states.fetch(:sans_suite)).send_notification
end
private
def prevent_delivery_to_deleted_users
!@dossier.user_deleted?
def set_dossier
@dossier = params[:dossier]
if @dossier.user_deleted?
mail.perform_deliveries = false
else
mail_template = @dossier.procedure.mail_template_for(params[:state])
@email = @dossier.user_email_for(:notification)
@subject = mail_template.subject_for_dossier(@dossier)
@body = mail_template.body_for_dossier(@dossier)
@actions = mail_template.actions_for_dossier(@dossier)
end
end
def send_notification(dossier, mail_template)
email = dossier.user_email_for(:notification)
subject = mail_template.subject_for_dossier(dossier)
body = mail_template.body_for_dossier(dossier)
create_commentaire_for_notification(dossier, subject, body)
@dossier = dossier
@service = dossier.procedure.service
@logo_url = attach_logo(dossier.procedure)
@rendered_template = sanitize(body)
@actions = mail_template.actions_for_dossier(dossier)
mail(subject: subject, to: email, template_name: 'send_notification')
end
def create_commentaire_for_notification(dossier, subject, body)
params = { body: ["[#{subject}]", body].join("<br><br>") }
commentaire = CommentaireService.build_with_email(CONTACT_EMAIL, dossier, params)
def create_commentaire_for_notification
body = ["[#{@subject}]", @body].join("<br><br>")
commentaire = CommentaireService.build_with_email(CONTACT_EMAIL, @dossier, body: body)
commentaire.save!
end
end

View file

@ -344,7 +344,7 @@ class Dossier < ApplicationRecord
before_save :build_default_champs, if: Proc.new { revision_id_was.nil? }
before_save :update_search_terms
after_save :send_dossier_received
after_save :send_dossier_en_instruction
after_save :send_web_hook
after_create_commit :send_draft_notification_email
@ -690,7 +690,7 @@ class Dossier < ApplicationRecord
save!
remove_titres_identite!
NotificationMailer.send_closed_notification(self).deliver_later
NotificationMailer.send_accepte_notification(self).deliver_later
send_dossier_decision_to_experts(self)
log_dossier_operation(instructeur, :accepter, self)
end
@ -705,7 +705,7 @@ class Dossier < ApplicationRecord
save!
remove_titres_identite!
NotificationMailer.send_closed_notification(self).deliver_later
NotificationMailer.send_accepte_notification(self).deliver_later
log_automatic_dossier_operation(:accepter, self)
end
@ -718,7 +718,7 @@ class Dossier < ApplicationRecord
save!
remove_titres_identite!
NotificationMailer.send_refused_notification(self).deliver_later
NotificationMailer.send_refuse_notification(self).deliver_later
send_dossier_decision_to_experts(self)
log_dossier_operation(instructeur, :refuser, self)
end
@ -732,7 +732,7 @@ class Dossier < ApplicationRecord
save!
remove_titres_identite!
NotificationMailer.send_without_continuation_notification(self).deliver_later
NotificationMailer.send_sans_suite_notification(self).deliver_later
send_dossier_decision_to_experts(self)
log_dossier_operation(instructeur, :classer_sans_suite, self)
end
@ -949,9 +949,9 @@ class Dossier < ApplicationRecord
end
end
def send_dossier_received
def send_dossier_en_instruction
if saved_change_to_state? && en_instruction? && !procedure.declarative_accepte?
NotificationMailer.send_dossier_received(self).deliver_later
NotificationMailer.send_en_instruction_notification(self).deliver_later
end
end

View file

@ -500,6 +500,23 @@ class Procedure < ApplicationRecord
without_continuation_mail || Mails::WithoutContinuationMail.default_for_procedure(self)
end
def mail_template_for(state)
case state
when Dossier.states.fetch(:en_construction)
initiated_mail_template
when Dossier.states.fetch(:en_instruction)
received_mail_template
when Dossier.states.fetch(:accepte)
closed_mail_template
when Dossier.states.fetch(:refuse)
refused_mail_template
when Dossier.states.fetch(:sans_suite)
without_continuation_mail_template
else
raise "Unknown dossier state: #{state}"
end
end
def self.default_sort
{
'table' => 'self',