import React, { useState } from 'react'; import { useCRM } from '../context/CRMContext'; import { ArrowUpRight, ArrowDownRight, TrendingUp, DollarSign, Calendar, CheckCircle, AlertCircle, Plus } from 'lucide-react'; import clsx from 'clsx'; import { PaymentMethod, Transaction } from '../types'; const Financial: React.FC = () => { const { transactions, getFinancialSummary, addTransaction, updateTransaction, loading } = useCRM(); const { totalIncome, totalExpense, balance } = getFinancialSummary(); const [activeTab, setActiveTab] = useState<'payable' | 'receivable' | 'dashboard'>('dashboard'); const [showAddModal, setShowAddModal] = useState(false); // New Bill State const [newBill, setNewBill] = useState>({ type: 'Expense', status: 'Pending', paymentMethod: 'Boleto', date: new Date().toISOString().split('T')[0], dueDate: new Date().toISOString().split('T')[0] }); const pendingPayables = transactions.filter(t => t.type === 'Expense' && t.status === 'Pending').sort((a, b) => new Date(a.dueDate || '').getTime() - new Date(b.dueDate || '').getTime()); const paidPayables = transactions.filter(t => t.type === 'Expense' && t.status === 'Paid'); // Sort Receivables by date desc const receivables = transactions.filter(t => t.type === 'Income').sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());; const handleSaveBill = async () => { if (!newBill.description || !newBill.amount) return alert("Preencha descrição e valor"); await addTransaction({ type: 'Expense', category: 'Contas', description: newBill.description, amount: Number(newBill.amount), date: new Date(newBill.date!).toISOString(), dueDate: new Date(newBill.dueDate!).toISOString(), status: 'Pending', // Force pending paymentMethod: newBill.paymentMethod as PaymentMethod || 'Boleto' }); setShowAddModal(false); setNewBill({ type: 'Expense', status: 'Pending', paymentMethod: 'Boleto', date: new Date().toISOString().split('T')[0], dueDate: new Date().toISOString().split('T')[0] }); }; const togglePaid = async (t: Transaction) => { const newStatus = t.status === 'Paid' ? 'Pending' : 'Paid'; await updateTransaction(t.id, { status: newStatus }); } const renderDashboard = () => (
{/* Summary Cards */}

Entradas (Total)

R$ {totalIncome.toLocaleString('pt-BR')}

+12% este mês

Saídas (Total)

R$ {totalExpense.toLocaleString('pt-BR')}

Estável

Saldo Atual

= 0 ? "text-emerald-400" : "text-rose-400")}> R$ {balance.toLocaleString('pt-BR')}

Balanço Geral
{/* Upcoming Bills Alert */} {pendingPayables.length > 0 && (

Contas a Pagar Pendentes

Você tem {pendingPayables.length} contas pendentes. Verifique a aba "A Pagar".

)}
); const renderPayables = () => (

Contas a Pagar

{pendingPayables.concat(paidPayables).map(t => { const isOverdue = new Date(t.dueDate || '') < new Date() && t.status !== 'Paid'; return ( ); })}
Vencimento Descrição Valor Via Status Ação
{t.dueDate ? new Date(t.dueDate).toLocaleDateString() : '-'}
{t.description} - R$ {t.amount.toLocaleString('pt-BR')} {t.paymentMethod} {isOverdue ? 'Vencido' : t.status === 'Paid' ? 'Pago' : 'Pendente'}
{transactions.filter(t => t.type === 'Expense').length === 0 && (
Nenhuma conta registrada.
)}
); const renderReceivables = () => (

Contas a Receber (Vendas)

{receivables.map(t => ( ))}
Data Origem Valor Forma Pagto Status
{new Date(t.date).toLocaleDateString()} {t.description} + R$ {t.amount.toLocaleString('pt-BR')} {t.paymentMethod} {t.status || 'Paid'}
{receivables.length === 0 && (
Nenhuma venda registrada.
)}
); return (
{/* Tabs */}
{activeTab === 'dashboard' && renderDashboard()} {activeTab === 'payable' && renderPayables()} {activeTab === 'receivable' && renderReceivables()} {/* Add Bill Modal */} {showAddModal && (

Agendar Pagamento

setNewBill({ ...newBill, description: e.target.value })} className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-3 text-sm text-white focus:border-indigo-500 outline-none" /> setNewBill({ ...newBill, amount: e.target.value })} className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-3 text-sm text-white focus:border-indigo-500 outline-none" />
setNewBill({ ...newBill, dueDate: e.target.value })} className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-3 text-sm text-white focus:border-indigo-500 outline-none" />
)}
); }; export default Financial;