-
Notifications
You must be signed in to change notification settings - Fork 91
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #11087 from demarches-simplifiees/fix-10951
ETQ Usager, je veux qu'on supprime mon brouillon après 3 mois d'inactivité
- Loading branch information
Showing
16 changed files
with
308 additions
and
2 deletions.
There are no files selected for viewing
16 changes: 16 additions & 0 deletions
16
app/jobs/cron/notify_old_brouillon_dossiers_soon_deleted_job.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# frozen_string_literal: true | ||
|
||
class Cron::NotifyOldBrouillonDossiersSoonDeletedJob < Cron::CronJob | ||
self.schedule_expression = "every day at 6:00" | ||
|
||
def perform | ||
Dossier | ||
.state_brouillon | ||
.where(updated_at: ..3.months.ago) | ||
.where("notified_soon_deleted_sent_at IS NULL OR notified_soon_deleted_sent_at < updated_at") | ||
.find_each do |dossier| | ||
DossierMailer.notify_old_brouillon_soon_deleted(dossier).deliver_later(wait: rand(0..3.hours)) | ||
dossier.update_column(:notified_soon_deleted_sent_at, Time.zone.now) | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
# frozen_string_literal: true | ||
|
||
class Cron::PurgeOldBrouillonDossiersJob < Cron::CronJob | ||
self.schedule_expression = "every day at 5:30" | ||
|
||
def perform | ||
Dossier | ||
.state_brouillon | ||
.where(updated_at: ..(3.months + 2.weeks).ago) | ||
.find_each do |dossier| | ||
dossier.hide_and_keep_track!(:automatic, :not_modified_for_a_long_time) | ||
DossierMailer.notify_old_brouillon_after_deletion(dossier).deliver_later | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
app/views/dossier_mailer/notify_old_brouillon_after_deletion.html.haml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
- content_for(:title, "#{@subject}") | ||
|
||
%p= t(:hello, scope: [:views, :shared, :greetings]) | ||
|
||
%p= t('.body', dossier_id: @dossier.id, libelle_demarche: @dossier.procedure.libelle) | ||
|
||
%p= t('.new_dossier_html', link: commencer_url(@dossier.procedure)) | ||
|
||
= render partial: "layouts/mailers/signature" |
9 changes: 9 additions & 0 deletions
9
app/views/dossier_mailer/notify_old_brouillon_soon_deleted.html.haml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
- content_for(:title, "#{@subject}") | ||
|
||
%p= t(:hello, scope: [:views, :shared, :greetings]) | ||
|
||
%p= t('.body', dossier_id: @dossier.id, libelle_demarche: @dossier.procedure.libelle) | ||
|
||
%p= link_to t('.access_dossier'), dossier_url(@dossier), target: '_blank' | ||
|
||
= render partial: "layouts/mailers/signature" |
8 changes: 8 additions & 0 deletions
8
config/locales/views/dossier_mailer/notify_old_brouillon_after_deletion/en.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
en: | ||
dossier_mailer: | ||
notify_old_brouillon_after_deletion: | ||
subject: 'Your draft application n°%{dossier_id} has been deleted due to inactivity' | ||
body: | | ||
Your application n° %{dossier_id} for "%{libelle_demarche}" has been automatically deleted as it had not been modified for more than 3 months. | ||
new_dossier_html: | | ||
If you wish to submit a new application for this procedure, you can <a href="%{link}">click here</a>. |
8 changes: 8 additions & 0 deletions
8
config/locales/views/dossier_mailer/notify_old_brouillon_after_deletion/fr.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
fr: | ||
dossier_mailer: | ||
notify_old_brouillon_after_deletion: | ||
subject: "Votre dossier n°%{dossier_id} en brouillon a été supprimé pour cause d'inactivité" | ||
body: | | ||
Votre dossier n° %{dossier_id} pour la démarche "%{libelle_demarche}" n'ayant pas été modifié depuis plus de 3 mois a été supprimé automatiquement. | ||
new_dossier_html: | | ||
Si vous souhaitez déposer un nouveau dossier pour cette démarche, vous pouvez <a href="%{link}">cliquer ici</a>. |
11 changes: 11 additions & 0 deletions
11
config/locales/views/dossier_mailer/notify_old_brouillon_soon_deleted/en.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
en: | ||
dossier_mailer: | ||
notify_old_brouillon_soon_deleted: | ||
subject: 'Your draft file n°%{dossier_id} will soon be deleted' | ||
body: | | ||
Your file n° %{dossier_id} for "%{libelle_demarche}" has not been modified for more than 3 months. | ||
It will be automatically deleted in 2 weeks. | ||
If you wish to keep this application, please update it by logging into your personal space. | ||
access_dossier: 'Access my dossier' |
11 changes: 11 additions & 0 deletions
11
config/locales/views/dossier_mailer/notify_old_brouillon_soon_deleted/fr.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
fr: | ||
dossier_mailer: | ||
notify_old_brouillon_soon_deleted: | ||
subject: 'Votre dossier n°%{dossier_id} en brouillon va bientôt être supprimé' | ||
body: | | ||
Votre dossier n° %{dossier_id} pour la démarche "%{libelle_demarche}" n'a pas été modifié depuis plus de 3 mois. | ||
Il sera automatiquement supprimé dans 2 semaines. | ||
Si vous souhaitez conserver ce dossier, nous vous invitons à le mettre à jour en vous connectant à votre espace personnel. | ||
access_dossier: 'Accéder à mon dossier' |
7 changes: 7 additions & 0 deletions
7
db/migrate/20241126145420_add_notified_soon_deleted_sent_at_to_dossiers.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# frozen_string_literal: true | ||
|
||
class AddNotifiedSoonDeletedSentAtToDossiers < ActiveRecord::Migration[6.1] | ||
def change | ||
add_column :dossiers, :notified_soon_deleted_sent_at, :datetime | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# frozen_string_literal: true | ||
|
||
RSpec.describe Cron::NotifyOldBrouillonDossiersSoonDeletedJob, type: :job do | ||
let(:procedure) { create(:procedure) } | ||
|
||
let!(:recent_brouillon) { create(:dossier, :brouillon, procedure: procedure, updated_at: 2.months.ago) } | ||
let!(:old_brouillon) { create(:dossier, :brouillon, procedure: procedure, updated_at: 4.months.ago) } | ||
let!(:old_en_construction) { create(:dossier, :en_construction, procedure: procedure, updated_at: 4.months.ago) } | ||
|
||
subject(:perform_job) { described_class.perform_now } | ||
|
||
describe '#perform' do | ||
before do | ||
allow(DossierMailer).to receive(:notify_old_brouillon_soon_deleted).and_return(double(deliver_later: true)) | ||
perform_job | ||
end | ||
|
||
it 'sends email only for old brouillon dossiers' do | ||
expect(DossierMailer).to have_received(:notify_old_brouillon_soon_deleted).with(old_brouillon).once | ||
expect(DossierMailer).not_to have_received(:notify_old_brouillon_soon_deleted).with(recent_brouillon) | ||
expect(DossierMailer).not_to have_received(:notify_old_brouillon_soon_deleted).with(old_en_construction) | ||
end | ||
end | ||
end |
53 changes: 53 additions & 0 deletions
53
spec/jobs/cron/notify_old_brouillon_dossiers_soon_deleted_job_spec.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# frozen_string_literal: true | ||
|
||
RSpec.describe Cron::NotifyOldBrouillonDossiersSoonDeletedJob, type: :job do | ||
describe "#perform" do | ||
let(:job) { described_class.new } | ||
|
||
context "when there are old draft dossiers" do | ||
let!(:old_draft_never_notified) { travel_to(4.months.ago) { create(:dossier, :brouillon) } } | ||
let!(:old_draft_notified_before_update) do | ||
travel_to(4.months.ago) do | ||
create(:dossier, :brouillon, notified_soon_deleted_sent_at: 1.month.ago) | ||
end | ||
end | ||
let!(:old_draft_recently_notified) do | ||
travel_to(4.months.ago) do | ||
create(:dossier, :brouillon, notified_soon_deleted_sent_at: 3.months.from_now) | ||
end | ||
end | ||
let!(:recent_draft) { travel_to(2.months.ago) { create(:dossier, :brouillon) } } | ||
let!(:old_non_draft) { travel_to(4.months.ago) { create(:dossier, :en_construction) } } | ||
|
||
it "sends notifications only for eligible draft dossiers" do | ||
expect(DossierMailer).to receive(:notify_old_brouillon_soon_deleted) | ||
.with(old_draft_never_notified) | ||
.and_return(double(deliver_later: true)) | ||
.once | ||
|
||
expect(DossierMailer).to receive(:notify_old_brouillon_soon_deleted) | ||
.with(old_draft_notified_before_update) | ||
.and_return(double(deliver_later: true)) | ||
.once | ||
|
||
expect(DossierMailer).not_to receive(:notify_old_brouillon_soon_deleted) | ||
.with(old_draft_recently_notified) | ||
|
||
job.perform | ||
|
||
expect(old_draft_never_notified.reload.notified_soon_deleted_sent_at).to be_present | ||
expect(old_draft_notified_before_update.reload.notified_soon_deleted_sent_at).to be_present | ||
end | ||
end | ||
|
||
context "when there are no old draft dossiers" do | ||
let!(:recent_draft) { create(:dossier, :brouillon, updated_at: 2.months.ago) } | ||
|
||
it "doesn't send any notifications" do | ||
expect(DossierMailer).not_to receive(:notify_old_brouillon_soon_deleted) | ||
|
||
job.perform | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
# frozen_string_literal: true | ||
|
||
RSpec.describe Cron::PurgeOldBrouillonDossiersJob, type: :job do | ||
let(:procedure) { create(:procedure) } | ||
|
||
let!(:recent_brouillon) { travel_to(3.months.ago) { create(:dossier, :brouillon, procedure: procedure) } } | ||
let!(:old_brouillon) { travel_to(5.months.ago) { create(:dossier, :brouillon, procedure: procedure) } } | ||
let!(:very_old_brouillon) { travel_to(6.months.ago) { create(:dossier, :brouillon, procedure: procedure) } } | ||
let!(:old_en_construction) { travel_to(5.months.ago) { create(:dossier, :en_construction, procedure: procedure) } } | ||
|
||
subject(:perform_job) { described_class.perform_now } | ||
|
||
describe '#perform' do | ||
before do | ||
allow(DossierMailer).to receive(:notify_old_brouillon_after_deletion).and_return(double(deliver_later: true)) | ||
end | ||
|
||
it 'hides only old brouillon dossiers' do | ||
expect { perform_job }.to change { Dossier.visible_by_user.count }.by(-2) | ||
|
||
expect(Dossier.visible_by_user.pluck(:id)).to match_array([recent_brouillon.id, old_en_construction.id]) | ||
end | ||
|
||
it 'sends notification emails for each hidden dossier' do | ||
perform_job | ||
|
||
expect(DossierMailer).to have_received(:notify_old_brouillon_after_deletion).with(old_brouillon).once | ||
expect(DossierMailer).to have_received(:notify_old_brouillon_after_deletion).with(very_old_brouillon).once | ||
expect(DossierMailer).not_to have_received(:notify_old_brouillon_after_deletion).with(recent_brouillon) | ||
expect(DossierMailer).not_to have_received(:notify_old_brouillon_after_deletion).with(old_en_construction) | ||
end | ||
|
||
it 'sets the correct hidden_by attributes' do | ||
perform_job | ||
|
||
[old_brouillon, very_old_brouillon].each do |dossier| | ||
dossier.reload | ||
expect(dossier.hidden_by_expired_at).to be_present | ||
expect(dossier.hidden_by_reason).to eq("not_modified_for_a_long_time") | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters