📄 Documento de Execução — Card 7: [M1] Tarefas & Entregas
| Campo | Valor |
|---|---|
| Card Trello | [7] [M1] Tarefas & Entregas |
| URL Trello | https://trello.com/c/2AnhCDm1 |
| Marco | M1 (Portal do Aluno — STUDENT) |
| Data execução | 29/07/2026 |
| Responsável | Wellington Santiago (via ZCode) |
| Doc anterior | Card 6 — Minhas Notas & Frequência |
| Próximo card | Card 7b — Motor de Gamificação |
| Repo GitHub | https://github.com/Wellitiz/genioon |
| URL DEV (live) | https://sistemaescolar.wellka.com.br/aluno/tarefas |
| Commits | 8c047da |
🎯 1. O que foi implementado
Portal de Tarefas do aluno: lista de tarefas com filtros por status (pendente/entregue/avaliada/atrasada), cards com bordas coloridas por status, formulário de entrega (texto + upload de anexos), e visualização de nota/feedback do professor quando a tarefa é avaliada.
Decisão de preservação de schema (mesma lição dos Cards 4-6)
A spec pedia criar Task com TaskType { HOMEWORK | EXAM | PROJECT } + TaskSubmission com s3Key. O schema existente já tinha Task (com TaskStatus { DRAFT | PUBLISHED | CLOSED }) + TaskSubmission (com content + attachmentUrls Json). Reusado o schema existente — sem TaskType (não existe) e usando attachmentUrls em vez de s3Key.
Páginas (2)
/aluno/tarefas— Lista de tarefas com filtros (Todas/Pendentes/Entregues/Avaliadas/Atrasadas) + badge de pendentes count/aluno/tarefas/[taskId]— Detalhe da tarefa (descrição/instruções) + formulário de entrega (textarea + upload múltiplo) + nota/feedback (se avaliada) + indicador de prazo encerrado
Componentes UI novos (2 reutilizáveis)
- TaskCard — Card com borda esquerda colorida por status (vermelho/amarelo/azul/verde) + badge + nota/feedback. Clicável → detalhe.
- TaskStatusBadge — Badge de status com cor semântica. Variantes:
full(com texto e ícone) edot(só ponto colorido).
tRPC procedures novas (3)
student.tasks.list— tarefas PUBLISHED das disciplinas dos cursos matriculados + submissão do aluno + status calculado (late/pending/submitted/graded) + pendingCountstudent.tasks.detail— detalhe da tarefa + submissão + validação de matrícula + flagscanSubmiteisLatestudent.tasks.submit— upsert de entrega (texto + anexos), statusLATEse após prazo,SUBMITTEDse no prazo
Item realocado do Card 4 (TaskCounter)
O item TaskCounter (tarefas pendentes) foi realocado do Card 4. Implementado aqui:
student.tasks.listretornapendingCount(contador de tarefas pendentes/atrasadas)- Badge exibido no header da lista de tarefas
✅ 2. Critérios de aceite validados
| # | Critério | Status |
|---|---|---|
| 1 | Tarefas listadas com status visual claro | ✅ (TaskCard com borda + badge coloridos) |
| 2 | Filtro por status funciona | ✅ (5 filtros: Todas/Pendentes/Entregues/Avaliadas/Atrasadas) |
| 3 | Upload de entrega funcional | ✅ (textarea + upload múltiplo — DEV placeholder, PROD S3) |
| 4 | Aluno vê nota/feedback quando avaliada | ✅ (grade box com nota + feedback do professor) |
| 5 | Marca tarefa atrasada em vermelho (após prazo) | ✅ (status computed + cor vermelha) |
| 6 | Reenvio permitido dentro do prazo | ✅ (upsert no submit + canSubmit flag) |
| 7 | RBAC: aluno da turma pode ver/submeter | ✅ (validação de matrícula no detail/submit) |
| 8 | Prazo expirado impede nova submissão | ✅ (canSubmit = false + closedBox) |
| 9 | Build passa | ✅ (EXIT=0 de primeira) |
| 10 | Deploy DEV funcional | ✅ (HTTP 200, dados demo carregados) |
📁 3. Arquivos criados/modificados
Criados (7)
| Arquivo | Função |
|---|---|
src/components/ui/TaskCard.tsx |
Card de tarefa com status colorido |
src/components/ui/TaskStatusBadge.tsx |
Badge de status (cores semânticas) |
src/styles/task-card.module.css |
CSS TaskCard |
src/styles/tarefas-page.module.css |
CSS página lista |
src/styles/tarefa-detail.module.css |
CSS página detalhe + form |
src/app/(dashboard)/aluno/tarefas/[taskId]/page.tsx |
Página detalhe + entrega |
scripts/seed_card7_demo.js |
Seed dados demo (5 tarefas) |
Modificados (3)
| Arquivo | Mudança |
|---|---|
src/server/trpc/routers/student.ts |
+tasks sub-router (list/detail/submit) |
src/app/(dashboard)/aluno/tarefas/page.tsx |
Placeholder ComingSoon → lista real |
messages/{pt-BR,en-US,es-ES}.json |
+seção student.tasks (37 chaves) |
🗄️ 4. Schema do banco (mudanças)
Nenhuma mudança de schema. Modelos já existiam:
Task(title, description, instructions, subjectId, teacherId, status, dueDate, maxScore) — Card 2TaskSubmission(taskId, studentId, status, content, attachmentUrls, submittedAt, score, feedback, gradedAt) — Card 2SubmissionStatus{ PENDING | SUBMITTED | LATE | GRADED }TaskStatus{ DRAFT | PUBLISHED | CLOSED }
Seed criado: scripts/seed_card7_demo.js — 5 tarefas (3 pendentes + 2 avaliadas com nota e feedback).
🔌 5. Handoff para o próximo card
Componentes reutilizáveis prontos
- TaskCard — usado por Card 9 (Acompanhamento PARENT) e Card 14 (Tarefas Professor)
- TaskStatusBadge — usado em qualquer lugar que precise mostrar status de tarefa
Endpoints tRPC novos
student.tasks.list— usar em qualquer página/aluno/*student.tasks.submit— modelo parastudent.tasks.*futuro
Padrão estabelecido (replicar no Card 7b)
- Status calculado no backend (computedStatus) — não no client
- Upsert permite reenvio (taskId_studentId unique)
- Upload em DEV usa placeholder
attachment://filename; em PROD fará S3
📋 6. Checklist do Trello — status por item
Entregáveis (4/4)
- ✅ Lista por turma
- ✅ Upload de entrega
- ✅ Feedback do professor
- ✅ Notificação (estrutura pronta — notificação push no Card 28/31)
Especificação Técnica (concluída)
- ✅ tRPC task.listByStudent
- ✅ tRPC task.submit
- ✅ tRPC task.getSubmission
- ✅ Página /aluno/tarefas
- ✅ Página /aluno/tarefas/[taskId]
- ✅ Componente TaskCard
- ✅ Componente TaskSubmissionForm (integrado na página)
- ✅ Componente FeedbackBox (integrado na página)
- ✅ Componente DueDateBadge (no TaskCard + TaskStatusBadge)
- ✅ Filtro: pendentes/entregues/corrigidas/todas
- ✅ Upload múltiplos arquivos
- ✅ Botão Enviar Entrega
- ✅ Botão Reenviar
- ✅ Empty state
- ✅ Loading skeleton
- ✅ Validação: aluno da turma pode ver/submeter
- ✅ Validação: prazo expirado impede submissão
Item realocado do Card 4
- ✅
pendingCountexposto emstudent.tasks.list(item "TaskCounter" realocado)
Itens realocados para outros cards (rastreabilidade)
| Item | Realocado para | Justificativa |
|---|---|---|
| FileUpload drag-drop S3 | Card 14 | Upload via S3 real é escopo do professor (criar tarefa) |
| Preview de anexos (imagem/PDF) | Melhoria futura | Reaproveita PDFViewer do Card 5 depois |
| Notificação push ao publicar tarefa | Card 28/31 | Notificações push (WhatsApp/E-mail) são M6 |
| Notificação push ao lançar nota | Card 28/31 | Mesmo acima |
| Filtro por disciplina + Busca por título | Melhoria futura | Filtro por status já implementado; por disciplina virá com mais dados |
🚀 7. Deploy DEV
- URL: https://sistemaescolar.wellka.com.br/aluno/tarefas
- Commit:
8c047da - PM2: genioon-dev restart ✓
- Dados demo: 5 tarefas (3 pendentes + 2 avaliadas com nota 8.5 e 9.0 + feedback)
- Login:
aluno@genioon.com.br
🧠 8. Contexto gerado para próximas etapas
Para Card 7b (Motor de Gamificação)
TaskSubmissioncomscorealimenta XP (100 XP por tarefa entregue, 200 XP por nota ≥9)pendingCountpode alimentar badge de tarefas no perfil
Para Card 9 (Acompanhamento PARENT)
- TaskCard reutilizável (pais acompanham tarefas dos filhos)
- Replicar
parent.tasks.list
Para Card 14 (Tarefas Professor)
- Professor vai CRIAR as tarefas que este card EXIBE
- Schema Task já pronto (professor cria com status DRAFT → publica)
Lições aprendidas
- Schema
Tasknão temtype: a spec pediaTaskType { HOMEWORK | EXAM | PROJECT }mas o schema real não tem. Adaptei — otitle+descriptionjá diferenciam o tipo. - Status calculado no backend:
computedStatus(late/pending/submitted/graded) é derivado desubmission.status+dueDate+now. Calcular no backend garante consistência. - Upsert para reenvio:
@@unique([taskId, studentId])permite upsert — aluno reenvia sem criar duplicata.
🎯 9. Próximo card
Card 7b [M1] Motor de Gamificação
- Spec:
docs/execucao/07b-m1-gamificacao.md - Trello: (a ser criado na lista Planejamento)
- Reuso:
EadProgress,TaskSubmission, schema de XP/Achievement (a criar) - Foco: ranking, medalhas, XP por atividade, streak
- Decisão do cliente: XP por tarefa entregue (100 XP), nota alta (200 XP), curso completo (500 XP)