diff --git a/app/components/instructeurs/en_construction_menu_component.rb b/app/components/instructeurs/en_construction_menu_component.rb index 22c4bd398..0c9473370 100644 --- a/app/components/instructeurs/en_construction_menu_component.rb +++ b/app/components/instructeurs/en_construction_menu_component.rb @@ -21,4 +21,12 @@ class Instructeurs::EnConstructionMenuComponent < ApplicationComponent t(".revert_en_construction") end end + + def sva? + dossier.procedure.sva? + end + + def sva_resume_method + dossier.procedure.sva_svr_configuration.resume + end end diff --git a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.en.yml b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.en.yml index d9d6426bb..ca2ff44e5 100644 --- a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.en.yml +++ b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.en.yml @@ -2,3 +2,4 @@ en: revert_en_construction: Revert to in progress request_correction: Request a correction + request_completion: Request to complete diff --git a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.fr.yml b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.fr.yml index 4430f7654..c6e19124d 100644 --- a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.fr.yml +++ b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.fr.yml @@ -2,3 +2,4 @@ fr: revert_en_construction: Repasser en construction request_correction: Demander une correction + request_completion: Demander à compléter diff --git a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml index aedfed296..cc7359f33 100644 --- a/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml +++ b/app/components/instructeurs/en_construction_menu_component/en_construction_menu_component.html.haml @@ -16,7 +16,13 @@ .dropdown-description %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 = render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier:, @@ -29,3 +35,24 @@ process_action: nil, title: 'Marquer en attente 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 ?'} diff --git a/app/components/procedure/sva_svr_form_component/sva_svr_form_component.en.yml b/app/components/procedure/sva_svr_form_component/sva_svr_form_component.en.yml index 8aaf15440..f168f6503 100644 --- a/app/components/procedure/sva_svr_form_component/sva_svr_form_component.en.yml +++ b/app/components/procedure/sva_svr_form_component/sva_svr_form_component.en.yml @@ -10,6 +10,7 @@ en: resume_intro: | 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. + If the file has been declared incomplete, the delay will be reset, regardless of the configuration below. submit: Apply SVA/SVR configuration cancel: Cancel decision_buttons: @@ -20,8 +21,8 @@ en: svr_hint: "A file is automatically rejected if no instructor has pronounced before the allotted time" resume_buttons: 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_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_edit_denied: "Warning: SVA/SVR cannot be changed or disabled." diff --git a/app/components/procedure/sva_svr_form_component/sva_svr_form_component.fr.yml b/app/components/procedure/sva_svr_form_component/sva_svr_form_component.fr.yml index a66afb45d..be93b4b86 100644 --- a/app/components/procedure/sva_svr_form_component/sva_svr_form_component.fr.yml +++ b/app/components/procedure/sva_svr_form_component/sva_svr_form_component.fr.yml @@ -10,6 +10,7 @@ fr: resume_intro: | 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. + 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 cancel: Annuler 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" resume_buttons: 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_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_edit_denied: "Avertissement : le changement ou la désactivation du SVA/SVR est impossible." diff --git a/app/controllers/instructeurs/dossiers_controller.rb b/app/controllers/instructeurs/dossiers_controller.rb index 8f2777070..c101b2772 100644 --- a/app/controllers/instructeurs/dossiers_controller.rb +++ b/app/controllers/instructeurs/dossiers_controller.rb @@ -234,7 +234,7 @@ module Instructeurs commentaire = CommentaireService.build(current_instructeur, dossier, { body: message, piece_jointe: }) 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) current_instructeur.follow(dossier) diff --git a/app/models/concerns/dossier_correctable_concern.rb b/app/models/concerns/dossier_correctable_concern.rb index 86a14896c..0c4475d4c 100644 --- a/app/models/concerns/dossier_correctable_concern.rb +++ b/app/models/concerns/dossier_correctable_concern.rb @@ -8,10 +8,12 @@ module DossierCorrectableConcern 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? - corrections.create!(commentaire:) + kind ||= :correction + + corrections.create!(commentaire:, kind:) return if en_construction? diff --git a/app/views/administrateurs/sva_svr/edit.html.haml b/app/views/administrateurs/sva_svr/edit.html.haml index 2f5e13a4c..20cecc026 100644 --- a/app/views/administrateurs/sva_svr/edit.html.haml +++ b/app/views/administrateurs/sva_svr/edit.html.haml @@ -19,10 +19,15 @@ %p.fr-callout__text.fr-mt-2w L’écoulement du délai est suspendu quand un instructeur %strong demande des corrections - (action + ou + déclare le + %strong dossier incomplet + (actions %em Demander une correction + et + %em Demander à compléter ). 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 Cet écran permet le réglage des paramètres nécessaires au fonctionnement du SVA ou SVR. diff --git a/spec/components/instructeurs/en_contruction_menu_component_spec.rb b/spec/components/instructeurs/en_contruction_menu_component_spec.rb index 58a6f71c1..0d0912108 100644 --- a/spec/components/instructeurs/en_contruction_menu_component_spec.rb +++ b/spec/components/instructeurs/en_contruction_menu_component_spec.rb @@ -56,7 +56,8 @@ RSpec.describe Instructeurs::EnConstructionMenuComponent, type: :component do it 'renders a dropdown' do expect(subject).to have_dropdown_title('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 diff --git a/spec/controllers/instructeurs/dossiers_controller_spec.rb b/spec/controllers/instructeurs/dossiers_controller_spec.rb index f359fb76e..f083cb29b 100644 --- a/spec/controllers/instructeurs/dossiers_controller_spec.rb +++ b/spec/controllers/instructeurs/dossiers_controller_spec.rb @@ -499,11 +499,13 @@ describe Instructeurs::DossiersController, type: :controller do describe '#pending_correction' do let(:message) { 'do that' } let(:justificatif) { nil } + let(:kind) { nil } subject do post :pending_correction, params: { procedure_id: procedure.id, dossier_id: dossier.id, - dossier: { motivation: message, justificatif_motivation: justificatif } + dossier: { motivation: message, justificatif_motivation: justificatif }, + kind: }, format: :turbo_stream end @@ -529,6 +531,7 @@ describe Instructeurs::DossiersController, type: :controller do expect(dossier.reload).to be_en_construction expect(dossier).to be_pending_correction + expect(dossier.corrections.last).to be_correction end 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 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 let(:justificatif) { fake_justificatif } diff --git a/spec/models/concern/dossier_correctable_concern_spec.rb b/spec/models/concern/dossier_correctable_concern_spec.rb index 508b2a0a7..23e5d50d5 100644 --- a/spec/models/concern/dossier_correctable_concern_spec.rb +++ b/spec/models/concern/dossier_correctable_concern_spec.rb @@ -34,6 +34,12 @@ describe DossierCorrectableConcern do context 'when dossier is en_construction' do it 'creates a correction' do 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 it 'does not change dossier state' do