Add handeling of expired processed dossiers to deletion service
This commit is contained in:
parent
f1b531911b
commit
31943f7d9c
2 changed files with 156 additions and 0 deletions
|
@ -9,6 +9,11 @@ class ExpiredDossiersDeletionService
|
||||||
delete_expired_en_construction_and_notify
|
delete_expired_en_construction_and_notify
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.process_expired_dossiers_termine
|
||||||
|
send_termine_expiration_notices
|
||||||
|
delete_expired_termine_and_notify
|
||||||
|
end
|
||||||
|
|
||||||
def self.send_brouillon_expiration_notices
|
def self.send_brouillon_expiration_notices
|
||||||
dossiers_close_to_expiration = Dossier
|
dossiers_close_to_expiration = Dossier
|
||||||
.brouillon_close_to_expiration
|
.brouillon_close_to_expiration
|
||||||
|
@ -38,6 +43,16 @@ class ExpiredDossiersDeletionService
|
||||||
dossiers_close_to_expiration.update_all(en_construction_close_to_expiration_notice_sent_at: Time.zone.now)
|
dossiers_close_to_expiration.update_all(en_construction_close_to_expiration_notice_sent_at: Time.zone.now)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.send_termine_expiration_notices
|
||||||
|
dossiers_close_to_expiration = Dossier
|
||||||
|
.termine_close_to_expiration
|
||||||
|
.without_termine_expiration_notice_sent
|
||||||
|
|
||||||
|
send_expiration_notices(dossiers_close_to_expiration)
|
||||||
|
|
||||||
|
dossiers_close_to_expiration.update_all(termine_close_to_expiration_notice_sent_at: Time.zone.now)
|
||||||
|
end
|
||||||
|
|
||||||
def self.delete_expired_brouillons_and_notify
|
def self.delete_expired_brouillons_and_notify
|
||||||
dossiers_to_remove = Dossier.brouillon_expired
|
dossiers_to_remove = Dossier.brouillon_expired
|
||||||
|
|
||||||
|
@ -59,6 +74,10 @@ class ExpiredDossiersDeletionService
|
||||||
delete_expired_and_notify(Dossier.en_construction_expired)
|
delete_expired_and_notify(Dossier.en_construction_expired)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.delete_expired_termine_and_notify
|
||||||
|
delete_expired_and_notify(Dossier.termine_expired)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def self.send_expiration_notices(dossiers_close_to_expiration)
|
def self.send_expiration_notices(dossiers_close_to_expiration)
|
||||||
|
|
|
@ -268,4 +268,141 @@ describe ExpiredDossiersDeletionService do
|
||||||
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with([deleted_dossier_2], dossier_2.procedure.administrateurs.first.email) }
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with([deleted_dossier_2], dossier_2.procedure.administrateurs.first.email) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#send_termine_expiration_notices' do
|
||||||
|
before { Timecop.freeze(Time.zone.now) }
|
||||||
|
after { Timecop.return }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(DossierMailer).to receive(:notify_near_deletion_to_user).and_return(double(deliver_later: nil))
|
||||||
|
allow(DossierMailer).to receive(:notify_near_deletion_to_administration).and_return(double(deliver_later: nil))
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with a single dossier' do
|
||||||
|
let!(:dossier) { create(:dossier, :accepte, :followed, procedure: procedure, processed_at: processed_at) }
|
||||||
|
|
||||||
|
before { ExpiredDossiersDeletionService.send_termine_expiration_notices }
|
||||||
|
|
||||||
|
context 'when the dossier is not near deletion' do
|
||||||
|
let(:processed_at) { (conservation_par_defaut - 1.month - 1.day).ago }
|
||||||
|
|
||||||
|
it { expect(dossier.reload.termine_close_to_expiration_notice_sent_at).to be_nil }
|
||||||
|
it { expect(DossierMailer).not_to have_received(:notify_near_deletion_to_user) }
|
||||||
|
it { expect(DossierMailer).not_to have_received(:notify_near_deletion_to_administration) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the dossier is near deletion' do
|
||||||
|
let(:processed_at) { (conservation_par_defaut - 1.month + 1.day).ago }
|
||||||
|
|
||||||
|
it { expect(dossier.reload.termine_close_to_expiration_notice_sent_at).not_to be_nil }
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_user).once }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).twice }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_user).with([dossier], dossier.user.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).with([dossier], dossier.procedure.administrateurs.first.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).with([dossier], dossier.followers_instructeurs.first.email) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with 2 dossiers to notice' do
|
||||||
|
let!(:dossier_1) { create(:dossier, :accepte, procedure: procedure, user: user, processed_at: (conservation_par_defaut - 1.month + 1.day).ago) }
|
||||||
|
let!(:dossier_2) { create(:dossier, :accepte, procedure: procedure_2, user: user, processed_at: (conservation_par_defaut - 1.month + 1.day).ago) }
|
||||||
|
|
||||||
|
let!(:instructeur) { create(:instructeur) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
instructeur.followed_dossiers << dossier_1 << dossier_2
|
||||||
|
ExpiredDossiersDeletionService.send_termine_expiration_notices
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_user).once }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).exactly(3).times }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_user).with(match_array([dossier_1, dossier_2]), user.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).with(match_array([dossier_1, dossier_2]), instructeur.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).with([dossier_1], dossier_1.procedure.administrateurs.first.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).with([dossier_2], dossier_2.procedure.administrateurs.first.email) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when an instructeur is also administrateur' do
|
||||||
|
let!(:administrateur) { procedure.administrateurs.first }
|
||||||
|
let!(:dossier) { create(:dossier, :accepte, procedure: procedure, processed_at: (conservation_par_defaut - 1.month + 1.day).ago) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
administrateur.instructeur.followed_dossiers << dossier
|
||||||
|
ExpiredDossiersDeletionService.send_termine_expiration_notices
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_user).once }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_user).with([dossier], dossier.user.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_near_deletion_to_administration).with([dossier], administrateur.email) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#delete_expired_termine_and_notify' do
|
||||||
|
before { Timecop.freeze(Time.zone.now) }
|
||||||
|
after { Timecop.return }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(DossierMailer).to receive(:notify_automatic_deletion_to_user).and_return(double(deliver_later: nil))
|
||||||
|
allow(DossierMailer).to receive(:notify_automatic_deletion_to_administration).and_return(double(deliver_later: nil))
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with a single dossier' do
|
||||||
|
let!(:dossier) { create(:dossier, :accepte, :followed, procedure: procedure, termine_close_to_expiration_notice_sent_at: notice_sent_at) }
|
||||||
|
let(:deleted_dossier) { DeletedDossier.find_by(dossier_id: dossier.id) }
|
||||||
|
|
||||||
|
before { ExpiredDossiersDeletionService.delete_expired_termine_and_notify }
|
||||||
|
|
||||||
|
context 'when no notice has been sent' do
|
||||||
|
let(:notice_sent_at) { nil }
|
||||||
|
|
||||||
|
it { expect { dossier.reload }.not_to raise_error }
|
||||||
|
it { expect(DossierMailer).not_to have_received(:notify_automatic_deletion_to_user) }
|
||||||
|
it { expect(DossierMailer).not_to have_received(:notify_automatic_deletion_to_administration) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when a notice has been sent not so long ago' do
|
||||||
|
let(:notice_sent_at) { (warning_period - 4.days).ago }
|
||||||
|
|
||||||
|
it { expect { dossier.reload }.not_to raise_error }
|
||||||
|
it { expect(DossierMailer).not_to have_received(:notify_automatic_deletion_to_user) }
|
||||||
|
it { expect(DossierMailer).not_to have_received(:notify_automatic_deletion_to_administration) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when a notice has been sent a long time ago' do
|
||||||
|
let(:notice_sent_at) { (warning_period + 4.days).ago }
|
||||||
|
|
||||||
|
it { expect { dossier.reload }.to raise_error(ActiveRecord::RecordNotFound) }
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_user).once }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_user).with([deleted_dossier], dossier.user.email) }
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).twice }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with([deleted_dossier], dossier.procedure.administrateurs.first.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with([deleted_dossier], dossier.followers_instructeurs.first.email) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with 2 dossiers to delete' do
|
||||||
|
let!(:dossier_1) { create(:dossier, :accepte, procedure: procedure, user: user, termine_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) }
|
||||||
|
let!(:dossier_2) { create(:dossier, :refuse, procedure: procedure_2, user: user, termine_close_to_expiration_notice_sent_at: (warning_period + 1.day).ago) }
|
||||||
|
let(:deleted_dossier_1) { DeletedDossier.find_by(dossier_id: dossier_1.id) }
|
||||||
|
let(:deleted_dossier_2) { DeletedDossier.find_by(dossier_id: dossier_2.id) }
|
||||||
|
|
||||||
|
let!(:instructeur) { create(:instructeur) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
instructeur.followed_dossiers << dossier_1 << dossier_2
|
||||||
|
ExpiredDossiersDeletionService.delete_expired_termine_and_notify
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_user).once }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_user).with(match_array([deleted_dossier_1, deleted_dossier_2]), user.email) }
|
||||||
|
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).thrice }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with(match_array([deleted_dossier_1, deleted_dossier_2]), instructeur.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with([deleted_dossier_1], dossier_1.procedure.administrateurs.first.email) }
|
||||||
|
it { expect(DossierMailer).to have_received(:notify_automatic_deletion_to_administration).with([deleted_dossier_2], dossier_2.procedure.administrateurs.first.email) }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue