📄 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
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.
attendance({ studentId, limit? }) — frequência: % por disciplina (AttendanceBar), frequência geral, total de faltas, histórico detalhado (status + justificativa vinculada).
tasks({ studentId }) — tarefas do filho: pendentes/entregues/avaliadas (com score + feedback).
justifyAbsence({ attendanceId, reason, certificateUrl? }) — mutation: cria AttendanceJustification (status PENDING). Validações: vínculo Guardian, só ABSENT/LATE, sem duplicata, prazo 3 dias.
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
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