Livia wird von der Exposé-Master zur Research- & Market-Intelligence-Agentin.
Sie schaut nach draussen: verknüpfte Newsquellen, Geschäftsberichte,
Handelsregister und amtliche Publikationen werden zu qualitativen Leads
verdichtet — Unternehmen, Veränderung, Ort, Zeitpunkt, Begründung, Quellen.
Die Exposé-Funktion bleibt vollständig erhalten, ist aber nachgeordnet und
liegt im zweiten Reiter ihres Arbeitsplatzes.
Das Matching bleibt ausdrücklich bei Nora. Beide Arbeitsplätze teilen sich
dieselbe Liste (`UnifiedLeadList`) und dieselbe Detailansicht (`LeadDetail`);
bei Livia läuft sie mit `showMatching={false}`. Damit ist die Grenze im Code
gezogen und nicht bloss in der Beschriftung. Es gibt keine zweite Lead-Ablage:
ein Lead, zwei Arbeitsplätze.
Neu ist die Einordnung Chance/Risiko als Spalte in Noras Liste und als Block
in der Detailansicht, je mit Begründung und konkreter nächster Handlung. Bei
einem Risiko wird das betroffene Mietverhältnis benannt und auf internes
Re-Letting hingewiesen. `leadSignalTypeOf()` leitet die Einordnung für
Altbestände aus dem Signaltyp ab, damit keine Migration nötig ist.
Thomas bekommt denselben Chat-Einstieg wie die fünf anderen — dieselbe
Komponente, dieselbe Sticky-Mechanik, keine Sonderlösung. Dafür scrollt seine
Seite als Ganzes; die drei Verwaltungsbereiche behalten ihren inneren Scroll.
Ferdi wird vom Reminder-Agenten zur Contract Intelligence: Kündigungsfristen,
echte und unechte Optionen, Verhandlungsfenster und Vertragsgespräche. Der
Unterschied zwischen echter und unechter Option ist der Kern — die echte
Option hat eine Frist, die verfällt, die unechte nur ein Fenster, in dem
verhandelt werden sollte. Alle neuen Termine orientieren sich am
Entscheidungszeitpunkt, nicht am Vertragsende: `decisionDate` und `dueDate`
liegen bewusst davor.
Auslastungsanzeige nachgezogen: Livia zählt ihre Recherche statt offener
Exposés, Nora den Abgleich statt des Findens.
Geprüft: tsc 0 Fehler, eslint 0 Fehler/0 Warnungen, 423/423 Tests grün,
Produktionsbuild erfolgreich.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
366 lines
9.5 KiB
TypeScript
366 lines
9.5 KiB
TypeScript
/**
|
|
* Property On — Verzeichnis aller digitalen Mitarbeitenden.
|
|
*
|
|
* Quelle ist das Konzeptdokument «Agenten_Bewirtschaftung_v2.html» (Stand
|
|
* 24.07.2026): Namen, Funktionen, Personalstufen, Bereiche und Rollout-Status
|
|
* sind daraus unverändert übernommen, ebenso die Porträts.
|
|
*
|
|
* Abgrenzung zu `mockTeamAgents`: dieses Verzeichnis trägt nur die Stammdaten,
|
|
* die für die Kreisdarstellung nötig sind. Ein vollständiges Personaldossier —
|
|
* Aufgaben, Kanäle, Systemzugänge, Einstellungen, Protokoll — besitzen
|
|
* ausschliesslich die fünf Kernteammitglieder in `src/mock-data/agents/`.
|
|
* Für die übrigen 29 werden bewusst keine Inhalte erfunden.
|
|
*
|
|
* ACHTUNG: generiert aus dem Konzept. Nicht von Hand pflegen — bei einer neuen
|
|
* Konzeptfassung neu erzeugen, sonst driften Verzeichnis und Quelle auseinander.
|
|
*/
|
|
|
|
import type { AgentDirectoryEntry } from '../domain/agentDirectory'
|
|
import { AgentLevel, AgentDepartment, AgentRollout } from '../domain/agentDirectory'
|
|
|
|
export const agentDirectory: AgentDirectoryEntry[] = [
|
|
{
|
|
id: 'ferdi',
|
|
name: 'Ferdi',
|
|
role: 'Fristen-Wächter',
|
|
email: 'ferdi@property-on.ch',
|
|
level: AgentLevel.CORE,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PROTOTYPE,
|
|
isCore: true,
|
|
},
|
|
{
|
|
id: 'bruno',
|
|
name: 'Bruno',
|
|
role: 'Besichtigungsassistent',
|
|
email: 'bruno@property-on.ch',
|
|
level: AgentLevel.CORE,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: true,
|
|
},
|
|
{
|
|
id: 'livia',
|
|
name: 'Livia',
|
|
role: 'Research & Market Intelligence',
|
|
email: 'livia@property-on.ch',
|
|
level: AgentLevel.CORE,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: true,
|
|
},
|
|
{
|
|
id: 'nora',
|
|
name: 'Nora',
|
|
role: 'Marktchancen / Leads',
|
|
email: 'nora@property-on.ch',
|
|
level: AgentLevel.CORE,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PROTOTYPE,
|
|
isCore: true,
|
|
},
|
|
{
|
|
id: 'sina',
|
|
name: 'Sina',
|
|
role: 'Datenpflege',
|
|
email: 'sina@property-on.ch',
|
|
level: AgentLevel.CORE,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: true,
|
|
},
|
|
{
|
|
id: 'ada',
|
|
name: 'Ada',
|
|
role: 'Datenqualitäts-Wächterin',
|
|
email: 'ada@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PROTOTYPE,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'carla',
|
|
name: 'Carla',
|
|
role: 'Bestands-Radar',
|
|
email: 'carla@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'diego',
|
|
name: 'Diego',
|
|
role: 'Decision-Brief-Ersteller',
|
|
email: 'diego@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PROTOTYPE,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'dora',
|
|
name: 'Dora',
|
|
role: 'Dossier-Erstellerin',
|
|
email: 'dora@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'emil',
|
|
name: 'Emil',
|
|
role: 'Unterlagen-Versand',
|
|
email: 'emil@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'filip',
|
|
name: 'Filip',
|
|
role: 'Ablage-Agent',
|
|
email: 'filip@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'kira',
|
|
name: 'Kira',
|
|
role: 'Konkurrenz-Beobachterin',
|
|
email: 'kira@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'lars',
|
|
name: 'Lars',
|
|
role: 'Archiv-Digitalisierer',
|
|
email: 'lars@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'mia',
|
|
name: 'Mia',
|
|
role: 'Mietpreis-Benchmarkerin',
|
|
email: 'mia@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'paul',
|
|
name: 'Paul',
|
|
role: 'Pipeline-Führer',
|
|
email: 'paul@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'pia',
|
|
name: 'Pia',
|
|
role: 'Mietantritt-Koordinatorin',
|
|
email: 'pia@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'rea',
|
|
name: 'Rea',
|
|
role: 'Referenz-Einholerin',
|
|
email: 'rea@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'rico',
|
|
name: 'Rico',
|
|
role: 'Eigentümer-Reporter',
|
|
email: 'rico@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'uli',
|
|
name: 'Uli',
|
|
role: 'Übergabe-Assistent',
|
|
email: 'uli@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'vela',
|
|
name: 'Vela',
|
|
role: 'Cockpit-Agentin',
|
|
email: 'vela@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'vera',
|
|
name: 'Vera',
|
|
role: 'Inserat-Texterin',
|
|
email: 'vera@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'vinz',
|
|
name: 'Vinz',
|
|
role: 'Vertragsentwurf-Assistent',
|
|
email: 'vinz@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'vito',
|
|
name: 'Vito',
|
|
role: 'Objekt-Erfasser',
|
|
email: 'vito@property-on.ch',
|
|
level: AgentLevel.CENTRAL_SERVICES,
|
|
department: AgentDepartment.CENTRAL_SERVICES,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'beat',
|
|
name: 'Beat',
|
|
role: 'Zahlungs-Frühwarner',
|
|
email: 'beat@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'fabio',
|
|
name: 'Fabio',
|
|
role: 'Fit-out-Rechner',
|
|
email: 'fabio@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'nadia',
|
|
name: 'Nadia',
|
|
role: 'Umsatzmiete-Abrechnerin',
|
|
email: 'nadia@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'oskar',
|
|
name: 'Oskar',
|
|
role: 'Offerten-Schreiber',
|
|
email: 'oskar@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'otto',
|
|
name: 'Otto',
|
|
role: 'Options-Vorbereiter',
|
|
email: 'otto@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.PLANNED,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'sven',
|
|
name: 'Sven',
|
|
role: 'Mieter-Check',
|
|
email: 'sven@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.PROTOTYPE,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'tino',
|
|
name: 'Tino',
|
|
role: 'Mietzins-Rechner',
|
|
email: 'tino@property-on.ch',
|
|
level: AgentLevel.COMMERCIAL,
|
|
department: AgentDepartment.COMMERCIAL,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'gian',
|
|
name: 'Gian',
|
|
role: 'Privat-Check',
|
|
email: 'gian@property-on.ch',
|
|
level: AgentLevel.RESIDENTIAL,
|
|
department: AgentDepartment.RESIDENTIAL,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'ida',
|
|
name: 'Ida',
|
|
role: 'Nebenkosten-Assistentin',
|
|
email: 'ida@property-on.ch',
|
|
level: AgentLevel.RESIDENTIAL,
|
|
department: AgentDepartment.RESIDENTIAL,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'jana',
|
|
name: 'Jana',
|
|
role: 'Wechsel-Koordinatorin Wohnen',
|
|
email: 'jana@property-on.ch',
|
|
level: AgentLevel.RESIDENTIAL,
|
|
department: AgentDepartment.RESIDENTIAL,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: false,
|
|
},
|
|
{
|
|
id: 'zeno',
|
|
name: 'Zeno',
|
|
role: 'Referenzzins-Spezialist',
|
|
email: 'zeno@property-on.ch',
|
|
level: AgentLevel.RESIDENTIAL,
|
|
department: AgentDepartment.RESIDENTIAL,
|
|
rollout: AgentRollout.IN_PROGRESS,
|
|
isCore: false,
|
|
},
|
|
]
|
|
|
|
/** Nur die fünf Kernteammitglieder — sie besitzen ein vollständiges Dossier. */
|
|
export const coreAgentIds: string[] = agentDirectory.filter(a => a.isCore).map(a => a.id)
|