
Sistema de gestão de projetos
| Área | Processos e automação |
|---|---|
| O que faz | Antes, cada atraso exigia refazer o cronograma. Agora as tarefas ligadas se movem e o impacto fica visível. |
| Funções | Cronograma automático · Capacidade da equipe · Painel de portfólio |
| Habilidades | Levantamento de processo · Design de telas · Cálculo de cronograma · Apontamento de horas |
O que o sistema cobre.
Sistema para a área de projetos que reúne o quadro de tarefas da equipe, o cronograma do projeto e a visão de portfólio da diretoria. Cobre backlog, dependências entre tarefas, cálculo de prazos e caminho crítico, capacidade de cada pessoa, apontamento de horas com aprovação mensal e o painel que consolida progresso, horas e datas por projeto e iniciativa.
Para quem
Equipes que tocam vários projetos, gerentes de projeto e a diretoria que cobra prazo e acompanha horas e entregas.
O que mudou na empresa
O cronograma deixou de ser refeito na planilha a cada atraso: o sistema recalcula prazos e mostra qual tarefa empurrou a entrega. Horas fecham por mês com aprovação e a sobrecarga da equipe fica visível.
Módulos e funções.
8 partes do sistema, cada uma com o que faz.
Backlog e quadro
Itens com escopo e estimativa em colunas por status. Arrastar o cartão muda o status.
Dependências entre tarefas
Liga tarefas por fim e início, com atraso opcional. Dependência em círculo é recusada na hora.
Cronograma automático
Calcula data mais cedo, mais tarde, folga e caminho crítico pelo calendário de cada responsável.
Recálculo com histórico
Mudou data, duração ou dependência, o cronograma refaz sozinho, mostra qual tarefa empurrou e quem alterou.
Capacidade da equipe
Horas disponíveis por pessoa e semana, já sem feriados, férias e ausências. Sobrecarga aparece como aviso.
Apontamento de horas
Horas faturáveis ou não, com centro de custo. Aprovação fecha o mês; ajustes ficam registrados.
Painel de portfólio
Progresso, horas e datas sobem de tarefa para épico e iniciativa, prontos para a diretoria ler.
Edição simultânea
Descrição e comentários editados a dois se juntam; status e estimativa avisam quem chegou depois.
Três telas.
O design é meu. Cada legenda diz o que a tela faz.



