Skip to content

Onboarding de Escolas — SSOT

Última atualização: 2026-04-16

Escopo: Fluxo completo de onboarding de uma escola na plataforma OLP, desde a geração do link de cadastro até a conclusão do onboarding administrativo.


Visão Geral

O onboarding é um processo de 9 etapas que leva uma escola do primeiro contato até a operação completa na plataforma:

text
Link de Cadastro → Formulário → Notificação Admin → Gestão Cadastro
→ Ativação Assinatura → Liberação de Acessos → Importação de Alunos
→ Criação de Turmas → Onboarding Completo

Etapas

Fluxo: Admin → Seção Escola → Gera token → Link limpo → Envia para escola

AspectoDetalhe
Edge Functioncadastro-escola-publica (action generate_link)
AuthextractAuthenticatedUser + principal_role === 'administrador'
Client SupabasecreateSupabaseSystem() (gera token sem RLS)
Componentesrc/components/admin-escola/
Tabelacadastro_tokens (tipo, token, escola_id, expira_em)
Rate Limit20 tokens/min por admin
Logcadastro.generate_link

Token: UUID v4, expira em 7 dias, uso único (usado = false).

Link gerado: https://olp.digital/cadastro/{token}


Etapa 2 — Formulário de Cadastro (Escola)

Fluxo: Escola recebe link → Valida token → Preenche dados → Envia → Token revogado → Cadastro criado

AspectoDetalhe
Edge Functioncadastro-escola-publica (actions validate_token, complete_signup)
AuthNenhuma (público)
Client SupabasecreateSupabaseSystem() (cadastro pré-auth)
Componentesrc/pages/cadastro/CadastroCompletoPage.tsx
Tabelasescolas, endereco_escola, cadastro_tokens
Rate Limit10 signups/hora por IP
Logescola.signup_create

Validações:

  • Unicidade de CNPJ e nome da escola (verificada antes do insert)
  • Token válido, não expirado, não usado
  • Dados obrigatórios: nome, CNPJ, telefone, email, tipo

Pós-cadastro:

  • Token marcado como usado = true
  • Escola criada com status = 'em_analise'
  • Endereço salvo em endereco_escola
  • Rollback parcial em caso de erro (delete escola + endereço)

Etapa 3 — Notificação ao Admin + Navegação

Fluxo: Admin recebe notificação → Navega para cadastro da escola

AspectoDetalhe
MecanismoNotificação push via ntfy (se configurado)
NavegaçãoAdmin → Lista de Escolas → Detalhes da escola recém-cadastrada
Status inicialEscola em em_analise

Etapa 4 — Gestão do Cadastro (Admin opera a escola)

Fluxo: Admin visualiza + edita dados institucionais → Ajustes de informação

AspectoDetalhe
Edge Functionadmin-escolas (actions get_details, update)
AuthrequireAdmin(req)
Componentesrc/components/admin-escola-detalhes.tsx
ValidaçãoUpdateEscolaSchema (Zod) — campos opcionais flexíveis para edição
State MachinevalidarTransicaoStatus() — transições válidas de status

Campos editáveis: nome, telefone, tipo, status, CNPJ, código INEP, rede/mantenedora, email, cidade, estado, endereço.

Erros Zod: Formatados como "campo: mensagem" em pt-BR (não vaza "Required" genérico).


Etapa 5 — Ativação da Assinatura

Fluxo: Admin cria assinatura (trial ou paga) → Auto-ativação da escola → Skeleton de faturas gerado

AspectoDetalhe
Edge Functionadmin-escola-dados (action create_assinatura)
Edge Function alt.admin-assinaturas (actions create, convert_trial_to_paid)
AuthrequireAdmin(req)
Componentesrc/components/admin-escola/ativar-plano-modal.tsx
ValidaçãoCreateAssinaturaSchema (Zod)
Tabelasescola_assinaturas, escola_faturas, planos, escolas

Schema de validação (CreateAssinaturaSchema):

  • escola_id, plano_id — UUIDs obrigatórios
  • status_assinatura'ativa' ou 'trial'
  • alunos_contratados — mínimo 1
  • dia_vencimento — 1 a 28 (default 10)
  • mes_inicio — formato YYYY-MM, deve ser posterior ao mês atual
  • data_fim_contrato — formato YYYY-MM, >= mes_inicio
  • valor_personalizado — opcional, override do cálculo automático
  • renovacao_automatica — boolean (default true)

Fórmula de valor:

valor_atual = preco_mensal + (alunos_contratados × valor_por_aluno_extra)

Override possível com valor_personalizado.

Geração de faturas (skeleton):

  • Faturas geradas para cada mês do range [mes_inicio, data_fim_contrato]
  • Status: pendente, sem link_pagamento (skeleton)
  • Vencimento: dia_vencimento de cada mês
  • O cron faturamento-cron completa os skeletons com link MP + WhatsApp

Auto-ativação:

  • Se status_assinatura = 'ativa' e escola está em_analise → escola.status = ativa
  • Regra conservadora: só ativa escolas em em_analise

