commit
9e1985d721
8 changed files with 51 additions and 21 deletions
|
@ -161,8 +161,7 @@ module Users
|
||||||
end
|
end
|
||||||
|
|
||||||
def extend_conservation
|
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)
|
||||||
conservation_extension: dossier.en_construction_conservation_extension + 1.month)
|
|
||||||
flash[:notice] = 'Votre dossier sera conservé un mois supplémentaire'
|
flash[:notice] = 'Votre dossier sera conservé un mois supplémentaire'
|
||||||
redirect_to dossier_path(@dossier)
|
redirect_to dossier_path(@dossier)
|
||||||
end
|
end
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
# user_id :integer
|
# user_id :integer
|
||||||
#
|
#
|
||||||
class Dossier < ApplicationRecord
|
class Dossier < ApplicationRecord
|
||||||
|
self.ignored_columns = [:en_construction_conservation_extension]
|
||||||
include DossierFilteringConcern
|
include DossierFilteringConcern
|
||||||
|
|
||||||
include Discard::Model
|
include Discard::Model
|
||||||
|
@ -86,7 +87,7 @@ class Dossier < ApplicationRecord
|
||||||
|
|
||||||
belongs_to :groupe_instructeur, optional: true
|
belongs_to :groupe_instructeur, optional: true
|
||||||
belongs_to :revision, class_name: 'ProcedureRevision', optional: false
|
belongs_to :revision, class_name: 'ProcedureRevision', optional: false
|
||||||
belongs_to :user, optional: false
|
belongs_to :user, optional: true
|
||||||
|
|
||||||
has_one :procedure, through: :revision
|
has_one :procedure, through: :revision
|
||||||
has_many :types_de_champ, through: :revision
|
has_many :types_de_champ, through: :revision
|
||||||
|
@ -256,21 +257,22 @@ class Dossier < ApplicationRecord
|
||||||
scope :brouillon_close_to_expiration, -> do
|
scope :brouillon_close_to_expiration, -> do
|
||||||
state_brouillon
|
state_brouillon
|
||||||
.joins(:procedure)
|
.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
|
end
|
||||||
scope :en_construction_close_to_expiration, -> do
|
scope :en_construction_close_to_expiration, -> do
|
||||||
state_en_construction
|
state_en_construction
|
||||||
.joins(:procedure)
|
.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
|
end
|
||||||
scope :en_instruction_close_to_expiration, -> do
|
scope :en_instruction_close_to_expiration, -> do
|
||||||
state_en_instruction
|
state_en_instruction
|
||||||
.joins(:procedure)
|
.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 })
|
.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
|
end
|
||||||
def self.termine_close_to_expiration
|
scope :termine_close_to_expiration, -> do
|
||||||
dossier_ids = Traitement.termine_close_to_expiration.pluck(:dossier_id).uniq
|
state_termine
|
||||||
Dossier.where(id: dossier_ids)
|
.joins(:procedure)
|
||||||
|
.where(id: Traitement.termine_close_to_expiration.pluck(:dossier_id).uniq)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope :brouillon_expired, -> do
|
scope :brouillon_expired, -> do
|
||||||
|
@ -347,7 +349,7 @@ class Dossier < ApplicationRecord
|
||||||
after_save :send_web_hook
|
after_save :send_web_hook
|
||||||
after_create_commit :send_draft_notification_email
|
after_create_commit :send_draft_notification_email
|
||||||
|
|
||||||
validates :user, presence: true
|
validates :user, presence: true, if: -> { deleted_user_email_never_send.nil? }
|
||||||
validates :individual, presence: true, if: -> { revision.procedure.for_individual? }
|
validates :individual, presence: true, if: -> { revision.procedure.for_individual? }
|
||||||
validates :groupe_instructeur, presence: true, if: -> { !brouillon? }
|
validates :groupe_instructeur, presence: true, if: -> { !brouillon? }
|
||||||
|
|
||||||
|
@ -454,7 +456,15 @@ class Dossier < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def en_construction_close_to_expiration?
|
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
|
end
|
||||||
|
|
||||||
def show_groupe_instructeur_details?
|
def show_groupe_instructeur_details?
|
||||||
|
|
|
@ -22,11 +22,17 @@
|
||||||
%li
|
%li
|
||||||
= link_to "Tout le dossier", dossier_path(dossier, format: :pdf), target: "_blank", rel: "noopener", class: "menu-item menu-link"
|
= 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.warning
|
||||||
.card-title Votre dossier va expirer
|
.card-title Votre dossier va expirer
|
||||||
|
- if dossier.brouillon?
|
||||||
%p
|
%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.
|
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
|
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.
|
un mois de plus en cliquant sur le bouton ci-dessous.
|
||||||
%br
|
%br
|
||||||
|
|
|
@ -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é :"
|
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 :"
|
other: "Afin de limiter la conservation de vos données personnelles, les dossiers en brouillon suivant seront bientôt automatiquement supprimés :"
|
||||||
footer:
|
footer:
|
||||||
one: "Si vous souhaitez toujours déposer ce dossier, vous pouvez retrouver votre brouillon pendant encore <b>un mois</b>. Et sinon, vous n’avez rien à faire."
|
one: "Si vous souhaitez toujours déposer ce dossier, vous pouvez retrouver votre brouillon pendant encore <b>un mois</b>. Si vous souhaitez conserver votre dossier plus longtemps, vous pouvez <b>prolonger sa durée de conservation</b> 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 <b>un mois</b>. Et sinon, vous n’avez rien à faire."
|
other: "Si vous souhaitez toujours déposer ces dossiers, vous pouvez retrouver vos brouillons pendant encore <b>un mois</b>. Si vous souhaitez conserver vos dossiers plus longtemps, vous pouvez <b>prolonger leur durée de conservation</b> au cas par cas dans l'interface. Et sinon, vous n’avez rien à faire."
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddDefaultToConservationExtension < ActiveRecord::Migration[6.1]
|
||||||
|
def change
|
||||||
|
change_column_default :dossiers, :conservation_extension, 0.days
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# 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
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
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_avis_updated_at"
|
||||||
t.datetime "last_commentaire_updated_at"
|
t.datetime "last_commentaire_updated_at"
|
||||||
t.string "api_entreprise_job_exceptions", array: true
|
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.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 || 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
|
t.index "to_tsvector('french'::regconfig, search_terms)", name: "index_dossiers_on_search_terms", using: :gin
|
||||||
|
|
|
@ -52,6 +52,15 @@ describe Dossier do
|
||||||
is_expected.to include(just_expired_dossier)
|
is_expected.to include(just_expired_dossier)
|
||||||
is_expected.to include(long_expired_dossier)
|
is_expected.to include(long_expired_dossier)
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe 'en_construction_close_to_expiration' do
|
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
|
context 'does not include an expiring dossier that has been postponed' do
|
||||||
before do
|
before do
|
||||||
expiring_dossier.update(en_construction_conservation_extension: 1.month)
|
expiring_dossier.update(conservation_extension: 1.month)
|
||||||
expiring_dossier.reload
|
expiring_dossier.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -332,7 +332,7 @@ describe User, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with dossiers with processing strted' do
|
context 'with dossiers with processing started' do
|
||||||
let!(:dossier_en_instruction) { create(:dossier, :en_instruction, user: user) }
|
let!(:dossier_en_instruction) { create(:dossier, :en_instruction, user: user) }
|
||||||
let!(:dossier_termine) { create(:dossier, :accepte, user: user) }
|
let!(:dossier_termine) { create(:dossier, :accepte, user: user) }
|
||||||
|
|
||||||
|
@ -347,6 +347,7 @@ describe User, type: :model do
|
||||||
expect(dossier_termine.reload).to be_present
|
expect(dossier_termine.reload).to be_present
|
||||||
expect(dossier_termine.user).to be_nil
|
expect(dossier_termine.user).to be_nil
|
||||||
expect(dossier_termine.user_email_for(:display)).to eq(user.email)
|
expect(dossier_termine.user_email_for(:display)).to eq(user.email)
|
||||||
|
expect(dossier_termine.valid?).to be_truthy
|
||||||
expect { dossier_termine.user_email_for(:notification) }.to raise_error(RuntimeError)
|
expect { dossier_termine.user_email_for(:notification) }.to raise_error(RuntimeError)
|
||||||
|
|
||||||
expect(User.find_by(id: user.id)).to be_nil
|
expect(User.find_by(id: user.id)).to be_nil
|
||||||
|
|
Loading…
Reference in a new issue