// ══ src/services/agentWorkloadService.ts — Importe (Z. 3-4) ══ import { ExposeLeadStatus } from '../domain/exposeLead' import type { ExposeLead } from '../domain/exposeLead' // ══ URGENT_FROM (Z. 33-40) ══ const URGENT_FROM = { reminders: 5, visits: 4, expose: 5, dataGaps: 10, } as const /** Zeitfenster der Auswertung. */ // ══ Eingabefeld (Z. 48-55) ══ export interface AgentWorkloadInput { reminders: Reminder[] visits: VisitAssignment[] exposeLeads: ExposeLead[] leads: UnifiedLead[] properties: Property[] } // ══ Livias Auslastungsbahn (Z. 117-129) ══ // ── Livia: weitergeleitete Leads ──────────────────────────────────────────── const openExpose = input.exposeLeads.filter(l => l.status === ExposeLeadStatus.ACTIVE).length const livia: AgentWorkload = { agentId: 'livia', count: openExpose, label: `${openExpose} ${plural(openExpose, 'Exposé offen', 'Exposés offen')}`, tone: tone(openExpose, URGENT_FROM.expose), voice: openExpose === 0 ? 'Kein Exposé offen. Leite mir einen Lead weiter, dann lege ich los.' : `${openExpose} ${plural(openExpose, 'Lead wartet', 'Leads warten')} auf ein Exposé von mir.`, } // ── Nora: Marktchancen ────────────────────────────────────────────────────── // ══ src/hooks/useAgentWorkload.ts — alle Livia-Stellen ══ import { useExposeLeads } from './useExposeLeads' const { data: exposeLeads = [], isLoading: exposeLoading } = useExposeLeads() const data = useMemo( () => computeAgentWorkload({ reminders, visits, exposeLeads, leads, properties }), [reminders, visits, exposeLeads, leads, properties], remindersLoading || visitsLoading || exposeLoading || leadsLoading || propertiesLoading, }