From 4377bbe95219bc1d0d16e2c473afa1f44772a96a Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Mon, 13 Oct 2025 00:42:38 -0300 Subject: [PATCH] =?UTF-8?q?FEAT:=20Adicionado=20verifica=C3=A7=C3=A3o=20de?= =?UTF-8?q?=20pr=C3=A9=20exist=C3=AAncia=20de=20item=20no=20banco=20de=20d?= =?UTF-8?q?ados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Aplicação testada de ponta a ponta - Logs adicionados - Logs totais refatorados --- app.js | 7 ++- controller/processController.js | 85 +++++++++++++++++--------------- model/glpiModel.js | 20 ++++---- model/hubglpiModel.js | 63 +++++++++++++++++------ scripts/data/database2.sql | Bin 0 -> 6247 bytes 5 files changed, 109 insertions(+), 66 deletions(-) create mode 100644 scripts/data/database2.sql diff --git a/app.js b/app.js index 8eb42df..f6ca941 100644 --- a/app.js +++ b/app.js @@ -1,4 +1,9 @@ const hubsoftController = require('./controller/processController.js'); +logInfo('Aplicação iniciada', { + timestamp: new Date().toISOString(), + environment: process.env.NODE_ENV || 'development' +}); + // Inicia o processamento dos atendimentos -hubsoftController.processaAtendimentos(skipHubSoft = true); \ No newline at end of file +hubsoftController.processaAtendimentos(); \ No newline at end of file diff --git a/controller/processController.js b/controller/processController.js index 3a3192d..eec01db 100644 --- a/controller/processController.js +++ b/controller/processController.js @@ -61,22 +61,9 @@ const formatDescription = (ticketData) => { `; - console.log(htmlDescription); - return htmlDescription; }; - -// // 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(''); -// }; - - // Formata os dados do ticket para o GLPI const formatTicketDataForGlpi = async (ticketData) => { const formattedData = { @@ -102,23 +89,39 @@ const formatTicketDataForGlpi = async (ticketData) => { const createGlpiTicket = async (ticketData) => { try { + + 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); + logInfo(`Ticket criado no GLPI: ${glpiTicket.insertId} `); - await glpiModel.insertGroupTickets(glpiTicket.insertId); + //Atualiza que ticket foi criado ticketData.status_sync = 'created_glpi'; + ticketData.glpi_ticket_id = glpiTicket.insertId; + ticketData.created_at = new Date(); + ticketData.updated_at = new Date(); + const updateSyncData = await hubglpiModel.update_syncData(ticketData); - logInfo('Sync Data atualizado com o ID do ticket do GLPI:', updateSyncData); + logInfo(`Sync Data atualizado com o ID do ticket do GLPI: ${updateSyncData.glpi_ticket_id}`); + + + try { + //Insetingo ao grupo Operacao NOC + await glpiModel.insertGroupTickets(glpiTicket.insertId); + logInfo(`Atribuido grupo Operação NOC ao ticket no GLPI: ${glpiTicket.insertId} `) + + } catch (error) { + 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: ${error}`); + } + } catch (error) { - console.error('Erro ao criar ticket no GLPI:', error); - // 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); + + 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: ${error}`); } }; @@ -138,10 +141,6 @@ const processTicketFromHubSoft = async (atendimento) => { ticketData.status_atendimento = statusAtendimentoHubGlpi[ticketData.id_atendimento_status] || ticketData.id_atendimento_status; - console.log(typeof ticketData.descricao_abertura) - console.log(ticketData.descricao_abertura) - - ticketData.descricao_abertura = ticketData.descricao_abertura.replace(/[^0-9]/g, ''); ticketData.ticket_mundiale = parseInt(ticketData.descricao_abertura) || null; @@ -151,20 +150,29 @@ const processTicketFromHubSoft = async (atendimento) => { const saveTicketToHubGlpi = async (ticketData) => { try { const insertedTicket = await hubglpiModel.insertTicket(ticketData); - console.log('Ticket inserido/atualizado na tabela hubsoft_tickets:', insertedTicket); + logInfo(`Ticket inserido/atualizado na tabela hubsoft_tickets: ${insertedTicket.protocolo_hub}`); - const insertSyncData = await hubglpiModel.insertSyncData(ticketData.id_atendimento); - console.log('Dados inseridos/atualizados na tabela sync_data:', insertSyncData); + await hubglpiModel.insertSyncData(ticketData.id_atendimento); + logInfo('Dados inseridos/atualizados na tabela sync_data'); return insertedTicket; } catch (error) { - console.error('Erro ao salvar ticket no hubglpi:', error); + logError(`Erro ao salvar ticket no hubglpi: ${error}`); throw error; // Rejeita a promise para que o erro seja tratado no nível superior } }; const processAtendimento = async (ticketData) => { + try { + const glpiTicketId = await hubglpiModel.getGlpiTicketIdByAtendimentoId(ticketData.id_atendimento); + if (glpiTicketId) { + logInfo(`Ticket já inserido no GLPI para id_atendimento ${ticketData.id_atendimento}, pulando criação.`); + ticketData.status_sync = 'created_glpi'; + ticketData.glpi_ticket_id = glpiTicketId; + await hubglpiModel.update_syncData(ticketData); + return; + } const titulo = `Mundiale - Protocolo: ${ticketData.ticket_mundiale} - ${ticketData.cliente_nome}`; ticketData.titulo = titulo; @@ -178,11 +186,10 @@ const processAtendimento = async (ticketData) => { } else { ticketData.entidades_id = 0; } - console.log(ticketData.entidades_id) await createGlpiTicket(ticketData); } catch (error) { - console.error(`Erro ao processar atendimento ${id_atendimento}:`, error); + console.error(`Erro ao processar atendimento ${ticketData.id_atendimento}:`, error); } }; @@ -196,9 +203,9 @@ const processaAtendimentos = async (skipHubSoft = false) => { if (!skipHubSoft) { // Esta parte depende da VPN - console.log('Buscando atendimentos do HubSoft...'); + logInfo('Buscando atendimentos do HubSoft...'); atendimentosDB = await hubsoftModel.getAtendimentosFromDB(); - console.log(`Total de atendimentos obtidos do HubSoft: ${atendimentosDB.length}`); + logInfo(`Total de atendimentos obtidos do HubSoft: ${atendimentosDB.length}`); for (const atendimento of atendimentosDB) { try { @@ -208,12 +215,12 @@ const processaAtendimentos = async (skipHubSoft = false) => { await saveTicketToHubGlpi(ticketData); } catch (error) { - console.error(`Erro ao processar atendimento ${atendimento.id_atendimento}:`, error); + logError(`Erro ao processar atendimento ${atendimento.id_atendimento}:`, error); } } } else { - console.log('Pulando a busca de atendimentos do HubSoft (skipHubSoft = true).'); + logInfo('Pulando a busca de atendimentos do HubSoft (skipHubSoft = true)'); } // Coletando atendimentos do banco intermediário (hubglpi) @@ -223,18 +230,16 @@ const processaAtendimentos = async (skipHubSoft = false) => { for (const atendimento of atendimentosDB) { try { // Processa o atendimento para o GLPI - - console.log(atendimento.id_atendimento) - // console.log(atendimento) await processAtendimento(atendimento); + } catch (error) { - console.error(`Erro ao processar atendimento ${atendimento.id_atendimento}:`, error); + logError(`Erro ao processar atendimento ${atendimento.id_atendimento}:, ${error}`); } } } catch (error) { - console.error('Erro ao processar atendimentos:', error); + logError(`Erro ao processar atendimentos: ${error}`); } }; diff --git a/model/glpiModel.js b/model/glpiModel.js index 99f8aec..180246e 100644 --- a/model/glpiModel.js +++ b/model/glpiModel.js @@ -55,10 +55,8 @@ class GlpiModel { ticketData.date_creation, 37 ]; - console.log(query, values); try { - const [rows] = await pool.execute(query, values); - logInfo('Ticket inserido com sucesso:', rows); + const [rows] = await pool.execute(query, values) return rows; } catch (error) { logError('Erro ao inserir ticket:', error); @@ -74,13 +72,16 @@ class GlpiModel { try { const [rows] = await pool.execute(query, values); if (!rows || rows.length === 0) { - logInfo('Entidade não encontrada para:', id); + logInfo(`Entidade não encontrada para: ${id} `); return null; } - logInfo('Entidade encontrada:', rows[0]); + + logInfo(`Entidade encontrada para: ${id}`); + + return Number(rows[0].id); } catch (err) { - logError('Erro ao buscar entidade', err); + logError(`Erro ao buscar entidade: ${err}`); throw err; } } @@ -92,12 +93,11 @@ class GlpiModel { `; const values = [glpiTicketId, 25, 2]; try { - const res = await pool.query(query, values); - logInfo('ID de sync_data obtido com sucesso:', res.rows[0]); - return res.rows[0] ? res.rows[0].id : null; + const [rows] = await pool.query(query, values); + return rows && rows.insertId ? rows.insertId : null; } catch (err) { - logError('Erro ao obter ID de sync_data', err); + logError(`Erro ao Adicionar Grupo Operação NOC: ${err}`); throw err; } } diff --git a/model/hubglpiModel.js b/model/hubglpiModel.js index 39b2422..55845c9 100644 --- a/model/hubglpiModel.js +++ b/model/hubglpiModel.js @@ -54,15 +54,11 @@ class HubglpiModel { ticketData.data_cadastro ]; - console.log('Executando query de inserção/atualização na tabela hubsoft_tickets:', query, values); - - try { const res = await pool.query(query, values); - logInfo('Ticket Inserido/Atualizado na tabela hubsoft_tickets com sucesso:', res.rows[0]); return res.rows[0]; } catch (err) { - logError('Erro ao inserir/atualizar ticket na tabela hubsoft_tickets', err); + logError(`Erro ao inserir/atualizar ticket na tabela hubsoft_tickets: ${err}`); throw err; } } @@ -87,10 +83,9 @@ class HubglpiModel { try { const res = await pool.query(query, values); - logInfo('Dados inseridos/atualizados na tabela sync_data com sucesso:', res.rows[0]); return res.rows[0]; } catch (err) { - logError('Erro ao inserir/atualizar dados na tabela sync_data', err); + logError(`Erro ao inserir/atualizar dados na tabela sync_data: ${err}`); throw err; } } @@ -112,24 +107,24 @@ class HubglpiModel { sync_update.glpi_ticket_id, sync_update.status_sync, sync_update.sync_metadata, - sync_update.last_sync_attempt, + new Date(), sync_update.sync_error_message, - sync_update.sync_created_at, - sync_update.sync_updated_at, + sync_update.created_at, + sync_update.updated_at, sync_update.sync_data_id ]; //Todo colocar parametros dinamicos || null se não tiver try { const res = await pool.query(query, values); - logInfo('Dados atualizados na tabela sync_data com sucesso:', res.rows[0]); return res.rows[0]; } catch (err) { - logError('Erro ao atualizar dados na tabela sync_data', err); + logError(`Erro ao atualizar dados na tabela sync_data: ${err}`); throw err; } } + static async get_idSyncByHubsoftId(hubsoft_ticket_id) { const query = ` SELECT id FROM sync_data @@ -175,15 +170,53 @@ class HubglpiModel { try { const res = await pool.query(query); - logInfo('Tickets pendentes obtidos com sucesso:', res.rows); return res.rows; } catch (err) { - logError('Erro ao obter tickets pendentes', err); + logError(`Erro ao obter tickets pendentes ${err}`); throw err; } - } + } + + static async getGlpiTicketIdByAtendimentoId(id_atendimento) { + const query = ` + SELECT glpi_ticket_id FROM sync_data + WHERE hubsoft_ticket_id = $1; + `; + const values = [id_atendimento]; + try { + const res = await pool.query(query, values); + return res.rows[0] ? res.rows[0].glpi_ticket_id : null; + } catch (err) { + logError(`Erro ao obter glpi_ticket_id por id_atendimento, ${err}`); + throw err; + } +} + + static async update_syncaDataError(sync_error_message, id_atendimento) { + const query = ` + UPDATE sync_data + set sync_error_message = $1, + status_sync = 'sync_error', + last_sync_attempt = $2 + WHERE hubsoft_ticket_id = $3 + RETURNING *; + `; + const values = [ + sync_error_message, + new Date(), + id_atendimento + ]; + + try { + const res = await pool.query(query, values); + return res.rows[0]; + } catch (err){ + logError(`Erro ao inserir mensagem de erro na tabela sync_data: ${err}`); + throw err; + } + } } diff --git a/scripts/data/database2.sql b/scripts/data/database2.sql new file mode 100644 index 0000000000000000000000000000000000000000..ee1879922fd46cc09ac4cf68635967a28f2e02fc GIT binary patch literal 6247 zcmcIo-EQMV6n0^Or2?@?NN@uh@uQ?@H%ihZ?RK>nZsKmkCQeA4T`GQz>r7McI(F7S zg(7j!C2xUv2rdvp2wnhq3SNP8W^Bh9$7#CTwUkNb@0>H=`OcZ+^zXI0{f!&awd)%j z(pwTd1e>?9*~I2mY`({aJ+DA}8XiyVnI(M$zblPWrA&&WXEAz!?XEj}CYDM#&f_^qhTUaPI%lNLHJ;L`WtGgLHU+7@*JojRsF zwwwvMO9~_HV7G8*6Al0pmo&JYPe?DpuM@-eDO>jL`%<==n85`bMH(lq%^`>B&?gt)x`Dmi+JfneMPNubhb0j(I7nvUv2B?p zaTk$?fX1jxikk$U0$}I6CqdyR?_%s0Ho?8p2Oy6fc$Kv1@Y2h$m@Aye7!1L483?-h z5bSaY0wV~0-9LBCWf1%X`j$Z;>=GfEQ3tbyZh92R5+lKTW1S%qp_8n%U4On1JB#bM zfu84ju{4Lml5jRg1uNhcEWKKI|7H%shBK^wJ7QRE`!@4a#05RD%*QnF*(}6fCuSG~ zU<@yg#uO8_Ma;6sIvf^|Wwa-j6VM6uh}zSLI_h*dqL`;AuFmr|%~=HL6TP06W}X_J zVFn=Y%<#^^dBsL;OOWkT@60k?-EpUsWH(gn^(}71%yR?RbZu9MlPpl%K>9R< z;~92h_rjSX_3@daId(zORW=Eyfb?N{mT9>9357#&Fa!E+zy$)KjD;D18}ORW$TwDS z>V^RcV1#_mvbFNGUs_GkvSg{WF|?Fr^~r$VMinybM=%4 z1_DYR`L1)!C)hp4kTU|js8{kaC5vKO1&O|IOekFOaU{g~dNr}Rp!Mj>Nct}DgkOVc zk|rL%0(we#>+RO6(RW?=t_s!YKl$`6^GgyDXL$iquuq?`dU>dPI)Wl7%H%(QjEKnb zMB;a0H!BOEW{C1P>p~(JXuR60uz|J;(z=i*$o>)GLu!w7+v)?kGg8@t* zg=DfIjyORIi8p2tFInU0h|I*NEvlk(HiUEj@>)zBOncQvxfb94^_qlp38#rQW<_{( z2k-;h$pKkKKzeHDD02eBA!znGqpk{K01PcjMh=APnPC?TIlvV5_B=WLAxstj>vuGh!hvAGsIh6UnOBsU!X7R0#FdY zYO|j!FYO5Ox&Zla`H$`VV+r%Us!6VLIJ8A_M$Z}dU9R!;|hQh@ync&Os=In z@leLln`E&(L$4jLV^qdpm$T?%lsBtacL07IPLty}yp= z6;PwxD}qwUO@HP>xKokdUw|-ltS2GO5^?Ee@MxVAF9S1AOFp*|;LbYgG63i4dOlG9 zl?!!aTl#nb>QzB@g83iozk~a!>yux>Kd%GBGSn|pNDg`frF~E37jY)NY>|O-pukIa sQyInu*5V?6$?dJJV{OK17nz!M9-};KKp{M9-QjV{VZd%z8^WdjKR)ONg#Z8m literal 0 HcmV?d00001