093a958dcf
Auf ausdrücklichen Wunsch: Giorgio entfällt vollständig. Das weicht bewusst von §6 des Auftrags ab, der ihn als Personalverwalter und Vorgesetzten vorsah — festgehalten, damit die Abweichung später nachvollziehbar bleibt. Entfernt: Rollendefinition `AGENT_SUPERVISOR`, sein gezeichnetes Porträt, sein Eintrag in der Auslastung und in der Belegschaftsansicht sowie die Erwähnung in der Produkttour. Die Personalverwaltung bleibt unverändert über den Menüpunkt «Meine Agenten» erreichbar — sie brauchte nie eine eigene Person am Bildschirm. Mit Giorgio entfällt auch die einzige Kennzahl, die aus den Freigabevorgängen kam; `computeAgentWorkload` braucht `agentWorkItems` deshalb nicht mehr. Ordner und Komponenten heissen jetzt nach ihrem Inhalt: `components/staff/`, `AgentStaffOverview`, `StaffBackdrop`. «Meetingraum» war seit dem Umbau auf Personenkarten irreführend, und ein falscher Name kostet den Nächsten mehr Zeit als die Umbenennung. Fünf statt sechs Karten heisst Flexlayout statt Dreierraster: drei oben, zwei mittig darunter, gleich breit und ohne Lücke. Die Karten geben ihre Höhe nicht mehr selbst vor — mit `height: 100%` beanspruchte jede die volle Fläche und die zweite Zeile fiel aus dem sichtbaren Bereich. Geprüft: 433 Tests, Typecheck, Build, ESLint, Token-Schwelle (889/925). Browser 1280–1920 px und Tablet: fünf Karten vollständig sichtbar, keine Überlappung, Titel und «Filter & Übersicht» beim Einstieg sichtbar, alle fünf Klicks auf der richtigen Subpage, «Meine Agenten» weiterhin erreichbar, keine Konsolenfehler, keine 404. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
37 lines
1.5 KiB
TypeScript
37 lines
1.5 KiB
TypeScript
import { useMemo } from 'react'
|
|
import { useReminders } from './useReminders'
|
|
import { useVisitAssignments } from './useVisitAssignments'
|
|
import { useExposeLeads } from './useExposeLeads'
|
|
import { useUnifiedLeads } from './useUnifiedLeads'
|
|
import { useProperties } from './useProperties'
|
|
import { computeAgentWorkload } from '../services/agentWorkloadService'
|
|
import type { AgentWorkload } from '../domain/agentWorkload'
|
|
|
|
/**
|
|
* Aktuelle Auslastung der fünf digitalen Mitarbeitenden (Runde 5).
|
|
*
|
|
* Der Hook sammelt nur die Bestände ein; was daraus wird, entscheidet
|
|
* `agentWorkloadService` — Schwellen, Zeitfenster und Formulierungen sind
|
|
* fachliche Festlegungen und gehören nicht in die Oberflächenschicht
|
|
* (CLAUDE.md §4.2/§5.2).
|
|
*/
|
|
export function useAgentWorkload(): { data: Record<string, AgentWorkload>; isLoading: boolean } {
|
|
const { data: reminders = [], isLoading: remindersLoading } = useReminders()
|
|
const { data: visits = [], isLoading: visitsLoading } = useVisitAssignments()
|
|
const { data: exposeLeads = [], isLoading: exposeLoading } = useExposeLeads()
|
|
const { data: leads, isLoading: leadsLoading } = useUnifiedLeads()
|
|
const { data: properties = [], isLoading: propertiesLoading } = useProperties()
|
|
|
|
const data = useMemo(
|
|
() => computeAgentWorkload({ reminders, visits, exposeLeads, leads, properties }),
|
|
[reminders, visits, exposeLeads, leads, properties],
|
|
)
|
|
|
|
return {
|
|
data,
|
|
isLoading:
|
|
remindersLoading || visitsLoading || exposeLoading ||
|
|
leadsLoading || propertiesLoading,
|
|
}
|
|
}
|