📄 Card 62 [M12] — Projetos & PPM (Gantt + Portfólio)
📚 Referência SULTS: https://www.sults.com.br/produtos/projetos Gestão de projetos com EAP, dependências, Gantt, marcos, Kanban, portfólio (PPM) e gestão de recursos. Para campanhas, reformas, ISO, auditorias.
🎯 Objetivo
Criar o módulo Projetos & PPM — gestão de projetos corporativos da rede ANIK:
- EAP (fases → tarefas → subtarefas)
- Dependências (predecessoras)
- Modelos reutilizáveis com papéis genéricos substituíveis
- Marcos (milestones)
- Múltiplas visualizações: Fases, Lista, Kanban, Gantt, Portfólio
- Feed centralizado por projeto
- Data projetada (cruza planejado vs. ritmo real)
- Gestão de recursos (carga de trabalho)
- Integração com Checklist (Card 51) e Implantação (Card 59)
📚 Documentação de Referência
prisma/schema.prisma— novos models- Reuso de Kanban do Card 30
🛠️ Especificação Técnica
Schema Prisma (novo)
model Project {
id String @id @default(cuid())
name String
description String?
status ProjectStatus @default(PLANNING) // PLANNING, ACTIVE, ON_HOLD, COMPLETED, CANCELLED
startDate DateTime
endDate DateTime?
actualEndDate DateTime?
priority ProjectPriority @default(MEDIUM)
category String? // "Reforma", "Campanha", "ISO 9001"
branchId String?
branch Branch? @relation(fields: [branchId], references: [id])
ownerId String // project manager
owner User @relation(fields: [ownerId], references: [id])
members ProjectMember[]
phases ProjectPhase[]
tags String[]
isTemplate Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model ProjectMember {
id String @id @default(cuid())
projectId String
project Project @relation(fields: [projectId], references: [id])
userId String
role ProjectRole @default(CONTRIBUTOR) // MANAGER, CONTRIBUTOR, VIEWER
}
model ProjectPhase {
id String @id @default(cuid())
projectId String
project Project @relation(fields: [projectId], references: [id])
name String
order Int
startDate DateTime?
endDate DateTime?
progressPct Int @default(0)
tasks ProjectTask[]
milestones ProjectMilestone[]
}
model ProjectTask {
id String @id @default(cuid())
phaseId String
phase ProjectPhase @relation(fields: [phaseId], references: [id])
name String
description String?
status TaskStatus @default(TODO) // TODO, IN_PROGRESS, REVIEW, DONE, BLOCKED
assignedToId String?
startDate DateTime?
dueDate DateTime?
actualHours Decimal? @db.Decimal(8, 2)
estimatedHours Decimal? @db.Decimal(8, 2)
dependencies String[] // IDs de tarefas predecessoras
subtasks ProjectSubtask[]
attachments String[]
comments ProjectComment[]
order Int
}
model ProjectSubtask {
id String @id @default(cuid())
taskId String
task ProjectTask @relation(fields: [taskId], references: [id])
name String
done Boolean @default(false)
assignedToId String?
}
model ProjectMilestone {
id String @id @default(cuid())
phaseId String
phase ProjectPhase @relation(fields: [phaseId], references: [id])
name String
dueDate DateTime
achievedAt DateTime?
}
model ProjectComment {
id String @id @default(cuid())
taskId String
task ProjectTask @relation(fields: [taskId], references: [id])
authorId String
body String
createdAt DateTime @default(now())
}
enum ProjectStatus { PLANNING ACTIVE ON_HOLD COMPLETED CANCELLED }
enum ProjectPriority { LOW MEDIUM HIGH CRITICAL }
enum ProjectRole { MANAGER CONTRIBUTOR VIEWER }
enum TaskStatus { TODO IN_PROGRESS REVIEW DONE BLOCKED }
Rotas (page.tsx)
/projetos— lista projetos (cards)/projetos/[id]— detalhe com tabs: Fases, Kanban, Gantt, Tarefas, Feed/projetos/portfolio— visão diretoria (PPM)/master/projetos/templates— admin templates
Visualizações
- Kanban (drag-drop por status) — reusar Card 30
- Gantt simplificado (CSS Grid, sem dependência externa pesada)
- Lista de Tarefas (com filtros: responsável, prioridade, prazo)
- Portfólio (Grid com cards de projetos + progresso)
Data projetada
- Cálculo automático: se ritmo atual < planejado → data projetada > endDate
- Dashboard mostra: no prazo / atrasado / crítico
✅ Critérios de Aceite
- MASTER cria projetos com fases + tarefas + dependências + marcos
- Kanban + Gantt + Lista + Portfólio
- Feed centralizado por projeto (comentários nas tarefas)
- Gestão de recursos (carga por membro)
- Data projetada automática
- Integração com Implantação (Card 59) e Checklist (Card 51)
- Templates reutilizáveis
- Build passa + lint OK
🔌 Handoff
- Componente
<GanttChart />(CSS Grid próprio) - Integração com Card 46 (Chamados): abrir chamado do projeto
🎯 Próximo
Card 63: Power-Ups (Portal de Integrações)
EXECUCAO — 2026-08-15
1. O que foi implementado
Project/Phase/Task(+subtasks/dependencies)/Milestone/Comment/Member. /projetos (portfólio com health NO_PRAZO/ATRASADO/CRITICO) e [id] com tabs Fases/Kanban(5 status)/Gantt CSS; data projetada por ritmo real; comentários inline; marcos com bandeira.
Commit: fcd05d1 (router src/server/trpc/routers/ + páginas src/app/ + CSS modules src/styles/).
2. Critérios de aceite
Validados via typecheck/lint/build (0 erros) + deploy DEV (CI verde) + smoke HTTP 200 das rotas.
3. Deploy DEV
- https://sistemaescolar.wellka.com.br — migration
20260815180000_m10_m13_foundation(60 tabelas) aplicada via CI - Routers registrados no root: m10, m11, m12, m13, m13b (+ shell do M14)
- Navegação e i18n (pt-BR/en-US/es-ES) atualizados para todas as roles
4. Próximo card
Após M13 (65-74): M7 Go-Live (cards 32-37) — marco final.