2021-11-25 16:26:55 +01:00
module Administrateurs
2019-10-17 15:13:50 +02:00
class GroupeInstructeursController < AdministrateurController
2021-06-09 17:51:35 +02:00
include ActiveSupport :: NumberHelper
2022-07-21 18:56:01 +02:00
before_action :ensure_not_super_admin! , only : [ :add_instructeur ]
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
2022-10-14 17:10:42 +02:00
@groupes_instructeurs = paginated_groupe_instructeurs
2019-10-17 15:13:50 +02:00
2022-10-17 11:01:55 +02:00
@instructeurs = paginated_instructeurs
@available_instructeur_emails = available_instructeur_emails
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
2022-06-20 16:14:27 +02:00
. new ( { instructeurs : [ current_administrateur . instructeur ] } . merge ( groupe_instructeur_params ) )
2019-10-23 20:51:25 +02:00
if @groupe_instructeur . save
2022-10-17 11:01:55 +02:00
routing_notice = " et le routage a été activé " if procedure . groupe_instructeurs . actif . size == 2
2020-07-07 12:03:32 +02:00
redirect_to admin_procedure_groupe_instructeur_path ( procedure , @groupe_instructeur ) ,
2022-10-17 11:01:55 +02:00
notice : " Le groupe d’ instructeurs « #{ @groupe_instructeur . label } » a été créé#{ routing_notice } . "
2019-10-23 20:51:25 +02:00
else
@procedure = procedure
2022-10-14 17:10:42 +02:00
@instructeurs = paginated_instructeurs
2019-10-23 20:51:25 +02:00
@groupes_instructeurs = paginated_groupe_instructeurs
2022-06-20 16:14:27 +02:00
flash [ :alert ] = " le nom « #{ @groupe_instructeur . label } » est déjà pris par un autre groupe. "
2019-10-23 20:51:25 +02:00
render :index
end
end
2019-10-23 20:54:59 +02:00
def update
@groupe_instructeur = groupe_instructeur
2022-06-20 16:14:27 +02:00
if @groupe_instructeur . update ( groupe_instructeur_params )
2020-07-07 12:03:32 +02:00
redirect_to admin_procedure_groupe_instructeur_path ( procedure , groupe_instructeur ) ,
2022-06-20 16:14:27 +02:00
notice : " Le nom est à présent « #{ @groupe_instructeur . label } ». "
2019-10-23 20:54:59 +02:00
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
2022-10-17 11:01:55 +02:00
flash [ :alert ] = @groupe_instructeur . errors . values . join ( '<br>' )
2019-10-23 20:54:59 +02:00
render :show
end
end
2020-01-06 17:09:08 +01:00
def destroy
2022-06-20 16:14:27 +02:00
@groupe_instructeur = groupe_instructeur
if ! @groupe_instructeur . dossiers . empty?
2020-01-20 11:27:41 +01:00
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
2022-06-20 16:14:27 +02:00
@groupe_instructeur . destroy!
2022-10-20 18:24:27 +02:00
if procedure . groupe_instructeurs . actif . one?
2022-10-14 17:10:42 +02:00
procedure . update! ( routing_enabled : false )
2022-10-17 11:01:55 +02:00
routing_notice = " et le routage a été désactivé "
2022-10-14 17:10:42 +02:00
end
2022-10-17 11:01:55 +02:00
flash [ :notice ] = " le groupe « #{ @groupe_instructeur . label } » a été supprimé #{ routing_notice } . "
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
2021-07-26 16:06:09 +02:00
def reaffecter_bulk_messages ( target_group )
bulk_messages = BulkMessage . joins ( :groupe_instructeurs ) . where ( groupe_instructeurs : { id : groupe_instructeur . id } )
bulk_messages . each do | bulk_message |
bulk_message . groupe_instructeurs . delete ( groupe_instructeur )
if ! bulk_message . groupe_instructeur_ids . include? ( target_group . id )
bulk_message . groupe_instructeurs << target_group
end
end
end
2020-01-07 17:39:50 +01:00
def reaffecter
2020-01-20 11:27:41 +01:00
target_group = procedure . groupe_instructeurs . find ( params [ :target_group ] )
2021-07-26 16:06:09 +02:00
reaffecter_bulk_messages ( target_group )
2022-03-09 10:27:43 +01:00
groupe_instructeur . dossiers . 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
2022-11-04 10:10:57 +01:00
if procedure . routing_enabled?
2021-12-21 19:06:38 +01:00
instructeurs . each do | instructeur |
groupe_instructeur . add ( instructeur )
end
2020-06-12 18:16:07 +02:00
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?
2021-12-21 19:06:38 +01:00
instructeurs . each do | instructeur |
procedure . defaut_groupe_instructeur . add ( instructeur )
end
2020-06-12 18:16:07 +02:00
flash [ :notice ] = " Les instructeurs ont bien été affectés à la démarche "
end
end
2019-10-10 19:36:56 +02:00
end
2022-11-04 10:10:57 +01:00
if procedure . routing_enabled?
2021-09-14 19:54:35 +02:00
redirect_to admin_procedure_groupe_instructeur_path ( procedure , groupe_instructeur )
else
redirect_to admin_procedure_groupe_instructeurs_path ( procedure )
end
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
2021-10-26 22:40:48 +02:00
instructeur = Instructeur . find ( instructeur_id )
2022-11-04 10:10:57 +01:00
if procedure . routing_enabled?
2021-12-21 19:06:38 +01:00
if groupe_instructeur . remove ( instructeur )
2021-10-26 22:40:48 +02:00
flash [ :notice ] = " L’ instructeur « #{ instructeur . email } » a été retiré du groupe. "
GroupeInstructeurMailer
. remove_instructeur ( groupe_instructeur , instructeur , current_user . email )
. deliver_later
else
flash [ :alert ] = " L’ instructeur « #{ instructeur . email } » n’ est pas dans le groupe. "
end
2020-06-12 18:16:07 +02:00
else
2021-12-21 19:06:38 +01:00
if procedure . defaut_groupe_instructeur . remove ( instructeur )
2021-10-26 22:40:48 +02:00
flash [ :notice ] = " L’ instructeur a bien été désaffecté de la démarche "
2020-06-12 18:16:07 +02:00
else
2021-10-26 22:40:48 +02:00
flash [ :alert ] = " L’ instructeur n’ est pas affecté à la démarche "
2020-06-12 18:16:07 +02:00
end
end
2019-10-09 18:23:29 +02:00
end
2021-09-14 19:54:35 +02:00
2022-11-04 10:10:57 +01:00
if procedure . routing_enabled?
2021-09-14 19:54:35 +02:00
redirect_to admin_procedure_groupe_instructeur_path ( procedure , groupe_instructeur )
else
redirect_to admin_procedure_groupe_instructeurs_path ( procedure )
end
2019-10-09 18:23:29 +02:00
end
2019-10-17 10:57:58 +02:00
def update_routing_criteria_name
2022-09-30 11:34:55 +02:00
if procedure . update ( routing_criteria_name : routing_criteria_name )
flash [ :notice ] = " Le libellé est maintenant « #{ procedure . routing_criteria_name } ». "
else
flash [ :alert ] = " Le libellé du routage doit être rempli. "
end
redirect_to admin_procedure_groupe_instructeurs_path ( procedure )
2019-10-17 10:57:58 +02:00
end
2021-09-15 10:37:19 +02:00
def update_instructeurs_self_management_enabled
procedure . update! ( instructeurs_self_management_enabled_params )
redirect_to admin_procedure_groupe_instructeurs_path ( procedure ) ,
notice : " L’ autogestion des instructeurs est #{ procedure . instructeurs_self_management_enabled? ? " activée " : " désactivée " } . "
end
2021-06-09 17:51:35 +02:00
def import
2022-01-17 12:22:21 +01:00
if procedure . publiee?
if ! CSV_ACCEPTED_CONTENT_TYPES . include? ( group_csv_file . content_type ) && ! CSV_ACCEPTED_CONTENT_TYPES . include? ( marcel_content_type )
flash [ :alert ] = " Importation impossible : veuillez importer un fichier CSV "
2021-06-09 17:51:35 +02:00
2022-01-17 12:22:21 +01:00
elsif group_csv_file . size > CSV_MAX_SIZE
flash [ :alert ] = " Importation impossible : le poids du fichier est supérieur à #{ number_to_human_size ( CSV_MAX_SIZE ) } "
2021-06-09 17:51:35 +02:00
else
2022-01-17 12:22:21 +01:00
file = group_csv_file . read
base_encoding = CharlockHolmes :: EncodingDetector . detect ( file )
groupes_emails = ACSV :: CSV . new_for_ruby3 ( file . encode ( " UTF-8 " , base_encoding [ :encoding ] , invalid : :replace , replace : " " ) , headers : true , header_converters : :downcase )
. map { | r | r . to_h . slice ( 'groupe' , 'email' ) }
2021-06-22 14:30:02 +02:00
2022-01-17 12:22:21 +01:00
groupes_emails_has_keys = groupes_emails . first . has_key? ( " groupe " ) && groupes_emails . first . has_key? ( " email " )
if groupes_emails_has_keys . blank?
flash [ :alert ] = " Importation impossible, veuillez importer un csv #{ view_context . link_to ( 'suivant ce modèle' , " /csv/ #{ I18n . locale } /import-groupe-test.csv " ) } "
2021-06-22 14:30:02 +02:00
else
2022-01-17 12:22:21 +01: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-22 14:30:02 +02:00
end
2021-06-09 17:51:35 +02:00
end
redirect_to admin_procedure_groupe_instructeurs_path ( procedure )
end
end
2021-10-04 16:02:19 +02:00
def export_groupe_instructeurs
groupe_instructeurs = procedure . groupe_instructeurs
data = CSV . generate ( headers : true ) do | csv |
column_names = [ " Groupe " , " Email " ]
csv << column_names
groupe_instructeurs . each do | gi |
gi . instructeurs . each do | instructeur |
csv << [ gi . label , instructeur . email ]
end
end
end
respond_to do | format |
format . csv { send_data data , filename : " #{ procedure . id } -groupe-instructeurs- #{ Date . today } .csv " }
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
2021-09-14 19:54:35 +02:00
if params [ :id ] . present?
procedure . groupe_instructeurs . find ( params [ :id ] )
else
procedure . defaut_groupe_instructeur
end
2019-10-23 20:22:56 +02:00
end
2019-10-23 20:51:25 +02:00
2019-10-09 18:23:29 +02:00
def instructeur_id
params [ :instructeur ] [ :id ]
end
2022-06-20 16:14:27 +02:00
def groupe_instructeur_params
params . require ( :groupe_instructeur ) . permit ( :label , :closed )
2019-10-23 20:51:25 +02:00
end
def paginated_groupe_instructeurs
procedure
. groupe_instructeurs
. page ( params [ :page ] )
. per ( ITEMS_PER_PAGE )
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
2021-09-15 10:37:19 +02:00
def instructeurs_self_management_enabled_params
params . require ( :procedure ) . permit ( :instructeurs_self_management_enabled )
end
2021-11-11 13:25:47 +01:00
def routing_enabled_params
{ routing_enabled : params . require ( :routing ) == 'enable' }
end
2019-10-17 15:13:50 +02:00
end
end