diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb
index f03d28f19..cdc030978 100644
--- a/app/controllers/users/dossiers_controller.rb
+++ b/app/controllers/users/dossiers_controller.rb
@@ -161,7 +161,7 @@ module Users
end
def extend_conservation
- dossier.update(en_construction_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 8b8a1e60e..f8023d563 100644
--- a/app/models/dossier.rb
+++ b/app/models/dossier.rb
@@ -7,6 +7,7 @@
# archived :boolean default(FALSE)
# autorisation_donnees :boolean
# brouillon_close_to_expiration_notice_sent_at :datetime
+# conservation_extension :interval default(0 seconds)
# en_construction_at :datetime
# en_construction_close_to_expiration_notice_sent_at :datetime
# en_construction_conservation_extension :interval default(0 seconds)
@@ -253,21 +254,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
@@ -431,7 +433,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?
@@ -609,6 +619,7 @@ class Dossier < ApplicationRecord
end
def after_passer_en_construction
+ update!(conservation_extension: 0.days)
update!(en_construction_at: Time.zone.now) if self.en_construction_at.nil?
end
@@ -625,6 +636,7 @@ class Dossier < ApplicationRecord
end
def after_repasser_en_construction(instructeur)
+ update!(conservation_extension: 0.days)
log_dossier_operation(instructeur, :repasser_en_construction)
end
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/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb
index 4386a504a..310a372b1 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