'use client'; import { useState, useEffect, useCallback, useRef } from 'react'; import { FileText, Plus, Search, X } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useSession } from 'next-auth/react'; const typeLabels: Record = { QUOTE: 'Angebot', ORDER_CONFIRMATION: 'Auftragsbestätigung', DELIVERY_NOTE: 'Lieferschein', INVOICE: 'Rechnung', CREDIT_NOTE: 'Rechnungskorrektur' }; const typeColors: Record = { QUOTE: 'bg-blue-50 text-blue-700 border-blue-200', ORDER_CONFIRMATION: 'bg-indigo-50 text-indigo-700 border-indigo-200', DELIVERY_NOTE: 'bg-amber-50 text-amber-700 border-amber-200', INVOICE: 'bg-emerald-50 text-emerald-700 border-emerald-200', CREDIT_NOTE: 'bg-red-50 text-red-700 border-red-200' }; const statusLabels: Record = { DRAFT: 'Entwurf', SENT: 'Gesendet', ACCEPTED: 'Angenommen', REJECTED: 'Abgelehnt', DELIVERED: 'Geliefert', PAID: 'Bezahlt', CANCELLED: 'Storniert', ARCHIVED: 'Archiviert' }; const statusColors: Record = { DRAFT: 'bg-slate-100 text-slate-600', SENT: 'bg-blue-100 text-blue-700', ACCEPTED: 'bg-emerald-100 text-emerald-700', REJECTED: 'bg-red-100 text-red-700', DELIVERED: 'bg-amber-100 text-amber-700', PAID: 'bg-emerald-100 text-emerald-700', CANCELLED: 'bg-slate-200 text-slate-500', ARCHIVED: 'bg-slate-100 text-slate-400' }; export default function SalesPage() { const [docs, setDocs] = useState([]); const [filter, setFilter] = useState('ACTIVE'); const [search, setSearch] = useState(''); const router = useRouter(); const { data: session } = useSession(); const perms = (session?.user as any)?.permissions || []; const canCreate = perms.includes('SALES_MANAGE'); const debounceRef = useRef(null); useEffect(() => { fetchDocs(); }, []); const fetchDocs = async () => { const res = await fetch('/api/sales'); if (res.ok) setDocs(await res.json()); }; // Filter + Search logic const filtered = docs.filter(d => { // Type filter if (filter === 'ACTIVE' && (d.status === 'ARCHIVED' || d.status === 'CANCELLED')) return false; if (filter === 'ARCHIVED' && d.status !== 'ARCHIVED') return false; if (filter !== 'ALL' && filter !== 'ACTIVE' && filter !== 'ARCHIVED' && d.type !== filter) return false; // Search if (search.trim()) { const q = search.toLowerCase(); const customerName = d.customer?.companyName || `${d.customer?.firstName} ${d.customer?.lastName}`; return ( d.number.toLowerCase().includes(q) || customerName.toLowerCase().includes(q) || (typeLabels[d.type] || '').toLowerCase().includes(q) || (statusLabels[d.status] || '').toLowerCase().includes(q) ); } return true; }); return (

Verkauf

Angebote, Auftragsbestätigungen, Lieferscheine & Rechnungen.

{/* Live Search */}
setSearch(e.target.value)} className="pl-9 pr-8 py-2 border border-slate-300 rounded-xl text-sm outline-none focus-ring w-64" /> {search && ( )}
{canCreate && ( )}
{[ { key: 'ACTIVE', label: 'Aktiv' }, { key: 'ALL', label: 'Alle' }, { key: 'QUOTE', label: 'Angebote' }, { key: 'ORDER_CONFIRMATION', label: 'ABs' }, { key: 'DELIVERY_NOTE', label: 'Lieferscheine' }, { key: 'INVOICE', label: 'Rechnungen' }, { key: 'CREDIT_NOTE', label: 'Korrekturen' }, { key: 'ARCHIVED', label: 'Archiv' } ].map(f => ( ))}
{filtered.map(d => ( router.push(`/sales/${d.id}`)} className={`hover:bg-indigo-50/40 transition-colors cursor-pointer ${d.status === 'ARCHIVED' ? 'opacity-60' : ''}`}> ))} {filtered.length === 0 && ( )}
Nummer Typ Kunde Status Betrag Datum
{d.number} {typeLabels[d.type]} {d.customer?.companyName || `${d.customer?.firstName} ${d.customer?.lastName}`} {statusLabels[d.status]} {d.total.toFixed(2)} € {new Date(d.createdAt).toLocaleDateString('de-DE')}
{search ? `Keine Ergebnisse für "${search}"` : 'Keine Belege vorhanden.'}
{filtered.length > 0 && (
{filtered.length} Beleg{filtered.length !== 1 ? 'e' : ''} angezeigt
)}
); }