Entrar como:FuncionalidadesDoc
Pular para o conteúdo
← Voltar para a visão geral
✅ ConcluídoCard #49 · M9

NPS (Pesquisa de Satisfação 0-10)

Marco M9: Experiência & Qualidade (SULTS-inspired)

👤Wellington Santiago (via ZCode)

✅ 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 models
  • src/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.toggleActive
  • dashboard (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 dias
  • nps-post-ticket: Após Ticket RESOLVED → agenda NPS para +1 dia
  • nps-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

  1. MASTER cria NPS surveys com 4 triggers (pós-matrícula, pós-ticket, periódico, manual)
  2. Widget 1-click aparece na Home quando há NPS pendente
  3. Cálculo NPS oficial: %Promotores − %Detratores
  4. Dashboards com evolução, ranking, segmentação
  5. Alerta automático <50 (notifica MASTER)
  6. Export CSV das respostas
  7. Build passa + lint OK

🔌 Handoff

  • Jobs nps-* plugados no bootstrap.ts
  • Procedures master.nps reutilizáveis em dashboards do Card 22 (Master)

🎯 Próximo

Card 50: NES (Scorecard Emocional Preditivo)

← Voltar para a visão geral