Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
class Instruction::CancelNextAuthorizationRequestStagesController < Instruction::AbstractAuthorizationRequestsController
before_action :authorize_cancel_next_stage

def new; end

def create
CancelNextAuthorizationRequestStage.call(authorization_request: @authorization_request, user: current_user)

success_message_for_authorization_request(@authorization_request, key: 'instruction.cancel_next_authorization_request_stages.create')

redirect_to instruction_dashboard_show_path(id: 'demandes'),
status: :see_other
end

private

def authorize_cancel_next_stage
authorize [:instruction, @authorization_request], :cancel_next_stage?
end

def model_to_track_for_impersonation
@authorization_request
end
end
9 changes: 8 additions & 1 deletion app/policies/instruction/authorization_request_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ def cancel_reopening?
record.can_cancel_reopening?
end

def cancel_next_stage?
show? &&
instructor_for_record? &&
record.can_cancel_next_stage?
end

def transfer?
show? &&
instructor_for_record? &&
Expand All @@ -63,7 +69,8 @@ def moderate?
refuse? ||
revoke? ||
request_changes? ||
cancel_reopening?
cancel_reopening? ||
cancel_next_stage?
end

private
Expand Down
2 changes: 2 additions & 0 deletions app/services/skip_links_implemented_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class SkipLinksImplementedChecker
instruction/messages#index
instruction/cancel_authorization_reopenings#new
instruction/cancel_authorization_reopenings#create
instruction/cancel_next_authorization_request_stages#new
instruction/cancel_next_authorization_request_stages#create
instruction/revoke_authorization_requests#new
instruction/revoke_authorization_requests#create
instruction/instructor_draft_requests/invite#new
Expand Down
27 changes: 27 additions & 0 deletions app/views/authorization_request_forms/summary.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,33 @@
</div>
</div>
<% end %>
<% elsif policy(@authorization_request).cancel_next_stage? && policy(@authorization_request).submit? %>
<% content_for :sticky_bar do %>
<div class="fr-container fr-grid-row">
<div class="fr-col-12">
<ul class="fr-btns-group fr-btns-group--inline fr-btns-group--icon-left fr-btns-group--between">
<li>
<%= dsfr_main_modal_button(t('authorization_request_forms.form.cancel_next_stage'), cancel_next_authorization_request_stage_path(authorization_request_id: @authorization_request.id), class: %w(fr-btn fr-btn--secondary fr-icon-error-line fr-btn--icon-left fr-mb-0)) %>
</li>
<li class="fr-ml-auto">
<%= f.button t('authorization_request_forms.form.submit'), type: :submit, name: :submit, id: :submit_authorization_request, class: %w(fr-btn fr-icon-checkbox-line fr-btn--icon-left fr-mb-0) %>
</li>
</ul>
</div>
</div>
<% end %>
<% elsif policy(@authorization_request).cancel_next_stage? %>
<% content_for :sticky_bar do %>
<div class="fr-container fr-grid-row">
<div class="fr-col-12">
<ul class="fr-btns-group fr-btns-group--inline fr-btns-group--icon-left fr-btns-group--between">
<li>
<%= dsfr_main_modal_button(t('authorization_request_forms.form.cancel_next_stage'), cancel_next_authorization_request_stage_path(authorization_request_id: @authorization_request.id), class: %w(fr-btn fr-btn--secondary fr-icon-error-line fr-btn--icon-left fr-mb-0)) %>
</li>
</ul>
</div>
</div>
<% end %>
<% elsif policy(@authorization_request).submit? %>
<% content_for :sticky_bar do %>
<div class="fr-container fr-grid-row">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@
</li>
<% end %>

<% if policy([:instruction, @authorization_request]).cancel_next_stage? %>
<li>
<%= dsfr_main_modal_button(t('.cancel_next_stage'), new_instruction_authorization_request_cancel_next_stage_path(@authorization_request), class: %w(fr-translate__language fr-nav__link fr-icon-error-line)) %>
</li>
<% end %>

<% if policy([:instruction, @authorization_request]).transfer? %>
<li>
<%= dsfr_main_modal_button(t('.transfer'), new_instruction_authorization_request_transfer_path(@authorization_request), class: %w(fr-translate__language fr-nav__link fr-icon-arrow-up-down-line)) %>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<div class="simple-page-action-wrapper fr-pt-5w">
<div class="fr-grid-row fr-grid-row--center">
<div class="fr-col-md-offset-1 fr-col-md-10">
<turbo-frame id="main-modal-content">
<div class="fr-modal__content">
<h1 class="fr-modal__title">
<%= t('.title') %>
</h1>
<%= simple_format(t('.description', authorization_request_name: @authorization_request.name)) %>

<p>
<strong><%= t('.confirmation_question') %></strong>
</p>
</div>

<div class="fr-modal__footer">
<div class="fr-btns-group fr-btns-group--right fr-btns-group--inline-reverse fr-btns-group--inline-lg fr-btns-group--icon-left">
<%= link_to t('.back'), '#', class: %w[fr-btn fr-btn--secondary], aria: { controls: 'main-modal' } %>

