feat(agenten): Runde 4 — «Meine Agenten» mit fünf digitalen Mitarbeitenden
Setzt das Umsetzungsbriefing Runde 4 im bestehenden Frontend um. Informationsarchitektur - «Teamübersicht» heisst «Meine Agenten»; ihr bisheriger Inhalt (Kreisgrafik, Auswertung, Verbindungszusammenfassung) ist entfallen. - Personalverwaltung, Bearbeitungsverlauf und Kanäle & Systeme sind jetzt Reiter derselben Seite (?section=), gestaltet wie die Auswahl im Bearbeitungsverlauf. Es wird nur der gewählte Bereich gerendert. - Die alten Unterseitenpfade leiten um, damit Lesezeichen nicht brechen. Agentenbestand - Reto und Lea vollständig entfernt — aus Navigation, Dossiers, Protokoll, Verbindungen, Vorgängen und Porträtbestand. - Retos Aufgaben liegen bei Bruno: Nachbereitung, WhatsApp-Anruf, Protokoll und Kundennotiz, Ablage im CRM. - Livia ist «Exposé Master»: Lageberichte, Inserate, Angebotsbroschüren. - Sidebar führt Ferdi, Bruno, Livia, Nora, Sina mit Porträt und Funktion. Agentenseiten - Ein gemeinsamer AgentWorkspaceHero auf allen fünf Seiten. - Ferdi: Auswertungskarten, Priorität und Typfarben entfallen; Fälligkeit nur bei fünf Tagen oder weniger rot; Objektlinks nach «Meine Objekte»; neu die Terminplanung im verbundenen Kalender mit typgerechtem PDF-Ausschnitt. - Sina: reduzierte, filter- und sortierbare Objektübersicht; Detailansicht direkt editierbar, leere Pflichtfelder rot umrandet. - Nora: Signale ohne Prozentsätze und Konfidenzstufen, nur belegbare Angaben; Mehrfachauswahl leitet Objekte an Livia weiter. - Livia: aktive und archivierte Leads, Arbeitsbereich gleitet an den oberen Rand; dreistufiger Exposé-Prozess Hochladen → Exposé → Export. - Bruno: neue Seite mit Auftragsliste und Vor-/Nachbereitungs-Drawer; Glocke warnt bei Besichtigung unter 24 Stunden ohne Bericht. Datenschicht - Neu: Kalender, Exposé-Leads, Exposé-Entwürfe, Besichtigungsaufträge — je Domain, Provider, Service und Hook. - IAIService um generateExposeText erweitert; der Entwurf nutzt ausschliesslich erfasste Objektdaten und meldet Lücken, statt sie zu füllen. - Alle Objektverweise zeigen auf reale Einträge aus «Meine Objekte»; neue Detailroute /supply/properties/:propertyId. Offen: Chat, Kalender, CRM und DMS sind Frontend-Simulation ohne Anbindung. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
* Verbindungsassistent eine echte Aufgabe hat; die Telefonie ist als
|
||||
* `ROADMAP` ausgewiesen.
|
||||
*
|
||||
* `usedByAgentIds` ist aus den Kanälen und Systemen der sieben Personalblätter
|
||||
* `usedByAgentIds` ist aus den Kanälen und Systemen der fünf Personalblätter
|
||||
* abgeleitet und nicht frei gesetzt: E-Mail nutzen alle, den Kalender die vier
|
||||
* Mitarbeiter mit Terminbezug, die Dokumentenablage alle mit Aktenbezug.
|
||||
* Reihenfolge alphabetisch nach Vorname, wie in `mockTeamAgents`.
|
||||
@@ -32,15 +32,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Die geteilten Postfächer von Bewirtschaftung und Vermarktung: Fristenmeldungen, Anfragen von Interessenten, Rückfragen, Absagen und Terminvorschläge laufen über diese vier Adressen. Eingehende Post wird gelesen und dem richtigen Objekt zugeordnet; ausgehende Post folgt der Regel des jeweiligen Mitarbeiters — Erinnerungen gehen selbständig hinaus, Eskalationen erst nach Freigabe.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
accountCount: 4,
|
||||
usedByAgentIds: [
|
||||
AGENT_IDS.BRUNO,
|
||||
AGENT_IDS.FERDI,
|
||||
AGENT_IDS.LEA,
|
||||
AGENT_IDS.LIVIA,
|
||||
AGENT_IDS.NORA,
|
||||
AGENT_IDS.RETO,
|
||||
AGENT_IDS.SINA,
|
||||
],
|
||||
usedByAgentIds: [AGENT_IDS.BRUNO, AGENT_IDS.FERDI, AGENT_IDS.LIVIA, AGENT_IDS.NORA, AGENT_IDS.SINA],
|
||||
lastSyncAt: '2026-05-20T08:42:00.000Z',
|
||||
connectionLabel: 'Postfächer Zürich, Winterthur, Basel',
|
||||
permissions: [
|
||||
@@ -86,7 +78,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Der kurze Draht zu den Personen unterwegs: Meldung aufs Diensthandy, wenn eine Frist in weniger als 30 Tagen abläuft und am Arbeitsplatz niemand erreichbar ist, sowie Eingang der Sprachmemos direkt nach einem Aussentermin — etwa nach der Begehung an der Bahnhofstrasse 44 in Zürich (OBJ-2451).',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
accountCount: 2,
|
||||
usedByAgentIds: [AGENT_IDS.FERDI, AGENT_IDS.RETO],
|
||||
usedByAgentIds: [AGENT_IDS.FERDI, AGENT_IDS.BRUNO],
|
||||
lastSyncAt: '2026-05-19T17:35:00.000Z',
|
||||
connectionLabel: 'Diensthandys Bewirtschaftung und Vermarktung',
|
||||
permissions: [
|
||||
@@ -164,7 +156,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Fristenkalender der Bewirtschaftung, Besichtigungskalender der Vermarktung und der Terminkalender für Aussentermine. Gelesen werden freie Zeitfenster und bestehende Termine; geschrieben werden bestätigte Fristen mit ihren Vorlaufmarken, vorläufige Reservationen für Terminvorschläge und die bestätigte Besichtigung samt Erinnerung. Fremde Termine werden nie verschoben.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
accountCount: 3,
|
||||
usedByAgentIds: [AGENT_IDS.BRUNO, AGENT_IDS.FERDI, AGENT_IDS.LEA, AGENT_IDS.RETO],
|
||||
usedByAgentIds: [AGENT_IDS.BRUNO, AGENT_IDS.FERDI],
|
||||
lastSyncAt: '2026-05-20T08:15:00.000Z',
|
||||
connectionLabel: 'Fristen-, Besichtigungs- und Terminkalender',
|
||||
permissions: [
|
||||
@@ -210,13 +202,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Mietverträge, Nachträge, Zusatzvereinbarungen, Übergabeprotokolle, Hausordnungen und Objektunterlagen — aus der zentralen Ablage, den Standortbibliotheken von Zürich, Winterthur und St. Gallen sowie den historischen Vertragsordnern der übernommenen Mandate. Jede Aussage aus einem Dokument wird mit Dateiname, Seite und Zitat belegt.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
accountCount: 4,
|
||||
usedByAgentIds: [
|
||||
AGENT_IDS.BRUNO,
|
||||
AGENT_IDS.FERDI,
|
||||
AGENT_IDS.LIVIA,
|
||||
AGENT_IDS.RETO,
|
||||
AGENT_IDS.SINA,
|
||||
],
|
||||
usedByAgentIds: [AGENT_IDS.BRUNO, AGENT_IDS.FERDI, AGENT_IDS.LIVIA, AGENT_IDS.SINA],
|
||||
lastSyncAt: '2026-05-20T05:30:00.000Z',
|
||||
connectionLabel: 'Ablage Bewirtschaftung und Standortbibliotheken',
|
||||
permissions: [
|
||||
@@ -262,7 +248,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Geplante Anbindung der Telefonanlage: Anrufe von Interessenten am Empfang in Zürich und Winterthur sowie die Diktatlinie für Sprachmemos nach einem Aussentermin. Bis zur Freigabe erfasst der Empfang die Telefonnotizen von Hand, und die Sprachmemos kommen über das Diensthandy herein.',
|
||||
status: AgentConnectionStatus.ROADMAP,
|
||||
accountCount: 0,
|
||||
usedByAgentIds: [AGENT_IDS.LEA, AGENT_IDS.RETO],
|
||||
usedByAgentIds: [AGENT_IDS.BRUNO],
|
||||
permissions: [
|
||||
{
|
||||
id: 'conn-phone-voice-perm-01',
|
||||
@@ -300,13 +286,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Objekt- und Mieterstammdaten, Vertragslaufzeiten, Verfügbarkeiten, Must-Kriterien der ausgeschriebenen Flächen und die Terminexporte. Der Zugang ist noch nicht eingerichtet: bis dahin stützen sich Fristen, Vertragsauskünfte und Anfragenprüfung auf die Excel-Terminlisten und die Unterlagen der Standortteams. Der Verbindungsassistent richtet den Lesezugang ein.',
|
||||
status: AgentConnectionStatus.DISCONNECTED,
|
||||
accountCount: 0,
|
||||
usedByAgentIds: [
|
||||
AGENT_IDS.FERDI,
|
||||
AGENT_IDS.LEA,
|
||||
AGENT_IDS.LIVIA,
|
||||
AGENT_IDS.RETO,
|
||||
AGENT_IDS.SINA,
|
||||
],
|
||||
usedByAgentIds: [AGENT_IDS.FERDI, AGENT_IDS.LIVIA, AGENT_IDS.BRUNO, AGENT_IDS.SINA],
|
||||
vendor: AgentErpVendor.IMMOTOP2,
|
||||
permissions: [
|
||||
{
|
||||
@@ -351,7 +331,7 @@ export const mockAgentConnections: AgentConnection[] = [
|
||||
'Führt Interessenten, Bedarfsprofile, Anfrageverlauf und Terminstatus je Fläche und erkennt, wenn dieselbe Firma bereits über Portal, Formular und Telefon angefragt hat. Hier landen auch die freigegebenen Leads der Marktbeobachtung — zuletzt die Expansion der Vollenweider Gastro AG Richtung Winterthur.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
accountCount: 1,
|
||||
usedByAgentIds: [AGENT_IDS.LEA, AGENT_IDS.NORA, AGENT_IDS.RETO],
|
||||
usedByAgentIds: [AGENT_IDS.NORA, AGENT_IDS.BRUNO],
|
||||
lastSyncAt: '2026-05-19T19:05:00.000Z',
|
||||
connectionLabel: 'Vermarktung Zürich',
|
||||
permissions: [
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* 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 sieben Kernteammitglieder in `src/mock-data/agents/`.
|
||||
* 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
|
||||
@@ -19,16 +19,6 @@ import type { AgentDirectoryEntry } from '../domain/agentDirectory'
|
||||
import { AgentLevel, AgentDepartment, AgentRollout } from '../domain/agentDirectory'
|
||||
|
||||
export const agentDirectory: AgentDirectoryEntry[] = [
|
||||
{
|
||||
id: 'bruno',
|
||||
name: 'Bruno',
|
||||
role: 'Besichtigungs-Briefing',
|
||||
email: 'bruno@property-on.ch',
|
||||
level: AgentLevel.CORE,
|
||||
department: AgentDepartment.CENTRAL_SERVICES,
|
||||
rollout: AgentRollout.IN_PROGRESS,
|
||||
isCore: true,
|
||||
},
|
||||
{
|
||||
id: 'ferdi',
|
||||
name: 'Ferdi',
|
||||
@@ -40,19 +30,19 @@ export const agentDirectory: AgentDirectoryEntry[] = [
|
||||
isCore: true,
|
||||
},
|
||||
{
|
||||
id: 'lea',
|
||||
name: 'Lea',
|
||||
role: 'Anfragen-Manager',
|
||||
email: 'lea@property-on.ch',
|
||||
id: 'bruno',
|
||||
name: 'Bruno',
|
||||
role: 'Besichtigungsassistent',
|
||||
email: 'bruno@property-on.ch',
|
||||
level: AgentLevel.CORE,
|
||||
department: AgentDepartment.CENTRAL_SERVICES,
|
||||
rollout: AgentRollout.PROTOTYPE,
|
||||
rollout: AgentRollout.IN_PROGRESS,
|
||||
isCore: true,
|
||||
},
|
||||
{
|
||||
id: 'livia',
|
||||
name: 'Livia',
|
||||
role: 'Lage-Analyst',
|
||||
role: 'Exposé Master',
|
||||
email: 'livia@property-on.ch',
|
||||
level: AgentLevel.CORE,
|
||||
department: AgentDepartment.CENTRAL_SERVICES,
|
||||
@@ -62,27 +52,17 @@ export const agentDirectory: AgentDirectoryEntry[] = [
|
||||
{
|
||||
id: 'nora',
|
||||
name: 'Nora',
|
||||
role: 'Markt-Scout',
|
||||
role: 'Marktchancen / Leads',
|
||||
email: 'nora@property-on.ch',
|
||||
level: AgentLevel.CORE,
|
||||
department: AgentDepartment.CENTRAL_SERVICES,
|
||||
rollout: AgentRollout.PROTOTYPE,
|
||||
isCore: true,
|
||||
},
|
||||
{
|
||||
id: 'reto',
|
||||
name: 'Reto',
|
||||
role: 'Recap-Agent',
|
||||
email: 'reto@property-on.ch',
|
||||
level: AgentLevel.CORE,
|
||||
department: AgentDepartment.CENTRAL_SERVICES,
|
||||
rollout: AgentRollout.IN_PROGRESS,
|
||||
isCore: true,
|
||||
},
|
||||
{
|
||||
id: 'sina',
|
||||
name: 'Sina',
|
||||
role: 'Vertragsauskunft',
|
||||
role: 'Datenpflege',
|
||||
email: 'sina@property-on.ch',
|
||||
level: AgentLevel.CORE,
|
||||
department: AgentDepartment.CENTRAL_SERVICES,
|
||||
@@ -381,5 +361,5 @@ export const agentDirectory: AgentDirectoryEntry[] = [
|
||||
},
|
||||
]
|
||||
|
||||
/** Nur die sieben Kernteammitglieder — sie besitzen ein vollständiges Dossier. */
|
||||
/** Nur die fünf Kernteammitglieder — sie besitzen ein vollständiges Dossier. */
|
||||
export const coreAgentIds: string[] = agentDirectory.filter(a => a.isCore).map(a => a.id)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Property On — Protokoll der sieben digitalen Mitarbeiter.
|
||||
* Property On — Protokoll der fünf digitalen Mitarbeiter.
|
||||
*
|
||||
* Jeder Eintrag hält fest, was ein Agent getan hat, wer es ausgelöst hat und mit
|
||||
* welchem Ergebnis. Die Liste ist absteigend nach Zeitstempel sortiert; die
|
||||
@@ -29,7 +29,7 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
// ── Heute, 20.05.2026 ───────────────────────────────────────────────────────
|
||||
{
|
||||
id: 'proto-001',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
timestamp: '2026-05-20T16:42:00.000Z',
|
||||
eventType: AgentProtocolEventType.TASK_RUN,
|
||||
title: 'Sprachmemo zur Besichtigung Technoparkstrasse 9 verarbeitet',
|
||||
@@ -111,7 +111,7 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
},
|
||||
{
|
||||
id: 'proto-002',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
timestamp: '2026-05-20T16:05:00.000Z',
|
||||
eventType: AgentProtocolEventType.APPROVAL,
|
||||
title: 'Recap-Paket zur Besichtigung Industriestrasse 14 freigegeben',
|
||||
@@ -124,76 +124,6 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
triggeredByName: OPERATOR,
|
||||
approvalDecision: AgentApprovalDecision.APPROVED,
|
||||
},
|
||||
{
|
||||
id: 'proto-003',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-05-20T15:20:00.000Z',
|
||||
eventType: AgentProtocolEventType.MESSAGE_PROCESSED,
|
||||
title: 'Portal-Anfrage zur Hardturmstrasse 118 qualifiziert',
|
||||
description:
|
||||
'Lead-Mail einer Plattform erfasst, in ein einheitliches Bedarfsprofil überführt und gegen die Must-Kriterien der Fläche geprüft. Alle fünf Kriterien sind erfüllt; das Kurzprofil liegt zur Entscheidung bereit.',
|
||||
status: AgentProtocolStatus.SUCCESS,
|
||||
objectId: 'OBJ-2512',
|
||||
channel: AgentChannelType.PORTAL_LEAD_MAIL,
|
||||
triggeredBy: AgentTriggerSource.SYSTEM,
|
||||
input: [
|
||||
{ label: 'Herkunftskanal', value: 'Portal-Lead-Mail, Eingang 20.05.2026, 15:12' },
|
||||
{ label: 'Interessent', value: 'Limmat Robotics AG, Zürich — R. Amrein, Geschäftsleitung' },
|
||||
{
|
||||
label: 'Anfragetext',
|
||||
value:
|
||||
'«Wir suchen per Herbst 2026 rund 500 m² Bürofläche in Zürich West, gerne mit Werkstattanteil im Erdgeschoss.»',
|
||||
},
|
||||
{ label: 'Objektbezug', value: 'OBJ-2512, Hardturmstrasse 118, Zürich Kreis 5' },
|
||||
],
|
||||
processingSteps: [
|
||||
{
|
||||
id: 'proto-003-ps-1',
|
||||
label: 'Lead-Mail erfasst und der ausgeschriebenen Fläche zugeordnet',
|
||||
},
|
||||
{
|
||||
id: 'proto-003-ps-2',
|
||||
label: 'Freitext in ein Bedarfsprofil überführt',
|
||||
detail: 'Fläche, Nutzungsart, Wunschtermin, Budgetrahmen und Vertragsdauer übernommen',
|
||||
},
|
||||
{
|
||||
id: 'proto-003-ps-3',
|
||||
label: 'Abgleich über die letzten 90 Tage auf Mehrfachanfragen',
|
||||
detail: 'Keine Übereinstimmung über Portal, Formular oder Telefon gefunden',
|
||||
},
|
||||
{ id: 'proto-003-ps-4', label: 'Bedarfsprofil gegen die Must-Kriterien der Fläche geprüft' },
|
||||
{ id: 'proto-003-ps-5', label: 'Kurzprofil zur Entscheidung vorgelegt' },
|
||||
],
|
||||
output: [
|
||||
{ label: 'Bedarfsprofil', value: '480–560 m², Büro mit Werkstattanteil, Bezug ab 01.10.2026' },
|
||||
{
|
||||
label: 'Kriterienprüfung',
|
||||
value: [
|
||||
'Flächenbedarf im ausgeschriebenen Rahmen — erfüllt',
|
||||
'Nutzungsart für das Objekt zulässig — erfüllt',
|
||||
'Wunschtermin passt zur Verfügbarkeit — erfüllt',
|
||||
'Budgetrahmen erreicht die Mietpreisvorstellung — erfüllt',
|
||||
'Bonitätsnachweis kann beigebracht werden — erfüllt',
|
||||
],
|
||||
},
|
||||
{ label: 'Nächster Schritt', value: 'Freigabe für Terminvorschläge einholen' },
|
||||
],
|
||||
sourceReferences: [
|
||||
{
|
||||
id: 'proto-003-src-1',
|
||||
label: 'Must-Kriterien der Fläche',
|
||||
documentName: 'Vermarktungsauftrag Hardturmstrasse 118.pdf',
|
||||
locator: 'Seite 2, Abschnitt «Zielmieterschaft»',
|
||||
quote: '«Mindestvertragsdauer fünf Jahre, Nutzung Büro und stiller Werkstattbetrieb zulässig»',
|
||||
},
|
||||
{
|
||||
id: 'proto-003-src-2',
|
||||
label: 'Flächenstammdaten OBJ-2512',
|
||||
documentName: 'Bewirtschaftungssystem — Objektblatt OBJ-2512',
|
||||
locator: 'Verfügbarkeit ab 01.09.2026',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'proto-004',
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
@@ -517,21 +447,6 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'proto-010',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-05-20T08:20:00.000Z',
|
||||
eventType: AgentProtocolEventType.REJECTION,
|
||||
title: 'Absageentwurf an die Säntis Retail AG zurückgewiesen',
|
||||
description:
|
||||
'Der vorbereitete Absagetext wurde nicht freigegeben: Der Flächenbedarf liegt nur knapp unter dem ausgeschriebenen Rahmen, der Fall gilt damit als Grenzfall. Die Anfrage ist zurück in die Entscheidung gelegt worden.',
|
||||
status: AgentProtocolStatus.SUCCESS,
|
||||
objectId: 'OBJ-2568',
|
||||
channel: AgentChannelType.EMAIL,
|
||||
triggeredBy: AgentTriggerSource.USER,
|
||||
triggeredByName: OPERATOR,
|
||||
approvalDecision: AgentApprovalDecision.REJECTED,
|
||||
},
|
||||
{
|
||||
id: 'proto-011',
|
||||
agentId: AGENT_IDS.FERDI,
|
||||
@@ -601,21 +516,6 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
},
|
||||
|
||||
// ── Laufende Woche, 18.–19.05.2026 ──────────────────────────────────────────
|
||||
{
|
||||
id: 'proto-012',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-05-19T17:05:00.000Z',
|
||||
eventType: AgentProtocolEventType.APPROVAL,
|
||||
title: 'Terminvorschläge für die Limmat Robotics AG freigegeben',
|
||||
description:
|
||||
'Nach der Freigabe sind drei Zeitfenster im Besichtigungskalender vorläufig reserviert und dem Interessenten zugestellt worden. Termindauer 45 Minuten, Pufferzeit 15 Minuten vor und nach dem Termin.',
|
||||
status: AgentProtocolStatus.SUCCESS,
|
||||
objectId: 'OBJ-2512',
|
||||
channel: AgentChannelType.CALENDAR,
|
||||
triggeredBy: AgentTriggerSource.USER,
|
||||
triggeredByName: OPERATOR,
|
||||
approvalDecision: AgentApprovalDecision.APPROVED,
|
||||
},
|
||||
{
|
||||
id: 'proto-013',
|
||||
agentId: AGENT_IDS.NORA,
|
||||
@@ -632,7 +532,7 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
},
|
||||
{
|
||||
id: 'proto-014',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
timestamp: '2026-05-19T14:12:00.000Z',
|
||||
eventType: AgentProtocolEventType.TASK_RUN,
|
||||
title: 'Kein Systemzugang zum Kontaktjournal — Mail-Fallback gegriffen',
|
||||
@@ -676,7 +576,7 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
{
|
||||
id: 'proto-014-src-1',
|
||||
label: 'Fallback-Einstellung',
|
||||
documentName: 'Einstellungen Reto — Fallback-Ziel',
|
||||
documentName: 'Einstellungen Bruno — Fallback-Ziel',
|
||||
locator: 'Wert «Strukturierter Mail-Fallback an die zuständige Person»',
|
||||
},
|
||||
{
|
||||
@@ -813,33 +713,8 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
channel: AgentChannelType.WORKSPACE_CHAT,
|
||||
triggeredBy: AgentTriggerSource.SYSTEM,
|
||||
},
|
||||
{
|
||||
id: 'proto-021',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-05-18T06:40:00.000Z',
|
||||
eventType: AgentProtocolEventType.MESSAGE_PROCESSED,
|
||||
title: 'Telefonnotiz aus dem Empfang Winterthur nur teilweise auswertbar',
|
||||
description:
|
||||
'Aus der Notiz liessen sich Name und Firma übernehmen, Flächenbedarf und Wunschtermin fehlen. Ein Rückfrageentwurf mit den fehlenden Mindestangaben liegt zur Freigabe bereit; die Anfrage bleibt bis dahin offen.',
|
||||
status: AgentProtocolStatus.WARNING,
|
||||
objectId: 'OBJ-2568',
|
||||
channel: AgentChannelType.PHONE_NOTE,
|
||||
triggeredBy: AgentTriggerSource.SYSTEM,
|
||||
},
|
||||
|
||||
// ── Laufender Monat, 01.–15.05.2026 ─────────────────────────────────────────
|
||||
{
|
||||
id: 'proto-022',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-05-15T15:45:00.000Z',
|
||||
eventType: AgentProtocolEventType.SETTINGS_SAVED,
|
||||
title: 'Must-Kriterien und Termindauer gespeichert',
|
||||
description:
|
||||
'Das Kriterium «Vertragsdauer mindestens fünf Jahre» wurde ergänzt und die Termindauer von 60 auf 45 Minuten gesetzt. Die Änderung gilt ab dem nächsten Anfrageeingang.',
|
||||
status: AgentProtocolStatus.SUCCESS,
|
||||
triggeredBy: AgentTriggerSource.USER,
|
||||
triggeredByName: OPERATOR,
|
||||
},
|
||||
{
|
||||
id: 'proto-023',
|
||||
agentId: AGENT_IDS.SINA,
|
||||
@@ -947,7 +822,7 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
},
|
||||
{
|
||||
id: 'proto-027',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
timestamp: '2026-05-08T16:30:00.000Z',
|
||||
eventType: AgentProtocolEventType.REMINDER_SENT,
|
||||
title: 'Erinnerung an fehlendes Diktat nach der Besichtigung Industriestrasse 14',
|
||||
@@ -971,19 +846,6 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
channel: AgentChannelType.WORKSPACE_CHAT,
|
||||
triggeredBy: AgentTriggerSource.SYSTEM,
|
||||
},
|
||||
{
|
||||
id: 'proto-029',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-05-06T13:40:00.000Z',
|
||||
eventType: AgentProtocolEventType.REMINDER_SENT,
|
||||
title: 'Terminreminder 24 Stunden vor der Besichtigung versandt',
|
||||
description:
|
||||
'Interessent und Ansprechperson wurden an die Besichtigung vom 07.05.2026, 09:30 Uhr erinnert — mit Treffpunkt, Dauer und Ansprechperson vor Ort. Beide haben den Termin bestätigt.',
|
||||
status: AgentProtocolStatus.SUCCESS,
|
||||
objectId: 'OBJ-2512',
|
||||
channel: AgentChannelType.EMAIL,
|
||||
triggeredBy: AgentTriggerSource.SYSTEM,
|
||||
},
|
||||
{
|
||||
id: 'proto-030',
|
||||
agentId: AGENT_IDS.NORA,
|
||||
@@ -1067,7 +929,7 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
},
|
||||
{
|
||||
id: 'proto-033',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
timestamp: '2026-04-08T09:45:00.000Z',
|
||||
eventType: AgentProtocolEventType.EDIT,
|
||||
title: 'Besichtigungsprotokoll vor der Freigabe angepasst',
|
||||
@@ -1119,64 +981,6 @@ export const mockAgentProtocol: AgentProtocolEntry[] = [
|
||||
triggeredBy: AgentTriggerSource.USER,
|
||||
triggeredByName: OPERATOR,
|
||||
},
|
||||
{
|
||||
id: 'proto-037',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
timestamp: '2026-02-19T16:35:00.000Z',
|
||||
eventType: AgentProtocolEventType.MESSAGE_PROCESSED,
|
||||
title: 'Anfragen-Postfach nicht erreichbar — 14 Anfragen unbearbeitet',
|
||||
description:
|
||||
'Das Anfragen-Postfach der Vermarktung liess sich über zwei Stunden nicht öffnen. 14 eingegangene Anfragen wurden weder erfasst noch beantwortet; die durchschnittliche Erstreaktionszeit stieg an diesem Tag auf 3 Stunden 40 Minuten.',
|
||||
status: AgentProtocolStatus.ERROR,
|
||||
channel: AgentChannelType.EMAIL,
|
||||
triggeredBy: AgentTriggerSource.SYSTEM,
|
||||
input: [
|
||||
{ label: 'Betroffenes Postfach', value: 'Anfragen-Postfach Vermarktung' },
|
||||
{ label: 'Ausfallzeitraum', value: '19.02.2026, 14:20 bis 16:30' },
|
||||
{
|
||||
label: 'Betroffene Kanäle',
|
||||
value: ['Direktmails von Interessenten', 'Website-Formular «Fläche anfragen»'],
|
||||
},
|
||||
],
|
||||
processingSteps: [
|
||||
{ id: 'proto-037-ps-1', label: 'Abruf des Postfachs planmässig gestartet' },
|
||||
{
|
||||
id: 'proto-037-ps-2',
|
||||
label: 'Postfach nicht erreichbar',
|
||||
detail: 'Acht Versuche im Abstand von fünfzehn Minuten, alle ohne Verbindung',
|
||||
},
|
||||
{
|
||||
id: 'proto-037-ps-3',
|
||||
label: 'Automatische Absagen für den Zeitraum ausgesetzt',
|
||||
detail: 'Ohne vollständiges Bedarfsprofil wird nie abgesagt',
|
||||
},
|
||||
{ id: 'proto-037-ps-4', label: 'Störung an die Vermarktung gemeldet' },
|
||||
{ id: 'proto-037-ps-5', label: 'Nachlauf nach Wiederherstellung eingeplant' },
|
||||
],
|
||||
output: [
|
||||
{ label: 'Nicht erfasste Anfragen', value: '14, davon 9 über das Website-Formular' },
|
||||
{ label: 'Erstreaktionszeit an diesem Tag', value: '3 Std. 40 Min. statt 11 Minuten' },
|
||||
{
|
||||
label: 'Behebung',
|
||||
value:
|
||||
'Nach Wiederherstellung um 16:30 wurden alle 14 Anfragen nacherfasst, dedupliziert und bis 18:10 qualifiziert.',
|
||||
},
|
||||
],
|
||||
sourceReferences: [
|
||||
{
|
||||
id: 'proto-037-src-1',
|
||||
label: 'Protokoll der Abrufversuche',
|
||||
documentName: 'Systemprotokoll Lea — Postfachabrufe 19.02.2026',
|
||||
locator: 'Einträge 14:20 bis 16:20',
|
||||
},
|
||||
{
|
||||
id: 'proto-037-src-2',
|
||||
label: 'Störungsmeldung an die Vermarktung',
|
||||
documentName: 'Team-Kanal Vermarktung Zürich',
|
||||
locator: 'Meldung vom 19.02.2026, 14:52',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'proto-038',
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
|
||||
+41
-461
@@ -10,9 +10,9 @@
|
||||
* heute, diese Woche, diesen Monat und dieses Jahr verteilt, damit jeder Filter
|
||||
* der Auswertung Daten findet:
|
||||
*
|
||||
* heute (20.05.) ferdi-01, ferdi-02, sina-01, lea-02, bruno-02
|
||||
* diese Woche (18.–19.) lea-01, reto-02, sina-02
|
||||
* dieser Monat (01.–17.) reto-01, livia-02, nora-02
|
||||
* heute (20.05.) ferdi-01, ferdi-02, sina-01, bruno-02
|
||||
* diese Woche (18.–19.) bruno-r02, sina-02
|
||||
* dieser Monat (01.–17.) bruno-r01, livia-02, nora-02
|
||||
* dieses Jahr (Jan–Apr) bruno-01, nora-01, livia-01
|
||||
*
|
||||
* Sämtliche Objekte, Firmen und Personen sind erfunden. Es werden keine echten
|
||||
@@ -627,426 +627,6 @@ Sina — Vertragsauskunft`,
|
||||
],
|
||||
},
|
||||
|
||||
// ── Lea — erledigt ─────────────────────────────────────────────────────────
|
||||
{
|
||||
id: 'awi-lea-01',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
kind: AgentWorkItemKind.MESSAGE_TRIAGE,
|
||||
area: AgentDomainArea.INQUIRIES,
|
||||
title: 'Nachrichteneingang sortiert — 14 Anfragen zugeordnet, ein Duplikat zusammengeführt',
|
||||
summary:
|
||||
'Die Vormittagssichtung hat 14 eingegangene Nachrichten den ausgeschriebenen Flächen zugeordnet. Eine Portal-Lead-Mail und eine Telefonnotiz betrafen dieselbe Person und wurden zu einem Vorgang zusammengeführt.',
|
||||
objectId: 'OBJ-2365',
|
||||
objectLabel: 'Hardturmstrasse 118, 8005 Zürich — Bürofläche 640 m², bezugsbereit ab 01.10.2026',
|
||||
sourceChannel: AgentChannelType.PORTAL_LEAD_MAIL,
|
||||
targetChannel: AgentChannelType.EMAIL,
|
||||
createdAt: '2026-05-19T10:41:00.000Z',
|
||||
completedAt: '2026-05-19T10:52:00.000Z',
|
||||
priority: AgentWorkItemPriority.MEDIUM,
|
||||
status: AgentWorkItemStatus.COMPLETED,
|
||||
requiresDecision: false,
|
||||
inputs: [
|
||||
{
|
||||
label: 'Eingegangene Nachrichten',
|
||||
value: [
|
||||
'9 Portal-Lead-Mails der Immobilienplattformen',
|
||||
'3 Direktmails an anfragen@property-on.ch',
|
||||
'1 Website-Formular «Fläche anfragen»',
|
||||
'1 Telefonnotiz des Empfangs Zürich',
|
||||
],
|
||||
},
|
||||
{ label: 'Abgleichzeitraum für Duplikate', value: 'Anfragen der letzten 90 Tage, Stand 19.05.2026' },
|
||||
{ label: 'Betroffene Flächen', value: '6 ausgeschriebene Flächen in Zürich, Winterthur und Zug' },
|
||||
],
|
||||
result: [
|
||||
{ label: 'Zugeordnete Anfragen', value: '14 von 14 — keine Nachricht blieb ohne Flächenbezug' },
|
||||
{
|
||||
label: 'Zusammengeführtes Duplikat',
|
||||
value:
|
||||
'Marcel Sennhauser, Limmatgrund Treuhand AG — Portal-Lead-Mail vom 19.05.2026, 09:14 Uhr und Telefonnotiz vom 19.05.2026, 10:02 Uhr betreffen dieselbe Fläche OBJ-2365.',
|
||||
},
|
||||
{ label: 'Unvollständige Anfragen', value: '2 — Rückfrageentwürfe für die Sammelvorlage 08:30 Uhr erstellt' },
|
||||
{ label: 'Eingangsbestätigungen versandt', value: '13 (das Duplikat wurde nur einmal bestätigt)' },
|
||||
{ label: 'Durchschnittliche Erstreaktionszeit', value: '9 Minuten' },
|
||||
],
|
||||
processingSteps: [
|
||||
{
|
||||
id: 'awi-lea-01-step-1',
|
||||
label: 'Nachrichten aus allen Kanälen eingesammelt',
|
||||
detail: 'Portal-Postfach, Anfragen-Postfach, Website-Formular und Telefonnotizen abgeholt.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-step-2',
|
||||
label: 'Jede Nachricht einer ausgeschriebenen Fläche zugeordnet',
|
||||
detail: 'Zuordnung über Objektnummer, Adresse oder Inseratsbezug in der Nachricht.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-step-3',
|
||||
label: 'Doppelte Anfragen erkannt',
|
||||
detail: 'Abgleich von Name, Firma, Telefonnummer und E-Mail über die letzten 90 Tage.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-step-4',
|
||||
label: 'Duplikat zu einem Vorgang zusammengeführt',
|
||||
detail: 'Telefonnotiz als zweiter Kontaktpunkt am bestehenden Vorgang vermerkt.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-step-5',
|
||||
label: 'Eingangsbestätigungen versandt und protokolliert',
|
||||
detail: 'Je Interessent eine Bestätigung, Verlauf im Anfrage-Log abgelegt.',
|
||||
},
|
||||
],
|
||||
sourceReferences: [
|
||||
{
|
||||
id: 'awi-lea-01-src-1',
|
||||
label: 'Anfrage-Log Fläche OBJ-2365',
|
||||
documentName: 'Anfrage-Log_OBJ-2365_2026.csv',
|
||||
locator: 'Zeilen 41–48',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-src-2',
|
||||
label: 'Telefonnotiz Empfang Zürich',
|
||||
documentName: 'Telefonnotiz_2026-05-19_Empfang-Zuerich.txt',
|
||||
locator: 'Eintrag 10:02 Uhr',
|
||||
},
|
||||
],
|
||||
messageThread: [
|
||||
{
|
||||
id: 'awi-lea-01-msg-1',
|
||||
at: '2026-05-19T09:14:00.000Z',
|
||||
from: 'lead-service@plattform-immobilien.ch',
|
||||
to: 'portal-leads@property-on.ch',
|
||||
channel: AgentChannelType.PORTAL_LEAD_MAIL,
|
||||
subject: 'Neue Anfrage zu Ihrem Inserat «Bürofläche 640 m², Zürich West»',
|
||||
body: `Guten Tag
|
||||
|
||||
Zu Ihrem Inserat ist eine neue Anfrage eingegangen.
|
||||
|
||||
Inserat: Bürofläche 640 m², Hardturmstrasse 118, 8005 Zürich
|
||||
Name: Marcel Sennhauser
|
||||
Firma: Limmatgrund Treuhand AG, Zürich
|
||||
Telefon: +41 44 288 51 20
|
||||
E-Mail: m.sennhauser@limmatgrund-treuhand.ch
|
||||
|
||||
Nachricht: «Wir suchen per Herbst 2026 rund 600 m² Bürofläche in Zürich West
|
||||
für 42 Mitarbeitende. Ist eine Besichtigung möglich? Sechs Parkplätze wären
|
||||
wichtig.»
|
||||
|
||||
Freundliche Grüsse
|
||||
Plattform Immobilien — Lead-Service`,
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-msg-2',
|
||||
at: '2026-05-19T10:02:00.000Z',
|
||||
from: 'Empfang Zürich',
|
||||
to: 'telefonnotiz@property-on.ch',
|
||||
channel: AgentChannelType.PHONE_NOTE,
|
||||
subject: 'Telefonnotiz — Herr Sennhauser, Limmatgrund Treuhand',
|
||||
body: `Anruf 10:02 Uhr. Herr Sennhauser von der Limmatgrund Treuhand AG hat sich nach der Bürofläche an der Hardturmstrasse erkundigt. Er habe bereits über das Portal angefragt und wolle sichergehen, dass die Anfrage angekommen sei. Rückruf erbeten auf +41 44 288 51 20.`,
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-msg-3',
|
||||
at: '2026-05-19T10:52:00.000Z',
|
||||
from: 'lea@property-on.ch',
|
||||
to: 'm.sennhauser@limmatgrund-treuhand.ch',
|
||||
channel: AgentChannelType.EMAIL,
|
||||
subject: 'Ihre Anfrage zur Bürofläche Hardturmstrasse 118, Zürich — Eingang bestätigt',
|
||||
body: `Guten Tag Herr Sennhauser
|
||||
|
||||
Besten Dank für Ihre Anfrage zur Bürofläche an der Hardturmstrasse 118 in Zürich sowie für Ihren Anruf von heute Vormittag. Beide Kontakte betreffen denselben Vorgang; wir führen sie unter einer Anfrage.
|
||||
|
||||
Ihre Angaben sind vollständig erfasst:
|
||||
Flächenbedarf rund 600 m²
|
||||
Nutzung Büro, 42 Arbeitsplätze
|
||||
Mietbeginn Herbst 2026
|
||||
Parkplätze 6
|
||||
|
||||
Die zuständige Person der Vermarktung meldet sich innerhalb von zwei Arbeitstagen bei Ihnen.
|
||||
|
||||
Freundliche Grüsse
|
||||
Lea — Anfragen-Managerin
|
||||
Property On, Vermarktung`,
|
||||
},
|
||||
],
|
||||
availableActions: [AgentWorkItemAction.OPEN_SOURCE, AgentWorkItemAction.MARK_DONE],
|
||||
history: [
|
||||
{
|
||||
id: 'awi-lea-01-hist-1',
|
||||
at: '2026-05-19T10:41:00.000Z',
|
||||
actor: 'Lea',
|
||||
action: 'Sichtung gestartet',
|
||||
note: '14 Nachrichten aus vier Kanälen übernommen.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-01-hist-2',
|
||||
at: '2026-05-19T10:52:00.000Z',
|
||||
actor: 'Lea',
|
||||
action: 'Sichtung abgeschlossen',
|
||||
note: 'Ein Duplikat zusammengeführt, 13 Eingangsbestätigungen versandt.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
// ── Lea — pendent: Entscheidung durch den Bewirtschafter ───────────────────
|
||||
{
|
||||
id: 'awi-lea-02',
|
||||
agentId: AGENT_IDS.LEA,
|
||||
kind: AgentWorkItemKind.INQUIRY_QUALIFIED,
|
||||
area: AgentDomainArea.INQUIRIES,
|
||||
title: 'Grenzfall zur Entscheidung — Nordstern Gastro GmbH, Zürcherstrasse 204',
|
||||
summary:
|
||||
'Die Anfrage erfüllt fünf von sieben Must-Kriterien. Budget und Mietbeginn liegen knapp ausserhalb des Rahmens — ein Grenzfall wird nie automatisch abgesagt, sondern zur Entscheidung vorgelegt.',
|
||||
objectId: 'OBJ-2842',
|
||||
objectLabel: 'Zürcherstrasse 204, 8406 Winterthur Neuhegi — Retail- und Gastrofläche, 310 m²',
|
||||
sourceChannel: AgentChannelType.PORTAL_LEAD_MAIL,
|
||||
targetChannel: AgentChannelType.EMAIL,
|
||||
createdAt: '2026-05-20T07:36:00.000Z',
|
||||
priority: AgentWorkItemPriority.HIGH,
|
||||
status: AgentWorkItemStatus.PENDING,
|
||||
requiresDecision: true,
|
||||
escalationReason:
|
||||
'Entscheidung durch den Bewirtschafter: Zwei Must-Kriterien sind knapp verfehlt — Budgetrahmen um 8 Prozent unter der Mietpreisvorstellung, Mietbeginn zwei Monate nach der Verfügbarkeit. Bei Grenzfällen ist die automatische Absage gesperrt.',
|
||||
decisionQuestion:
|
||||
'Soll die Anfrage der Nordstern Gastro GmbH trotz Budgetabweichung von 8 Prozent und zwei Monaten Leerstand zur Besichtigung zugelassen werden, oder folgt die Absage mit der hinterlegten Vorlage?',
|
||||
inputs: [
|
||||
{
|
||||
label: 'Bedarfsprofil',
|
||||
value: [
|
||||
'Fläche: 280 bis 340 m², Erdgeschoss mit Schaufenster',
|
||||
'Nutzung: Gastronomie mit Take-away, keine Nachtnutzung',
|
||||
'Mietbeginn: 01.03.2027',
|
||||
'Budget: CHF 285 pro m² und Jahr, netto',
|
||||
'Vertragsdauer: 8 Jahre fest, Option auf 5 Jahre',
|
||||
],
|
||||
},
|
||||
{
|
||||
label: 'Must-Kriterien der Fläche',
|
||||
value: [
|
||||
'Flächenbedarf 250–350 m² — erfüllt',
|
||||
'Nutzungsart Gastronomie zulässig — erfüllt',
|
||||
'Mietbeginn ab 01.01.2027 — knapp verfehlt (01.03.2027)',
|
||||
'Mietpreisvorstellung CHF 310 pro m² und Jahr — knapp verfehlt (CHF 285)',
|
||||
'Bonitätsnachweis beibringbar — erfüllt',
|
||||
'Vertragsdauer mindestens 5 Jahre — erfüllt',
|
||||
'Parkplatzbedarf gedeckt — erfüllt',
|
||||
],
|
||||
},
|
||||
{ label: 'Herkunftskanal', value: 'Portal-Lead-Mail vom 20.05.2026, 07:12 Uhr, ergänzt per Direktmail 07:31 Uhr' },
|
||||
{
|
||||
label: 'Bisheriger Kontakt',
|
||||
value: 'Kein früherer Vorgang in den letzten 90 Tagen — kein Duplikat',
|
||||
},
|
||||
],
|
||||
result: [
|
||||
{ label: 'Qualifizierung', value: '5 von 7 Must-Kriterien erfüllt, 2 knapp verfehlt, 0 offen' },
|
||||
{
|
||||
label: 'Interessent',
|
||||
value: 'Nordstern Gastro GmbH, Winterthur — Frau Sabina Rüegg, Geschäftsführerin, drei Betriebe in Winterthur und Frauenfeld',
|
||||
},
|
||||
{
|
||||
label: 'Wirtschaftliche Wirkung',
|
||||
value:
|
||||
'Budgetabweichung CHF 7 750 pro Jahr gegenüber der Mietpreisvorstellung; zwei Monate Leerstand entsprechen rund CHF 16 000 Mietzinsausfall.',
|
||||
},
|
||||
{
|
||||
label: 'Argument für die Zulassung',
|
||||
value:
|
||||
'Die Fläche steht seit 14 Monaten im Angebot; es liegen in diesem Zeitraum nur zwei weitere ernsthafte Anfragen vor, beide ohne Bonitätsnachweis.',
|
||||
},
|
||||
{ label: 'Stand', value: 'Kein Schritt Richtung Termin ausgelöst — wartet auf die Entscheidung der Vermarktung' },
|
||||
{ label: 'Vorbereitet', value: 'Drei Zeitfenster am 26., 27. und 28.05.2026, Reservation noch nicht gesetzt' },
|
||||
],
|
||||
processingSteps: [
|
||||
{
|
||||
id: 'awi-lea-02-step-1',
|
||||
label: 'Anfrage aus zwei Nachrichten zusammengeführt',
|
||||
detail: 'Portal-Lead-Mail und nachgereichte Direktmail derselben Person zu einem Vorgang verbunden.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-step-2',
|
||||
label: 'Freitext in ein Bedarfsprofil überführt',
|
||||
detail: 'Fläche, Nutzung, Mietbeginn, Budget und Vertragsdauer strukturiert erfasst.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-step-3',
|
||||
label: 'Gegen die Must-Kriterien der Fläche geprüft',
|
||||
detail: 'Je Kriterium erfüllt, nicht erfüllt oder offen festgehalten.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-step-4',
|
||||
label: 'Als Grenzfall eingestuft',
|
||||
detail: 'Beide Abweichungen liegen innerhalb der Grenzfall-Bandbreite — automatische Absage gesperrt.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-step-5',
|
||||
label: 'Kurzprofil zur Entscheidung vorgelegt',
|
||||
detail: 'Freie Zeitfenster vorsorglich ermittelt, aber nicht reserviert.',
|
||||
},
|
||||
],
|
||||
sourceReferences: [
|
||||
{
|
||||
id: 'awi-lea-02-src-1',
|
||||
label: 'Must-Kriterien Fläche OBJ-2842',
|
||||
documentName: 'Vermarktungsauftrag_OBJ-2842_2025-03-01.pdf',
|
||||
locator: 'Seite 2, Abschnitt «Grundvoraussetzungen»',
|
||||
quote:
|
||||
'«Mietbeginn ab 1. Januar 2027; Mietzinsvorstellung CHF 310 pro Quadratmeter und Jahr netto; Vertragsdauer mindestens fünf Jahre.»',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-src-2',
|
||||
label: 'Anfrage-Log Fläche OBJ-2842',
|
||||
documentName: 'Anfrage-Log_OBJ-2842_2026.csv',
|
||||
locator: 'Zeile 12',
|
||||
},
|
||||
],
|
||||
messageThread: [
|
||||
{
|
||||
id: 'awi-lea-02-msg-1',
|
||||
at: '2026-05-20T07:12:00.000Z',
|
||||
from: 'lead-service@plattform-immobilien.ch',
|
||||
to: 'portal-leads@property-on.ch',
|
||||
channel: AgentChannelType.PORTAL_LEAD_MAIL,
|
||||
subject: 'Neue Anfrage zu Ihrem Inserat «Retail-/Gastrofläche 310 m², Winterthur Neuhegi»',
|
||||
body: `Guten Tag
|
||||
|
||||
Zu Ihrem Inserat ist eine neue Anfrage eingegangen.
|
||||
|
||||
Inserat: Retail- und Gastrofläche 310 m², Zürcherstrasse 204, 8406 Winterthur
|
||||
Name: Sabina Rüegg
|
||||
Firma: Nordstern Gastro GmbH, Winterthur
|
||||
Telefon: +41 52 214 77 30
|
||||
E-Mail: s.rueegg@nordstern-gastro.ch
|
||||
|
||||
Nachricht: «Wir betreiben drei Lokale in Winterthur und Frauenfeld und suchen
|
||||
für unser viertes Konzept eine Erdgeschossfläche mit Schaufenster. Die Fläche
|
||||
in Neuhegi passt sehr gut. Wir würden per März 2027 starten.»
|
||||
|
||||
Freundliche Grüsse
|
||||
Plattform Immobilien — Lead-Service`,
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-msg-2',
|
||||
at: '2026-05-20T07:31:00.000Z',
|
||||
from: 's.rueegg@nordstern-gastro.ch',
|
||||
to: 'anfragen@property-on.ch',
|
||||
channel: AgentChannelType.EMAIL,
|
||||
subject: 'Ergänzung zu unserer Anfrage — Zürcherstrasse 204, Winterthur',
|
||||
body: `Guten Tag
|
||||
|
||||
Ergänzend zu unserer Anfrage über die Plattform von heute Morgen die noch fehlenden Angaben:
|
||||
|
||||
Nutzung Gastronomie mit Take-away, keine Nachtnutzung
|
||||
Mietbeginn 1. März 2027 (Umbau des bisherigen Standorts läuft bis Februar)
|
||||
Budget CHF 285 pro Quadratmeter und Jahr, netto
|
||||
Vertragsdauer 8 Jahre fest, mit Option auf weitere 5 Jahre
|
||||
Bonität Jahresabschlüsse 2023–2025 und Betreibungsregisterauszug liegen bereit
|
||||
|
||||
Über eine Besichtigung würden wir uns sehr freuen.
|
||||
|
||||
Freundliche Grüsse
|
||||
Sabina Rüegg
|
||||
Geschäftsführerin, Nordstern Gastro GmbH
|
||||
Winterthur`,
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-msg-3',
|
||||
at: '2026-05-20T07:34:00.000Z',
|
||||
from: 'lea@property-on.ch',
|
||||
to: 's.rueegg@nordstern-gastro.ch',
|
||||
channel: AgentChannelType.EMAIL,
|
||||
subject: 'Ihre Anfrage zur Fläche Zürcherstrasse 204, Winterthur — Eingang bestätigt',
|
||||
body: `Guten Tag Frau Rüegg
|
||||
|
||||
Besten Dank für Ihre Anfrage und die rasch nachgereichten Angaben zur Retail- und Gastrofläche an der Zürcherstrasse 204 in Winterthur.
|
||||
|
||||
Ihre Unterlagen sind vollständig. Die zuständige Person der Vermarktung prüft Ihr Anliegen und meldet sich innerhalb von zwei Arbeitstagen bei Ihnen.
|
||||
|
||||
Freundliche Grüsse
|
||||
Lea — Anfragen-Managerin
|
||||
Property On, Vermarktung`,
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-msg-4',
|
||||
at: '2026-05-20T07:36:00.000Z',
|
||||
from: 'lea@property-on.ch',
|
||||
to: 'nadine.brunner@property-on.ch',
|
||||
channel: AgentChannelType.EMAIL,
|
||||
subject: 'ENTSCHEID NÖTIG — Grenzfall Nordstern Gastro GmbH, OBJ-2842',
|
||||
body: `Guten Morgen Frau Brunner
|
||||
|
||||
Zur Fläche OBJ-2842 (Zürcherstrasse 204, Winterthur Neuhegi) liegt ein Grenzfall vor:
|
||||
|
||||
erfüllt Fläche, Nutzung, Bonität, Vertragsdauer, Parkplätze
|
||||
knapp verfehlt Budget CHF 285 statt CHF 310 pro m² und Jahr (−8 %)
|
||||
knapp verfehlt Mietbeginn 01.03.2027 statt ab 01.01.2027 (2 Monate Leerstand)
|
||||
|
||||
Die Fläche steht seit 14 Monaten im Angebot. Ich habe nichts Richtung Termin ausgelöst und warte auf Ihren Entscheid. Drei Zeitfenster am 26., 27. und 28. Mai stünden bereit.
|
||||
|
||||
Freundliche Grüsse
|
||||
Lea — Anfragen-Managerin
|
||||
Property On, Vermarktung`,
|
||||
},
|
||||
],
|
||||
availableActions: [
|
||||
AgentWorkItemAction.DECIDE,
|
||||
AgentWorkItemAction.APPROVE,
|
||||
AgentWorkItemAction.EDIT,
|
||||
AgentWorkItemAction.REJECT,
|
||||
AgentWorkItemAction.OPEN_SOURCE,
|
||||
],
|
||||
editableFields: [
|
||||
{
|
||||
id: 'awi-lea-02-field-slots',
|
||||
label: 'Vorgeschlagene Besichtigungsfenster',
|
||||
value: '26.05.2026 10:00, 27.05.2026 14:00, 28.05.2026 09:30',
|
||||
helperText: 'Termindauer 45 Minuten, Pufferzeit 15 Minuten vor und nach dem Termin.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-field-contact',
|
||||
label: 'Ansprechperson vor Ort',
|
||||
value: 'Marco Steinegger, Vermarktung Winterthur',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-field-note',
|
||||
label: 'Hinweis an den Interessenten',
|
||||
value:
|
||||
'Der Mietzins ist Verhandlungssache; ein Mietbeginn per März 2027 ist grundsätzlich prüfbar. Bitte bringen Sie die Jahresabschlüsse 2023 bis 2025 an die Besichtigung mit.',
|
||||
multiline: true,
|
||||
helperText: 'Wird der Terminbestätigung angehängt, sobald die Freigabe erteilt ist.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-field-reject-reason',
|
||||
label: 'Begründung bei Absage',
|
||||
value: 'Die Mietpreisvorstellung und der gewünschte Mietbeginn liegen ausserhalb der Grundvoraussetzungen dieses Objekts.',
|
||||
multiline: true,
|
||||
helperText: 'Wird in die hinterlegte Absagevorlage eingesetzt, falls Sie ablehnen.',
|
||||
},
|
||||
],
|
||||
history: [
|
||||
{
|
||||
id: 'awi-lea-02-hist-1',
|
||||
at: '2026-05-20T07:12:00.000Z',
|
||||
actor: 'Lea',
|
||||
action: 'Anfrage erfasst',
|
||||
note: 'Portal-Lead-Mail der Plattform, Fläche OBJ-2842 zugeordnet.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-hist-2',
|
||||
at: '2026-05-20T07:33:00.000Z',
|
||||
actor: 'Lea',
|
||||
action: 'Bedarfsprofil vervollständigt',
|
||||
note: 'Nachgereichte Direktmail zusammengeführt, alle Mindestangaben vorhanden.',
|
||||
},
|
||||
{
|
||||
id: 'awi-lea-02-hist-3',
|
||||
at: '2026-05-20T07:36:00.000Z',
|
||||
actor: 'Lea',
|
||||
action: 'Als Grenzfall zur Entscheidung vorgelegt',
|
||||
note: 'Automatische Absage gesperrt, keine Kalenderreservation gesetzt.',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
// ── Bruno — erledigt ───────────────────────────────────────────────────────
|
||||
{
|
||||
id: 'awi-bruno-01',
|
||||
@@ -1343,10 +923,10 @@ Property On, Vermarktung`,
|
||||
],
|
||||
},
|
||||
|
||||
// ── Reto — erledigt ────────────────────────────────────────────────────────
|
||||
// ── Bruno — erledigt ────────────────────────────────────────────────────────
|
||||
{
|
||||
id: 'awi-reto-01',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
id: 'awi-bruno-r01',
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
kind: AgentWorkItemKind.RECAP,
|
||||
area: AgentDomainArea.VIEWINGS,
|
||||
title: 'Recap zur Besichtigung Technoparkstrasse 7 mit einem Klick freigegeben',
|
||||
@@ -1397,7 +977,7 @@ Property On, Vermarktung`,
|
||||
value: [
|
||||
'Grundriss mit Abtrennungsvariante versenden — Marco Steinegger, bis 15.05.2026',
|
||||
'Mietzins für Teilfläche intern prüfen — Nadine Brunner, bis 19.05.2026',
|
||||
'Zweitbesichtigung vormerken — Lea, ab 22.05.2026',
|
||||
'Zweitbesichtigung vormerken — Bruno, ab 22.05.2026',
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -1408,40 +988,40 @@ Property On, Vermarktung`,
|
||||
],
|
||||
processingSteps: [
|
||||
{
|
||||
id: 'awi-reto-01-step-1',
|
||||
id: 'awi-bruno-r01-step-1',
|
||||
label: 'Sprachmemo entgegengenommen und zugeordnet',
|
||||
detail: 'Über Zeitpunkt und Objektbezug der Besichtigung vom 12.05.2026 zugewiesen.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-step-2',
|
||||
id: 'awi-bruno-r01-step-2',
|
||||
label: 'Gesprochenes in Text übertragen und bereinigt',
|
||||
detail: 'Füllwörter und Wiederholungen entfernt, inhaltliche Aussagen unverändert übernommen.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-step-3',
|
||||
id: 'awi-bruno-r01-step-3',
|
||||
label: 'In Feedback, Einwände, Zusagen und offene Punkte gegliedert',
|
||||
detail: 'Jeder Punkt behält den Bezug zur Aussage im Memo.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-step-4',
|
||||
id: 'awi-bruno-r01-step-4',
|
||||
label: 'Protokoll, Gesprächsnotiz und Aufgaben als Vorschlag zusammengestellt',
|
||||
detail: 'Drei Folgeaufgaben mit Frist und zuständiger Person abgeleitet.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-step-5',
|
||||
id: 'awi-bruno-r01-step-5',
|
||||
label: 'Nach der Freigabe in die Zielsysteme übertragen',
|
||||
detail: 'Übertragung erst nach der Bestätigung von Marco Steinegger um 17:20 Uhr.',
|
||||
},
|
||||
],
|
||||
sourceReferences: [
|
||||
{
|
||||
id: 'awi-reto-01-src-1',
|
||||
id: 'awi-bruno-r01-src-1',
|
||||
label: 'Sprachmemo Besichtigung OBJ-2288',
|
||||
documentName: 'Sprachmemo_OBJ-2288_2026-05-12_1648.m4a',
|
||||
locator: 'Gesamtaufnahme 4:07 Minuten',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-src-2',
|
||||
id: 'awi-bruno-r01-src-2',
|
||||
label: 'Besichtigungsprotokoll im Objektdossier',
|
||||
documentName: 'Besichtigungsprotokoll_OBJ-2288_2026-05-12.pdf',
|
||||
locator: 'Seiten 1–2',
|
||||
@@ -1449,17 +1029,17 @@ Property On, Vermarktung`,
|
||||
],
|
||||
messageThread: [
|
||||
{
|
||||
id: 'awi-reto-01-msg-1',
|
||||
id: 'awi-bruno-r01-msg-1',
|
||||
at: '2026-05-12T16:48:00.000Z',
|
||||
from: 'Marco Steinegger',
|
||||
to: 'Reto Diktat (WhatsApp)',
|
||||
to: 'Bruno Diktat (WhatsApp)',
|
||||
channel: AgentChannelType.WHATSAPP,
|
||||
body: '[Sprachmemo, 4:07 Minuten] Besichtigung Technoparkstrasse mit Herrn Cassano ist gelaufen. Ich fasse kurz zusammen, was gesagt wurde.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-msg-2',
|
||||
id: 'awi-bruno-r01-msg-2',
|
||||
at: '2026-05-12T17:04:00.000Z',
|
||||
from: 'Reto — Recap Vermarktung',
|
||||
from: 'Bruno — Recap Vermarktung',
|
||||
to: 'Marco Steinegger',
|
||||
channel: AgentChannelType.WHATSAPP,
|
||||
body: `Guten Abend Marco
|
||||
@@ -1469,13 +1049,13 @@ Das Protokoll zur Besichtigung an der Technoparkstrasse 7 liegt als Vorschlag be
|
||||
Eine Rückfrage: Du hast von «rund zehn Prozent teurer» gesprochen. Beziehst du das auf den Nettomietzins oder auf die Gesamtkosten inklusive Nebenkosten?
|
||||
|
||||
Freundliche Grüsse
|
||||
Reto — Recap-Agent`,
|
||||
Bruno — Recap-Agent`,
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-msg-3',
|
||||
id: 'awi-bruno-r01-msg-3',
|
||||
at: '2026-05-12T17:19:00.000Z',
|
||||
from: 'Marco Steinegger',
|
||||
to: 'Reto — Recap Vermarktung',
|
||||
to: 'Bruno — Recap Vermarktung',
|
||||
channel: AgentChannelType.WHATSAPP,
|
||||
body: 'Auf den Nettomietzins. Sonst passt alles — bitte so ablegen und die drei Aufgaben eröffnen. Freigabe erteilt.',
|
||||
},
|
||||
@@ -1483,14 +1063,14 @@ Reto — Recap-Agent`,
|
||||
availableActions: [AgentWorkItemAction.OPEN_SOURCE, AgentWorkItemAction.MARK_DONE],
|
||||
history: [
|
||||
{
|
||||
id: 'awi-reto-01-hist-1',
|
||||
id: 'awi-bruno-r01-hist-1',
|
||||
at: '2026-05-12T17:04:00.000Z',
|
||||
actor: 'Reto',
|
||||
actor: 'Bruno',
|
||||
action: 'Vorschlag vorgelegt',
|
||||
note: 'Protokoll, Gesprächsnotiz und drei Folgeaufgaben zur 1-Klick-Bestätigung.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-01-hist-2',
|
||||
id: 'awi-bruno-r01-hist-2',
|
||||
at: '2026-05-12T17:20:00.000Z',
|
||||
actor: 'Marco Steinegger',
|
||||
action: 'Freigabe erteilt',
|
||||
@@ -1499,10 +1079,10 @@ Reto — Recap-Agent`,
|
||||
],
|
||||
},
|
||||
|
||||
// ── Reto — pendent: Verarbeitungsproblem ───────────────────────────────────
|
||||
// ── Bruno — pendent: Verarbeitungsproblem ───────────────────────────────────
|
||||
{
|
||||
id: 'awi-reto-02',
|
||||
agentId: AGENT_IDS.RETO,
|
||||
id: 'awi-bruno-r02',
|
||||
agentId: AGENT_IDS.BRUNO,
|
||||
kind: AgentWorkItemKind.RECAP,
|
||||
area: AgentDomainArea.VIEWINGS,
|
||||
title: 'Sprachmemo abgebrochen und teilweise unverständlich — Recap Baarerstrasse 82',
|
||||
@@ -1558,35 +1138,35 @@ Reto — Recap-Agent`,
|
||||
],
|
||||
processingSteps: [
|
||||
{
|
||||
id: 'awi-reto-02-step-1',
|
||||
id: 'awi-bruno-r02-step-1',
|
||||
label: 'Sprachmemo entgegengenommen und zugeordnet',
|
||||
detail: 'Über Zeitpunkt und Objektbezug der Besichtigung vom 19.05.2026 zugewiesen.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-step-2',
|
||||
id: 'awi-bruno-r02-step-2',
|
||||
label: 'Abbruch der Aufnahme festgestellt',
|
||||
detail: 'Die Datei endet nach 3:12 Minuten mitten im Satz — kein Abschluss des Gedankens erkennbar.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-step-3',
|
||||
id: 'awi-bruno-r02-step-3',
|
||||
label: 'Drei Passagen als unverständlich markiert',
|
||||
detail: 'Zusammen 47 Sekunden mit durchgehendem Baulärm — Inhalte werden nicht erraten.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-step-4',
|
||||
id: 'awi-bruno-r02-step-4',
|
||||
label: 'Ablage angehalten und Rückfrage gestellt',
|
||||
detail: 'Ohne Entscheid gelangt kein lückenhaftes Protokoll ins Dossier und keine Notiz ins CRM.',
|
||||
},
|
||||
],
|
||||
sourceReferences: [
|
||||
{
|
||||
id: 'awi-reto-02-src-1',
|
||||
id: 'awi-bruno-r02-src-1',
|
||||
label: 'Sprachmemo Besichtigung OBJ-2094',
|
||||
documentName: 'Sprachmemo_OBJ-2094_2026-05-19_1724.m4a',
|
||||
locator: 'Aufnahme 3:12 Minuten, unklar bei 1:12, 2:03 und 2:55',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-src-2',
|
||||
id: 'awi-bruno-r02-src-2',
|
||||
label: 'Kalendereintrag Besichtigung',
|
||||
documentName: 'Kalender_Vermarktung_2026-05-19.ics',
|
||||
locator: 'Termin 16:00–17:00 Uhr',
|
||||
@@ -1600,25 +1180,25 @@ Reto — Recap-Agent`,
|
||||
],
|
||||
editableFields: [
|
||||
{
|
||||
id: 'awi-reto-02-field-rent',
|
||||
id: 'awi-bruno-r02-field-rent',
|
||||
label: 'Passage 1 — genannter Mietzins',
|
||||
value: '[unklar]',
|
||||
helperText: 'Aufnahme 1:12 bis 1:31. Bitte den genannten Betrag ergänzen oder das Feld leer lassen.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-field-contact',
|
||||
id: 'awi-bruno-r02-field-contact',
|
||||
label: 'Passage 2 — zweite Ansprechperson',
|
||||
value: '[unklar]',
|
||||
helperText: 'Aufnahme 2:03 bis 2:18. Name und Funktion beim Interessenten.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-field-deadline',
|
||||
id: 'awi-bruno-r02-field-deadline',
|
||||
label: 'Passage 3 — zugesagte Frist',
|
||||
value: '[unklar]',
|
||||
helperText: 'Aufnahme 2:55 bis 3:08. Aus dieser Angabe entsteht die Folgeaufgabe.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-field-summary',
|
||||
id: 'awi-bruno-r02-field-summary',
|
||||
label: 'Zusammenfassung des Protokolls',
|
||||
value:
|
||||
'Die Interessentin zeigte sich vom Grundriss und vom Tageslicht im 3. Obergeschoss überzeugt. Als Einwand wurde die Parkplatzsituation genannt: verfügbar sind 4 statt der gewünschten 8 Plätze. Ein Mietbeginn per 1. Januar 2027 wäre passend.',
|
||||
@@ -1627,16 +1207,16 @@ Reto — Recap-Agent`,
|
||||
],
|
||||
history: [
|
||||
{
|
||||
id: 'awi-reto-02-hist-1',
|
||||
id: 'awi-bruno-r02-hist-1',
|
||||
at: '2026-05-19T17:26:00.000Z',
|
||||
actor: 'Reto',
|
||||
actor: 'Bruno',
|
||||
action: 'Verarbeitungsproblem gemeldet',
|
||||
note: 'Aufnahme abgebrochen, drei Passagen unverständlich — Ablage angehalten.',
|
||||
},
|
||||
{
|
||||
id: 'awi-reto-02-hist-2',
|
||||
id: 'awi-bruno-r02-hist-2',
|
||||
at: '2026-05-20T08:05:00.000Z',
|
||||
actor: 'Reto',
|
||||
actor: 'Bruno',
|
||||
action: 'Erinnerung an die Rückfrage',
|
||||
note: 'Seit über 14 Stunden ohne Rückmeldung — Termin ist noch nicht protokolliert.',
|
||||
},
|
||||
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
export const brunoAgent: TeamAgent = {
|
||||
id: 'bruno',
|
||||
name: 'Bruno',
|
||||
role: 'Besichtigungs-Briefing',
|
||||
role: 'Besichtigungsassistent',
|
||||
personnelNumber: 'PO-ZD-13',
|
||||
department: 'Vermarktung',
|
||||
email: 'bruno@property-on.ch',
|
||||
@@ -30,30 +30,37 @@ export const brunoAgent: TeamAgent = {
|
||||
status: AgentStatus.ACTIVE,
|
||||
autonomyLevel: AgentAutonomyLevel.AUTONOMOUS,
|
||||
shortDescription:
|
||||
'Bereitet Aussentermine automatisch mit Objekt-, Gegenüber- und Argumentationsinformationen vor.',
|
||||
'Bereitet Besichtigungen und Termine vor und erstellt im Nachgang Protokolle und Kundennotizen.',
|
||||
autonomyNote: '«Autonom»',
|
||||
|
||||
profile: {
|
||||
purpose:
|
||||
'Bruno bereitet jeden Aussentermin der Vermarktung rechtzeitig vor und liefert der verantwortlichen Person ein einseitiges Briefing zu Objekt, Gegenüber und Argumentation.',
|
||||
'Bruno begleitet jeden Aussentermin der Vermarktung von beiden Seiten: vorher mit einem Briefing zu Objekt, Gegenüber und Argumentation, nachher mit einem strukturierten Protokoll und einer Kundennotiz fürs CRM.',
|
||||
input: [
|
||||
'Kalendertermin mit Zeit, Ort, Objektbezug und Teilnehmenden',
|
||||
'Objektinformationen aus Dossier, Ablage und Bewirtschaftungssystem',
|
||||
'Öffentlich verfügbare Firmeninformationen zum Gegenüber',
|
||||
'Mündlicher Bericht des Maklers nach dem Termin — per WhatsApp-Anruf oder Sprachnachricht, etwa aus dem Auto',
|
||||
'Lagebericht, den Bruno bei Livia anfragt',
|
||||
],
|
||||
coreFlow: [
|
||||
'Zwei Stunden vor dem Aussentermin selbständig anlaufen und den Termin einlesen',
|
||||
'Alles zum Objekt zusammentragen: Fläche, Ausbau, Konditionen, Verfügbarkeit, Historie',
|
||||
'Den Lagebericht bei Livia anfragen und in den Bericht übernehmen',
|
||||
'Offene Punkte klar als fehlende Information kennzeichnen, statt sie zu überspielen',
|
||||
'Das Gegenüber über öffentlich zugängliche Quellen einordnen und die Herkunft der Angaben festhalten',
|
||||
'Drei Verkaufsargumente und drei erwartbare Einwände samt Antwort formulieren',
|
||||
'Verkaufsargumente und erwartbare Einwände samt Antwort formulieren',
|
||||
'Alles auf einer Seite bündeln, per E-Mail zustellen und bei Terminverschiebung nachführen',
|
||||
'Nach dem Termin den mündlichen Bericht entgegennehmen und in ein strukturiertes Protokoll überführen',
|
||||
'Protokoll und Kundennotiz im CRM beziehungsweise in der angebundenen Dokumentenablage ablegen',
|
||||
],
|
||||
output: [
|
||||
'Einseitiges Briefing zum Aussentermin',
|
||||
'Audiofassung des Briefings für die Anfahrt',
|
||||
'Drei Verkaufsargumente je Objekt und Gegenüber',
|
||||
'Drei erwartbare Einwände mit vorbereiteter Antwort',
|
||||
'Verkaufsargumente je Objekt und Gegenüber',
|
||||
'Erwartbare Einwände mit vorbereiteter Antwort',
|
||||
'Besichtigungsprotokoll als abgelegtes Dokument im Dossier',
|
||||
'Kundennotiz fürs CRM mit Interessentenstatus und nächstem Schritt',
|
||||
],
|
||||
},
|
||||
|
||||
@@ -65,6 +72,9 @@ export const brunoAgent: TeamAgent = {
|
||||
'Aufbereitung von Verkaufsargumenten und erwartbaren Einwänden',
|
||||
'Erstellung und Zustellung des einseitigen Briefings samt optionaler Audiofassung',
|
||||
'Nachführung des Briefings bei Terminverschiebung oder geänderter Teilnehmerliste',
|
||||
'Entgegennahme des mündlichen Berichts nach dem Termin über WhatsApp-Anruf oder Sprachnachricht',
|
||||
'Erstellung von Protokoll und Kundennotiz aus dem mündlichen Bericht',
|
||||
'Ablage der Nachbereitungsergebnisse im CRM beziehungsweise in der Dokumentenablage',
|
||||
],
|
||||
|
||||
tasks: [
|
||||
@@ -156,6 +166,54 @@ export const brunoAgent: TeamAgent = {
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.CALENDAR,
|
||||
},
|
||||
{
|
||||
id: 'bruno-task-10',
|
||||
title: 'Lagebericht bei Livia anfragen',
|
||||
description:
|
||||
'Fragt den Lagebericht zum Objekt selbständig bei Livia an und übernimmt die Antwort in das Besichtigungs-Briefing. Fehlt der Bericht, wird die Lücke im Briefing sichtbar ausgewiesen.',
|
||||
enabled: true,
|
||||
schedule: 'während der Objektaufbereitung',
|
||||
requiresApproval: false,
|
||||
},
|
||||
{
|
||||
id: 'bruno-task-11',
|
||||
title: 'Mündlichen Bericht nach dem Termin entgegennehmen',
|
||||
description:
|
||||
'Ist über WhatsApp anrufbar und nimmt Sprachnachrichten entgegen, damit der Makler direkt nach dem Termin — etwa aus dem Auto — mündlich berichten kann. Ordnet den Bericht über Zeitpunkt und Objektbezug dem richtigen Termin zu.',
|
||||
enabled: true,
|
||||
schedule: 'bei Eingang',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.WHATSAPP,
|
||||
},
|
||||
{
|
||||
id: 'bruno-task-12',
|
||||
title: 'Gesprochenes in Text übertragen und bereinigen',
|
||||
description:
|
||||
'Überträgt den mündlichen Bericht in Text, inklusive Schweizer Ortsnamen und Objektbezeichnungen, entfernt Füllwörter und Wiederholungen und markiert unsichere Stellen, statt sie zu raten.',
|
||||
enabled: true,
|
||||
schedule: 'unmittelbar nach Eingang des Berichts',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.PHONE_VOICE,
|
||||
},
|
||||
{
|
||||
id: 'bruno-task-13',
|
||||
title: 'Strukturiertes Protokoll erstellen',
|
||||
description:
|
||||
'Trennt den Bericht in positives Feedback, Einwände, verbindliche Zusagen und offene Fragen und ergänzt den Termin-Kontext: Objekt, Interessent, Datum, Teilnehmende.',
|
||||
enabled: true,
|
||||
schedule: 'nach der Bereinigung',
|
||||
requiresApproval: false,
|
||||
},
|
||||
{
|
||||
id: 'bruno-task-14',
|
||||
title: 'Kundennotiz und Protokoll ablegen',
|
||||
description:
|
||||
'Legt Protokoll und Kundennotiz bei vorhandener Integration im CRM beziehungsweise in der angebundenen Dokumentenablage ab. Fehlt der Zugang, greift der eingestellte Fallback und das Paket geht als strukturierte E-Mail an die zuständige Person.',
|
||||
enabled: true,
|
||||
schedule: 'nach Fertigstellung des Protokolls',
|
||||
requiresApproval: true,
|
||||
dependsOnSystem: AgentSystemType.CRM,
|
||||
},
|
||||
],
|
||||
|
||||
channels: [
|
||||
@@ -189,6 +247,37 @@ export const brunoAgent: TeamAgent = {
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'bruno-ch-whatsapp',
|
||||
type: AgentChannelType.WHATSAPP,
|
||||
direction: AgentChannelDirection.BOTH,
|
||||
description:
|
||||
'Bruno ist über WhatsApp anrufbar. Der Makler berichtet nach einem Termin mündlich — per Anruf oder Sprachnachricht, etwa aus dem Auto; Bruno macht daraus ein strukturiertes Protokoll.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Bruno Besichtigungslinie (WhatsApp)',
|
||||
inboxAddress: '+41 44 000 00 13',
|
||||
defaultRecipients: [],
|
||||
autoReplyEnabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'bruno-ch-phone',
|
||||
type: AgentChannelType.PHONE_VOICE,
|
||||
direction: AgentChannelDirection.INBOUND,
|
||||
description:
|
||||
'Telefonische Diktatlinie als Rückfallweg, wenn WhatsApp nicht zur Verfügung steht.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
optional: true,
|
||||
config: {
|
||||
displayName: 'Bruno Diktatlinie',
|
||||
inboxAddress: '+41 44 000 00 14',
|
||||
defaultRecipients: [],
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'bruno-ch-audio-output',
|
||||
type: AgentChannelType.AUDIO_OUTPUT,
|
||||
|
||||
@@ -1,490 +0,0 @@
|
||||
/**
|
||||
* Property On — Personalblatt «Lea», Anfragen-Managerin (Abteilung Vermarktung).
|
||||
*
|
||||
* Fachliche Wahrheit aus dem Agenten-Katalog: Rolle, Personalnummer, E-Mail und die
|
||||
* elf Aufgaben werden unverändert übernommen. Zeitanker der Mockdaten: 20.05.2026.
|
||||
*/
|
||||
|
||||
import type { TeamAgent } from '../../domain/teamAgent'
|
||||
import {
|
||||
AgentStatus,
|
||||
AgentAutonomyLevel,
|
||||
AgentChannelType,
|
||||
AgentChannelDirection,
|
||||
AgentConnectionStatus,
|
||||
AgentSystemType,
|
||||
AgentAccessLevel,
|
||||
AgentSettingKind,
|
||||
AgentSettingGroup,
|
||||
AgentAvatarTone,
|
||||
} from '../../domain/teamAgent'
|
||||
|
||||
const ABSAGEVORLAGE = `Guten Tag {Anrede} {Nachname}
|
||||
|
||||
Besten Dank für Ihre Anfrage zur Fläche {Objekt} in {Ort}.
|
||||
|
||||
Wir haben Ihre Angaben geprüft. Leider erfüllt Ihr Bedarf die für dieses Objekt
|
||||
festgelegten Grundvoraussetzungen nicht: {Grund}.
|
||||
|
||||
Sobald eine passende Fläche in unserem Portfolio frei wird, melden wir uns
|
||||
unaufgefordert bei Ihnen.
|
||||
|
||||
Freundliche Grüsse
|
||||
Property On — Vermarktung
|
||||
{Verantwortliche Person}`
|
||||
|
||||
export const leaAgent: TeamAgent = {
|
||||
id: 'lea',
|
||||
name: 'Lea',
|
||||
role: 'Anfragen-Managerin',
|
||||
personnelNumber: 'PO-ZD-07',
|
||||
department: 'Vermarktung',
|
||||
email: 'lea@property-on.ch',
|
||||
avatarTone: AgentAvatarTone.SUCCESS,
|
||||
status: AgentStatus.ACTIVE,
|
||||
autonomyLevel: AgentAutonomyLevel.APPROVAL_REQUIRED,
|
||||
shortDescription:
|
||||
'Normalisiert, qualifiziert und koordiniert Anfragen bis zum bestätigten Besichtigungstermin.',
|
||||
autonomyNote:
|
||||
'«Automatische Absage bei Nichterfüllung; Freigabe für Schritte Richtung Termin»',
|
||||
|
||||
profile: {
|
||||
purpose:
|
||||
'Lea nimmt jede eingehende Flächenanfrage auf, prüft sie gegen die Must-Kriterien der ausgeschriebenen Fläche und begleitet sie bis zum bestätigten Besichtigungstermin.',
|
||||
input: [
|
||||
'Portal-Lead-Mails der Immobilienplattformen',
|
||||
'Direktmails an das Anfragen-Postfach der Vermarktung',
|
||||
'Website-Formulare von property-on.ch',
|
||||
'Telefonnotizen aus dem Empfang Zürich und Winterthur',
|
||||
'Must-Kriterien je ausgeschriebener Fläche',
|
||||
'Besichtigungskalender der verantwortlichen Person',
|
||||
],
|
||||
coreFlow: [
|
||||
'Anfragen aus allen Kanälen einsammeln und in ein einheitliches Bedarfsprofil überführen',
|
||||
'Prüfen, ob dieselbe Person bereits über einen anderen Kanal angefragt hat',
|
||||
'Fehlende Pflichtangaben mit einem vorbereiteten Rückfragetext nachfassen',
|
||||
'Bedarfsprofil mit den Must-Kriterien der Fläche abgleichen',
|
||||
'Nicht passende Interessenten sachlich absagen, passende zur Entscheidung vorlegen',
|
||||
'Nach Freigabe freie Zeitfenster suchen, Termin vorschlagen, bestätigen und den Verlauf ablegen',
|
||||
],
|
||||
output: [
|
||||
'Automatische Absagen mit nachvollziehbarer Begründung',
|
||||
'Qualifizierte Kurzprofile für die Entscheidung der Vermarktung',
|
||||
'Bestätigte Besichtigungstermine samt vorbereitetem Reminder',
|
||||
'Lückenloses Anfrage-Log je Fläche und Interessent',
|
||||
],
|
||||
},
|
||||
|
||||
responsibilities: [
|
||||
'Erfassung sämtlicher Anfragen aus Portalen, Website, E-Mail und Telefon',
|
||||
'Überführung von Freitext in ein einheitliches Bedarfsprofil',
|
||||
'Deduplizierung über alle Kanäle hinweg',
|
||||
'Qualifizierung gegen die Must-Kriterien der ausgeschriebenen Flächen',
|
||||
'Automatische Absage bei klarer Nichterfüllung',
|
||||
'Kalendersteuerung und Terminkoordination bis zur Bestätigung',
|
||||
'Protokollierung von Status und Verlauf je Anfrage',
|
||||
],
|
||||
|
||||
tasks: [
|
||||
{
|
||||
id: 'lea-task-01',
|
||||
title: 'Anfragen aus verschiedenen Kanälen erfassen',
|
||||
description:
|
||||
'Nimmt Portal-Lead-Mails, Direktmails, Website-Formulare und Telefonnotizen entgegen und legt zu jeder Anfrage einen Eintrag auf der betroffenen Fläche an.',
|
||||
enabled: true,
|
||||
schedule: 'bei Eingang',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.PORTAL_LEAD_INBOX,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-02',
|
||||
title: 'Freitext in ein Bedarfsprofil überführen',
|
||||
description:
|
||||
'Liest den Anfragetext und trägt Flächenbedarf, Nutzungsart, Wunschtermin, Budgetrahmen und Vertragsdauer in ein einheitliches Bedarfsprofil ein. Unklare Angaben werden als offen markiert statt geraten.',
|
||||
enabled: true,
|
||||
schedule: 'bei Eingang, direkt nach der Erfassung',
|
||||
requiresApproval: false,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-03',
|
||||
title: 'Duplikate kanalübergreifend erkennen',
|
||||
description:
|
||||
'Gleicht Name, Firma, Telefonnummer und E-Mail mit den Anfragen der letzten 90 Tage ab. Mehrfachanfragen derselben Person über Portal, Formular und Telefon werden zu einem Vorgang zusammengeführt.',
|
||||
enabled: true,
|
||||
schedule: 'bei Eingang, Abgleich über die letzten 90 Tage',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.CRM,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-04',
|
||||
title: 'Fehlende Angaben über Rückfrageentwürfe einholen',
|
||||
description:
|
||||
'Erstellt bei unvollständigen Anfragen einen Rückfrageentwurf mit den fehlenden Mindestangaben. Der Entwurf geht erst nach Freigabe der verantwortlichen Person hinaus.',
|
||||
enabled: true,
|
||||
schedule: 'bei unvollständiger Anfrage, Sammelvorlage werktags 08:30',
|
||||
requiresApproval: true,
|
||||
dependsOnChannel: AgentChannelType.EMAIL,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-05',
|
||||
title: 'Anfrage gegen Must-Kriterien prüfen',
|
||||
description:
|
||||
'Vergleicht das Bedarfsprofil mit den hinterlegten Must-Kriterien der Fläche und hält je Kriterium fest, ob es erfüllt, nicht erfüllt oder noch offen ist.',
|
||||
enabled: true,
|
||||
schedule: 'unmittelbar nach Vollständigkeit des Bedarfsprofils',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.IMMOTOP2,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-06',
|
||||
title: 'Nicht passende Interessenten automatisch absagen',
|
||||
description:
|
||||
'Versendet bei klarer Nichterfüllung eines Must-Kriteriums die hinterlegte Absagevorlage mit dem konkreten Grund und schliesst den Vorgang. Grenzfälle werden nie automatisch abgesagt, sondern vorgelegt.',
|
||||
enabled: true,
|
||||
schedule: 'stündlich, werktags 07:00–19:00',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.EMAIL,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-07',
|
||||
title: 'Passende Interessenten zur Entscheidung vorlegen',
|
||||
description:
|
||||
'Legt der verantwortlichen Person ein Kurzprofil vor: Bedarf, erfüllte und offene Kriterien, Herkunftskanal und Dringlichkeit. Ohne Freigabe geht kein Schritt Richtung Termin hinaus.',
|
||||
enabled: true,
|
||||
schedule: 'werktags 07:30 und 13:30',
|
||||
requiresApproval: true,
|
||||
dependsOnSystem: AgentSystemType.CRM,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-08',
|
||||
title: 'Nach Freigabe Kalender abgleichen',
|
||||
description:
|
||||
'Sucht im Besichtigungskalender der verantwortlichen Person freie Zeitfenster gemäss den hinterlegten Kalenderregeln, unter Berücksichtigung von Termindauer und Pufferzeit.',
|
||||
enabled: true,
|
||||
schedule: 'nach erteilter Freigabe',
|
||||
requiresApproval: true,
|
||||
dependsOnSystem: AgentSystemType.CALENDAR,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-09',
|
||||
title: 'Terminvorschläge senden',
|
||||
description:
|
||||
'Sendet dem Interessenten drei Terminvorschläge mit Treffpunkt und Ansprechperson und reserviert die Zeitfenster vorläufig im Kalender.',
|
||||
enabled: true,
|
||||
schedule: 'innerhalb von 30 Minuten nach Freigabe',
|
||||
requiresApproval: true,
|
||||
dependsOnChannel: AgentChannelType.EMAIL,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-10',
|
||||
title: 'Termin bestätigen und Reminder vorbereiten',
|
||||
description:
|
||||
'Bestätigt den gewählten Termin, trägt ihn verbindlich im Kalender ein, löst die übrigen Reservationen und bereitet den Reminder für Interessent und Ansprechperson vor.',
|
||||
enabled: true,
|
||||
schedule: 'bei Zusage des Interessenten',
|
||||
requiresApproval: true,
|
||||
dependsOnChannel: AgentChannelType.CALENDAR,
|
||||
},
|
||||
{
|
||||
id: 'lea-task-11',
|
||||
title: 'Status und Verlauf protokollieren',
|
||||
description:
|
||||
'Hält je Anfrage Kanal, Eingangszeit, Prüfergebnis, Freigaben, versandte Nachrichten und Terminstatus im Protokoll fest, damit der Verlauf jederzeit nachvollziehbar bleibt.',
|
||||
enabled: true,
|
||||
schedule: 'laufend, Tagesabschluss 19:00',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.CRM,
|
||||
},
|
||||
],
|
||||
|
||||
channels: [
|
||||
{
|
||||
id: 'lea-ch-email',
|
||||
type: AgentChannelType.EMAIL,
|
||||
direction: AgentChannelDirection.BOTH,
|
||||
description:
|
||||
'Anfragen-Postfach der Vermarktung: Direktmails von Interessenten sowie Rückfragen, Absagen und Terminvorschläge im Versand.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Anfragen-Postfach Vermarktung',
|
||||
senderAddress: 'lea@property-on.ch',
|
||||
inboxAddress: 'anfragen@property-on.ch',
|
||||
defaultRecipients: ['vermarktung@property-on.ch'],
|
||||
autoReplyEnabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'lea-ch-portal-lead-mail',
|
||||
type: AgentChannelType.PORTAL_LEAD_MAIL,
|
||||
direction: AgentChannelDirection.INBOUND,
|
||||
description:
|
||||
'Lead-Mails der Immobilienplattformen zu den ausgeschriebenen Flächen in Zürich, Winterthur, Basel, Zug, Bern und St. Gallen.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Portal-Leads Plattformen',
|
||||
inboxAddress: 'portal-leads@property-on.ch',
|
||||
defaultRecipients: [],
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'lea-ch-web-form',
|
||||
type: AgentChannelType.WEB_FORM,
|
||||
direction: AgentChannelDirection.INBOUND,
|
||||
description:
|
||||
'Formular «Fläche anfragen» auf property-on.ch — liefert bereits strukturierte Felder zu Bedarf, Nutzung und Wunschtermin.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Website-Formular «Fläche anfragen»',
|
||||
inboxAddress: 'formular@property-on.ch',
|
||||
defaultRecipients: ['vermarktung@property-on.ch'],
|
||||
autoReplyEnabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'lea-ch-phone-note',
|
||||
type: AgentChannelType.PHONE_NOTE,
|
||||
direction: AgentChannelDirection.INBOUND,
|
||||
description:
|
||||
'Telefonnotizen des Empfangs in Zürich und Winterthur, als Freitext erfasst und für die Deduplizierung mitgeführt.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
optional: true,
|
||||
config: {
|
||||
displayName: 'Telefonnotizen Empfang',
|
||||
inboxAddress: 'telefonnotiz@property-on.ch',
|
||||
defaultRecipients: [],
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'lea-ch-calendar',
|
||||
type: AgentChannelType.CALENDAR,
|
||||
direction: AgentChannelDirection.BOTH,
|
||||
description:
|
||||
'Besichtigungskalender der Vermarktung: liest freie Zeitfenster, setzt Reservationen und trägt bestätigte Termine ein.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Besichtigungskalender Vermarktung',
|
||||
senderAddress: 'lea@property-on.ch',
|
||||
defaultRecipients: ['nadine.brunner@property-on.ch', 'vermarktung@property-on.ch'],
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
systems: [
|
||||
{
|
||||
id: 'lea-sys-portal-inbox',
|
||||
type: AgentSystemType.PORTAL_LEAD_INBOX,
|
||||
access: AgentAccessLevel.READ,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Holt die Lead-Mails der Immobilienplattformen ab und ordnet sie der ausgeschriebenen Fläche zu.',
|
||||
permissionNote: 'Nur Lesezugriff — es werden keine Einträge im Portal verändert.',
|
||||
},
|
||||
{
|
||||
id: 'lea-sys-crm',
|
||||
type: AgentSystemType.CRM,
|
||||
access: AgentAccessLevel.READ_WRITE,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Führt Interessent, Bedarfsprofil, Prüfergebnis und Terminstatus, erkennt Duplikate und schreibt das Anfrage-Log.',
|
||||
permissionNote:
|
||||
'Schreibt Anfragen, Notizen und Statuswechsel selbständig; Vertragsdaten bleiben unberührt.',
|
||||
},
|
||||
{
|
||||
id: 'lea-sys-calendar',
|
||||
type: AgentSystemType.CALENDAR,
|
||||
access: AgentAccessLevel.READ_WRITE,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Sucht freie Zeitfenster, reserviert Terminvorschläge und trägt bestätigte Besichtigungen samt Reminder ein.',
|
||||
permissionNote:
|
||||
'Schreibt erst nach Freigabe der verantwortlichen Person; bestehende Termine werden nie verschoben oder gelöscht.',
|
||||
},
|
||||
{
|
||||
id: 'lea-sys-exchange',
|
||||
type: AgentSystemType.M365_EXCHANGE,
|
||||
access: AgentAccessLevel.READ_WRITE,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Liest das Anfragen-Postfach und versendet Absagen, Rückfragen, Terminvorschläge und Bestätigungen.',
|
||||
permissionNote:
|
||||
'Automatischer Versand ausschliesslich für Absagen; alle übrigen Nachrichten gehen erst nach Freigabe hinaus.',
|
||||
},
|
||||
{
|
||||
id: 'lea-sys-immotop2',
|
||||
type: AgentSystemType.IMMOTOP2,
|
||||
access: AgentAccessLevel.READ,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Liest Flächenstammdaten, Verfügbarkeit und die hinterlegten Must-Kriterien der kommerziell genutzten Immobilien.',
|
||||
permissionNote:
|
||||
'Nur Lesezugriff — Stammdaten der Bewirtschaftung werden nicht verändert.',
|
||||
},
|
||||
],
|
||||
|
||||
settings: [
|
||||
{
|
||||
id: 'lea-set-must-criteria',
|
||||
label: 'Must-Kriterien je Fläche',
|
||||
description:
|
||||
'Kriterien, die eine Anfrage zwingend erfüllen muss. Wird eines davon klar verfehlt, folgt die automatische Absage.',
|
||||
kind: AgentSettingKind.MULTI_SELECT,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: ['area_fit', 'usage_allowed', 'start_date', 'budget_range', 'credit_check'],
|
||||
options: [
|
||||
{ value: 'area_fit', label: 'Flächenbedarf im ausgeschriebenen Rahmen' },
|
||||
{ value: 'usage_allowed', label: 'Nutzungsart für das Objekt zulässig' },
|
||||
{ value: 'start_date', label: 'Wunschtermin Mietbeginn passt zur Verfügbarkeit' },
|
||||
{ value: 'budget_range', label: 'Budgetrahmen erreicht die Mietpreisvorstellung' },
|
||||
{ value: 'credit_check', label: 'Bonitätsnachweis kann beigebracht werden' },
|
||||
{ value: 'lease_term', label: 'Vertragsdauer mindestens fünf Jahre' },
|
||||
{ value: 'parking', label: 'Parkplatzbedarf am Standort abgedeckt' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'lea-set-auto-reject',
|
||||
label: 'Automatische Absage aktiv',
|
||||
description:
|
||||
'Ist die Einstellung aktiv, sagt Lea bei klarer Nichterfüllung eines Must-Kriteriums ohne Rückfrage ab. Grenzfälle werden weiterhin vorgelegt.',
|
||||
kind: AgentSettingKind.BOOLEAN,
|
||||
group: AgentSettingGroup.APPROVAL,
|
||||
value: true,
|
||||
},
|
||||
{
|
||||
id: 'lea-set-reject-template',
|
||||
label: 'Absagevorlage',
|
||||
description:
|
||||
'Text der automatischen Absage. Platzhalter in geschweiften Klammern werden je Anfrage eingesetzt.',
|
||||
kind: AgentSettingKind.TEXT,
|
||||
group: AgentSettingGroup.DELIVERY,
|
||||
value: ABSAGEVORLAGE,
|
||||
},
|
||||
{
|
||||
id: 'lea-set-min-fields',
|
||||
label: 'Mindestangaben',
|
||||
description:
|
||||
'Angaben, die für eine Qualifizierung vorliegen müssen. Fehlt eine davon, erstellt Lea einen Rückfrageentwurf.',
|
||||
kind: AgentSettingKind.MULTI_SELECT,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: ['contact', 'company', 'area_sqm', 'usage', 'start_date'],
|
||||
options: [
|
||||
{ value: 'contact', label: 'Name und Kontaktangaben' },
|
||||
{ value: 'company', label: 'Firma und Branche' },
|
||||
{ value: 'area_sqm', label: 'Gewünschte Fläche in m²' },
|
||||
{ value: 'usage', label: 'Geplante Nutzungsart' },
|
||||
{ value: 'start_date', label: 'Wunschtermin Mietbeginn' },
|
||||
{ value: 'budget', label: 'Budgetrahmen' },
|
||||
{ value: 'lease_term', label: 'Gewünschte Vertragsdauer' },
|
||||
{ value: 'parking', label: 'Parkplatzbedarf' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'lea-set-owner',
|
||||
label: 'Verantwortliche Person',
|
||||
description:
|
||||
'Erhält die qualifizierten Kurzprofile und erteilt die Freigabe für alle Schritte Richtung Termin.',
|
||||
kind: AgentSettingKind.TEXT,
|
||||
group: AgentSettingGroup.APPROVAL,
|
||||
value: 'Nadine Brunner, Vermarktung Zürich (Stellvertretung: Marco Steinegger, Winterthur)',
|
||||
},
|
||||
{
|
||||
id: 'lea-set-calendar-rules',
|
||||
label: 'Kalenderregeln',
|
||||
description: 'Bestimmt, welche Zeitfenster Lea für Besichtigungen vorschlagen darf.',
|
||||
kind: AgentSettingKind.SELECT,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: 'business_hours',
|
||||
options: [
|
||||
{ value: 'business_hours', label: 'Geschäftszeiten Mo–Fr, 08:00–17:00' },
|
||||
{ value: 'extended', label: 'Erweitert inkl. Samstagvormittag' },
|
||||
{ value: 'owner_availability', label: 'Nach Verfügbarkeit der verantwortlichen Person' },
|
||||
{ value: 'fixed_slots', label: 'Feste Besichtigungsfenster Dienstag und Donnerstag' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'lea-set-duration',
|
||||
label: 'Termindauer',
|
||||
description: 'Dauer eines Besichtigungstermins, die Lea im Kalender reserviert.',
|
||||
kind: AgentSettingKind.NUMBER,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: 45,
|
||||
unit: 'Minuten',
|
||||
min: 15,
|
||||
max: 120,
|
||||
},
|
||||
{
|
||||
id: 'lea-set-buffer',
|
||||
label: 'Pufferzeit',
|
||||
description: 'Freizuhaltende Zeit vor und nach einem Termin, etwa für Anfahrt und Übergabe.',
|
||||
kind: AgentSettingKind.NUMBER,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: 15,
|
||||
unit: 'Minuten',
|
||||
min: 0,
|
||||
max: 60,
|
||||
},
|
||||
{
|
||||
id: 'lea-set-reminder',
|
||||
label: 'Reminder-Zeitpunkt',
|
||||
description: 'Wann Interessent und Ansprechperson an den bestätigten Termin erinnert werden.',
|
||||
kind: AgentSettingKind.SELECT,
|
||||
group: AgentSettingGroup.DELIVERY,
|
||||
value: 'h24',
|
||||
options: [
|
||||
{ value: 'h24', label: '24 Stunden vor dem Termin' },
|
||||
{ value: 'h4', label: 'vier Stunden vor dem Termin' },
|
||||
{ value: 'h2', label: 'zwei Stunden vor dem Termin' },
|
||||
{ value: 'h1', label: 'eine Stunde vor dem Termin' },
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
metrics: [
|
||||
{
|
||||
id: 'lea-metric-new',
|
||||
label: 'Neue Anfragen',
|
||||
value: '128',
|
||||
hint: 'letzte 30 Tage, alle Kanäle, nach Deduplizierung',
|
||||
},
|
||||
{
|
||||
id: 'lea-metric-qualified',
|
||||
label: 'Qualifizierte Anfragen',
|
||||
value: '74',
|
||||
hint: 'Mindestangaben vollständig und Must-Kriterien erfüllt',
|
||||
},
|
||||
{
|
||||
id: 'lea-metric-auto-rejected',
|
||||
label: 'Automatische Absagen',
|
||||
value: '39',
|
||||
hint: 'klare Nichterfüllung eines Must-Kriteriums',
|
||||
},
|
||||
{
|
||||
id: 'lea-metric-open-decisions',
|
||||
label: 'Offene Entscheidungen',
|
||||
value: '6',
|
||||
hint: 'wartet auf Freigabe der verantwortlichen Person',
|
||||
},
|
||||
{
|
||||
id: 'lea-metric-confirmed',
|
||||
label: 'Bestätigte Termine',
|
||||
value: '31',
|
||||
hint: 'Besichtigungen mit vorbereitetem Reminder',
|
||||
},
|
||||
{
|
||||
id: 'lea-metric-first-response',
|
||||
label: 'Durchschnittliche Erstreaktionszeit',
|
||||
value: '11 Minuten',
|
||||
hint: 'vom Eingang bis zur ersten Rückmeldung, Stand 20.05.2026',
|
||||
},
|
||||
],
|
||||
|
||||
headlineMetricId: 'lea-metric-qualified',
|
||||
lastRun: '2026-05-20T06:15:00.000Z',
|
||||
}
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
export const liviaAgent: TeamAgent = {
|
||||
id: 'livia',
|
||||
name: 'Livia',
|
||||
role: 'Lage-Analystin',
|
||||
role: 'Exposé Master',
|
||||
personnelNumber: 'PO-ZD-21',
|
||||
department: 'Vermarktung',
|
||||
email: 'livia@property-on.ch',
|
||||
@@ -30,14 +30,16 @@ export const liviaAgent: TeamAgent = {
|
||||
status: AgentStatus.ACTIVE,
|
||||
autonomyLevel: AgentAutonomyLevel.AUTONOMOUS,
|
||||
shortDescription:
|
||||
'Erstellt aktuelle Mikro- und Makrolagebeschriebe in zwei Längen und mit Quellen.',
|
||||
'Erstellt Lageberichte, Inserate sowie Angebots- und Offertenbroschüren aus den Daten und Bildern aus «Meine Objekte».',
|
||||
autonomyNote:
|
||||
'Autonom. Livia recherchiert, schreibt und frischt Lagebeschriebe ohne vorgängige Freigabe auf. Jede Aussage wird mit Quelle und Abrufdatum protokolliert, damit die Vermarktung jeden Satz nachprüfen kann.',
|
||||
'Autonom. Livia recherchiert, schreibt und frischt Lageberichte, Inserate und Exposés ohne vorgängige Freigabe auf. Jede Aussage wird mit Quelle und Abrufdatum protokolliert, damit die Vermarktung jeden Satz nachprüfen kann.',
|
||||
|
||||
profile: {
|
||||
purpose:
|
||||
'Livia beschreibt die Lage einer kommerziell genutzten Immobilie so, dass Vermarktung und Interessenten in wenigen Minuten verstehen, wo das Objekt steht, wie es erreichbar ist und was sich im Umfeld verändert.',
|
||||
'Livia macht aus Objektdaten, Lageinformationen und vorhandenen Bildern ein verkaufsfähiges Dokument: Lagebericht, Inserat oder vollständige Angebots- beziehungsweise Offertenbroschüre. Grundlage sind ausschliesslich die Objekte aus «Meine Objekte».',
|
||||
input: [
|
||||
'Objektdaten und Objektbilder aus «Meine Objekte»',
|
||||
'Leads, die Nora erkannt und ein Bewirtschafter zur Exposé-Erstellung weitergeleitet hat',
|
||||
'Objektadresse aus dem Vermarktungsauftrag',
|
||||
'Öffentliche Umfeld- und Verkehrsdaten zu Quartier, Anbindung und Nahversorgung',
|
||||
'Amtliche Publikationen zu Bauprojekten, Zonenänderungen und Umfeldentwicklungen',
|
||||
@@ -52,19 +54,23 @@ export const liviaAgent: TeamAgent = {
|
||||
'Quellen anhängen, Ergebnis je Objekt ablegen und quartalsweise gegen den aktuellen Stand prüfen.',
|
||||
],
|
||||
output: [
|
||||
'Lagebericht mit Mikro-, Makro- und Umfeldteil',
|
||||
'Kurztext für Inserat und Portalauftritt',
|
||||
'Langtext für das Exposé mit Mikro-, Makro- und Umfeldteil',
|
||||
'Angebots- beziehungsweise Offertenbroschüre als PDF oder Word',
|
||||
'Quellenverzeichnis mit Abrufdatum je Aussage',
|
||||
'Änderungshinweise, sobald sich das Umfeld spürbar verändert',
|
||||
],
|
||||
},
|
||||
|
||||
responsibilities: [
|
||||
'Mikro- und Makrolage kommerziell genutzter Immobilien nachvollziehbar beschreiben',
|
||||
'Lageberichte für kommerziell genutzte Immobilien erstellen und nachvollziehbar belegen',
|
||||
'Inserate aus den Objektdaten in «Meine Objekte» erstellen',
|
||||
'Angebots- und Offertenbroschüren aus Objektdaten, Lageinformationen und vorhandenen Bildern erstellen',
|
||||
'Weitergeleitete Leads von Nora zügig zu einem Exposé verarbeiten',
|
||||
'Erreichbarkeit, Nahversorgung und geplante Umfeldentwicklungen sauber trennen und darstellen',
|
||||
'Kurz- und Langtexte in der Firmen-Tonalität liefern, ohne Werbefloskeln ohne Beleg',
|
||||
'Jede Aussage mit einer nachprüfbaren Quelle und einem Abrufdatum hinterlegen',
|
||||
'Lagebeschriebe quartalsweise auffrischen und relevante Abweichungen an die Vermarktung melden',
|
||||
'Fehlende Pflichtangaben als Lücke ausweisen, statt plausible Werte zu erfinden',
|
||||
'Lageberichte quartalsweise auffrischen und relevante Abweichungen an die Vermarktung melden',
|
||||
],
|
||||
|
||||
tasks: [
|
||||
@@ -175,6 +181,46 @@ export const liviaAgent: TeamAgent = {
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.WORKSPACE_CHAT,
|
||||
},
|
||||
{
|
||||
id: 'livia-task-12',
|
||||
title: 'Weitergeleiteten Lead aufnehmen',
|
||||
description:
|
||||
'Nimmt Leads entgegen, die Nora erkannt und ein Bewirtschafter zur Exposé-Erstellung weitergeleitet hat, samt der mitgegebenen Objektempfehlung. Die Objekte stammen ausschliesslich aus «Meine Objekte».',
|
||||
enabled: true,
|
||||
schedule: 'bei Weiterleitung',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.WORKSPACE_CHAT,
|
||||
},
|
||||
{
|
||||
id: 'livia-task-13',
|
||||
title: 'Objektbilder aus «Meine Objekte» importieren',
|
||||
description:
|
||||
'Importiert alle im Objektbestand hinterlegten Bilder automatisch in das Exposé, vermeidet Doppelimporte und übernimmt Kategorie, Reihenfolge und Titelbild-Markierung, soweit vorhanden.',
|
||||
enabled: true,
|
||||
schedule: 'beim Start eines Exposé-Auftrags',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.IMMOTOP2,
|
||||
},
|
||||
{
|
||||
id: 'livia-task-14',
|
||||
title: 'Exposé-Felder aus den Objektdaten befüllen',
|
||||
description:
|
||||
'Befüllt Eckdaten, Lage, Flächen, Preise, Ausstattung sowie Energie und Technik aus den in «Meine Objekte» verfügbaren Angaben. Nicht verfügbare Pflichtfelder bleiben leer und werden als fehlend markiert — es werden keine plausiblen Werte erfunden.',
|
||||
enabled: true,
|
||||
schedule: 'nach dem Bildimport',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.IMMOTOP2,
|
||||
},
|
||||
{
|
||||
id: 'livia-task-15',
|
||||
title: 'Angebots- beziehungsweise Offertenbroschüre erstellen',
|
||||
description:
|
||||
'Setzt aus den erfassten Objektdaten, Texten, Bildern und Anhängen die Broschüre in der Firmen-CI zusammen und stellt sie als PDF und Word zum Export bereit. Speichern und Erstellen bleiben getrennte Schritte.',
|
||||
enabled: true,
|
||||
schedule: 'auf Auslösung im Exposé-Arbeitsbereich',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.DMS,
|
||||
},
|
||||
],
|
||||
|
||||
channels: [
|
||||
|
||||
@@ -25,7 +25,7 @@ import {
|
||||
export const noraAgent: TeamAgent = {
|
||||
id: 'nora',
|
||||
name: 'Nora',
|
||||
role: 'Markt-Scout',
|
||||
role: 'Marktchancen / Leads',
|
||||
personnelNumber: 'PO-ZD-19',
|
||||
department: 'Marktbeobachtung',
|
||||
email: 'nora@property-on.ch',
|
||||
|
||||
@@ -1,398 +0,0 @@
|
||||
import type { TeamAgent } from '../../domain/teamAgent'
|
||||
import {
|
||||
AgentStatus,
|
||||
AgentAutonomyLevel,
|
||||
AgentChannelType,
|
||||
AgentChannelDirection,
|
||||
AgentConnectionStatus,
|
||||
AgentSystemType,
|
||||
AgentAccessLevel,
|
||||
AgentSettingKind,
|
||||
AgentSettingGroup,
|
||||
AgentAvatarTone,
|
||||
} from '../../domain/teamAgent'
|
||||
|
||||
/**
|
||||
* Reto — Recap-Agent der Vermarktung.
|
||||
*
|
||||
* Nimmt Sprachmemos und Kurztexte nach Besichtigungen und Telefonaten entgegen und
|
||||
* legt daraus ein sauberes Protokoll, einen CRM-Entwurf und Folgeaufgaben vor.
|
||||
* Geschrieben wird nie ohne die 1-Klick-Freigabe der Bewirtschafterin oder des
|
||||
* Bewirtschafters.
|
||||
*/
|
||||
export const retoAgent: TeamAgent = {
|
||||
id: 'reto',
|
||||
name: 'Reto',
|
||||
role: 'Recap-Agent',
|
||||
personnelNumber: 'PO-ZD-14',
|
||||
department: 'Vermarktung',
|
||||
email: 'reto@property-on.ch',
|
||||
avatarTone: AgentAvatarTone.SIGNAL,
|
||||
status: AgentStatus.ACTIVE,
|
||||
autonomyLevel: AgentAutonomyLevel.APPROVAL_REQUIRED,
|
||||
shortDescription: 'Macht aus Sprachmemos strukturierte Protokolle, CRM-Einträge und Folgeaufgaben.',
|
||||
autonomyNote: '«Mit 1-Klick-Freigabe»',
|
||||
|
||||
profile: {
|
||||
purpose:
|
||||
'Reto verwandelt das gesprochene Wort nach einer Besichtigung oder einem Telefonat in ein sauberes Protokoll, einen CRM-Entwurf und konkrete Folgeaufgaben — freigegeben mit einem einzigen Klick.',
|
||||
input: [
|
||||
'Sprachmemo per WhatsApp direkt vom Objekt, etwa nach einer Besichtigung in Zürich-Altstetten',
|
||||
'Telefonaufnahme aus einem Interessentengespräch',
|
||||
'Kurztext oder Stichwortnotiz per E-Mail',
|
||||
'Termin-Kontext aus dem Kalender: Objekt, Interessent, Uhrzeit, Teilnehmende',
|
||||
],
|
||||
coreFlow: [
|
||||
'Memo entgegennehmen und das Gesprochene in Text übertragen',
|
||||
'Füllwörter, Wiederholungen und Nebengeräusche entfernen',
|
||||
'Aussagen sortieren nach Feedback, Einwänden, Zusagen und offenen Punkten',
|
||||
'Termin-Kontext ergänzen: Objekt, Interessent, Datum, Teilnehmende',
|
||||
'Protokoll, CRM-Entwurf und Aufgabenliste als Vorschlag zusammenstellen',
|
||||
'Zur 1-Klick-Bestätigung vorlegen und erst danach in die Zielsysteme übertragen',
|
||||
],
|
||||
output: [
|
||||
'Besichtigungsprotokoll als abgelegtes Dokument im Dossier',
|
||||
'CRM-Entwurf mit Gesprächsnotiz, Interessentenstatus und nächstem Schritt',
|
||||
'Folgeaufgaben mit Fälligkeit und zuständiger Person',
|
||||
'Objektbeobachtungen für die Bewirtschaftung, etwa Mängel oder Rückfragen zum Ausbau',
|
||||
],
|
||||
},
|
||||
|
||||
responsibilities: [
|
||||
'Jedes Gespräch der Vermarktung ist am selben Tag protokolliert und im Dossier auffindbar.',
|
||||
'Feedback, Einwände und Zusagen der Interessenten sind strukturiert festgehalten, nicht nur als Fliesstext.',
|
||||
'Kein Eintrag gelangt ohne ausdrückliche Freigabe in CRM, Dossier oder Aufgabenliste.',
|
||||
'Termine ohne Recap werden aktiv nachgefasst, damit keine Zusage verloren geht.',
|
||||
],
|
||||
|
||||
tasks: [
|
||||
{
|
||||
id: 'reto-task-01',
|
||||
title: 'Sprachmemo oder Kurztext entgegennehmen',
|
||||
description:
|
||||
'Nimmt Sprachmemos aus WhatsApp, Telefonaufnahmen und Kurztexte per E-Mail entgegen und ordnet sie über Zeitpunkt und Objektbezug dem richtigen Termin zu — etwa der Besichtigung an der Technoparkstrasse in Winterthur.',
|
||||
enabled: true,
|
||||
schedule: 'bei Eingang',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.WHATSAPP,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-02',
|
||||
title: 'Sprache transkribieren',
|
||||
description:
|
||||
'Überträgt das Gesprochene in Text, inklusive Schweizer Ortsnamen, Objektbezeichnungen und Fachbegriffen aus der Bewirtschaftung. Unsichere Stellen werden markiert statt geraten.',
|
||||
enabled: true,
|
||||
schedule: 'unmittelbar nach Eingang des Memos',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.PHONE_VOICE,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-03',
|
||||
title: 'Inhalt bereinigen',
|
||||
description:
|
||||
'Entfernt Füllwörter, Versprecher und Wiederholungen, ordnet die Sätze chronologisch und behält dabei jede inhaltliche Aussage unverändert bei.',
|
||||
enabled: true,
|
||||
schedule: 'direkt nach der Transkription',
|
||||
requiresApproval: false,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-04',
|
||||
title: 'Feedback, Einwände und Zusagen strukturieren',
|
||||
description:
|
||||
'Trennt das Gespräch in vier Blöcke: positives Feedback zum Objekt, Einwände wie Fläche oder Mietzins, verbindliche Zusagen beider Seiten und offene Fragen. Jeder Punkt behält den Bezug zur Aussage im Memo.',
|
||||
enabled: true,
|
||||
schedule: 'nach der Bereinigung',
|
||||
requiresApproval: false,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-05',
|
||||
title: 'Nächste Schritte identifizieren',
|
||||
description:
|
||||
'Leitet aus Zusagen und offenen Fragen die konkreten nächsten Schritte ab — Unterlagen nachreichen, Zweitbesichtigung ansetzen, Mietzins intern klären — je mit Frist und zuständiger Person.',
|
||||
enabled: true,
|
||||
schedule: 'nach der Strukturierung',
|
||||
requiresApproval: false,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-06',
|
||||
title: 'CRM- und Protokolleinträge vorschlagen',
|
||||
description:
|
||||
'Stellt den Entwurf für die Gesprächsnotiz im CRM und das Besichtigungsprotokoll für das Objektdossier zusammen. Beides bleibt Vorschlag, bis die Freigabe erteilt ist.',
|
||||
enabled: true,
|
||||
schedule: 'nach der Strukturierung',
|
||||
requiresApproval: true,
|
||||
dependsOnSystem: AgentSystemType.CRM,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-07',
|
||||
title: 'Aufgaben aus dem Gespräch ableiten',
|
||||
description:
|
||||
'Formuliert aus den nächsten Schritten einzelne Aufgaben mit Titel, Fälligkeit und Zuständigkeit — etwa «Grundrisse 3. OG an Interessent senden, bis 22.05.2026». Die Aufgaben werden erst nach Bestätigung angelegt.',
|
||||
enabled: true,
|
||||
schedule: 'nach der Strukturierung',
|
||||
requiresApproval: true,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-08',
|
||||
title: 'Ergebnis zur 1-Klick-Bestätigung vorlegen',
|
||||
description:
|
||||
'Legt Protokoll, CRM-Entwurf und Aufgabenliste in einer Übersicht vor. Alles lässt sich vor dem Bestätigen anpassen; ein Klick gibt das gesamte Paket frei.',
|
||||
enabled: true,
|
||||
schedule: 'sobald der Entwurf vollständig ist',
|
||||
requiresApproval: false,
|
||||
dependsOnChannel: AgentChannelType.WORKSPACE_CHAT,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-09',
|
||||
title: 'Nach Bestätigung simuliert ins Zielsystem schreiben',
|
||||
description:
|
||||
'Überträgt das freigegebene Paket simuliert in das eingestellte Zielsystem: Gesprächsnotiz ins CRM, Protokoll ins Dossier, Aufgaben in die Aufgabenliste. Steht kein CRM- oder ERP-Zugang zur Verfügung, greift der eingestellte CRM-/ERP-Fallback und das Paket geht als strukturierte E-Mail an die zuständige Person. Ohne Freigabe passiert nichts.',
|
||||
enabled: true,
|
||||
schedule: 'unmittelbar nach der Freigabe',
|
||||
requiresApproval: true,
|
||||
dependsOnSystem: AgentSystemType.CRM,
|
||||
},
|
||||
{
|
||||
id: 'reto-task-10',
|
||||
title: 'Drei Stunden nach Termin an fehlendes Diktat erinnern',
|
||||
description:
|
||||
'Prüft nach jedem Vermarktungstermin im Kalender, ob ein Memo eingegangen ist. Fehlt es, folgt eine kurze Erinnerung mit Objekt und Interessent auf demselben Weg, auf dem sonst diktiert wird.',
|
||||
enabled: true,
|
||||
schedule: 'drei Stunden nach Terminende',
|
||||
requiresApproval: false,
|
||||
dependsOnSystem: AgentSystemType.CALENDAR,
|
||||
},
|
||||
],
|
||||
|
||||
channels: [
|
||||
{
|
||||
id: 'reto-ch-whatsapp',
|
||||
type: AgentChannelType.WHATSAPP,
|
||||
direction: AgentChannelDirection.INBOUND,
|
||||
description:
|
||||
'Hauptweg für Sprachmemos direkt nach der Besichtigung — diktiert im Auto oder im Treppenhaus, ganz ohne Formular.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Reto Diktat (WhatsApp)',
|
||||
inboxAddress: '+41 44 500 21 14',
|
||||
defaultRecipients: ['vermarktung@property-on.ch'],
|
||||
autoReplyEnabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'reto-ch-phone',
|
||||
type: AgentChannelType.PHONE_VOICE,
|
||||
direction: AgentChannelDirection.INBOUND,
|
||||
description:
|
||||
'Diktatnummer für längere Gesprächsnotizen und Telefonaufnahmen aus Interessentengesprächen.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Reto Diktatlinie',
|
||||
inboxAddress: '+41 44 500 21 15',
|
||||
defaultRecipients: ['vermarktung@property-on.ch'],
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'reto-ch-email',
|
||||
type: AgentChannelType.EMAIL,
|
||||
direction: AgentChannelDirection.BOTH,
|
||||
description:
|
||||
'Nimmt Kurztexte und Stichwortnotizen entgegen und versendet das fertige Protokoll sowie den strukturierten Fallback.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Reto — Recap Vermarktung',
|
||||
senderAddress: 'reto@property-on.ch',
|
||||
inboxAddress: 'recap@property-on.ch',
|
||||
defaultRecipients: ['vermarktung@property-on.ch', 'bewirtschaftung@property-on.ch'],
|
||||
autoReplyEnabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'reto-ch-chat',
|
||||
type: AgentChannelType.WORKSPACE_CHAT,
|
||||
direction: AgentChannelDirection.OUTBOUND,
|
||||
description:
|
||||
'Legt die Freigabekarte mit Protokoll, CRM-Entwurf und Aufgaben im Arbeitsbereich vor und erinnert dort an fehlende Diktate.',
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
enabled: true,
|
||||
config: {
|
||||
displayName: 'Property On — Vermarktung',
|
||||
defaultRecipients: ['#vermarktung-zuerich', '#vermarktung-winterthur'],
|
||||
autoReplyEnabled: false,
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
systems: [
|
||||
{
|
||||
id: 'reto-sys-crm',
|
||||
type: AgentSystemType.CRM,
|
||||
access: AgentAccessLevel.WRITE,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Legt Gesprächsnotiz, Interessentenstatus und nächsten Schritt beim passenden Kontakt und Objekt ab.',
|
||||
permissionNote:
|
||||
'Schreibt ausschliesslich nach der 1-Klick-Freigabe — und in dieser Ausbaustufe nur simuliert. Ohne Bestätigung entsteht kein Eintrag.',
|
||||
},
|
||||
{
|
||||
id: 'reto-sys-immotop2',
|
||||
type: AgentSystemType.IMMOTOP2,
|
||||
access: AgentAccessLevel.READ,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Liest Objekt- und Flächendaten, damit Protokoll und Notiz die richtige Liegenschaft, Einheit und Fläche nennen.',
|
||||
permissionNote: 'Nur lesender Zugang. Reto verändert keine Objekt- oder Vertragsdaten.',
|
||||
},
|
||||
{
|
||||
id: 'reto-sys-dms',
|
||||
type: AgentSystemType.DMS,
|
||||
access: AgentAccessLevel.READ_WRITE,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Liest bestehende Protokolle desselben Objekts und legt das freigegebene Besichtigungsprotokoll im Objektdossier ab.',
|
||||
permissionNote:
|
||||
'Ablage erfolgt erst nach Freigabe und nur im Dossier des betroffenen Objekts. Bestehende Dokumente werden nie überschrieben.',
|
||||
},
|
||||
{
|
||||
id: 'reto-sys-calendar',
|
||||
type: AgentSystemType.CALENDAR,
|
||||
access: AgentAccessLevel.READ,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Holt den Termin-Kontext: Objekt, Interessent, Uhrzeit und Teilnehmende — und erkennt Termine ohne Recap.',
|
||||
permissionNote: 'Nur lesender Zugang. Es werden keine Termine erstellt, verschoben oder abgesagt.',
|
||||
},
|
||||
{
|
||||
id: 'reto-sys-exchange',
|
||||
type: AgentSystemType.M365_EXCHANGE,
|
||||
access: AgentAccessLevel.READ_WRITE,
|
||||
status: AgentConnectionStatus.CONNECTED,
|
||||
usage:
|
||||
'Empfängt Kurztexte aus dem Postfach und versendet Protokoll sowie strukturierten Fallback an die zuständige Person.',
|
||||
permissionNote:
|
||||
'Versand nur an interne Adressen der eigenen Organisation und erst nach Freigabe. Interessenten erhalten nie automatisch eine Nachricht.',
|
||||
},
|
||||
],
|
||||
|
||||
settings: [
|
||||
{
|
||||
id: 'reto-set-structure',
|
||||
label: 'Standardstruktur des Recaps',
|
||||
description: 'Welche Blöcke jedes Protokoll enthält. Leere Blöcke werden im Ergebnis ausgeblendet.',
|
||||
kind: AgentSettingKind.MULTI_SELECT,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: ['SUMMARY', 'FEEDBACK', 'OBJECTIONS', 'COMMITMENTS', 'NEXT_STEPS', 'OBJECT_NOTES'],
|
||||
options: [
|
||||
{ value: 'SUMMARY', label: 'Kurzfazit in zwei Sätzen' },
|
||||
{ value: 'FEEDBACK', label: 'Feedback zum Objekt' },
|
||||
{ value: 'OBJECTIONS', label: 'Einwände und Bedenken' },
|
||||
{ value: 'COMMITMENTS', label: 'Zusagen beider Seiten' },
|
||||
{ value: 'NEXT_STEPS', label: 'Nächste Schritte' },
|
||||
{ value: 'OBJECT_NOTES', label: 'Objektbeobachtungen für die Bewirtschaftung' },
|
||||
{ value: 'PARTICIPANTS', label: 'Teilnehmende und Rollen' },
|
||||
{ value: 'BUDGET', label: 'Mietzins- und Kostenthemen' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'reto-set-crm-target',
|
||||
label: 'CRM-Zielsystem',
|
||||
description: 'Wohin die freigegebene Gesprächsnotiz übertragen wird.',
|
||||
kind: AgentSettingKind.SELECT,
|
||||
group: AgentSettingGroup.DELIVERY,
|
||||
value: 'IMMOTOP2_CRM',
|
||||
options: [
|
||||
{ value: 'IMMOTOP2_CRM', label: 'ImmoTop2 — Interessentenbetreuung' },
|
||||
{ value: 'ABACUS_ABAIMMO', label: 'Abacus AbaImmo' },
|
||||
{ value: 'RIMO_R5', label: 'Rimo R5' },
|
||||
{ value: 'GARAIO_REM', label: 'Garaio REM' },
|
||||
{ value: 'INTERNAL_CRM', label: 'Property On — internes Kontaktjournal' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'reto-set-fallback',
|
||||
label: 'Fallback-Ziel',
|
||||
description:
|
||||
'Was geschieht, wenn das CRM- oder ERP-System keinen Zugang für den Eintrag bereitstellt oder nicht erreichbar ist.',
|
||||
kind: AgentSettingKind.SELECT,
|
||||
group: AgentSettingGroup.DELIVERY,
|
||||
value: 'STRUCTURED_MAIL',
|
||||
options: [
|
||||
{ value: 'STRUCTURED_MAIL', label: 'Strukturierter Mail-Fallback an die zuständige Person' },
|
||||
{ value: 'DMS_DOSSIER', label: 'Ablage als Protokoll im Objektdossier' },
|
||||
{ value: 'WORKSPACE_CARD', label: 'Karte im Arbeitsbereich der Vermarktung' },
|
||||
{ value: 'HOLD', label: 'Zurückhalten und erneut zur Bestätigung vorlegen' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'reto-set-approval-locked',
|
||||
label: 'Freigabe zwingend aktiv',
|
||||
description: 'Jedes Ergebnis wird vor der Übertragung zur Bestätigung vorgelegt.',
|
||||
kind: AgentSettingKind.BOOLEAN,
|
||||
group: AgentSettingGroup.APPROVAL,
|
||||
value: true,
|
||||
locked: true,
|
||||
lockedReason:
|
||||
'Fachlich nicht abschaltbar: Ohne erteilte Freigabe schreibt Reto nie in ein Zielsystem — weder ins CRM noch ins Dossier noch in die Aufgabenliste.',
|
||||
},
|
||||
{
|
||||
id: 'reto-set-reminder-hours',
|
||||
label: 'Erinnerung nach Termin',
|
||||
description: 'Nach wie vielen Stunden ohne Diktat eine Erinnerung ausgelöst wird.',
|
||||
kind: AgentSettingKind.NUMBER,
|
||||
group: AgentSettingGroup.SPECIFIC,
|
||||
value: 3,
|
||||
unit: 'Stunden',
|
||||
min: 1,
|
||||
max: 24,
|
||||
},
|
||||
{
|
||||
id: 'reto-set-auto-tasks',
|
||||
label: 'Aufgaben automatisch vorschlagen',
|
||||
description:
|
||||
'Leitet aus jedem Gespräch Folgeaufgaben mit Frist und Zuständigkeit ab. Angelegt werden sie erst nach der Freigabe.',
|
||||
kind: AgentSettingKind.BOOLEAN,
|
||||
group: AgentSettingGroup.GENERAL,
|
||||
value: true,
|
||||
},
|
||||
],
|
||||
|
||||
metrics: [
|
||||
{
|
||||
id: 'reto-metric-open-approvals',
|
||||
label: 'Offene Bestätigungen',
|
||||
value: '4',
|
||||
hint: 'Fertige Recaps, die auf die 1-Klick-Freigabe warten — älteste seit gestern 16:20.',
|
||||
},
|
||||
{
|
||||
id: 'reto-metric-processed',
|
||||
label: 'Verarbeitete Diktate',
|
||||
value: '128',
|
||||
hint: 'Seit dem 01.05.2026 entgegengenommene Sprachmemos und Kurztexte.',
|
||||
},
|
||||
{
|
||||
id: 'reto-metric-duration',
|
||||
label: 'Durchschnittliche Verarbeitungszeit',
|
||||
value: '2 Min. 40 Sek.',
|
||||
hint: 'Vom Eingang des Memos bis zum vorgelegten Recap.',
|
||||
},
|
||||
{
|
||||
id: 'reto-metric-tasks-created',
|
||||
label: 'Erstellte Aufgaben',
|
||||
value: '96',
|
||||
hint: 'Nach Freigabe angelegte Folgeaufgaben, davon 11 aktuell überfällig.',
|
||||
},
|
||||
{
|
||||
id: 'reto-metric-missing-recaps',
|
||||
label: 'Termine ohne Recap',
|
||||
value: '3',
|
||||
hint: 'Vermarktungstermine der letzten sieben Tage ohne eingegangenes Diktat.',
|
||||
},
|
||||
],
|
||||
|
||||
headlineMetricId: 'reto-metric-open-approvals',
|
||||
lastRun: '2026-05-20T16:42:00.000Z',
|
||||
}
|
||||
@@ -23,7 +23,7 @@ import {
|
||||
export const sinaAgent: TeamAgent = {
|
||||
id: 'sina',
|
||||
name: 'Sina',
|
||||
role: 'Vertragsauskunft',
|
||||
role: 'Datenpflege',
|
||||
personnelNumber: 'PO-ZD-03',
|
||||
department: 'Bewirtschaftung',
|
||||
email: 'sina@property-on.ch',
|
||||
|
||||
@@ -200,7 +200,7 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
tenantName: 'Admin User',
|
||||
tenantCompany: 'Mobimo Management AG',
|
||||
tenantEmail: 'admin@ideal-sharing.ch',
|
||||
propertyManagerName: 'Reto Mäder',
|
||||
propertyManagerName: 'Rico Mäder',
|
||||
propertyManagerCompany: 'Allreal AG',
|
||||
propertyAddress: 'Logistikfläche Dreispitz Basel',
|
||||
subject: 'Anfrage: Logistikfläche Dreispitz Basel',
|
||||
@@ -228,9 +228,9 @@ export const mockDemandInquiries: Inquiry[] = [
|
||||
id: 'dmsg-005-2',
|
||||
inquiryId: 'dinq-005',
|
||||
senderType: 'supply_user',
|
||||
senderName: 'Reto Mäder',
|
||||
senderName: 'Rico Mäder',
|
||||
body:
|
||||
'Guten Tag\n\nJa, die Fläche ist noch verfügbar. Wir haben ca. 1\'800 m² mit 5.5 m Hallenhöhe und zwei Rampen. Besichtigung möglich ab nächster Woche. Anbei das Datenblatt.\n\nFreundliche Grüsse\nReto Mäder\nAllreal AG',
|
||||
'Guten Tag\n\nJa, die Fläche ist noch verfügbar. Wir haben ca. 1\'800 m² mit 5.5 m Hallenhöhe und zwei Rampen. Besichtigung möglich ab nächster Woche. Anbei das Datenblatt.\n\nFreundliche Grüsse\nRico Mäder\nAllreal AG',
|
||||
attachments: [
|
||||
{ id: 'datt-005-1', fileName: 'Datenblatt_Dreispitz_Logistik.pdf', fileType: 'application/pdf', fileSize: 1100000 },
|
||||
],
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* Property On — Leads im Backlog von Livia.
|
||||
*
|
||||
* Herkunft: Nachfragesignale, die Nora erkannt hat, plus zwei bereits
|
||||
* abgeschlossene Vorgänge im Archiv. Sämtliche Objekt-IDs stammen aus
|
||||
* «Meine Objekte» (`mock-data/properties.ts`) — es werden hier keine Objekte
|
||||
* erfunden, sonst führte die Objektempfehlung ins Leere.
|
||||
*
|
||||
* Zeitanker: 20.05.2026, wie alle Property-On-Mockdaten.
|
||||
*/
|
||||
|
||||
import type { ExposeLead } from '../domain/exposeLead'
|
||||
import { ExposeLeadStatus } from '../domain/exposeLead'
|
||||
|
||||
export const mockExposeLeads: ExposeLead[] = [
|
||||
{
|
||||
id: 'lead-001',
|
||||
receivedAt: '2026-05-19T14:20:00.000Z',
|
||||
prospect: 'Alpbach Advisors AG',
|
||||
contacts: ['zuerich@alpbach-advisors.ch', 'https://alpbach-advisors.ch', 'Dr. Markus Suter (Managing Partner)'],
|
||||
locationHint: 'Zürich, Innenstadt / Paradeplatz',
|
||||
propertyIds: ['prop-043', 'prop-044'],
|
||||
status: ExposeLeadStatus.ACTIVE,
|
||||
sourceSignalId: 'signal-001',
|
||||
forwardedBy: 'Nadine Brunner',
|
||||
},
|
||||
{
|
||||
id: 'lead-002',
|
||||
receivedAt: '2026-05-18T09:05:00.000Z',
|
||||
prospect: 'Novabio Pharma AG',
|
||||
contacts: ['https://novabio-pharma.ch'],
|
||||
locationHint: 'Basel, Allschwil',
|
||||
propertyIds: ['prop-008'],
|
||||
status: ExposeLeadStatus.ACTIVE,
|
||||
sourceSignalId: 'signal-004',
|
||||
forwardedBy: 'Nadine Brunner',
|
||||
},
|
||||
{
|
||||
id: 'lead-003',
|
||||
receivedAt: '2026-05-15T11:40:00.000Z',
|
||||
prospect: 'Textilhaus Zürich AG',
|
||||
contacts: ['kontakt@textilhaus-zuerich.ch'],
|
||||
locationHint: 'Zürich, Kreis 4 / Langstrasse',
|
||||
propertyIds: ['prop-040', 'prop-041', 'prop-046'],
|
||||
status: ExposeLeadStatus.ACTIVE,
|
||||
forwardedBy: 'Marc Wyss',
|
||||
},
|
||||
{
|
||||
id: 'lead-004',
|
||||
receivedAt: '2026-04-28T08:15:00.000Z',
|
||||
prospect: 'Helvetia Produktion GmbH',
|
||||
contacts: ['info@helvetia-produktion.ch'],
|
||||
locationHint: 'Pratteln / Basel-Land',
|
||||
propertyIds: ['prop-014'],
|
||||
status: ExposeLeadStatus.ARCHIVED,
|
||||
forwardedBy: 'Marc Wyss',
|
||||
},
|
||||
{
|
||||
id: 'lead-005',
|
||||
receivedAt: '2026-04-12T16:00:00.000Z',
|
||||
prospect: 'Schweizer Grosshandel AG',
|
||||
contacts: ['beschaffung@schweizer-grosshandel.ch'],
|
||||
locationHint: 'Winterthur',
|
||||
propertyIds: ['prop-009'],
|
||||
status: ExposeLeadStatus.ARCHIVED,
|
||||
forwardedBy: 'Nadine Brunner',
|
||||
},
|
||||
]
|
||||
+11
-13
@@ -1,38 +1,36 @@
|
||||
/**
|
||||
* Property On — Kernteam der sieben digitalen Mitarbeiter.
|
||||
* Property On — Kernteam der fünf digitalen Mitarbeitenden.
|
||||
*
|
||||
* Reihenfolge alphabetisch nach Vorname (§7.2 der Spezifikation): Bruno, Ferdi,
|
||||
* Lea, Livia, Nora, Reto, Sina. Die Agentenliste in der Personalverwaltung
|
||||
* rendert genau diese Reihenfolge, ohne selbst zu sortieren.
|
||||
* Reihenfolge nach Arbeitsablauf, nicht alphabetisch: Ferdi erkennt die Frist,
|
||||
* Bruno bereitet den Termin vor, Livia erstellt das Exposé, Nora findet die
|
||||
* Nachfrage, Sina hält die Objektdaten sauber. Genau diese Reihenfolge führt
|
||||
* auch das Agenten-Untermenü unter «Meine Agenten» (Runde 4, §2.2).
|
||||
*
|
||||
* Reto und Lea sind entfallen: Retos Aufgaben liegen vollständig bei Bruno,
|
||||
* Leas Angebots- und Exposé-Aufgaben bei Livia.
|
||||
*/
|
||||
|
||||
import type { TeamAgent } from '../domain/teamAgent'
|
||||
import { brunoAgent } from './agents/bruno'
|
||||
import { ferdiAgent } from './agents/ferdi'
|
||||
import { leaAgent } from './agents/lea'
|
||||
import { brunoAgent } from './agents/bruno'
|
||||
import { liviaAgent } from './agents/livia'
|
||||
import { noraAgent } from './agents/nora'
|
||||
import { retoAgent } from './agents/reto'
|
||||
import { sinaAgent } from './agents/sina'
|
||||
|
||||
export const mockTeamAgents: TeamAgent[] = [
|
||||
brunoAgent,
|
||||
ferdiAgent,
|
||||
leaAgent,
|
||||
brunoAgent,
|
||||
liviaAgent,
|
||||
noraAgent,
|
||||
retoAgent,
|
||||
sinaAgent,
|
||||
]
|
||||
|
||||
/** Stabile IDs — Mockdaten anderer Bestände referenzieren ausschliesslich diese. */
|
||||
export const AGENT_IDS = {
|
||||
BRUNO: 'bruno',
|
||||
FERDI: 'ferdi',
|
||||
LEA: 'lea',
|
||||
BRUNO: 'bruno',
|
||||
LIVIA: 'livia',
|
||||
NORA: 'nora',
|
||||
RETO: 'reto',
|
||||
SINA: 'sina',
|
||||
} as const
|
||||
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
/**
|
||||
* Property On — Besichtigungsaufträge bei Bruno.
|
||||
*
|
||||
* Sämtliche Objekte stammen aus «Meine Objekte» (`mock-data/properties.ts`) und
|
||||
* tragen deren ID und Titel unverändert. Interessenten und Firmen sind erfunden;
|
||||
* die Quellenangaben zeigen, wie Bruno belegte von unbelegten Angaben trennt.
|
||||
*
|
||||
* Zeitanker: 20.05.2026, wie alle Property-On-Mockdaten. Der Auftrag
|
||||
* `visit-001` liegt bewusst weniger als 24 Stunden voraus und hat noch keinen
|
||||
* angeforderten Bericht — daran zeigt sich die Warnung über die Glocke.
|
||||
*/
|
||||
|
||||
import type { VisitAssignment } from '../domain/visitAssignment'
|
||||
import { VisitRequestType } from '../domain/visitAssignment'
|
||||
|
||||
export const mockVisitAssignments: VisitAssignment[] = [
|
||||
{
|
||||
id: 'visit-001',
|
||||
scheduledAt: '2026-05-20T16:00:00.000Z',
|
||||
propertyId: 'prop-043',
|
||||
propertyTitle: 'Bürofläche Bahnhofstrasse 52',
|
||||
prospect: 'Alpbach Advisors AG',
|
||||
requestType: VisitRequestType.PREPARATION,
|
||||
origin: 'CRM — Termin der Vermarktung Zürich',
|
||||
preparation: {
|
||||
sellingPoints: [
|
||||
'Repräsentative Lage an der Bahnhofstrasse, fünf Gehminuten zum Paradeplatz.',
|
||||
'Bezugsbereite Fläche ohne Ausbauzeit — der angekündigte Standortstart bleibt haltbar.',
|
||||
'Direkte ÖV-Anbindung Hauptbahnhof für ein Team, das über mehrere Standorte pendelt.',
|
||||
],
|
||||
objections: [
|
||||
{
|
||||
objection: 'Der Mietzins liegt über dem Budget.',
|
||||
answer: 'Nettomiete und Nebenkosten getrennt ausweisen; der Ausbau ist im Zins enthalten und entfällt als Einmalinvestition.',
|
||||
},
|
||||
{
|
||||
objection: 'Die Fläche ist für 38 Mitarbeitende knapp bemessen.',
|
||||
answer: 'Belegungsplan mit Zellen- und Kombibüro zeigen; die Erweiterungsoption im gleichen Gebäude ansprechen.',
|
||||
},
|
||||
{
|
||||
objection: 'Der Bezugstermin ist zu spät.',
|
||||
answer: 'Verfügbarkeitsdatum aus dem Objektdossier nennen und Zwischenlösung im selben Portfolio anbieten.',
|
||||
},
|
||||
],
|
||||
locationReport:
|
||||
'Lagebericht von Livia: Zürich Kreis 1, Bahnhofstrasse — Finanzplatz mit hoher Repräsentationswirkung. ÖV-Güteklasse A, Hauptbahnhof rund 400 m. Nahversorgung und Gastronomie im unmittelbaren Umfeld. Keine bewilligten Grossbaustellen im Umkreis von 200 m.',
|
||||
prospectFindings: [
|
||||
{ statement: 'Zürich-Büro am 15.04. per Medienmitteilung angekündigt.', source: 'Medienmitteilung des Unternehmens' },
|
||||
{ statement: 'Sitz in Luzern, 38 Mitarbeitende, Vermögensverwaltung.', source: 'Handelsregistereintrag' },
|
||||
],
|
||||
reportRequested: false,
|
||||
audioAvailable: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'visit-002',
|
||||
scheduledAt: '2026-05-22T10:30:00.000Z',
|
||||
propertyId: 'prop-008',
|
||||
propertyTitle: 'Bürofläche Dreispitz Areal 9',
|
||||
prospect: 'Novabio Pharma AG',
|
||||
requestType: VisitRequestType.PREPARATION,
|
||||
origin: 'Chatauftrag des Bewirtschafters',
|
||||
preparation: {
|
||||
sellingPoints: [
|
||||
'Areal mit bestehender Life-Sciences-Nachbarschaft — kurze Wege zu Partnern und Zulieferern.',
|
||||
'Technisch belastbare Fläche: Deckenhöhe und Anlieferung sind für Laborausbau geeignet.',
|
||||
'Etappierbarer Bezug, falls die Laborerweiterung in zwei Schritten erfolgt.',
|
||||
],
|
||||
objections: [
|
||||
{
|
||||
objection: 'Die Laborinfrastruktur fehlt.',
|
||||
answer: 'Ausbaustandard und Trägerschaft aus dem Objektdossier zeigen; Mieterausbaubeitrag als Verhandlungspunkt benennen.',
|
||||
},
|
||||
{
|
||||
objection: 'Die Anbindung an Allschwil ist unklar.',
|
||||
answer: 'ÖV-Distanz und Autobahnanschluss aus dem Lagebericht nennen.',
|
||||
},
|
||||
{
|
||||
objection: 'Der Zeitplan der Erweiterung ist noch offen.',
|
||||
answer: 'Verfügbarkeit und Reservationsfrist nennen, ohne einen Termin zu behaupten, der nicht bestätigt ist.',
|
||||
},
|
||||
],
|
||||
locationReport:
|
||||
'Lagebericht von Livia: Basel Dreispitz — Transformationsareal mit gemischter Gewerbe- und Life-Sciences-Nutzung. Tramanbindung vorhanden, Autobahnanschluss rund 1,5 km.',
|
||||
prospectFindings: [
|
||||
{ statement: 'Kapazitätsausbau im Geschäftsbericht ausgewiesen.', source: 'Geschäftsbericht des Unternehmens' },
|
||||
],
|
||||
reportRequested: true,
|
||||
audioAvailable: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'visit-003',
|
||||
scheduledAt: '2026-05-19T14:00:00.000Z',
|
||||
propertyId: 'prop-040',
|
||||
propertyTitle: 'Ladenlokal Langstrasse 84',
|
||||
prospect: 'Textilhaus Zürich AG',
|
||||
requestType: VisitRequestType.FOLLOW_UP,
|
||||
origin: 'WhatsApp-Sprachnachricht des Maklers',
|
||||
followUp: {
|
||||
brokerInput:
|
||||
'Sprachnachricht direkt nach dem Termin: Fläche hat gefallen, Schaufensterfront war das Hauptthema. Mietzins wurde als zu hoch bezeichnet, aber nicht abgelehnt. Interessent will die Zahlen intern prüfen und meldet sich bis Ende Woche. Grundriss und Nebenkostenabrechnung sollen nachgereicht werden.',
|
||||
inputChannel: 'WhatsApp (Sprachnachricht, 1:47 min)',
|
||||
processingSteps: [
|
||||
'Sprachnachricht in Text übertragen, Füllwörter entfernt',
|
||||
'Aussagen getrennt nach Feedback, Einwänden, Zusagen und offenen Punkten',
|
||||
'Termin-Kontext aus dem Kalender ergänzt: Objekt, Interessent, Datum, Teilnehmende',
|
||||
'Zwei Folgeaufgaben abgeleitet: Grundriss senden, Nebenkostenabrechnung senden',
|
||||
],
|
||||
outputFileName: 'protokoll-langstrasse-84-19-05-2026.pdf',
|
||||
outputDescription: 'Besichtigungsprotokoll mit Kundennotiz fürs CRM',
|
||||
remarks: [
|
||||
'Protokoll im CRM am Vorgang des Interessenten abgelegt.',
|
||||
'Kundennotiz zusätzlich in der Dokumentenablage beim Objektdossier gespeichert.',
|
||||
'Mietzins-Einwand nicht als Absage gewertet — der Interessent hat eine Prüfung zugesagt.',
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'visit-004',
|
||||
scheduledAt: '2026-05-18T09:00:00.000Z',
|
||||
propertyId: 'prop-009',
|
||||
propertyTitle: 'Logistikzentrum Tössfeldstrasse 18',
|
||||
prospect: 'Schweizer Grosshandel AG',
|
||||
requestType: VisitRequestType.FOLLOW_UP,
|
||||
origin: 'Telefonnotiz aus dem CRM',
|
||||
followUp: {
|
||||
brokerInput:
|
||||
'Telefonisch nachbesprochen: Rampenanzahl und Andienung waren ausschlaggebend. Fläche grundsätzlich passend, aber der gewünschte Bezugstermin liegt drei Monate früher als angeboten.',
|
||||
inputChannel: 'Telefonnotiz (CRM)',
|
||||
processingSteps: [
|
||||
'Notiz aus dem CRM übernommen und strukturiert',
|
||||
'Offenen Punkt «Bezugstermin» als einzigen Blocker markiert',
|
||||
'Rückfrage an die Bewirtschaftung zur Verfügbarkeit formuliert',
|
||||
],
|
||||
outputFileName: 'kundennotiz-toessfeldstrasse-18-18-05-2026.pdf',
|
||||
outputDescription: 'Kundennotiz mit offenem Punkt zum Bezugstermin',
|
||||
remarks: [
|
||||
'Datei im CRM am Vorgang abgelegt.',
|
||||
'Keine Zusage zum vorgezogenen Bezugstermin gemacht — die Verfügbarkeit ist nicht bestätigt.',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
Reference in New Issue
Block a user