Skip to content

Mapa Completo de Notificações e Alertas Push

Última atualização: 2026-03-07

O sistema possui dois canais de notificação independentes:

  1. Notificações in-app — inseridas na tabela notificacoes, entregues via Supabase Realtime ao frontend (sino no header)
  2. Alertas push (ntfy.sh) — enviados via HTTP para o app ntfy da equipe técnica/admin (celular/desktop)

Alguns cenários também disparam mensagens WhatsApp via Wasender como canal complementar.


Canal 1: Notificações In-App (tabela notificacoes)

1.1 Fatura Gerada

CampoValor
Tipofatura_proxima
Origemfaturamento-cron (action gerar_faturas)
DestinatáriosGestores (escola) + Diretores da escola
TriggerCRON mensal gera fatura e link MercadoPago
TítuloFatura gerada - FAT-YYYY-MM-NNN
Canais extrasWhatsApp ao gestor (fatura_gerada)
Como testarDashboard Admin > CRON Monitor > Trigger Manual faturamento-cron com action gerar_faturas. Requer escola com assinatura ativa e dia de vencimento compatível.

1.2 Lembrete D-5 (Fatura vence em 5 dias)

CampoValor
Tipofatura_proxima
Origemfaturamento-cron (action lembrete_d5)
DestinatáriosGestores + Diretores da escola
TriggerCRON diário encontra fatura pendente com vencimento em exatamente 5 dias
TítuloFatura vence em 5 dias - FAT-...
Canais extrasWhatsApp ao gestor (lembrete_fatura)
Como testarCriar fatura pendente com vencimento_em = hoje + 5 dias, link_pagamento preenchido, lembrete_d5_enviado_em = null. Trigger manual lembrete_d5.

1.3 Pagamento Confirmado (via Webhook)

CampoValor
Tipopagamento_confirmado
Origemmercadopago-webhook
DestinatáriosGestores + Diretores da escola
TriggerMercadoPago envia webhook payment.created/payment.updated com status approved
TítuloPagamento confirmado - FAT-...
Canais extrasWhatsApp ao gestor (pagamento_confirmado)
Como testarSimular webhook POST para mercadopago-webhook com payload de pagamento aprovado (requer fatura real com gateway_preference_id). Alternativa: usar sandbox do MercadoPago com cartão de teste.

1.4 Pagamento Confirmado (via Polling)

CampoValor
Tipopagamento_confirmado
Origemmercadopago-preference (action check_status)
DestinatáriosGestores + Diretores da escola
TriggerFrontend chama check_status após usuário retornar da tela de pagamento
Canais extrasWhatsApp ao gestor (pagamento_confirmado)
Como testarFazer pagamento real no sandbox, depois chamar check_status com o fatura_id.

1.5 Solicitação de Alteração de Plano

CampoValor
Tiposistema
Origemescola-pagamentos (action request_plan_change)
DestinatáriosTodos os administradores da plataforma
TriggerGestor da escola solicita troca de plano na tela de Pagamentos
Canais extrasWhatsApp aos admins (solicitacao_plano)
Como testarLogar como gestor de escola > Pagamentos > Solicitar alteração de plano (selecionar plano diferente + período).

1.6 Cadastro de Escola (Solicitação de Ativação)

CampoValor
Tiposistema
Origemcadastro-escola-publica
DestinatáriosTodos os administradores da plataforma
TriggerEscola completa formulário de cadastro público
TítuloNova solicitação de cadastro
Canais extrasNenhum (sem SMS)
Como testarAcessar /cadastro > Preencher formulário completo > Submeter. Verificar notificação no painel admin.

1.7 Solicitação de Vínculo (Convite)

CampoValor
Tiposolicitacao_vinculo
Origemgestao-usuarios-escola (action criar_solicitacao)
DestinatáriosUsuário convidado
TriggerGestor envia convite de vínculo a um usuário existente
TítuloSolicitação de Vínculo
Canais extrasNenhum
Como testarLogar como gestor > Usuários > Vincular usuário existente (por CPF). O usuário destinatário deve ver a notificação.

1.8 Resposta ao Vínculo (Aceite/Recusa)

CampoValor
Tiposolicitacao_vinculo
Origemgestao-usuarios-escola (action responder_solicitacao)
DestinatáriosGestor que enviou o convite (solicitante)
TriggerUsuário aceita ou recusa a solicitação de vínculo
TítuloVínculo Aceito ou Vínculo Recusado
Canais extrasNenhum
Como testarLogar como usuário convidado > Notificações > Aceitar/Recusar vínculo. Verificar notificação no painel do gestor.

1.9 Falha Crítica de CRON (Alerta Admin)

CampoValor
Tipocron_falha
Origemfaturamento-cron e maintenance-cron (função criarAlertaAdmins)
DestinatáriosTodos os administradores da plataforma
TriggerJob CRON falha 2+ vezes consecutivas (alerta) ou 3+ vezes (crítico)
Canais extrasWhatsApp aos admins (3+ falhas) + ntfy push
Como testarForçar falha no CRON (ex: revogar permissão de tabela temporariamente) > Trigger manual > Repetir até 3 falhas.

1.10 Notificação Manual do Admin (create_internal / create_batch)

CampoValor
Tipoequipe_olp ou sistema (configurável)
Origemnotificacoes (actions create_internal e create_batch)
DestinatáriosUsuário específico (internal) ou todos de um papel (batch)
TriggerAdmin envia notificação manualmente via painel
Canais extrasNenhum
Como testarLogar como admin > Enviar Notificação > Selecionar destinatários > Enviar.

Canal 2: Alertas Push (ntfy.sh) — Equipe Técnica

