Entrar como:FuncionalidadesDoc
Pular para o conteúdo
← Voltar para a visão geral
✅ ConcluídoCard #62 · M12

Projetos & PPM (Gantt + Portfólio)

Marco M12: Gestão & Integração (SULTS-inspired)

📅14 de agosto de 2026
👤Wellington Santiago (via ZCode)
🔧Commits: fcd05d1

📄 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

  1. MASTER cria projetos com fases + tarefas + dependências + marcos
  2. Kanban + Gantt + Lista + Portfólio
  3. Feed centralizado por projeto (comentários nas tarefas)
  4. Gestão de recursos (carga por membro)
  5. Data projetada automática
  6. Integração com Implantação (Card 59) e Checklist (Card 51)
  7. Templates reutilizáveis
  8. 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.

← Voltar para a visão geral