Ir para o conteúdo principal

Radar Inteligente de Incidentes

  • Após conectar o banco do MySQL do Netservice via ODBC no Codex.
  • Utilize as Query abaixo para ele consultar os dados necessários e extrairmos as informações via CSV.

Resumo

  • 🚨 Query 1 - Radar → O que fazer AGORA
  • 📊 Query 2 - Evolução → Estamos melhorando?
  • 🔁 Query 3 - Recorrência → O que repete?
  • 💥 Query 4 - Problema → Qual é a causa raiz?

Query 1 — ICs abertos / Radar

🎯 Objetivo

Mostrar a situação atual dos incidentes em aberto, identificando risco e necessidade de ação imediata.

👉 Tradução: O que precisa de atenção AGORA?

🔍 O que ela analisa

  • ICs em aberto
  • Dias em aberto
  • Dias sem movimentação
  • Responsável atual
  • Time/Sistema
  • Classificação de risco (Crítico, Atenção, Controlado)
  • Falhas de processo (sem status)
  • Tempo por departamento (Atendimento, Análise, Infra, etc.)

💡 Para que serve

  • Identificar ICs críticos
  • Ver ICs parados
  • Direcionar ação dos P.Os e Supervisores
  • Entender onde está o gargalo (área)
  • Evitar crise
SELECT
    t.TarefaID AS IC,
    t.Titulo AS Titulo,
    e.NomeEmpresa AS Cliente,
    s.NomeSistema AS TimeSistema,
    m.NomeModulo AS Produto,
    a.NomeAtividade AS Servico,
    u.NomeUsuario AS ResponsavelAtual,
    COALESCE(st.NomeSituacao, 'Sem status') AS StatusAtual,
    t.DataCriacao AS DataAbertura,
    DATEDIFF(CURDATE(), t.DataCriacao) AS DiasEmAberto,
    lm.UltimaMovimentacao AS UltimaMovimentacao,
    DATEDIFF(CURDATE(), COALESCE(lm.UltimaMovimentacao, t.DataCriacao)) AS DiasSemMovimentacao,

    CASE
        WHEN DATEDIFF(CURDATE(), t.DataCriacao) >= 15 THEN 'Crítico'
        WHEN DATEDIFF(CURDATE(), t.DataCriacao) BETWEEN 12 AND 14 THEN 'Atenção'
        ELSE 'Controlado'
    END AS ClassificacaoRadar,

    CASE
        WHEN DATEDIFF(CURDATE(), COALESCE(lm.UltimaMovimentacao, t.DataCriacao)) >= 5 THEN 'Sim'
        ELSE 'Não'
    END AS FlagSemMovimentacao,

    CASE
        WHEN DATEDIFF(CURDATE(), t.DataCriacao) >= 30 THEN 'Sim'
        ELSE 'Não'
    END AS FlagMuitoAntigo,

    CASE
        WHEN st.NomeSituacao IS NULL OR st.NomeSituacao = '' THEN 'Sim'
        ELSE 'Não'
    END AS FlagStatusAusente,

    COALESCE(td.DiasAtendimento, 0) AS DiasAtendimento,
    COALESCE(td.DiasAnalise, 0) AS DiasAnalise,
    COALESCE(td.DiasInfraestruturaBancoDados, 0) AS DiasInfraestruturaBancoDados,
    COALESCE(td.DiasOutrosDepartamentos, 0) AS DiasOutrosDepartamentos

FROM netservice.tarefas t

LEFT JOIN netservice.empresas e 
    ON e.EmpresaID = t.EmpresaID

LEFT JOIN netservice.modulos m 
    ON m.ModuloID = t.ModuloID

LEFT JOIN netservice.sistemas s 
    ON s.SistemaID = m.SistemaID

LEFT JOIN netservice.atividades a 
    ON a.AtividadeID = t.AtividadeID

LEFT JOIN netservice.usuarios u 
    ON u.UsuarioID = t.ResponsavelID

LEFT JOIN netservice.situacoestarefas st 
    ON st.SituacaoTarefaID = t.SituacaoTarefaID

LEFT JOIN (
    SELECT 
        TarefaID, 
        MAX(DataAtribuicao) AS UltimaMovimentacao
    FROM netservice.andamentostarefas
    GROUP BY TarefaID
) lm 
    ON lm.TarefaID = t.TarefaID

