Repository navigation
Arquitetura
github-actions[bot] edited this page Oct 30, 2026
·
3 revisions
O TicTask é só front-end: páginas React carregadas pelo Azure DevOps em iframes. Os apontamentos ficam no Extension Data Service (o armazenamento que o ADO oferece às extensões) e as horas vão para os campos do próprio work item.
flowchart LR
subgraph ADO[Azure DevOps]
UI["TicTask<br/>grupo, aba, painel, hub e diálogos"]
WIT[("Work items<br/>Completed, Remaining e estado")]
EDS[("Extension Data Service<br/>apontamentos, timer,<br/>presença e configurações")]
end
UI -- apontamentos --> EDS
UI -- "patch com test /rev" --> WIT
N8N["Automação externa<br/>(n8n, opcional)"] -. lê .-> EDS
N8N -. cards .-> Chat[Google Chat]
| Onde | Contribuição | O que faz |
|---|---|---|
| Tela principal do WI (aba Details) | time-group |
▶ Iniciar / ⏸ Pausar (▾ com motivo) / ✓ Concluir / + Apontar, cronômetro e Est/Compl/Rest |
| Aba Apontamentos do WI | time-tab |
Task: lista de apontamentos (início/fim/pausas), por pessoa/atividade. US/Bug: tasks filhas com horas, alertas de inconsistência, linha do tempo |
| Backlog e Sprint › painel lateral TicTask | time-backlog-panel |
Timer em andamento, item selecionado no backlog com Iniciar/Apontar e minhas tasks abertas (o ADO não permite extensões na barra superior global) |
| Boards › TicTask | time-hub |
Meu tempo, Resumo, Calendário e, para gestores, Time agora e Configurações. O PDF do Resumo é gerado no navegador por dist/pdf.js (jsPDF), carregado só quando alguém exporta |
| Diálogos no host | time-dialog |
Apontar, pausar, concluir, estimativa, "O que você vai fazer?", tasks padrão |
| Coleção / documento | Escopo | Conteúdo |
|---|---|---|
te-{projeto}-{yyyyMM} |
Compartilhado | Apontamentos do mês: fonte do Resumo e do Calendário |
tw-{projeto}-{workItemId} |
Compartilhado | Índice por work item (mesmo id do apontamento), usado pelas abas |
timer/active |
Usuário | Timer em andamento: só o trecho que está rodando (timestamps), por isso continua contando com o navegador fechado |
presence-{projeto} |
Compartilhado | Um documento por usuário: status do timer e a última pausa (task e motivo), para o Time agora. Desligável nas Configurações |
settings-{projeto} |
Compartilhado | Configurações do projeto |
Cada apontamento guarda início, fim e trechos, usuário, atividade, comentário, motivo (pausa ou
próximo passo), estado e horas da task antes e depois e um histórico de alterações. A exclusão é
lógica (deleted: true).
- Completed = soma dos apontamentos da task (os excluídos não entram). Vale também para horas digitadas à mão no formulário ou anteriores à extensão: o próximo apontamento, edição ou exclusão regrava a soma. Task sem nenhum apontamento mantém o Completed que tem; ao excluir o último apontamento, o Completed volta pelas horas dele.
-
Remaining =
max(0, Remaining − horas)(editável no diálogo); task sem estimativa pede a estimativa no 1º apontamento. Editar aplica a diferença; excluir devolve as horas ao Remaining. -
Apontamento e task numa operação só: o apontamento é salvo primeiro e depois a task. Se a task
recusar a gravação (regra do processo, campo inválido, permissão), o apontamento é desfeito e a
pessoa vê um aviso com o motivo. Falhas passageiras (rede, 5xx) são tentadas de novo antes
(
withRetry, 3 tentativas). Na tela do work item, se o formulário não salvar, os campos voltam ao que eram. O que vem depois da task (mudar o estado numa 2ª revisão, ativar ou comentar no WI pai) não desfaz o apontamento: se falhar, aparece um aviso. - Leitura logo depois de gravar: a coleção pode voltar sem o documento recém-gravado. As leituras de apontamentos juntam o que a própria página gravou nos últimos minutos, para a soma do Completed incluir o apontamento recém-salvo.
- Conferência: as telas do work item avisam quando o Completed difere da soma, com Ajustar; Configurações › Dados › Conferir o Completed das tasks faz isso para o projeto todo.
-
Uma revisão por apontamento: horas, Remaining e estado vão num único patch com
test /rev(em conflito, relê e reaplica). Exceção: quando o apontamento também define a estimativa, são duas revisões (estimativa, depois estado), porque o processo pode travar o Original Estimate em Active. - Timer: um por usuário. Iniciar outro pausa o atual (aponta o trecho). Trecho com menos de 1 minuto não é apontado.
- Estados: iniciar → Active; pausar → Stopped; concluir → Closed; apontamento manual numa task New → Stopped; iniciar trabalho numa task filha leva o WI pai de New/Ready for Development para Active. O diagrama está em Usar numa Task.
- Limite de dias (padrão 7): depois dele o autor não edita nem exclui o apontamento, e também não cria nem move apontamentos para antes dele (exceto o tempo de um timer).
Gestores são os administradores de qualquer time do projeto, mais os e-mails listados em
Configurações › Gestores. A checagem usa o escopo vso.project que a extensão já tem; o grupo
Project Administrators exigiria vso.security_manage, permissão ampla demais.
- O apontamento guarda o snapshot da task antes e depois, e o histórico de alterações.
- O Completed, o Remaining e o estado têm revisão própria no History do work item, que é imutável.
- A exclusão é lógica: o apontamento excluído continua no documento.
- O Extension Data Service não valida no servidor: um usuário técnico com acesso pode ler e alterar documentos via REST. Mitigações: snapshot antes/depois, revisões do work item, soft delete com histórico. Se o compliance exigir trilha à prova de adulteração, o próximo passo é um backend (Azure Function + SQL) gravando os apontamentos.
- Só gestores veem e salvam as Configurações, mas a checagem é da interface (o documento
settings-{projeto}pode ser gravado via REST por qualquer membro). - Bundles de ~0,5–1 MB por página (Fluent UI + FullCalendar); dá para dividir em chunks depois.