2019-10-17 15:13:50 +02:00
|
|
|
|
module NewAdministrateur
|
|
|
|
|
class GroupeInstructeursController < AdministrateurController
|
2021-06-09 17:51:35 +02:00
|
|
|
|
include ActiveSupport::NumberHelper
|
2019-10-17 15:13:50 +02:00
|
|
|
|
ITEMS_PER_PAGE = 25
|
2021-06-09 17:51:35 +02:00
|
|
|
|
CSV_MAX_SIZE = 1.megabytes
|
2021-07-15 15:52:51 +02:00
|
|
|
|
CSV_ACCEPTED_CONTENT_TYPES = [
|
|
|
|
|
"text/csv",
|
|
|
|
|
"application/vnd.ms-excel"
|
|
|
|
|
]
|
2019-10-17 15:13:50 +02:00
|
|
|
|
|
|
|
|
|
def index
|
|
|
|
|
@procedure = procedure
|
|
|
|
|
|
2019-10-23 20:51:25 +02:00
|
|
|
|
@groupes_instructeurs = paginated_groupe_instructeurs
|
2019-10-17 15:13:50 +02:00
|
|
|
|
end
|
|
|
|
|
|
2019-10-23 20:22:56 +02:00
|
|
|
|
def show
|
|
|
|
|
@procedure = procedure
|
|
|
|
|
@groupe_instructeur = groupe_instructeur
|
2019-10-23 20:54:59 +02:00
|
|
|
|
@instructeurs = paginated_instructeurs
|
2019-11-04 14:49:53 +01:00
|
|
|
|
@available_instructeur_emails = available_instructeur_emails
|
2019-10-23 20:22:56 +02:00
|
|
|
|
end
|
|
|
|
|
|
2019-10-23 20:51:25 +02:00
|
|
|
|
def create
|
|
|
|
|
@groupe_instructeur = procedure
|
|
|
|
|
.groupe_instructeurs
|
|
|
|
|
.new(label: label, instructeurs: [current_administrateur.instructeur])
|
|
|
|
|
|
|
|
|
|
if @groupe_instructeur.save
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeur_path(procedure, @groupe_instructeur),
|
2019-10-23 20:51:25 +02:00
|
|
|
|
notice: "Le groupe d’instructeurs « #{label} » a été créé."
|
|
|
|
|
else
|
|
|
|
|
@procedure = procedure
|
|
|
|
|
@groupes_instructeurs = paginated_groupe_instructeurs
|
|
|
|
|
|
|
|
|
|
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
|
|
|
|
|
render :index
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-10-23 20:54:59 +02:00
|
|
|
|
def update
|
|
|
|
|
@groupe_instructeur = groupe_instructeur
|
|
|
|
|
|
|
|
|
|
if @groupe_instructeur.update(label: label)
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur),
|
2019-10-23 20:54:59 +02:00
|
|
|
|
notice: "Le nom est à présent « #{label} »."
|
|
|
|
|
else
|
|
|
|
|
@procedure = procedure
|
|
|
|
|
@instructeurs = paginated_instructeurs
|
2019-11-04 14:49:53 +01:00
|
|
|
|
@available_instructeur_emails = available_instructeur_emails
|
2019-10-23 20:54:59 +02:00
|
|
|
|
|
|
|
|
|
flash[:alert] = "le nom « #{label} » est déjà pris par un autre groupe."
|
|
|
|
|
render :show
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-01-06 17:09:08 +01:00
|
|
|
|
def destroy
|
2020-01-20 11:27:41 +01:00
|
|
|
|
if !groupe_instructeur.dossiers.empty?
|
|
|
|
|
flash[:alert] = "Impossible de supprimer un groupe avec des dossiers. Il faut le réaffecter avant"
|
|
|
|
|
elsif procedure.groupe_instructeurs.one?
|
2020-01-06 17:09:08 +01:00
|
|
|
|
flash[:alert] = "Suppression impossible : il doit y avoir au moins un groupe instructeur sur chaque procédure"
|
|
|
|
|
else
|
2020-01-20 11:27:41 +01:00
|
|
|
|
label = groupe_instructeur.label
|
|
|
|
|
groupe_instructeur.destroy!
|
|
|
|
|
flash[:notice] = "le groupe « #{label} » a été supprimé."
|
2020-01-06 17:09:08 +01:00
|
|
|
|
end
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
2020-01-06 17:09:08 +01:00
|
|
|
|
end
|
|
|
|
|
|
2020-01-07 17:39:50 +01:00
|
|
|
|
def reaffecter_dossiers
|
|
|
|
|
@procedure = procedure
|
|
|
|
|
@groupe_instructeur = groupe_instructeur
|
|
|
|
|
@groupes_instructeurs = paginated_groupe_instructeurs
|
|
|
|
|
.without_group(@groupe_instructeur)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def reaffecter
|
2020-01-20 11:27:41 +01:00
|
|
|
|
target_group = procedure.groupe_instructeurs.find(params[:target_group])
|
2020-02-26 12:30:52 +01:00
|
|
|
|
|
2020-04-01 11:10:25 +02:00
|
|
|
|
groupe_instructeur.dossiers.with_discarded.find_each do |dossier|
|
2020-02-26 12:30:52 +01:00
|
|
|
|
dossier.assign_to_groupe_instructeur(target_group, current_administrateur)
|
|
|
|
|
end
|
|
|
|
|
|
2020-01-20 11:27:41 +01:00
|
|
|
|
flash[:notice] = "Les dossiers du groupe « #{groupe_instructeur.label} » ont été réaffectés au groupe « #{target_group.label} »."
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
2020-01-07 17:39:50 +01:00
|
|
|
|
end
|
|
|
|
|
|
2019-10-10 19:36:56 +02:00
|
|
|
|
def add_instructeur
|
2021-02-11 15:36:11 +01:00
|
|
|
|
emails = params['emails'].presence || [].to_json
|
|
|
|
|
emails = JSON.parse(emails).map(&:strip).map(&:downcase)
|
2019-10-10 19:36:56 +02:00
|
|
|
|
|
2019-11-04 14:49:53 +01:00
|
|
|
|
correct_emails, bad_emails = emails
|
|
|
|
|
.partition { |email| URI::MailTo::EMAIL_REGEXP.match?(email) }
|
|
|
|
|
|
|
|
|
|
if bad_emails.present?
|
|
|
|
|
flash[:alert] = t('.wrong_address',
|
|
|
|
|
count: bad_emails.count,
|
|
|
|
|
value: bad_emails.join(', '))
|
|
|
|
|
end
|
|
|
|
|
|
2019-12-02 14:52:01 +01:00
|
|
|
|
email_to_adds = correct_emails - groupe_instructeur.instructeurs.map(&:email)
|
2019-11-04 14:49:53 +01:00
|
|
|
|
|
|
|
|
|
if email_to_adds.present?
|
|
|
|
|
instructeurs = email_to_adds.map do |instructeur_email|
|
|
|
|
|
Instructeur.by_email(instructeur_email) ||
|
|
|
|
|
create_instructeur(instructeur_email)
|
|
|
|
|
end
|
2019-10-10 19:36:56 +02:00
|
|
|
|
|
2020-06-12 18:16:07 +02:00
|
|
|
|
if procedure.routee?
|
|
|
|
|
groupe_instructeur.instructeurs << instructeurs
|
|
|
|
|
|
|
|
|
|
GroupeInstructeurMailer
|
|
|
|
|
.add_instructeurs(groupe_instructeur, instructeurs, current_user.email)
|
|
|
|
|
.deliver_later
|
|
|
|
|
|
|
|
|
|
flash[:notice] = t('.assignment',
|
|
|
|
|
count: email_to_adds.count,
|
|
|
|
|
value: email_to_adds.join(', '),
|
|
|
|
|
groupe: groupe_instructeur.label)
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
if instructeurs.present?
|
|
|
|
|
instructeurs.each do |instructeur|
|
|
|
|
|
instructeur.assign_to_procedure(procedure)
|
|
|
|
|
end
|
|
|
|
|
flash[:notice] = "Les instructeurs ont bien été affectés à la démarche"
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-10-10 19:36:56 +02:00
|
|
|
|
end
|
|
|
|
|
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur)
|
2019-10-10 19:36:56 +02:00
|
|
|
|
end
|
|
|
|
|
|
2019-10-09 18:23:29 +02:00
|
|
|
|
def remove_instructeur
|
|
|
|
|
if groupe_instructeur.instructeurs.one?
|
|
|
|
|
flash[:alert] = "Suppression impossible : il doit y avoir au moins un instructeur dans le groupe"
|
|
|
|
|
|
|
|
|
|
else
|
2020-06-12 18:16:07 +02:00
|
|
|
|
if procedure.routee?
|
|
|
|
|
@instructeur = Instructeur.find(instructeur_id)
|
|
|
|
|
groupe_instructeur.instructeurs.destroy(@instructeur)
|
|
|
|
|
flash[:notice] = "L’instructeur « #{@instructeur.email} » a été retiré du groupe."
|
|
|
|
|
GroupeInstructeurMailer
|
|
|
|
|
.remove_instructeur(groupe_instructeur, @instructeur, current_user.email)
|
|
|
|
|
.deliver_later
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
instructeur = Instructeur.find(instructeur_id)
|
|
|
|
|
if instructeur.remove_from_procedure(procedure)
|
|
|
|
|
flash[:notice] = "L'instructeur a bien été désaffecté de la démarche"
|
|
|
|
|
else
|
|
|
|
|
flash[:alert] = "Suppression impossible : il doit y avoir au moins un instructeur dans le groupe"
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-10-09 18:23:29 +02:00
|
|
|
|
end
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeur_path(procedure, groupe_instructeur)
|
2019-10-09 18:23:29 +02:00
|
|
|
|
end
|
|
|
|
|
|
2019-10-17 10:57:58 +02:00
|
|
|
|
def update_routing_criteria_name
|
|
|
|
|
procedure.update!(routing_criteria_name: routing_criteria_name)
|
|
|
|
|
|
2020-07-07 12:03:32 +02:00
|
|
|
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure),
|
2019-10-17 10:57:58 +02:00
|
|
|
|
notice: "Le libellé est maintenant « #{procedure.routing_criteria_name} »."
|
|
|
|
|
end
|
|
|
|
|
|
2021-06-09 17:51:35 +02:00
|
|
|
|
def import
|
2021-07-15 15:52:51 +02:00
|
|
|
|
if !CSV_ACCEPTED_CONTENT_TYPES.include?(group_csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type)
|
2021-06-09 17:51:35 +02:00
|
|
|
|
flash[:alert] = "Importation impossible : veuillez importer un fichier CSV"
|
|
|
|
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
|
|
|
|
|
|
|
|
|
elsif group_csv_file.size > CSV_MAX_SIZE
|
|
|
|
|
flash[:alert] = "Importation impossible : la poids du fichier est supérieur à #{number_to_human_size(CSV_MAX_SIZE)}"
|
|
|
|
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
|
|
|
|
|
|
|
|
|
else
|
2021-07-12 14:00:26 +02:00
|
|
|
|
file = group_csv_file.read
|
|
|
|
|
base_encoding = CharlockHolmes::EncodingDetector.detect(file)
|
|
|
|
|
groupes_emails = CSV.new(file.encode("UTF-8", base_encoding[:encoding], invalid: :replace, replace: ""), headers: true, header_converters: :downcase)
|
2021-06-09 17:51:35 +02:00
|
|
|
|
.map { |r| r.to_h.slice('groupe', 'email') }
|
|
|
|
|
|
2021-06-22 14:30:02 +02:00
|
|
|
|
groupes_emails_has_keys = groupes_emails.first.has_key?("groupe") && groupes_emails.first.has_key?("email")
|
2021-06-09 17:51:35 +02:00
|
|
|
|
|
2021-06-22 14:30:02 +02:00
|
|
|
|
if groupes_emails_has_keys.blank?
|
|
|
|
|
flash[:alert] = "Importation impossible, veuillez importer un csv #{view_context.link_to('suivant ce modèle', "/import-groupe-test.csv")}"
|
2021-06-09 17:51:35 +02:00
|
|
|
|
else
|
2021-06-22 14:30:02 +02:00
|
|
|
|
add_instructeurs_and_get_errors = InstructeursImportService.import(procedure, groupes_emails)
|
|
|
|
|
|
|
|
|
|
if add_instructeurs_and_get_errors.empty?
|
|
|
|
|
flash[:notice] = "La liste des instructeurs a été importée avec succès"
|
|
|
|
|
else
|
|
|
|
|
flash[:alert] = "Import terminé. Cependant les emails suivants ne sont pas pris en compte: #{add_instructeurs_and_get_errors.join(', ')}"
|
|
|
|
|
end
|
2021-06-09 17:51:35 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
redirect_to admin_procedure_groupe_instructeurs_path(procedure)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-10-17 15:13:50 +02:00
|
|
|
|
private
|
|
|
|
|
|
2019-10-10 19:36:56 +02:00
|
|
|
|
def create_instructeur(email)
|
|
|
|
|
user = User.create_or_promote_to_instructeur(
|
|
|
|
|
email,
|
|
|
|
|
SecureRandom.hex,
|
|
|
|
|
administrateurs: [current_administrateur]
|
|
|
|
|
)
|
|
|
|
|
user.invite!
|
|
|
|
|
user.instructeur
|
|
|
|
|
end
|
|
|
|
|
|
2019-10-17 15:13:50 +02:00
|
|
|
|
def procedure
|
|
|
|
|
current_administrateur
|
|
|
|
|
.procedures
|
|
|
|
|
.includes(:groupe_instructeurs)
|
|
|
|
|
.find(params[:procedure_id])
|
|
|
|
|
end
|
2019-10-23 20:22:56 +02:00
|
|
|
|
|
|
|
|
|
def groupe_instructeur
|
|
|
|
|
procedure.groupe_instructeurs.find(params[:id])
|
|
|
|
|
end
|
2019-10-23 20:51:25 +02:00
|
|
|
|
|
2019-10-09 18:23:29 +02:00
|
|
|
|
def instructeur_id
|
|
|
|
|
params[:instructeur][:id]
|
|
|
|
|
end
|
|
|
|
|
|
2019-10-23 20:51:25 +02:00
|
|
|
|
def label
|
|
|
|
|
params[:groupe_instructeur][:label]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def paginated_groupe_instructeurs
|
|
|
|
|
procedure
|
|
|
|
|
.groupe_instructeurs
|
|
|
|
|
.page(params[:page])
|
|
|
|
|
.per(ITEMS_PER_PAGE)
|
|
|
|
|
.order(:label)
|
|
|
|
|
end
|
2019-10-23 20:54:59 +02:00
|
|
|
|
|
|
|
|
|
def paginated_instructeurs
|
|
|
|
|
groupe_instructeur
|
|
|
|
|
.instructeurs
|
|
|
|
|
.page(params[:page])
|
|
|
|
|
.per(ITEMS_PER_PAGE)
|
|
|
|
|
.order(:email)
|
|
|
|
|
end
|
2019-10-17 10:57:58 +02:00
|
|
|
|
|
|
|
|
|
def routing_criteria_name
|
|
|
|
|
params[:procedure][:routing_criteria_name]
|
|
|
|
|
end
|
2019-11-04 14:49:53 +01:00
|
|
|
|
|
|
|
|
|
def available_instructeur_emails
|
2019-12-02 14:52:01 +01:00
|
|
|
|
all = current_administrateur.instructeurs.map(&:email)
|
|
|
|
|
assigned = groupe_instructeur.instructeurs.map(&:email)
|
2019-11-04 14:49:53 +01:00
|
|
|
|
(all - assigned).sort
|
|
|
|
|
end
|
2021-06-09 17:51:35 +02:00
|
|
|
|
|
|
|
|
|
def group_csv_file
|
|
|
|
|
params[:group_csv_file]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def marcel_content_type
|
|
|
|
|
Marcel::MimeType.for(group_csv_file.read, name: group_csv_file.original_filename, declared_type: group_csv_file.content_type)
|
|
|
|
|
end
|
2019-10-17 15:13:50 +02:00
|
|
|
|
end
|
|
|
|
|
end
|