204 lines
6.7 KiB
Ruby
204 lines
6.7 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
module Manager
|
||
class ProceduresController < Manager::ApplicationController
|
||
CSV_MAX_SIZE = 1.megabytes
|
||
CSV_ACCEPTED_CONTENT_TYPES = [
|
||
"text/csv",
|
||
"application/vnd.ms-excel"
|
||
]
|
||
#
|
||
# Administrate overrides
|
||
#
|
||
|
||
# Override this if you have certain roles that require a subset
|
||
# this will be used to set the records shown on the `index` action.
|
||
def scoped_resource
|
||
if unfiltered_list?
|
||
# Don't display discarded demarches in the unfiltered list…
|
||
Procedure.kept
|
||
else
|
||
# … but allow them to be searched and displayed.
|
||
Procedure.with_discarded
|
||
end
|
||
end
|
||
|
||
def whitelist
|
||
procedure.whitelist!
|
||
flash[:notice] = "Démarche whitelistée."
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def hide_as_template
|
||
procedure.hide_as_template!
|
||
flash[:notice] = "Démarche non visible dans les modèles."
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def unhide_as_template
|
||
procedure.unhide_as_template!
|
||
flash[:notice] = "Démarche visible dans les modèles."
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def discard
|
||
procedure.discard_and_keep_track!(current_super_admin)
|
||
|
||
logger.info("La démarche #{procedure.id} est supprimée par #{current_super_admin.email}")
|
||
flash[:notice] = "La démarche #{procedure.id} a été supprimée."
|
||
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def restore
|
||
procedure.restore(current_super_admin)
|
||
|
||
flash[:notice] = "La démarche #{procedure.id} a été restauré."
|
||
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def export_mail_brouillons
|
||
dossiers = procedure.dossiers.state_brouillon.includes(:user)
|
||
emails = dossiers.map { |dossier| dossier.user_email_for(:display) }.sort.uniq
|
||
date = Time.zone.now.strftime('%d-%m-%Y')
|
||
send_data(emails.join("\n"), :filename => "brouillons-#{procedure.id}-au-#{date}.csv")
|
||
end
|
||
|
||
def add_administrateur_and_instructeur
|
||
administrateur = Administrateur.by_email(current_super_admin.email)
|
||
instructeur = Instructeur.by_email(current_super_admin.email)
|
||
if administrateur && instructeur
|
||
ActiveRecord::Base.transaction do
|
||
AdministrateursProcedure.create!(procedure: procedure, administrateur: administrateur, manager: true)
|
||
procedure.groupe_instructeurs.map do |groupe_instructeur|
|
||
instructeur.assign_to.create(groupe_instructeur: groupe_instructeur, manager: true)
|
||
end
|
||
end
|
||
|
||
flash[:notice] = "L’administrateur \"#{administrateur.email}\" a été ajouté à la démarche. L'instructeur \"#{instructeur.email}\" a été ajouté aux #{procedure.groupe_instructeurs.count} groupes d'instructeurs"
|
||
else
|
||
flash[:alert] = "L’administrateur \"#{administrateur.email}\" est introuvable."
|
||
end
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def add_administrateur_with_confirmation
|
||
redirect_to new_manager_procedure_confirmation_url_path(procedure, email: params[:email])
|
||
end
|
||
|
||
def delete_administrateur
|
||
administrateur = procedure.administrateurs.find { |admin| admin.email == current_super_admin.email }
|
||
if administrateur.present?
|
||
procedure.administrateurs.delete(administrateur)
|
||
end
|
||
|
||
instructeur = Instructeur.by_email(current_super_admin.email)
|
||
if instructeur.present?
|
||
procedure.groupe_instructeurs.map do |groupe_instructeur|
|
||
groupe_instructeur.assign_tos.where(instructeur: instructeur).destroy_all
|
||
end
|
||
end
|
||
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def change_piece_justificative_template
|
||
if type_de_champ.update(type_de_champ_params)
|
||
flash[:notice] = "Le modèle est mis à jour."
|
||
else
|
||
flash[:alert] = type_de_champ.errors.full_messages.join(', ')
|
||
end
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def add_tags
|
||
if procedure.update(tags: tags_params[:tags])
|
||
flash.notice = "Le modèle est mis à jour."
|
||
else
|
||
flash.alert = procedure.errors.full_messages.join(', ')
|
||
end
|
||
redirect_to manager_procedure_path(procedure)
|
||
end
|
||
|
||
def update_template_status
|
||
if procedure.update(template_params)
|
||
redirect_to manager_procedure_path(procedure), notice: 'Le statut de modèle a été mis à jour.'
|
||
else
|
||
flash.alert = procedure.errors.full_messages.join(', ')
|
||
end
|
||
end
|
||
|
||
def import_data
|
||
end
|
||
|
||
def import_tags
|
||
if !CSV_ACCEPTED_CONTENT_TYPES.include?(tags_csv_file.content_type) && !CSV_ACCEPTED_CONTENT_TYPES.include?(marcel_content_type)
|
||
flash[:alert] = "Importation impossible : veuillez importer un fichier CSV"
|
||
|
||
elsif tags_csv_file.size > CSV_MAX_SIZE
|
||
flash[:alert] = "Importation impossible : le poids du fichier est supérieur à #{number_to_human_size(CSV_MAX_SIZE)}"
|
||
|
||
else
|
||
file = tags_csv_file.read
|
||
base_encoding = CharlockHolmes::EncodingDetector.detect(file)
|
||
procedure_tags = 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('demarche', 'tag') }
|
||
|
||
invalid_ids = []
|
||
procedure_tags.each do |procedure_tag|
|
||
procedure = Procedure.find_by(id: procedure_tag['demarche'])
|
||
tags = procedure_tag["tag"].split(',').map(&:strip).map(&:capitalize)
|
||
|
||
if procedure.nil?
|
||
invalid_ids << procedure_tag['demarche']
|
||
next
|
||
end
|
||
|
||
tags.each do |tag|
|
||
procedure.tags.push(tag)
|
||
end
|
||
procedure.save
|
||
end
|
||
end
|
||
message = "Import des tags terminé."
|
||
message += " Ces démarches n'existent pas : #{invalid_ids.to_sentence}" if invalid_ids.any?
|
||
flash.notice = message
|
||
redirect_to manager_administrateurs_path
|
||
end
|
||
|
||
private
|
||
|
||
def procedure
|
||
@procedure ||= Procedure.with_discarded.find(params[:id])
|
||
end
|
||
|
||
def type_de_champ
|
||
TypeDeChamp.find(params[:type_de_champ][:id])
|
||
end
|
||
|
||
def type_de_champ_params
|
||
params.require(:type_de_champ).permit(:piece_justificative_template)
|
||
end
|
||
|
||
def tags_params
|
||
params.require(:procedure).permit(tags: [])
|
||
end
|
||
|
||
def template_params
|
||
params.require(:procedure).permit(:template)
|
||
end
|
||
|
||
def tags_csv_file
|
||
params[:tags_csv_file]
|
||
end
|
||
|
||
def marcel_content_type
|
||
Marcel::MimeType.for(tags_csv_file.read, name: tags_csv_file.original_filename, declared_type: tags_csv_file.content_type)
|
||
end
|
||
|
||
def unfiltered_list?
|
||
action_name == "index" && !params[:search]
|
||
end
|
||
end
|
||
end
|