From 89f7bba7b21c6a00eb304424ab55494905331a46 Mon Sep 17 00:00:00 2001 From: "gabriel.amancio" Date: Fri, 10 Oct 2025 09:06:44 -0300 Subject: [PATCH] FEAT: Abertura de atendimento no GLPI. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Padronização de titulo, descrição e entidade. - Insert no GLPI. --- controller/processController.js | 99 ++++++++++++++++------------- model/glpiModel.js | 43 +++++-------- node_modules/.package-lock.json | 107 ++++++++++++++++++++++++++++++++ package-lock.json | 107 ++++++++++++++++++++++++++++++++ 4 files changed, 284 insertions(+), 72 deletions(-) diff --git a/controller/processController.js b/controller/processController.js index bed3522..75d3d62 100644 --- a/controller/processController.js +++ b/controller/processController.js @@ -31,30 +31,35 @@ const statusAtendimentoGLPI = { // Formata a descrição do ticket em HTML const formatDescription = (ticketData) => { - const { cliente_nome, codigo_cliente, servico_nome, ticket_mundiale, protocolo_hub, description } = ticketData; - - const tableRows = ` - Nome do Cliente:${cliente_nome} - Codigo Cliente:${codigo_cliente} - Serviço:${servico_nome} - Ticket Number (Mundiale):${ticket_mundiale || 'N/A'} - Protocolo Hub:${protocolo_hub || 'N/A'} - `; - - const htmlDescription = ` - - - - - - ${tableRows} -
CampoValor
-
- Descrição: -
- ${description || 'N/A'} - `; + let htmlDescription = ` + + + + + + + + + + + + + + + + + + + + + + + + + +
CampoValor
Nome:${ticketData.cliente_nome}
Codigo:${ticketData.codigo_cliente}
Serviço:${ticketData.servico_nome}
Ticket Mundiale${ticketData.ticket_mundiale}
Protocolo Hub (ServiceNow):${ticketData.protocolo_hub || 'N/A'}
+ `; console.log(htmlDescription); @@ -62,14 +67,14 @@ const formatDescription = (ticketData) => { }; -// Gera o entity_Name baseado nos campos do ticket -const generateEntityName = (ticketData) => { - const codigoClienteParts = (ticketData.codigo_cliente || '').split('-'); - const codigoServicoFirstPart = (ticketData.codigo_servico || '').split('-')[0]?.trim() || ''; - const clienteNome = ticketData.cliente_nome || ''; +// // Gera o entity_Name baseado nos campos do ticket +// const generateEntityName = (ticketData) => { +// const codigoClienteParts = (ticketData.codigo_cliente || '').split('-'); +// const codigoServicoFirstPart = (ticketData.codigo_servico || '').split('-')[0]?.trim() || ''; +// const clienteNome = ticketData.cliente_nome || ''; - return [...codigoClienteParts, codigoServicoFirstPart, clienteNome].join(''); -}; +// return [...codigoClienteParts, codigoServicoFirstPart, clienteNome].join(''); +// }; // Formata os dados do ticket para o GLPI @@ -79,14 +84,14 @@ const formatTicketDataForGlpi = async (ticketData) => { status_atendimento: statusAtendimentoGLPI[ticketData.status_atendimento] || 1, date_mod: new Date(), user_id_recipient: 971, - descricao_abertura: toString(formatDescription(ticketData)), + descricao_abertura: formatDescription(ticketData), urgency: 3, impact: 3, priority: 3, type: 1, itilcategories_id: 1, date_creation: new Date(), - entidades_id: await glpiModel.selectEntityId() //TODO: Implementar a busca da entidade + // entidades_id: 0 //await glpiModel.selectEntityId() //TODO: Implementar a busca da entidade }; return formattedData; }; @@ -100,15 +105,15 @@ const createGlpiTicket = async (ticketData) => { const formattedTicketData = await formatTicketDataForGlpi(ticketData); console.log('Dados do ticket formatados para GLPI:', formattedTicketData); - // const glpiTicket = await glpiModel.insertTicket(formattedTicketData); - // console.log('Ticket criado no GLPI:', glpiTicket); + const glpiTicket = await glpiModel.insertTicket(formattedTicketData); + console.log('Ticket criado no GLPI:', glpiTicket); - // const updateSyncData = await hubglpiModel.update_syncData(glpiTicket.id, ticketData.id_atendimento); - // logInfo('Sync Data atualizado com o ID do ticket do GLPI:', updateSyncData); + const updateSyncData = await hubglpiModel.update_syncData(glpiTicket.id, ticketData.id_atendimento); + logInfo('Sync Data atualizado com o ID do ticket do GLPI:', updateSyncData); } catch (error) { console.error('Erro ao criar ticket no GLPI:', error); - // const updateSyncDataError = await //hubglpiModel.update_syncaDataError(error.message, ticketData.id_atendimento) + // const updateSyncDataError = await hubglpiModel.update_syncaDataError(error.message, ticketData.id_atendimento) logError('Erro ao criar ticket no GLPI. Sync Data atualizado com a mensagem de erro: ', /*updateSyncDataError*/ error); } }; @@ -157,6 +162,19 @@ const saveTicketToHubGlpi = async (ticketData) => { const processAtendimento = async (ticketData) => { try { + const titulo = `Mundiale - Protocolo: ${ticketData.ticket_mundiale} - ${ticketData.cliente_nome}`; + ticketData.titulo = titulo; + + const selectedEntityCodServico = await glpiModel.selectEntityId(ticketData.codigo_servico); + if (!selectedEntityCodServico) { + const selectedEntityCodCliente = await glpiModel.selectEntityId(ticketData.codigo_cliente); + ticketData.entidades_id = selectedEntityCodCliente; + } else if (selectedEntityCodServico) { + ticketData.entidades_id = selectedEntityCodServico; + } else { + ticketData.entidades_id = 0; + } + console.log(ticketData.entidades_id) await createGlpiTicket(ticketData); } catch (error) { @@ -169,11 +187,6 @@ const processAtendimento = async (ticketData) => { // ================================================================================ const processaAtendimentos = async (skipHubSoft = false) => { - - - glpiModel.testConnection(); - - try { let atendimentosDB = []; @@ -208,7 +221,7 @@ const processaAtendimentos = async (skipHubSoft = false) => { // Processa o atendimento para o GLPI console.log(atendimento.id_atendimento) - console.log(atendimento) + // console.log(atendimento) await processAtendimento(atendimento); } catch (error) { diff --git a/model/glpiModel.js b/model/glpiModel.js index 290bbcb..0791bc4 100644 --- a/model/glpiModel.js +++ b/model/glpiModel.js @@ -17,24 +17,6 @@ const pool = mysql.createPool({ class GlpiModel { -static async testConnection() { - try { - const connection = await pool.getConnection(); - logInfo('Conexão com o banco de dados do GLPI estabelecida com sucesso!'); - - // Executa um select simples na tabela glpi_tickets - const [rows, fields] = await connection.execute('SELECT 1 FROM glpi_tickets LIMIT 1'); - logInfo('Query SELECT 1 FROM glpi_tickets executada com sucesso!'); - connection.release(); - return true; - } catch (error) { - logError('Erro ao testar a conexão com o banco de dados do GLPI:', error); - return false; - } - } - - - static async insertTicket(ticketData) { const query = ` @@ -44,7 +26,7 @@ static async testConnection() { date, date_mod, status, - user_id_recipient, + users_id_recipient, content, urgency, impact, @@ -59,8 +41,8 @@ static async testConnection() { const values = [ ticketData.entidades_id, - ticketData.cliente_nome, - ticketData.data_cadastro, + ticketData.titulo, + ticketData.created_at, ticketData.date_mod, ticketData.status_atendimento, ticketData.user_id_recipient, @@ -71,9 +53,9 @@ static async testConnection() { ticketData.type, ticketData.itilcategories_id, ticketData.date_creation, - ticketData.slas_id_ttr + 37 ]; - + console.log(query, values); try { const [rows] = await pool.execute(query, values); logInfo('Ticket inserido com sucesso:', rows); @@ -84,20 +66,23 @@ static async testConnection() { } } - static async selectEntityId(entity_name) { + static async selectEntityId(id) { + + const query = `SELECT id FROM glpi_entities WHERE name LIKE ? OR name LIKE ? LIMIT 1;`; + const values = [`%${id} -%`, `%${id}-%`]; - const query = `SELECT id FROM glpi_entities WHERE name = ?;`; - const values = [entity_name]; - try { const [rows] = await pool.execute(query, values); + if (!rows || rows.length === 0) { + logInfo('Entidade não encontrada para:', id); + return null; + } logInfo('Entidade encontrada:', rows[0]); - return rows[0]; + return Number(rows[0].id); } catch (err) { logError('Erro ao buscar entidade', err); throw err; } - } } diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 932a46f..eae2733 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -46,6 +46,15 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -213,6 +222,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -286,6 +304,22 @@ "node": ">= 0.4" } }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -333,6 +367,36 @@ "node": ">= 12.0.0" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -348,6 +412,38 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mysql2": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.2.tgz", + "integrity": "sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -555,6 +651,17 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", diff --git a/package-lock.json b/package-lock.json index 93a04fa..1b24d99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,6 +58,15 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -225,6 +234,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -298,6 +316,22 @@ "node": ">= 0.4" } }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -345,6 +379,36 @@ "node": ">= 12.0.0" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -360,6 +424,38 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mysql2": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.15.2.tgz", + "integrity": "sha512-kFm5+jbwR5mC+lo+3Cy46eHiykWSpUtTLOH3GE+AR7GeLq8PgfJcvpMiyVWk9/O53DjQsqm6a3VOOfq7gYWFRg==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -567,6 +663,17 @@ "node": ">=10" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",