# app/models/variavel_personalizada.rb # # Variável criada pelo ADM, com valor fixo, usável em qualquer mensagem. class VariavelPersonalizada < ApplicationRecord # Nome da tabela fixado: o Inflector pt-BR não resolve variavel → variaveis. self.table_name = 'variaveis_personalizadas' # Mesmo formato que o renderizador aceita em {{...}}: letras minúsculas, # números e _ . Sem isso, o ADM cadastraria "Telefone Suporte" e a variável # nunca seria substituída — falha muda dentro da mensagem enviada. FORMATO_CHAVE = /\A[a-z][a-z0-9_]*\z/ before_validation :normalizar validates :chave, presence: true, uniqueness: { case_sensitive: false }, format: { with: FORMATO_CHAVE, message: 'use apenas letras minúsculas, números e _ (ex.: telefone_suporte)' } validates :valor, presence: true validate :nao_colidir_com_variavel_do_sistema scope :ativas, -> { where(ativo: true) } scope :ordenadas, -> { order(:chave) } def marcador = "{{#{chave}}}" private def normalizar self.chave = chave.to_s.strip.downcase.tr(' ', '_') self.valor = valor.to_s.strip end # Deixar o ADM criar {{valor}} ou {{motorista}} faria a variável dele # sobrescrever (ou ser sobrescrita por) a do sistema, dependendo da ordem — # exatamente o tipo de bug que não aparece no preview e aparece no envio. def nao_colidir_com_variavel_do_sistema return if chave.blank? reservadas = Notificacao::CatalogoVariaveis::SISTEMA.keys + Notificacao::CatalogoVariaveis::CONTEXTO.keys + Notificacao::CatalogoVariaveis::DADOS.keys return unless reservadas.include?(chave) errors.add(:chave, "já existe no sistema — escolha outro nome (ex.: #{chave}_empresa)") end end