Implantação da geração de mensagem de forma livre e mudança na engine de mensagem

This commit is contained in:
2026-08-24 17:32:16 -03:00
parent 94bbe7556f
commit 88f19dd8f5
77 changed files with 4650 additions and 25 deletions

View File

@@ -0,0 +1,78 @@
# app/services/notificacao/variaveis.rb
#
# Quais {{variaveis}} existem em cada gatilho, o que elas significam e um valor
# de AMOSTRA para o preview do editor.
#
# A amostra é o que faz o preview valer alguma coisa: mostrar "{{valor}}" cru na
# tela não diz se a mensagem ficou boa. Aqui ela é um exemplo plausível, não um
# dado real do banco — o preview não deve depender de haver consolidação
# fechada no ambiente para funcionar.
module Notificacao
module Variaveis
# Disponíveis em qualquer evento.
COMUNS = {
'empresa' => { descricao: 'Nome da empresa', amostra: 'Reem Transportes' },
'data' => { descricao: 'Data de hoje', amostra: '24/08/2026' },
'contato' => { descricao: 'Primeiro nome de quem recebe', amostra: 'Carlos' }
}.freeze
# Gatilhos que falam de um fechamento/pagamento de motorista.
FECHAMENTO = {
'motorista' => { descricao: 'Nome do motorista', amostra: 'Carlos Matheus Pimentel' },
'consolidacao' => { descricao: 'Nome da consolidação', amostra: 'UBS NORTE 0114/08' },
'periodo' => { descricao: 'Período do fechamento', amostra: '01/08/2026 a 14/08/2026' },
'valor' => { descricao: 'Valor do motorista', amostra: 'R$ 5.060,00' },
'entregas' => { descricao: 'Entregas atendidas', amostra: '280' },
'link_painel' => { descricao: 'Link do painel do motorista', amostra: 'https://app.reem.com.br/motorista' }
}.freeze
POR_GATILHO = {
'manual' => {},
'consolidacao_finalizada' => FECHAMENTO,
'pagamento_efetuado' => FECHAMENTO,
'valor_alterado' => FECHAMENTO.merge(
'o_que_mudou' => { descricao: 'O que foi alterado', amostra: 'Desconto de R$ 120,00 aplicado (avaria)' }
),
'operacao_alterada' => {
'operacao' => { descricao: 'Operação afetada', amostra: 'UBS NORTE AGO 2026' },
'o_que_mudou' => { descricao: 'O que foi alterado', amostra: '3 NFs entraram, 1 saiu' },
'nf' => { descricao: 'Nota fiscal', amostra: '85382' }
},
'agendado' => {
'operacao' => { descricao: 'Operação', amostra: 'UBS NORTE AGO 2026' },
'periodo' => { descricao: 'Período do resumo', amostra: '01/08/2026 a 24/08/2026' },
'entregues' => { descricao: 'Notas entregues', amostra: '4.851' },
'recusas' => { descricao: 'Notas não entregues', amostra: '122' },
'pendentes' => { descricao: 'Notas em aberto', amostra: '0' },
'retentativas' => { descricao: 'Visitas além da primeira', amostra: '4' },
'fora_operacao' => { descricao: 'Notas fora da operação', amostra: '2' }
}
}.freeze
def self.para(gatilho)
COMUNS.merge(POR_GATILHO.fetch(gatilho.to_s, {}))
end
def self.nomes(gatilho) = para(gatilho).keys
# { 'valor' => 'R$ 5.060,00', ... } — o contexto do PREVIEW.
#
# ⚠️ Só para preview. Num envio de verdade a amostra colocaria uma data fixa
# e um valor inventado dentro da mensagem que o contato recebe.
def self.amostra(gatilho)
para(gatilho).transform_values { |meta| meta[:amostra] }
end
# Valores REAIS das variáveis comuns — o que um envio de verdade deve usar
# quando o gatilho não traz contexto próprio (ex.: disparo manual).
def self.comuns_reais
{
'empresa' => Configuracao.valor('empresa_nome').presence || 'Reem Transportes',
'data' => Date.current.strftime('%d/%m/%Y')
}
rescue StandardError
# Tabela de configuração indisponível não pode impedir um disparo.
{ 'data' => Date.current.strftime('%d/%m/%Y') }
end
end
end