Schedule GLPI report by business day
This commit is contained in:
@@ -33,32 +33,41 @@ docker compose down
|
|||||||
- `sql/indicadores_diario_glpi.sql`
|
- `sql/indicadores_diario_glpi.sql`
|
||||||
- `sql/indicadores_semana_glpi.sql`
|
- `sql/indicadores_semana_glpi.sql`
|
||||||
|
|
||||||
## Workflow Diário Recomendado
|
## Workflow Recomendado
|
||||||
|
|
||||||
Use este workflow para o relatório diário correto:
|
Use este workflow para o relatório automatico correto:
|
||||||
|
|
||||||
- `Resumo Diario GLPI - SQL Slack.n8n.json`
|
- `Resumo Diario GLPI - SQL Slack.n8n.json`
|
||||||
|
|
||||||
Essa versão usa a regra aprendida com a query semanal, mas aplicada por dia:
|
Essa versão roda de segunda a sexta as 08:00 e escolhe o periodo automaticamente:
|
||||||
|
|
||||||
- chamados abertos no dia: `DATE(glpi_tickets.date) = data_alvo`
|
- terca-feira: envia o relatorio da segunda-feira
|
||||||
- chamados fechados no dia: `DATE(glpi_tickets.closedate) = data_alvo`
|
- quarta-feira: envia o relatorio da terca-feira
|
||||||
- chamados fechados no dia podem ter sido abertos em qualquer data anterior
|
- quinta-feira: envia o relatorio da quarta-feira
|
||||||
|
- sexta-feira: envia o relatorio da quinta-feira
|
||||||
|
- segunda-feira: envia o relatorio da semana anterior inteira, de segunda a domingo
|
||||||
|
|
||||||
|
Essa versão usa a regra aprendida com a query semanal, aplicada ao periodo selecionado:
|
||||||
|
|
||||||
|
- chamados abertos no periodo: `glpi_tickets.date` entre `data_inicio` e `data_fim`
|
||||||
|
- chamados fechados no periodo: `glpi_tickets.closedate` entre `data_inicio` e `data_fim`
|
||||||
|
- chamados fechados no periodo podem ter sido abertos em qualquer data anterior
|
||||||
- filtro `is_deleted = false`
|
- filtro `is_deleted = false`
|
||||||
- filtro de categorias pelas árvores `7`, `16`, `17` e `18` usando `ancestors_cache`
|
- filtro de categorias pelas árvores `7`, `16`, `17` e `18` usando `ancestors_cache`
|
||||||
|
|
||||||
### Como configurar o diário SQL
|
### Como configurar o SQL automatico
|
||||||
|
|
||||||
1. Importe `Resumo Diario GLPI - SQL Slack.n8n.json`.
|
1. Importe `Resumo Diario GLPI - SQL Slack.n8n.json`.
|
||||||
2. Configure a credencial MySQL no node `MySQL - Indicadores diario GLPI`.
|
2. Configure a credencial MySQL no node `MySQL - Indicadores diario GLPI`.
|
||||||
3. Abra `Config - Diario SQL` e preencha:
|
3. Abra `Config - Diario SQL` e preencha:
|
||||||
|
|
||||||
- `data_alvo`: deixe vazio para o dia atual ou use `2026-07-03`
|
- `data_alvo`: deixe vazio para o modo automatico ou use `2026-07-03` para teste manual de um dia especifico
|
||||||
- `slack_webhook_url`
|
- `slack_webhook_url`
|
||||||
- `openai_api_key`
|
- `openai_api_key`
|
||||||
- `openai_model`, padrão `gpt-5.5`
|
- `openai_model`, padrão `gpt-5.5`
|
||||||
|
|
||||||
4. Execute pelo `Manual Trigger`.
|
4. Execute pelo `Manual Trigger` para testar.
|
||||||
|
5. Ative o workflow para usar o `Schedule Trigger - Dias uteis 08h`.
|
||||||
|
|
||||||
Se a OpenAI falhar, o workflow envia o resumo fallback sem IA com os números SQL.
|
Se a OpenAI falhar, o workflow envia o resumo fallback sem IA com os números SQL.
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,12 +1,13 @@
|
|||||||
-- Query diaria base. No workflow N8N, a data alvo e substituida dinamicamente.
|
-- Query base por periodo. No workflow N8N, as datas sao substituidas dinamicamente.
|
||||||
-- Regra:
|
-- Regra:
|
||||||
-- - abertos: glpi_tickets.date na data alvo
|
-- - abertos: glpi_tickets.date entre DATA_INICIO e DATA_FIM
|
||||||
-- - fechados: glpi_tickets.closedate na data alvo
|
-- - fechados: glpi_tickets.closedate entre DATA_INICIO e DATA_FIM
|
||||||
-- - fechados podem ter sido abertos em dias/semanas anteriores
|
-- - fechados podem ter sido abertos em dias/semanas anteriores
|
||||||
-- - categorias filtradas pelas arvores 7, 16, 17 e 18
|
-- - categorias filtradas pelas arvores 7, 16, 17 e 18
|
||||||
|
|
||||||
SELECT
|
SELECT
|
||||||
'{DATA_ALVO}' AS data_alvo,
|
'{DATA_INICIO}' AS data_inicio,
|
||||||
|
'{DATA_FIM}' AS data_fim,
|
||||||
COALESCE(abertos.abertos, 0) AS abertos,
|
COALESCE(abertos.abertos, 0) AS abertos,
|
||||||
COALESCE(fechados.fechados, 0) AS fechados,
|
COALESCE(fechados.fechados, 0) AS fechados,
|
||||||
COALESCE(fechados.fechados, 0) - COALESCE(abertos.abertos, 0) AS saldo,
|
COALESCE(fechados.fechados, 0) - COALESCE(abertos.abertos, 0) AS saldo,
|
||||||
@@ -19,7 +20,8 @@ FROM
|
|||||||
SELECT COUNT(*) AS abertos
|
SELECT COUNT(*) AS abertos
|
||||||
FROM glpi_tickets
|
FROM glpi_tickets
|
||||||
WHERE is_deleted = false
|
WHERE is_deleted = false
|
||||||
AND DATE(date) = '{DATA_ALVO}'
|
AND date >= '{DATA_INICIO}'
|
||||||
|
AND date < DATE_ADD('{DATA_FIM}', INTERVAL 1 DAY)
|
||||||
AND itilcategories_id IN (
|
AND itilcategories_id IN (
|
||||||
SELECT id FROM glpi_itilcategories
|
SELECT id FROM glpi_itilcategories
|
||||||
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
||||||
@@ -34,7 +36,8 @@ CROSS JOIN
|
|||||||
FROM glpi_tickets
|
FROM glpi_tickets
|
||||||
WHERE closedate IS NOT NULL
|
WHERE closedate IS NOT NULL
|
||||||
AND is_deleted = false
|
AND is_deleted = false
|
||||||
AND DATE(closedate) = '{DATA_ALVO}'
|
AND closedate >= '{DATA_INICIO}'
|
||||||
|
AND closedate < DATE_ADD('{DATA_FIM}', INTERVAL 1 DAY)
|
||||||
AND itilcategories_id IN (
|
AND itilcategories_id IN (
|
||||||
SELECT id FROM glpi_itilcategories
|
SELECT id FROM glpi_itilcategories
|
||||||
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
||||||
@@ -80,7 +83,10 @@ CROSS JOIN
|
|||||||
FROM glpi_tickets t
|
FROM glpi_tickets t
|
||||||
LEFT JOIN glpi_itilcategories c ON c.id = t.itilcategories_id
|
LEFT JOIN glpi_itilcategories c ON c.id = t.itilcategories_id
|
||||||
WHERE t.is_deleted = false
|
WHERE t.is_deleted = false
|
||||||
AND (DATE(t.date) = '{DATA_ALVO}' OR DATE(t.closedate) = '{DATA_ALVO}')
|
AND (
|
||||||
|
(t.date >= '{DATA_INICIO}' AND t.date < DATE_ADD('{DATA_FIM}', INTERVAL 1 DAY))
|
||||||
|
OR (t.closedate IS NOT NULL AND t.closedate >= '{DATA_INICIO}' AND t.closedate < DATE_ADD('{DATA_FIM}', INTERVAL 1 DAY))
|
||||||
|
)
|
||||||
AND t.itilcategories_id IN (
|
AND t.itilcategories_id IN (
|
||||||
SELECT id FROM glpi_itilcategories
|
SELECT id FROM glpi_itilcategories
|
||||||
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
||||||
@@ -101,7 +107,10 @@ CROSS JOIN
|
|||||||
FROM glpi_tickets t
|
FROM glpi_tickets t
|
||||||
LEFT JOIN glpi_entities e ON e.id = t.entities_id
|
LEFT JOIN glpi_entities e ON e.id = t.entities_id
|
||||||
WHERE t.is_deleted = false
|
WHERE t.is_deleted = false
|
||||||
AND (DATE(t.date) = '{DATA_ALVO}' OR DATE(t.closedate) = '{DATA_ALVO}')
|
AND (
|
||||||
|
(t.date >= '{DATA_INICIO}' AND t.date < DATE_ADD('{DATA_FIM}', INTERVAL 1 DAY))
|
||||||
|
OR (t.closedate IS NOT NULL AND t.closedate >= '{DATA_INICIO}' AND t.closedate < DATE_ADD('{DATA_FIM}', INTERVAL 1 DAY))
|
||||||
|
)
|
||||||
AND t.itilcategories_id IN (
|
AND t.itilcategories_id IN (
|
||||||
SELECT id FROM glpi_itilcategories
|
SELECT id FROM glpi_itilcategories
|
||||||
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
WHERE JSON_CONTAINS(ancestors_cache, '{"7":7}') OR id = 7
|
||||||
|
|||||||
Reference in New Issue
Block a user