Redmine/CHANGELOG.md
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

7.6 KiB

Changelog

Todas as mudanças relevantes deste plugin são documentadas aqui. O formato segue Keep a Changelog e o versionamento segue SemVer.

[2.0.0] - 2026-07-03

Adicionado

  • Motor de templates de payload (Fase 1, invisível na UI — ver docs/DESIGN-2.0.md): templates JSON com tags {{ var | filtro }} por operação (create_issue, log_time, update_status, create_project), tabela glpi_plugin_redmine_templates, seeds equivalentes ao comportamento 1.x e descoberta de custom fields obrigatórios. Sem template ativo, o plugin se comporta exatamente como o 1.x; erro de render também cai no 1.x (nunca perde lançamento).
  • Editor de Templates de Payload na config (Fase 2): um card por operação com editor linha-a-linha (caminho do campo → valor/tag) e toggle "Ver JSON", botão "Gerar template" (seed + custom fields descobertos), ativar/desativar, e paleta de variáveis clicável (copia a tag) com referência do ambiente Redmine (trackers/status/prioridades/atividades/custom fields e valores).
  • Operação create_project integrada ao motor de templates (contexto form.* com os campos da aba, incluindo form.cf_<id> dos custom fields).
  • Testador de templates (Fase 3): botão "Testar" por operação com preview do JSON renderizado (dados de exemplo + config real) e teste real opcional (ajax/template_test.php) que cria e apaga um objeto de teste no Redmine e traduz os erros 422 em dicas acionáveis. Editor unificado num único "Salvar"; breadcrumb da config corrigido (Início > Configurar > Plugins).

[1.6.0]

Adicionado

  • Resolução de usuários self-healing: se o e-mail não estiver no cache local, o plugin busca o usuário ao vivo no Redmine e atualiza o cache — cache vazio ou desatualizado não gera mais lançamentos como admin.
  • A seção "Mapeamento de usuários" da config mostra a quantidade de usuários em cache, com alerta destacado quando o cache está vazio.

Corrigido

  • syncUsers fazia delete-all antes de inserir: uma falha no meio deixava o cache vazio (causa raiz de lançamentos saindo como admin). Agora é upsert por usuário + remoção só dos ausentes — o cache nunca fica vazio por falha.
  • Fallback para admin agora é logado ("Sem par Redmine para o usuário GLPI #N"), em vez de silencioso.

[1.5.7]

Corrigido

  • Projetos criados pelo plugin nasciam SEM trackers quando a instância Redmine não tem "trackers padrão para novos projetos" — e sem tracker o Redmine recusa criar issues (integração silenciosamente inoperante no projeto novo). O form de criação agora tem o multiselect "Tipos de tarefa (Trackers)" (pré-selecionado com o tracker padrão da config) e envia tracker_ids; sem seleção, usa o tracker padrão como fallback.

[1.5.6]

Corrigido

  • Criação de projeto Redmine falhava em instâncias com campos personalizados obrigatórios de projeto (ex.: "Tipo de Projeto", "Tipo de Faturamento"): o form das abas Redmine agora exibe esses campos (dropdown para listas) e os envia como custom_field_values.
  • Identificador é normalizado (minúsculas) na criação — "GNA" virava "Identificador não é válido".
  • O "Sincronizar Metadados" da aba de projeto fazia um sync parcial que apagava trackers/status/prioridades do cache; agora usa o sync completo (inclui usuários).

[1.5.5]

Corrigido

  • Se a issue Redmine vinculada a um chamado foi apagada no Redmine, o plugin reusava o ID órfão e falhava ("Tarefa não é válido"). Agora ele verifica se a issue ainda existe; se não, remove o vínculo órfão e recria a issue.

[1.5.4]

Corrigido

  • Lançamento de tempo: o campo comentário é obrigatório em algumas configs do Redmine. Se a tarefa do GLPI não tiver descrição, o plugin agora envia um comentário padrão ("Tempo lançado via GLPI (chamado #N)") em vez de vazio.

