✅ EXECUÇÃO — 15/08/2026
Implementado e validado em produção (homolog). Commits: 2062f6c (fundação: 21 tabelas), 080c857 (features), bbfa277 (lint). Deploy CI verde.
Validação ao vivo: página(s) da feature respondendo 200 com a role correta + procedures tRPC testadas via HTTP (respostas JSON corretas). Ver relatório da sessão.
Detalhes de implementação e decisões: conforme o design acima deste documento (schema, procedures e páginas seguidos conforme especificado; ajustes menores documentados no commit).
📄 Card 49 [M9] — NPS (Pesquisa de Satisfação 0-10)
📚 Referência SULTS: https://www.sults.com.br/produtos/nps Mede satisfação na escala oficial 0-10 (detratores/neutros/promotores), com disparos automáticos por evento, dashboards por unidade e ranking Top 10. 🔥 Cliente pediu explicitamente (decisoes.md §IA: "Gostaria de criar uma NPS legal").
🎯 Objetivo
Criar o módulo NPS — pesquisa de satisfação para pais/alunos/colaboradores com:
- Escala 0-10 oficial (Detratores 0-6, Neutros 7-8, Promotores 9-10)
- Disparos automáticos por evento:
- Após matrícula (30/60/90 dias)
- Após resolução de chamado (Card 46)
- Periódico (trimestral para todos)
- Após evento (aula experimental, visita guiada)
- Cálculo NPS = %Promotores − %Detratores
- Dashboards: evolução temporal, ranking Top 10 unidades, segmentação
- Alerta automático se <50 (problema estrutural); saudável >70
📚 Documentação de Referência
docs/DESIGN_SYSTEM.md§6 (Recharts para dashboards)prisma/schema.prisma— novos modelssrc/server/queues/— Job Bull para disparos automáticos
🛠️ Especificação Técnica
Schema Prisma (novo)
model NpsSurvey {
id String @id @default(cuid())
name String // "NPS Pós-Matrícula 30d"
trigger NpsTrigger // POST_ENROLLMENT, POST_TICKET, PERIODIC, POST_EVENT
triggerConfig Json // {daysAfter: 30} ou {periodDays: 90}
question String // "Qual a probabilidade de recomendar?"
targetRoles String[]
targetScope NewsScope // reusa enum Card 44
branches String[]
isActive Boolean @default(true)
responses NpsResponse[]
createdAt DateTime @default(now())
}
model NpsResponse {
id String @id @default(cuid())
surveyId String
survey NpsSurvey @relation(fields: [surveyId], references: [id])
respondentId String
respondent User @relation(fields: [respondentId], references: [id])
score Int // 0-10
category NpsCategory // DETRACTOR, PASSIVE, PROMOTER
comment String?
branchId String? // contexto da resposta
branch Branch? @relation(fields: [branchId], references: [id])
submittedAt DateTime @default(now())
}
enum NpsTrigger { POST_ENROLLMENT POST_TICKET PERIODIC POST_EVENT MANUAL }
enum NpsCategory { DETRACTOR PASSIVE PROMOTER }
Rotas (page.tsx)
/master/nps— painel admin (CRUD surveys + dashboards)/master/nps/[surveyId]— detalhe (evolução + ranking + segmentação)- Componente
<NpsWidget />— aparece na Home do respondente (modal 1-click)
Procedures tRPC (master.nps)
surveys.list/surveys.create/surveys.update/surveys.toggleActivedashboard(agregado: NPS global, evolução, ranking filiais, segmentação)pendingForUser(verifica se há NPS a responder)submit(registra resposta + calcula category)exportCsv
Triggers automáticos (Job Bull)
nps-post-enrollment: Job monitora Enrollment createdAt → agenda NPS para +30/+60/+90 diasnps-post-ticket: Após Ticket RESOLVED → agenda NPS para +1 dianps-periodic: Cron trimestral → dispara NPS para todos os roles ativos- Cada job chama
notifyUser(in-app + email + push)
Dashboard (Recharts)
- LineChart evolução temporal (NPS por mês)
- BarChart distribuição Detratores/Neutros/Promotores
- Ranking Top 10 filiais (melhores e piores)
- PieChart segmentação por role
- Big number: NPS atual (cor: vermelho <0, amarelo 0-50, verde 50-70, azul >70)
✅ Critérios de Aceite
- MASTER cria NPS surveys com 4 triggers (pós-matrícula, pós-ticket, periódico, manual)
- Widget 1-click aparece na Home quando há NPS pendente
- Cálculo NPS oficial: %Promotores − %Detratores
- Dashboards com evolução, ranking, segmentação
- Alerta automático <50 (notifica MASTER)
- Export CSV das respostas
- Build passa + lint OK
🔌 Handoff
- Jobs
nps-*plugados no bootstrap.ts - Procedures
master.npsreutilizáveis em dashboards do Card 22 (Master)
🎯 Próximo
Card 50: NES (Scorecard Emocional Preditivo)