diff --git a/app/controllers/manager/dossiers_controller.rb b/app/controllers/manager/dossiers_controller.rb index 143dbf048..ebf98f7d1 100644 --- a/app/controllers/manager/dossiers_controller.rb +++ b/app/controllers/manager/dossiers_controller.rb @@ -30,6 +30,15 @@ module Manager redirect_to manager_dossier_path(dossier) end + def restore + dossier = Dossier.with_discarded.find(params[:id]) + dossier.restore(current_administration) + + flash[:notice] = "Le dossier #{dossier.id} a été restauré." + + redirect_to manager_dossier_path(dossier) + end + def repasser_en_instruction dossier = Dossier.find(params[:id]) dossier.repasser_en_instruction(current_administration) diff --git a/app/controllers/manager/procedures_controller.rb b/app/controllers/manager/procedures_controller.rb index 810d0a1a9..a6c45dbd9 100644 --- a/app/controllers/manager/procedures_controller.rb +++ b/app/controllers/manager/procedures_controller.rb @@ -31,6 +31,14 @@ module Manager redirect_to manager_procedure_path(procedure) end + def restore + procedure.restore(current_administration) + + flash[:notice] = "La démarche #{procedure.id} a été restauré." + + redirect_to manager_procedure_path(procedure) + end + def add_administrateur administrateur = Administrateur.by_email(params[:email]) if administrateur diff --git a/app/models/deleted_dossier.rb b/app/models/deleted_dossier.rb index 0a0ebc9a8..6a7845b08 100644 --- a/app/models/deleted_dossier.rb +++ b/app/models/deleted_dossier.rb @@ -20,4 +20,8 @@ class DeletedDossier < ApplicationRecord deleted_at: Time.zone.now ) end + + def procedure_removed? + reason == self.class.reasons.fetch(:procedure_removed) + end end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 544acfd20..ad2f8487b 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -487,6 +487,19 @@ class Dossier < ApplicationRecord discard! end + def restore(author, only_discarded_with_procedure = false) + if discarded? + deleted_dossier = DeletedDossier.find_by(dossier_id: id) + + if !only_discarded_with_procedure || deleted_dossier&.procedure_removed? + if undiscard && keep_track_on_deletion? && en_construction? + deleted_dossier&.destroy + log_dossier_operation(author, :restaurer, self) + end + end + end + end + def after_passer_en_instruction(instructeur) instructeur.follow(self) diff --git a/app/models/dossier_operation_log.rb b/app/models/dossier_operation_log.rb index f1cd8ce1e..924fbb962 100644 --- a/app/models/dossier_operation_log.rb +++ b/app/models/dossier_operation_log.rb @@ -8,6 +8,7 @@ class DossierOperationLog < ApplicationRecord refuser: 'refuser', classer_sans_suite: 'classer_sans_suite', supprimer: 'supprimer', + restaurer: 'restaurer', modifier_annotation: 'modifier_annotation', demander_un_avis: 'demander_un_avis' } diff --git a/app/models/procedure.rb b/app/models/procedure.rb index b212b7ca9..32e6067f9 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -523,6 +523,14 @@ class Procedure < ApplicationRecord discard! end + def restore(author) + if discarded? && undiscard + dossiers.with_discarded.discarded.find_each do |dossier| + dossier.restore(author, true) + end + end + end + def flipper_id "Procedure;#{id}" end diff --git a/app/views/manager/dossiers/show.html.erb b/app/views/manager/dossiers/show.html.erb index 140497f4c..12b1415cc 100644 --- a/app/views/manager/dossiers/show.html.erb +++ b/app/views/manager/dossiers/show.html.erb @@ -33,6 +33,8 @@ as well as a link to its edit page. <% end %> <% if dossier.can_be_deleted_by_manager? %> <%= link_to 'Supprimer le dossier', discard_manager_dossier_path(dossier), method: :post, class: 'button', data: { confirm: "Confirmez vous la suppression du dossier ?" } %> + <% elsif dossier.discarded? && !dossier.procedure.discarded? %> + <%= link_to 'Restaurer le dossier', restore_manager_dossier_path(dossier), method: :post, class: 'button', data: { confirm: "Confirmez vous la restauration du dossier ?" } %> <% end %> diff --git a/app/views/manager/procedures/show.html.erb b/app/views/manager/procedures/show.html.erb index ede594883..faa058874 100644 --- a/app/views/manager/procedures/show.html.erb +++ b/app/views/manager/procedures/show.html.erb @@ -44,6 +44,8 @@ as well as a link to its edit page. <% if procedure.can_be_deleted_by_manager? %> <%= link_to 'Supprimer la démarche', discard_manager_procedure_path(procedure), method: :post, class: 'button', data: { confirm: "Confirmez-vous la suppression de la démarche ?" } %> + <% elsif procedure.discarded? %> + <%= link_to 'Restaurer la démarche', restore_manager_procedure_path(procedure), method: :post, class: 'button', data: { confirm: "Confirmez-vous la restauration de la démarche ?" } %> <% end %>
diff --git a/config/routes.rb b/config/routes.rb index 3e5412e6c..273880d2f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,12 +10,14 @@ Rails.application.routes.draw do post 'whitelist', on: :member post 'draft', on: :member post 'discard', on: :member + post 'restore', on: :member post 'add_administrateur', on: :member post 'change_piece_justificative_template', on: :member end resources :dossiers, only: [:index, :show] do post 'discard', on: :member + post 'restore', on: :member post 'repasser_en_instruction', on: :member end diff --git a/spec/controllers/manager/dossiers_controller_spec.rb b/spec/controllers/manager/dossiers_controller_spec.rb index c64100a22..3b1969fc5 100644 --- a/spec/controllers/manager/dossiers_controller_spec.rb +++ b/spec/controllers/manager/dossiers_controller_spec.rb @@ -1,23 +1,43 @@ describe Manager::DossiersController, type: :controller do + let(:administration) { create :administration } + let(:deleted_dossier) { DeletedDossier.find_by(dossier_id: dossier) } + let(:operations) { dossier.dossier_operation_logs.map(&:operation).map(&:to_sym) } + + before { sign_in administration } + describe '#discard' do - let(:administration) { create :administration } - let(:dossier) { create(:dossier) } + let(:dossier) { create(:dossier, :en_construction) } before do - sign_in administration post :discard, params: { id: dossier.id } dossier.reload end it { expect(dossier.discarded?).to be_truthy } + it { expect(deleted_dossier).not_to be_nil } + it { expect(deleted_dossier.reason).to eq("manager_request") } + it { expect(operations).to eq([:supprimer]) } + end + + describe '#restore' do + let(:dossier) { create(:dossier, :en_construction) } + + before do + dossier.discard_and_keep_track!(administration, :manager_request) + + post :restore, params: { id: dossier.id } + dossier.reload + end + + it { expect(dossier.kept?).to be_truthy } + it { expect(deleted_dossier).to be_nil } + it { expect(operations).to eq([:supprimer, :restaurer]) } end describe '#repasser_en_instruction' do - let(:administration) { create :administration } let(:dossier) { create(:dossier, :accepte) } before do - sign_in administration post :repasser_en_instruction, params: { id: dossier.id } dossier.reload end diff --git a/spec/controllers/manager/procedures_controller_spec.rb b/spec/controllers/manager/procedures_controller_spec.rb index 0e98c2660..b8bebd461 100644 --- a/spec/controllers/manager/procedures_controller_spec.rb +++ b/spec/controllers/manager/procedures_controller_spec.rb @@ -1,25 +1,25 @@ describe Manager::ProceduresController, type: :controller do + let(:administration) { create :administration } + + before { sign_in administration } + describe '#whitelist' do - let(:administration) { create :administration } let(:procedure) { create(:procedure) } before do - sign_in administration post :whitelist, params: { id: procedure.id } procedure.reload end - it { expect(procedure.whitelisted_at).not_to be_nil } + it { expect(procedure.whitelisted?).to be_truthy } end describe '#show' do render_views - let(:administration) { create(:administration) } let(:procedure) { create(:procedure, :with_repetition) } before do - sign_in(administration) get :show, params: { id: procedure.id } end @@ -27,27 +27,50 @@ describe Manager::ProceduresController, type: :controller do end describe '#discard' do - let(:administration) { create :administration } - let(:procedure) { create(:procedure) } + let(:dossier) { create(:dossier, :en_construction) } + let(:procedure) { dossier.procedure } + let(:deleted_dossier) { DeletedDossier.find_by(dossier_id: dossier.id) } + let(:operations) { dossier.dossier_operation_logs.map(&:operation).map(&:to_sym) } before do - sign_in administration post :discard, params: { id: procedure.id } procedure.reload + dossier.reload end it { expect(procedure.discarded?).to be_truthy } + it { expect(dossier.discarded?).to be_truthy } + it { expect(deleted_dossier).not_to be_nil } + it { expect(deleted_dossier.reason).to eq("procedure_removed") } + it { expect(operations).to eq([:supprimer]) } + end + + describe '#restore' do + let(:dossier) { create(:dossier, :en_construction) } + let(:procedure) { dossier.procedure } + let(:deleted_dossier) { DeletedDossier.find_by(dossier_id: dossier.id) } + let(:operations) { dossier.dossier_operation_logs.map(&:operation).map(&:to_sym) } + + before do + procedure.discard_and_keep_track!(administration) + + post :restore, params: { id: procedure.id } + procedure.reload + end + + it { expect(procedure.kept?).to be_truthy } + it { expect(dossier.kept?).to be_truthy } + it { expect(deleted_dossier).to be_nil } + it { expect(operations).to eq([:supprimer, :restaurer]) } end describe '#index' do render_views - let(:administration) { create(:administration) } - let!(:dossier) { create(:dossier) } - context 'sort by dossiers' do + let!(:dossier) { create(:dossier) } + before do - sign_in(administration) get :index, params: { procedure: { direction: 'asc', order: 'dossiers' } } end