- 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>
6.8 KiB
6.8 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-dev] — em desenvolvimento (branch main; estável = stable/1.x)
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), tabelaglpi_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).
[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
syncUsersfazia 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
mergedo 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 porToolbox::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), causandoMacro "csrfField" is not defined. Agora o token CSRF é emitido viacsrf_token_value(PHP), e o campo de URL usatextField— 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/logTimeenriquecidos 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.