diff --git a/src/server/app.ts b/src/server/app.ts index bd1c7bb..4664538 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -8,6 +8,7 @@ import provasRoutes from './routes/provas'; import calculosJudiciaisRoutes from './routes/calculosJudiciais'; import indicesMonetariosRoutes from './routes/indicesMonetarios'; import pensaoAlimenticiaRoutes from './routes/pensaoAlimenticia'; +import financeiroPainelRoutes from './routes/financeiroPainel'; dotenv.config(); @@ -27,6 +28,7 @@ app.use('/api/provas', provasRoutes); app.use('/api/calculos', calculosJudiciaisRoutes); app.use('/api/indices', indicesMonetariosRoutes); app.use('/api/pensao-alimenticia', pensaoAlimenticiaRoutes); +app.use('/api/financeiro-painel', financeiroPainelRoutes); app.use(express.static(path.join(__dirname, 'public'))); app.set('trust proxy', true); // Importante para obter o IP real em ambientes com proxy diff --git a/src/server/routes/financeiroPainel.ts b/src/server/routes/financeiroPainel.ts new file mode 100644 index 0000000..e9193a4 --- /dev/null +++ b/src/server/routes/financeiroPainel.ts @@ -0,0 +1,99 @@ +import express from 'express'; +import { prisma } from '../app'; + +const router = express.Router(); + +// GET /api/financeiro-painel?mes=6&ano=2024 +router.get('/', async (req, res) => { + try { + const mes = parseInt(req.query.mes as string) || (new Date().getMonth() + 1); + const ano = parseInt(req.query.ano as string) || (new Date().getFullYear()); + if (isNaN(mes) || isNaN(ano)) { + return res.status(400).json({ error: 'Parâmetros de mês e ano inválidos.' }); + } + // Datas para filtro + const dataInicio = new Date(ano, mes - 1, 1); + const dataFim = new Date(ano, mes, 1); + + // Honorários a receber: parcelas pendentes ou vencidas + const honorariosAReceber = await prisma.parcelaHonorario.aggregate({ + _sum: { valor: true }, + where: { + OR: [{ status: 'PENDENTE' }, { status: 'VENCIDO' }], + }, + }); + + // Honorários recebidos no mês + const honorariosRecebidosMes = await prisma.parcelaHonorario.aggregate({ + _sum: { valorPago: true }, + where: { + status: 'PAGO', + dataPagamento: { + gte: dataInicio, + lt: dataFim, + }, + }, + }); + + // Detalhes das parcelas recebidas no mês + const detalhesHonorarios = await prisma.parcelaHonorario.findMany({ + where: { + status: 'PAGO', + dataPagamento: { + gte: dataInicio, + lt: dataFim, + }, + }, + include: { honorario: true }, + orderBy: { dataPagamento: 'desc' }, + take: 10, + }); + + // Custas a pagar + const custasAPagar = await prisma.custaProcessual.aggregate({ + _sum: { valor: true }, + where: { + OR: [{ status: 'PENDENTE' }, { status: 'VENCIDO' }], + }, + }); + + // Custas pagas no mês + const custasPagasMes = await prisma.custaProcessual.aggregate({ + _sum: { valor: true }, + where: { + status: 'PAGO', + dataPagamento: { + gte: dataInicio, + lt: dataFim, + }, + }, + }); + + // Detalhes das custas pagas no mês + const detalhesCustas = await prisma.custaProcessual.findMany({ + where: { + status: 'PAGO', + dataPagamento: { + gte: dataInicio, + lt: dataFim, + }, + }, + orderBy: { dataPagamento: 'desc' }, + take: 10, + }); + + res.json({ + honorariosAReceber: honorariosAReceber._sum.valor || 0, + honorariosRecebidosMes: honorariosRecebidosMes._sum.valorPago || 0, + custasAPagar: custasAPagar._sum.valor || 0, + custasPagasMes: custasPagasMes._sum.valor || 0, + detalhesHonorarios, + detalhesCustas, + }); + } catch (error) { + console.error('Erro no financeiroPainel:', error); + res.status(500).json({ error: 'Erro ao buscar dados financeiros.' }); + } +}); + +export default router;