--- 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();`.