LEFT JOIN (
    SELECT
        mov.TarefaID,

        SUM(
            CASE 
                WHEN dep.NomeDepartamento = 'Atendimento'
                  OR dep.DepartamentoID = 3
                THEN mov.DiasNoDepartamento 
                ELSE 0 
            END
        ) AS DiasAtendimento,

        SUM(
            CASE 
                WHEN dep.DepartamentoID = 1
                THEN mov.DiasNoDepartamento 
                ELSE 0 
            END
        ) AS DiasAnalise,

        SUM(
            CASE 
                WHEN dep.DepartamentoID = 6
                THEN mov.DiasNoDepartamento 
                ELSE 0 
            END
        ) AS DiasInfraestruturaBancoDados,

        SUM(
            CASE 
                WHEN dep.NomeDepartamento IS NULL
                  OR (
                      dep.NomeDepartamento <> 'Atendimento'
                      AND dep.DepartamentoID NOT IN (1, 3, 6)
                  )
                THEN mov.DiasNoDepartamento 
                ELSE 0 
            END
        ) AS DiasOutrosDepartamentos

    FROM (
        SELECT
            atf.AndamentoTarefaID,
            atf.TarefaID,
            atf.DestinoID,
            DATEDIFF(
                COALESCE((
                    SELECT MIN(atf2.DataAtribuicao)
                    FROM netservice.andamentostarefas atf2
                    WHERE atf2.TarefaID = atf.TarefaID
                      AND (
                          atf2.DataAtribuicao > atf.DataAtribuicao
                          OR (
                              atf2.DataAtribuicao = atf.DataAtribuicao 
                              AND atf2.AndamentoTarefaID > atf.AndamentoTarefaID
                          )
                      )
                ), NOW()),
                atf.DataAtribuicao
            ) AS DiasNoDepartamento

        FROM netservice.andamentostarefas atf

        INNER JOIN netservice.tarefas tf
            ON tf.TarefaID = atf.TarefaID
           AND tf.Tipo = 4
           AND tf.DataEncerramento IS NULL
    ) mov

    LEFT JOIN netservice.usuarios ud 
        ON ud.UsuarioID = mov.DestinoID

    LEFT JOIN netservice.departamentos dep 
        ON dep.DepartamentoID = ud.DepartamentoID

    GROUP BY mov.TarefaID
) td 
    ON td.TarefaID = t.TarefaID

WHERE 
    t.Tipo = 4
    AND t.DataEncerramento IS NULL

ORDER BY 
    DiasEmAberto DESC, 
    DiasSemMovimentacao DESC

OBSERVAÇÃO: GERAR AQUIVO COM NOME: ICs abertos (Radar)


Query 2 — ICs fechados / Evolução por Período

🎯 Objetivo

Medir a eficiência e evolução dos times ao longo do tempo.

👉 Tradução: Medir a eficiência e evolução dos times ao longo do tempo / Estamos melhorando ou piorando?

🔍 O que ela analisa

  • ICs encerrados no período
  • Tempo para resolução
  • ICs dentro do prazo
  • ICs fora do prazo
  • Volume por time/sistema

💡 Para que serve

  • Ver se estamos melhorando
  • Medir desempenho dos times
  • Acompanhar SLA
  • Mostrar evolução para diretoria
SELECT
    t.TarefaID AS IC,
    t.Titulo AS Titulo,
    e.NomeEmpresa AS Cliente,
    s.NomeSistema AS TimeSistema,
    m.NomeModulo AS Produto,
    a.NomeAtividade AS Servico,
    u.NomeUsuario AS ResponsavelAtual,
    COALESCE(st.NomeSituacao, 'Sem status') AS StatusAtual,
    t.DataCriacao AS DataAbertura,
    t.DataEncerramento AS DataEncerramento,

    DATEDIFF(t.DataEncerramento, t.DataCriacao) AS DiasParaEncerrar,

    CASE
        WHEN DATEDIFF(t.DataEncerramento, t.DataCriacao) <= 15 THEN 'Dentro do prazo'
        ELSE 'Fora do prazo'
    END AS ClassificacaoEncerramento

FROM netservice.tarefas t

LEFT JOIN netservice.empresas e ON e.EmpresaID = t.EmpresaID
LEFT JOIN netservice.modulos m ON m.ModuloID = t.ModuloID
LEFT JOIN netservice.sistemas s ON s.SistemaID = m.SistemaID
LEFT JOIN netservice.atividades a ON a.AtividadeID = t.AtividadeID
LEFT JOIN netservice.usuarios u ON u.UsuarioID = t.ResponsavelID
LEFT JOIN netservice.situacoestarefas st ON st.SituacaoTarefaID = t.SituacaoTarefaID

WHERE 
    t.Tipo = 4
    AND t.DataEncerramento IS NOT NULL
    AND t.DataEncerramento BETWEEN '2026-04-01' AND '2026-04-30'

