remove admin from manager
This commit is contained in:
parent
870efba29b
commit
0b7d4452fd
6 changed files with 164 additions and 6 deletions
|
@ -22,10 +22,15 @@ module Manager
|
|||
def delete
|
||||
administrateur = Administrateur.find(params[:id])
|
||||
|
||||
administrateur.delete_and_transfer_services
|
||||
result = AdministrateurDeletionService.new(current_super_admin, administrateur).call
|
||||
|
||||
logger.info("L'administrateur #{administrateur.id} est supprimé par #{current_super_admin.id}")
|
||||
flash[:notice] = "L'administrateur #{administrateur.id} est supprimé"
|
||||
case result
|
||||
in Dry::Monads::Result::Success
|
||||
logger.info("L'administrateur #{administrateur.id} est supprimé par #{current_super_admin.id}")
|
||||
flash[:notice] = "L'administrateur #{administrateur.id} est supprimé"
|
||||
in Dry::Monads::Result::Failure(reason)
|
||||
flash[:alert] = I18n.t(reason, scope: "manager.administrateurs.delete")
|
||||
end
|
||||
|
||||
redirect_to manager_administrateurs_path
|
||||
end
|
||||
|
|
|
@ -70,7 +70,7 @@ class Administrateur < ApplicationRecord
|
|||
end
|
||||
|
||||
def can_be_deleted?
|
||||
procedures.all? { |p| p.administrateurs.count > 1 }
|
||||
procedures.all? { |p| p.administrateurs.count > 1 || p.dossiers.empty? }
|
||||
end
|
||||
|
||||
def delete_and_transfer_services
|
||||
|
|
65
app/services/administrateur_deletion_service.rb
Normal file
65
app/services/administrateur_deletion_service.rb
Normal file
|
@ -0,0 +1,65 @@
|
|||
class AdministrateurDeletionService
|
||||
include Dry::Monads[:result]
|
||||
|
||||
attr_reader :super_admin, :admin, :owned_procedures, :shared_procedures
|
||||
|
||||
def initialize(super_admin, admin)
|
||||
@super_admin = super_admin
|
||||
@admin = admin
|
||||
@owned_procedures, @shared_procedures = admin
|
||||
.procedures
|
||||
.with_discarded
|
||||
.partition { _1.administrateurs.one? }
|
||||
end
|
||||
|
||||
def call
|
||||
return Failure(:cannot_be_deleted) unless admin.can_be_deleted?
|
||||
|
||||
result = nil
|
||||
|
||||
ApplicationRecord.transaction do
|
||||
delete_admin_from_shared_procedures
|
||||
delete_procedures_without_dossier
|
||||
|
||||
if admin.procedures.with_discarded.count.positive?
|
||||
result = Failure(:still_procedures)
|
||||
raise ActiveRecord::Rollback
|
||||
end
|
||||
|
||||
delete_services_without_procedures
|
||||
transfer_services
|
||||
if admin.services.count.positive?
|
||||
result = Failure(:still_services)
|
||||
raise ActiveRecord::Rollback
|
||||
end
|
||||
|
||||
admin.destroy!
|
||||
result = Success(:ok)
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def delete_admin_from_shared_procedures
|
||||
@shared_procedures.each { _1.administrateurs.delete(admin) }
|
||||
end
|
||||
|
||||
def delete_procedures_without_dossier
|
||||
procedures_without_dossier = owned_procedures.filter { _1.dossiers.empty? }
|
||||
procedures_without_dossier.each { _1.discard_and_keep_track!(super_admin) }
|
||||
procedures_without_dossier.each(&:purge_discarded)
|
||||
end
|
||||
|
||||
def delete_services_without_procedures
|
||||
admin.services.filter { _1.procedures.with_discarded.count.zero? }.each(&:destroy)
|
||||
end
|
||||
|
||||
def transfer_services
|
||||
shared_procedures.each do |procedure|
|
||||
next if procedure.service.nil?
|
||||
next_admin = procedure.administrateurs.where.not(id: admin.id).first
|
||||
procedure.service.update(administrateur: next_admin)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue