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
+331
View File
@@ -0,0 +1,331 @@
import type { Inquiry } from '../domain/inquiry'
export const mockInquiries: Inquiry[] = [
// 1 — NEW
{
id: 'inq-001',
organizationId: 'org-wincasa',
propertyId: 'prop-001',
tenantName: 'Sandra Meier',
tenantCompany: 'Innovatech AG',
tenantEmail: 'sandra.meier@innovatech.ch',
subject: 'Anfrage zu Bürofläche Zollstrasse 12',
message:
'Guten Tag\n\nWir interessieren uns für die Bürofläche an der Zollstrasse 12 in Zürich-West. Könnten wir bitte einen Besichtigungstermin in der kommenden Woche vereinbaren?\n\nFreundliche Grüsse\nSandra Meier',
status: 'new',
matchScore: 91,
createdAt: '2026-05-17T08:32:00Z',
updatedAt: '2026-05-17T08:32:00Z',
thread: [
{
id: 'msg-001-1',
inquiryId: 'inq-001',
senderType: 'tenant',
senderName: 'Sandra Meier',
subject: 'Anfrage zu Bürofläche Zollstrasse 12',
body:
'Guten Tag\n\nWir interessieren uns für die Bürofläche an der Zollstrasse 12 in Zürich-West. Könnten wir bitte einen Besichtigungstermin in der kommenden Woche vereinbaren?\n\nFreundliche Grüsse\nSandra Meier',
attachments: [],
createdAt: '2026-05-17T08:32:00Z',
},
],
},
// 2 — NEW
{
id: 'inq-002',
organizationId: 'org-wincasa',
propertyId: 'prop-009',
tenantName: 'Markus Frei',
tenantCompany: 'Frei Logistik AG',
tenantEmail: 'm.frei@frei-logistik.ch',
subject: 'Lagerfläche Winterthur — Verfügbarkeit?',
message:
'Sehr geehrte Damen und Herren\n\nIst Ihre Logistikfläche in Winterthur noch verfügbar? Wir benötigen ab September ca. 3000 m² mit Rampe und Hochregalmöglichkeit.\n\nMit freundlichen Grüssen\nMarkus Frei',
status: 'new',
matchScore: 85,
createdAt: '2026-05-17T11:14:00Z',
updatedAt: '2026-05-17T11:14:00Z',
thread: [
{
id: 'msg-002-1',
inquiryId: 'inq-002',
senderType: 'tenant',
senderName: 'Markus Frei',
subject: 'Lagerfläche Winterthur — Verfügbarkeit?',
body:
'Sehr geehrte Damen und Herren\n\nIst Ihre Logistikfläche in Winterthur noch verfügbar? Wir benötigen ab September ca. 3000 m² mit Rampe und Hochregalmöglichkeit.\n\nMit freundlichen Grüssen\nMarkus Frei',
attachments: [],
createdAt: '2026-05-17T11:14:00Z',
},
],
},
// 3 — NEW
{
id: 'inq-003',
organizationId: 'org-wincasa',
propertyId: 'prop-010',
tenantName: 'Laura Bianchi',
tenantCompany: 'Bianchi Mode GmbH',
tenantEmail: 'laura@bianchi-mode.ch',
subject: 'Retailfläche Löwenplatz — Detailunterlagen',
message:
'Guten Tag\n\nKönnten Sie uns bitte Detailunterlagen sowie einen Grundriss der Retailfläche am Löwenplatz zukommen lassen? Wir planen die Eröffnung unseres neuen Flagship-Stores im Frühjahr 2026.\n\nBesten Dank\nLaura Bianchi',
status: 'new',
matchScore: 88,
createdAt: '2026-05-16T15:50:00Z',
updatedAt: '2026-05-16T15:50:00Z',
thread: [
{
id: 'msg-003-1',
inquiryId: 'inq-003',
senderType: 'tenant',
senderName: 'Laura Bianchi',
subject: 'Retailfläche Löwenplatz — Detailunterlagen',
body:
'Guten Tag\n\nKönnten Sie uns bitte Detailunterlagen sowie einen Grundriss der Retailfläche am Löwenplatz zukommen lassen? Wir planen die Eröffnung unseres neuen Flagship-Stores im Frühjahr 2026.\n\nBesten Dank\nLaura Bianchi',
attachments: [],
createdAt: '2026-05-16T15:50:00Z',
},
],
},
// 4 — IN_PROGRESS
{
id: 'inq-004',
organizationId: 'org-wincasa',
propertyId: 'prop-012',
tenantName: 'Daniel Hofer',
tenantCompany: 'Hofer Treuhand AG',
tenantEmail: 'd.hofer@hofer-treuhand.ch',
subject: 'Bürofläche Zug — Konditionen',
message:
'Sehr geehrte Damen und Herren\n\nDie Büroflächen in Zug entsprechen genau unserem Profil. Bitte senden Sie uns die detaillierten Mietkonditionen sowie Informationen zu Nebenkosten und Mindestmietdauer.\n\nFreundliche Grüsse\nDaniel Hofer',
status: 'in_progress',
matchScore: 93,
createdAt: '2026-05-14T09:20:00Z',
updatedAt: '2026-05-15T14:00:00Z',
thread: [
{
id: 'msg-004-1',
inquiryId: 'inq-004',
senderType: 'tenant',
senderName: 'Daniel Hofer',
subject: 'Bürofläche Zug — Konditionen',
body:
'Sehr geehrte Damen und Herren\n\nDie Büroflächen in Zug entsprechen genau unserem Profil. Bitte senden Sie uns die detaillierten Mietkonditionen sowie Informationen zu Nebenkosten und Mindestmietdauer.\n\nFreundliche Grüsse\nDaniel Hofer',
attachments: [],
createdAt: '2026-05-14T09:20:00Z',
},
{
id: 'msg-004-2',
inquiryId: 'inq-004',
senderType: 'supply_user',
senderName: 'Wincasa AG',
subject: 'Re: Bürofläche Zug — Konditionen',
body:
'Guten Tag Herr Hofer\n\nVielen Dank für Ihr Interesse. Anbei finden Sie unser Exposé sowie die Konditionsübersicht. Gerne stehen wir für eine Besichtigung zur Verfügung — passt Ihnen Donnerstag oder Freitag dieser Woche?\n\nFreundliche Grüsse\nWincasa AG',
attachments: [
{ id: 'att-004-1', fileName: 'Expose_Zug.pdf', fileType: 'application/pdf', fileSize: 1240000 },
],
createdAt: '2026-05-15T14:00:00Z',
},
],
},
// 5 — IN_PROGRESS
{
id: 'inq-005',
organizationId: 'org-wincasa',
propertyId: 'prop-007',
tenantName: 'Petra Wyss',
tenantCompany: 'NorthStar Consulting',
tenantEmail: 'petra.wyss@northstar.ch',
subject: 'Büro Oerlikon — Grundriss & Ausbaustand',
message:
'Guten Tag\n\nDie Bürofläche an der Thurgauerstrasse interessiert uns sehr. Könnten Sie uns einen aktuellen Grundriss sowie Angaben zum Ausbaustand zukommen lassen?\n\nFreundliche Grüsse\nPetra Wyss',
status: 'in_progress',
matchScore: 79,
createdAt: '2026-05-13T13:10:00Z',
updatedAt: '2026-05-14T16:20:00Z',
thread: [
{
id: 'msg-005-1',
inquiryId: 'inq-005',
senderType: 'tenant',
senderName: 'Petra Wyss',
subject: 'Büro Oerlikon — Grundriss & Ausbaustand',
body:
'Guten Tag\n\nDie Bürofläche an der Thurgauerstrasse interessiert uns sehr. Könnten Sie uns einen aktuellen Grundriss sowie Angaben zum Ausbaustand zukommen lassen?\n\nFreundliche Grüsse\nPetra Wyss',
attachments: [],
createdAt: '2026-05-13T13:10:00Z',
},
{
id: 'msg-005-2',
inquiryId: 'inq-005',
senderType: 'supply_user',
senderName: 'Wincasa AG',
body:
'Guten Tag Frau Wyss\n\nAnbei der angefragte Grundriss. Die Fläche wurde 2024 vollständig saniert (Ausbau Standard plus). Wir freuen uns auf Ihre Rückmeldung.\n\nWincasa AG',
attachments: [
{ id: 'att-005-1', fileName: 'Grundriss_Thurgauerstr40.pdf', fileType: 'application/pdf', fileSize: 980000 },
],
createdAt: '2026-05-14T11:45:00Z',
},
{
id: 'msg-005-3',
inquiryId: 'inq-005',
senderType: 'tenant',
senderName: 'Petra Wyss',
body:
'Vielen Dank für die schnelle Rückmeldung. Wir würden gerne nächste Woche besichtigen — wie sieht es bei Ihnen aus?',
attachments: [],
createdAt: '2026-05-14T16:20:00Z',
},
],
},
// 6 — ANSWERED
{
id: 'inq-006',
organizationId: 'org-wincasa',
propertyId: 'prop-002',
tenantName: 'Thomas Brun',
tenantCompany: 'Schweizer Logistik GmbH',
tenantEmail: 't.brun@swisslogistik.ch',
subject: 'Lagerfläche Hardstrasse Basel',
message:
'Guten Tag\n\nWir suchen ab Juli eine Lagerfläche in Basel mit ca. 2500 m². Ihre Liegenschaft an der Hardstrasse entspricht unserem Profil. Können wir besichtigen?\n\nThomas Brun',
status: 'answered',
matchScore: 87,
createdAt: '2026-05-08T10:00:00Z',
updatedAt: '2026-05-10T09:30:00Z',
thread: [
{
id: 'msg-006-1',
inquiryId: 'inq-006',
senderType: 'tenant',
senderName: 'Thomas Brun',
subject: 'Lagerfläche Hardstrasse Basel',
body:
'Guten Tag\n\nWir suchen ab Juli eine Lagerfläche in Basel mit ca. 2500 m². Ihre Liegenschaft an der Hardstrasse entspricht unserem Profil. Können wir besichtigen?\n\nThomas Brun',
attachments: [],
createdAt: '2026-05-08T10:00:00Z',
},
{
id: 'msg-006-2',
inquiryId: 'inq-006',
senderType: 'supply_user',
senderName: 'Wincasa AG',
body:
'Sehr geehrter Herr Brun\n\nGerne. Wir haben einen Termin am 12. Mai um 10:00 Uhr vor Ort reserviert. Bitte bestätigen Sie kurz.\n\nWincasa AG',
attachments: [],
createdAt: '2026-05-09T08:15:00Z',
},
{
id: 'msg-006-3',
inquiryId: 'inq-006',
senderType: 'tenant',
senderName: 'Thomas Brun',
body:
'Bestätigt — wir sind dabei. Vielen Dank!',
attachments: [],
createdAt: '2026-05-10T09:30:00Z',
},
],
},
// 7 — ANSWERED
{
id: 'inq-007',
organizationId: 'org-wincasa',
propertyId: 'prop-008',
tenantName: 'Caroline Roth',
tenantCompany: 'Roth & Partner',
tenantEmail: 'c.roth@roth-partner.ch',
subject: 'Büro Dreispitz — Mietvertrag',
message:
'Guten Tag\n\nWir würden gerne einen Mietvertrag für die Bürofläche im Dreispitz aufsetzen. Bitte senden Sie uns die Vertragsvorlage.\n\nCaroline Roth',
status: 'answered',
matchScore: 82,
createdAt: '2026-05-05T09:00:00Z',
updatedAt: '2026-05-06T11:00:00Z',
thread: [
{
id: 'msg-007-1',
inquiryId: 'inq-007',
senderType: 'tenant',
senderName: 'Caroline Roth',
subject: 'Büro Dreispitz — Mietvertrag',
body:
'Guten Tag\n\nWir würden gerne einen Mietvertrag für die Bürofläche im Dreispitz aufsetzen. Bitte senden Sie uns die Vertragsvorlage.\n\nCaroline Roth',
attachments: [],
createdAt: '2026-05-05T09:00:00Z',
},
{
id: 'msg-007-2',
inquiryId: 'inq-007',
senderType: 'supply_user',
senderName: 'Wincasa AG',
body:
'Sehr geehrte Frau Roth\n\nVielen Dank für Ihre Anfrage. Anbei die Vertragsvorlage sowie die Anhangsdokumente. Wir freuen uns auf Ihre Rückmeldung.\n\nWincasa AG',
attachments: [
{ id: 'att-007-1', fileName: 'Mietvertrag_Dreispitz.pdf', fileType: 'application/pdf', fileSize: 540000 },
{ id: 'att-007-2', fileName: 'AGB.pdf', fileType: 'application/pdf', fileSize: 220000 },
],
createdAt: '2026-05-06T11:00:00Z',
},
],
},
// 8 — ARCHIVED
{
id: 'inq-008',
organizationId: 'org-wincasa',
propertyId: 'prop-011',
tenantName: 'Jonas Keller',
tenantCompany: 'Keller Maschinen AG',
tenantEmail: 'j.keller@keller-maschinen.ch',
subject: 'Produktionsfläche Bern',
message:
'Guten Tag\n\nWir suchen eine Produktionsfläche im Raum Bern. Ihre Liegenschaft erscheint passend, jedoch ist die Hallenhöhe etwas niedrig. Können Sie hier mehr Details geben?\n\nJonas Keller',
status: 'archived',
matchScore: 64,
createdAt: '2026-04-20T14:30:00Z',
updatedAt: '2026-04-25T10:00:00Z',
thread: [
{
id: 'msg-008-1',
inquiryId: 'inq-008',
senderType: 'tenant',
senderName: 'Jonas Keller',
subject: 'Produktionsfläche Bern',
body:
'Guten Tag\n\nWir suchen eine Produktionsfläche im Raum Bern. Ihre Liegenschaft erscheint passend, jedoch ist die Hallenhöhe etwas niedrig. Können Sie hier mehr Details geben?\n\nJonas Keller',
attachments: [],
createdAt: '2026-04-20T14:30:00Z',
},
{
id: 'msg-008-2',
inquiryId: 'inq-008',
senderType: 'supply_user',
senderName: 'Wincasa AG',
body:
'Sehr geehrter Herr Keller\n\nDie Hallenhöhe beträgt 5.2 m. Leider entspricht das nicht Ihren Anforderungen. Wir informieren Sie, sobald passendere Flächen verfügbar werden.\n\nWincasa AG',
attachments: [],
createdAt: '2026-04-22T09:00:00Z',
},
{
id: 'msg-008-3',
inquiryId: 'inq-008',
senderType: 'tenant',
senderName: 'Jonas Keller',
body:
'Danke für die Information — wir suchen weiter und melden uns wieder.',
attachments: [],
createdAt: '2026-04-25T10:00:00Z',
},
],
},
]