amelioration(delai.traitement): revoie l'affichage du delais d'instruction

Co-authored-by: Colin Darie <colin@darie.eu>
This commit is contained in:
Martin 2023-11-21 12:33:39 +01:00
parent 474fde3380
commit f26a4bc041
8 changed files with 60 additions and 20 deletions

View file

@ -0,0 +1,14 @@
class Procedure::EstimatedDelayComponent < ApplicationComponent
def initialize(procedure:)
@procedure = procedure
@fastest, @mean, @slow = procedure.usual_traitement_time_for_recent_dossiers(ProcedureStatsConcern::NB_DAYS_RECENT_DOSSIERS)
end
def estimation_present?
@fastest && @mean && @slow
end
def render?
estimation_present?
end
end

View file

@ -0,0 +1,6 @@
---
en:
explanation: "Based on %{pencentile}% during the last %{nb_recent_dossiers} days, the instruction time is :"
fast_html: "<strong>In the best cast scenario</strong> : <strong>%{estimation}</strong>."
mean_html: "If your file <strong>requires minor adjustments</strong>, the instruction time is <strong>%{estimation}</strong>."
slow_html: "If you file <strong>is missing some information</strong> which requires a lot of exchanges with the administration, the instruction time is around <strong>%{estimation}</strong>."

View file

@ -0,0 +1,6 @@
---
fr:
explanation: Selon nos estimations, à partir des délais dinstruction constatés sur %{percentile}% des demandes qui ont été traitées lors des %{nb_recent_dossiers} derniers jours, les délais dinstruction sont les suivants
fast_html: "<strong>Dans le meilleur des cas</strong>, le délai dinstruction est : <strong>%{estimation}</strong>."
mean_html: "Les <strong>dossiers demandant quelques échanges</strong> le délai dinstruction est denviron : <strong>%{estimation}</strong>."
slow_html: "Si votre <strong>dossier est incomplet</strong> ou quil faut beaucoup déchanges avec ladministration, le délai dinstruction est denviron <strong>%{estimation}</strong>."

View file

@ -0,0 +1,10 @@
- cache(@procedure.id, expires_in: 1.day) do
- if estimation_present?
= render Dsfr::AlertComponent.new(state: :info, size: :sm, extra_class_names: 'fr-mb-2w') do |c|
- c.body do
%p= t('.explanation', percentile: ProcedureStatsConcern::USUAL_TRAITEMENT_TIME_PERCENTILE, nb_recent_dossiers: ProcedureStatsConcern::NB_DAYS_RECENT_DOSSIERS)
%ul
%li= t('.fast_html', estimation: distance_of_time_in_words(@fastest))
%li= t('.mean_html', estimation: distance_of_time_in_words(@mean))
%li= t('.slow_html', estimation: distance_of_time_in_words(@slow))

View file

@ -1,6 +0,0 @@
- cache(procedure.id, expires_in: 1.day) do
- if procedure.usual_traitement_time_for_recent_dossiers(ProcedureStatsConcern::NB_DAYS_RECENT_DOSSIERS)
%p
Habituellement, les dossiers de cette démarche sont traités dans un délai de #{distance_of_time_in_words(procedure.usual_traitement_time_for_recent_dossiers(ProcedureStatsConcern::NB_DAYS_RECENT_DOSSIERS))}.
%p
Cette estimation est calculée automatiquement à partir des délais dinstruction constatés sur #{ProcedureStatsConcern::USUAL_TRAITEMENT_TIME_PERCENTILE}% des demandes qui ont été traitées lors des #{ProcedureStatsConcern::NB_DAYS_RECENT_DOSSIERS} derniers jours. Le délai réel peut être différent, en fonction du type de démarche (par exemple pour un appel à projet avec date de décision fixe).

View file

@ -33,8 +33,7 @@
%p{ role: 'status' }
= t('views.users.dossiers.show.status_overview.en_construction_html')
= render partial: 'users/dossiers/show/estimated_delay', locals: { procedure: dossier.procedure }
= render Procedure::EstimatedDelayComponent.new(procedure: dossier.procedure)
%p
= t('views.users.dossiers.show.status_overview.use_mailbox_for_questions_html', mailbox_url: messagerie_dossier_url(dossier))
@ -50,7 +49,7 @@
%p
= t('views.users.dossiers.show.status_overview.delay_text_sva_svr', date: l(dossier.sva_svr_decision_on, format: :long))
= render partial: 'users/dossiers/show/estimated_delay', locals: { procedure: dossier.procedure }
= render Procedure::EstimatedDelayComponent.new(procedure: dossier.procedure)
%p
= t('views.users.dossiers.show.status_overview.use_mailbox_for_questions_html', mailbox_url: messagerie_dossier_url(dossier))

View file

