2021-11-25 16:26:55 +01:00
|
|
|
|
module Administrateurs
|
2021-04-02 16:00:32 +02:00
|
|
|
|
class ExpertsProceduresController < AdministrateurController
|
2024-06-14 11:36:58 +02:00
|
|
|
|
include EmailSanitizableConcern
|
2021-04-06 13:42:21 +02:00
|
|
|
|
before_action :retrieve_procedure
|
2024-07-01 10:41:16 +02:00
|
|
|
|
before_action :retrieve_experts_procedure, only: [:index]
|
|
|
|
|
before_action :retrieve_experts_emails, only: [:index]
|
2021-04-02 16:00:32 +02:00
|
|
|
|
|
2021-04-06 13:55:43 +02:00
|
|
|
|
def index
|
|
|
|
|
end
|
|
|
|
|
|
2021-04-06 13:42:21 +02:00
|
|
|
|
def create
|
2021-04-02 16:00:32 +02:00
|
|
|
|
emails = params['emails'].presence || [].to_json
|
2024-06-25 14:37:54 +02:00
|
|
|
|
emails = JSON.parse(emails).map { EmailSanitizer.sanitize(_1) }
|
2024-07-02 16:10:06 +02:00
|
|
|
|
@maybe_typos, no_suggestions = emails
|
2024-07-01 10:38:43 +02:00
|
|
|
|
.map { |email| [email, EmailChecker.check(email:)[:suggestions]&.first] }
|
|
|
|
|
.partition { _1[1].present? }
|
2024-07-02 16:10:06 +02:00
|
|
|
|
|
|
|
|
|
errors = Array.wrap(generate_emails_suggestions_message(@maybe_typos))
|
|
|
|
|
|
|
|
|
|
emails = no_suggestions.map(&:first)
|
|
|
|
|
emails << EmailSanitizer.sanitize(params['final_email']) if params['final_email'].present?
|
2021-04-02 16:00:32 +02:00
|
|
|
|
|
|
|
|
|
valid_users, invalid_users = emails
|
|
|
|
|
.map { |email| User.create_or_promote_to_expert(email, SecureRandom.hex) }
|
|
|
|
|
.partition(&:valid?)
|
|
|
|
|
|
|
|
|
|
if invalid_users.any?
|
2024-06-14 11:36:58 +02:00
|
|
|
|
errors += invalid_users
|
2021-04-02 16:00:32 +02:00
|
|
|
|
.filter { |user| user.errors.present? }
|
|
|
|
|
.map { |user| "#{user.email} : #{user.errors.full_messages_for(:email).join(', ')}" }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if valid_users.present?
|
|
|
|
|
valid_users.each do |user|
|
|
|
|
|
experts_procedure = ExpertsProcedure.find_or_create_by(expert: user.expert, procedure: @procedure)
|
|
|
|
|
if !experts_procedure.revoked_at.nil?
|
|
|
|
|
experts_procedure.update!(revoked_at: nil)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2024-06-25 14:41:17 +02:00
|
|
|
|
flash.now[:notice] = t('.experts_assignment',
|
2021-04-02 16:00:32 +02:00
|
|
|
|
count: valid_users.count,
|
|
|
|
|
value: valid_users.map(&:email).join(', '),
|
|
|
|
|
procedure: @procedure.id)
|
|
|
|
|
end
|
2024-06-14 11:36:58 +02:00
|
|
|
|
|
2024-06-25 14:41:17 +02:00
|
|
|
|
flash.now[:alert] = errors.join(". ") if !errors.empty?
|
2024-07-01 10:41:16 +02:00
|
|
|
|
retrieve_experts_procedure
|
|
|
|
|
retrieve_experts_emails
|
2024-06-14 11:36:58 +02:00
|
|
|
|
render :index
|
2021-04-02 16:00:32 +02:00
|
|
|
|
end
|
|
|
|
|
|
2021-04-06 14:25:41 +02:00
|
|
|
|
def update
|
|
|
|
|
@procedure
|
|
|
|
|
.experts_procedures
|
|
|
|
|
.find(params[:id])
|
|
|
|
|
.update!(expert_procedure_params)
|
|
|
|
|
end
|
|
|
|
|
|
2021-04-06 13:42:21 +02:00
|
|
|
|
def destroy
|
2021-04-06 13:18:51 +02:00
|
|
|
|
expert_procedure = ExpertsProcedure.find_by!(procedure: @procedure, id: params[:id])
|
2021-04-02 16:00:32 +02:00
|
|
|
|
expert_email = expert_procedure.expert.email
|
|
|
|
|
expert_procedure.update!(revoked_at: Time.zone.now)
|
2021-05-26 15:16:30 +02:00
|
|
|
|
flash[:notice] = "#{expert_email} a été révoqué de la démarche et ne pourra plus déposer d’avis."
|
2021-04-06 13:55:43 +02:00
|
|
|
|
redirect_to admin_procedure_experts_path(@procedure)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
2024-06-14 11:36:58 +02:00
|
|
|
|
def retrieve_experts_procedure
|
|
|
|
|
@experts_procedure ||= @procedure.experts_procedures.where(revoked_at: nil).sort_by { _1.expert.email }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def retrieve_experts_emails
|
|
|
|
|
@experts_emails ||= @experts_procedure.map { _1.expert.email }
|
2021-04-02 16:00:32 +02:00
|
|
|
|
end
|
2021-04-06 14:25:41 +02:00
|
|
|
|
|
|
|
|
|
def expert_procedure_params
|
|
|
|
|
params.require(:experts_procedure).permit(:allow_decision_access)
|
|
|
|
|
end
|
2024-07-02 16:10:06 +02:00
|
|
|
|
|
|
|
|
|
def generate_emails_suggestions_message(suggestions)
|
|
|
|
|
return if suggestions.empty?
|
|
|
|
|
|
|
|
|
|
typo_list = suggestions.map(&:first).join(', ')
|
|
|
|
|
verification_link = view_context.link_to("vérifier l’orthographe", "#maybe_typos_errors")
|
|
|
|
|
|
|
|
|
|
"Attention, nous pensons avoir identifié une faute de frappe dans les invitations : #{typo_list}. Veuillez #{verification_link} des invitations."
|
|
|
|
|
end
|
2021-04-02 16:00:32 +02:00
|
|
|
|
end
|
|
|
|
|
end
|