demarches-normaliennes/app/models/groupe_gestionnaire.rb
2023-12-06 14:47:39 +01:00

158 lines
6 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class GroupeGestionnaire < ApplicationRecord
has_many :administrateurs
has_and_belongs_to_many :gestionnaires
has_ancestry
def add_gestionnaire(gestionnaire)
return if gestionnaire.nil?
return if in?(gestionnaire.groupe_gestionnaires)
gestionnaires << gestionnaire
end
def remove_gestionnaire(gestionnaire_id, current_user)
if !self.is_root? || self.gestionnaires.one?
alert = "Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine"
else
gestionnaire = Gestionnaire.find(gestionnaire_id)
if !in?(gestionnaire.groupe_gestionnaires) || !gestionnaire.groupe_gestionnaires.destroy(self)
alert = "Le gestionnaire « #{gestionnaire.email} » nest pas dans le groupe gestionnaire."
else
if gestionnaire.groupe_gestionnaires.empty?
gestionnaire.destroy
end
notice = "Le gestionnaire « #{gestionnaire.email} » a été retiré du groupe gestionnaire."
GroupeGestionnaireMailer
.notify_removed_gestionnaire(self, gestionnaire.email, current_user.email)
.deliver_later
end
end
[gestionnaire, alert, notice]
end
def add_gestionnaires(ids: [], emails: [], current_user: nil)
emails = emails.to_json
emails = JSON.parse(emails).map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1) }
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
gestionnaires_duplicate = gestionnaires_to_add & gestionnaires
gestionnaires_to_add -= gestionnaires
gestionnaires_to_add.each { add_gestionnaire(_1) }
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,
emails: gestionnaires_duplicate.map(&:email))
end
if gestionnaires_to_add.present?
notice = "Les gestionnaires ont bien été affectés au groupe gestionnaire"
GroupeGestionnaireMailer
.notify_added_gestionnaires(self, gestionnaires_to_add, current_user.email)
.deliver_later
end
[gestionnaires_to_add, alert, notice]
end
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} » nest 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
def can_be_deleted?(current_user)
(gestionnaires.empty? || (gestionnaires == [current_user])) && administrateurs.empty? && children.empty?
end
end