@ -40,14 +40,14 @@ describe ProcedureStatsConcern do
let(:delays) { [1.day, 2.days, 2.days, 2.days, 2.days, 3.days, 3.days, 3.days, 3.days, 12.days] }
it 'returns a time representative of the dossier instruction delay' do
expect(procedure.usual_traitement_time_for_recent_dossiers(30)[0]).to be_between(1.days, 2.days)
expect(procedure.usual_traitement_time_for_recent_dossiers(30)[0]).to be_between(1.day, 2.days)
expect(procedure.usual_traitement_time_for_recent_dossiers(30)[1]).to be_between(2.days, 3.days)
expect(procedure.usual_traitement_time_for_recent_dossiers(30)[2]).to be_between(11.days, 12.days)
end
end
context 'when there are very old dossiers' do
let(:delays) { [1.days, 2.days, 3.days, 3.days, 4.days] }
let(:delays) { [1.day, 2.days, 3.days, 3.days, 4.days] }
let!(:old_dossier) { create_dossier(depose_at: 3.months.ago, en_instruction_at: 2.months.ago, processed_at: 2.months.ago) }
it 'ignores dossiers older than 1 month' do
@ -58,7 +58,7 @@ describe ProcedureStatsConcern do
end
context 'when there is a dossier with bad data' do
let(:delays) { [1.days, 2.days, 3.days, 3.days, 4.days] }
let(:delays) { [1.day, 2.days, 3.days, 3.days, 4.days] }
let!(:bad_dossier) { create_dossier(depose_at: nil, en_instruction_at: nil, processed_at: 10.days.ago) }
it 'ignores bad dossiers' do
@ -83,14 +83,14 @@ describe ProcedureStatsConcern do
let(:delays) { [] }
before do
csv = CSV.read(Rails.root.join('spec/fixtures/files/data/treatment-expected-3months.csv'))
traitement_times = csv[1..] #strip header
traitement_times = csv[1..] # strip header
.flatten
.map{ { processed_at: _1.to_f, depose_at: 0 } }
.map { { processed_at: _1.to_f, depose_at: 0 } }
allow(procedure).to receive(:traitement_times).and_return(traitement_times)
end
it 'works' do
expect(procedure.usual_traitement_time_for_recent_dossiers(30).map {distance_of_time_in_words(_1)}).to eq(["3 mois", "6 mois", "environ un an"])
expect(procedure.usual_traitement_time_for_recent_dossiers(30).map { distance_of_time_in_words(_1) }).to eq(["3 mois", "6 mois", "environ un an"])
end
end
end

View file

@ -1,5 +1,5 @@
describe 'users/dossiers/show/_status_overview', type: :view do
before { allow(dossier.procedure).to receive(:usual_traitement_time_for_recent_dossiers).and_return(1.day) }
before { allow(dossier.procedure).to receive(:usual_traitement_time_for_recent_dossiers).and_return([1.day, 2.days, 3.days]) }
subject! { render 'users/dossiers/show/status_overview', dossier: dossier }
@ -34,8 +34,14 @@ describe 'users/dossiers/show/_status_overview', type: :view do
expect(rendered).to have_timeline_item('.termine').inactive
end
it { is_expected.to have_selector('.status-explanation .en-construction') }
it { is_expected.to have_text('Habituellement, les dossiers de cette démarche sont traités dans un délai de 1 jour') }
it 'works' do
subject
expect(subject).to have_selector('.status-explanation .en-construction')
expect(subject).to have_text('Selon nos estimations, à partir des délais dinstruction constatés')
expect(subject).to have_text("Dans le meilleur des cas, le délais dinstruction estimé est : 1 jour.")
expect(subject).to have_text("Les dossiers demandant quelques échanges le délais dinstruction estimé est : 2 jours.")
expect(subject).to have_text("Si votre dossier est incomplet et quil faut beaucoup déchanges avec ladministration, le délais dinstruction estimé est : 3 jours")
end
end
context 'when en instruction' do
@ -48,8 +54,13 @@ describe 'users/dossiers/show/_status_overview', type: :view do
expect(rendered).to have_timeline_item('.termine').inactive
end
it { is_expected.to have_selector('.status-explanation .en-instruction') }
it { is_expected.to have_text('Habituellement, les dossiers de cette démarche sont traités dans un délai de 1 jour') }
it 'works' do
expect(subject).to have_selector('.status-explanation .en-instruction')
expect(subject).to have_text('Selon nos estimations, à partir des délais dinstruction constatés')
expect(subject).to have_text("Dans le meilleur des cas, le délais dinstruction estimé est : 1 jour.")
expect(subject).to have_text("Les dossiers demandant quelques échanges le délais dinstruction estimé est : 2 jours.")
expect(subject).to have_text("Si votre dossier est incomplet et quil faut beaucoup déchanges avec ladministration, le délais dinstruction estimé est : 3 jours")
end
end
context 'when accepté' do