<%= button_to t('.confirm'), instruction_authorization_request_cancel_next_stage_index_path(@authorization_request), method: :post, class: %w[fr-btn fr-btn--primary fr-icon-error-line fr-btn--icon-left] %>
</div>
</div>
</turbo-frame>
</div>
</div>
</div>
1 change: 1 addition & 0 deletions config/i18n-tasks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ ignore_unused:
- "instruction.{approve,refuse,request_changes_on,revoke}_authorization_requests.create.{reopening_,}success.title"
- "instruction.cancel_authorization_reopenings.create.reopening_success.title"
- "cancel_authorization_reopenings.create.reopening_success.title"
- "instruction.cancel_next_authorization_request_stages.create.success.title"
- "instruction.cancel_authorization_reopenings.create.success.title"
- "cancel_authorization_reopenings.create.success.title"
- "gdpr_contact_mailer.delegue_protection_donnees.subject"
Expand Down
13 changes: 13 additions & 0 deletions config/locales/instruction.fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ fr:
request_changes: Demander des modifications
revoke: Révoquer
cancel_reopening: Annuler la demande de réouverture
cancel_next_stage: Annuler la demande de production
transfer: Transférer
france_connected_authorizations:
index:
Expand Down Expand Up @@ -189,6 +190,18 @@ fr:
success:
title: La réouverture de l'habilitation %{name} a été annulée.

cancel_next_authorization_request_stages:
new:
title: Annulation de la demande de production
description: |
Vous êtes sur le point d'annuler la demande de production « %{authorization_request_name} ». La demande reviendra au statut validé du palier précédent.
confirmation_question: Êtes-vous sûr de vouloir annuler cette demande de production ?
back: Annuler
confirm: Confirmer l'annulation
create:
success:
title: La demande de production %{name} a été annulée.

request_changes_on_authorization_requests:
new:
initial:
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@
resources :request_changes_on_authorization_requests, only: %w[new create], path: 'demande-de-modifications', as: :request_changes
resources :revoke_authorization_requests, only: %w[new create], path: 'révoquer', as: :revocation
resources :cancel_authorization_reopenings, only: %w[new create], path: 'annuler_reouverture', as: :cancel_reopening
resources :cancel_next_authorization_request_stages, only: %w[new create], path: 'annuler_prochaine_etape', as: :cancel_next_stage
resources :transfer_authorization_requests, only: %w[new create], path: 'transferer', as: :transfer

resources :authorization_request_events, only: :index, path: 'historique', as: :events
Expand Down
8 changes: 8 additions & 0 deletions features/habilitation_en_plusieurs_paliers.feature
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ Fonctionnalité: Interactions avec des habilitations en plusieurs paliers (bac
Et il y a un bouton "Démarrer ma demande d’habilitation en production"
Et il y a un badge "Bac à sable"

Scénario: Je peux annuler une demande de production en attente de modification depuis le récapitulatif
Quand j'ai 1 demande d'habilitation "API Impôt Particulier" à l'étape "Production" en attente de modification
Et que je me rends sur cette demande d'habilitation
Alors il y a un bouton "Annuler la demande de production"
Quand je clique sur "Annuler la demande de production"
Et que je clique sur "Confirmer"
Alors il y a un message de succès contenant "Votre demande d'habilitation en production a été annulée"

Scénario: Il y a un badge sandbox lors du démarrage d'une habilitation de bac à sable
Quand je veux remplir une demande pour "API Impôt Particulier" via le formulaire "Demande libre (Bac à sable)" à l'étape "Bac à sable"
Et que je clique sur "Débuter ma demande"
Expand Down
25 changes: 25 additions & 0 deletions features/instructeurs/annuler_une_demande_de_production.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# language: fr

Fonctionnalité: Instruction: annuler une demande de production
Un instructeur peut annuler une demande de production d'un usager

Contexte:
Sachant que je suis un instructeur "API Impôt Particulier"
Et que je suis un instructeur "API Particulier"
Et que je me connecte

Scénario: Je peux annuler une demande de production soumise
Quand il y a 1 demande d'habilitation "API Impôt Particulier" à l'étape "Production" soumise
Et que je me rends sur cette demande d'habilitation
Alors il y a un bouton "Annuler la demande de production"

Scénario: Je ne peux pas annuler une demande qui n'est pas en production
Quand je me rends sur une demande d'habilitation "API Particulier" à modérer
Alors il n'y a pas de bouton "Annuler la demande de production"

Scénario: J'annule une demande de production
Quand il y a 1 demande d'habilitation "API Impôt Particulier" à l'étape "Production" soumise
Et que je me rends sur cette demande d'habilitation
Et que je clique sur "Annuler la demande de production"
Et que je clique sur "Confirmer l'annulation"
Alors je suis sur la page "Liste des demandes et habilitations"