# 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 01–14/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