Notas

  • A Atividade do lançamento de tempo é por projeto no Redmine: a atividade configurada como padrão precisa estar habilitada no projeto vinculado.

[1.5.3]

Corrigido

  • Vínculo gravava o ID errado do projeto Redmine: o merge do Twig renumera chaves inteiras, então o dropdown gravava o índice (posição) em vez do ID real do projeto. As opções passam a ser montadas no PHP (preservam os IDs).

Adicionado

  • Botão Desvincular na aba Redmine (projeto e entidade) — antes só dava pra vincular.
  • A visão "vinculado" mostra o nome do projeto Redmine (não só o ID).
  • Dropdown de projetos lista apenas projetos ativos (evita vincular projeto fechado/arquivado).

[1.5.2]

Corrigido

  • Compatibilidade com GLPI 11.0.4: Toolbox::logError() não existe nessa versão e causava erro fatal (undefined method logError) ao criar issue / lançar tempo / garantir membership. Substituído por Toolbox::logInFile('redmine', ...), disponível em todas as versões.

[1.5.1]

Corrigido

  • Compatibilidade com GLPI 11.0.4: o formulário de configuração usava o macro fields.csrfField() (só existe a partir de versões mais novas), causando Macro "csrfField" is not defined. Agora o token CSRF é emitido via csrf_token_value (PHP), e o campo de URL usa textField — compatível com 11.0.0+.

[1.5.0]

Adicionado

  • Kill switch de licença Mindtek / Mind Place (requisito do marketplace): o plugin só ativa e registra seus hooks se a licença for válida (\GlpiPlugin\Mindplace\License::isValid()). Sem Mind Place ou com licença inválida, o plugin é desativado por segurança, sem erros.

[1.4.0]

Adicionado

  • Vínculo Entidade GLPI → Projeto Redmine (1:1, match exato, sem herança de árvore), via aba Redmine em Administração → Entidades — para clientes de suporte recorrente cujos chamados nascem na entidade, sem projeto.
  • Documentação de API para desenvolvedores (docs/API.md).

Alterado

  • Resolução do projeto Redmine no hook passa a considerar, além do projeto vinculado, a entidade do chamado como fallback.
  • Templates do tab generalizados (owner_field/owner_id) para reuso entre Projeto e Entidade.

[1.3.0]

Adicionado

  • Mapeamento de usuários GLPI → Redmine (auto-match por e-mail + overrides manuais).
  • Autoria real de issues e lançamentos de tempo via impersonation (X-Redmine-Switch-User).
  • Inclusão automática do técnico como membro do projeto Redmine (papel configurável).
  • Observadores padrão configuráveis nas issues.

[1.2.0]

Adicionado

  • Formulário de configuração com valores padrão da issue (tracker, prioridade, atividade).
  • Mapa de status Chamado GLPI → Status Redmine.
  • Categoria padrão por vínculo de projeto.
  • "Sincronizar Metadados" passa a cachear trackers, status, prioridades, atividades e usuários.

Alterado

  • createIssue/logTime enriquecidos com os valores padrão.
  • Tempo só é enviado ao Redmine quando a tarefa é marcada como "Feito".

[1.1.0]

Adicionado

  • Tabela de mapeamento Chamado → Issue (uma issue por chamado) e Tarefa → lançamento de tempo.

Corrigido

  • Issue duplicada a cada salvamento de tarefa.
  • Dupla contagem de tempo em edições de tarefa.
  • Resolução do projeto Redmine pelo vínculo salvo (em vez de identificador adivinhado).
  • Vínculo direto chamado↔projeto lido da tabela correta do GLPI 11 (glpi_itils_projects).

Segurança

  • Chave de API criptografada em repouso (GLPIKey), com migração da chave existente.

[1.0.0]

Adicionado

  • Versão inicial: vínculo de projeto, configuração de URL/chave e criação básica de issues/tempo.