feat(sva): instructeur can flag a dossier as incomplete

This commit is contained in:
Colin Darie 2023-06-14 13:14:19 +02:00
parent 1c977c72bf
commit 6ce8428ac6
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
12 changed files with 76 additions and 12 deletions

View file

@ -21,4 +21,12 @@ class Instructeurs::EnConstructionMenuComponent < ApplicationComponent
t(".revert_en_construction") t(".revert_en_construction")
end end
end end
def sva?
dossier.procedure.sva?
end
def sva_resume_method
dossier.procedure.sva_svr_configuration.resume
end
end end

View file

@ -2,3 +2,4 @@
en: en:
revert_en_construction: Revert to in progress revert_en_construction: Revert to in progress
request_correction: Request a correction request_correction: Request a correction
request_completion: Request to complete

View file

@ -2,3 +2,4 @@
fr: fr:
revert_en_construction: Repasser en construction revert_en_construction: Repasser en construction
request_correction: Demander une correction request_correction: Demander une correction
request_completion: Demander à compléter

View file

@ -16,7 +16,13 @@
.dropdown-description .dropdown-description
%h4= t('.request_correction') %h4= t('.request_correction')
Lusager sera informé que des modifications sont attendues Lusager sera informé que des modifications sont attendues.
- if sva?
- if sva_resume_method == :reset
Le délai du SVA sera réinitialisé lorquil déclarera avoir complété le dossier.
- else
Le délai du SVA reprendra lorsquil déclarera avoir corrigé le dossier.
- menu.with_item(class: "inactive form-inside fr-pt-1v") do - menu.with_item(class: "inactive form-inside fr-pt-1v") do
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier:, = render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier:,
@ -29,3 +35,24 @@
process_action: nil, process_action: nil,
title: 'Marquer en attente de corrections', title: 'Marquer en attente de corrections',
confirm: 'Envoyer la demande de corrections ?'} confirm: 'Envoyer la demande de corrections ?'}
- if sva?
- menu.with_item do
= link_to('#', onclick: "DS.showMotivation(event, 'pending_completion');", role: 'menuitem') do
%span.fr-icon.fr-icon-error-warning-line.fr-text-default--warning.fr-mt-1v{ "aria-hidden": "true" }
.dropdown-description
%h4= t('.request_completion')
Lusager sera informé que son dossier est incomplet. Le délai du SVA sera réinitialisé lorque il déclarera avoir complété le dossier.
- menu.with_item(class: "inactive form-inside fr-pt-1v") do
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier:,
visible: false,
form_path: pending_correction_instructeur_dossier_path(dossier.procedure, dossier, kind: :incomplete),
placeholder: 'Expliquez au demandeur comment compléter son dossier',
popup_class: 'pending_completion',
button_justificatif_label: "Ajouter une pièce jointe (facultatif)",
process_button: dossier.en_construction? ? 'Valider' : 'Valider et repasser en construction',
process_action: nil,
title: 'Marquer le dossier comme incomplet',
confirm: 'Envoyer la demande de complétion ?'}

View file

@ -10,6 +10,7 @@ en:
resume_intro: | resume_intro: |
When an instructor asks for a file to be corrected, the countdown of the delay is interrupted. When an instructor asks for a file to be corrected, the countdown of the delay is interrupted.
The delay resumes when the applicant resubmits their file stating that they have made the requested corrections. The delay resumes when the applicant resubmits their file stating that they have made the requested corrections.
If the file has been declared incomplete, the delay will be reset, regardless of the configuration below.
submit: Apply SVA/SVR configuration submit: Apply SVA/SVR configuration
cancel: Cancel cancel: Cancel
decision_buttons: decision_buttons:
@ -20,8 +21,8 @@ en:
svr_hint: "A file is automatically rejected if no instructor has pronounced before the allotted time" svr_hint: "A file is automatically rejected if no instructor has pronounced before the allotted time"
resume_buttons: resume_buttons:
continue_label: "Resume countdown from where it stopped" continue_label: "Resume countdown from where it stopped"
continue_hint: "Example: if the instructor asks for corrections while there are 10 days left before the automatic decision, and the file is resubmitted on April 15, it will be automatically accepted on April 25, unless the instructor pronounces in the meantime or asks for corrections again" continue_hint: "Example: if the instructor requests corrections to a complete file with 10 days to go before the automatic decision, and the file is resubmitted on April 15, it will be automatically accepted on April 25, unless the instructor makes a decision by then or requests corrections again. On the other hand, if the inspector asks for the file to be completed, the deadline will be reset."
reset_label: "Reset the delay" reset_label: "Reset the delay"
reset_hint: "Example: if the file is resubmitted on April 15 and the delay is 2 months, the decision will be automatically made on June 15, unless the instructor pronounces in the meantime or asks for corrections again" reset_hint: "Example: if the file is resubmitted on April 15 and the delay is 2 months, the decision will be automatically made on June 15, unless the instructor pronounces in the meantime or asks for corrections again."
notice_new_files_only: "Information: if you activate this rule, only the newly submitted files will be subject to it." notice_new_files_only: "Information: if you activate this rule, only the newly submitted files will be subject to it."
notice_edit_denied: "Warning: SVA/SVR cannot be changed or disabled." notice_edit_denied: "Warning: SVA/SVR cannot be changed or disabled."

