diff --git a/src/components/dashboard/AtendimentosDia.tsx b/src/components/dashboard/AtendimentosDia.tsx deleted file mode 100644 index 86105f5..0000000 --- a/src/components/dashboard/AtendimentosDia.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React, { useEffect, useState } from 'react'; - -interface Atendimento { - id: string; - hora: string; - cliente: string; - status: string; -} - -export const AtendimentosDia: React.FC = () => { - const [atendimentos, setAtendimentos] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - async function fetchAtendimentos() { - try { - setLoading(true); - setError(null); - const res = await fetch('/api/atendimentos-dia', { - headers: { - 'Content-Type': 'application/json', - }, - }); - if (!res.ok) throw new Error('Erro ao buscar atendimentos do dia'); - const data = await res.json(); - setAtendimentos(data); - } catch (err: any) { - setError(err.message); - } finally { - setLoading(false); - } - } - fetchAtendimentos(); - }, []); - - if (loading) return
Carregando atendimentos...
; - if (error) return
{error}
; - - return ( -
-

Atendimentos do Dia

-
    - {atendimentos.map((at) => ( -
  • - {at.hora} - {at.cliente} - {at.status} -
  • - ))} -
-
- ); -}; diff --git a/src/components/dashboard/DashboardLayout.tsx b/src/components/dashboard/DashboardLayout.tsx index fc5eedc..0bf38e6 100644 --- a/src/components/dashboard/DashboardLayout.tsx +++ b/src/components/dashboard/DashboardLayout.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { WorkflowTarefas } from './WorkflowTarefas'; import { CalendarioAtendimentos } from './CalendarioAtendimentos'; import { BenchmarkingEscritorio } from './BenchmarkingEscritorio'; -import { AtendimentosDia } from './AtendimentosDia'; +import { PainelFinanceiro } from './PainelFinanceiro'; export const DashboardLayout: React.FC = () => { @@ -18,14 +18,13 @@ export const DashboardLayout: React.FC = () => {

Calendário

-

Atendimentos do Dia

-
{/* Coluna 3: Benchmarking do Escritório */}

Benchmarking do Escritório

+
); diff --git a/src/components/dashboard/PainelFinanceiro.tsx b/src/components/dashboard/PainelFinanceiro.tsx new file mode 100644 index 0000000..a037ffe --- /dev/null +++ b/src/components/dashboard/PainelFinanceiro.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { useFinanceiroPainel } from '../../hooks/useFinanceiroPainel'; +import { CurrencyDollarIcon, ArrowDownCircleIcon, ArrowUpCircleIcon } from '@heroicons/react/24/solid'; + +export const PainelFinanceiro: React.FC = () => { + const hoje = new Date(); + const [mes, setMes] = React.useState(hoje.getMonth() + 1); + const [ano, setAno] = React.useState(hoje.getFullYear()); + const { data, isLoading, error } = useFinanceiroPainel(mes, ano); + + const mesesNomes = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']; + + return ( +
+

+ Painel Financeiro +

+
+ + {mesesNomes[mes - 1]}/{ano} + + + +
+ {isLoading &&
Carregando dados financeiros...
} + {error &&
Erro ao buscar dados financeiros
} + {data && ( +
+
+ + Honorários a receber + R$ {data.honorariosAReceber.toLocaleString('pt-br', { minimumFractionDigits: 2 })} +
+
+ + Honorários recebidos no mês + R$ {data.honorariosRecebidosMes.toLocaleString('pt-br', { minimumFractionDigits: 2 })} +
+
+ + Custas a pagar + R$ {data.custasAPagar.toLocaleString('pt-br', { minimumFractionDigits: 2 })} +
+
+ + Custas pagas no mês + R$ {data.custasPagasMes.toLocaleString('pt-br', { minimumFractionDigits: 2 })} +
+
+ )} + {data && ( +
+
+

Honorários recebidos no mês

+
    + {data.detalhesHonorarios.length === 0 &&
  • Nenhum recebimento registrado neste mês.
  • } + {data.detalhesHonorarios.map((item, idx) => ( +
  • + Contrato: {item.contrato.processoId} + Parcela: {item.parcela.numeroParcela} - Valor: R$ {Number(item.parcela.valorPago || item.parcela.valor).toLocaleString('pt-br', { minimumFractionDigits: 2 })} + Pago em: {item.parcela.dataPagamento ? new Date(item.parcela.dataPagamento).toLocaleDateString('pt-br') : '-'} +
  • + ))} +
+
+
+

Custas pagas no mês

+
    + {data.detalhesCustas.length === 0 &&
  • Nenhuma custa paga neste mês.
  • } + {data.detalhesCustas.map((c, idx) => ( +
  • + Processo: {c.processoId} + Tipo: {c.tipo} - Valor: R$ {Number(c.valor).toLocaleString('pt-br', { minimumFractionDigits: 2 })} + Pago em: {c.dataPagamento ? new Date(c.dataPagamento).toLocaleDateString('pt-br') : '-'} +
  • + ))} +
+
+
+ )} +
+ ); +}; diff --git a/src/hooks/useFinanceiroPainel.ts b/src/hooks/useFinanceiroPainel.ts new file mode 100644 index 0000000..6ffbd7f --- /dev/null +++ b/src/hooks/useFinanceiroPainel.ts @@ -0,0 +1,66 @@ +import { useQuery } from 'react-query'; +import api from '../services/api'; + +export interface FinanceiroResumo { + honorariosAReceber: number; + honorariosRecebidosMes: number; + custasAPagar: number; + custasPagasMes: number; + detalhesHonorarios: any[]; + detalhesCustas: any[]; +} + +// Hook para buscar dados financeiros do painel +export function useFinanceiroPainel(mes: number, ano: number) { + return useQuery(['financeiroPainel', mes, ano], async () => { + // Buscar honorários e parcelas + const honorariosRes = await api.get('/honorarios'); + const honorarios = honorariosRes.data; + let honorariosAReceber = 0; + let honorariosRecebidosMes = 0; + const detalhesHonorarios: any[] = []; + honorarios.forEach((h: any) => { + if (h.parcelas && Array.isArray(h.parcelas)) { + h.parcelas.forEach((p: any) => { + const dataPagamento = p.dataPagamento ? new Date(p.dataPagamento) : null; + const vencimento = new Date(p.vencimento); + if (p.status === 'PENDENTE' || p.status === 'VENCIDO') { + honorariosAReceber += Number(p.valor); + } + if (p.status === 'PAGO' && dataPagamento && dataPagamento.getMonth() + 1 === mes && dataPagamento.getFullYear() === ano) { + honorariosRecebidosMes += Number(p.valorPago || p.valor); + detalhesHonorarios.push({ contrato: h, parcela: p }); + } + }); + } + }); + + // Buscar custas + const custasRes = await api.get('/custas-processuais'); + const custas = custasRes.data; + let custasAPagar = 0; + let custasPagasMes = 0; + const detalhesCustas: any[] = []; + custas.forEach((c: any) => { + if (c.status === 'PENDENTE' || c.status === 'VENCIDO') { + custasAPagar += Number(c.valor); + } + if (c.status === 'PAGO' && c.dataPagamento) { + const dataPagamento = new Date(c.dataPagamento); + if (dataPagamento.getMonth() + 1 === mes && dataPagamento.getFullYear() === ano) { + custasPagasMes += Number(c.valor); + detalhesCustas.push(c); + } + } + }); + + return { + honorariosAReceber, + honorariosRecebidosMes, + custasAPagar, + custasPagasMes, + detalhesHonorarios, + detalhesCustas, + }; + }); +}