📄 Documento de Execução — Card 19: [M4] Gestão de Turmas & Grade
| Campo | Valor |
|---|---|
| Card Trello | [19] [M4] Gestão de Turmas & Grade |
| URL Trello | https://trello.com/c/X5cHTLCA |
| Marco | M4 — Painel Direção/Unidade LOCAL |
| Data execução | 04/08/2026 |
| Responsável | Wellington Santiago (via ZCode) |
| Doc anterior | Card 18: Gestão de Alunos & Matrículas |
| Próximo card | Card 20: Financeiro da Unidade |
| Commits | 0889fd7 |
🎯 1. O que foi implementado
O Card 19 entrega a gestão completa de turmas, salas e grade horária para o painel LOCAL. É a peça que conecta alunos (Card 18) e professores (M3) através das turmas e seus horários.
Backend — 3 sub-routers (20 procedures)
local.classes (7 procedures):
list— Lista turmas com filtros (ano, turno, filial), contagem de alunos/professores/aulas, e % de ocupaçãodetail— Ficha completa: professores atribuídos (ClassTeacher), alunos matriculados, grade horáriacreate— Cria turma com código automáticoFILIAL-ANO-SEQ, valida sala na filialupdate— Edita nome, turno, capacidade, saladeactivate— Soft-deleteassignTeacher— Vincula professor×turma×matéria (ClassTeacher), previne duplicatasremoveTeacher— Remove atribuição com validação de escopo
local.rooms (4 procedures):
list— Lista salas com contagem de turvas e slotscreate— Cria sala (nome, capacidade, tipo, andar, recursos JSON)update— Edita saladeactivate— Soft-delete
local.schedule (7 procedures):
listByClass— Grade de uma turma específicalistByTeacher— Grade de um professorlistByBranch— Todos os slots da filialcreateSlot— Adiciona aula (matéria, professor, dia, horário, sala). Detecta conflitos e alerta, mas NÃO bloqueia (decisão cliente)updateSlot— Edita slotdeleteSlot— Remove slot (soft-delete)detectConflicts— Varre TODA a grade da filial e retorna conflitos de professor (2 turmas mesmo horário), sala (2 turdas mesma sala) e turma (2 matérias mesmo horário)
Helper de sobreposição de horários
function timeOverlap(s1, e1, s2, e2): boolean {
return s1 < e2 && s2 < e1; // HH:MM string comparison funciona
}
Frontend — 4 páginas
/local/turmas(REESCRITA) — Grid de cards com barra de ocupação colorida (verde/amarelo/vermelho), badges de turno, contagem de professores/aulas, e botão de alerta de conflitos no header/local/turmas/[id](NOVA) — Detalhe com 4 cards de resumo, professores atribuídos (com botão remover), lista de alunos matriculados (link para ficha), grade resumida, modais de atribuir professor e editar turma/local/grade(REESCRITA) — Grade visual em grid (dias × horários), cores por matéria (hash do nome), seletor de turma, modal "Adicionar Aula" com selects de matéria/professor/sala/dia/horário, e modal de conflitos com badges coloridos por tipo (PROFESSOR/SALA/TURMA)/local/infraestrutura(NOVA) — CRUD de salas em cards, com recursos (projetor, ar, TV, computadores), capacidade, tipo, andar, e botões editar/desativar
Decisões do cliente aplicadas (7/7)
| # | Pergunta | Resposta aplicada |
|---|---|---|
| 1 | Turnos | Manhã, Tarde, Noite (NÃO tem integral) |
| 2 | Capacidade máxima | 10 alunos (default) |
| 3 | Tipos de salas | Flexível: Sala de Aula, Laboratório, Atelier, Auditório, etc. |
| 4 | Recursos | Projetor, Ar-condicionado, TV, Computadores (JSON flexível) |
| 5 | Duração da aula | Flexível (slots de 50min default, configurável) |
| 6 | Detecção de conflito | ALERTA, não bloqueia (cria mesmo com conflito) |
| 7 | Multi-turno | Aluno pode estar em mais de um turno |
✅ Critérios de aceite validados
| # | Critério | Status |
|---|---|---|
| 1 | CRUD de turmas | ✅ |
| 2 | Atribuição de professores | ✅ |
| 3 | Grade horária visual | ✅ |
| 4 | Resolução de conflitos | ✅ |
📁 2. Arquivos criados/modificados
Criados
| Arquivo | Função |
|---|---|
src/app/(dashboard)/local/turmas/[id]/page.tsx |
Detalhe da turma (professores, alunos, grade, editar) |
src/app/(dashboard)/local/infraestrutura/page.tsx |
CRUD de salas com recursos |
docs/execucao/19-m4-turmas-grade.md |
Este documento |
Modificados
| Arquivo | Mudança |
|---|---|
src/server/trpc/routers/local.ts |
+3 sub-routers (classes 7 proc, rooms 4 proc, schedule 7 proc) + helpers timeOverlap, slotSummary |
src/app/(dashboard)/local/turmas/page.tsx |
Reescrita: mock → tRPC real + filtros + ocupação |
src/app/(dashboard)/local/grade/page.tsx |
Reescrita: mock → grade visual real + conflitos |
src/components/layout/nav-config.ts |
+item "Salas" no menu LOCAL |
🗄️ 3. Schema do banco (mudanças)
Nenhuma mudança de schema. Todos os models já existiam:
Class(name, code, year, shift, maxStudents, branchId, roomId)Room(name, capacity, type, floor, resources JSON, branchId)ScheduleSlot(classId, subjectId, teacherId, dayOfWeek, startTime, endTime, roomId)ClassTeacher(classId, teacherId, subjectId — vínculo professor×turma×matéria)
🔌 4. Handoff para o próximo card
Procedures disponíveis (reutilizáveis)
local.classes.*— CRUD turmas + atribuição professoreslocal.rooms.*— CRUD salaslocal.schedule.*— Grade horária + detecção conflitostimeOverlap(s1,e1,s2,e2)— helper de sobreposição HH:MM
Integração com Card 18 (Alunos & Matrículas)
- O select de turmas no modal de transferência do Card 18 agora pode usar
local.classes.list - O
enrollments.createvalida vagas viaclass.maxStudents - O
enrollments.transfervalida turma de destino vialocal.classes.detail
Padrões estabelecidos
- Código de turma automático:
FILIAL-ANO-SEQ(ex: ABCD-2026-01) - Grade visual: grid table (dias × horários) com cor por matéria (hash determinístico)
- Conflitos: alerta (warning toast) sem bloquear criação — overlay visual no modal
- Recursos de sala: JSON flexível
{ projetor, arCondicionado, tv, computadores }
📋 5. Checklist do Trello — status
[Entregas] 4/4 ✅
- CRUD de turmas
- Atribuição de professores
- Grade horária visual
- Resolução de conflitos
[Especificação Técnica]
13 rotas/procedures marcadas ✅. Pendências futuras: Exportar grade PDF (Puppeteer — Card 33), auditoria schedule (Card 26), drag-and-drop visual (refinamento).
[Validar com Cliente] 7/7 ✅
Todas respondidas e aplicadas.
🚀 6. Deploy DEV
- Build: ✅ local + VPS
- Commit:
0889fd7 - VPS: git pull + build + pm2 reload
- Smoke test: HTTP 200 ✅
- URL: https://sistemaescolar.wellka.com.br/local/turmas (login: diretor@genioon.com.br)
🧠 7. Contexto gerado
- Padrão de grade visual — reutilizável para agenda do aluno (Card 7c), calendário, e dashboards
- Detecção de conflitos — algoritmo O(n²) por dia, suficiente para escolas de 10-30 unidades
- ClassTeacher — agora com UI completa de atribuição; professores só veem matérias atribuídas (já enforced no M3)
- Recursos JSON flexível — permite adicionar novos recursos sem migration
🎯 8. Próximo card
Card 20: [M4] Financeiro da Unidade — visão financeira do LOCAL: mensalidades, inadimplência, receita, e geração de cobranças. Reaproveita Enrollment.monthlyFee/discountPercent/dueDay e procedures de Payment.