diff --git a/app/mailers/merge_completion_mailer.rb b/app/mailers/merge_completion_mailer.rb index f2a9f8030..a5de27d72 100644 --- a/app/mailers/merge_completion_mailer.rb +++ b/app/mailers/merge_completion_mailer.rb @@ -1,10 +1,24 @@ class MergeCompletionMailer < NotifyMailer - MERGE_COMPLETION_TEMPLATE_ID = "b3b62e72-5ced-4515-8720-08bdc7bac792".freeze + MERGE_COMPLETION_MERGING_ORGANISATION_TEMPLATE_ID = "b3b62e72-5ced-4515-8720-08bdc7bac792".freeze + MERGE_COMPLETION_ABSORBING_ORGANISATION_TEMPLATE_ID = "xxx".freeze - def send_merge_completion_mail(email, merged_organisation_name, absorbing_organisation_name, merge_date) + def send_merged_organisation_success_mail(email, merged_organisation_name, absorbing_organisation_name, merge_date) send_email( email, - MERGE_COMPLETION_TEMPLATE_ID, + MERGE_COMPLETION_MERGING_ORGANISATION_TEMPLATE_ID, + { + merged_organisation_name:, + absorbing_organisation_name:, + merge_date: merge_date.to_formatted_s(:govuk_date), + email:, + }, + ) + end + + def send_absorbing_organisation_success_mail(email, merged_organisation_name, absorbing_organisation_name, merge_date) + send_email( + email, + MERGE_COMPLETION_ABSORBING_ORGANISATION_TEMPLATE_ID, { merged_organisation_name:, absorbing_organisation_name:, diff --git a/app/services/merge/merge_organisations_service.rb b/app/services/merge/merge_organisations_service.rb index ead816dd2..7bca9f6f0 100644 --- a/app/services/merge/merge_organisations_service.rb +++ b/app/services/merge/merge_organisations_service.rb @@ -153,9 +153,12 @@ private end def send_success_emails - @merged_users.each do |organisation_name, users| - users.each do |user| - MergeCompletionMailer.send_merge_completion_mail(user[:email], organisation_name, @absorbing_organisation.name, @merge_date).deliver_later + @absorbing_organisation.users.each do |user| + merged_organisation, merged_user = find_merged_user_and_organization_by_email(user.email) + if merged_user.present? + MergeCompletionMailer.send_merged_organisation_success_mail(merged_user[:email], merged_organisation, @absorbing_organisation.name, @merge_date).deliver_later + else + MergeCompletionMailer.send_absorbing_organisation_success_mail(user.email, @merging_organisations.map(&:name).join(", "), @absorbing_organisation.name, @merge_date).deliver_later end end end @@ -234,4 +237,12 @@ private deactivation_period.destroy! end end + + def find_merged_user_and_organization_by_email(provided_email) + @merged_users.each do |org, users| + user = users.find { |u| u[:email] == provided_email } + return org, user if user + end + nil + end end diff --git a/spec/mailers/merge_completion_mailer_spec.rb b/spec/mailers/merge_completion_mailer_spec.rb index 0ebe96fcd..fb3f81ebb 100644 --- a/spec/mailers/merge_completion_mailer_spec.rb +++ b/spec/mailers/merge_completion_mailer_spec.rb @@ -8,18 +8,39 @@ RSpec.describe MergeCompletionMailer do allow(notify_client).to receive(:send_email).and_return(true) end - describe "#send_merge_completion_mail" do + describe "#send_merged_organisation_success_mail" do let(:merge_date) { Time.zone.local(2023, 1, 1) } it "sends a merge completion E-mail via notify" do - expect(notify_client).to receive(:send_email).with(hash_including({ personalisation: hash_including({ - merged_organisation_name: "merged organisation", - absorbing_organisation_name: "absorbing organisation", - merge_date: "1 January 2023", - email: "user@example.com", - }) })) - - described_class.new.send_merge_completion_mail("user@example.com", "merged organisation", "absorbing organisation", merge_date) + expect(notify_client).to receive(:send_email).with(hash_including({ + template_id: MergeCompletionMailer::MERGE_COMPLETION_MERGING_ORGANISATION_TEMPLATE_ID, + personalisation: hash_including({ + merged_organisation_name: "merged organisation", + absorbing_organisation_name: "absorbing organisation", + merge_date: "1 January 2023", + email: "user@example.com", + }), + })) + + described_class.new.send_merged_organisation_success_mail("user@example.com", "merged organisation", "absorbing organisation", merge_date) + end + end + + describe "#send_absorbing_organisation_success_mail" do + let(:merge_date) { Time.zone.local(2023, 1, 1) } + + it "sends a merge completion E-mail via notify" do + expect(notify_client).to receive(:send_email).with(hash_including({ + template_id: MergeCompletionMailer::MERGE_COMPLETION_ABSORBING_ORGANISATION_TEMPLATE_ID, + personalisation: hash_including({ + merged_organisation_name: "merged organisation", + absorbing_organisation_name: "absorbing organisation", + merge_date: "1 January 2023", + email: "user@example.com", + }), + })) + + described_class.new.send_absorbing_organisation_success_mail("user@example.com", "merged organisation", "absorbing organisation", merge_date) end end end diff --git a/spec/services/merge/merge_organisations_service_spec.rb b/spec/services/merge/merge_organisations_service_spec.rb index fe6843981..aa813b5dc 100644 --- a/spec/services/merge/merge_organisations_service_spec.rb +++ b/spec/services/merge/merge_organisations_service_spec.rb @@ -4,7 +4,8 @@ RSpec.describe Merge::MergeOrganisationsService do describe "#call" do before do mail_double = instance_double("ActionMailer::MessageDelivery", deliver_later: nil) - allow(MergeCompletionMailer).to receive(:send_merge_completion_mail).and_return(mail_double) + allow(MergeCompletionMailer).to receive(:send_merged_organisation_success_mail).and_return(mail_double) + allow(MergeCompletionMailer).to receive(:send_absorbing_organisation_success_mail).and_return(mail_double) end context "when merging a single organisation into an existing organisation" do @@ -838,8 +839,21 @@ RSpec.describe Merge::MergeOrganisationsService do end it "sends a merge completion E-mail to the merged organisation users" do - expect(MergeCompletionMailer).to receive(:send_merge_completion_mail).with(merging_organisation_user.email, "fake org", "absorbing org", Time.zone.today).once - expect(MergeCompletionMailer).to receive(:send_merge_completion_mail).with(merging_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today).once + expect(MergeCompletionMailer).to receive(:send_merged_organisation_success_mail).with(merging_organisation_user.email, "fake org", "absorbing org", Time.zone.today).once + expect(MergeCompletionMailer).to receive(:send_merged_organisation_success_mail).with(merging_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today).once + + expect(MergeCompletionMailer).not_to receive(:send_merged_organisation_success_mail).with(absorbing_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today) + expect(MergeCompletionMailer).not_to receive(:send_merged_organisation_success_mail).with(absorbing_organisation_user.email, "fake org", "absorbing org", Time.zone.today) + + merge_organisations_service.call + end + + it "sends a merge completion E-mail to the original absorbing organisation users" do + expect(MergeCompletionMailer).to receive(:send_absorbing_organisation_success_mail).with(absorbing_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today).once + expect(MergeCompletionMailer).to receive(:send_absorbing_organisation_success_mail).with(absorbing_organisation_user.email, "fake org", "absorbing org", Time.zone.today).once + + expect(MergeCompletionMailer).not_to receive(:send_absorbing_organisation_success_mail).with(merging_organisation_user.email, "fake org", "absorbing org", Time.zone.today) + expect(MergeCompletionMailer).not_to receive(:send_absorbing_organisation_success_mail).with(merging_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today) merge_organisations_service.call end @@ -848,7 +862,7 @@ RSpec.describe Merge::MergeOrganisationsService do context "when merging a multiple organisations into an existing organisation" do subject(:merge_organisations_service) { described_class.new(absorbing_organisation_id: absorbing_organisation.id, merging_organisation_ids: [merging_organisation_ids], merge_date: nil) } - let(:absorbing_organisation) { create(:organisation, holds_own_stock: false) } + let(:absorbing_organisation) { create(:organisation, holds_own_stock: false, name: "absorbing org") } let(:absorbing_organisation_user) { create(:user, organisation: absorbing_organisation) } let(:merging_organisation) { create(:organisation, holds_own_stock: true, name: "fake org") } @@ -946,6 +960,34 @@ RSpec.describe Merge::MergeOrganisationsService do expect(merging_organisation.users.first).to eq(dpo) expect(merging_organisation.data_protection_confirmation.data_protection_officer).to eq(dpo) end + + it "sends a merge completion E-mail to the merged organisation users" do + expect(MergeCompletionMailer).to receive(:send_merged_organisation_success_mail).with(merging_organisation_user.email, "fake org", "absorbing org", Time.zone.today).once + expect(MergeCompletionMailer).to receive(:send_merged_organisation_success_mail).with(merging_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today).once + + expect(MergeCompletionMailer).not_to receive(:send_merged_organisation_success_mail).with(absorbing_organisation.data_protection_officers.first.email, "fake org", "absorbing org", Time.zone.today) + expect(MergeCompletionMailer).not_to receive(:send_merged_organisation_success_mail).with(absorbing_organisation_user.email, "fake org", "absorbing org", Time.zone.today) + + merging_organisation_too.users.each do |user| + expect(MergeCompletionMailer).to receive(:send_merged_organisation_success_mail).with(user.email, "second org", "absorbing org", Time.zone.today).once + end + + merge_organisations_service.call + end + + it "sends a merge completion E-mail to the original absorbing organisation users" do + expect(MergeCompletionMailer).to receive(:send_absorbing_organisation_success_mail).with(absorbing_organisation.data_protection_officers.first.email, "fake org, second org", "absorbing org", Time.zone.today).once + expect(MergeCompletionMailer).to receive(:send_absorbing_organisation_success_mail).with(absorbing_organisation_user.email, "fake org, second org", "absorbing org", Time.zone.today).once + + expect(MergeCompletionMailer).not_to receive(:send_absorbing_organisation_success_mail).with(merging_organisation_user.email, "fake org, second org", "absorbing org", Time.zone.today) + expect(MergeCompletionMailer).not_to receive(:send_absorbing_organisation_success_mail).with(merging_organisation.data_protection_officers.first.email, "fake org, second org", "absorbing org", Time.zone.today) + + merging_organisation_too.users.each do |user| + expect(MergeCompletionMailer).not_to receive(:send_absorbing_organisation_success_mail).with(user.email, "second org", "absorbing org", Time.zone.today) + end + + merge_organisations_service.call + end end context "and merging organisation relationships" do