Etapa 7 — Motor de alertas (BullMQ)

Adiciona um processo worker separado do processo web (src/worker.ts,
WorkerModule) com dois crons diários e processors do BullMQ para alertas
de mensalidade (master→tenant) e cobrança (tenant→customer): marca
faturas/parcelas atrasadas, resolve template com fallback tenant→master
por canal, renderiza placeholders, dispara WhatsApp/e-mail com retry e
backoff exponencial, e grava alert_logs com idempotência por dia.

Módulo alerts (web) traz o CRUD de alert_templates (master e tenant) e a
consulta de alert_logs com filtros. alert_templates/alert_logs não têm
RLS no schema, então o isolamento entre tenants é feito manualmente
(PrismaMasterService + filtro por tenant_id), coberto por teste e2e
dedicado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 22:50:59 -03:00
co-authored by Claude Sonnet 5
parent 7daaa16935
commit d6d7d5fa61
37 changed files with 2661 additions and 19 deletions
+15
View File
@@ -68,3 +68,18 @@ TENANT_TRIAL_DIAS=14
# Nunca reutilize o valor de exemplo em produção — trocar invalida todos os
# segredos já cifrados no banco (seria necessário recriá-los).
ENCRYPTION_KEY=troque-este-valor-por-um-segredo-forte-com-32-caracteres-ou-mais
# --- Motor de Alertas (BullMQ) — só lido pelo processo worker (src/worker.ts) ----
# Horário dos jobs diários, em formato cron (padrão node-cron/crontab: min hora dia mes dia-semana)
ALERT_CRON_MENSALIDADE=0 8 * * *
ALERT_CRON_COBRANCA=0 8 * * *
# Quantos dias antes do vencimento o alerta já é disparado (além de toda fatura/parcela
# já vencida e ainda sem alerta hoje)
ALERT_DIAS_ANTECEDENCIA_MENSALIDADE=3
ALERT_DIAS_ANTECEDENCIA_COBRANCA=3
# Retry do BullMQ para falha transitória de envio: nº de tentativas e atraso-base (ms)
# do backoff exponencial (tentativa N espera ALERT_JOB_BACKOFF_MS * 2^(N-1))
ALERT_JOB_MAX_ATTEMPTS=3
ALERT_JOB_BACKOFF_MS=5000