"use client"; import { useState, useEffect } from 'react'; import { supabase } from '@/lib/supabase'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { useRouter } from 'next/navigation'; import { Calendar, User, Building, Phone, Mail, FileText, Clock, Play, CheckCircle, AlertCircle, Users, Target, Globe, Palette, Settings, TrendingUp } from 'lucide-react'; interface Customer { id: string; berater?: string; firma?: string; ansprechpartn?: string; telefon?: string; email?: string; beschreibung?: string; zielgruppe?: string; website_vorha?: boolean; was_gefaellt_c?: string; ziel_der_websi?: string; seiten_geplant?: string; texte_bilder_v?: boolean; fokus_inhalte?: string; logo_farben_v?: boolean; stilvorbilder?: string; design_wunsch?: string; features_gewu?: string; drittanbieter?: string; selbst_pflegen?: boolean; laufende_betre?: boolean; deadline?: string; projekt_verant?: string; budget?: string; kommunikation?: string; feedback_gesc?: string; beispiellinks?: string; benoetigte_fur?: string; webseiten_ziel?: string; geplante_seite?: string; termin_datum?: string; erstellt_am: string; appointment_status?: 'pending' | 'running' | 'completed'; started_by?: string; started_at?: string; } export default function KundenProjektePage() { const [customers, setCustomers] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const router = useRouter(); useEffect(() => { fetchCustomers(); }, []); const fetchCustomers = async () => { try { console.log('🔍 Fetching customers with appointments...'); const { data, error } = await supabase .from('kunden_projekte') .select('*') .not('termin_datum', 'is', null) .order('id', { ascending: false }); if (error) { console.error('❌ Error fetching customers:', error); return; } console.log('✅ Customers fetched:', data?.length || 0); setCustomers(data || []); } catch (error) { console.error('❌ Error:', error); } finally { setLoading(false); } }; const updateAppointmentStatus = async (customerId: string, status: 'pending' | 'running' | 'completed') => { try { console.log(`🔄 Updating appointment status for ${customerId} to ${status}`); const updateData: any = { appointment_status: status }; if (status === 'running') { updateData.started_by = 'admin@example.com'; // TODO: Get from auth updateData.started_at = new Date().toISOString(); } else if (status === 'completed') { updateData.completed_at = new Date().toISOString(); } const { error } = await supabase .from('kunden_projekte') .update(updateData) .eq('id', customerId); if (error) { console.error('❌ Error updating status:', error); return; } console.log('✅ Status updated successfully'); fetchCustomers(); // Refresh data } catch (error) { console.error('❌ Error:', error); } }; const getStatusBadge = (status: string, startedBy?: string) => { switch (status) { case 'pending': return ( Termin wartet ); case 'running': return (
Termin läuft {startedBy && ( ({startedBy}) )}
); case 'completed': return ( Termin abgeschlossen ); default: return ( Termin wartet ); } }; const getStatusActions = (customer: Customer) => { switch (customer.appointment_status) { case 'pending': return ( ); case 'running': return (
); case 'completed': return (
); default: return ( ); } }; const getCompletionStatus = (customer: Customer) => { const fields = [ customer.firma, customer.ansprechpartn, customer.telefon, customer.email, customer.beschreibung, customer.zielgruppe, customer.ziel_der_websi, customer.seiten_geplant, customer.fokus_inhalte, customer.design_wunsch, customer.features_gewu, customer.budget, customer.deadline ]; const filledFields = fields.filter(field => field && field.trim() !== '').length; const totalFields = fields.length; const percentage = Math.round((filledFields / totalFields) * 100); return { filledFields, totalFields, percentage }; }; const filteredCustomers = customers.filter(customer => { const matchesSearch = (customer.ansprechpartn || '').toLowerCase().includes(searchTerm.toLowerCase()) || (customer.firma || '').toLowerCase().includes(searchTerm.toLowerCase()) || (customer.email || '').toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || customer.appointment_status === statusFilter; return matchesSearch && matchesStatus; }); if (loading) { return (

Kunden-Projekte

Lade Projekte...

); } return (
{/* Header */}

Kunden-Projekte

Professionelle Projektverwaltung und Kundenbefragung

{/* Stats */}

Gesamt Projekte

{customers.length}

Wartend

{customers.filter(c => c.appointment_status === 'pending').length}

Aktiv

{customers.filter(c => c.appointment_status === 'running').length}

Abgeschlossen

{customers.filter(c => c.appointment_status === 'completed').length}

{/* Filters */}
setSearchTerm(e.target.value)} className="pl-10 bg-white/80 backdrop-blur-sm border-0 shadow-sm" />
{/* Projects Grid */} {filteredCustomers.length === 0 ? (

{customers.length === 0 ? "Keine Projekte gefunden" : "Keine Projekte entsprechen den Filterkriterien"}

{customers.length === 0 ? "Erstellen Sie Ihr erstes Kundenprojekt ĂĽber die Terminbuchung." : "Versuchen Sie andere Suchkriterien oder Filter."}

) : (
{filteredCustomers.map((customer) => { const completion = getCompletionStatus(customer); return (
{customer.ansprechpartn || customer.firma || 'Unbekannter Kunde'}

{customer.firma && customer.ansprechpartn ? `${customer.firma} - ${customer.ansprechpartn}` : customer.firma || customer.ansprechpartn}

{customer.email || 'E-Mail nicht angegeben'}
{customer.telefon && (
{customer.telefon}
)} {customer.termin_datum && (
{new Date(customer.termin_datum).toLocaleString('de-DE')}
)}
{/* Completion Progress */}
Befragung Fortschritt {completion.percentage}%
= 80 ? 'bg-green-500' : completion.percentage >= 50 ? 'bg-yellow-500' : 'bg-blue-500' }`} style={{ width: `${completion.percentage}%` }} >

{completion.filledFields} von {completion.totalFields} Feldern ausgefĂĽllt

{getStatusBadge(customer.appointment_status || 'pending', customer.started_by)} {getStatusActions(customer)}
); })}
)}
); }