# 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