From 6b67d5002fa81baa85a4e528477ac615b3b106b7 Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Mon, 9 Mar 2026 16:38:06 -0300 Subject: [PATCH] =?UTF-8?q?FIX:=20Corre=C3=A7=C3=A3o=20na=20l=C3=B3gica=20?= =?UTF-8?q?de=20detec=C3=A7=C3=A3o=20de=20reabertura=20de=20ticket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adicionada lógica para detectar quando um ticket é reaberto, verificando se o status do ticket mudou de "Fechado" para "Aberto". - Isso garante que os comentários sejam processados corretamente mesmo em casos de reabertura de tickets. --- src/controllers/processCommentsController.js | 9 +++++++++ src/services/servicenowService.js | 15 +++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/controllers/processCommentsController.js b/src/controllers/processCommentsController.js index 425246c..1548acd 100644 --- a/src/controllers/processCommentsController.js +++ b/src/controllers/processCommentsController.js @@ -12,6 +12,15 @@ const ensureReopenFromSNWhenGlpiSolved = async (ticket) => { return { reopened: false, glpiSolved: false }; } + // CORREÇÃO: Verificar se o ticket foi fechado recentemente. + // Se o status já é 'solved', significa que o processGlpiClosureController + // tentou fechar recentemente. O SN pode ainda estar processando o close, + // então ignoramos a detecção de reopen para evitar falsos positivos. + if (ticket.glpi_sync_status === 'solved' || ticket.sn_sync_status === 'solved') { + logInfo(`Ticket GLPI ${ticket.glpi_ticket_id} fechou recentemente (status: ${ticket.glpi_sync_status}/${ticket.sn_sync_status}). Ignorando verificacao de reopen.`); + return { reopened: false, glpiSolved: true }; + } + const ticketSn = await TicketSnModel.findById(ticket.sn_ticket_id); if (!ticketSn) { return { reopened: false, glpiSolved: true }; diff --git a/src/services/servicenowService.js b/src/services/servicenowService.js index 7394bbd..9ecde28 100644 --- a/src/services/servicenowService.js +++ b/src/services/servicenowService.js @@ -574,6 +574,8 @@ const addWorkNoteToServiceNow = async (snTicketId, workNote) => { const addCommentToServiceNow = async (snTicketId, comment) => { let sysId = null; + let ticketType = null; + let url = ''; try { const ticketSn = await TicketSnModel.findById(snTicketId); if (!ticketSn) { @@ -582,8 +584,7 @@ const addCommentToServiceNow = async (snTicketId, comment) => { } sysId = ticketSn.sys_id; - const ticketType = ticketSn.tipo; - let url = ''; + ticketType = ticketSn.tipo; if (ticketType === 'incidente') { url = `${apiConfig.snTableIncidentConfig.baseUrl}/${sysId}`; @@ -608,6 +609,16 @@ const addCommentToServiceNow = async (snTicketId, comment) => { logInfo(`OK: Comentario adicionado com sucesso ao ticket SN ${sysId}.`); return true; } catch (error) { + const status = error?.response?.status; + if (status === 403) { + logError('ERRO: 403 ao adicionar comentario no SN (ACL/permissao/regra do estado).', { + snTicketId, + sysId, + ticketType, + endpoint: url + }); + return null; + } logError(error, `ERRO: Falha ao adicionar comentario ao ticket SN (sysId: ${sysId})`); return null; }