Log: assinatura.create


Etapa 6 — Liberação de Acessos

Fluxo: Admin cria usuários da escola → Atribui papéis → Usuários conseguem fazer login

AspectoDetalhe
Edge Functionadmin-usuarios (actions create, update)
Edge Function alt.admin-usuarios-escola
AuthrequireAdmin(req)
Tabelasusuarios, usuario_papeis, usuarios_escola_permissoes
Loginsend-otpverify-otp → JWT → cookie olp_auth

Papéis criáveis: escola (gestor), coordenador, diretor.

Seed de permissões: Ao criar coordenador/diretor, permissões padrão são semeadas automaticamente.


Etapa 7 — Importação em Massa de Alunos ⚠️ CRÍTICO

Fluxo: Admin ou coordenador importa alunos via planilha → Parsing, validação, deduplicação, inserção bulk

AspectoDetalhe
Edge Functiongestao-alunos (actions start_import_session, get_import_session_status)
ComponenteWizard de importação com sessionId em localStorage
ProcessamentoBackground via EdgeRuntime.waitUntil, batches de 50
ValidaçãoZero-trust server-side, safeExtractValue() para ExcelJS
Tabelasalunos, importacao_alunos_sessoes

Ref: docs/development/IMPORT_SYSTEM_STANDARD.md


Etapa 8 — Criação de Turmas e Vínculos ⚠️ CRÍTICO

Fluxo: Criação de turmas → Vinculação de alunos → Cruzamento com olimpíadas ativas

AspectoDetalhe
Edge Functiongestao-turmas (actions create, create_batch)
Tabelasturmas, alunos (turma_id)
MatchingAlunos vinculados a turmas por série/ano

Etapa 9 — Onboarding Completo

Fluxo: Admin marca checkpoints do onboarding

Checkpoints:

  1. ✅ Onboarding inicial (dados da escola completos)
  2. ✅ Configuração da plataforma
  3. ✅ Ativação de assinatura
  4. ✅ Liberação de acessos (usuários criados)
  5. ✅ Importação de alunos
  6. ✅ Onboarding completo (overview + direcionamentos)

Ciclo Contratual e Métricas

Visualização por Ano

Edge Function: admin-faturas (action get_ciclo_contratual)

Parâmetros: escola_id, ano (opcional — default: ano corrente)

Retorno:

  • faturas — lista de faturas do ano filtrado
  • metricas — cálculos do ano: total_faturas, pagas, pendentes, valor_total, valor_pago, valor_pendente, taxa_adimplencia
  • metricas_gerais — cálculos de todo o contrato (sem filtro de ano): total, pagas, pendentes, valor_total, valor_pago, valor_pendente, taxa_adimplencia
  • assinatura — dados da assinatura ativa
  • plano — dados do plano
  • anos_disponiveis — lista de anos com faturas

Resumo Geral do Contrato

O metricas_gerais é independente do filtro de ano no frontend. Ao trocar de ano, apenas a seção superior (métricas por ano + timeline) recarrega — o resumo geral permanece estável.


Edge Functions Envolvidas

Edge FunctionEtapasActions Relevantes
cadastro-escola-publica1, 2generate_link, validate_token, complete_signup, trial_create
admin-escolas4get_details, update, create, soft_delete
admin-escola-dados5create_assinatura, get_details, get_dashboard
admin-assinaturas5create, convert_trial_to_paid, update
admin-faturas5list, get_ciclo_contratual, update_status
admin-usuarios6create, update
gestao-alunos7start_import_session, create
gestao-turmas8create, create_batch

Componentes Frontend

ComponenteEtapaDescrição
admin-escola-detalhes.tsx4, 5, 6Tela principal de detalhes da escola (tabs)
ativar-plano-modal.tsx5Modal de criação de assinatura com range de faturas
ciclo-contratual-dashboard.tsx5Dashboard do ciclo contratual (métricas + timeline)
CadastroCompletoPage.tsx2Formulário público de cadastro

Schemas Zod

SchemaArquivoUso
CreateEscolaSchemaadmin-escola-schemas.tsCriação de escola (admin-escolas)
UpdateEscolaSchemaadmin-escola-schemas.tsEdição de dados institucionais
ToggleStatusSchemaadmin-escola-schemas.tsAlteração de status com state machine
CreateAssinaturaSchemaadmin-escola-schemas.tsCriação de assinatura (admin-escola-dados)

Dívida Técnica

ItemSeveridadeStatus
cadastro-escola-publica sem Zod (806 linhas)🟡 MédiaPendente — validação manual funcional
admin-escola-dados (656 linhas)🟡 MédiaPendente — code split futuro
admin-escolas (870 linhas)🟡 MédiaPendente — code split futuro
admin-faturas (980 linhas)🟡 MédiaPendente — code split futuro
admin-escola-detalhes.tsx (1554 linhas)🔴 AltaPendente — extrair tabs em subcomponentes

Referências