Found running the real validation execution against DEV: the envios
digest table starts empty (the normal state for every day until the
first successful send), the "get" operation returned 0 rows, and n8n
does not execute downstream nodes when a node outputs 0 items -- so
Code - Guard de Envio Slack, the IF, the real Slack node, and everything
else in the send branch silently never ran. This would have broken the
happy path on every single day in production, not just an edge case.
Fixed with alwaysOutputData: true on that node (forces at least one
output item even with 0 matches; the resulting empty {} item doesn't
false-positive in alreadySentSuccessfully since none of its fields match
a real record's shape). Re-ran the validation execution after the fix:
Code - Guard de Envio Slack now runs correctly (shouldSend: false,
reason: 'send_disabled' with SEND_ENABLED=false as expected), and the
IF node's true branch (Slack - Enviar Mensagem) is confirmed to never
fire while disabled.
Added a regression test asserting alwaysOutputData on this node.
157/157 tests passing.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Coordenador GLPI - Chamados Abertos
Projeto n8n para atuar como coordenador diario de Suporte de TI, analisando chamados abertos no GLPI e enviando no Slack os 10 chamados que precisam de acao imediata.
Objetivo
Todos os dias uteis, o workflow consulta o banco do GLPI, calcula um score operacional para cada chamado aberto e envia uma lista priorizada no Slack.
O foco nao e apenas listar chamados antigos. O ranking considera:
- SLA vencido ou proximo de vencer
- tempo sem interacao humana
- prioridade, urgencia e impacto
- idade do chamado
- chamado sem tecnico atribuido
- chamados em categorias e entidades reais do GLPI
Arquivos
Coordenador GLPI - Chamados Abertos Slack.n8n.json: workflow importavel no n8nsql/top_10_chamados_abertos_glpi.sql: query base usada pelo workflow.env.example: variaveis para subir n8n localmentedocker-compose.yml: n8n local via Docker
Como configurar
- Suba o n8n local, se necessario:
docker compose up -d
- Acesse:
http://localhost:5678
- Importe o workflow:
Coordenador GLPI - Chamados Abertos Slack.n8n.json
- Configure a credencial MySQL no node:
MySQL - Top 10 chamados abertos
- Abra o node
Config - Coordenador GLPIe preencha:
slack_webhook_url: webhook do canal Slackdias_sem_interacao_alerta: padrao2horas_sla_risco: padrao8
-
Execute pelo
Manual Triggerpara validar. -
Ative o workflow para rodar pelo
Schedule Trigger - Dias uteis 08h.
Metodologia de priorizacao
Cada chamado aberto recebe um score_criticidade, mas a lista final nao e mais apenas o top 10 geral. O workflow monta a lista por blocos para evitar que chamados muito antigos monopolizem todos os dias.
Blocos do top 10:
- 3 chamados com SLA vencido mais criticos
- 3 chamados com maior tempo sem interacao
- 2 chamados sem tecnico atribuido
- 2 chamados de prioridade alta mais recentes
Se algum bloco nao tiver chamados suficientes, o complemento vem do ranking geral.
O mesmo chamado nao entra duas vezes. Se ele ja apareceu em um bloco anterior, e removido dos blocos seguintes.
Score
Pesos principais:
- SLA vencido:
+100 - SLA vencendo nas proximas horas configuradas:
+45 - chamado sem interacao ha 7 dias ou mais:
+35 - chamado sem interacao ha 3 a 6 dias:
+25 - chamado sem interacao ha 1 a 2 dias:
+10 - prioridade GLPI:
priority * 8 - urgencia GLPI:
urgency * 5 - impacto GLPI:
impact * 5 - idade do chamado: ate
+30 - sem tecnico atribuido:
+25
O resultado e ordenado por:
score_criticidadedesc- chamados com SLA vencido primeiro
- maior tempo sem interacao
- chamados mais antigos
Reincidencia
O workflow controla reincidencia usando staticData global do n8n, sem gravar nada no banco do GLPI.
Regra:
- apareceu 1 vez: normal
- apareceu 2 dias seguidos: marcado como reincidente
- apareceu 3 dias seguidos ou mais: escalar para coordenacao
Campos salvos no staticData:
ultima_data_disparoultimos_chamados_enviadosreincidencia_chamados
Se o workflow for duplicado, recriado ou importado como novo workflow, esse historico pode ser perdido porque pertence ao workflow no n8n.
Tempo sem interacao
O campo dias_sem_interacao considera a maior data encontrada entre:
- followups publicos do chamado:
date,date_mod,date_creation - tarefas do chamado:
date,date_mod,date_creation - modificacao do chamado:
glpi_tickets.date_mod - abertura do chamado:
glpi_tickets.date
Isso evita marcar um chamado como parado quando alguem acabou de adicionar ou alterar uma tarefa no GLPI, mesmo que a tarefa esteja planejada para outro dia.
Se a maior data encontrada estiver no futuro por causa de uma tarefa planejada, o contador fica em 0 dias sem interacao, evitando valores negativos no relatorio.
Regra de chamados abertos
O SQL considera abertos todos os chamados com:
is_deleted = false
AND status NOT IN (5, 6)
Este gatilho principal ignora chamados das categorias:
ADMINISTRATIVODESENVOLVIMENTOINFRA
O filtro usa o nome completo da categoria (completename) ou o nome simples (name) iniciando com esses termos, entao tambem remove subcategorias dessas filas.
No GLPI, normalmente:
5: solucionado6: fechado
Campos usados
A query usa tabelas comuns do GLPI:
glpi_ticketsglpi_itilcategoriesglpi_entitiesglpi_itilfollowupsglpi_tickettasksglpi_tickets_usersglpi_users
Se sua versao do GLPI tiver customizacoes, valide primeiro a query sql/top_10_chamados_abertos_glpi.sql diretamente no banco.
Saida no Slack
O Slack recebe uma mensagem curta com:
- top 10 chamados para atacar hoje
- tecnico atribuido, quando existir
- SLA
- dias sem interacao
- dias aberto
- reincidencia
- link do chamado, se
glpi_base_urlestiver configurado no workflow
Campos removidos da mensagem para reduzir ruido:
- motivo
- acao
- prazo
Se o agente de IA falhar, o workflow envia a mensagem curta gerada por codigo, sem depender da IA.
Agente de IA do n8n com Z IA
O workflow usa o node:
AI Agent - Revisar mensagem
Por padrao, ele esta conectado ao node:
Z IA Chat Model
Esse node usa o chat model compativel com OpenAI do n8n, mas a credencial deve ser configurada para a Z IA.
A IA nao monta mais a mensagem do zero. O node Code - Reincidencia e mensagem curta monta a mensagem final de forma deterministica, e a IA apenas revisa clareza e reduz texto.
Regras do prompt:
- nao adicionar fatos
- nao criar motivo
- nao criar acao
- nao criar prazo
- nao alterar IDs, tecnicos, datas, SLA, dias, reincidencia ou links
- nao usar tom agressivo
No n8n, abra o node:
Z IA Chat Model
Configure:
- credencial
Z IA - endpoint/base URL da Z IA, se a credencial permitir
- modelo correto disponibilizado pela Z IA, por exemplo
glm-4.5-flash
No arquivo importavel deixei o modelo como glm-4.5-flash. Se sua conta Z IA usar outro nome de modelo, troque pelo nome exato exibido na plataforma.
Se aparecer The resource you are requesting could not be found, revise principalmente:
- Base URL da credencial: normalmente
https://api.z.ai/api/paas/v4 - Modelo: precisa existir na sua conta, por exemplo
glm-4.5-flash - Chave API: precisa ser da Z IA, nao da OpenAI
- Node usado: mantenha
Z IA Chat Modelconectado aoAI Agent - Revisar mensagem
Se a Z IA aparecer no seu n8n como node proprio, mantenha o AI Agent - Revisar mensagem e substitua somente o subnode Z IA Chat Model pelo modelo oficial da Z IA.
Recomendacao direta
Nao trate isso como relatorio bonito. Trate como fila diaria de comando.
Minha sugestao operacional:
- rodar as 08h no canal da lideranca de suporte
- exigir responsavel e prazo para cada um dos 10 chamados ate 10h
- repetir apenas os chamados que continuarem parados no dia seguinte
- se um chamado aparecer 3 dias seguidos, escalar para coordenacao/gestao
- separar um segundo workflow para chamados sem tecnico atribuido, porque isso e falha de triagem, nao backlog comum
- criar outro alerta intradiario para SLA vencendo nas proximas 2 horas
Se quiser resultado real, nao basta notificar. Tem que transformar a mensagem do Slack em ritual diario de cobranca.