TopSapp: fix busca de faturas por serviço

Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo.sousa.577@gmail.com>
This commit is contained in:
rodrigo committed 2026-03-29 13:47:26 -03:00
1 parent 187a85f776
commit 1218eb32b6
2 files changed
+55 -114

No files matched your search

+13 -6
View File
@@ -627,19 +627,26 @@ class TopSappAPI {
/** /**
* Obter faturas em aberto do cliente * 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); const instance = this.getInstanceByLocation(location);
// Obter o idUsuario da sessão atual // Obter o idUsuario da sessão atual
const session = await this.getValidSession(instance, credentials); const session = await this.getValidSession(instance, credentials);
return await this.makeRequest('ObterDocReceber', { const payload = {
idCliente, idCliente,
idUsuario: session.idUsuario || 1, // Usar ID do usuário da sessão idUsuario: session.idUsuario || 1,
status: 0, // 0 = Faturas abertas status: 0,
situacaoFatura: 0 // 0 = Faturas ativas situacaoFatura: 0
}, instance, credentials); };
if (idServico) {
payload.idServico = idServico;
}
return await this.makeRequest('ObterDocReceber', payload, instance, credentials);
} }
/** /**
+42 -108
View File
@@ -259,80 +259,66 @@ class TopSappManager {
try { try {
const credentials = this.config.getCredentialsByLocation(location); const credentials = this.config.getCredentialsByLocation(location);
// Obter faturas e serviços em paralelo // Buscar serviços do cliente primeiro
const [faturas, servicos] = await Promise.all([ const servicos = await this.api.obterServicosCliente(idCliente, location, credentials);
this.api.obterFaturas(idCliente, location, credentials),
this.api.obterServicosCliente(idCliente, location, credentials)
]);
if (!faturas.success) {
return faturas;
}
if (!servicos.success) { if (!servicos.success) {
return servicos; return servicos;
} }
const servicosData = servicos.data.dados || servicos.data.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 = []; const faturasPorServico = [];
for (const servico of servicosData) { for (const servico of servicosData) {
const faturasDoServico = []; const faturasDoServico = [];
// Buscar faturas relacionadas a este serviço // 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) { for (const fatura of faturasData) {
// Verificar se a fatura pertence a este serviço // Obter dados detalhados da fatura (linha digitável e PIX)
// Pode usar id_servico, periodo, ou outros critérios de associação const dadosFatura = await this.api.obterDadosFatura(
if (fatura.id_servico === servico.id_servico || fatura.id,
fatura.codigo_cliente === servico.id_cliente) { fatura.codigo_cliente || idCliente,
location,
credentials
);
// Obter dados detalhados da fatura (linha digitável e PIX) const faturaDetalhada = {
const dadosFatura = await this.api.obterDadosFatura( id: fatura.id,
fatura.id, valor: fatura.valor,
fatura.codigo_cliente || idCliente, vencimento: fatura.vencimento,
location, status: fatura.pago === 'SIM' ? 'Pago' : 'Pendente',
credentials 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
};
const faturaDetalhada = { // Adicionar dados de pagamento se disponíveis
id: fatura.id, if (dadosFatura.success && dadosFatura.data) {
valor: fatura.valor, const dadosReturn = dadosFatura.data.fatura || dadosFatura.data.dados || dadosFatura.data;
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 (dadosReturn.linha_digitavel) {
if (dadosFatura.success && dadosFatura.data) { faturaDetalhada.linhaDigitavel = dadosReturn.linha_digitavel;
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;
}
} }
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 // 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 { return {
success: true, success: true,
faturasPorServico, faturasPorServico,
totalServicos: faturasPorServico.length, totalServicos: faturasPorServico.length,
totalFaturas: faturasPorServico.reduce((total, item) => total + item.faturas.length, 0), totalFaturas: faturasPorServico.reduce((total, item) => total + item.faturas.length, 0),
instancia: faturas.instance instancia: location
}; };
} catch (error) { } catch (error) {