'use client' import { useState, useEffect } from 'react' import { useParams, useRouter } from 'next/navigation' import Link from 'next/link' import { Building2, Plus, Trash2, Loader2, Pencil, ArrowLeft, Search, MapPin, User, Users, Briefcase, AlertCircle } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { getCompanyDetails, getEndCustomersByCompanyWithPartners, getCompanyPartners, adminCreateEndCustomer, adminUpdateEndCustomer, adminDeleteEndCustomer } from '@/lib/actions/companies' export default function CompanyCustomersPage() { const params = useParams() const router = useRouter() const companyId = params.id as string const [company, setCompany] = useState(null) const [customers, setCustomers] = useState([]) const [partners, setPartners] = useState([]) const [loading, setLoading] = useState(true) const [loadingAction, setLoadingAction] = useState(false) const [searchQuery, setSearchQuery] = useState('') // Dialog State const [isOpen, setIsOpen] = useState(false) const [editingCustomer, setEditingCustomer] = useState(null) // Form State const [companyName, setCompanyName] = useState('') const [firstName, setFirstName] = useState('') const [lastName, setLastName] = useState('') const [street, setStreet] = useState('') const [zip, setZip] = useState('') const [city, setCity] = useState('') const [vatId, setVatId] = useState('') const [partnerId, setPartnerId] = useState('') const [email, setEmail] = useState('') const [error, setError] = useState(null) const loadData = async () => { setLoading(true) try { const [compDetails, custData, partData] = await Promise.all([ getCompanyDetails(companyId), getEndCustomersByCompanyWithPartners(companyId), getCompanyPartners(companyId) ]) setCompany(compDetails) setCustomers(custData) setPartners(partData) } catch (err) { console.error('Fehler beim Laden der Daten:', err) } finally { setLoading(false) } } useEffect(() => { if (companyId) { loadData() } }, [companyId]) const handleOpenDialog = (customer: any = null) => { setEditingCustomer(customer) setCompanyName(customer ? customer.company_name || '' : '') setFirstName(customer ? customer.first_name || '' : '') setLastName(customer ? customer.last_name || '' : '') setStreet(customer ? customer.street || '' : '') setZip(customer ? customer.zip || '' : '') setCity(customer ? customer.city || '' : '') setVatId(customer ? customer.vat_id || '' : '') setPartnerId(customer ? customer.partner_id || '' : companyId) setEmail(customer ? customer.email || '' : '') setError(null) setIsOpen(true) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!partnerId) { setError('Bitte weisen Sie einen Partner zu.') return } setLoadingAction(true) setError(null) try { const payload = { partner_id: partnerId, company_name: companyName.trim(), first_name: firstName.trim() || undefined, last_name: lastName.trim() || undefined, street: street.trim() || undefined, zip: zip.trim() || undefined, city: city.trim() || undefined, vat_id: vatId.trim() || undefined, email: email.trim() || undefined, } if (editingCustomer) { await adminUpdateEndCustomer(editingCustomer.id, payload) } else { await adminCreateEndCustomer(payload) } setIsOpen(false) loadData() } catch (err: any) { setError(err.message || 'Fehler beim Speichern des Endkunden.') } finally { setLoadingAction(false) } } const handleDelete = async (id: string, name: string) => { if (!confirm(`Endkunden "${name}" wirklich löschen?`)) return setLoadingAction(true) try { await adminDeleteEndCustomer(id) loadData() } catch (err) { console.error('Fehler beim Löschen des Endkunden:', err) } finally { setLoadingAction(false) } } const filteredCustomers = customers.filter((c) => { const q = searchQuery.toLowerCase() const nameMatch = c.company_name?.toLowerCase().includes(q) const personMatch = `${c.first_name || ''} ${c.last_name || ''}`.toLowerCase().includes(q) const addressMatch = `${c.street || ''} ${c.zip || ''} ${c.city || ''}`.toLowerCase().includes(q) const partnerMatch = c.partner_name?.toLowerCase().includes(q) const emailMatch = c.email?.toLowerCase().includes(q) return nameMatch || personMatch || addressMatch || partnerMatch || emailMatch }) return (
{/* Back Link */}
Zurück zur Firmenverwaltung
{/* Header */}

Endkunden von {company ? company.name : '...'}

Hier verwalten Sie alle Endkunden, die Partnern dieser Firma zugeordnet sind.

{/* Warning if no partners exist */} {!loading && partners.length === 0 && (

Keine Benutzer zugewiesen

Diese Firma hat aktuell keine zugewiesenen Partner (Benutzer mit der Rolle "partner"). Sie müssen zuerst in der Benutzerverwaltung Partner erstellen und dieser Firma zuweisen, um Endkunden anzulegen.

)} {/* Table Section */}
setSearchQuery(e.target.value)} className="w-full pl-9 pr-4 py-2 text-sm bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 rounded-md text-slate-900 dark:text-slate-200 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 transition-all" />
{loading ? (
Lade Endkunden...
) : filteredCustomers.length === 0 ? (
Keine Endkunden gefunden.
) : ( {filteredCustomers.map((customer) => ( ))}
Endkunde (Firma / Kontakt) Lieferadresse E-Mail USt-ID Zugeordneter Partner Aktionen
{customer.company_name}
{(customer.first_name || customer.last_name) && (
{customer.first_name || ''} {customer.last_name || ''}
)}
{customer.street ? (
{customer.street}, {customer.zip} {customer.city}
) : ( )}
{customer.email || } {customer.vat_id || } {customer.partner_name || 'Unbekannt'}
)}
{/* Dialog: Endkunde anlegen / bearbeiten */} {editingCustomer ? 'Endkunden bearbeiten' : 'Neuen Endkunden anlegen'} Geben Sie die Firmendaten und optional Kontaktdaten und Adresse des Endkunden an.
setCompanyName(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setFirstName(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setLastName(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setStreet(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setZip(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setCity(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setVatId(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
setEmail(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" />
{error && (

{error}

)}
) }