From 1218eb32b635ae779b580d5d7f9f5acd353fa44b Mon Sep 17 00:00:00 2001 From: Rodrigo Bertoldo de Sousa Martins Date: Sun, 29 Mar 2026 13:47:26 -0300 Subject: [PATCH] =?UTF-8?q?TopSapp:=20fix=20busca=20de=20faturas=20por=20s?= =?UTF-8?q?ervi=C3=A7o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rodrigo Bertoldo de Sousa Martins --- src/topsapp/api.js | 19 +++-- src/topsapp/manager.js | 160 ++++++++++++----------------------------- 2 files changed, 60 insertions(+), 119 deletions(-) diff --git a/src/topsapp/api.js b/src/topsapp/api.js index 1e67307..f54c573 100644 --- a/src/topsapp/api.js +++ b/src/topsapp/api.js @@ -627,19 +627,26 @@ class TopSappAPI { /** * Obter faturas em aberto do cliente + * @param {number|string} idServico - opcional, filtra pelo serviço específico */ - async obterFaturas(idCliente, location = '', credentials) { + async obterFaturas(idCliente, location = '', credentials, idServico = null) { const instance = this.getInstanceByLocation(location); // Obter o idUsuario da sessão atual const session = await this.getValidSession(instance, credentials); - return await this.makeRequest('ObterDocReceber', { + const payload = { idCliente, - idUsuario: session.idUsuario || 1, // Usar ID do usuário da sessão - status: 0, // 0 = Faturas abertas - situacaoFatura: 0 // 0 = Faturas ativas - }, instance, credentials); + idUsuario: session.idUsuario || 1, + status: 0, + situacaoFatura: 0 + }; + + if (idServico) { + payload.idServico = idServico; + } + + return await this.makeRequest('ObterDocReceber', payload, instance, credentials); } /** diff --git a/src/topsapp/manager.js b/src/topsapp/manager.js index c05f417..30636ba 100644 --- a/src/topsapp/manager.js +++ b/src/topsapp/manager.js @@ -259,80 +259,66 @@ class TopSappManager { try { const credentials = this.config.getCredentialsByLocation(location); - // Obter faturas e serviços em paralelo - const [faturas, servicos] = await Promise.all([ - this.api.obterFaturas(idCliente, location, credentials), - this.api.obterServicosCliente(idCliente, location, credentials) - ]); - - if (!faturas.success) { - return faturas; - } + // Buscar serviços do cliente primeiro + const servicos = await this.api.obterServicosCliente(idCliente, location, credentials); if (!servicos.success) { return servicos; } const servicosData = servicos.data.dados || servicos.data.servicos || []; - const faturasData = faturas.data.dados || []; - - // Organizar faturas por serviço + + // Organizar faturas por serviço buscando cada serviço individualmente const faturasPorServico = []; for (const servico of servicosData) { const faturasDoServico = []; - - // Buscar faturas relacionadas a este serviço - for (const fatura of faturasData) { - // Verificar se a fatura pertence a este serviço - // Pode usar id_servico, periodo, ou outros critérios de associação - if (fatura.id_servico === servico.id_servico || - fatura.codigo_cliente === servico.id_cliente) { - - // Obter dados detalhados da fatura (linha digitável e PIX) - const dadosFatura = await this.api.obterDadosFatura( - fatura.id, - fatura.codigo_cliente || idCliente, - location, - credentials - ); - - const faturaDetalhada = { - id: fatura.id, - valor: fatura.valor, - vencimento: fatura.vencimento, - status: fatura.pago === 'SIM' ? 'Pago' : 'Pendente', - descricao: fatura.historico || fatura.descricao || 'Mensalidade', - periodo: this.formatarPeriodo(fatura.periodo_inicio, fatura.periodo_fim), - id_servico: fatura.id_servico || servico.id_servico, - linhaDigitavel: null, - pixCopiaCola: null - }; - // Adicionar dados de pagamento se disponíveis - if (dadosFatura.success && dadosFatura.data) { - const dadosReturn = dadosFatura.data.fatura || dadosFatura.data.dados || dadosFatura.data; - - if (dadosReturn.linha_digitavel) { - faturaDetalhada.linhaDigitavel = dadosReturn.linha_digitavel; - } - - if (dadosReturn.qrcode) { - faturaDetalhada.pixCopiaCola = dadosReturn.qrcode; - } - - // Outros campos possíveis: pix_copia_cola, codigo_pix, etc. - if (dadosReturn.pix_copia_cola) { - faturaDetalhada.pixCopiaCola = dadosReturn.pix_copia_cola; - } - - if (dadosReturn.codigo_pix) { - faturaDetalhada.pixCopiaCola = dadosReturn.codigo_pix; - } + // Buscar faturas filtradas pelo id_servico diretamente na API + const faturasServico = await this.api.obterFaturas( + idCliente, location, credentials, servico.id_servico + ); + + const faturasData = (faturasServico.success && faturasServico.data) + ? (faturasServico.data.dados || []) + : []; + + for (const fatura of faturasData) { + // Obter dados detalhados da fatura (linha digitável e PIX) + const dadosFatura = await this.api.obterDadosFatura( + fatura.id, + fatura.codigo_cliente || idCliente, + location, + credentials + ); + + const faturaDetalhada = { + id: fatura.id, + valor: fatura.valor, + vencimento: fatura.vencimento, + status: fatura.pago === 'SIM' ? 'Pago' : 'Pendente', + descricao: fatura.historico || fatura.descricao || 'Mensalidade', + periodo: this.formatarPeriodo(fatura.periodo_inicio, fatura.periodo_fim), + id_servico: fatura.id_servico || servico.id_servico, + linhaDigitavel: null, + pixCopiaCola: null + }; + + // Adicionar dados de pagamento se disponíveis + if (dadosFatura.success && dadosFatura.data) { + const dadosReturn = dadosFatura.data.fatura || dadosFatura.data.dados || dadosFatura.data; + + if (dadosReturn.linha_digitavel) { + faturaDetalhada.linhaDigitavel = dadosReturn.linha_digitavel; } - faturasDoServico.push(faturaDetalhada); + faturaDetalhada.pixCopiaCola = dadosReturn.qrcode + || dadosReturn.pix_copia_cola + || dadosReturn.codigo_pix + || null; } + + faturasDoServico.push(faturaDetalhada); } // Se o serviço tem faturas, adicionar à lista @@ -352,64 +338,12 @@ class TopSappManager { } } - // Se não conseguiu associar por serviço, criar uma entrada genérica - if (faturasPorServico.length === 0 && faturasData.length > 0) { - const faturasGenericas = []; - - for (const fatura of faturasData) { - const dadosFatura = await this.api.obterDadosFatura( - fatura.id, - fatura.codigo_cliente || idCliente, - location, - credentials - ); - - const faturaDetalhada = { - id: fatura.id, - valor: fatura.valor, - vencimento: fatura.vencimento, - status: fatura.pago === 'SIM' ? 'Pago' : 'Pendente', - descricao: fatura.historico || fatura.descricao || 'Mensalidade', - periodo: this.formatarPeriodo(fatura.periodo_inicio, fatura.periodo_fim), - linhaDigitavel: null, - pixCopiaCola: null - }; - - if (dadosFatura.success && dadosFatura.data) { - const dadosReturn = dadosFatura.data.fatura || dadosFatura.data.dados || dadosFatura.data; - - if (dadosReturn.linha_digitavel) { - faturaDetalhada.linhaDigitavel = dadosReturn.linha_digitavel; - } - - if (dadosReturn.qrcode || dadosReturn.pix_copia_cola || dadosReturn.codigo_pix) { - faturaDetalhada.pixCopiaCola = dadosReturn.qrcode || dadosReturn.pix_copia_cola || dadosReturn.codigo_pix; - } - } - - faturasGenericas.push(faturaDetalhada); - } - - faturasPorServico.push({ - servico: { - id: 'geral', - nome: 'Faturas Gerais', - base: 'Geral', - tecnologia: 'Não especificado', - valor_mensal: 0, - vencimento_dia: 'Variável', - status: 'Geral' - }, - faturas: faturasGenericas - }); - } - return { success: true, faturasPorServico, totalServicos: faturasPorServico.length, totalFaturas: faturasPorServico.reduce((total, item) => total + item.faturas.length, 0), - instancia: faturas.instance + instancia: location }; } catch (error) {