import React, { useState } from 'react'; import { Search, Plus, DollarSign, CheckCircle2, TrendingUp, Trash2, X, Calendar, Pencil, RefreshCw, Sparkles, ChevronDown } from 'lucide-react'; import { Receivable } from '../types'; import { useToast } from '../contexts/ToastContext'; import { useComFi } from '../contexts/ComFiContext'; import { CustomSelect } from './CustomSelect'; interface AccountsReceivableViewProps { receivables: Receivable[]; setReceivables: React.Dispatch>; } export const AccountsReceivableView: React.FC = ({ receivables, setReceivables }) => { const { addToast } = useToast(); const { companies } = useComFi(); const [isModalOpen, setIsModalOpen] = useState(false); const [filterStatus, setFilterStatus] = useState<'all' | 'paid' | 'pending'>('all'); const [newReceivable, setNewReceivable] = useState>({ type: 'one-time', status: 'pending', dueDate: new Date().toISOString().split('T')[0] }); const [editingId, setEditingId] = useState(null); const totalReceivable = receivables.reduce((acc, curr) => acc + curr.value, 0); const totalReceived = receivables.filter(r => r.status === 'paid').reduce((acc, curr) => acc + curr.value, 0); const totalPending = receivables.filter(r => r.status === 'pending' || r.status === 'overdue').reduce((acc, curr) => acc + curr.value, 0); const filteredList = receivables.filter(r => filterStatus === 'all' ? true : r.status === (filterStatus === 'paid' ? 'paid' : 'pending')); const handleGenerateRecurring = () => { const currentMonth = new Date().toISOString().slice(0, 7); const today = new Date().toISOString().split('T')[0]; let generatedCount = 0; const newReceivables: Receivable[] = []; companies.forEach(company => { if (company.status !== 'active') return; company.activeServices.forEach(service => { if (service.billingType === 'recurring') { const exists = receivables.find(r => r.companyName === (company.fantasyName || company.name) && r.description === service.name && r.dueDate.startsWith(currentMonth) ); if (!exists) { newReceivables.push({ id: Math.random().toString(36).substr(2, 9), description: service.name, companyName: company.fantasyName || company.name, category: service.category, value: service.price, dueDate: today, status: 'pending', type: 'recurring' }); generatedCount++; } } }); }); if (generatedCount > 0) { setReceivables(prev => [...prev, ...newReceivables]); addToast({ type: 'success', title: 'Processamento Concluído', message: `${generatedCount} faturas recorrentes geradas.` }); } else { addToast({ type: 'info', title: 'Tudo em dia', message: 'Cobranças mensais já processadas.' }); } }; const handleSave = () => { if (!newReceivable.description || !newReceivable.value) { addToast({ type: 'warning', title: 'Dados Incompletos' }); return; } if (editingId) { setReceivables(receivables.map(r => r.id === editingId ? { ...newReceivable, id: editingId, value: Number(newReceivable.value), category: newReceivable.category ?? 'Outros', companyName: newReceivable.companyName ?? 'Avulso' } as Receivable : r)); } else { const item: Receivable = { ...newReceivable, id: Math.random().toString(36).substr(2, 9), value: Number(newReceivable.value), category: newReceivable.category ?? 'Outros', companyName: newReceivable.companyName ?? 'Avulso' } as Receivable; setReceivables([...receivables, item]); } setIsModalOpen(false); setEditingId(null); }; const toggleStatus = (id: string) => { setReceivables(receivables.map(r => r.id === id ? { ...r, status: r.status === 'paid' ? 'pending' : 'paid' } : r)); }; const inputClass = "w-full p-3 bg-white border border-slate-200 rounded-xl outline-none focus:ring-2 focus:ring-primary-500 text-slate-800"; return (

Previsto

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

Recebido

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

A Receber

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

Contas a Receber

{filteredList.map(item => ( ))}
Descrição Valor Status
{item.description}
{item.companyName}
R$ {item.value.toLocaleString('pt-BR')}
{isModalOpen && (
setIsModalOpen(false)}>

Lançamento de Receita

setNewReceivable({...newReceivable, description: e.target.value})} /> setNewReceivable({...newReceivable, value: Number(e.target.value)})} />
setNewReceivable({...newReceivable, category: val})} options={[{value:'Serviços', label:'Serviços'}, {value:'Produtos', label:'Produtos'}, {value:'Outros', label:'Outros'}]} /> setNewReceivable({...newReceivable, type: val})} options={[{value:'one-time', label:'Avulso'}, {value:'recurring', label:'Mensal'}]} />
)}
); };