feat(sva): instructeur can flag a dossier as incomplete
This commit is contained in:
parent
1c977c72bf
commit
6ce8428ac6
12 changed files with 76 additions and 12 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -16,7 +16,13 @@
|
||||||
|
|
||||||
.dropdown-description
|
.dropdown-description
|
||||||
%h4= t('.request_correction')
|
%h4= t('.request_correction')
|
||||||
L’usager sera informé que des modifications sont attendues
|
L’usager sera informé que des modifications sont attendues.
|
||||||
|
|
||||||
|
- if sva?
|
||||||
|
- if sva_resume_method == :reset
|
||||||
|
Le délai du SVA sera réinitialisé lorqu’il déclarera avoir complété le dossier.
|
||||||
|
- else
|
||||||
|
Le délai du SVA reprendra lorsqu’il 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')
|
||||||
|
L’usager 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 ?'}
|
||||||
|
|
|
@ -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."
|
||||||
|
|
|
@ -10,6 +10,7 @@ fr:
|
||||||
resume_intro: |
|
resume_intro: |
|
||||||
Lorsqu’un instructeur demande de corriger un dossier, le décompte du délai est interrompu.
|
Lorsqu’un 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 n’instructeur ne s’est prononcé avant le délai imparti"
|
svr_hint: "Un dossier est automatiquement refusé si aucun n’instructeur ne s’est 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 l’instructeur demande des corrections alors qu’il 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 l’instructeur se prononce d’ici là ou demande à nouveau des corrections"
|
continue_hint: "Exemple: si l’instructeur demande des corrections d’un dossier complet alors qu’il 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 l’instructeur se prononce d’ici là ou demande à nouveau des corrections. En revanche si l’instructeur 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 l’instructeur se prononce d’ici 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 l’instructeur se prononce d’ici 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."
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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?
|
||||||
|
|
||||||
|
|
|
@ -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, l’usager 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, l’usager 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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 }
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue