knowledge-base/records/plugin-dev/KB-PLUGIN-035-glpi11-service-desk-kpi-data-model.md
Rodolpho Lopes 0c88e71f92 docs(KB-035): modelo de dados dos KPIs de Service Desk no GLPI 11
Documenta as colunas/tabelas reais usadas pelas 7 tools de KPI (MTTR via
solve_delay_stat, FCR via solução recusada, SLA TTR/TTO, workload, backlog,
CSAT, volume). Atualiza snapshot KB-026 para 26 tools.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 22:52:14 +00:00

94 lines
4.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: KB-PLUGIN-035
title: Modelo de dados dos KPIs de Service Desk no GLPI 11 (tools de BI do mcprotocol)
domain: plugin-dev
tags:
- glpi
- glpi11
- mcp
- kpi
- bi
- tickets
- sla
- csat
status: active
severity: medium
created_at: 2026-06-22
updated_at: 2026-06-22
applies_to:
- glpi-11
- mcprotocol-plugin
related_records:
- KB-PLUGIN-019
- KB-PLUGIN-022
- KB-PLUGIN-026
---
# Modelo de dados dos KPIs de Service Desk no GLPI 11
Referência canônica das colunas/tabelas reais do GLPI 11 usadas pelas tools de KPI
(`src/TicketKpiTools.php`, plugin v1.2.0+). Mapeamento levantado direto no schema
do core (a KB não tinha isso antes). Princípio BFF: o LLM pede o KPI, o PHP conhece
as colunas (KB-PLUGIN-019).
## Colunas-chave de `glpi_tickets`
| Coluna | Tipo | Uso |
|---|---|---|
| `date` / `date_creation` | timestamp | Abertura do chamado |
| `takeintoaccountdate` | timestamp | Data do primeiro atendimento (resposta) |
| `solvedate` | timestamp | Data de solução |
| `closedate` | timestamp | Data de fechamento |
| `status` | int | 1=Novo 2=Processando/Atribuído 3=Planejado 4=Pendente 5=Solucionado 6=Fechado |
| `solve_delay_stat` | int (s) | **Tempo real de solução em segundos**, já calculado pelo GLPI (calendário de trabalho, descontando espera) |
| `takeintoaccount_delay_stat` | int (s) | Tempo até o primeiro atendimento (resposta) |
| `close_delay_stat` | int (s) | Tempo até o fechamento |
| `waiting_duration` / `sla_waiting_duration` | int (s) | Tempo total em espera/pendente |
| `time_to_resolve` | timestamp | **Prazo** do SLA de solução (TTR) |
| `time_to_own` | timestamp | **Prazo** do SLA de resposta (TTO) |
| `slas_id_ttr` / `slas_id_tto` | int FK | SLA atribuído (solução / resposta) |
> ⚠️ Para MTTR, **prefira `solve_delay_stat`** ao invés de `solvedate - date`: o GLPI já
> desconta horário não-útil e tempo de espera. A tool expõe os dois (`_wall` = corrido).
## Mapeamento KPI → fonte
| KPI | Tool | Fonte / regra |
|---|---|---|
| MTTR | `glpi_ticket_mttr_stats` | `AVG(solve_delay_stat)` de tickets status∈(5,6), `solvedate` no período |
| FCR ("sem reabertura") | `glpi_ticket_fcr_stats` | resolvidos (resolvidos com solução recusada). Reabertura = `glpi_itilsolutions.status = 4` (`CommonITILValidation::REFUSED`) |
| SLA solução (TTR) | `glpi_ticket_sla_compliance` | `solvedate <= time_to_resolve` (entre os que têm `time_to_resolve` e `solvedate`) |
| SLA resposta (TTO) | `glpi_ticket_sla_compliance` | `takeintoaccountdate <= time_to_own` |
| Workload | `glpi_team_productivity` | JOIN `glpi_tickets_users` (type=2 técnico) ou `glpi_groups_tickets` (type=2). Resolvidos no período + backlog (status∉(5,6)) |
| Backlog growth | `glpi_ticket_backlog_stats` | abertos(`date`) vs resolvidos(`solvedate`) no período; `net = abertos resolvidos` |
| CSAT | `glpi_satisfaction_stats` | `AVG(glpi_ticketsatisfactions.satisfaction_scaled_to_5)` (float 0-5), `date_answered` p/ taxa de resposta |
| Volume | `glpi_ticket_volume_stats` | `COUNT` agrupado por `itilcategories_id` / `priority` / `urgency` / `status` |
## Constantes de actor (type) — `glpi_tickets_users` e `glpi_groups_tickets`
`1` = requerente · `2` = atribuído (técnico/grupo) · `3` = observador.
## Tabelas auxiliares
- `glpi_itilsolutions``status` usa `CommonITILValidation`: 2=Waiting, 3=Accepted, **4=Refused**.
Múltiplas soluções / uma recusada ⇒ houve reabertura.
- `glpi_ticketsatisfactions``satisfaction` (bruto), `satisfaction_scaled_to_5` (float 0-5,
**usar este**), `date_begin` (enviada), `date_answered` (respondida).
- `glpi_itilcategories` — tem `name` e `completename` (caminho completo).
## Labels (resolver IDs para humanos)
- `\Ticket::getStatus($int)` · `\Ticket::getPriorityName($int)` · `\Ticket::getUrgencyName($int)`.
## RBAC
As tools de KPI agregam via `$DB` direto (como `glpi_ticket_bi_stats`), com filtros
opcionais (`entities_id`, `itilcategories_id`). NÃO aplicam `getEntitiesRestrictCriteria`
automaticamente — escopo fica a cargo dos filtros. Para BI gerencial é aceitável; se
precisar de isolamento estrito por entidade, evoluir para restrição de sessão. Ver KB-019.
## Notas de validação (2026-06-22)
Os 7 handlers foram testados contra o banco de dev via bootstrap CLI. Atenção: `$DB`
não é auto-inicializado pelo `inc/includes.php` no CLI do GLPI 11 — instanciar manual
após `include config/config_db.php`: `$DB = new DB();`.