Skip to content

Cobranças — Templates de Mensagem

Tabela: cobranca_templates · Trigger: fn_cobranca_templates_protect_fixos · Edge: admin-financeiro (actions list_templates / upsert_template / archive_template).

Categorias

CategoriaSlug patternQuem usaPode arquivar?Pode renomear slug?
fixo_reguacobranca_d1, cobranca_d7, cobranca_d15, cobranca_manualRégua automática + envio manual genérico❌ (trigger bloqueia)
manualmanual_* (auto-prefixado)Envio manual seletivo✅ (toggle ativo=false)❌ (slug imutável após criação)

Variáveis suportadas

Renderizadas por _shared/cobranca-template-render.ts:

VariávelOrigem
{{escola_nome}}escolas.nome
{{numero_fatura}}escola_faturas.numero_fatura (ou "Pendente")
{{valor}}valor − desconto + taxas, formatado em BRL
{{vencimento}}data BRT em dd/mm/aaaa
{{dias_atraso}}calculado por calcularDiasAtrasoBRT

Blocos condicionais simples ({{#dias_atraso}}…{{/dias_atraso}}) suportados pelo render para textos contextuais.

Resolução do template no envio

admin-financeiro/index.ts → resolverMensagem():

  1. Slug ∈ fixos → usa gerarMensagemSMS() (texto canônico hardcoded em _shared/sms-templates.ts). Garante paridade entre régua automática e envio manual.
  2. Slug manual_* → lê cobranca_templates.corpo e renderiza com as vars acima. Inativo ⇒ erro 422.

Por que slugs fixos não leem do banco? Para garantir que a régua automática (cron) nunca dependa de uma row removível e que mudanças no texto sejam revisadas via PR (versionadas). A edição em templates-tab permite ajustar o nome de exibição dos fixos, mas o corpo efetivamente enviado pela régua continua o do código.

RLS e proteção

  • RLS fail-close: SELECT/INSERT/UPDATE/DELETE só service_role (acesso via edge function autenticada).
  • Trigger fn_cobranca_templates_protect_fixos bloqueia DELETE, alteração de slug/categoria e ativo=false em categoria='fixo_regua'.
  • Slug de manual sem prefixo manual_ → erro 22023.

Logs

  • faturamento.template_criado
  • faturamento.template_atualizado
  • faturamento.template_arquivado

Limitações conhecidas

  • Sem versionamento histórico do corpo (apenas atualizado_em).
  • Sem preview ao vivo no editor — checar texto manualmente antes de salvar.
  • Bulk send respeita 6s entre mensagens (Wasender), templates não alteram esse delay.