# Changelog Todas as mudanças relevantes deste plugin são documentadas aqui. O formato segue [Keep a Changelog](https://keepachangelog.com/pt-BR/1.0.0/) e o versionamento segue [SemVer](https://semver.org/lang/pt-BR/). ## [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.