import React, { useState, useEffect } from "react"; import { useAuth } from "../contexts/AuthContext"; import { getProfessionalFinancialStatement } from "../services/apiService"; import { formatCurrency } from "../utils/format"; interface FinancialTransactionDTO { id: string; data_evento: string; nome_evento: string; tipo_evento: string; empresa: string; valor_recebido: number; valor_free?: number; // Optional as backend might not have sent it yet if cache/delays valor_extra?: number; descricao_extra?: string; data_pagamento: string; status: string; } interface FinancialStatementResponse { total_recebido: number; pagamentos_confirmados: number; pagamentos_pendentes: number; transactions: FinancialTransactionDTO[]; } const ProfessionalStatement: React.FC = () => { const { user, token } = useAuth(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [selectedTransaction, setSelectedTransaction] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); // Filter States const [filters, setFilters] = useState({ data: "", nome: "", tipo: "", empresa: "", status: "" }); const [dateFilters, setDateFilters] = useState({ startDate: "", endDate: "" }); const [showDateFilters, setShowDateFilters] = useState(false); useEffect(() => { if (token) { fetchStatement(); } else { const storedToken = localStorage.getItem("@Auth:token"); if (storedToken) { fetchStatement(storedToken); } else { console.error("No token found"); setLoading(false); } } }, [token]); const fetchStatement = async (overrideToken?: string) => { try { const t = overrideToken || token; if (!t) return; const response = await getProfessionalFinancialStatement(t); if (response.data) { setData(response.data); } else { console.error(response.error); } } catch (error) { console.error("Erro ao buscar extrato:", error); } finally { setLoading(false); } }; const handleRowClick = (t: FinancialTransactionDTO) => { setSelectedTransaction(t); setIsModalOpen(true); }; const StatusBadge = ({ status }: { status: string }) => { const isPaid = status === "Pago"; return ( {status} ); }; // derived filtered state const transactions = data?.transactions || []; const filteredTransactions = transactions.filter(t => { // String Column Filters if (filters.data && !t.data_evento.toLowerCase().includes(filters.data.toLowerCase())) return false; if (filters.nome && !t.nome_evento.toLowerCase().includes(filters.nome.toLowerCase())) return false; if (filters.tipo && !t.tipo_evento.toLowerCase().includes(filters.tipo.toLowerCase())) return false; if (filters.empresa && !t.empresa.toLowerCase().includes(filters.empresa.toLowerCase())) return false; if (filters.status && !t.status.toLowerCase().includes(filters.status.toLowerCase())) return false; // Date Range Filter logic if (dateFilters.startDate || dateFilters.endDate) { // Parse DD/MM/YYYY into JS Date if possible const [d, m, y] = t.data_evento.split('/'); if (d && m && y) { const eventDateObj = new Date(parseInt(y), parseInt(m) - 1, parseInt(d)); if (dateFilters.startDate) { const [sy, sm, sd] = dateFilters.startDate.split('-'); const startObj = new Date(parseInt(sy), parseInt(sm) - 1, parseInt(sd)); if (eventDateObj < startObj) return false; } if (dateFilters.endDate) { const [ey, em, ed] = dateFilters.endDate.split('-'); const endObj = new Date(parseInt(ey), parseInt(em) - 1, parseInt(ed)); // Set end of day for precise comparison endObj.setHours(23, 59, 59, 999); if (eventDateObj > endObj) return false; } } } return true; }); const filteredTotalSum = filteredTransactions.reduce((acc, curr) => acc + curr.valor_recebido, 0); if (loading) { return
Carregando extrato...
; } if (!data) { return
Nenhum dado encontrado.
; } return (

Meus Pagamentos

Visualize todos os pagamentos recebidos pelos eventos fotografados

{/* Summary Cards */}

Total Recebido

{formatCurrency(data.total_recebido)}

Pagamentos Confirmados

{formatCurrency(data.pagamentos_confirmados)}

Pagamentos Pendentes

{formatCurrency(data.pagamentos_pendentes)}

{/* Transactions Table */}

Histórico de Pagamentos

{/* Advanced Date Filters */} {showDateFilters && (
setDateFilters({...dateFilters, startDate: e.target.value})} />
setDateFilters({...dateFilters, endDate: e.target.value})} />
{(dateFilters.startDate || dateFilters.endDate) && (
)}
)}
{filteredTransactions.length === 0 ? ( ) : ( filteredTransactions.map((t) => ( handleRowClick(t)} > )) )}
Data Evento setFilters({...filters, data: e.target.value})} />
Nome Evento setFilters({...filters, nome: e.target.value})} />
Tipo Evento setFilters({...filters, tipo: e.target.value})} />
Empresa setFilters({...filters, empresa: e.target.value})} />
Valor Recebido
Data Pagamento
Status setFilters({...filters, status: e.target.value})} />
Nenhum pagamento encontrado para os filtros.
{t.data_evento} {t.nome_evento} {t.tipo_evento} {t.empresa} {formatCurrency(t.valor_recebido)} {t.data_pagamento}
Total filtrado: {filteredTransactions.length} Soma Agrupada: {formatCurrency(filteredTotalSum)}
{/* Details Modal */} {isModalOpen && selectedTransaction && (

Detalhes do Pagamento

{/* Header Info */}

Evento

{selectedTransaction.nome_evento}

{selectedTransaction.empresa} • {selectedTransaction.data_evento}

{/* Financial Breakdown */}
Valor Base (Free) {formatCurrency(selectedTransaction.valor_free || 0)}
{(selectedTransaction.valor_extra || 0) > 0 && (
Valor Extra {formatCurrency(selectedTransaction.valor_extra || 0)}
)} {/* Divider */}
Total Recebido {formatCurrency(selectedTransaction.valor_recebido)}
{/* Extra Description */} {(selectedTransaction.descricao_extra) && (

Descrição do Extra

{selectedTransaction.descricao_extra}
)} {/* Status Footer */}
Data do Pagamento
{selectedTransaction.data_pagamento}
)}
); }; export default ProfessionalStatement;