import { useState } from 'react' import { FaChevronDown, FaPlay, FaStop, FaPlus } from 'react-icons/fa6' import { formatDistanceToNow, format } from 'date-fns' import { de } from 'date-fns/locale' import StatusDropdown from './StatusDropdown' import UrgentToggle from './UrgentToggle' import EditorDropdown from './EditorDropdown' import CreateWorksheetModal from './CreateWorksheetModal' import WorksheetList from './WorksheetList' import WorksheetTimesModal from './WorksheetTimesModal' import WorksheetSummary from './WorksheetSummary' import TicketProjects from './TicketProjects' import ProjectContextPanel from './ProjectContextPanel' import InvoicePanel from './InvoicePanel' import Tabs from './ui/Tabs' import Badge from './ui/Badge' import { StatusPill, UrgentPill } from './ui/StatusPill' import { useWorksheets } from '../hooks/useWorksheets' import { useCustomerAbo } from '../hooks/useCustomerAbo' import { useAuth } from '../context/AuthContext' import { databases, DATABASE_ID, COLLECTIONS } from '../lib/appwrite' import { canEditWorksheetTimes } from '../lib/ticketForm' import { ticketTypeLabel } from '../lib/ticketStatus' // Projekt / Preview steht mit im Details-Reiter const TABS = [ { id: 'details', label: 'Details' }, { id: 'worksheets', label: 'Arbeitsblätter' }, { id: 'invoices', label: 'Rechnungen' }, ] export default function TicketCard({ ticket, onUpdate }) { const { user, employee } = useAuth() const [expanded, setExpanded] = useState(false) const [activeTab, setActiveTab] = useState('details') const [showCreateWorksheet, setShowCreateWorksheet] = useState(false) const [editTimesWorksheet, setEditTimesWorksheet] = useState(null) // Abo-Stundenkonto gibt es nur bei Wartungs-Abo; erst laden, wenn Arbeitsblaetter gebraucht werden const { hoursAllowed: aboHoursAllowed } = useCustomerAbo( ticket.customerId, (expanded && activeTab === 'worksheets') || showCreateWorksheet ) const { worksheets, loading: worksheetsLoading, createWorksheet, updateWorksheet, updateWorksheetTimes, getTotalTime } = useWorksheets( expanded ? ticket.woid : null ) const createdAt = new Date(ticket.$createdAt || ticket.createdAt) const elapsed = formatDistanceToNow(createdAt, { locale: de, addSuffix: true }) const stop = (e) => e.stopPropagation() // Abo-Stunden: Arbeitszeit vom Stundenguthaben des Wartungs-Abos abziehen oder nicht const handleTogglePlan = (ws) => updateWorksheet(ws.$id, { countsToPlan: !ws.countsToPlan }) const handleCreateWorksheet = async (worksheetData, currentUser) => { const result = await createWorksheet(worksheetData, currentUser) if (result.success && worksheetData.newStatus !== ticket.status) { await onUpdate(ticket.$id, { status: worksheetData.newStatus }) } // Akquise-Automatik: Ergebnis im Worksheet steuert den Kundenstatus if (result.success && ticket.type === 'Akquise' && ticket.customerId) { const outcome = worksheetData.newStatus const next = outcome === 'Zugesagt' ? 'customer' : outcome === 'Abgesagt' ? 'lost' : null if (next) { try { await databases.updateDocument(DATABASE_ID, COLLECTIONS.CUSTOMERS, ticket.customerId, { customerStatus: next, updatedAt: new Date().toISOString(), }) } catch { /* nicht kritisch */ } } } return result } return (
{ticket.details || 'Keine Details vorhanden.'}