diff --git a/app/controllers/instructeurs/dossiers_controller.rb b/app/controllers/instructeurs/dossiers_controller.rb index 78529a9ba..85bb998bf 100644 --- a/app/controllers/instructeurs/dossiers_controller.rb +++ b/app/controllers/instructeurs/dossiers_controller.rb @@ -97,12 +97,12 @@ module Instructeurs end def archive - dossier.update(archived: true) + dossier.archiver!(current_instructeur) redirect_back(fallback_location: instructeur_procedures_url) end def unarchive - dossier.update(archived: false) + dossier.desarchiver!(current_instructeur) redirect_back(fallback_location: instructeur_procedures_url) end diff --git a/app/graphql/mutations/dossier_archiver.rb b/app/graphql/mutations/dossier_archiver.rb new file mode 100644 index 000000000..aad9e79e0 --- /dev/null +++ b/app/graphql/mutations/dossier_archiver.rb @@ -0,0 +1,25 @@ +module Mutations + class DossierArchiver < Mutations::BaseMutation + description "Archiver le dossier." + + argument :dossier_id, ID, "Dossier ID", required: true, loads: Types::DossierType + argument :instructeur_id, ID, "Instructeur qui prend la décision sur le dossier.", required: true, loads: Types::ProfileType + + field :dossier, Types::DossierType, null: true + field :errors, [Types::ValidationErrorType], null: true + + def resolve(dossier:, instructeur:) + if dossier.termine? + dossier.archiver!(instructeur) + + { dossier: dossier } + else + { errors: ["Un dossier ne peut être archivé qu’une fois le traitement terminé"] } + end + end + + def authorized?(dossier:, instructeur:) + instructeur.is_a?(Instructeur) && instructeur.dossiers.exists?(id: dossier.id) + end + end +end diff --git a/app/graphql/schema.graphql b/app/graphql/schema.graphql index bf39ff900..e8cad479c 100644 --- a/app/graphql/schema.graphql +++ b/app/graphql/schema.graphql @@ -457,6 +457,38 @@ type DossierAccepterPayload { errors: [ValidationError!] } +""" +Autogenerated input type of DossierArchiver +""" +input DossierArchiverInput { + """ + A unique identifier for the client performing the mutation. + """ + clientMutationId: String + + """ + Dossier ID + """ + dossierId: ID! + + """ + Instructeur qui prend la décision sur le dossier. + """ + instructeurId: ID! +} + +""" +Autogenerated return type of DossierArchiver +""" +type DossierArchiverPayload { + """ + A unique identifier for the client performing the mutation. + """ + clientMutationId: String + dossier: Dossier + errors: [ValidationError!] +} + """ Autogenerated input type of DossierChangerGroupeInstructeur """ @@ -925,6 +957,11 @@ type Mutation { """ dossierAccepter(input: DossierAccepterInput!): DossierAccepterPayload + """ + Archiver le dossier. + """ + dossierArchiver(input: DossierArchiverInput!): DossierArchiverPayload + """ Changer le grope instructeur du dossier. """ diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index 1a0e8e32f..1651ed5fd 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -7,6 +7,7 @@ module Types field :dossier_classer_sans_suite, mutation: Mutations::DossierClasserSansSuite field :dossier_refuser, mutation: Mutations::DossierRefuser field :dossier_accepter, mutation: Mutations::DossierAccepter + field :dossier_archiver, mutation: Mutations::DossierArchiver field :dossier_changer_groupe_instructeur, mutation: Mutations::DossierChangerGroupeInstructeur end end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 9fe7a7242..a2c69c6f4 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -416,6 +416,16 @@ class Dossier < ApplicationRecord end end + def archiver!(author) + update!(archived: true) + log_dossier_operation(author, :archiver) + end + + def desarchiver!(author) + update!(archived: false) + log_dossier_operation(author, :desarchiver) + end + def text_summary if brouillon? parts = [ diff --git a/app/models/dossier_operation_log.rb b/app/models/dossier_operation_log.rb index 301dd1b3a..f52254f31 100644 --- a/app/models/dossier_operation_log.rb +++ b/app/models/dossier_operation_log.rb @@ -26,7 +26,9 @@ class DossierOperationLog < ApplicationRecord supprimer: 'supprimer', restaurer: 'restaurer', modifier_annotation: 'modifier_annotation', - demander_un_avis: 'demander_un_avis' + demander_un_avis: 'demander_un_avis', + archiver: 'archiver', + desarchiver: 'desarchiver' } has_one_attached :serialized diff --git a/spec/controllers/api/v2/graphql_controller_spec.rb b/spec/controllers/api/v2/graphql_controller_spec.rb index feaf61eb2..02aa269b5 100644 --- a/spec/controllers/api/v2/graphql_controller_spec.rb +++ b/spec/controllers/api/v2/graphql_controller_spec.rb @@ -885,6 +885,48 @@ describe API::V2::GraphqlController do end end end + + describe 'dossierArchiver' do + let(:query) do + "mutation { + dossierArchiver(input: { + dossierId: \"#{dossier.to_typed_id}\", + instructeurId: \"#{instructeur.to_typed_id}\" + }) { + dossier { + archived + } + errors { + message + } + } + }" + end + + it "validation error" do + expect(gql_errors).to eq(nil) + + expect(gql_data).to eq(dossierArchiver: { + dossier: nil, + errors: [{ message: "Un dossier ne peut être archivé qu’une fois le traitement terminé" }] + }) + end + + context "should archive dossier" do + let(:dossier) { create(:dossier, :sans_suite, :with_individual, procedure: procedure) } + + it "change made" do + expect(gql_errors).to eq(nil) + + expect(gql_data).to eq(dossierArchiver: { + dossier: { + archived: true + }, + errors: nil + }) + end + end + end end end