feat: F030 Anfragencenter — Aktive & Latente Anfragen + Angebot-Wizard

Neuer Menüpunkt «Anfragencenter» (ehemals «Eingehende Bedarfe»):

Aktive Anfragen:
- Split-View: Anfrageliste (Liste/Grid-Toggle) + Chat-Detailansicht
- Chat-Verlauf mit Sender-Styling (Mieter links, Supply rechts)
- Antwortformular mit Betreff, Nachricht, Anhänge, Statuswechsel
- Zugehörige Property Card neben dem Chat

Latente Anfragen:
- Drei-Spalten-Layout: Need-Liste | Need-Detail | Eigene Objekte
- Need Cards mit AI-Zusammenfassung, Must-Haves, Präferenzen
- Eigene Portfolio-Objekte sortiert nach deterministischem Match-Score
- Checkbox-Selektion für Angebotsauswahl

Angebot-Wizard (4 Schritte):
- Schritt 1: Objekte auswählen (mit Score-Vorschau)
- Schritt 2: PDF-Vorschau + editierbare Textfelder
- Schritt 3: Angebot prüfen & bestätigen
- Schritt 4: Nachricht an Suchenden mit KI-generierter Mail

Architektur:
- Domain: Inquiry, LatentNeed, OfferDraft Types
- Provider: IInquiryProvider, ILatentNeedProvider, IOfferProvider + Mockups
- Services: inquiryService, latentNeedService, offerService
- Hooks: useInquiries, useLatentNeeds, useOffers (TanStack Query)
- Store: offerWizardStore (Zustand, lokaler Wizard-State)
- 27 neue Komponenten, alle Loading/Empty/Error States

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-18 18:03:05 +02:00
parent 05ac0083b2
commit c4c29ef7d3
51 changed files with 4000 additions and 1 deletions
+174
View File
@@ -0,0 +1,174 @@
import { AssetType } from '../domain/enums'
import type { LatentNeed } from '../domain/latentNeed'
export const mockLatentNeeds: LatentNeed[] = [
{
id: 'lneed-001',
title: 'Modernes Büro für wachsendes Tech-Team',
tenantCompany: 'Helvetia Tech Labs AG',
assetType: AssetType.OFFICE,
desiredLocation: 'Zürich-West / Kreis 5',
sizeRange: { min: 700, max: 1100 },
budgetRange: { min: 32, max: 48 },
timing: 'Bezug ab Q4 2026, flexibel bis Q1 2027',
mustHaveCriteria: [
'ÖV-Anbindung unter 5 Min zu Fuss',
'Glasfaseranschluss',
'Klimaanlage in allen Räumen',
'Mindestens 2 Sitzungszimmer',
],
weightedPreferences: [
{ criterion: 'Standortprestige', weight: 0.25, description: 'Repräsentative Adresse für Kundenmeetings' },
{ criterion: 'Flexibilität Grundriss', weight: 0.20, description: 'Open Space mit modularen Wänden' },
{ criterion: 'ESG-Zertifizierung', weight: 0.15, description: 'Minergie oder vergleichbar' },
{ criterion: 'Erweiterungspotenzial', weight: 0.15, description: 'Wachstum auf bis zu 1500 m² möglich' },
{ criterion: 'Nähe zu Restaurants', weight: 0.10 },
],
aiSummary:
'Schnell wachsendes Software-Unternehmen sucht eine repräsentative Bürofläche in Zürich-West. Hoher Wert auf Flexibilität, ESG und Skalierbarkeit. Hohe Abschlusswahrscheinlichkeit bei passendem Objekt.',
publicVisibility: true,
status: 'public',
createdAt: '2026-05-02T10:00:00Z',
},
{
id: 'lneed-002',
title: 'Logistik-Hub Mittelland',
tenantCompany: 'NordWest Distribution GmbH',
assetType: AssetType.LOGISTICS,
desiredLocation: 'Region Basel / Pratteln / Muttenz',
sizeRange: { min: 2500, max: 5000 },
budgetRange: { min: 12, max: 18 },
timing: 'Bezug ab Januar 2027',
mustHaveCriteria: [
'Mindestens 2 Rampen',
'Hallenhöhe ≥ 8 m',
'Autobahnanschluss unter 5 Min',
'LKW-Wendekreis 18 m',
],
weightedPreferences: [
{ criterion: 'Andienungslogistik', weight: 0.30, description: 'Effiziente Be- und Entladung' },
{ criterion: '24/7-Betrieb möglich', weight: 0.25 },
{ criterion: 'Kühlmöglichkeit', weight: 0.20, description: 'Teilflächen kühlbar' },
{ criterion: 'Photovoltaik-Dach', weight: 0.15 },
{ criterion: 'Erweiterungspotenzial', weight: 0.10 },
],
aiSummary:
'Distributor mit Fokus auf Frischwaren sucht modernen Logistik-Hub in der Region Basel. Anforderungen sind klar definiert, Budget realistisch. Sehr hohe Match-Wahrscheinlichkeit mit verfügbaren Liegenschaften.',
publicVisibility: true,
status: 'public',
createdAt: '2026-04-28T09:30:00Z',
},
{
id: 'lneed-003',
title: 'Retail-Flagship in Top-Innenstadtlage',
tenantCompany: 'Aurum Concept Stores AG',
assetType: AssetType.RETAIL,
desiredLocation: 'Zürich Bahnhofstrasse / Löwenplatz / Innenstadt',
sizeRange: { min: 200, max: 450 },
budgetRange: { min: 80, max: 180 },
timing: 'Eröffnung Frühjahr 2027, frühester Bezug Q4 2026',
mustHaveCriteria: [
'Schaufenster mindestens 8 m breit',
'Hochwertige Passantenfrequenz',
'Stromanschluss ≥ 30 kW',
'Klimaanlage und Lüftung',
],
weightedPreferences: [
{ criterion: 'Lagequalität', weight: 0.40, description: 'Top-Frequenzlage mit Markenumfeld' },
{ criterion: 'Sichtbarkeit', weight: 0.25, description: 'Eckfläche oder freie Sichtachse' },
{ criterion: 'Deckenhöhe', weight: 0.15, description: 'Mindestens 3.5 m' },
{ criterion: 'Lagerfläche im UG', weight: 0.10 },
{ criterion: 'Architektur / Charme', weight: 0.10 },
],
aiSummary:
'Premium-Lifestyle-Marke sucht Flagship-Store an Top-Adresse. Budget grosszügig, Anforderungen anspruchsvoll. Sehr starkes Signal für Premium-Retailobjekte in Zürich.',
publicVisibility: true,
status: 'public',
createdAt: '2026-05-08T13:45:00Z',
},
{
id: 'lneed-004',
title: 'Backoffice-Standort Kanton Zug',
tenantCompany: 'Lakeside Capital Partners',
assetType: AssetType.OFFICE,
desiredLocation: 'Zug / Baar / Cham',
sizeRange: { min: 400, max: 700 },
budgetRange: { min: 30, max: 42 },
timing: 'Bezug spätestens Q3 2026',
mustHaveCriteria: [
'ÖV-Anbindung unter 10 Min',
'Mindestens 4 Parkplätze',
'Diskretes, repräsentatives Umfeld',
],
weightedPreferences: [
{ criterion: 'Standortprestige', weight: 0.30 },
{ criterion: 'Sicherheit / Zutrittskonzept', weight: 0.25 },
{ criterion: 'Steuerumfeld', weight: 0.20, description: 'Bevorzugt steuerattraktive Gemeinde' },
{ criterion: 'Architektonische Qualität', weight: 0.15 },
{ criterion: 'Erweiterungspotenzial', weight: 0.10 },
],
aiSummary:
'Vermögensverwalter sucht diskreten Backoffice-Standort im Kanton Zug. Klassisches Profil mit Fokus auf Diskretion und Steuerumfeld. Solides Match-Potenzial mit zentralen Zuger Liegenschaften.',
publicVisibility: true,
status: 'public',
createdAt: '2026-05-04T11:20:00Z',
},
{
id: 'lneed-005',
title: 'Stadtnahe Logistikfläche Raum Winterthur',
tenantCompany: 'PaketExpress Schweiz AG',
assetType: AssetType.LOGISTICS,
desiredLocation: 'Winterthur / Töss / Oberwinterthur',
sizeRange: { min: 1500, max: 3500 },
budgetRange: { min: 10, max: 16 },
timing: 'Bezug Q3 2026, hohe Dringlichkeit',
mustHaveCriteria: [
'Mindestens 4 Rampen',
'LKW-tauglicher Innenhof',
'24/7 Anlieferung erlaubt',
'Strom für E-Flottenladung skalierbar',
],
weightedPreferences: [
{ criterion: 'Stadtnähe', weight: 0.30, description: 'Letzte Meile zur Innenstadt' },
{ criterion: 'Anbindung an A1 / A7', weight: 0.25 },
{ criterion: 'Lademöglichkeiten E-Flotte', weight: 0.20 },
{ criterion: 'Flexibilität Vertrag', weight: 0.15 },
{ criterion: 'Erweiterungspotenzial', weight: 0.10 },
],
aiSummary:
'KEP-Dienstleister mit hoher Dringlichkeit sucht stadtnahe Logistikbasis. Sehr starkes Profil für Last-Mile-Hub. Verfügbare Winterthurer Lagerflächen sind hochrelevant.',
publicVisibility: true,
status: 'public',
createdAt: '2026-05-09T08:15:00Z',
},
{
id: 'lneed-006',
title: 'Pop-up-Retailfläche temporär 6 Monate',
tenantCompany: 'Nordic Living Concept',
assetType: AssetType.RETAIL,
desiredLocation: 'Zürich / Basel — zentrale Lage',
sizeRange: { min: 80, max: 200 },
timing: 'Bezug August 2026 — Vertragsdauer 6 Monate',
mustHaveCriteria: [
'Möblierbarkeit kurzfristig möglich',
'Schaufenster zur Strasse',
'Funktionierende Klimaanlage',
],
weightedPreferences: [
{ criterion: 'Lage / Frequenz', weight: 0.35 },
{ criterion: 'Vertragsflexibilität', weight: 0.30, description: 'Kurzfristige Verträge möglich' },
{ criterion: 'Renovationsstand', weight: 0.20, description: 'Sofort einzugsbereit' },
{ criterion: 'Sichtbarkeit', weight: 0.15 },
],
aiSummary:
'Skandinavische Lifestyle-Marke sucht Pop-up-Fläche für 6 Monate. Niedrige Bindung, aber hohe Lageansprüche. Geeignet für Zwischenvermietung von Top-Retailflächen.',
publicVisibility: true,
status: 'paused',
createdAt: '2026-04-15T15:00:00Z',
},
]