From 8363bde237cbd99ae86cd8aa547d938ebc5c1f5a Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Thu, 30 Apr 2026 16:41:28 -0300 Subject: [PATCH] =?UTF-8?q?FEAT:=20Adicionado=20vari=C3=A1veis=20de=20ambi?= =?UTF-8?q?ente=20para=20definir=20os=20respons=C3=A1veis=20por=20implanta?= =?UTF-8?q?=C3=A7=C3=A3o,=20cancelamento=20e=20titularidade=20no=20HubSoft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adicionadas as seguintes variáveis de ambiente no arquivo .env.development: - HUBSOFT_IMPLANTACAO_RESPONSAVEL_USER_IDS: IDs dos usuários responsáveis pela implantação no HubSoft. - HUBSOFT_CANCELAMENTO_RESPONSAVEL_USER_IDS: IDs dos usuários responsáveis pelo cancelamento no HubSoft. - HUBSOFT_TITULARIDADE_RESPONSAVEL_USER_IDS: IDs dos usuários responsáveis pela titularidade no HubSoft. - Atualizadas as implementações relacionadas à implantação, cancelamento e titularidade para utilizar as novas variáveis de ambiente e garantir que as ações sejam atribuídas aos usuários corretos. --- .env.example | 3 ++ .gitignore | 1 + .../hubsoft/tickets.repository.js | 24 +++++++++++++++ .../tickets/repositories/ticket.repository.js | 23 ++++++++++++++ .../services/resolveTicketEntity.service.js | 2 +- .../tickets/useCases/syncTickets.usecase.js | 30 +++++++++---------- 6 files changed, 67 insertions(+), 16 deletions(-) diff --git a/.env.example b/.env.example index c5239f4..40adcf7 100644 --- a/.env.example +++ b/.env.example @@ -29,6 +29,9 @@ HUBSOFT_DATABASE_NAME=hubsoft HUBSOFT_DATABASE_USER= HUBSOFT_DATABASE_PASSWORD= HUBSOFT_MUNDIALE_USER_ID=248 +HUBSOFT_IMPLANTACAO_RESPONSAVEL_USER_IDS=142 +HUBSOFT_CANCELAMENTO_RESPONSAVEL_USER_IDS=142 +HUBSOFT_TITULARIDADE_RESPONSAVEL_USER_IDS=142 # ============================================================================== # BANCO DE DADOS INTERMEDIÁRIO - HUBGLPI (PostgreSQL - Desenvolvimento) diff --git a/.gitignore b/.gitignore index 2b468d5..7c4db31 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ logs/ .env.development .env.production +.idea/ \ No newline at end of file diff --git a/src/infra/db/repositories/hubsoft/tickets.repository.js b/src/infra/db/repositories/hubsoft/tickets.repository.js index d69c4ee..73f5a78 100644 --- a/src/infra/db/repositories/hubsoft/tickets.repository.js +++ b/src/infra/db/repositories/hubsoft/tickets.repository.js @@ -6,6 +6,7 @@ const { logError } = require('../../../../shared/utils/logger.js') async function getTicketsByTipo({ tipoAtendimento, usuarioAbertura = null, + usuariosResponsaveisIds = null, watermark = null }) { try { @@ -81,6 +82,23 @@ async function getTicketsByTipo({ params.push(usuarioAbertura); } + const responsibleUserIds = normalizeUserIds(usuariosResponsaveisIds); + + if (responsibleUserIds.length) { + const responsibleIdsParam = paramIndex++; + + query += ` + AND EXISTS ( + SELECT 1 + FROM atendimento_usuario_responsavel AS aur + WHERE aur.id_atendimento = a.id_atendimento + AND aur.id_usuario = ANY($${responsibleIdsParam}::int[]) + ) + `; + + params.push(responsibleUserIds); + } + if (watermark) { query += ` AND a.data_cadastro > $${paramIndex++}`; params.push(watermark); @@ -95,6 +113,12 @@ async function getTicketsByTipo({ } } +function normalizeUserIds(values) { + return (values || []) + .map(value => Number(value)) + .filter(Number.isInteger); +} + async function getTicketsClosedSince(thresholdDate) { try { diff --git a/src/modules/tickets/repositories/ticket.repository.js b/src/modules/tickets/repositories/ticket.repository.js index 1d5eaff..04fa258 100644 --- a/src/modules/tickets/repositories/ticket.repository.js +++ b/src/modules/tickets/repositories/ticket.repository.js @@ -41,6 +41,10 @@ async function getMundialeTickets(watermark) { async function getImplantacaoTickets(watermark) { return hubsoftTicketsRepo.getTicketsByTipo({ tipoAtendimento: TYPES.IMPLANTACAO, + usuariosResponsaveisIds: parseCsvNumberEnv( + process.env.HUBSOFT_IMPLANTACAO_RESPONSAVEL_USER_IDS, + [142] + ), watermark }); } @@ -48,6 +52,10 @@ async function getImplantacaoTickets(watermark) { async function getCancelamentoTickets(watermark) { return hubsoftTicketsRepo.getTicketsByTipo({ tipoAtendimento: TYPES.CANCELAMENTO, + usuariosResponsaveisIds: parseCsvNumberEnv( + process.env.HUBSOFT_CANCELAMENTO_RESPONSAVEL_USER_IDS, + [142] + ), watermark }); } @@ -62,6 +70,10 @@ async function getSacTickets(watermark) { async function getTrocaTTickets(watermark) { return hubsoftTicketsRepo.getTicketsByTipo({ tipoAtendimento: TYPES.TITULARIDADE, + usuariosResponsaveisIds: parseCsvNumberEnv( + process.env.HUBSOFT_TITULARIDADE_RESPONSAVEL_USER_IDS, + [142] + ), watermark }); } @@ -130,6 +142,17 @@ async function sendHubglpiMessage(hubId, message) { }); } +function parseCsvNumberEnv(value, fallback = []) { + if (!value) return fallback; + + const parsed = value + .split(',') + .map(item => Number(item.trim())) + .filter(Number.isInteger); + + return parsed.length ? parsed : fallback; +} + module.exports = { // watermark diff --git a/src/modules/tickets/services/resolveTicketEntity.service.js b/src/modules/tickets/services/resolveTicketEntity.service.js index e065534..82517b3 100644 --- a/src/modules/tickets/services/resolveTicketEntity.service.js +++ b/src/modules/tickets/services/resolveTicketEntity.service.js @@ -5,7 +5,7 @@ const repository = require('../repositories/ticket.repository.js') async function resolveEntityId(ticketData) { const entityByService = await repository.getEntitiesByService( - ticketData.codigo_clasiente, + ticketData.codigo_cliente, ticketData.codigo_servico ); diff --git a/src/modules/tickets/useCases/syncTickets.usecase.js b/src/modules/tickets/useCases/syncTickets.usecase.js index a48589a..4b40019 100644 --- a/src/modules/tickets/useCases/syncTickets.usecase.js +++ b/src/modules/tickets/useCases/syncTickets.usecase.js @@ -22,31 +22,31 @@ async function syncTicketsUseCase() { const mundiale = await mundialeService.fetchNew(waterMark) logInfo(`[USECASE] ${mundiale.length} tickets Mundiale encontrados`) - //const implantacao = await implantacaoService.fetchNew(waterMark) - //logInfo(`[USECASE] ${implantacao.length} tickets Implantação encontrados`) + const implantacao = await implantacaoService.fetchNew(waterMark) + logInfo(`[USECASE] ${implantacao.length} tickets Implantacao encontrados`) - //const cancelamento = await cancelamentoService.fetchNew(waterMark) - //logInfo(`[USECASE] ${cancelamento.length} tickets Cancelamento encontrados`) + const cancelamento = await cancelamentoService.fetchNew(waterMark) + logInfo(`[USECASE] ${cancelamento.length} tickets Cancelamento encontrados`) //const sac = await sacService.fetchNew(waterMark) //TODO //logInfo(`[USECASE] ${sac.length} tickets SAC encontrados`) - //const trocaTitularidade = await trocaTitularidadeService.fetchNew(waterMark) //TODO - //logInfo(`[USECASE] ${trocaTitularidade.length} tickets Troca de Titularidade encontrados`) + const trocaTitularidade = await trocaTitularidadeService.fetchNew(waterMark) + logInfo(`[USECASE] ${trocaTitularidade.length} tickets Troca de Titularidade encontrados`) await mundialeService.saveHubGlpi(mundiale) - //await implantacaoService.saveHubGlpi(implantacao) - //await cancelamentoService.saveHubGlpi(cancelamento) + await implantacaoService.saveHubGlpi(implantacao) + await cancelamentoService.saveHubGlpi(cancelamento) //await sacService.saveHubGlpi(sac) //TODO - //await trocaTitularidadeService.saveHubGlpi(trocaTitularidade) + await trocaTitularidadeService.saveHubGlpi(trocaTitularidade) const allFetchedTickets = [ ...mundiale, - //...implantacao, - //...cancelamento, + ...implantacao, + ...cancelamento, //...sac, - //...trocaTitularidade + ...trocaTitularidade ] const newWaterMark = resolveNewWatermark(allFetchedTickets, waterMark) @@ -83,10 +83,10 @@ async function syncTicketsUseCase() { function resolveTicketService(type) { const map = { MUNDIALE: mundialeService, - //IMPLANTACAO: implantacaoService, - //CANCELAMENTO: cancelamentoService, + IMPLANTACAO: implantacaoService, + CANCELAMENTO: cancelamentoService, //SAC: sacService, //TODO - //TITULARIDADE: trocaTitularidadeService + TITULARIDADE: trocaTitularidadeService } return map[type]