diff --git a/app/controllers/gestionnaires/dossiers_controller.rb b/app/controllers/gestionnaires/dossiers_controller.rb index 764f24b6c..d58fed8fb 100644 --- a/app/controllers/gestionnaires/dossiers_controller.rb +++ b/app/controllers/gestionnaires/dossiers_controller.rb @@ -3,6 +3,7 @@ module Gestionnaires include ActionView::Helpers::NumberHelper include ActionView::Helpers::TextHelper include CreateAvisConcern + include DossierHelper after_action :mark_demande_as_read, only: :show after_action :mark_messagerie_as_read, only: [:messagerie, :create_commentaire] @@ -91,15 +92,23 @@ module Gestionnaires end def repasser_en_construction - dossier.repasser_en_construction!(current_gestionnaire) - flash.notice = 'Dossier repassé en construction.' + if dossier.en_construction? + flash.notice = 'Le dossier est déjà en construction.' + else + dossier.repasser_en_construction!(current_gestionnaire) + flash.notice = 'Dossier repassé en construction.' + end render partial: 'state_button_refresh', locals: { dossier: dossier } end def repasser_en_instruction - flash.notice = "Le dossier #{dossier.id} a été repassé en instruction." - dossier.repasser_en_instruction!(current_gestionnaire) + if dossier.en_instruction? + flash.notice = 'Le dossier est déjà en instruction.' + else + flash.notice = "Le dossier #{dossier.id} a été repassé en instruction." + dossier.repasser_en_instruction!(current_gestionnaire) + end render partial: 'state_button_refresh', locals: { dossier: dossier } end @@ -108,16 +117,20 @@ module Gestionnaires motivation = params[:dossier] && params[:dossier][:motivation] justificatif = params[:dossier] && params[:dossier][:justificatif_motivation] - case params[:process_action] - when "refuser" - dossier.refuser!(current_gestionnaire, motivation, justificatif) - flash.notice = "Dossier considéré comme refusé." - when "classer_sans_suite" - dossier.classer_sans_suite!(current_gestionnaire, motivation, justificatif) - flash.notice = "Dossier considéré comme sans suite." - when "accepter" - dossier.accepter!(current_gestionnaire, motivation, justificatif) - flash.notice = "Dossier traité avec succès." + if dossier.termine? + flash.notice = "Le dossier est déjà #{dossier_display_state(dossier, lower: true)}" + else + case params[:process_action] + when "refuser" + dossier.refuser!(current_gestionnaire, motivation, justificatif) + flash.notice = "Dossier considéré comme refusé." + when "classer_sans_suite" + dossier.classer_sans_suite!(current_gestionnaire, motivation, justificatif) + flash.notice = "Dossier considéré comme sans suite." + when "accepter" + dossier.accepter!(current_gestionnaire, motivation, justificatif) + flash.notice = "Dossier traité avec succès." + end end render partial: 'state_button_refresh', locals: { dossier: dossier } diff --git a/spec/controllers/gestionnaires/dossiers_controller_spec.rb b/spec/controllers/gestionnaires/dossiers_controller_spec.rb index 532913960..cbf5b775a 100644 --- a/spec/controllers/gestionnaires/dossiers_controller_spec.rb +++ b/spec/controllers/gestionnaires/dossiers_controller_spec.rb @@ -128,21 +128,51 @@ describe Gestionnaires::DossiersController, type: :controller do end describe '#repasser_en_construction' do + let(:dossier) { create(:dossier, :en_instruction, procedure: procedure) } + before do - dossier.en_instruction! sign_in gestionnaire + post :repasser_en_construction, + params: { procedure_id: procedure.id, dossier_id: dossier.id }, + format: 'js' end - subject { post :repasser_en_construction, params: { procedure_id: procedure.id, dossier_id: dossier.id }, format: 'js' } + it { expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_construction)) } + it { expect(response).to have_http_status(:ok) } + it { expect(response.body).to include('.state-button') } - it 'change state to en_construction' do - subject + context 'when the dossier has already been put en_construction' do + let(:dossier) { create(:dossier, :en_construction, procedure: procedure) } - dossier.reload - expect(dossier.state).to eq(Dossier.states.fetch(:en_construction)) + it 'warns about the error, but doesn’t raise' do + expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_construction)) + expect(response).to have_http_status(:ok) + end + end + end + + describe '#repasser_en_instruction' do + let(:dossier) { create(:dossier, :refuse, procedure: procedure) } + + before do + sign_in gestionnaire + post :repasser_en_instruction, + params: { procedure_id: procedure.id, dossier_id: dossier.id }, + format: 'js' end - it { expect(subject.body).to include('.state-button') } + it { expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_instruction)) } + it { expect(response).to have_http_status(:ok) } + it { expect(response.body).to include('.state-button') } + + context 'when the dossier has already been put en_instruction' do + let(:dossier) { create(:dossier, :en_instruction, procedure: procedure) } + + it 'warns about the error, but doesn’t raise' do + expect(dossier.reload.state).to eq(Dossier.states.fetch(:en_instruction)) + expect(response).to have_http_status(:ok) + end + end end describe '#terminer' do @@ -319,6 +349,21 @@ describe Gestionnaires::DossiersController, type: :controller do it { expect(subject.body).to include('.state-button') } end end + + context 'when a dossier is already closed' do + let(:dossier) { create(:dossier, :accepte, procedure: procedure) } + + before { allow(dossier).to receive(:accepter!) } + + subject { post :terminer, params: { process_action: "accepter", procedure_id: procedure.id, dossier_id: dossier.id, dossier: { justificatif_motivation: fake_justificatif } }, format: 'js' } + + it 'does not close it again' do + subject + + expect(dossier).not_to have_received(:accepter!) + expect(response).to have_http_status(:ok) + end + end end describe "#create_commentaire" do