Commit graph

23 commits

Author SHA1 Message Date
Gemini
2e3ed338b5 release: 2.0.0 — motor de templates de payload (produto ambiente-agnóstico)
- bump 2.0.0 (final) + CHANGELOG datado
- docs/TEMPLATES.md (guia do usuário) + seção no README
- docs/API.md: seção do motor de templates (componentes, precedência, descoberta)

Retrocompatível: sem template ativo, comportamento idêntico ao 1.x.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 09:18:25 -03:00
Gemini
7bf8cdab4e feat(2.0): Fase 3 — testador de templates (preview + dry-run com tradução de 422)
- ajax/template_test.php: action=preview (render com sampleContext) e
  action=dryrun (cria+apaga objeto de teste no Redmine, traduz erros 422
  em dicas acionáveis; issue temporária para log_time/update_status)
- RedmineApi::rawRequest (código+corpo crus) e TemplateEngine::sampleContext
- UI: botão "Testar" + painel por card (preview sempre; teste real opt-in
  com seletor de projeto alvo), via fetch com X-Glpi-Csrf-Token
- validado E2E por HTTP: preview, dry-run cria/deleta (204), render inválido
  capturado, tradução de 422; sem resíduo de teste no Redmine

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 08:58:17 -03:00
Gemini
2c79d74545 fix: breadcrumb da config — Início > Configurar > Plugins (chave 'plugin' do core)
O header usava item de menu 'plugins' (inexistente), quebrando o caminho
em "Home > Configurar". Agora usa sector/item do core ('config'/'plugin')
e o título correto "Redmine Integration".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 17:32:21 -03:00
Gemini
aa5bf5eb75 feat(2.0): Salvar único — templates entram no form principal da config
- cards de template movidos para dentro do form principal (inputs em array
  templates_json[op]/templates_active[op]); sem forms aninhados
- "Gerar template" virou ação LOCAL no browser (data-seed preenche o editor;
  nada é salvo até o Salvar único) — sem reload
- removidos os handlers save_template/gen_template e os 4 botões Salvar por card
- o handler de update salva config + mapa + todos os templates numa tacada,
  validando o JSON de cada um (inválido = não salvo, com aviso)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 17:20:28 -03:00
Gemini
5ee12c75d2 feat(2.0): remove a coluna de variáveis — vira autocomplete no campo de valor
Feedback de UX: com o Gerar template automático, a coluna ficava ociosa.
As variáveis do GLPI agora aparecem como autocomplete (datalist) direto no
campo de valor de cada linha, + um painel de referência colapsado (fechado
por padrão) para descoberta em remapeamentos. Editores em largura total.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 17:12:32 -03:00
Gemini
48600b9692 feat(2.0): dicionário "de → para" por operação + variáveis de autor
Feedback de UX: o admin precisa saber O QUE o Redmine espera, não só os
valores. Cada card do editor ganha a tabela colapsável "Campos que o
Redmine espera" (campos padrão da operação + custom fields do ambiente,
com obrigatoriedade e valores possíveis) — clicar num campo adiciona a
linha com o caminho pronto. A paleta vira explicitamente o "DE" (variáveis
do GLPI) e ganha chamado.tecnico e tarefa.autor (texto; autoria real segue
automática via impersonation). Sync passa a cachear custom_fields de todos
os tipos (issue/time_entry/project).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 17:00:19 -03:00
Gemini
1053b9f506 feat(2.0): Fase 2 — editor de templates na config + paleta + create_project
- seção "Templates de Payload (avançado)" no formconfig: card por operação,
  editor linha-a-linha (flatten/unflatten em JS puro) com toggle Ver JSON,
  Gerar template (seed + CFs descobertos), ativar/desativar
- paleta de variáveis clicável (copia tag) + referência do Redmine do ambiente
  (trackers/status/prioridades/atividades/custom fields com valores)
- buildFormContext (form.*) e wiring do create_project nos dois controllers,
  com fallback 1.x em erro de render
- validado: render da UI (4 cards + paleta + JS) e E2E create_project via
  template no Redmine dev (tipos nativos, identifier minúsculo, parent, trackers)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 16:04:22 -03:00
Gemini
7ac1f8ac44 feat(2.0): Fase 1 — motor de templates de payload (design + engine + fallback 1.x)
- docs/DESIGN-2.0.md: decisões fechadas (tags PT, editor linha-a-linha,
  escopo global, dry-run com preview) e arquitetura Motor x Template
- PluginRedmineTemplateengine: render mustache-like ({{ var | filtro }}),
  regra de tipos (tag inteira = tipo nativo), lookup indexado
  (map.status[chamado.status]), filtros (truncar, sem_html, minusculo,
  identificador, padrao), prune de nulls, seeds 1.x-equivalentes e
  descoberta de custom fields obrigatórios
- tabela glpi_plugin_redmine_templates (operation único, is_active)
- wiring com precedência de template + fallback no render em
  create_issue, log_time e update_status
