feat(groupe instructeur mailer): make two kind of notifications for removed instructeur

This commit is contained in:
Eric Leroy-Terquem 2023-02-15 11:57:35 +01:00
parent 5be58c8223
commit a46faf8cdf
10 changed files with 66 additions and 44 deletions

View file

@ -146,19 +146,18 @@ module Administrateurs
instructeur = groupe_instructeur.instructeurs.find_by(id: instructeur_id)
if groupe_instructeur.remove(instructeur)
flash[:notice] = if procedure.routing_enabled?
GroupeInstructeurMailer
.notify_removed_instructeurs(groupe_instructeur, [instructeur], current_administrateur.email)
.deliver_later
GroupeInstructeurMailer
.notify_group_when_instructeurs_removed(groupe_instructeur, [instructeur], current_administrateur.email)
.deliver_later
flash[:notice] = if instructeur.in?(procedure.instructeurs)
"Linstructeur « #{instructeur.email} » a été retiré du groupe."
else
"Linstructeur a bien été désaffecté de la démarche"
end
GroupeInstructeurMailer
.notify_removed_instructeur(groupe_instructeur, instructeur, current_administrateur.email)
.deliver_later
GroupeInstructeurMailer
.notify_group_when_instructeurs_removed(groupe_instructeur, [instructeur], current_administrateur.email)
.deliver_later
else
flash[:alert] = if procedure.routing_enabled?
if instructeur.present?

View file

@ -35,7 +35,7 @@ module Instructeurs
if groupe_instructeur.remove(instructeur)
flash[:notice] = "Linstructeur « #{instructeur.email} » a été retiré du groupe."
GroupeInstructeurMailer
.notify_removed_instructeurs(groupe_instructeur, [instructeur], current_user.email)
.notify_removed_instructeur(groupe_instructeur, instructeur, current_user.email)
.deliver_later
GroupeInstructeurMailer

View file

@ -16,10 +16,6 @@ module Mutations
groupe_instructeur.reload
if groupe_instructeur.procedure.routing_enabled? && instructeurs.present?
GroupeInstructeurMailer
.notify_removed_instructeurs(groupe_instructeur, instructeurs, current_administrateur.email)
.deliver_later
GroupeInstructeurMailer
.notify_group_when_instructeurs_removed(groupe_instructeur, instructeurs, current_administrateur.email)
.deliver_later

View file

@ -12,13 +12,16 @@ class GroupeInstructeurMailer < ApplicationMailer
mail(bcc: emails, subject: subject)
end
def notify_removed_instructeurs(group, removed_instructeurs, current_instructeur_email)
removed_instructeur_emails = removed_instructeurs.map(&:email)
def notify_removed_instructeur(group, removed_instructeur, current_instructeur_email)
@group = group
@current_instructeur_email = current_instructeur_email
@still_assigned_to_procedure = removed_instructeur.in?(group.procedure.instructeurs)
subject = if @still_assigned_to_procedure
"Vous avez été retiré du groupe \"#{group.label}\" de la démarche \"#{group.procedure.libelle}\""
else
"Vous avez été désaffecté de la démarche \"#{group.procedure.libelle}\""
end
subject = "Vous avez été retiré du groupe \"#{group.label}\" de la démarche \"#{group.procedure.libelle}\""
mail(bcc: removed_instructeur_emails, subject: subject)
mail(to: removed_instructeur.email, subject: subject)
end
end

View file

@ -0,0 +1,8 @@
%p
Bonjour,
%p
- assignment_state = @still_assigned_to_procedure ? 'assigned' : 'unassigned'
= t("administrateurs.groupe_instructeurs.notify_removed_instructeur.#{assignment_state}.email_body", groupe: @group.label, email: @current_instructeur_email, procedure: @group.procedure.libelle)
= render partial: "layouts/mailers/signature"

View file

@ -1,7 +0,0 @@
%p
Bonjour,
%p
= t('administrateurs.groupe_instructeurs.notify_removed_instructeurs.email_body', groupe: @group.label, email: @current_instructeur_email, procedure: @group.procedure.libelle)
= render partial: "layouts/mailers/signature"

View file

@ -23,8 +23,11 @@ en:
email_body:
one: "The instructor %{emails} was removed from the group « %{groupe} » by « %{email} », in charge of procedure « %{procedure} »."
other: "The instructors %{emails} were removed from the group « %{groupe} » by « %{email} », in charge of procedure « %{procedure} »."
notify_removed_instructeurs:
email_body: "You were removed from the group « %{groupe} » by « %{email} », in charge of procedure « %{procedure} »."
notify_removed_instructeur:
unassigned:
email_body: "You were unassigned from the procedure « %{procedure} » by « %{email} »."
assigned:
email_body: "You were removed from the group « %{groupe} » by « %{email} », in charge of procedure « %{procedure} »."
reaffecter_dossiers:
existing_groupe:
one: "%{count} group exist"