2.1 Brute Force Detectado (Login Sistema)

CampoValor
Origemverify-otp/index.ts
Prioridadehigh
Tagswarning, lock
TriggerUsuário atinge 5+ tentativas falhas de OTP em 15 min (lockout ativado)
Como testarFazer 5 tentativas de login com OTP errado para o mesmo CPF.

2.2 Falha no Envio de SMS OTP (Login Sistema)

CampoValor
Origemsend-otp/index.ts
Prioridadehigh
Tagswarning, phone
TriggerWasender retorna erro ao tentar enviar OTP via WhatsApp
Como testarConfigurar telefone inválido para um usuário > Tentar login. Ou desconectar sessão Wasender temporariamente.

2.3 Lockout Severo no Portal (10+ falhas)

CampoValor
Origemportal-escola/index.ts (função checkLockout)
Prioridadehigh
Tagsrotating_light, lock
TriggerIdentificador (matrícula/CPF) atinge 10+ falhas no portal (lockout de 60min)
Como testarFazer 10+ tentativas de login com matrícula/data errados no portal de uma escola.

2.4 Rate Limit OTP Aluno por Escola

CampoValor
Origemportal-escola/index.ts (handler login_aluno_b_send)
Prioridadehigh
Tagswarning, school
TriggerEscola atinge 100 OTPs de aluno em 15 minutos (possível abuso de SMS)
Como testarEnviar 100+ OTPs para alunos da mesma escola em 15 min (difícil em produção — testar reduzindo o limite temporariamente ou via script).

2.5 Rate Limit OTP Responsável por Escola

CampoValor
Origemportal-escola/index.ts (handler login_responsavel_send)
Prioridadehigh
Tagswarning, school
TriggerEscola atinge 100 OTPs de responsável em 15 minutos
Como testarMesmo cenário do 2.4 mas para responsáveis.

2.6 Token Revogado Reutilizado (Sistema)

CampoValor
Origem_shared/auth-helpers.ts (função extractAuthenticatedUser)
Prioridadeurgent
Tagsrotating_light, skull
TriggerJWT do sistema (olp_auth) com jti presente em token_blacklist tenta acesso
Como testarRevogar sessão de um usuário via banco (token_blacklist insert) > Tentar acessar com o cookie antigo.

2.7 Token Portal Revogado Reutilizado

CampoValor
Origem_shared/jwt-portal.ts (função verifyPortalToken)
Prioridadeurgent
Tagsrotating_light, skull
TriggerJWT do mural (olp_mural) com jti presente em token_blacklist tenta acesso
Como testarMesmo processo do 2.6 mas para token de portal.

2.8 CRON Crítico — Manutenção

CampoValor
Origemmaintenance-cron/index.ts (função escalarFalhaCron)
Prioridadeurgent
Tagsrotating_light, warning, skull
TriggerJob de manutenção falha 3+ vezes consecutivas
Como testarForçar falha persistente no CRON de manutenção > Trigger manual 3x.

2.9 CRON Crítico — Faturamento

CampoValor
Origemfaturamento-cron/index.ts (função escalarFalhaCron)
Prioridadeurgent
Tagsrotating_light, warning, skull
TriggerJob de faturamento falha 3+ vezes consecutivas
Como testarForçar falha no CRON de faturamento > Trigger manual 3x.

2.10 Sessão WhatsApp Desconectada

CampoValor
Origemmaintenance-cron/index.ts (função checkWhatsAppSession)
Prioridadehigh
Tagsmoney_with_wings, warning
TriggerSessão Wasender desconectada ou inativa
Canais extrasAlerta push ntfy para admins
Como testarDashboard Admin > CRON Monitor > Trigger manual maintenance-cron.

Resumo por Canal

CanalTotal de cenáriosDestinatário
In-app (notificacoes)10 cenáriosUsuários finais (gestores, diretores, admins, usuários convidados)
Push (ntfy.sh)10 cenáriosEquipe técnica/admin (celular/desktop)
WhatsApp (Wasender)8 cenáriosGestores de escola + admins (subconjunto dos in-app)

Tipos de Notificação (enum notification_type)

TipoCenáriosContexto
fatura_proxima1.1, 1.2Faturamento
fatura_vencidaReservado (não implementado)
pagamento_confirmado1.3, 1.4Pagamento
inscricaoReservado
resultadoReservado
mensagemReservado
sistema1.5, 1.6Administrativo
cron_falha1.9Operações
equipe_olp1.10Comunicação interna
solicitacao_vinculo1.7, 1.8Gestão de usuários

Fluxo de Entrega — In-App

Edge Function insere em `notificacoes`

Supabase Realtime (Postgres Changes)

useRealtimeNotificacoes (filter: usuario_id=eq.{userId})

notifications-panel.tsx (sino com badge)

notification-detail-modal.tsx (detalhe)

Tab Focus Management: Canais Realtime são desconectados após 5 min de inatividade em background e reconectados ao retornar foco.


Referências

  • supabase/functions/_shared/ntfy-helper.ts — Helper de alertas push
  • supabase/functions/_shared/sms-templates.ts — Templates de SMS
  • supabase/functions/_shared/wasender-whatsapp.ts — Envio de mensagens via WhatsApp (Wasender)
  • src/hooks/useRealtimeNotificacoes.ts — Listener Realtime
  • src/hooks/useNotificacoes.ts — CRUD de notificações
  • src/components/notifications-panel.tsx — UI do sino
  • docs/operations/ALERTAS_PUSH.md — Setup do ntfy.sh
  • docs/architecture/REALTIME.md — Arquitetura Realtime