feat(agenten): Runde 8 — Livia recherchiert, Nora matcht, Ferdi liest Verträge
Livia wird von der Exposé-Master zur Research- & Market-Intelligence-Agentin.
Sie schaut nach draussen: verknüpfte Newsquellen, Geschäftsberichte,
Handelsregister und amtliche Publikationen werden zu qualitativen Leads
verdichtet — Unternehmen, Veränderung, Ort, Zeitpunkt, Begründung, Quellen.
Die Exposé-Funktion bleibt vollständig erhalten, ist aber nachgeordnet und
liegt im zweiten Reiter ihres Arbeitsplatzes.
Das Matching bleibt ausdrücklich bei Nora. Beide Arbeitsplätze teilen sich
dieselbe Liste (`UnifiedLeadList`) und dieselbe Detailansicht (`LeadDetail`);
bei Livia läuft sie mit `showMatching={false}`. Damit ist die Grenze im Code
gezogen und nicht bloss in der Beschriftung. Es gibt keine zweite Lead-Ablage:
ein Lead, zwei Arbeitsplätze.
Neu ist die Einordnung Chance/Risiko als Spalte in Noras Liste und als Block
in der Detailansicht, je mit Begründung und konkreter nächster Handlung. Bei
einem Risiko wird das betroffene Mietverhältnis benannt und auf internes
Re-Letting hingewiesen. `leadSignalTypeOf()` leitet die Einordnung für
Altbestände aus dem Signaltyp ab, damit keine Migration nötig ist.
Thomas bekommt denselben Chat-Einstieg wie die fünf anderen — dieselbe
Komponente, dieselbe Sticky-Mechanik, keine Sonderlösung. Dafür scrollt seine
Seite als Ganzes; die drei Verwaltungsbereiche behalten ihren inneren Scroll.
Ferdi wird vom Reminder-Agenten zur Contract Intelligence: Kündigungsfristen,
echte und unechte Optionen, Verhandlungsfenster und Vertragsgespräche. Der
Unterschied zwischen echter und unechter Option ist der Kern — die echte
Option hat eine Frist, die verfällt, die unechte nur ein Fenster, in dem
verhandelt werden sollte. Alle neuen Termine orientieren sich am
Entscheidungszeitpunkt, nicht am Vertragsende: `decisionDate` und `dueDate`
liegen bewusst davor.
Auslastungsanzeige nachgezogen: Livia zählt ihre Recherche statt offener
Exposés, Nora den Abgleich statt des Findens.
Geprüft: tsc 0 Fehler, eslint 0 Fehler/0 Warnungen, 423/423 Tests grün,
Produktionsbuild erfolgreich.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
55274488d1
commit
ba8dc39483
30 files changed
+1525
-370
No files matched your search
@@ -586,4 +586,192 @@ export const mockReminders: Reminder[] = [
|
||||
createdAt: '2026-03-10T08:00:00Z',
|
||||
updatedAt: '2026-04-19T11:00:00Z',
|
||||
},
|
||||
|
||||
// ─── Contract Intelligence (Runde 8, §4) ───────────────────────────────────
|
||||
//
|
||||
// Diese Termine stammen aus der Vertragsanalyse, nicht aus einer Terminliste.
|
||||
// Gemeinsam ist ihnen, dass `dueDate` und `decisionDate` deutlich vor
|
||||
// `contractEndDate` liegen — Ferdi erinnert an den Entscheid, nicht an das
|
||||
// Ende. Ein Reminder auf das Vertragsende käme für jede Entscheidung zu spät,
|
||||
// die ihn nötig gemacht hat.
|
||||
|
||||
// Echte Option — die Ausübungsfrist verfällt, danach ist das Recht erloschen.
|
||||
{
|
||||
id: 'rem-022',
|
||||
type: ReminderType.REAL_OPTION,
|
||||
priority: ReminderPriority.URGENT,
|
||||
status: ReminderStatus.ACTIVE,
|
||||
propertyId: 'prop-012',
|
||||
propertyTitle: 'Bürofläche Stadtturm Zug',
|
||||
propertyCity: 'Zug',
|
||||
propertyDistrict: 'Zentrum',
|
||||
tenantName: 'FinTech Zug AG',
|
||||
dueDate: '2026-05-29',
|
||||
eventDate: '2026-06-30',
|
||||
contractEndDate: '2027-06-30',
|
||||
decisionDate: '2026-06-30',
|
||||
noticePeriodMonths: 12,
|
||||
contractRef: 'Mietvertrag FinTech Zug AG, 01.07.2019',
|
||||
contractClause: 'Ziffer 4.2, Verlängerungsoption',
|
||||
relevanceReason:
|
||||
'Der Mieter hat ein einseitiges Recht, den Vertrag um fünf Jahre zu verlängern — ausübbar nur bis zum 30.06.2026. Verstreicht der Termin, erlischt das Recht endgültig und die Fläche wird per 30.06.2027 frei.',
|
||||
recommendedAction:
|
||||
'Beim Mieter aktiv nachfragen, ob die Option ausgeübt wird. Bleibt die Antwort aus, die Neuvermarktung ab Juli vorbereiten — zwölf Monate Vorlauf sind für eine Bürofläche dieser Grösse in Zug knapp bemessen.',
|
||||
areaSqm: 640,
|
||||
currentRentPerSqm: 395,
|
||||
currency: 'CHF',
|
||||
shadowMarketRisk: ShadowMarketRisk.HIGH,
|
||||
schattenmarktEnabled: true,
|
||||
note: 'Option wurde bei Vertragsabschluss verhandelt und ist im Nachtrag 1 bestätigt.',
|
||||
activity: [
|
||||
{ at: '2026-02-02T08:00:00Z', by: 'Ferdi', action: 'CREATED', note: 'Aus Mietvertrag Ziffer 4.2 erkannt, durch Bewirtschaftung bestätigt' },
|
||||
],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-02-02T08:00:00Z',
|
||||
updatedAt: '2026-02-02T08:00:00Z',
|
||||
},
|
||||
|
||||
// Unechte Option — keine Frist, die verfällt, sondern ein Verhandlungsfenster.
|
||||
{
|
||||
id: 'rem-023',
|
||||
type: ReminderType.UNREAL_OPTION,
|
||||
priority: ReminderPriority.HIGH,
|
||||
status: ReminderStatus.ACTIVE,
|
||||
propertyId: 'prop-008',
|
||||
propertyTitle: 'Bürofläche Dreispitz Areal 9',
|
||||
propertyCity: 'Basel',
|
||||
propertyDistrict: 'Dreispitz',
|
||||
tenantName: 'Pharma Research GmbH',
|
||||
dueDate: '2026-06-15',
|
||||
eventDate: '2026-06-15',
|
||||
contractEndDate: '2027-12-31',
|
||||
decisionDate: '2026-09-30',
|
||||
negotiationWindowFrom: '2026-06-15',
|
||||
negotiationWindowTo: '2026-09-30',
|
||||
noticePeriodMonths: 6,
|
||||
contractRef: 'Mietvertrag Pharma Research GmbH, 15.01.2018',
|
||||
contractClause: 'Ziffer 6.4, Absichtserklärung zur Fortsetzung',
|
||||
relevanceReason:
|
||||
'Der Vertrag enthält keine echte Option, sondern die Abrede, spätestens 15 Monate vor Ablauf über eine Fortsetzung zu verhandeln. Es gibt hier keine Frist, die verfällt — wohl aber ein Fenster, nach dem sich der Mieter anderweitig bindet.',
|
||||
recommendedAction:
|
||||
'Gesprächstermin bis Mitte Juni ansetzen und mit einer Indikation zu Mietzins und Laufzeit hineingehen. Bis Ende September sollte eine Einigung stehen, damit im Fall einer Absage noch ein Jahr für die Neuvermietung bleibt.',
|
||||
areaSqm: 1180,
|
||||
currentRentPerSqm: 310,
|
||||
currency: 'CHF',
|
||||
shadowMarketRisk: ShadowMarketRisk.MEDIUM,
|
||||
schattenmarktEnabled: false,
|
||||
note: 'Mieter hat 2025 in den Laborausbau investiert — eine Fortsetzung ist wahrscheinlich, aber nicht zugesichert.',
|
||||
activity: [
|
||||
{ at: '2026-03-05T08:00:00Z', by: 'Ferdi', action: 'CREATED', note: 'Aus Mietvertrag Ziffer 6.4 erkannt, durch Bewirtschaftung bestätigt' },
|
||||
],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-03-05T08:00:00Z',
|
||||
updatedAt: '2026-03-05T08:00:00Z',
|
||||
},
|
||||
|
||||
// Kündigungsfrist — der letzte Zeitpunkt für eine fristgerechte Kündigung.
|
||||
{
|
||||
id: 'rem-024',
|
||||
type: ReminderType.NOTICE_PERIOD,
|
||||
priority: ReminderPriority.HIGH,
|
||||
status: ReminderStatus.ACTIVE,
|
||||
propertyId: 'prop-014',
|
||||
propertyTitle: 'Logistikhalle Pratteln Nord',
|
||||
propertyCity: 'Pratteln',
|
||||
propertyDistrict: 'Industriezone',
|
||||
tenantName: 'Handels- und Lagerbetrieb AG',
|
||||
dueDate: '2026-06-10',
|
||||
eventDate: '2026-06-30',
|
||||
contractEndDate: '2026-12-31',
|
||||
decisionDate: '2026-06-30',
|
||||
noticePeriodMonths: 6,
|
||||
contractRef: 'Mietvertrag Handels- und Lagerbetrieb AG, 01.01.2021',
|
||||
contractClause: 'Ziffer 3.1, Kündigung auf Vertragsende',
|
||||
relevanceReason:
|
||||
'Eine Kündigung auf den 31.12.2026 muss spätestens am 30.06.2026 beim Mieter eintreffen. Ab dem 01.07. verlängert sich der Vertrag automatisch um ein weiteres Jahr.',
|
||||
recommendedAction:
|
||||
'Bis zum 10.06. entscheiden, ob das Mietverhältnis fortgesetzt wird. Soll gekündigt werden, das Schreiben so aufsetzen, dass der Zugang bis zum 30.06. nachweisbar ist.',
|
||||
areaSqm: 2400,
|
||||
currentRentPerSqm: 128,
|
||||
currency: 'CHF',
|
||||
shadowMarketRisk: ShadowMarketRisk.MEDIUM,
|
||||
schattenmarktEnabled: false,
|
||||
activity: [
|
||||
{ at: '2026-01-15T08:00:00Z', by: 'Ferdi', action: 'CREATED', note: 'Aus Mietvertrag Ziffer 3.1 erkannt, durch Bewirtschaftung bestätigt' },
|
||||
],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-01-15T08:00:00Z',
|
||||
updatedAt: '2026-01-15T08:00:00Z',
|
||||
},
|
||||
|
||||
// Verhandlungsfenster vor dem Auslaufen einer Staffelmiete.
|
||||
{
|
||||
id: 'rem-025',
|
||||
type: ReminderType.NEGOTIATION_WINDOW,
|
||||
priority: ReminderPriority.MEDIUM,
|
||||
status: ReminderStatus.ACTIVE,
|
||||
propertyId: 'prop-001',
|
||||
propertyTitle: 'Bürofläche Zollstrasse 12',
|
||||
propertyCity: 'Zürich',
|
||||
propertyDistrict: 'Zürich-West',
|
||||
tenantName: 'MediaGroup Schweiz AG',
|
||||
dueDate: '2026-07-01',
|
||||
eventDate: '2026-10-01',
|
||||
contractEndDate: '2028-10-31',
|
||||
decisionDate: '2026-10-01',
|
||||
negotiationWindowFrom: '2026-07-01',
|
||||
negotiationWindowTo: '2026-10-01',
|
||||
contractRef: 'Nachtrag 2 zum Mietvertrag MediaGroup Schweiz AG, 12.09.2023',
|
||||
contractClause: 'Ziffer 2, Staffelmiete',
|
||||
relevanceReason:
|
||||
'Die vereinbarte Staffel läuft per 01.10.2026 aus. Danach greift die Indexklausel — über die Anschlussregelung ist vorher zu verhandeln, sonst gilt automatisch die für den Vermieter ungünstigere Variante.',
|
||||
recommendedAction:
|
||||
'Ab Juli die Vergleichsmieten im Kreis 5 zusammenstellen und dem Mieter bis spätestens Ende September eine Anschlussregelung vorlegen.',
|
||||
areaSqm: 850,
|
||||
currentRentPerSqm: 456,
|
||||
currency: 'CHF',
|
||||
shadowMarketRisk: ShadowMarketRisk.LOW,
|
||||
schattenmarktEnabled: false,
|
||||
activity: [
|
||||
{ at: '2026-04-08T08:00:00Z', by: 'Ferdi', action: 'CREATED', note: 'Aus Nachtrag 2 Ziffer 2 erkannt, durch Bewirtschaftung bestätigt' },
|
||||
],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-04-08T08:00:00Z',
|
||||
updatedAt: '2026-04-08T08:00:00Z',
|
||||
},
|
||||
|
||||
// Anstehendes Vertragsgespräch aus einem Begehungsprotokoll.
|
||||
{
|
||||
id: 'rem-026',
|
||||
type: ReminderType.CONTRACT_TALK,
|
||||
priority: ReminderPriority.MEDIUM,
|
||||
status: ReminderStatus.ACTIVE,
|
||||
propertyId: 'prop-022',
|
||||
propertyTitle: 'Bürofläche St.Gallen Centrum 7',
|
||||
propertyCity: 'St. Gallen',
|
||||
propertyDistrict: 'Centrum',
|
||||
tenantName: 'Werbeatelier SG GmbH',
|
||||
dueDate: '2026-06-24',
|
||||
eventDate: '2026-06-24',
|
||||
contractEndDate: '2027-03-31',
|
||||
decisionDate: '2026-06-24',
|
||||
noticePeriodMonths: 3,
|
||||
contractRef: 'Mietvertrag Werbeatelier SG GmbH, 01.04.2022',
|
||||
contractClause: 'Protokoll der Begehung vom 14.03.2026',
|
||||
relevanceReason:
|
||||
'Der Mieter hat bei der letzten Begehung eine Flächenreduktion um rund einen Drittel angesprochen. Zugesagt war ein Gespräch im zweiten Quartal — es hat bislang nicht stattgefunden.',
|
||||
recommendedAction:
|
||||
'Gespräch vor Ende Juni ansetzen und klären, ob die Reduktion weiterverfolgt wird. Fällt sie an, bleibt genug Zeit, die Teilfläche zusammen mit dem angrenzenden Abschnitt neu anzubieten.',
|
||||
areaSqm: 410,
|
||||
currentRentPerSqm: 268,
|
||||
currency: 'CHF',
|
||||
shadowMarketRisk: ShadowMarketRisk.MEDIUM,
|
||||
schattenmarktEnabled: true,
|
||||
activity: [
|
||||
{ at: '2026-03-16T08:00:00Z', by: 'Ferdi', action: 'CREATED', note: 'Aus dem Begehungsprotokoll erkannt, durch Bewirtschaftung bestätigt' },
|
||||
],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-03-16T08:00:00Z',
|
||||
updatedAt: '2026-03-16T08:00:00Z',
|
||||
},
|
||||
]
|
||||
Reference in new issue
Block a user