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:
1 parent
187a85f776
commit
1218eb32b6
2 files changed
+55
-114
No files matched your search
+13
-6
@@ -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
@@ -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) {
|
||||||
|
|||||||
Reference in new issue
Block a user