Initial GLPI daily report workflow
This commit is contained in:
@@ -0,0 +1,230 @@
|
||||
# Resumo Diário GLPI - MVP
|
||||
|
||||
Workflow N8N inicial para gerar um resumo diário de chamados usando dados simulados.
|
||||
|
||||
## Subir o N8N com Docker
|
||||
|
||||
1. Copie `.env.example` para `.env`.
|
||||
2. Edite `.env` e troque `N8N_BASIC_AUTH_PASSWORD` e `N8N_ENCRYPTION_KEY`.
|
||||
3. Suba o container:
|
||||
|
||||
```powershell
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
4. Acesse:
|
||||
|
||||
```text
|
||||
http://localhost:5678
|
||||
```
|
||||
|
||||
5. Para parar:
|
||||
|
||||
```powershell
|
||||
docker compose down
|
||||
```
|
||||
|
||||
## Arquivo
|
||||
|
||||
- `Resumo Diario GLPI - MVP.n8n.json`
|
||||
- `Resumo Diario GLPI - Real Slack.n8n.json`
|
||||
- `Resumo Diario GLPI - SQL Slack.n8n.json`
|
||||
- `Resumo Semanal GLPI - SQL Slack.n8n.json`
|
||||
- `sql/indicadores_diario_glpi.sql`
|
||||
- `sql/indicadores_semana_glpi.sql`
|
||||
|
||||
## Workflow Diário Recomendado
|
||||
|
||||
Use este workflow para o relatório diário correto:
|
||||
|
||||
- `Resumo Diario GLPI - SQL Slack.n8n.json`
|
||||
|
||||
Essa versão usa a regra aprendida com a query semanal, mas aplicada por dia:
|
||||
|
||||
- chamados abertos no dia: `DATE(glpi_tickets.date) = data_alvo`
|
||||
- chamados fechados no dia: `DATE(glpi_tickets.closedate) = data_alvo`
|
||||
- chamados fechados no dia podem ter sido abertos em qualquer data anterior
|
||||
- filtro `is_deleted = false`
|
||||
- filtro de categorias pelas árvores `7`, `16`, `17` e `18` usando `ancestors_cache`
|
||||
|
||||
### Como configurar o diário SQL
|
||||
|
||||
1. Importe `Resumo Diario GLPI - SQL Slack.n8n.json`.
|
||||
2. Configure a credencial MySQL no node `MySQL - Indicadores diario GLPI`.
|
||||
3. Abra `Config - Diario SQL` e preencha:
|
||||
|
||||
- `data_alvo`: deixe vazio para o dia atual ou use `2026-07-03`
|
||||
- `slack_webhook_url`
|
||||
- `openai_api_key`
|
||||
- `openai_model`, padrão `gpt-5.5`
|
||||
|
||||
4. Execute pelo `Manual Trigger`.
|
||||
|
||||
Se a OpenAI falhar, o workflow envia o resumo fallback sem IA com os números SQL.
|
||||
|
||||
## Workflow SQL Recomendado
|
||||
|
||||
Para bater exatamente com os indicadores do GLPI, use:
|
||||
|
||||
- `Resumo Semanal GLPI - SQL Slack.n8n.json`
|
||||
|
||||
Essa versão consulta diretamente o banco MySQL/MariaDB do GLPI e executa a mesma lógica da query de referência:
|
||||
|
||||
- abertos pela coluna `glpi_tickets.date`
|
||||
- fechados pela coluna `glpi_tickets.closedate`
|
||||
- filtro `is_deleted = false`
|
||||
- filtro de categorias pelas árvores `7`, `16`, `17` e `18` usando `ancestors_cache`
|
||||
|
||||
Isso é diferente da API REST, que pode não trazer todos os chamados necessários para reproduzir o indicador semanal, principalmente porque chamados fechados na semana podem ter sido abertos em semanas anteriores.
|
||||
|
||||
### Como configurar
|
||||
|
||||
1. Importe `Resumo Semanal GLPI - SQL Slack.n8n.json`.
|
||||
2. Configure a credencial MySQL no node `MySQL - Indicadores semana GLPI`.
|
||||
3. Abra `Config - Slack e OpenAI` e preencha:
|
||||
|
||||
- `slack_webhook_url`
|
||||
- `openai_api_key`
|
||||
- `openai_model`, padrão `gpt-5.5`
|
||||
|
||||
4. Execute pelo `Manual Trigger`.
|
||||
|
||||
Se a OpenAI falhar, o workflow envia um resumo fallback sem IA com os números da query.
|
||||
|
||||
## Como usar
|
||||
|
||||
1. No N8N, vá em `Workflows`.
|
||||
2. Clique em `Import from File`.
|
||||
3. Selecione `Resumo Diario GLPI - MVP.n8n.json`.
|
||||
4. Abra o node `OpenAI - Gerar resumo`.
|
||||
5. Selecione sua credencial da OpenAI.
|
||||
6. Execute o workflow pelo `Manual Trigger`.
|
||||
|
||||
## Fluxo
|
||||
|
||||
```text
|
||||
Manual Trigger
|
||||
↓
|
||||
Set - Dados simulados
|
||||
↓
|
||||
Code - Calcular indicadores
|
||||
↓
|
||||
OpenAI - Gerar resumo
|
||||
```
|
||||
|
||||
## Próxima etapa
|
||||
|
||||
Depois que o MVP estiver gerando o texto corretamente, substitua o node `Set - Dados simulados` pelos nodes HTTP Request do GLPI.
|
||||
|
||||
## Workflow Real com GLPI e Slack
|
||||
|
||||
Importe o arquivo:
|
||||
|
||||
- `Resumo Diario GLPI - Real Slack.n8n.json`
|
||||
|
||||
Depois da importação, abra o node `Config - GLPI e Slack` e preencha:
|
||||
|
||||
- `glpi_url`: URL base do GLPI, exemplo `https://glpi.suaempresa.com.br`
|
||||
- `glpi_app_token`: App Token do GLPI
|
||||
- `glpi_user_token`: User Token do usuário de integração
|
||||
- `slack_webhook_url`: URL do Incoming Webhook do Slack
|
||||
- `range_tickets`: quantidade buscada na API, exemplo `0-999`
|
||||
- `page_size`: tamanho de cada pagina buscada no GLPI, padrao `1000`
|
||||
- `page_count`: quantidade de paginas por ordenacao, padrao `2`
|
||||
- `data_alvo`: data do relatório. Deixe vazio para usar o dia atual, ou informe uma data como `2026-07-03` ou `03/07/26`
|
||||
- `openai_api_key`: chave da OpenAI usada pelo node `OpenAI - Gerar resumo`
|
||||
- `openai_model`: modelo usado na OpenAI, padrão `gpt-5.5`
|
||||
|
||||
O node `OpenAI - Gerar resumo` usa `HTTP Request` direto para `https://api.openai.com/v1/chat/completions`.
|
||||
|
||||
O workflow busca tickets em paginas e combina duas ordenacoes:
|
||||
|
||||
- `id DESC`, para capturar chamados abertos recentemente
|
||||
- `date_mod DESC`, para capturar chamados antigos que foram modificados, solucionados ou fechados recentemente
|
||||
|
||||
Depois ele remove duplicados por `id` e filtra no N8N pela `data_alvo`. O cálculo separa:
|
||||
|
||||
- chamados abertos na data, usando `date_creation`, `date` ou `data_abertura`
|
||||
- chamados fechados na data, usando `solvedate`, `closedate` ou `data_fechamento`
|
||||
- pendentes, usando o status atual do ticket filtrado
|
||||
|
||||
Na base atual, o GLPI informou `1216` tickets. Por isso o padrão recomendado é `page_size=1000` e `page_count=2`, cobrindo `0-1999` por ordenação sem estourar o total. Se aumentar `page_count`, o GLPI pode retornar `ERROR_RANGE_EXCEED_TOTAL` para páginas acima do total existente.
|
||||
|
||||
Execute pelo `Manual Trigger` primeiro. Depois que validar, troque por `Schedule Trigger`.
|
||||
|
||||
Para gerar o relatório da sexta-feira `03/07/2026`, use no campo `data_alvo`:
|
||||
|
||||
```text
|
||||
2026-07-03
|
||||
```
|
||||
|
||||
### Criar Webhook no Slack
|
||||
|
||||
1. Acesse `https://api.slack.com/apps`.
|
||||
2. Crie ou abra um app do Slack.
|
||||
3. Ative `Incoming Webhooks`.
|
||||
4. Crie um webhook para o canal desejado.
|
||||
5. Copie a URL para o campo `slack_webhook_url`.
|
||||
|
||||
### Fluxo Real
|
||||
|
||||
```text
|
||||
Manual Trigger
|
||||
↓
|
||||
Config - GLPI e Slack
|
||||
↓
|
||||
HTTP - GLPI initSession
|
||||
↓
|
||||
HTTP - GLPI buscar tickets
|
||||
↓
|
||||
Code - Filtrar chamados de hoje
|
||||
↓
|
||||
Code - Calcular indicadores
|
||||
↓
|
||||
OpenAI - Gerar resumo
|
||||
↓
|
||||
HTTP - Slack enviar mensagem
|
||||
↓
|
||||
HTTP - GLPI killSession
|
||||
```
|
||||
|
||||
### Observação
|
||||
|
||||
Os campos retornados pelo GLPI podem variar conforme versão e configuração. Se o node `Code - Filtrar chamados de hoje` retornar categoria ou cliente como ID em vez de nome, ajuste o mapeamento depois de ver o retorno real da API.
|
||||
|
||||
### Erro Slack `400 - no_text`
|
||||
|
||||
Se o node `HTTP - Slack enviar mensagem` retornar `400 - no_text`, o corpo da requisição foi enviado sem o campo `text`.
|
||||
|
||||
No node `HTTP - Slack enviar mensagem`, configure:
|
||||
|
||||
- `Method`: `POST`
|
||||
- `Send Body`: ativo
|
||||
- `Body Content Type`: `JSON`
|
||||
- `Specify Body`: `Using JSON`
|
||||
- `JSON Body`:
|
||||
|
||||
```json
|
||||
{
|
||||
"text": "{{ $json.text }}"
|
||||
}
|
||||
```
|
||||
|
||||
### Erro OpenAI `too many requests`
|
||||
|
||||
Se o node `OpenAI - Gerar resumo` retornar `The service is receiving too many requests from you`, a OpenAI respondeu com limite de uso/rate limit.
|
||||
|
||||
Verifique:
|
||||
|
||||
- Se a chave `openai_api_key` está correta
|
||||
- Se a conta OpenAI tem crédito/billing ativo
|
||||
- Se houve muitas execuções seguidas em pouco tempo
|
||||
- Se o modelo `gpt-4o-mini` está disponível para a chave usada
|
||||
|
||||
O workflow importável já está configurado com retry:
|
||||
|
||||
- 3 tentativas
|
||||
- 30 segundos entre tentativas
|
||||
- limite de resposta de 700 tokens
|
||||
|
||||
Se a OpenAI continuar falhando, o workflow continua a execução e envia ao Slack um resumo técnico gerado pelo node `Code - Preparar mensagem Slack`, sem IA.
|
||||
Reference in New Issue
Block a user