From 8b14faade2f68996ae5aff9cd7279e889995c783 Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Wed, 10 Sep 2025 20:52:12 -0300 Subject: [PATCH] =?UTF-8?q?WIP=20:=20Conex=C3=A3o=20com=20o=20banco=20de?= =?UTF-8?q?=20dados=20GLPI=20e=20processo=20de=20cria=C3=A7=C3=A3o=20do=20?= =?UTF-8?q?ticketGlpiModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/glpiDataBase.js | 26 +++++++ src/models/ticketGlpiModel.js | 132 ++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 src/data/glpiDataBase.js diff --git a/src/data/glpiDataBase.js b/src/data/glpiDataBase.js new file mode 100644 index 0000000..644769c --- /dev/null +++ b/src/data/glpiDataBase.js @@ -0,0 +1,26 @@ +// src/data/glpiDatabase.js +// Configuração da conexão com o banco de dados mariaDB do GLPI +const mysql = require('mysql2/promise'); +const { logInfo, logError, logWarning } = require('../utils/logger'); + +const glpiPool = mysql.createPool({ + host: '177.73.177.32', + port: 3306, + database: process.env.GLPI_DB_NAME, + user: 'snglpi', + password: 'j2633669', + connectionLimit: 10, + acquireTimeout: 60000, + timeout: 60000 +}); + +// Testar conexão +glpiPool.on('connection', (connection) => { + logInfo('Nova conexão GLPI estabelecida'); +}); + +glpiPool.on('error', (err) => { + logError('Erro na pool GLPI:', err); +}); + +module.exports = glpiPool; \ No newline at end of file diff --git a/src/models/ticketGlpiModel.js b/src/models/ticketGlpiModel.js index e69de29..b300602 100644 --- a/src/models/ticketGlpiModel.js +++ b/src/models/ticketGlpiModel.js @@ -0,0 +1,132 @@ +// src/models/ticketGlpiModel.js +const glpiPool = require('../data/glpiDataBase'); +const { logInfo, logError } = require('../utils/logger'); + +class TicketGlpiModel { + // Mapeamento de status ServiceNow → GLPI + static mapStatus(snState) { + const statusMap = { + '1': 1, // Aguardando Atendimento → Novo + '2': 2, // Em Andamento → Em andamento + '3': 3, // Pendente → Pendente + '6': 5, // Resolvido → Resolvido + '7': 6 // Fechado → Fechado + }; + return statusMap[snState] || 1; + } + + // Mapeamento de prioridade + static mapPriority(snPriority) { + const priorityMap = { + '1': 5, // Crítico → Muito alta + '2': 4, // Alto → Alta + '3': 3, // Moderado → Média + '4': 2, // Baixo → Baixa + '5': 1 // Planejamento → Muito baixa + }; + return priorityMap[snPriority] || 3; + } + + // Mapeamento de categoria + static mapCategory(shortDescription) { + const categoryMap = { + 'Problemas com Telefonia Fixa': 5717, // PABX IP Nuvem + 'Problemas com Internet': 5720, // Link Dedicado + 'Problemas com Wi-Fi/Rede Corporativa': 5722, // Wifi + 'Wi-fi Clientes': 5722 // Wifi + }; + return categoryMap[shortDescription] || 5717; + } + + // Criar ticket no GLPI + static async createTicket(snTicket, mapping) { + const connection = await glpiPool.getConnection(); + + try { + await connection.beginTransaction(); + + // 1. Preparar dados para o GLPI + const glpiTicketData = { + entities_id: mapping.entityId || 1371, + name: snTicket.short_description?.value || 'Sem título', + date: snTicket.sys_created_on?.value ? new Date(snTicket.sys_created_on.value) : new Date(), + date_mod: snTicket.sys_updated_on?.value ? new Date(snTicket.sys_updated_on.value) : new Date(), + status: this.mapStatus(snTicket.state?.value), + users_id_recipient: mapping.userId || 917, + requesttypes_id: 1, + content: snTicket.description?.value || '', + urgency: this.mapUrgency(snTicket.urgency?.value), + impact: this.mapImpact(snTicket.impact?.value), + priority: this.mapPriority(snTicket.priority?.value), + type: 1, // Incidente + itilcategories_id: this.mapCategory(snTicket.short_description?.value), + global_validation: 1, + date_creation: snTicket.sys_created_on?.value ? new Date(snTicket.sys_created_on.value) : new Date() + }; + + // 2. Inserir ticket principal + const ticketQuery = ` + INSERT INTO glpi_tickets SET ? + `; + + const [ticketResult] = await connection.execute(ticketQuery, [glpiTicketData]); + const ticketId = ticketResult.insertId; + + // 3. Adicionar requerente + const requesterQuery = ` + INSERT INTO glpi_tickets_users + (tickets_id, users_id, type, use_notification, alternative_email) + VALUES (?, ?, 1, 1, '') + `; + await connection.execute(requesterQuery, [ticketId, mapping.userId || 917]); + + // 4. Adicionar grupo + const groupQuery = ` + INSERT INTO glpi_groups_tickets + (tickets_id, groups_id, type) + VALUES (?, ?, 2) + `; + await connection.execute(groupQuery, [ticketId, mapping.groupId || 30]); + + await connection.commit(); + + logInfo(`✅ Ticket GLPI criado: ${ticketId}`, { + glpi_ticket_id: ticketId, + sn_ticket_number: snTicket.number?.value, + location: snTicket.location?.display_value + }); + + return ticketId; + + } catch (error) { + await connection.rollback(); + logError(error, `❌ Erro ao criar ticket GLPI para ${snTicket.number?.value}`); + throw error; + } finally { + connection.release(); + } + } + + // Verificar se ticket já existe no GLPI + static async ticketExists(snTicketNumber) { + try { + const query = ` + SELECT id FROM glpi_tickets + WHERE name LIKE ? OR content LIKE ? + LIMIT 1 + `; + + const [rows] = await glpiPool.execute(query, [ + `%${snTicketNumber}%`, + `%${snTicketNumber}%` + ]); + + return rows.length > 0 ? rows[0].id : null; + } catch (error) { + logError(error, 'Erro ao verificar ticket existente'); + return null; + } + } +} + +module.exports = TicketGlpiModel; \ No newline at end of file