From f8095c80e59664abe9ecca41065c71ea45cbfdd5 Mon Sep 17 00:00:00 2001 From: tulioperdigao <116309232+tulioperdigao@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:31:26 -0300 Subject: [PATCH] =?UTF-8?q?WIP:=20Atualiza=20bancos=20de=20dados=20em=20si?= =?UTF-8?q?tua=C3=A7=C3=A3o=20de=20fechamento=20de=20chamado.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/model/hubglpiModel.js | 22 ++++++- src/model/hubsoftModel.js | 23 ++++++- src/services/ticketService.js | 121 +++++++++++++++++++++++++++++++++- 3 files changed, 160 insertions(+), 6 deletions(-) diff --git a/src/model/hubglpiModel.js b/src/model/hubglpiModel.js index 6e3494b..52b5606 100644 --- a/src/model/hubglpiModel.js +++ b/src/model/hubglpiModel.js @@ -208,8 +208,26 @@ class HubglpiModel { logError(`Erro ao inserir mensagem de erro na tabela sync_data: ${err}`); throw err; } + } + + static async updateSyncDataStatus(id_atendimento, status_sync, source_last) { + const query = ` + UPDATE sync_data + SET status_sync = $1, + source_last = $2 + WHERE hubsoft_ticket_id = $3 + RETURNING *; + `; + const values = [status_sync, source_last, id_atendimento]; + + try { + const res = await pool.query(query, values); + return res.rows[0]; + } catch (err) { + logError(`Erro ao atualizar status_sync na tabela sync_data: ${err}`); + throw err; } + } + } - - module.exports = HubglpiModel; diff --git a/src/model/hubsoftModel.js b/src/model/hubsoftModel.js index 6812bec..e2f5880 100644 --- a/src/model/hubsoftModel.js +++ b/src/model/hubsoftModel.js @@ -24,7 +24,28 @@ const validateAtendimentoStatus = (id_atendimento) => { const validateMensagensByAtendimento = (id_atendimento) => { const query = `SELECT id_atendimento_mensagem, id_atendimento, mensagem, data_cadastro FROM atendimento_mensagem WHERE id_atendimento = ${id_atendimento} ;` return pool.query(query); -} +} + +const updateFechaAtendimento = async (id_atendimento, closingMessage) => { + const query = ` + UPDATE atendimento + SET descricao_fechamento = $1, + data_fechamento = $2, + status_atendimento = $3 + WHERE id_atendimento = $4; + `; + + // Precisamos descobrir qual é o status de "Fechado" no Hubsoft + + const values = [closingMessage, new Date(), 'Solucionado', id_atendimento]; + try { + const res = await pool.query(query, values); + return res.rows[0]; + } catch (err) { + logError(`Erro ao atualizar fechamento de atendimento: ${err}`); + throw err; + } +} module.exports = { getAtendimentosFromDB, validateAtendimentoStatus, validateMensagensByAtendimento diff --git a/src/services/ticketService.js b/src/services/ticketService.js index b93add0..ca1f7ac 100644 --- a/src/services/ticketService.js +++ b/src/services/ticketService.js @@ -1,7 +1,122 @@ // HUBXGLPI/src/services/ticketService.js + +const { log } = require("winston"); +const { get_idSyncByGlpiID } = require("../model/hubglpiModel.js"); +const { updateSyncDataStatus } = require("../model/syncDataModel.js"); +const { closeAtendimento } = require("./hubsoftService.js"); + +// { +// "item": { +// "id": 27779, +// "itemtype": "Ticket", +// "items_id": 34213, +// "content": "
Closing Task<\/p>", +// "user": { +// "id": 917, +// "name": "rafael.lopes" +// }, +// "user_editor": null +// }, +// "event": "new", +// "parent_item": { +// "id": 34213, +// "name": "TESTE", +// "content": "
teste<\/p>", +// "is_deleted": false, +// "urgency": 3, +// "impact": 3, +// "priority": 3, +// "actiontime": 0, +// "date_creation": "2025-11-03T16:26:12-03:00", +// "date_mod": "2025-11-05T10:44:03-03:00", +// "date": "2025-11-03T16:26:12-03:00", +// "type": 1, +// "external_id": "", +// "status": { +// "id": 5, +// "name": "Solucionado" +// }, +// "category": { +// "id": 5814, +// "name": "HubSoft" +// }, +// "location": null, +// "request_type": { +// "id": 1, +// "name": "Helpdesk" +// }, +// "entity": { +// "id": 0, +// "name": "Contratos Ativos", +// "completename": "Contratos Ativos" +// }, +// "team": [] +// } +// } + +const updateSyncStatus = async (ticketId, ticketTitle) => { + try { + //verificar se titulo contem "Mundiale" + if (ticketTitle.includes("Mundiale")) { + const exists = await get_idSyncByGlpiID(ticketId); + if (exists) { + log.info( + `-> Atualizando banco de dados para o glpi ticket ID ${ticketId} que será fechado.` + ); + const updateResult = await updateSyncDataStatus( + ticketId, + "pending_close", + "glpi" + ); + + if (updateResult) { + log.info( + `Status de sync_data atualizado para fechamento do glpi ticket ID ${ticketId}.` + ); + return true; + } else { + log.error( + `Falha ao atualizar status de sync_data para o glpi ticket ID ${ticketId}.` + ); + return false; + } + } + } else { + log.info( + `Ticket ID ${ticketId} não relacionado à Mundiale. Ignorando fechamento.` + ); + } + } catch (error) {} + }; + const fechaTicket = async (bodyRequest) => { - console.log('Ticket recebido no service:', bodyRequest); - return { bodyRequest }; -} + const ticketId = bodyRequest.item.items_id; + const ticketTitle = bodyRequest.parent_item.name; + const closingMessage = bodyRequest.item.content || "Fechamento automático do ticket."; + + try { + const updateStatus = await updateSyncStatus(ticketId, ticketTitle); + if (updateStatus) { + log.info(`-> Iniciando fechamento do atendimento no HubSoft para o ticket ID ${ticketId}.`); + const closeResponse = await closeAtendimento(ticketId, closingMessage); + + if (closeResponse.status === "success") { + log.info(`Atendimento no HubSoft fechado com sucesso para o ticket ID ${ticketId}.`); + const dbHubsoftClose = await updateFechaAtendimento(ticketId, closingMessage); + if (dbHubsoftClose) { + log.info(`Banco de dados atualizado com sucesso para o fechamento do atendimento ID ${ticketId}.`); + return closeResponse; + } else { + log.error(`Falha ao atualizar o banco de dados para o fechamento do atendimento ID ${ticketId}.`); + return closeResponse; + } + } else { + log.error(`Falha ao fechar atendimento no HubSoft para o ticket ID ${ticketId}. Resposta: ${JSON.stringify(closeResponse)}`); + } + } + } catch (error) { + log.error(`Erro ao fechar atendimento no HubSoft para o ticket ID ${ticketId}: ${error}`); + } +}; module.exports = { fechaTicket };