📄 Documento de Execução — Card 14: [M3] Tarefas & Avaliações
| Campo | Valor |
|---|---|
| Card Trello | [14] [M3] Tarefas & Avaliações |
| URL Trello | https://trello.com/c/ESXkb3of |
| Marco | M3 — Painel do Professor |
| Data execução | 05/08/2026 |
| Responsável | Wellington Santiago (via ZCode) |
| Doc anterior | Card 13: Chamada Digital (M3) |
| Próximo card | Card 15: Plano de Aula & Materiais (M3) |
| Commits | c9b6ccd |
🎯 1. O que foi implementado
Substituído o protótipo mock da página /professor/tarefas (com tarefas hardcoded e modal que não persistia) por uma implementação real e completa do painel de Tarefas do professor, conectada ao banco via tRPC.
O professor agora pode criar tarefas (título, descrição, instruções detalhadas, prazo, nota máxima, anexos via upload real), revisar como rascunho (DRAFT), publicar (notifica todos os alunos matriculados), fechar (PUBLISHED → CLOSED, não aceita mais entregas), e avaliar entregas (nota + feedback + flag "permitir refazer") com o GradingModal.
A página de detalhe lista todas as entregas com status (Pendente/Entregue/Atrasada/Corrigida), número da tentativa (para tarefas refeitas do M1.5), nota atribuída, e botão "Corrigir"/"Rever". Ao avaliar, o aluno recebe notificação automática com a nota e feedback.
Também foram criados procedures professor.exam (criar/listar/publicar provas com 4 tipos de questão: MC/ESSAY/TRUE_FALSE/MIXED). O ExamBuilder completo (editor visual de questões + auto-correção MC/TF) fica como refinamento futuro — o schema Exam.questions é Json flexível e já suporta a estrutura.
✅ Critérios de aceite validados
| # | Critério | Status |
|---|---|---|
| 1 | Criar tarefa para turma | ✅ |
| 2 | Definir prazo e peso (nota máx) | ✅ |
| 3 | Receber entregas (Card 7 já entrega) | ✅ |
| 4 | Lançar feedback/nota (GradingModal) | ✅ |
| 5 | Notificar alunos (publish + grade) | ✅ |
| 6 | Rota tRPC task.create | ✅ |
| 7 | Rota tRPC task.publish (DRAFT→PUBLISHED) | ✅ |
| 8 | Rota tRPC task.close (PUBLISHED→CLOSED) | ✅ |
| 9 | Rota tRPC task.detail (lista submissions) | ✅ |
| 10 | Rota tRPC task.grade (score + feedback) | ✅ |
| 11 | Rota tRPC exam.create / publish | ✅ |
| 12 | Página /professor/tarefas (lista) | ✅ |
| 13 | Página /professor/tarefas/nova (criar) | ✅ |
| 14 | Página /professor/tarefas/[id] (detalhe + submissions) | ✅ |
| 15 | Componente GradingModal (nota + feedback) | ✅ |
| 16 | Upload de anexos (via /api/upload) | ✅ |
| 17 | Auditoria: logar CREATE/UPDATE/PUBLISH | ✅ |
| 18 | Validação: professor só em disciplinas atribuídas | ✅ |
| 19 | Filtros por status (Todas/Rascunho/Aberta/Fechada) | ✅ |
| 20 | allowResubmit (permitir refazer) | ✅ |
📁 2. Arquivos criados/modificados
Criados
| Arquivo | Função |
|---|---|
src/app/(dashboard)/professor/tarefas/nova/page.tsx |
Form de criação de tarefa (DRAFT) com upload de anexos |
src/app/(dashboard)/professor/tarefas/[id]/page.tsx |
Detalhe da tarefa + lista de entregas + GradingModal inline |
Modificados
| Arquivo | Mudança |
|---|---|
src/server/trpc/routers/professor.ts |
+sub-router task (7 procedures) + sub-router exam (3 procedures) |
src/app/(dashboard)/professor/tarefas/page.tsx |
Reescrita total: removeu mock, agora lista tarefas reais com filtros |
🗄️ 3. Schema do banco (mudanças)
Nenhuma mudança de schema — reutilizado:
Task(status DRAFT/PUBLISHED/CLOSED, dueDate, maxScore, attachmentUrls Json, instructions)TaskSubmission(status PENDING/SUBMITTED/LATE/GRADED, score, feedback, attemptNumber, allowResubmit)Exam(type MULTIPLE_CHOICE/ESSAY/TRUE_FALSE/MIXED, questions Json, duration, shuffleQuestions, showResults, availableFrom/Until)ClassTeacher(validação de acesso)
🔌 4. Handoff para o próximo card
Procedures tRPC disponíveis (professor.task.*)
list({status?, classId?})→{ tasks: [{ id, title, status, dueDate, _count.submissions, subject }] }detail({taskId})→{ task, submissions[], totalStudents }create({title, description?, instructions?, subjectId, dueDate?, maxScore, attachmentUrls[]})→{id}update({taskId, ...})→{id}(somente se DRAFT)publish({taskId})→{notified}(DRAFT→PUBLISHED + notifica alunos)close({taskId})→{ok}(PUBLISHED→CLOSED)grade({submissionId, score, feedback?, allowResubmit?})→{ok}(status GRADED + notifica aluno)
Procedures (professor.exam.*)
list({published?})→{ exams[] }create({title, type, subjectId, duration?, questions[], ...})→{id}publish({examId})→{notified}
Defaults adotados (confirmar com cliente — em decisoes.md)
| # | Pendência | Default adotado |
|---|---|---|
| 1 | Tipos de questão | ✅ Todos: MC + TF + ESSAY + MIXED (enum ExamType já tem) |
| 2 | Timer da prova | ⏳ duration (minutos) existe no schema; bloqueio automático fica para o ExamBuilder |
| 3 | Embaralhar questões | ✅ shuffleQuestions default false (campo existe) |
| 4 | Resultados ao aluno | ✅ showResults default false (mostra só após prazo) |
| 5 | Tentativas por prova | ⏳ Default 1 (não há campo attempts no schema ainda) |
| 6 | Anti-cola (bloquear aba) | ⏳ Não implementado (complexidade alta de browser) |
| 7 | Avaliações por bimestre | ⏳ Sem limite (professor cria quantas precisar) |
📋 5. Checklist do Trello — status por item
Entregas (5/5)
- Criar tarefa para turma
- Definir prazo e peso
- Receber entregas
- Lançar feedback/nota
- Notificar alunos
Especificação Técnica (20/30 implementados)
Não implementados nesta iteração (refinamento futuro):
- ExamBuilder completo (editor visual de questões MC/TF/ESSAY + alternativas + gabarito) — o procedure
exam.createaceitaquestions[]como Json, falta a UI de montagem - Auto-correção MC/TF (calcula score automático comparando com gabarito)
- Páginas dedicadas
/professor/provas/*(provas são criadas via API; UI fica para quando o ExamBuilder estiver pronto) - Job Bull de notificação (atualmente notificação síncrona no DB)
- Socket.io live (nova tarefa em tempo real)
- S3 signed URL para anexos (atualmente
/api/uploadlocal para DEV)
🚀 6. Deploy DEV
- URL lista: https://sistemaescolar.wellka.com.br/professor/tarefas
- URL criar: https://sistemaescolar.wellka.com.br/professor/tarefas/nova
- Login demo:
carla.prof@genioon.com.br/Prof@2026 - Profª Carla: 3 tarefas publicadas (do seed), com 2 entregas para corrigir
- Commit:
c9b6ccd - PM2: genioon-dev reload ✓ (HTTP 307 auth / 200 smoke)
🧠 7. Contexto gerado para próximas etapas
professor.task.gradeé o procedure canônico de avaliação. Quando integrar correção visual (M1.5saveVisualCorrection), ambos atualizamTaskSubmission— coordenar campos.allowResubmitna avaliação abre nova tentativa para o aluno (tentativa N+1). Já integrado com o Card 7 (aluno reenvia) e M1.5 (galeria).- Notificação de nota (
task.grade) usatype: 'SYSTEM_ALERT'. Quando Web Push estiver pronto, disparar push também. - ExamBuilder é a próxima Feature grande dentro de M3: editor de questões com 4 tipos + auto-correção. O schema e procedures já suportam; falta a UI.
- Anexos via
/api/upload(FormData → /public/uploads/). Para PROD, migrar para S3 presigned URL.
🎯 8. Próximo card
Card 15 [M3] Plano de Aula & Materiais
- Spec:
docs/execucao/15-m3-plano-aula.md - Foco: professor cria planos de aula (LessonPlan) e sobe materiais didáticos
- Reuso:
ProfessorShell,resolveTeacher(),ClassTeacher, upload de anexos