import { useState, lazy, Suspense, useEffect } from "react"; import { Tab } from "@headlessui/react"; import { PlusIcon, PencilIcon, TrashIcon } from "@heroicons/react/24/outline"; import { formatCurrency, formatDate } from "../../utils/format"; import { useCustasProcessuais } from "../../hooks/useCustasProcessuais"; import { useHonorarios } from "../../hooks/useHonorarios"; import { useProcessoContext } from "../../context/ProcessoContext"; import api from "../../services/api"; // Adicionar esta importação // Corrigir importações lazy const DialogCustaProcessual = lazy(() => import("./dialogs/DialogCustaProcessual").then((module) => ({ default: module.default, })), ); const DialogHonorario = lazy(() => import("./dialogs/DialogHonorario").then((module) => ({ default: module.default, })), ); const DialogParcela = lazy(() => import("./dialogs/DialogParcela").then((module) => ({ default: module.DialogParcela, // Usar .DialogParcela em vez de .default })), ); const getParcelaStatus = (parcela: any) => { if (parcela.status === "PAGO") return "PAGO"; if (parcela.valorPago && parcela.valorPago > 0) return "PARCIALMENTE_PAGO"; return parcela.status; }; export default function AbaFinanceiro() { const { processo, refreshProcesso } = useProcessoContext(); // Verificar se processo existe antes de usar useEffect(() => { if (!processo) { refreshProcesso(); } }, [processo, refreshProcesso]); // Restante do estado const [tabValue, setTabValue] = useState(0); const [custaDialogOpen, setCustaDialogOpen] = useState(false); const [honorarioDialogOpen, setHonorarioDialogOpen] = useState(false); const [editingCusta, setEditingCusta] = useState(null); const [editingHonorario, setEditingHonorario] = useState(null); const [confirmDelete, setConfirmDelete] = useState({ show: false, type: null, id: null, }); const [editingParcela, setEditingParcela] = useState(null); const [parcelaDialogOpen, setParcelaDialogOpen] = useState(false); const [parcelaTipo, setParcelaTipo] = useState<"honorario" | "custa">( "honorario", ); // Inicializar hooks com ID do processo const { addCusta, updateCusta, deleteCusta } = useCustasProcessuais( processo?.id, ); const { addHonorario, updateHonorario, deleteHonorario } = useHonorarios( processo?.id, ); // Se não houver processo, mostrar loading if (!processo) { return
Carregando...
; } const handleSaveCusta = async (data: any) => { try { if (editingCusta) { await updateCusta({ id: editingCusta.id, data }); } else { await addCusta(data); } setCustaDialogOpen(false); setEditingCusta(null); await refreshProcesso(); // Use refreshProcesso instead of window.location.reload() } catch (error) { console.error("Erro ao salvar custa:", error); } }; const handleSaveHonorario = async (data: any) => { try { if (editingHonorario) { await updateHonorario({ id: editingHonorario.id, data }); } else { await addHonorario(data); } setHonorarioDialogOpen(false); setEditingHonorario(null); await refreshProcesso(); // Use refreshProcesso instead of window.location.reload() } catch (error) { console.error("Erro ao salvar honorário:", error); } }; const handleDelete = async () => { try { if (confirmDelete.type === "custa") { await deleteCusta(confirmDelete.id); } else if (confirmDelete.type === "honorario") { await deleteHonorario(confirmDelete.id); } setConfirmDelete({ show: false, type: null, id: null }); await refreshProcesso(); // Use refreshProcesso instead of window.location.reload() } catch (error) { console.error("Erro ao excluir:", error); } }; const handleUpdateParcela = async (data: any) => { try { if (parcelaTipo === "honorario") { // Remover /api do início pois já está configurado no baseURL do axios await api.put(`/honorarios/parcelas/${editingParcela.id}`, { status: data.status, dataPagamento: data.dataPagamento, valorPago: Number(data.valorPago), comprovante: data.comprovante, observacoes: data.observacoes, }); } setParcelaDialogOpen(false); setEditingParcela(null); await refreshProcesso(); } catch (error) { console.error("Erro ao atualizar parcela:", error); } }; const getStatusBadgeClasses = (status: string) => { const baseClasses = "px-2 py-1 text-xs font-medium rounded-full"; switch (status) { case "PENDENTE": return `${baseClasses} bg-yellow-100 text-yellow-800`; case "PAGO": return `${baseClasses} bg-green-100 text-green-800`; case "VENCIDO": return `${baseClasses} bg-red-100 text-red-800`; case "CANCELADO": return `${baseClasses} bg-gray-100 text-gray-800`; default: return `${baseClasses} bg-gray-100 text-gray-800`; } }; return (
`w-full rounded-lg py-2.5 text-sm font-medium leading-5 ${ selected ? "bg-white text-blue-700 shadow" : "text-gray-600 hover:bg-white/[0.12] hover:text-blue-600" }` } > Custas Processuais `w-full rounded-lg py-2.5 text-sm font-medium leading-5 ${ selected ? "bg-white text-blue-700 shadow" : "text-gray-600 hover:bg-white/[0.12] hover:text-blue-600" }` } > Honorários

Custas Processuais

{processo.custas?.length > 0 ? (
{processo.custas.map((custa) => ( ))}
Tipo Descrição Valor Status Ações
{custa.tipo.replace(/_/g, " ")} {custa.descricao} {formatCurrency(custa.valor)} {custa.status}
) : (
Nenhuma custa processual registrada
)}

Honorários

{processo.honorarios?.map((honorario) => (

{honorario.formaPagamento === "VISTA" ? "Pagamento à Vista" : honorario.formaPagamento === "PARCELADO" ? `Parcelado em ${honorario.numeroParcelas}x` : "Percentual da Causa"}

{honorario.status}

{honorario.valorFixo ? `Valor: ${formatCurrency(honorario.valorFixo)}` : `Percentual: ${honorario.percentualCausa}%`}

{honorario.formaPagamento === "PARCELADO" && ( <>

Entrada: {formatCurrency(honorario.valorEntrada)}

Parcelas: {honorario.numeroParcelas}x de{" "} {formatCurrency(honorario.valorParcela)}

)}

Vencimento: {formatDate(honorario.dataVencimento)}

{honorario.parcelas && (
{honorario.parcelas.map((parcela) => ( ))}
Parcela Valor Vencimento Status Ações Valor Pago
{parcela.numeroParcela} {formatCurrency(parcela.valor)} {formatDate(parcela.vencimento)} {parcela.status}
{parcela.valorPago > 0 && parcela.valorPago < parcela.valor && `Pago: ${formatCurrency(parcela.valorPago)}`}
)}
))}
{confirmDelete.show && (

Confirmar exclusão

Tem certeza que deseja excluir este{" "} {confirmDelete.type === "custa" ? "registro de custa" : "honorário"} ? Esta ação não pode ser desfeita.

)} Carregando...
} > {custaDialogOpen && ( { setCustaDialogOpen(false); setEditingCusta(null); }} onSave={handleSaveCusta} editingCusta={editingCusta} /> )} {honorarioDialogOpen && ( { setHonorarioDialogOpen(false); setEditingHonorario(null); }} onSave={handleSaveHonorario} editingHonorario={editingHonorario} /> )} {parcelaDialogOpen && ( { setParcelaDialogOpen(false); setEditingParcela(null); }} onSave={handleUpdateParcela} parcela={editingParcela} tipo={parcelaTipo} /> )} ); }