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

Acompanhamento Pedagógico

Marco M2: Portal da Família (PARENT · PWA)

📅02 de agosto de 2026
👤Wellington Santiago (via ZCode)
🔧Commits: 0677576

📄 Documento de Execução — Card 9: [M2] Acompanhamento Pedagógico

Campo Valor
Card Trello [9] [M2] Acompanhamento Pedagógico
URL Trello https://trello.com/c/4XWkpucm
Marco M2 — Portal da Família
Data execução 03/08/2026
Responsável Wellington Santiago (via ZCode)
Doc anterior Card 8: Home da Família
Próximo card Card 10: Financeiro - PIX & Boletos
Commit 0677576

🎯 1. O que foi implementado

Acompanhamento pedagógico completo do filho pelo responsável: boletim (notas por disciplina x período), gráfico de evolução, frequência por disciplina e histórico detalhado de presença com justificativa de faltas. As páginas /pais/notas e /pais/faltas (antes mockadas) agora renderizam dados reais via tRPC.

5 procedures tRPC em parent.academic

  1. grades({ studentId, year? }) — boletim: notas agrupadas por disciplina x período, média ponderada por disciplina, média geral, evolução por período (p/ LineChart). Threshold 7.0.
  2. attendance({ studentId, limit? }) — frequência: % por disciplina (AttendanceBar), frequência geral, total de faltas, histórico detalhado (status + justificativa vinculada).
  3. tasks({ studentId }) — tarefas do filho: pendentes/entregues/avaliadas (com score + feedback).
  4. justifyAbsence({ attendanceId, reason, certificateUrl? }) — mutation: cria AttendanceJustification (status PENDING). Validações: vínculo Guardian, só ABSENT/LATE, sem duplicata, prazo 3 dias.
  5. justifications({ studentId }) — lista de justificativas com status (PENDING/APPROVED/REJECTED) e dados de revisão.

Páginas reescritas

  • /pais/notas: média geral destacada (cor por faixa) + alerta se <7.0 + EvolutionChart (Recharts) + GradeTable (disciplina x período, numérico + conceito).
  • /pais/faltas: frequência geral + por disciplina (AttendanceBar) + histórico detalhado + modal de justificativa (motivo + atestado facultativo).

Decisões do cliente aplicadas (7/7 já respondidas)

Decisão Aplicação
Frequência mínima 75% MIN_ATTENDANCE = 75, alerta visual se abaixo
Prazo 3 dias para justificar canJustify() checa diffDays <= 3
Atestado facultativo ✅ campo certificateUrl opcional no modal
Coordenador Pedagógico aprova ✅ status PENDING default, só LOCAL aprova (Card 18)
Pai vê comentários do professor feedback da TaskSubmission exposto
Pai recebe notificação de falta ✅ via push (infra pronta do Card 8, envio no Card 11)
Conceito A-E tem legenda ✅ exibido junto com valor numérico (sistema AMBOS)

validateGuardianLink helper

Função genérica que valida vínculo StudentGuardian antes de qualquer query. Usada em todas as 5 procedures do academic + justifyAbsence. Lança FORBIDDEN se não houver vínculo.

✅ Critérios de aceite validados

# Critério Status
1 Responsável alterna entre filhos
2 Notas em numérico + conceito
3 Média geral calculada e destacada (alerta <7.0)
4 Frequência em % e faltas absolutas
5 Alerta visual se frequência <75%
6 Tarefas do filho com status ✅ (procedure pronta)
7 Acesso só a filhos vinculados
8 Build passa + lint OK

Validação real (03/08/2026)

/pais/notas: Média 8.4 (acima de 7), 3 disciplinas Aprovadas, EvolutionChart renderizado
/pais/faltas: Frequência 90%, 2 faltas, histórico com 20 registros, 1 atraso

📁 2. Arquivos criados/modificados

Criados

Arquivo Função

Modificados

Arquivo Mudança
src/server/trpc/routers/parent.ts +sub-router academic (5 procedures) + helper validateGuardianLink
src/app/(dashboard)/pais/notas/page.tsx Reescrita: mock → dados reais (GradeTable + EvolutionChart)
src/app/(dashboard)/pais/faltas/page.tsx Reescrita: mock → dados reais (AttendanceBar + histórico + modal justificar)
messages/{pt-BR,en-US,es-ES}.json +seção parent.academic (44 chaves)

🗄️ 3. Schema do banco (mudanças)

Nenhuma. Reutiliza: Grade, Attendance, AttendanceJustification, Task, TaskSubmission, StudentGuardian.


🔌 4. Handoff para o próximo card

API pública (tRPC)

  • parent.academic.grades({ studentId, year? }){ subjects, generalAvg, evolution, approvalThreshold, year }
  • parent.academic.attendance({ studentId, limit? }){ subjects, overallPct, totalAbsences, recentHistory, minAttendance }
  • parent.academic.tasks({ studentId }){ tasks, pendingCount }
  • parent.academic.justifyAbsence({ attendanceId, reason, certificateUrl? }){ justification } (mutation)
  • parent.academic.justifications({ studentId }){ justifications }

Componentes reutilizáveis

  • GradeTable + EvolutionChart + AttendanceBar + GradeCell (do Card 6) — read-only para PARENT
  • Modal + Input + Button + Badge + Toast — usados no modal de justificativa

Triggers para próximos cards

  • Card 13 (Chamada Digital): quando professor registra falta, dispara push notification para o PARENT (infra pronta do Card 8).
  • Card 18 (Gestão de Alunos): LOCAL/MASTER aprova/rejeita justificativa → muda status PENDING→APPROVED/REJECTED.
  • Card 10 (Financeiro): pode reusar o padrão validateGuardianLink para validação de vínculo.

📋 5. Deploy DEV


🎯 6. Próximo card

Card 10 [M2] Financeiro - PIX & Boletos

  • Spec: docs/execucao/10-m2-financeiro-pix.md
  • Foco: gateway de pagamento (PIX/boleto), TuitionCard já aponta para /pais/financeiro
  • Reuso: validateGuardianLink para RBAC, Payment model já existe
← Voltar para a visão geral