39 lines
1.2 KiB
Ruby
39 lines
1.2 KiB
Ruby
# app/models/grupo_contato.rb
|
|
#
|
|
# Grupo de destinatários (Diretoria, Operação, Motoristas, Cliente...). É o
|
|
# GRUPO que assina os eventos: cadastrar alguém novo é escolher o grupo, não
|
|
# repetir a configuração pessoa por pessoa.
|
|
class GrupoContato < ApplicationRecord
|
|
self.table_name = 'grupos_contato'
|
|
|
|
has_many :contatos, dependent: :nullify
|
|
has_many :assinaturas, class_name: 'GrupoEventoAssinatura', dependent: :destroy
|
|
has_many :eventos, through: :assinaturas, source: :evento_notificacao
|
|
|
|
validates :nome, presence: true
|
|
validate :nome_unico
|
|
|
|
scope :ativos, -> { where(ativo: true) }
|
|
scope :ordenados, -> { order(Arel.sql('LOWER(nome)')) }
|
|
|
|
before_validation { self.nome = nome.to_s.strip.squeeze(' ').presence }
|
|
|
|
# Contatos que devem receber ESTE evento por ESTE canal.
|
|
def destinatarios(canal)
|
|
return GrupoContato.none unless ativo?
|
|
|
|
contatos.ativos.com_canal(canal)
|
|
end
|
|
|
|
private
|
|
|
|
# Índice único é sobre LOWER(nome); validar aqui dá a mensagem amigável em vez
|
|
# de estourar RecordNotUnique na tela.
|
|
def nome_unico
|
|
return if nome.blank?
|
|
|
|
existe = GrupoContato.where.not(id: id).where('LOWER(nome) = ?', nome.downcase).exists?
|
|
errors.add(:nome, 'já existe') if existe
|
|
end
|
|
end
|