View file

@ -10,6 +10,7 @@ fr:
resume_intro: | resume_intro: |
Lorsquun instructeur demande de corriger un dossier, le décompte du délai est interrompu. Lorsquun instructeur demande de corriger un dossier, le décompte du délai est interrompu.
Le délai reprend lorsque le demandeur redépose son dossier en déclarant avoir effectué les corrections demandées. Le délai reprend lorsque le demandeur redépose son dossier en déclarant avoir effectué les corrections demandées.
Si le dossier avait été déclaré incomplet, le délai sera réinitialisé, quelle que soit la configuration ci-dessous.
submit: Appliquer la configuration SVA/SVR submit: Appliquer la configuration SVA/SVR
cancel: Annuler cancel: Annuler
decision_buttons: decision_buttons:
@ -20,8 +21,8 @@ fr:
svr_hint: "Un dossier est automatiquement refusé si aucun ninstructeur ne sest prononcé avant le délai imparti" svr_hint: "Un dossier est automatiquement refusé si aucun ninstructeur ne sest prononcé avant le délai imparti"
resume_buttons: resume_buttons:
continue_label: "Reprendre le décompte depuis le moment où il sétait arrêté" continue_label: "Reprendre le décompte depuis le moment où il sétait arrêté"
continue_hint: "Exemple: si linstructeur demande des corrections alors quil reste 10 jours avant la décision automatique, et que le dossier est re-déposé le 15 avril, il sera automatiquement accepté le 25 avril, sauf à ce que linstructeur se prononce dici là ou demande à nouveau des corrections" continue_hint: "Exemple: si linstructeur demande des corrections dun dossier complet alors quil reste 10 jours avant la décision automatique, et que le dossier est re-déposé le 15 avril, il sera automatiquement accepté le 25 avril, sauf à ce que linstructeur se prononce dici là ou demande à nouveau des corrections. En revanche si linstructeur demande à compléter le dossier, le délai sera réinitialisé."
reset_label: "Réinitialiser le délai" reset_label: "Réinitialiser le délai"
reset_hint: "Exemple: si le dossier est re-déposé le 15 avril et que le délai est de 2 mois, la décision sera automatiquement prise le 15 juin, sauf à ce que linstructeur se prononce dici là ou demande à nouveau des corrections" reset_hint: "Exemple: si le dossier est re-déposé le 15 avril et que le délai est de 2 mois, la décision sera automatiquement prise le 15 juin, sauf à ce que linstructeur se prononce dici là ou demande à nouveau des corrections."
notice_new_files_only: "Information : si vous activez cette règle, seuls les nouveaux dossiers déposés y seront soumis." notice_new_files_only: "Information : si vous activez cette règle, seuls les nouveaux dossiers déposés y seront soumis."
notice_edit_denied: "Avertissement : le changement ou la désactivation du SVA/SVR est impossible." notice_edit_denied: "Avertissement : le changement ou la désactivation du SVA/SVR est impossible."

View file

@ -234,7 +234,7 @@ module Instructeurs
commentaire = CommentaireService.build(current_instructeur, dossier, { body: message, piece_jointe: }) commentaire = CommentaireService.build(current_instructeur, dossier, { body: message, piece_jointe: })
if commentaire.valid? if commentaire.valid?
dossier.flag_as_pending_correction!(commentaire) dossier.flag_as_pending_correction!(commentaire, params[:kind].presence)
dossier.update!(last_commentaire_updated_at: Time.zone.now) dossier.update!(last_commentaire_updated_at: Time.zone.now)
current_instructeur.follow(dossier) current_instructeur.follow(dossier)

View file

