import React, { useState } from 'react'; import { Search, Plus, DollarSign, Calendar, CheckCircle2, AlertCircle, Trash2, X, Pencil, Sparkles, ChevronDown } from 'lucide-react'; import { Expense } from '../types'; import { useToast } from '../contexts/ToastContext'; import { CustomSelect } from './CustomSelect'; interface AccountsPayableViewProps { expenses: Expense[]; setExpenses: (expenses: Expense[]) => void; } export const AccountsPayableView: React.FC = ({ expenses, setExpenses }) => { const { addToast } = useToast(); const [isModalOpen, setIsModalOpen] = useState(false); const [filterType, setFilterType] = useState<'all' | 'fixed' | 'variable'>('all'); const [newExpense, setNewExpense] = useState>({ type: 'fixed', status: 'pending', dueDate: new Date().toISOString().split('T')[0] }); const [editingId, setEditingId] = useState(null); // Totals Calculation const totalPayable = expenses.reduce((acc, curr) => acc + curr.amount, 0); const totalPaid = expenses.filter(e => e.status === 'paid').reduce((acc, curr) => acc + curr.amount, 0); const totalPending = expenses.filter(e => e.status === 'pending' || e.status === 'overdue').reduce((acc, curr) => acc + curr.amount, 0); const filteredExpenses = expenses.filter(e => filterType === 'all' ? true : e.type === filterType); const openEditModal = (expense: Expense) => { setNewExpense(expense); setEditingId(expense.id); setIsModalOpen(true); }; const openCreateModal = () => { setNewExpense({ type: 'fixed', status: 'pending', dueDate: new Date().toISOString().split('T')[0] }); setEditingId(null); setIsModalOpen(true); } const handleSaveExpense = () => { if (!newExpense.title || !newExpense.amount) { addToast({ type: 'warning', title: 'Campos Obrigatórios', message: 'Preencha o título e valor da despesa.' }); return; } if (editingId) { // Edit existing setExpenses(expenses.map(e => e.id === editingId ? { ...newExpense, id: editingId, amount: Number(newExpense.amount) } as Expense : e)); addToast({ type: 'success', title: 'Atualizado', message: 'Despesa atualizada com sucesso.' }); } else { // Create new const expense: Expense = { ...newExpense, id: Math.random().toString(36).substr(2, 9), amount: Number(newExpense.amount) } as Expense; setExpenses([...expenses, expense]); addToast({ type: 'success', title: 'Registrado', message: 'Nova despesa adicionada.' }); } setIsModalOpen(false); setEditingId(null); setNewExpense({ type: 'fixed', status: 'pending', dueDate: new Date().toISOString().split('T')[0] }); }; const handleDelete = (id: string) => { if(window.confirm("Excluir conta?")) { setExpenses(expenses.filter(e => e.id !== id)); addToast({ type: 'info', title: 'Excluído', message: 'Despesa removida.' }); } } const toggleStatus = (id: string) => { setExpenses(expenses.map(e => { if(e.id === id) { const newStatus = e.status === 'paid' ? 'pending' : 'paid'; if (newStatus === 'paid') addToast({ type: 'success', title: 'Pago!', message: 'Despesa marcada como paga.' }); return { ...e, status: newStatus }; } return e; })); } const inputClass = "w-full p-3 bg-white border border-slate-200 rounded-xl focus:ring-2 focus:ring-primary-500 focus:border-primary-500 outline-none text-slate-800"; return (
{/* KPI Cards */}

Total Previsto

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

Total Pago

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

A Pagar / Pendente

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

Contas a Pagar

Gerencie despesas fixas e variáveis.

{/* Toolbar */}
{/* Table */}
{filteredExpenses.map(expense => ( ))}
Descrição Categoria Vencimento Valor Tipo Status
{expense.title} {expense.category}
{new Date(expense.dueDate).toLocaleDateString('pt-BR')}
R$ {expense.amount.toLocaleString('pt-BR')} {expense.type === 'fixed' ? 'Fixa' : 'Variável'}
{filteredExpenses.length === 0 && (

Nenhuma despesa encontrada.

)}
{/* Modal */} {isModalOpen && (
setIsModalOpen(false)}>

{editingId ? 'Editar Despesa' : 'Nova Despesa'}

setNewExpense({...newExpense, title: e.target.value})} />
setNewExpense({...newExpense, amount: Number(e.target.value)})} />
setNewExpense({...newExpense, dueDate: e.target.value})} />
setNewExpense({...newExpense, category: val})} options={[ { value: 'Operacional', label: 'Operacional' }, { value: 'Administrativo', label: 'Administrativo' }, { value: 'Impostos', label: 'Impostos' }, { value: 'Marketing', label: 'Marketing' }, { value: 'Pessoal', label: 'Pessoal / Folha' }, ]} />
setNewExpense({...newExpense, type: val})} options={[ { value: 'fixed', label: 'Fixa' }, { value: 'variable', label: 'Variável' }, ]} />
)}
); };