2023-09-04 12:07:04 +02:00
|
|
|
|
class GroupeGestionnaire < ApplicationRecord
|
|
|
|
|
has_many :administrateurs
|
|
|
|
|
has_and_belongs_to_many :gestionnaires
|
|
|
|
|
|
2023-10-01 12:52:05 +02:00
|
|
|
|
has_ancestry
|
2023-08-29 19:08:27 +02:00
|
|
|
|
|
2023-10-06 17:12:00 +02:00
|
|
|
|
def add_gestionnaire(gestionnaire)
|
2023-08-29 19:08:27 +02:00
|
|
|
|
return if gestionnaire.nil?
|
|
|
|
|
return if in?(gestionnaire.groupe_gestionnaires)
|
|
|
|
|
|
2023-09-04 12:07:04 +02:00
|
|
|
|
gestionnaires << gestionnaire
|
|
|
|
|
end
|
|
|
|
|
|
2023-10-06 17:12:00 +02:00
|
|
|
|
def remove_gestionnaire(gestionnaire_id, current_user)
|
2023-10-01 12:52:05 +02:00
|
|
|
|
if !self.is_root? || self.gestionnaires.one?
|
2023-09-28 17:45:39 +02:00
|
|
|
|
alert = "Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine"
|
|
|
|
|
else
|
|
|
|
|
gestionnaire = Gestionnaire.find(gestionnaire_id)
|
2023-08-29 19:08:27 +02:00
|
|
|
|
|
2023-10-06 17:12:00 +02:00
|
|
|
|
if !in?(gestionnaire.groupe_gestionnaires) || !gestionnaire.groupe_gestionnaires.destroy(self)
|
|
|
|
|
alert = "Le gestionnaire « #{gestionnaire.email} » n’est pas dans le groupe gestionnaire."
|
2023-09-28 17:45:39 +02:00
|
|
|
|
else
|
2023-09-30 12:45:54 +02:00
|
|
|
|
if gestionnaire.groupe_gestionnaires.empty?
|
|
|
|
|
gestionnaire.destroy
|
|
|
|
|
end
|
2023-10-06 17:12:00 +02:00
|
|
|
|
notice = "Le gestionnaire « #{gestionnaire.email} » a été retiré du groupe gestionnaire."
|
2023-09-28 17:45:39 +02:00
|
|
|
|
GroupeGestionnaireMailer
|
2023-10-06 17:12:00 +02:00
|
|
|
|
.notify_removed_gestionnaire(self, gestionnaire.email, current_user.email)
|
2023-09-28 17:45:39 +02:00
|
|
|
|
.deliver_later
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
[gestionnaire, alert, notice]
|
2023-08-29 19:08:27 +02:00
|
|
|
|
end
|
|
|
|
|
|
2023-09-28 17:45:39 +02:00
|
|
|
|
def add_gestionnaires(ids: [], emails: [], current_user: nil)
|
|
|
|
|
emails = emails.to_json
|
|
|
|
|
emails = JSON.parse(emails).map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1) }
|
|
|
|
|
|
2023-09-04 12:07:04 +02:00
|
|
|
|
gestionnaires_to_add, valid_emails, invalid_emails = Gestionnaire.find_all_by_identifier_with_emails(ids:, emails:)
|
|
|
|
|
not_found_emails = valid_emails - gestionnaires_to_add.map(&:email)
|
|
|
|
|
|
|
|
|
|
# Send invitations to users without account
|
|
|
|
|
if not_found_emails.present?
|
|
|
|
|
gestionnaires_to_add += not_found_emails.map do |email|
|
|
|
|
|
user = User.create_or_promote_to_gestionnaire(email, SecureRandom.hex)
|
|
|
|
|
user.invite_gestionnaire!(self)
|
|
|
|
|
user.gestionnaire
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# We dont't want to assign a user to an groupe_gestionnaire if they are already assigned to it
|
2023-09-28 17:45:39 +02:00
|
|
|
|
gestionnaires_duplicate = gestionnaires_to_add & gestionnaires
|
2023-09-04 12:07:04 +02:00
|
|
|
|
gestionnaires_to_add -= gestionnaires
|
2023-10-06 17:12:00 +02:00
|
|
|
|
gestionnaires_to_add.each { add_gestionnaire(_1) }
|
2023-09-04 12:07:04 +02:00
|
|
|
|
|
2023-09-28 17:45:39 +02:00
|
|
|
|
if invalid_emails.present?
|
|
|
|
|
alert = I18n.t('activerecord.wrong_address',
|
|
|
|
|
count: invalid_emails.size,
|
|
|
|
|
emails: invalid_emails)
|
|
|
|
|
end
|
|
|
|
|
if gestionnaires_duplicate.present?
|
|
|
|
|
alert = I18n.t('activerecord.errors.duplicate_email',
|
|
|
|
|
count: invalid_emails.size,
|
2023-10-04 19:40:34 +02:00
|
|
|
|
emails: gestionnaires_duplicate.map(&:email))
|
2023-09-28 17:45:39 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if gestionnaires_to_add.present?
|
2023-10-01 12:52:05 +02:00
|
|
|
|
notice = "Les gestionnaires ont bien été affectés au groupe gestionnaire"
|
2023-09-28 17:45:39 +02:00
|
|
|
|
|
|
|
|
|
GroupeGestionnaireMailer
|
|
|
|
|
.notify_added_gestionnaires(self, gestionnaires_to_add, current_user.email)
|
|
|
|
|
.deliver_later
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
[gestionnaires_to_add, alert, notice]
|
2023-09-04 12:07:04 +02:00
|
|
|
|
end
|
2023-09-30 12:45:54 +02:00
|
|
|
|
|
2023-10-06 17:12:00 +02:00
|
|
|
|
def add_administrateur(administrateur)
|
|
|
|
|
return if administrateur.nil?
|
|
|
|
|
return if id == administrateur.groupe_gestionnaire_id
|
|
|
|
|
|
|
|
|
|
administrateurs << administrateur
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def remove_administrateur(administrateur_id, current_user)
|
|
|
|
|
administrateur = Administrateur.find(administrateur_id)
|
|
|
|
|
|
|
|
|
|
if id != administrateur.groupe_gestionnaire_id
|
|
|
|
|
alert = "L'administrateur « #{administrateur.email} » n’est pas dans le groupe gestionnaire."
|
|
|
|
|
else
|
|
|
|
|
administrateur.destroy
|
|
|
|
|
notice = "L'administrateur « #{administrateur.email} » a été retiré du groupe gestionnaire."
|
|
|
|
|
GroupeGestionnaireMailer
|
|
|
|
|
.notify_removed_administrateur(self, administrateur.email, current_user.email)
|
|
|
|
|
.deliver_later
|
|
|
|
|
end
|
|
|
|
|
[administrateur, alert, notice]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def add_administrateurs(ids: [], emails: [], current_user: nil)
|
|
|
|
|
emails = emails.to_json
|
|
|
|
|
emails = JSON.parse(emails).map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1) }
|
|
|
|
|
|
|
|
|
|
administrateurs_to_add, valid_emails, invalid_emails = Administrateur.find_all_by_identifier_with_emails(ids:, emails:)
|
|
|
|
|
not_found_emails = valid_emails - administrateurs_to_add.map(&:email)
|
|
|
|
|
|
|
|
|
|
# Send invitations to users without account
|
|
|
|
|
if not_found_emails.present?
|
|
|
|
|
administrateurs_to_add += not_found_emails.map do |email|
|
|
|
|
|
user = User.create_or_promote_to_administrateur(email, SecureRandom.hex)
|
|
|
|
|
user.invite_administrateur!(self)
|
|
|
|
|
user.administrateur
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
administrateurs_already_in_groupe_gestionnaire = []
|
|
|
|
|
# We dont't want to assign a user to an groupe_gestionnaire if they are already assigned to it
|
|
|
|
|
administrateurs_duplicate = administrateurs_to_add & administrateurs
|
|
|
|
|
administrateurs_to_add -= administrateurs
|
|
|
|
|
administrateurs_to_add.each do |administrateur|
|
|
|
|
|
if !current_user.is_a?(SuperAdmin) && administrateur.groupe_gestionnaire_id && ((administrateur.groupe_gestionnaire.ancestor_ids + [administrateur.groupe_gestionnaire_id]) & current_user.groupe_gestionnaire_ids).empty?
|
|
|
|
|
administrateurs_already_in_groupe_gestionnaire << administrateur
|
|
|
|
|
next
|
|
|
|
|
end
|
|
|
|
|
add_administrateur(administrateur)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if administrateurs_already_in_groupe_gestionnaire.present?
|
|
|
|
|
alert = I18n.t('activerecord.errors.administrateurs_already_in_groupe_gestionnaire',
|
|
|
|
|
count: administrateurs_already_in_groupe_gestionnaire.size,
|
|
|
|
|
emails: administrateurs_already_in_groupe_gestionnaire)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if invalid_emails.present?
|
|
|
|
|
alert = I18n.t('activerecord.wrong_address',
|
|
|
|
|
count: invalid_emails.size,
|
|
|
|
|
emails: invalid_emails)
|
|
|
|
|
end
|
|
|
|
|
if administrateurs_duplicate.present?
|
|
|
|
|
alert = I18n.t('activerecord.errors.duplicate_email',
|
|
|
|
|
count: invalid_emails.size,
|
|
|
|
|
emails: administrateurs_duplicate.map(&:email))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if administrateurs_to_add.present?
|
|
|
|
|
notice = "Les administrateurs ont bien été affectés au groupe gestionnaire"
|
|
|
|
|
|
|
|
|
|
GroupeGestionnaireMailer
|
|
|
|
|
.notify_added_administrateurs(self, administrateurs_to_add, current_user.email)
|
|
|
|
|
.deliver_later
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
[administrateurs_to_add, alert, notice]
|
|
|
|
|
end
|
|
|
|
|
|
2023-09-30 12:45:54 +02:00
|
|
|
|
def can_be_deleted?(current_user)
|
|
|
|
|
(gestionnaires.empty? || (gestionnaires == [current_user])) && administrateurs.empty? && children.empty?
|
|
|
|
|
end
|
2023-09-04 12:07:04 +02:00
|
|
|
|
end
|