@ -8,10 +8,12 @@ module DossierCorrectableConcern
scope :with_pending_corrections, -> { joins(:corrections).where(corrections: { resolved_at: nil }) } scope :with_pending_corrections, -> { joins(:corrections).where(corrections: { resolved_at: nil }) }
def flag_as_pending_correction!(commentaire) def flag_as_pending_correction!(commentaire, kind)
return unless may_flag_as_pending_correction? return unless may_flag_as_pending_correction?
corrections.create!(commentaire:) kind ||= :correction
corrections.create!(commentaire:, kind:)
return if en_construction? return if en_construction?

View file

@ -19,10 +19,15 @@
%p.fr-callout__text.fr-mt-2w %p.fr-callout__text.fr-mt-2w
Lécoulement du délai est suspendu quand un instructeur Lécoulement du délai est suspendu quand un instructeur
%strong demande des corrections %strong demande des corrections
(action ou
déclare le
%strong dossier incomplet
(actions
%em Demander une correction %em Demander une correction
et
%em Demander à compléter
). Le dossier repasse alors en construction. ). Le dossier repasse alors en construction.
Une fois les corrections effectuées, lusager re-dépose son dossier. En fonction de la démarche, lécoulement du délai reprend, ou est réinitialisé à 0. Une fois les corrections effectuées, lusager re-dépose son dossier. En fonction de la démarche et de la complétude du dossier, lécoulement du délai reprend, ou est réinitialisé à 0.
%p.fr-callout__text.fr-mt-2w %p.fr-callout__text.fr-mt-2w
Cet écran permet le réglage des paramètres nécessaires au fonctionnement du SVA ou SVR. Cet écran permet le réglage des paramètres nécessaires au fonctionnement du SVA ou SVR.

View file

@ -56,7 +56,8 @@ RSpec.describe Instructeurs::EnConstructionMenuComponent, type: :component do
it 'renders a dropdown' do it 'renders a dropdown' do
expect(subject).to have_dropdown_title('Demander une correction') expect(subject).to have_dropdown_title('Demander une correction')
expect(subject).to have_dropdown_item('Demander une correction') expect(subject).to have_dropdown_item('Demander une correction')
expect(subject).to have_dropdown_items(count: 2) expect(subject).to have_dropdown_item('Demander à compléter')
expect(subject).to have_dropdown_items(count: 4)
end end
end end
end end

View file

@ -499,11 +499,13 @@ describe Instructeurs::DossiersController, type: :controller do
describe '#pending_correction' do describe '#pending_correction' do
let(:message) { 'do that' } let(:message) { 'do that' }
let(:justificatif) { nil } let(:justificatif) { nil }
let(:kind) { nil }
subject do subject do
post :pending_correction, params: { post :pending_correction, params: {
procedure_id: procedure.id, dossier_id: dossier.id, procedure_id: procedure.id, dossier_id: dossier.id,
dossier: { motivation: message, justificatif_motivation: justificatif } dossier: { motivation: message, justificatif_motivation: justificatif },
kind:
}, format: :turbo_stream }, format: :turbo_stream
end end
@ -529,6 +531,7 @@ describe Instructeurs::DossiersController, type: :controller do
expect(dossier.reload).to be_en_construction expect(dossier.reload).to be_en_construction
expect(dossier).to be_pending_correction expect(dossier).to be_pending_correction
expect(dossier.corrections.last).to be_correction
end end
it 'create a comment with text body' do it 'create a comment with text body' do
@ -536,6 +539,14 @@ describe Instructeurs::DossiersController, type: :controller do
expect(dossier.commentaires.last).to be_flagged_pending_correction expect(dossier.commentaires.last).to be_flagged_pending_correction
end end
context 'flagged as incomplete' do
let(:kind) { 'incomplete' }
it 'create a correction of incomplete kind' do
expect(dossier.corrections.last).to be_incomplete
end
end
context 'with an attachment' do context 'with an attachment' do
let(:justificatif) { fake_justificatif } let(:justificatif) { fake_justificatif }

View file

@ -34,6 +34,12 @@ describe DossierCorrectableConcern do
context 'when dossier is en_construction' do context 'when dossier is en_construction' do
it 'creates a correction' do it 'creates a correction' do
expect { dossier.flag_as_pending_correction!(commentaire) }.to change { dossier.corrections.pending.count }.by(1) expect { dossier.flag_as_pending_correction!(commentaire) }.to change { dossier.corrections.pending.count }.by(1)
expect(dossier.corrections.last).to be_correction
end
it 'created a correction of incomplete kind' do
expect { dossier.flag_as_pending_correction!(commentaire, "incomplete") }.to change { dossier.corrections.pending.count }.by(1)
expect(dossier.corrections.last).to be_incomplete
end end
it 'does not change dossier state' do it 'does not change dossier state' do