diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 67c67335c..791049a78 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -161,8 +161,7 @@ module Users end def extend_conservation - dossier.update(en_construction_conservation_extension: dossier.en_construction_conservation_extension + 1.month, - conservation_extension: dossier.en_construction_conservation_extension + 1.month) + dossier.update(conservation_extension: dossier.conservation_extension + 1.month) flash[:notice] = 'Votre dossier sera conservé un mois supplémentaire' redirect_to dossier_path(@dossier) end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index a448a41c4..a0eb88cbf 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -32,6 +32,7 @@ # user_id :integer # class Dossier < ApplicationRecord + self.ignored_columns = [:en_construction_conservation_extension] include DossierFilteringConcern include Discard::Model @@ -256,21 +257,22 @@ class Dossier < ApplicationRecord scope :brouillon_close_to_expiration, -> do state_brouillon .joins(:procedure) - .where("dossiers.created_at + (duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION }) + .where("dossiers.created_at + dossiers.conservation_extension + (duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION }) end scope :en_construction_close_to_expiration, -> do state_en_construction .joins(:procedure) - .where("dossiers.en_construction_at + dossiers.en_construction_conservation_extension + (duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION }) + .where("dossiers.en_construction_at + dossiers.conservation_extension + (duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION }) end scope :en_instruction_close_to_expiration, -> do state_en_instruction .joins(:procedure) .where("dossiers.en_instruction_at + (duree_conservation_dossiers_dans_ds * INTERVAL '1 month') - INTERVAL :expires_in < :now", { now: Time.zone.now, expires_in: INTERVAL_BEFORE_EXPIRATION }) end - def self.termine_close_to_expiration - dossier_ids = Traitement.termine_close_to_expiration.pluck(:dossier_id).uniq - Dossier.where(id: dossier_ids) + scope :termine_close_to_expiration, -> do + state_termine + .joins(:procedure) + .where(id: Traitement.termine_close_to_expiration.pluck(:dossier_id).uniq) end scope :brouillon_expired, -> do @@ -454,7 +456,15 @@ class Dossier < ApplicationRecord end def en_construction_close_to_expiration? - Dossier.en_construction_close_to_expiration.where(id: self).present? + self.class.en_construction_close_to_expiration.exists?(id: self) + end + + def brouillon_close_to_expiration? + self.class.brouillon_close_to_expiration.exists?(id: self) + end + + def close_to_expiration? + en_construction_close_to_expiration? || brouillon_close_to_expiration? end def show_groupe_instructeur_details? diff --git a/app/views/users/dossiers/show/_header.html.haml b/app/views/users/dossiers/show/_header.html.haml index 905f34f42..ceed29f78 100644 --- a/app/views/users/dossiers/show/_header.html.haml +++ b/app/views/users/dossiers/show/_header.html.haml @@ -22,13 +22,19 @@ %li = link_to "Tout le dossier", dossier_path(dossier, format: :pdf), target: "_blank", rel: "noopener", class: "menu-item menu-link" - - if dossier.en_construction_close_to_expiration? + - if dossier.close_to_expiration? .card.warning .card-title Votre dossier va expirer - %p - Votre dossier a été déposé, mais va bientôt expirer. Cela signifie qu'il va bientôt être supprimé sans avoir été traité par l’administration. - Si vous souhaitez le conserver afin de poursuivre la démarche, vous pouvez le conserver - un mois de plus en cliquant sur le bouton ci-dessous. + - if dossier.brouillon? + %p + Votre dossier est en brouillon, mais va bientôt expirer. Cela signifie qu’il va bientôt être supprimé sans avoir été déposé. + Si vous souhaitez le conserver afin de poursuivre la démarche, vous pouvez le conserver + un mois de plus en cliquant sur le bouton ci-dessous. + - else + %p + Votre dossier a été déposé, mais va bientôt expirer. Cela signifie qu’il va bientôt être supprimé sans avoir été traité par l’administration. + Si vous souhaitez le conserver afin de poursuivre la démarche, vous pouvez le conserver + un mois de plus en cliquant sur le bouton ci-dessous. %br = button_to 'Repousser sa suppression', users_dossier_repousser_expiration_path(dossier), class: 'button secondary' diff --git a/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml b/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml index f4ccef4e0..883a7130a 100644 --- a/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml +++ b/config/locales/views/dossier_mailer/notify_brouillon_near_deletion/fr.yml @@ -8,5 +8,5 @@ fr: one: "Afin de limiter la conservation de vos données personnelles, le dossier en brouillon suivant sera bientôt automatiquement supprimé :" other: "Afin de limiter la conservation de vos données personnelles, les dossiers en brouillon suivant seront bientôt automatiquement supprimés :" footer: - one: "Si vous souhaitez toujours déposer ce dossier, vous pouvez retrouver votre brouillon pendant encore un mois. Et sinon, vous n’avez rien à faire." - other: "Si vous souhaitez toujours déposer ces dossiers, vous pouvez retrouver vos brouillons pendant encore un mois. Et sinon, vous n’avez rien à faire." + one: "Si vous souhaitez toujours déposer ce dossier, vous pouvez retrouver votre brouillon pendant encore un mois. Si vous souhaitez conserver votre dossier plus longtemps, vous pouvez prolonger sa durée de conservation dans l'interface. Et sinon, vous n’avez rien à faire." + other: "Si vous souhaitez toujours déposer ces dossiers, vous pouvez retrouver vos brouillons pendant encore un mois. Si vous souhaitez conserver vos dossiers plus longtemps, vous pouvez prolonger leur durée de conservation au cas par cas dans l'interface. Et sinon, vous n’avez rien à faire." diff --git a/db/migrate/20210506135603_add_default_to_conservation_extension.rb b/db/migrate/20210506135603_add_default_to_conservation_extension.rb new file mode 100644 index 000000000..24a8b9152 --- /dev/null +++ b/db/migrate/20210506135603_add_default_to_conservation_extension.rb @@ -0,0 +1,5 @@ +class AddDefaultToConservationExtension < ActiveRecord::Migration[6.1] + def change + change_column_default :dossiers, :conservation_extension, 0.days + end +end diff --git a/db/schema.rb b/db/schema.rb index 911ebb453..0955c73f6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_05_05_115445) do +ActiveRecord::Schema.define(version: 2021_05_06_135603) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -274,7 +274,7 @@ ActiveRecord::Schema.define(version: 2021_05_05_115445) do t.datetime "last_avis_updated_at" t.datetime "last_commentaire_updated_at" t.string "api_entreprise_job_exceptions", array: true - t.interval "conservation_extension" + t.interval "conservation_extension", default: "PT0S" t.string "deleted_user_email_never_send" t.index "to_tsvector('french'::regconfig, (search_terms || private_search_terms))", name: "index_dossiers_on_search_terms_private_search_terms", using: :gin t.index "to_tsvector('french'::regconfig, search_terms)", name: "index_dossiers_on_search_terms", using: :gin diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index a81a63bef..7d87596c1 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -52,6 +52,15 @@ describe Dossier do is_expected.to include(just_expired_dossier) is_expected.to include(long_expired_dossier) end + + context 'does not include an expiring dossier that has been postponed' do + before do + expiring_dossier.update(conservation_extension: 1.month) + expiring_dossier.reload + end + + it { is_expected.not_to include(expiring_dossier) } + end end describe 'en_construction_close_to_expiration' do @@ -72,7 +81,7 @@ describe Dossier do context 'does not include an expiring dossier that has been postponed' do before do - expiring_dossier.update(en_construction_conservation_extension: 1.month) + expiring_dossier.update(conservation_extension: 1.month) expiring_dossier.reload end