- validado: 12/12 unit + E2E (template ativo cria issue/tempo; template
  quebrado cai no motor 1.x sem perder lançamento)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 15:25:32 -03:00
Gemini
b8f89cda8d feat: resolução de usuários self-healing + syncUsers upsert + fallback logado (1.6.0)
Causa raiz do incidente "autor = admin": cache de usuários vazio no prod.
- cache miss -> lookup ao vivo por e-mail no Redmine + upsert no cache
- syncUsers nunca mais esvazia a tabela (upsert por redmine_id)
- fallback para admin deixa rastro no log
- config exibe saúde do cache (contagem + alerta se vazio)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 12:56:49 -03:00
Gemini
1b790354a3 fix: envia tracker_ids na criação de projeto (sem tracker, Redmine recusa issues) (1.5.7)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 11:18:27 -03:00
Gemini
27ee6addeb docs: API.md — criação de projeto com custom_field_values e regras por instância
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 10:42:11 -03:00
Gemini
c8765ca5ff fix: custom fields obrigatórios na criação de projeto + identifier lowercase (1.5.6)
- form das abas Redmine exibe/envia custom_field_values (Tipo de Projeto etc.)
- createProjectFull normaliza o identificador (minúsculas)
- sync da aba de projeto usa syncMetadata completo (não apaga mais o cache)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 09:53:23 -03:00
Gemini
913fd82272 fix: recria issue se a vinculada foi apagada no Redmine (vínculo órfão) (1.5.5)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 16:32:52 -03:00
Gemini
4214bf4814 fix: lançamento de tempo com comentário-fallback (campo obrigatório no Redmine) (1.5.4)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 16:10:38 -03:00
Gemini
6f844e7336 fix: dropdown gravava índice (Twig merge) em vez do ID real do projeto (1.5.3)
- opções do projeto Redmine montadas no PHP (Twig merge renumera chaves inteiras)
- aba mostra o NOME do projeto vinculado (não só o ID)
- botão Desvincular (projeto e entidade) + dropdown só com projetos ativos

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 15:27:18 -03:00
Gemini
ecf175728f fix: compat GLPI 11.0.4 — troca Toolbox::logError por logInFile (1.5.2)
Toolbox::logError não existe no 11.0.4 -> erro fatal ao criar issue/lançar
tempo/garantir membership. Usa Toolbox::logInFile('redmine', ...).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:58:52 -03:00
Gemini
1ea7af6435 fix: compat GLPI 11.0.4 — remove macro csrfField do form de config (1.5.1)
- config_form usava fields.csrfField() (inexistente no 11.0.4) -> erro fatal
- token CSRF agora via csrf_token_value (PHP); URL usa textField
- compatível com 11.0.0+

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 23:26:04 -03:00
Gemini
bb2ef47493 feat: kill switch de licença Mindtek/Mind Place (marketplace-ready) — 1.5.0
- plugin_init aborta e check_config falha se licença inválida ou Mind Place ausente
- README: seção de Licenciamento; CHANGELOG: 1.5.0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:44:45 -03:00
Gemini
0eff7d70f7 docs: README e CHANGELOG cobrindo vínculo por Entidade (1.4.0) + link da doc de API
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:07:19 -03:00
Gemini
4a285f65ac docs: documentação de API para desenvolvedores (GLPI -> Redmine)
Endpoints, payloads, cabeçalhos, mapeamento de campos, impersonation,
idempotência e exemplos completos. Material de treino para a equipe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:04:42 -03:00
Gemini
92d1ac044a feat: vínculo Entidade -> Projeto Redmine (clientes de suporte recorrente)
- nova aba Redmine em Administração > Entidades (PluginRedmineEntity)
- tabela glpi_plugin_redmine_entities (1:1 entidade -> projeto Redmine, + categoria)
- hook resolve o projeto Redmine por: projeto vinculado OU, na ausência,
  a entidade do chamado (match exato, sem herança de árvore)
- twigs do tab generalizados (owner_field/owner_id) p/ reuso projeto+entidade

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:00:36 -03:00
Gemini
c6ac9f7f04 docs: adiciona README (descritivo p/ marketplace) e CHANGELOG
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 18:42:06 -03:00
Gemini
80d1576a80 Redmine Integration 1.3.0
Plugin de integração GLPI <-> Redmine:
- Config nativa (Twig) com API key cifrada (GLPIKey)
- Vínculo projeto GLPI <-> projeto Redmine (aba do projeto) + categoria por vínculo
- 1 issue Redmine por chamado; defaults (tracker/priority/activity) e mapa de status
- Tempo das TicketTasks -> time entries (gate em "Feito"), idempotente
- Autores via impersonation (X-Redmine-Switch-User) + auto-membership por role
- Mapeamento de usuários GLPI->Redmine (auto-match por e-mail + overrides)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 18:32:19 -03:00