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
+60 -119

No files matched your search

+13 -6
View File
@@ -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);
}
/**
+47 -113
View File
@@ -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) {