KB-PLUGIN-037: motor de templates de payload (2.0) + decisão de escopo (sem override/multi-Redmine)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Gemini 2026-07-03 09:18:29 -03:00
parent af013d58d4
commit 13b0e1827d
2 changed files with 28 additions and 1 deletions

View file

@ -1,6 +1,6 @@
{ {
"version": "1.0.0", "version": "1.0.0",
"last_updated": "2026-07-02", "last_updated": "2026-07-03",
"records": [ "records": [
{ {
"id": "KB-INFRA-001", "id": "KB-INFRA-001",

View file

@ -103,6 +103,33 @@ Escrita: `POST /projects.json` (criar projeto c/ custom fields), `POST /issues.j
(issue do chamado), `PUT /issues/:id.json` (status), `POST /time_entries.json` (tempo), (issue do chamado), `PUT /issues/:id.json` (status), `POST /time_entries.json` (tempo),
`POST /projects/:id/memberships.json` (auto-membership). `POST /projects/:id/memberships.json` (auto-membership).
## Motor de Templates de Payload (2.0)
A partir da **2.0** o corpo de cada operação (`create_issue`, `log_time`,
`update_status`, `create_project`) pode vir de um **template editável** em vez de
ser montado no código — o objetivo é o plugin virar **produto ambiente-agnóstico**
(cada Redmine tem seus campos obrigatórios/personalizados). Guia do usuário:
`docs/TEMPLATES.md`; contrato de dev: `docs/API.md`.
- **`PluginRedmineTemplateengine`** (`inc/templateengine.class.php`): tabela
`glpi_plugin_redmine_templates`, renderizador **mustache-like** (`{{ var | filtro }}`;
tag ocupando o valor inteiro → **tipo nativo**; lookup indexado `map.status[chamado.status]`;
filtros `truncar/sem_html/minusculo/identificador/padrao`; `prune` de nulos), seeds
equivalentes ao 1.x, descoberta de custom fields e os contextos (`buildContext`,
`buildFormContext`, `sampleContext`).
- **Precedência**: template **ativo** → renderiza e envia; erro de **render** → log +
**fallback 1.x**; **sem** template ativo → comportamento **1.x idêntico**. Ou seja,
atualizar da 1.x para a 2.0 **não muda nada** até ativar um template.
- **UI** (config): editor linha-a-linha "DE → PARA" (paleta de variáveis GLPI via
autocomplete + dicionário dos campos que o Redmine espera, com obrigatoriedade e
valores), botão "Gerar template" (local, sem reload) e **testador**
(`ajax/template_test.php`): preview do render + dry-run que cria/apaga objeto de
teste e **traduz os 422** em dicas.
- **NÃO virou template** (é motor, não payload): impersonation, idempotência,
membership, gates (Feito/duração), recuperação de issue órfã.
- Decisão de escopo (2026-07-03): **não** implementar override por vínculo nem perfis
multi-Redmine sem caso real (YAGNI) — o template global cobre o cenário atual.
## Gotchas de manutenção ## Gotchas de manutenção
- Dev = GLPI 11.0.7, prod = **11.0.4**: desenvolver mirando 11.0.0+ (sem - Dev = GLPI 11.0.7, prod = **11.0.4**: desenvolver mirando 11.0.0+ (sem