diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..bec7caf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,44 @@ +# 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.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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb26009 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +# Redmine Integration para GLPI + +Integração nativa entre o **GLPI** e o **Redmine** para gestão de projetos: transforme o trabalho registrado nos chamados do GLPI em tarefas (issues) e lançamentos de tempo no Redmine, automaticamente e com os autores corretos. + +> Desenvolvido pela **Mindtek** · Licença GPLv3+ · Requer GLPI ≥ 11.0.0 + +--- + +## O problema que resolve + +Equipes que **executam o atendimento no GLPI** mas **gerenciam projetos e horas no Redmine** acabam lançando tempo em dois lugares — ou perdem a rastreabilidade. Este plugin elimina o retrabalho: o técnico continua trabalhando normalmente no chamado do GLPI, e o Redmine recebe a tarefa e as horas **sem nenhuma digitação dupla**. + +## Como funciona + +``` +Projeto GLPI ───(vínculo manual na aba "Redmine")──▶ Projeto Redmine + +Chamado GLPI ──────────────────────────────────────▶ 1 ISSUE no Redmine + • título = título do chamado + • tipo / prioridade / atividade = padrões configuráveis + • categoria = padrão por projeto + • status = espelha o status do chamado (mapa configurável) + +TicketTask "Feito" ────────────────────────────────▶ 1 lançamento de TEMPO na issue + • horas = tempo gasto da tarefa (convertido p/ decimal) + • autor = o técnico que lançou (via impersonation) + • comentário = descrição da tarefa +``` + +- **Uma issue por chamado**: o chamado nasce e "morre" no GLPI; para o Redmine importam as **horas** e o **andamento**. +- **Tempo só sobe quando a tarefa é concluída** (`Feito`): enquanto não concluída, fica apenas no GLPI. +- **Autores corretos**: a issue é criada como o **técnico atribuído** e cada lançamento de tempo como o **técnico que o registrou**, usando *impersonation* do Redmine — não tudo como "admin". + +## Funcionalidades + +- ✅ Vínculo de Projeto GLPI ↔ Projeto Redmine (criar novo ou vincular existente), com módulos, subprojeto e visibilidade. +- ✅ Criação automática de **issues** a partir dos chamados, com valores padrão (tracker, prioridade, atividade) e **categoria por projeto**. +- ✅ Lançamento automático de **tempo** das tarefas concluídas (idempotente — sem duplicar). +- ✅ **Mapa de status** Chamado GLPI → Status Redmine, totalmente configurável. +- ✅ **Autoria real** via *impersonation* (`X-Redmine-Switch-User`), com **inclusão automática do técnico como membro** do projeto Redmine. +- ✅ **Mapeamento de usuários** GLPI → Redmine: associação automática por e-mail + overrides manuais. +- ✅ **Observadores padrão** configuráveis nas issues. +- ✅ Chave de API **criptografada** em repouso (GLPIKey). +- ✅ Interface 100% nativa do GLPI 11 (componentes Twig). + +## Requisitos + +| Requisito | Detalhe | +|---|---| +| GLPI | ≥ 11.0.0 | +| Redmine | API REST **habilitada** (Administração → Configurações → API) | +| Chave de API | de um usuário **administrador** do Redmine (necessária para impersonation e gestão de membros) | +| Conectividade | o GLPI precisa alcançar a URL do Redmine | + +## Instalação + +1. Copie a pasta `redmine` para o diretório de plugins do GLPI (`plugins/`). +2. Em **Configurar → Plugins**, instale e ative o **Redmine Integration**. + +## Configuração (passo a passo) + +Acesse **Configurar → Plugins → Redmine Integration**: + +1. **Conexão** — informe a **URL do Redmine** e a **Chave de API** (admin). Clique em **Sincronizar Metadados**. +2. **Valores padrão** — escolha o **Tipo (tracker)**, **Prioridade** e **Atividade** padrão das issues/tempos. +3. **Autores e observadores** — defina o **Papel padrão** (usado para adicionar o técnico como membro do projeto) e os **Observadores padrão**. +4. **Mapa de status** — para cada status de chamado do GLPI, escolha o status correspondente no Redmine. +5. **Mapeamento de usuários** — usuários com o **mesmo e-mail** nos dois sistemas são associados automaticamente; cadastre *overrides* apenas para as exceções. + +Depois, em cada **Projeto** do GLPI, abra a aba **Redmine** para vincular ao projeto correspondente no Redmine e definir a **categoria padrão**. + +## Fluxo de uso + +1. Vincule o Projeto GLPI ao Projeto Redmine (aba Redmine do projeto). +2. A partir de uma **tarefa de projeto**, crie um **chamado** ("Criar chamado a partir desta tarefa de projeto"). +3. No chamado, o técnico registra **tarefas (TicketTask)** e o tempo gasto. +4. Ao marcar a tarefa como **Feito**, o plugin cria/atualiza a issue no Redmine e lança o tempo — com o autor correto. + +## Notas e limitações + +- O tempo de uma tarefa é lançado **uma única vez** (ao concluir). Edições posteriores de horas não re-sincronizam. +- A *impersonation* exige que o usuário Redmine exista e seja **membro do projeto** — o plugin adiciona o técnico automaticamente; se não houver usuário correspondente, o lançamento usa o admin (com aviso em log). +- Categorias do Redmine são **por projeto**: a categoria padrão é definida no vínculo de cada projeto. + +## Suporte + +Mindtek — integração GLPI/Redmine.