Merge pull request #4022 from betagouv/fix_3683_redo_refused_dossier

Fix 3683 redo refused dossier
This commit is contained in:
LeSim 2019-07-02 19:41:00 +02:00 committed by GitHub
commit 87cf862e10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 59 additions and 18 deletions

View file

@ -183,7 +183,7 @@
color: $black; color: $black;
padding: $default-padding; padding: $default-padding;
h4 { .title {
font-size: 24px; font-size: 24px;
} }
@ -266,6 +266,10 @@
color: $black; color: $black;
margin-bottom: $default-spacer; margin-bottom: $default-spacer;
} }
&.with-top-border {
border-top: 1px solid $grey;
}
} }
.dropdown-form { .dropdown-form {

View file

@ -93,6 +93,13 @@ module Gestionnaires
render partial: 'state_button_refresh', locals: { dossier: dossier } render partial: 'state_button_refresh', locals: { dossier: dossier }
end end
def repasser_en_instruction
flash.notice = "Le dossier #{dossier.id} a été repassé en instruction."
dossier.repasser_en_instruction!(current_gestionnaire)
render partial: 'state_button_refresh', locals: { dossier: dossier }
end
def terminer def terminer
motivation = params[:dossier] && params[:dossier][:motivation] motivation = params[:dossier] && params[:dossier][:motivation]
justificatif = params[:dossier] && params[:dossier][:justificatif_motivation] justificatif = params[:dossier] && params[:dossier][:justificatif_motivation]

View file

@ -20,16 +20,6 @@ module Manager
# Custom actions # Custom actions
# #
def change_state_to_instruction
dossier = Dossier.find(params[:id])
dossier.update(state: Dossier.states.fetch(:en_instruction), processed_at: nil, motivation: nil)
dossier.attestation&.destroy
logger.info("Le dossier #{dossier.id} est repassé en instruction par #{current_administration.email}")
flash[:notice] = "Le dossier #{dossier.id} est repassé en instruction"
DossierMailer.notify_revert_to_instruction(dossier).deliver_later
redirect_to manager_dossier_path(dossier)
end
def hide def hide
dossier = Dossier.find(params[:id]) dossier = Dossier.find(params[:id])
deleted_dossier = dossier.hide!(current_administration) deleted_dossier = dossier.hide!(current_administration)

View file

@ -5,7 +5,7 @@ module DossierHelper
elsif dossier.sans_suite? elsif dossier.sans_suite?
'without-continuation' 'without-continuation'
elsif dossier.refuse? elsif dossier.refuse?
'refuse' 'refused'
end end
end end

View file

@ -302,6 +302,14 @@ class Dossier < ApplicationRecord
log_dossier_operation(gestionnaire, :repasser_en_construction) log_dossier_operation(gestionnaire, :repasser_en_construction)
end end
def repasser_en_instruction!(gestionnaire)
update(state: Dossier.states.fetch(:en_instruction), processed_at: nil, motivation: nil)
attestation&.destroy
DossierMailer.notify_revert_to_instruction(self).deliver_later
log_dossier_operation(gestionnaire, :repasser_en_instruction)
end
def accepter!(gestionnaire, motivation, justificatif = nil) def accepter!(gestionnaire, motivation, justificatif = nil)
self.motivation = motivation self.motivation = motivation
self.en_instruction_at ||= Time.zone.now self.en_instruction_at ||= Time.zone.now

View file

@ -2,6 +2,7 @@ class DossierOperationLog < ApplicationRecord
enum operation: { enum operation: {
passer_en_instruction: 'passer_en_instruction', passer_en_instruction: 'passer_en_instruction',
repasser_en_construction: 'repasser_en_construction', repasser_en_construction: 'repasser_en_construction',
repasser_en_instruction: 'repasser_en_instruction',
accepter: 'accepter', accepter: 'accepter',
refuser: 'refuser', refuser: 'refuser',
classer_sans_suite: 'classer_sans_suite', classer_sans_suite: 'classer_sans_suite',

View file

@ -58,14 +58,24 @@
= dossier_display_state(dossier, lower: true) = dossier_display_state(dossier, lower: true)
.dropdown-content.fade-in-down.terminated .dropdown-content.fade-in-down.terminated
- if dossier.motivation.present? - if dossier.motivation.present?
%h4 Motivation %h4.title Motivation
%p.dossier-motivation= dossier.motivation %p.dossier-motivation= dossier.motivation
= render partial: 'users/dossiers/show/download_justificatif', locals: { dossier: dossier } = render partial: 'users/dossiers/show/download_justificatif', locals: { dossier: dossier }
- if dossier.attestation.present? - if dossier.attestation.present?
%h4 Attestation %h4.title Attestation
%p.attestation L'acceptation du dossier a envoyé automatiquement une attestation au demandeur %p.attestation L'acceptation du dossier a envoyé automatiquement une attestation au demandeur
= link_to "Voir l'attestation", attestation_gestionnaire_dossier_path(dossier.procedure, dossier), target: '_blank', rel: 'noopener', class: 'button' = link_to "Voir l'attestation", attestation_gestionnaire_dossier_path(dossier.procedure, dossier), target: '_blank', rel: 'noopener', class: 'button'
- if dossier.refuse? || dossier.sans_suite?
%ul.dropdown-items.with-top-border
%li
= link_to repasser_en_instruction_gestionnaire_dossier_path(dossier.procedure, dossier), method: :post, data: { remote:true, confirm: "Voulez vous remettre le dossier #{dossier.id} en instruction ?" } do
%span.icon.in-progress
.dropdown-description
%h4 Repasser en instruction
Lusager sera notifié que son dossier est réexaminé.
- else - else
%span.label{ class: button_or_label_class(dossier) } %span.label{ class: button_or_label_class(dossier) }
= dossier_display_state(dossier, lower: true) = dossier_display_state(dossier, lower: true)

View file

@ -28,9 +28,6 @@ as well as a link to its edit page.
</h1> </h1>
<div> <div>
<% if dossier.termine? %>
<%= link_to 'Repasser en instruction', change_state_to_instruction_manager_dossier_path(dossier), method: :post, class: 'button', data: { confirm: "Repasser en instruction ?" } %>
<% end %>
<% if dossier.hidden_at.nil? %> <% if dossier.hidden_at.nil? %>
<%= link_to 'Supprimer le dossier', hide_manager_dossier_path(dossier), method: :post, class: 'button', data: { confirm: "Confirmez vous la suppression du dossier ?" } %> <%= link_to 'Supprimer le dossier', hide_manager_dossier_path(dossier), method: :post, class: 'button', data: { confirm: "Confirmez vous la suppression du dossier ?" } %>
<% end %> <% end %>

View file

@ -15,7 +15,6 @@ Rails.application.routes.draw do
end end
resources :dossiers, only: [:index, :show] do resources :dossiers, only: [:index, :show] do
post 'change_state_to_instruction', on: :member
post 'hide', on: :member post 'hide', on: :member
end end
@ -325,6 +324,7 @@ Rails.application.routes.draw do
post 'commentaire' => 'dossiers#create_commentaire' post 'commentaire' => 'dossiers#create_commentaire'
post 'passer-en-instruction' => 'dossiers#passer_en_instruction' post 'passer-en-instruction' => 'dossiers#passer_en_instruction'
post 'repasser-en-construction' => 'dossiers#repasser_en_construction' post 'repasser-en-construction' => 'dossiers#repasser_en_construction'
post 'repasser-en-instruction' => 'dossiers#repasser_en_instruction'
post 'terminer' post 'terminer'
post 'send-to-instructeurs' => 'dossiers#send_to_instructeurs' post 'send-to-instructeurs' => 'dossiers#send_to_instructeurs'
post 'avis' => 'dossiers#create_avis' post 'avis' => 'dossiers#create_avis'

View file

@ -987,4 +987,28 @@ describe Dossier do
it { expect(last_operation.operation).to eq('supprimer') } it { expect(last_operation.operation).to eq('supprimer') }
it { expect(last_operation.automatic_operation?).to be_falsey } it { expect(last_operation.automatic_operation?).to be_falsey }
end end
describe '#repasser_en_instruction!' do
let(:dossier) { create(:dossier, :refuse, :with_attestation) }
let!(:gestionnaire) { create(:gestionnaire) }
let(:last_operation) { dossier.dossier_operation_logs.last }
before do
Timecop.freeze
allow(DossierMailer).to receive(:notify_revert_to_instruction)
.and_return(double(deliver_later: true))
dossier.repasser_en_instruction!(gestionnaire)
dossier.reload
end
it { expect(dossier.state).to eq('en_instruction') }
it { expect(dossier.processed_at).to be_nil }
it { expect(dossier.motivation).to be_nil }
it { expect(dossier.attestation).to be_nil }
it { expect(last_operation.operation).to eq('repasser_en_instruction') }
it { expect(JSON.parse(last_operation.serialized.download)['author']['email']).to eq(gestionnaire.email) }
it { expect(DossierMailer).to have_received(:notify_revert_to_instruction).with(dossier) }
after { Timecop.return }
end
end end