47 lines
1.8 KiB
Ruby
47 lines
1.8 KiB
Ruby
# 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
|