diff --git a/app/controllers/manager/users_controller.rb b/app/controllers/manager/users_controller.rb index 2586c5a51..fcc19b17b 100644 --- a/app/controllers/manager/users_controller.rb +++ b/app/controllers/manager/users_controller.rb @@ -17,7 +17,12 @@ module Manager else user.dossiers.update_all(user_id: preexisting_user.id) - user.instructeur&.update(user: preexisting_user) + if preexisting_user.instructeur.nil? + user.instructeur&.update(user: preexisting_user) + else + preexisting_user.instructeur.merge(user.instructeur) + end + user.expert&.update(user: preexisting_user) end diff --git a/app/models/administrateurs_instructeur.rb b/app/models/administrateurs_instructeur.rb new file mode 100644 index 000000000..96a9320f7 --- /dev/null +++ b/app/models/administrateurs_instructeur.rb @@ -0,0 +1,13 @@ +# == Schema Information +# +# Table name: administrateurs_instructeurs +# +# created_at :datetime +# updated_at :datetime +# administrateur_id :integer +# instructeur_id :integer +# +class AdministrateursInstructeur < ApplicationRecord + belongs_to :administrateur + belongs_to :instructeur +end diff --git a/app/models/instructeur.rb b/app/models/instructeur.rb index cf2c0fefb..572900f3e 100644 --- a/app/models/instructeur.rb +++ b/app/models/instructeur.rb @@ -10,7 +10,8 @@ # updated_at :datetime # class Instructeur < ApplicationRecord - has_and_belongs_to_many :administrateurs + has_many :administrateurs_instructeurs + has_many :administrateurs, through: :administrateurs_instructeurs has_many :assign_to, dependent: :destroy has_many :groupe_instructeurs, through: :assign_to @@ -19,6 +20,7 @@ class Instructeur < ApplicationRecord has_many :assign_to_with_email_notifications, -> { with_email_notifications }, class_name: 'AssignTo', inverse_of: :instructeur has_many :groupe_instructeur_with_email_notifications, through: :assign_to_with_email_notifications, source: :groupe_instructeur + has_many :commentaires has_many :dossiers, -> { state_not_brouillon }, through: :groupe_instructeurs has_many :follows, -> { active }, inverse_of: :instructeur has_many :previous_follows, -> { inactive }, class_name: 'Follow', inverse_of: :instructeur @@ -249,6 +251,14 @@ class Instructeur < ApplicationRecord Dossier.connection.select_all(sanitized_query).first end + def merge(old_instructeur) + old_instructeur.assign_to.update_all(instructeur_id: id) + old_instructeur.follows.update_all(instructeur_id: id) + old_instructeur.administrateurs_instructeurs.update_all(instructeur_id: id) + old_instructeur.commentaires.update_all(instructeur_id: id) + old_instructeur.bulk_messages.update_all(instructeur_id: id) + end + private def annotations_hash(demande, annotations_privees, avis, messagerie) diff --git a/spec/controllers/manager/users_controller_spec.rb b/spec/controllers/manager/users_controller_spec.rb index 4649b5d99..c078ebc9b 100644 --- a/spec/controllers/manager/users_controller_spec.rb +++ b/spec/controllers/manager/users_controller_spec.rb @@ -69,6 +69,35 @@ describe Manager::UsersController, type: :controller do expect(preexisting_user.instructeur).to match(instructeur) expect(preexisting_user.expert).to match(expert) end + + context 'and the preexisting account owns an instructeur and expert as well' do + let!(:preexisting_instructeur) { create(:instructeur, user: preexisting_user) } + let!(:preexisting_expert) { create(:expert, user: preexisting_user) } + + context 'and the source instructeur has some procedures and dossiers' do + let!(:procedure) { create(:procedure, instructeurs: [instructeur]) } + let(:dossier) { create(:dossier) } + let(:administrateur) { create(:administrateur) } + let!(:commentaire) { create(:commentaire, instructeur: instructeur, dossier: dossier) } + let!(:bulk_message) { BulkMessage.create!(instructeur: instructeur, body: 'body', sent_at: Time.zone.now) } + + before do + user.instructeur.followed_dossiers << dossier + user.instructeur.administrateurs << administrateur + end + + it 'transferts all the stuff' do + subject + preexisting_user.reload + + expect(procedure.instructeurs).to match([preexisting_user.instructeur]) + expect(preexisting_user.instructeur.followed_dossiers).to match([dossier]) + expect(preexisting_user.instructeur.administrateurs).to match([administrateur]) + expect(preexisting_user.instructeur.commentaires).to match([commentaire]) + expect(preexisting_user.instructeur.bulk_messages).to match([bulk_message]) + end + end + end end end end