const quitacoesCreditoService = require('../services/quitacoesCredito.service'); function resolverIdUsuario(req) { return Number(req.user?.idusuarios || req.user?.id); } function tratarErro(error, res, mensagemPadrao) { if (error?.statusCode) { return res.status(error.statusCode).json({ ok: false, message: error.message, code: error.code || undefined, }); } return res.status(500).json({ ok: false, message: mensagemPadrao, }); } function validarCriacao(dados) { if (!dados.idBancoCredito && !dados.idbancos_p) { return 'Banco de crédito é obrigatório.'; } if (!dados.idBancoPagamento && !dados.idbancos) { return 'Banco de pagamento é obrigatório.'; } const idsContas = dados.idsContas || dados.contas; if (!Array.isArray(idsContas) || idsContas.length === 0) { return 'Selecione pelo menos uma conta para quitar.'; } if (dados.valorQuitado !== undefined && dados.valorQuitado !== null && dados.valorQuitado !== '') { const valor = Number(dados.valorQuitado); if (!Number.isFinite(valor) || valor <= 0) { return 'Valor quitado inválido.'; } } return null; } async function listarBancosCredito(req, res) { try { const idUsuario = resolverIdUsuario(req); if (!idUsuario) { return res.status(401).json({ ok: false, message: 'Usuário inválido.', }); } const bancos = await quitacoesCreditoService.listarBancosCredito(idUsuario); return res.json({ ok: true, data: bancos, }); } catch (error) { console.error('Erro ao listar bancos de crédito:', error); return tratarErro(error, res, 'Erro ao listar bancos de crédito.'); } } async function listarBancosPagamento(req, res) { try { const idUsuario = resolverIdUsuario(req); if (!idUsuario) { return res.status(401).json({ ok: false, message: 'Usuário inválido.', }); } const bancos = await quitacoesCreditoService.listarBancosPagamento(idUsuario); return res.json({ ok: true, data: bancos, }); } catch (error) { console.error('Erro ao listar bancos de pagamento:', error); return tratarErro(error, res, 'Erro ao listar bancos de pagamento.'); } } async function preview(req, res) { try { const idUsuario = resolverIdUsuario(req); if (!idUsuario) { return res.status(401).json({ ok: false, message: 'Usuário inválido.', }); } const resultado = await quitacoesCreditoService.previewQuitacao(idUsuario, { idBancoCredito: req.query.idBancoCredito || req.query.idbancos, dataInicio: req.query.dataInicio, dataFim: req.query.dataFim, busca: req.query.busca, limite: req.query.limite, offset: req.query.offset, page: req.query.page, }); return res.json({ ok: true, data: resultado, }); } catch (error) { console.error('Erro ao gerar preview de quitação de crédito:', error); return tratarErro(error, res, 'Erro ao gerar preview de quitação de crédito.'); } } async function criar(req, res) { try { const erroValidacao = validarCriacao(req.body); if (erroValidacao) { return res.status(400).json({ ok: false, message: erroValidacao, }); } const idUsuario = resolverIdUsuario(req); if (!idUsuario) { return res.status(401).json({ ok: false, message: 'Usuário inválido.', }); } const resultado = await quitacoesCreditoService.criarQuitacaoCredito(idUsuario, req.body); return res.status(201).json({ ok: true, message: 'Crédito quitado com sucesso.', data: resultado.quitacao, contasQuitadas: resultado.contasQuitadas, valorQuitado: resultado.valorQuitado, impactoSaldo: resultado.impactoSaldo || [], }); } catch (error) { console.error('Erro ao quitar crédito:', error); return tratarErro(error, res, 'Erro ao quitar crédito.'); } } async function listarHistorico(req, res) { try { const idUsuario = resolverIdUsuario(req); if (!idUsuario) { return res.status(401).json({ ok: false, message: 'Usuário inválido.', }); } const resultado = await quitacoesCreditoService.listarHistorico(idUsuario, { limite: req.query.limite, offset: req.query.offset, page: req.query.page, idBancoCredito: req.query.idBancoCredito, idBancoPagamento: req.query.idBancoPagamento, dataInicio: req.query.dataInicio, dataFim: req.query.dataFim, busca: req.query.busca, }); return res.json({ ok: true, data: resultado.data, pagination: resultado.pagination, summary: resultado.summary, }); } catch (error) { console.error('Erro ao listar histórico de quitações:', error); return tratarErro(error, res, 'Erro ao listar histórico de quitações.'); } } async function buscarPorId(req, res) { try { const id = Number(req.params.id); if (!id) { return res.status(400).json({ ok: false, message: 'ID inválido.', }); } const idUsuario = resolverIdUsuario(req); if (!idUsuario) { return res.status(401).json({ ok: false, message: 'Usuário inválido.', }); } const quitacao = await quitacoesCreditoService.buscarQuitacaoPorId(id, idUsuario); if (!quitacao) { return res.status(404).json({ ok: false, message: 'Quitação não encontrada.', }); } return res.json({ ok: true, data: quitacao, }); } catch (error) { console.error('Erro ao buscar quitação:', error); return tratarErro(error, res, 'Erro ao buscar quitação.'); } } module.exports = { listarBancosCredito, listarBancosPagamento, preview, criar, listarHistorico, buscarPorId, };