KB-PLUGIN-042: autoSetDate sobrescreve effective_duration; roll-up de esforco e nativo (getTicketsTotalActionTime)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f10ee9dfcf
commit
6827e7fcd5
2 changed files with 82 additions and 1 deletions
21
index.json
21
index.json
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"last_updated": "2026-07-10",
|
"last_updated": "2026-07-13",
|
||||||
"records": [
|
"records": [
|
||||||
{
|
{
|
||||||
"id": "KB-INFRA-001",
|
"id": "KB-INFRA-001",
|
||||||
|
|
@ -807,6 +807,25 @@
|
||||||
"severity": "high",
|
"severity": "high",
|
||||||
"path": "records/plugin-dev/KB-PLUGIN-041-glpi11-project-ticket-lifecycle-sync-and-componentized-card.md",
|
"path": "records/plugin-dev/KB-PLUGIN-041-glpi11-project-ticket-lifecycle-sync-and-componentized-card.md",
|
||||||
"summary": "id: KB-PLUGIN-041"
|
"summary": "id: KB-PLUGIN-041"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "KB-PLUGIN-042",
|
||||||
|
"title": "\"GLPI 11 — ProjectTask::autoSetDate sobrescreve effective_duration (decorrido ≠ esforço); roll-up de esforço já é nativo via getTicketsTotalActionTime\"",
|
||||||
|
"domain": "plugin-dev",
|
||||||
|
"tags": [
|
||||||
|
"glpi11",
|
||||||
|
"projecttask",
|
||||||
|
"tickettask",
|
||||||
|
"actiontime",
|
||||||
|
"effective-duration",
|
||||||
|
"time-tracking",
|
||||||
|
"gotcha",
|
||||||
|
"mindscrum"
|
||||||
|
],
|
||||||
|
"status": "active",
|
||||||
|
"severity": "high",
|
||||||
|
"path": "records/plugin-dev/KB-PLUGIN-042-glpi11-effective-duration-overwrite-native-effort-rollup.md",
|
||||||
|
"summary": "id: KB-PLUGIN-042"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
---
|
||||||
|
id: KB-PLUGIN-042
|
||||||
|
title: "GLPI 11 — ProjectTask::autoSetDate sobrescreve effective_duration (decorrido ≠ esforço); roll-up de esforço já é nativo via getTicketsTotalActionTime"
|
||||||
|
domain: plugin-dev
|
||||||
|
tags:
|
||||||
|
- glpi11
|
||||||
|
- projecttask
|
||||||
|
- tickettask
|
||||||
|
- actiontime
|
||||||
|
- effective-duration
|
||||||
|
- time-tracking
|
||||||
|
- gotcha
|
||||||
|
- mindscrum
|
||||||
|
status: active
|
||||||
|
severity: high
|
||||||
|
created_at: 2026-07-13
|
||||||
|
updated_at: 2026-07-13
|
||||||
|
applies_to:
|
||||||
|
- GLPI 11.0.8 dev
|
||||||
|
- plugin mindscrum 0.6.0
|
||||||
|
related_records:
|
||||||
|
- KB-PLUGIN-039
|
||||||
|
- KB-PLUGIN-041
|
||||||
|
---
|
||||||
|
|
||||||
|
# GLPI 11 — effective_duration é do core; esforço soma-se pelo helper nativo
|
||||||
|
|
||||||
|
## Gotcha (descoberto em teste E2E que falhou)
|
||||||
|
|
||||||
|
Gravar `effective_duration` numa `ProjectTask` via `update()` **não persiste** quando as
|
||||||
|
duas datas reais existem: `ProjectTask::autoSetDate()` (chamado em TODO add/update,
|
||||||
|
linhas ~538/579) **recalcula** `effective_duration = real_end_date - real_start_date`
|
||||||
|
(tempo DECORRIDO de calendário) e sobrescreve o input. Pior: se `percent_done=100`
|
||||||
|
chega com `real_start_date` vazio, o core seta start=now e end=now → effective=0.
|
||||||
|
|
||||||
|
Decorrido ≠ esforço (task que atravessa 4 dias com 7h de trabalho). Não lute contra:
|
||||||
|
o campo pertence ao core com semântica de decorrido.
|
||||||
|
|
||||||
|
## O roll-up de esforço JÁ É NATIVO (não armazenar, ler)
|
||||||
|
|
||||||
|
Cadeia mantida pelo core:
|
||||||
|
1. `TicketTask.actiontime` (tempo gasto lançado pelo técnico);
|
||||||
|
2. `CommonITILTask::post_addItem/post_updateItem` → `updateActionTime()` mantém
|
||||||
|
`glpi_tickets.actiontime` = soma das tarefas do chamado;
|
||||||
|
3. `ProjectTask_Ticket::getTicketsTotalActionTime($projecttasks_id)` soma o
|
||||||
|
`actiontime` dos chamados vinculados à task de projeto (o próprio form nativo da
|
||||||
|
ProjectTask exibe isso, linha ~782 de ProjectTask.php).
|
||||||
|
|
||||||
|
→ Para exibir "esforço real" de uma task de projeto, chamar o helper **ao vivo** a cada
|
||||||
|
render. Atualiza a cada lançamento (não só ao solucionar) e nunca briga com o core.
|
||||||
|
|
||||||
|
## Padrão de time tracking do mindscrum (0.6.0)
|
||||||
|
|
||||||
|
Mesmo input h:min, campo nativo por contexto:
|
||||||
|
- task de projeto → `planned_duration` (estimativa; persiste sem conflito);
|
||||||
|
- task de chamado → `actiontime` (efetivo; com `begin` setado o core recalcula `end`).
|
||||||
|
Planejado × realizado = `planned_duration` digitada × helper nativo somado.
|
||||||
|
|
||||||
|
## Bônus — sessão CLI p/ testar TicketTask
|
||||||
|
|
||||||
|
`TicketTask::add()` em script CLI exige `$_SESSION['glpigroups'] = []`
|
||||||
|
(senão `Reminder::getVisibilityCriteria` estoura com count(null) via PlanningEvent).
|
||||||
Loading…
Reference in a new issue