View file

@ -29,8 +29,11 @@ fr:
email_body:
one: "Linstructeur %{emails} a été retiré du groupe « %{groupe} » par « %{email} », en charge de la démarche « %{procedure} »."
other: "Les instructeurs %{emails} ont été retirés du groupe « %{groupe} » par « %{email} », en charge de la démarche « %{procedure} »."
notify_removed_instructeurs:
email_body: "Vous avez été retiré du groupe « %{groupe} » par « %{email} », en charge de la démarche « %{procedure} »."
notify_removed_instructeur:
assigned:
email_body: "Vous avez été retiré du groupe « %{groupe} » par « %{email} », en charge de la démarche « %{procedure} »."
unassigned:
email_body: "Vous avez été désaffecté de la démarche « %{procedure} » par « %{email} »."
reaffecter_dossiers:
existing_groupe:
one: "%{count} groupe existe"

View file

@ -321,7 +321,7 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
context 'when there are many instructeurs' do
before do
allow(GroupeInstructeurMailer).to receive(:notify_removed_instructeurs)
allow(GroupeInstructeurMailer).to receive(:notify_removed_instructeur)
.and_return(double(deliver_later: true))
remove_instructeur(admin.instructeur)
end
@ -330,9 +330,9 @@ describe Administrateurs::GroupeInstructeursController, type: :controller do
it { expect(gi_1_1.reload.instructeurs.count).to eq(1) }
it { expect(response).to redirect_to(admin_procedure_groupe_instructeur_path(procedure, gi_1_1)) }
it "calls GroupeInstructeurMailer with the right groupe and instructeur" do
expect(GroupeInstructeurMailer).to have_received(:notify_removed_instructeurs).with(
expect(GroupeInstructeurMailer).to have_received(:notify_removed_instructeur).with(
gi_1_1,
[admin.instructeur],
admin.instructeur,
admin.email
)
end

View file

@ -15,28 +15,45 @@ RSpec.describe GroupeInstructeurMailer, type: :mailer do
subject { described_class.notify_group_when_instructeurs_removed(groupe_instructeur, instructeurs_to_remove, current_instructeur_email) }
before { instructeurs_to_remove.each { groupe_instructeur.remove(_1) } }
it { expect(subject.body).to include('Les instructeurs int3@g, int4@g ont été retirés du groupe') }
it { expect(subject.bcc).to include('int1@g', 'int2@g') }
it { expect(subject.bcc).to match_array(['int1@g', 'int2@g']) }
end
describe '#notify_removed_instructeurs' do
describe '#notify_removed_instructeur' do
let(:procedure) { create(:procedure) }
let(:groupe_instructeur) do
gi = GroupeInstructeur.create(label: 'gi1', procedure: create(:procedure))
gi = GroupeInstructeur.create(label: 'gi1', procedure: procedure)
gi.instructeurs << create(:instructeur, email: 'int1@g')
gi.instructeurs << create(:instructeur, email: 'int2@g')
gi.instructeurs << instructeurs_to_remove
gi.instructeurs << instructeur_to_remove
gi
end
let(:instructeur_3) { create(:instructeur, email: 'int3@g') }
let(:instructeur_4) { create(:instructeur, email: 'int4@g') }
let(:instructeur_to_remove) { create(:instructeur, email: 'int3@g') }
let(:instructeurs_to_remove) { [instructeur_3, instructeur_4] }
let(:current_instructeur_email) { 'toto@email.com' }
subject { described_class.notify_removed_instructeurs(groupe_instructeur, instructeurs_to_remove, current_instructeur_email) }
subject { described_class.notify_removed_instructeur(groupe_instructeur, instructeur_to_remove, current_instructeur_email) }
it { expect(subject.body).to include('ous avez été retiré du groupe « gi1 » par « toto@email.com »') }
it { expect(subject.bcc).to match_array(['int3@g', 'int4@g']) }
it { expect(subject.bcc).not_to match_array(['int1@g', 'int2@g']) }
before { groupe_instructeur.remove(instructeur_to_remove) }
context 'when instructeur is fully removed form procedure' do
it { expect(subject.body).to include('Vous avez été désaffecté de la démarche') }
it { expect(subject.to).to include('int3@g') }
it { expect(subject.to).not_to include('int1@g', 'int2@g') }
end
context 'when instructeur is removed from one group but still affected to procedure' do
let!(:groupe_instructeur_2) do
gi2 = GroupeInstructeur.create(label: 'gi2', procedure: procedure)
gi2.instructeurs << instructeur_to_remove
gi2
end
it { expect(subject.body).to include('Vous avez été retiré du groupe « gi1 » par « toto@email.com »') }
it { expect(subject.to).to include('int3@g') }
it { expect(subject.to).not_to include('int1@g', 'int2@g') }
end
end
end