Como funciona por dentro.
Mexer numa data, numa duração ou numa dependência move mil datas. Por isso o recálculo sai do request.
- BacklogItem nasce com escopo, estimativa e chave de ordenação fracionária dentro do seu escopo. Arrastar grava uma linha só: a do cartão movido. A coluna inteira não é renumerada.
- BoardColuna é projeção de estado, não tabela separada. Mover cartão é patch de um campo com a versão daquele campo, não um PUT do objeto, que apagaria o que o colega mudou ao lado.
- DependênciasBloqueio é aresta tipada entre tarefas: fim-início, início-início, fim-fim, com atraso opcional. A checagem de ciclo roda sob o mesmo lock consultivo do plano que o worker toma, senão dois inserts concorrentes, cada um acíclico sozinho, commitam um ciclo sem nenhum enxergar o outro. Aresta que fecharia o grafo é recusada na hora, com o caminho que ela criaria.
- AgendamentoSobre o grafo em ordem topológica: passo à frente dá data mais cedo, passo atrás dá data mais tarde, a diferença é a folga. Folga zero forma o caminho crítico. Duração vira dia útil pelo calendário do responsável. Estado não move data por si: só as transições que gravam real reancoram o sucessor, entrar em Doing grava início real, concluir grava fim real. Arrastar entre as outras colunas não toca o cronograma.
- RecálculoA escrita da data commita curta e enfileira o plano pelo outbox, e o evento carrega ator, campo e valor anterior. O worker toma lock consultivo do plano, refaz só o componente conexo afetado e publica a versão nova do cronograma de uma vez. Cada linha do diff aponta a predecessora que empurrou e o evento que originou o empurrão. A tela nunca lê meio recálculo.
- CapacidadeCapacidade líquida por pessoa e por semana: jornada contratada menos feriado nacional, estadual e municipal, férias e ausência. Alocação é percentual num intervalo. Utilização é hora apontada sobre capacidade. Superalocação é aviso visível, não bloqueio.
- ApontamentoHora entra como intervalo, com faturável ou não e centro de custo. Constraint de exclusão barra dois lançamentos sobrepostos do mesmo usuário. Aprovação fecha a competência; depois disso só entra ajuste, e o ajuste guarda o valor anterior.
- PortfólioProgresso, horas e datas sobem pela hierarquia, tarefa, épico, iniciativa, para uma tabela de rollup materializada. Três eventos distintos a invalidam, não um: versão nova de cronograma escreve datas e folga; fechamento ou ajuste de competência no timesheet escreve horas; mudança de progresso escreve percentual e contagem. Os três coalescem pela mesma chave de hierarquia, cada um toca só as suas colunas e cada coluna guarda a versão do evento que a escreveu, chegada fora de ordem não regride o número. Ler portfólio não dispara soma sobre dez mil linhas.
O problema e a saída.
O problema
Board e cronograma vivem brigando. O time trabalha em cartão; a diretoria cobra data. Quando uma dependência escorrega, alguém reabre a planilha e refaz na mão, e a data prometida ontem já não existe mais.
A saída
Um grafo só, duas leituras. O cartão do board é a mesma tarefa que o cronograma agenda. Mudou data, duração ou aresta, o motor refaz folga e caminho crítico fora do request e devolve o diff: o que moveu, quanto e por causa de qual predecessora.
Tecnologias e o porquê.
| Camada | Escolha | Por quê |
|---|---|---|
| Modelo de dados | PostgreSQL; dependência como aresta indexada nos dois sentidos | Dependência como linha própria permite índice de predecessor e de sucessor, e travessia do grafo sem carregar o projeto inteiro em memória. É o que torna o recálculo incremental por componente conexo, em vez de refazer o plano todo a cada aresta. |
| Motor de cronograma | Serviço próprio: topológica + passo à frente e passo atrás | CPM é determinístico e o componente conexo cabe em memória. Biblioteca pronta não conhece calendário de trabalho por pessoa, feriado municipal nem jornada de seis horas, e é isso que converte duração em data. Mesma entrada, mesma saída: o recálculo vira repetível, testável e diffável contra a linha de base. |
| Fila e recálculo | Outbox transacional + fila com coalescing por plano | Rajada de dez edições de data em vinte segundos precisa virar um recálculo, não dez. A chave da mensagem é o plano, então o job pendente absorve os que chegam depois. Lock consultivo por plano serializa workers do mesmo cronograma e deixa planos diferentes correrem em paralelo, e o mesmo lock cobre a inserção de aresta, porque checagem de ciclo fora dele é garantia falsa sob READ COMMITTED. O job carrega a versão do grafo que leu e o evento de origem, com ator e campo alterado; entrega repetida não duplica publicação. |
| Colaboração | WebSocket + CRDT no texto, patch por campo no resto | Descrição e comentário são CRDT: dois cursores no mesmo parágrafo convergem sem ninguém perder frase. Status, responsável e estimativa não: são patch com versão do campo, e patch com versão velha é recusado com o valor atual junto, para o cliente reconciliar em vez de esmagar. Presença e cursor não tocam o banco, canal efêmero com TTL curto. |
| Ordenação do backlog | Chave fracionária em texto, com desempate por id | Mover cartão escreve uma linha, não renumera a coluna. Dois arrastos simultâneos no mesmo vão podem gerar a mesma chave; o desempate determinístico por id faz todos os clientes convergirem para a mesma ordem sem servidor arbitrando. Quando a chave cresce demais depois de muitas inserções seguidas, um job compacta o escopo sob lock e transmite a lista nova. |
| Horas e portfólio | Timesheet por competência + rollup materializado | O mês fechado não é lido junto com o mês corrente. Partição por competência mantém o índice pequeno, deixa congelar o período inteiro e faz a apuração ler uma partição só. O rollup do portfólio não é somado a cada abertura de tela, e não é escrito só pelo worker do CPM: três produtores o invalidam pela mesma chave de hierarquia. Versão nova de cronograma grava datas e folga; competência fechada ou ajustada grava horas; mudança de progresso grava percentual. Cada coluna carrega a versão do evento que a escreveu, então chegada fora de ordem não regride número. |
Decisões de projeto.
Recálculo assíncrono, com estado visível
Aceitei que a tela mostre data velha por alguns segundos. A alternativa, recalcular no request, travava a edição em grafo grande. Prefiro lento e visível a rápido e mentiroso.
CRDT só no texto longo
Estender CRDT a status e estimativa fundiria valor que não deve se fundir. Campo escalar leva patch com versão: quem chegou atrasado recebe recusa e vê o valor novo, não sobrescreve.
Calendário de trabalho é da pessoa
Cada tarefa resolve o calendário do responsável: jornada, férias, feriado municipal. Isso impede pré-calcular duração em lote e encarece o passo. Calendário único faz o prazo mentir.
Escopo.
O que o sistema cobre
- O fluxo de 8 passos e as decisões acima.
- As três telas desta página.
O que não está publicado
- Nome da empresa e números de operação não são divulgados aqui.
- O código não é público. O que dá para ver: o processo, as telas e as decisões.
Da mesma faixa.
Processos e automação
Quer ver este sistema de perto?
Mostro o processo que mudou, os módulos, as telas e como foi construído.