ORDER BY 
    t.DataEncerramento DESC;

OBSERVAÇÃO: GERAR AQUIVO COM NOME: ICs fechados por período

Query 3 — Recorrência de Incidentes

🎯 Objetivo

Identificar padrões de incidentes que estão se repetindo.

👉 Tradução: O que está se repetindo?

🔍 O que ela analisa

  • Volume de incidentes por Sistema/Produto/Serviço
  • Quantidade de clientes afetados
  • Frequência nos últimos X dias

💡 Para que serve

  • Identificar erros recorrentes
  • Detectar áreas problemáticas
  • Priorizar correções
  • Identificar tendência

Importante: ela não prova que é o mesmo problema. Ela só aponta possíveis recorrências por contexto operacional. Para saber se é o mesmo erro, precisa olhar título/descrição, que é o objetivo da query 4.

SELECT
    s.NomeSistema AS TimeSistema,
    m.NomeModulo AS Produto,
    a.NomeAtividade AS Servico,
    e.NomeEmpresa AS Cliente,

    COUNT(*) AS TotalIncidentes,
    MIN(t.DataCriacao) AS PrimeiroRegistro,
    MAX(t.DataCriacao) AS UltimoRegistro,

    SUM(CASE 
        WHEN t.DataEncerramento IS NULL THEN 1 
        ELSE 0 
    END) AS IncidentesAbertos,

    SUM(CASE 
        WHEN t.DataEncerramento IS NOT NULL THEN 1 
        ELSE 0 
    END) AS IncidentesFechados

FROM netservice.tarefas t

LEFT JOIN netservice.empresas e ON e.EmpresaID = t.EmpresaID
LEFT JOIN netservice.modulos m ON m.ModuloID = t.ModuloID
LEFT JOIN netservice.sistemas s ON s.SistemaID = m.SistemaID
LEFT JOIN netservice.atividades a ON a.AtividadeID = t.AtividadeID

WHERE 
    t.Tipo = 4
    AND t.DataCriacao >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)

GROUP BY
    s.NomeSistema,
    m.NomeModulo,
    a.NomeAtividade,
    e.NomeEmpresa

HAVING COUNT(*) >= 3

ORDER BY 
    TotalIncidentes DESC;

OBSERVAÇÃO: GERAR AQUIVO COM NOME: Recorrência

Query 4 - Candidatos a Problema ITIL

🎯 Objetivo

Trazer incidentes para análise profunda, permitindo identificar se existe um problema real (causa raiz).

👉 Tradução: Isso aqui é realmente o mesmo erro ou não?

🔍 O que ela analisa

  • IC
  • Cliente
  • Sistema/Time
  • Produto
  • Serviço
  • Título
  • Descrição do incidente
  • Status (aberto/fechado)
  • Data

Importante: NÃO agrupa e NÃO conclui sozinho

💡 Para que serve

  • Permitir análise humana ou GPT
  • Identificar mesmo erro em múltiplos clientes
  • Detectar causa raiz
  • Decidir abertura de Problema (ITIL)
SELECT
    t.TarefaID AS IC,
    e.NomeEmpresa AS Cliente,
    s.NomeSistema AS TimeSistema,
    m.NomeModulo AS Produto,
    a.NomeAtividade AS Servico,
    t.Titulo AS Titulo,
    t.Descricao AS DescricaoIncidente,
    COALESCE(st.NomeSituacao, 'Sem status') AS StatusAtual,
    t.DataCriacao AS DataCriacao,
    t.DataEncerramento AS DataEncerramento,

    CASE
        WHEN t.DataEncerramento IS NULL THEN 'Aberto'
        ELSE 'Fechado'
    END AS SituacaoIC

FROM netservice.tarefas t

LEFT JOIN netservice.empresas e
    ON e.EmpresaID = t.EmpresaID

LEFT JOIN netservice.modulos m
    ON m.ModuloID = t.ModuloID

LEFT JOIN netservice.sistemas s
    ON s.SistemaID = m.SistemaID

LEFT JOIN netservice.atividades a
    ON a.AtividadeID = t.AtividadeID

LEFT JOIN netservice.situacoestarefas st
    ON st.SituacaoTarefaID = t.SituacaoTarefaID

WHERE
    t.Tipo = 4
    AND t.DataCriacao >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)

ORDER BY
    s.NomeSistema,
    m.NomeModulo,
    a.NomeAtividade,
    t.DataCriacao DESC;

OBSERVAÇÃO: GERAR AQUIVO COM NOME: Candidatos a Problema ITIL