demarches-normaliennes/app/models/expert.rb

75 lines
2.1 KiB
Ruby

class Expert < ApplicationRecord
belongs_to :user
has_many :experts_procedures
has_many :procedures, through: :experts_procedures
has_many :avis, through: :experts_procedures
has_many :dossiers, through: :avis
has_many :commentaires, inverse_of: :expert, dependent: :nullify
default_scope { eager_load(:user) }
def email
user.email
end
def self.by_email(email)
Expert.eager_load(:user).find_by(users: { email: email })
end
def avis_summary
if @avis_summary.present?
@avis_summary
else
query = <<~EOF
COUNT(*) FILTER (where answer IS NULL AND dossiers.hidden_by_administration_at IS NULL AND dossiers.state not in ('accepte', 'refuse', 'sans_suite')) AS unanswered,
COUNT(*) AS total
EOF
result = avis.select(query)[0]
@avis_summary = { unanswered: result.unanswered, total: result.total }
end
end
def self.autocomplete_mails(procedure)
procedure_experts = Expert
.joins(:experts_procedures, :user)
.where(experts_procedures: { procedure: procedure })
new_or_confirmed_experts = procedure_experts
.where.not(users: { confirmed_at: nil })
.or(procedure_experts.where(users: { created_at: 1.day.ago.. }))
suggested_expert = if procedure.experts_require_administrateur_invitation?
new_or_confirmed_experts
.where(experts_procedures: { revoked_at: nil })
else
new_or_confirmed_experts
end
suggested_expert
.pluck('users.email')
.sort
end
def merge(old_expert)
return if old_expert.nil?
procedure_with_new, procedure_without_new = old_expert
.procedures
.with_discarded
.partition { |p| p.experts.exists?(id) }
ExpertsProcedure
.where(expert_id: old_expert.id, procedure: procedure_without_new)
.update_all(expert_id: id)
ExpertsProcedure
.where(expert_id: old_expert.id, procedure: procedure_with_new)
.destroy_all
old_expert.commentaires.update_all(expert_id: id)
Avis
.where(claimant_id: old_expert.id, claimant_type: Expert.name)
.update_all(claimant_id: id)
end
end