feat: role-aware UX, market intelligence, score fix & layout scroll

- Role-based workspace access: Property Manager gets Supply+Demand,
  Operations restricted to Super Admin + Reviewer only
- Root redirect routes each persona to their first workspace
- Match Center: replaced 3-panel with auto-sorted flat list + drawer
- AI Search: unified form with dual-action (Jetzt suchen / Als Suchprofil speichern)
- CompareTray hidden on non-Demand routes; Vergleichen removed from Supply
- LocationIntelligencePanel: city KPIs, rent trends, soft factors, comparables
- NegotiationInsightsPanel: price positioning, active demand, selling arguments
- scoreCalculator: cap hardMatchScore and softFactorScore to max 100
- Layout: add display:flex to overflow:hidden wrappers so inner scroll works
  (MatchCenter drawer, MarketIntelligence, SourceMonitoring, SignalPipeline)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-17 00:58:10 +02:00
parent e13fe470fb
commit efc406ace9
37 changed files with 4871 additions and 459 deletions
+344
View File
@@ -2,6 +2,7 @@ import { SignalType, RiskLevel } from '../domain/enums'
import type { FutureSignal } from '../domain/futureSignal'
export const mockFutureSignals: FutureSignal[] = [
// --- signal-001: DataCloud Expansion Zürich-West ---
{
id: 'signal-001',
signalType: SignalType.EXPANSION,
@@ -28,6 +29,8 @@ export const mockFutureSignals: FutureSignal[] = [
createdAt: '2025-05-01T07:00:00Z',
updatedAt: '2025-05-10T07:00:00Z',
},
// --- signal-002: Helvetia Produktion possible move-out Reinach ---
{
id: 'signal-002',
signalType: SignalType.POSSIBLE_MOVE_OUT,
@@ -55,6 +58,8 @@ export const mockFutureSignals: FutureSignal[] = [
createdAt: '2025-05-03T08:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
// --- signal-003: Bern Wankdorf Neubau Büro/Gewerbe ---
{
id: 'signal-003',
signalType: SignalType.CONSTRUCTION_PROJECT,
@@ -81,4 +86,343 @@ export const mockFutureSignals: FutureSignal[] = [
createdAt: '2025-02-12T10:00:00Z',
updatedAt: '2025-05-05T09:00:00Z',
},
// --- signal-004: Pharma-Biotech Basel Expansion ---
{
id: 'signal-004',
signalType: SignalType.EXPANSION,
companyName: 'Novabio Pharma AG',
locationHint: 'Basel, Allschwil',
areaSqmEstimate: 700,
probability: 0.63,
confidenceScore: 0.60,
timeHorizonMonths: 14,
source: {
type: 'COMPANY_REPORT',
url: 'https://example.com/annual/novabio-2025',
publishedAt: '2025-03-28',
credibility: 'HIGH',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Signal basiert auf Geschäftsbericht und Expansionsplänen. Kein bestätigtes Mietobjekt.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Pharmastandort Basel: +22% Beschäftigte Life-Sciences 2024',
relevanceScore: 0.70,
isVerified: false,
expiresAt: '2026-07-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-02T09:00:00Z',
updatedAt: '2025-05-08T10:00:00Z',
},
// --- signal-005: Finanz AG Zürich-Nord possible move-out → prop-023 ---
{
id: 'signal-005',
signalType: SignalType.POSSIBLE_MOVE_OUT,
companyName: 'Finanz & Treuhand AG',
propertyId: 'prop-023',
locationHint: 'Zürich-Nord, Seebach',
areaSqmEstimate: 850,
probability: 0.58,
confidenceScore: 0.54,
timeHorizonMonths: 8,
source: {
type: 'MARKET_DATA',
publishedAt: '2025-04-10',
credibility: 'MEDIUM',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Marktdaten deuten auf mögliche Standortverlagerung hin. Kein bestätigter Auszug.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Leerstand Zürich-Nord Q1 2025: +12% QoQ',
relevanceScore: 0.65,
isVerified: false,
expiresAt: '2026-01-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-12T08:00:00Z',
updatedAt: '2025-05-10T09:00:00Z',
},
// --- signal-006: Luzern Inseli Neubau Gewerbe ---
{
id: 'signal-006',
signalType: SignalType.CONSTRUCTION_PROJECT,
locationHint: 'Luzern, Inseli-Quartier',
areaSqmEstimate: 2000,
probability: 0.78,
confidenceScore: 0.74,
timeHorizonMonths: 22,
source: {
type: 'CONSTRUCTION_PERMIT',
publishedAt: '2025-01-20',
credibility: 'HIGH',
},
sensitivityLevel: 'PUBLIC',
disclaimer: 'Baubewilligung eingereicht. Fertigstellung ca. Q1 2027. Nutzungskonzept noch nicht endgültig.',
riskLevel: RiskLevel.LOW,
marketIndicator: 'Neubauprojekte Luzern Innenstadt 20252027',
relevanceScore: 0.72,
isVerified: false,
expiresAt: '2027-02-01',
organizationId: 'org-wincasa',
createdAt: '2025-01-25T11:00:00Z',
updatedAt: '2025-05-06T14:00:00Z',
},
// --- signal-007: E-Commerce Zug Expansion → prop-026 ---
{
id: 'signal-007',
signalType: SignalType.EXPANSION,
companyName: 'SwissCart E-Commerce GmbH',
propertyId: 'prop-026',
locationHint: 'Zug, Industriestrasse',
areaSqmEstimate: 580,
probability: 0.66,
confidenceScore: 0.62,
timeHorizonMonths: 9,
source: {
type: 'JOB_POSTING',
url: 'https://example.com/jobs/swisscart-zug',
publishedAt: '2025-04-18',
credibility: 'MEDIUM',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Signal basiert auf massivem Stellenaufbau. Expansion in Zug sehr wahrscheinlich, aber noch kein Mietobjekt identifiziert.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'E-Commerce Zug: Stellenwachstum +55% YoY',
relevanceScore: 0.69,
isVerified: false,
expiresAt: '2026-02-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-20T07:00:00Z',
updatedAt: '2025-05-09T08:00:00Z',
},
// --- signal-008: Retail Zürich Niederdorf possible move-out → prop-025 ---
{
id: 'signal-008',
signalType: SignalType.POSSIBLE_MOVE_OUT,
companyName: 'Textilhaus Zürich AG',
propertyId: 'prop-025',
locationHint: 'Zürich Niederdorf, Münstergasse',
areaSqmEstimate: 280,
probability: 0.55,
confidenceScore: 0.50,
timeHorizonMonths: 18,
source: {
type: 'MARKET_DATA',
publishedAt: '2025-03-30',
credibility: 'MEDIUM',
},
sensitivityLevel: 'CONFIDENTIAL',
disclaimer: 'Brancheninformationen deuten auf Verkleinerung hin. Kein bestätigter Auszug. Vertraulich.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Stationärer Handel Zürich Altstadt: Leerstand +8% 2024',
relevanceScore: 0.60,
isVerified: false,
expiresAt: '2026-10-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-01T10:00:00Z',
updatedAt: '2025-05-07T11:00:00Z',
},
// --- signal-009: Winterthur Zentrum Neubau Büro ---
{
id: 'signal-009',
signalType: SignalType.CONSTRUCTION_PROJECT,
locationHint: 'Winterthur, Zentrum Technikum',
areaSqmEstimate: 1200,
probability: 0.80,
confidenceScore: 0.76,
timeHorizonMonths: 20,
source: {
type: 'CONSTRUCTION_PERMIT',
publishedAt: '2025-02-28',
credibility: 'HIGH',
},
sensitivityLevel: 'PUBLIC',
disclaimer: 'Baubewilligung öffentlich. Fertigstellung ca. Q2 2027.',
riskLevel: RiskLevel.LOW,
marketIndicator: 'Winterthur Stadtentwicklung: Büroflächenneubau 20252027',
relevanceScore: 0.75,
isVerified: true,
verifiedBy: 'admin@ideal-sharing.ch',
verifiedAt: '2025-04-10T10:00:00Z',
expiresAt: '2027-05-01',
organizationId: 'org-wincasa',
createdAt: '2025-03-05T09:00:00Z',
updatedAt: '2025-04-10T10:00:00Z',
},
// --- signal-010: TechHub St.Gallen Expansion → prop-030 ---
{
id: 'signal-010',
signalType: SignalType.EXPANSION,
companyName: 'Ostschweiz Digital AG',
propertyId: 'prop-030',
locationHint: 'St. Gallen, Riethüsli',
areaSqmEstimate: 480,
probability: 0.60,
confidenceScore: 0.55,
timeHorizonMonths: 10,
source: {
type: 'JOB_POSTING',
url: 'https://example.com/jobs/ostschweiz-digital',
publishedAt: '2025-04-22',
credibility: 'MEDIUM',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Expansion basiert auf Analyse von Stellenanzeigen und Unternehmensankündigungen. Kein bestätigtes Objekt.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Digitalwirtschaft Ostschweiz: +28% Beschäftigte 2024',
relevanceScore: 0.62,
isVerified: false,
expiresAt: '2026-03-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-25T08:00:00Z',
updatedAt: '2025-05-10T07:00:00Z',
},
// --- signal-011: Produktion Münchenbuchsee possible move-out → prop-027 ---
{
id: 'signal-011',
signalType: SignalType.POSSIBLE_MOVE_OUT,
companyName: 'Präzisionsmechanik Bern AG',
propertyId: 'prop-027',
locationHint: 'Münchenbuchsee BE, Industriezone',
areaSqmEstimate: 2200,
probability: 0.52,
confidenceScore: 0.48,
timeHorizonMonths: 14,
source: {
type: 'PRESS',
url: 'https://example.com/news/pmbern-verlagerung',
publishedAt: '2025-03-10',
credibility: 'HIGH',
},
sensitivityLevel: 'CONFIDENTIAL',
disclaimer: 'Pressemeldungen über Verlagerung der Produktion ins Ausland. Kein bestätigter Auszug. Vertraulich behandeln.',
riskLevel: RiskLevel.HIGH,
marketIndicator: 'Verlagerungsdruck Schweizer Maschinenbau 2025',
relevanceScore: 0.58,
isVerified: false,
expiresAt: '2026-08-01',
organizationId: 'org-wincasa',
createdAt: '2025-03-12T10:00:00Z',
updatedAt: '2025-05-09T09:00:00Z',
},
// --- signal-012: Basel Hafen Neubau Logistik → prop-024 ---
{
id: 'signal-012',
signalType: SignalType.CONSTRUCTION_PROJECT,
propertyId: 'prop-024',
locationHint: 'Basel, Hafen Klybeck',
areaSqmEstimate: 2600,
probability: 0.82,
confidenceScore: 0.78,
timeHorizonMonths: 12,
source: {
type: 'CONSTRUCTION_PERMIT',
publishedAt: '2025-01-15',
credibility: 'HIGH',
},
sensitivityLevel: 'PUBLIC',
disclaimer: 'Baubewilligung erteilt. Logistikneubau am Rheinhafen. Fertigstellung gemäss Baugesuch Q2 2026.',
riskLevel: RiskLevel.LOW,
marketIndicator: 'Hafenerweiterung Basel Klybeck: Logistikflächen 2026',
relevanceScore: 0.80,
isVerified: true,
verifiedBy: 'admin@ideal-sharing.ch',
verifiedAt: '2025-04-20T14:00:00Z',
expiresAt: '2026-08-01',
organizationId: 'org-wincasa',
createdAt: '2025-01-18T10:00:00Z',
updatedAt: '2025-04-20T14:00:00Z',
},
// --- signal-013: Genf La Praille Office Expansion → prop-028 ---
{
id: 'signal-013',
signalType: SignalType.EXPANSION,
companyName: 'Geneva Finance Partners SA',
propertyId: 'prop-028',
locationHint: 'Genf, La Praille',
areaSqmEstimate: 520,
probability: 0.58,
confidenceScore: 0.53,
timeHorizonMonths: 20,
source: {
type: 'COMPANY_REPORT',
url: 'https://example.com/annual/gfp-2025',
publishedAt: '2025-03-05',
credibility: 'MEDIUM',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Expansionspläne aus Jahresbericht. Standort La Praille wahrscheinlich, aber noch nicht definitiv.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Büroflächennachfrage Genf: +15% 2025',
relevanceScore: 0.60,
isVerified: false,
expiresAt: '2027-01-01',
organizationId: 'org-wincasa',
createdAt: '2025-03-08T11:00:00Z',
updatedAt: '2025-05-07T10:00:00Z',
},
// --- signal-014: Frenkendorf Lager possible move-out → prop-029 ---
{
id: 'signal-014',
signalType: SignalType.POSSIBLE_MOVE_OUT,
companyName: 'Schweizer Grosshandel AG',
propertyId: 'prop-029',
locationHint: 'Frenkendorf BL, Lager Nord',
areaSqmEstimate: 3500,
probability: 0.50,
confidenceScore: 0.46,
timeHorizonMonths: 15,
source: {
type: 'MARKET_DATA',
publishedAt: '2025-04-05',
credibility: 'MEDIUM',
},
sensitivityLevel: 'CONFIDENTIAL',
disclaimer: 'Marktdaten deuten auf mögliche Konsolidierung hin. Kein bestätigter Auszug. Vertraulich.',
riskLevel: RiskLevel.HIGH,
marketIndicator: 'Grosshandel Nordwestschweiz: Konsolidierungstrend 2025',
relevanceScore: 0.55,
isVerified: false,
expiresAt: '2026-09-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-07T08:00:00Z',
updatedAt: '2025-05-08T09:00:00Z',
},
// --- signal-015: Bern Tech Campus Expansion ---
{
id: 'signal-015',
signalType: SignalType.EXPANSION,
companyName: 'BernTech Innovation AG',
locationHint: 'Bern, Breitenrain',
areaSqmEstimate: 1800,
probability: 0.68,
confidenceScore: 0.64,
timeHorizonMonths: 16,
source: {
type: 'JOB_POSTING',
url: 'https://example.com/jobs/berntech',
publishedAt: '2025-04-25',
credibility: 'MEDIUM',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Wachstumssignal aus Stellenanzeigen und Social-Media-Analyse. Kein bestätigtes Objekt.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Bern Tech-Ökosystem: Risikokapital +40% 2024',
relevanceScore: 0.66,
isVerified: false,
expiresAt: '2026-10-01',
organizationId: 'org-wincasa',
createdAt: '2025-04-28T09:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
]
+1450 -34
View File
File diff suppressed because it is too large Load Diff
+311
View File
@@ -2,6 +2,7 @@ import { AssetType } from '../domain/enums'
import type { Need } from '../domain/need'
export const mockNeeds: Need[] = [
// --- need-001: Innovatech AG — OFFICE Zürich ---
{
id: 'need-001',
companyName: 'Innovatech AG',
@@ -40,6 +41,8 @@ export const mockNeeds: Need[] = [
createdAt: '2025-04-15T10:00:00Z',
updatedAt: '2025-05-01T09:00:00Z',
},
// --- need-002: Schweizer Logistik GmbH — LOGISTICS Basel ---
{
id: 'need-002',
companyName: 'Schweizer Logistik GmbH',
@@ -73,4 +76,312 @@ export const mockNeeds: Need[] = [
createdAt: '2025-03-20T14:00:00Z',
updatedAt: '2025-04-10T11:00:00Z',
},
// --- need-003: Pharma Holding AG — OFFICE Basel ---
{
id: 'need-003',
companyName: 'Pharma Holding AG',
contactName: 'Ursula Schmid',
assetType: AssetType.OFFICE,
requiredArea: { min: 500, max: 800 },
preferredLocations: ['Basel', 'Allschwil', 'Binningen', 'Dreispitz'],
excludedLocations: [],
budgetRange: { maxPerSqm: 40, maxMonthlyTotal: 32000, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-10-01',
latestMoveIn: '2026-04-01',
contractDurationMonths: 48,
flexibleTiming: true,
},
mustCriteriaText: ['Repräsentative Lage', 'Ausbaugrad gehoben', 'Konferenzräume vorhanden'],
softFactors: {
minPrestige: 75,
minAccessibility: 75,
requireParking: true,
maxPublicTransportMinutes: 10,
},
weightingProfile: {
area: 0.20,
location: 0.25,
budget: 0.20,
timing: 0.10,
prestige: 0.12,
accessibility: 0.08,
expansionPotential: 0.03,
flexibility: 0.02,
},
confidenceInCriteria: 0.91,
extractedFromText: 'Suche repräsentative Büroflächen im Raum Basel/Allschwil, 500800m², max. CHF 38/m², Bezug Q4 2025.',
organizationId: 'org-wincasa',
createdAt: '2025-04-20T09:00:00Z',
updatedAt: '2025-05-05T14:00:00Z',
},
// --- need-004: Retailer Zürich AG — RETAIL Zürich ---
{
id: 'need-004',
companyName: 'Retailer Zürich AG',
contactName: 'Marco Colombo',
assetType: AssetType.RETAIL,
requiredArea: { min: 200, max: 500 },
preferredLocations: ['Zürich Innenstadt', 'Zürich Bahnhofstrasse', 'Zürich Niederdorf', 'Zürich City'],
excludedLocations: [],
budgetRange: { maxPerSqm: 100, maxMonthlyTotal: 50000, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-09-01',
latestMoveIn: '2026-03-01',
contractDurationMonths: 60,
flexibleTiming: false,
},
mustCriteriaText: ['Laufkundschaft', 'Schaufensterfront', 'Erdgeschoss', 'Hohe Passantenfrequenz'],
softFactors: {
minPrestige: 85,
requireParking: false,
maxPublicTransportMinutes: 5,
},
weightingProfile: {
area: 0.15,
location: 0.35,
budget: 0.15,
timing: 0.10,
prestige: 0.15,
accessibility: 0.05,
expansionPotential: 0.02,
flexibility: 0.03,
},
confidenceInCriteria: 0.96,
extractedFromText: 'Exklusive Retailfläche in Zürich Innenstadt gesucht, 250450m², Schaufenster, max. CHF 95/m².',
organizationId: 'org-wincasa',
createdAt: '2025-03-10T11:00:00Z',
updatedAt: '2025-04-22T08:00:00Z',
},
// --- need-005: TechStart GmbH — OFFICE Zug/Zürich ---
{
id: 'need-005',
companyName: 'TechStart GmbH',
contactName: 'Florian Keller',
assetType: AssetType.OFFICE,
requiredArea: { min: 300, max: 700 },
preferredLocations: ['Zug', 'Zürich', 'Baar', 'Steinhausen'],
excludedLocations: [],
budgetRange: { maxPerSqm: 48, maxMonthlyTotal: 33000, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-10-01',
latestMoveIn: '2026-06-01',
contractDurationMonths: 36,
flexibleTiming: true,
},
mustCriteriaText: ['Moderner Ausbau', 'Schnelles Internet', 'Fahrradabstellplätze'],
softFactors: {
minPrestige: 65,
minAccessibility: 75,
requireParking: false,
maxPublicTransportMinutes: 10,
},
weightingProfile: {
area: 0.20,
location: 0.25,
budget: 0.20,
timing: 0.15,
prestige: 0.05,
accessibility: 0.10,
expansionPotential: 0.03,
flexibility: 0.02,
},
confidenceInCriteria: 0.85,
extractedFromText: 'Junges Tech-Unternehmen sucht Büro in Zug oder Zürich, 350600m², moderner Ausbau, max. CHF 45/m².',
organizationId: 'org-wincasa',
createdAt: '2025-04-28T13:00:00Z',
updatedAt: '2025-05-08T10:00:00Z',
},
// --- need-006: Lager & Spedition AG — LOGISTICS Winterthur ---
{
id: 'need-006',
companyName: 'Lager & Spedition AG',
contactName: 'Beat Zimmermann',
assetType: AssetType.LOGISTICS,
requiredArea: { min: 1200, max: 3000 },
preferredLocations: ['Winterthur', 'Wülflingen', 'Oberwinterthur', 'Töss'],
budgetRange: { maxPerSqm: 16, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-11-01',
latestMoveIn: '2026-05-01',
contractDurationMonths: 60,
flexibleTiming: false,
},
mustCriteriaText: ['Autobahn A1 < 10 Min', 'Ebenerdig', 'Lkw-Zufahrt', 'Sprinkleranlage'],
softFactors: {
requireParking: true,
},
weightingProfile: {
area: 0.30,
location: 0.25,
budget: 0.20,
timing: 0.10,
prestige: 0.01,
accessibility: 0.10,
expansionPotential: 0.02,
flexibility: 0.02,
},
confidenceInCriteria: 0.92,
organizationId: 'org-wincasa',
createdAt: '2025-05-02T08:30:00Z',
updatedAt: '2025-05-09T16:00:00Z',
},
// --- need-007: Creative Studios AG — MIXED Zürich/Bern ---
{
id: 'need-007',
companyName: 'Creative Studios AG',
contactName: 'Nora Hauser',
assetType: AssetType.MIXED,
requiredArea: { min: 800, max: 1500 },
preferredLocations: ['Zürich', 'Zürich-West', 'Zürich Altstetten', 'Bern'],
excludedLocations: [],
budgetRange: { maxPerSqm: 55, maxMonthlyTotal: 75000, currency: 'CHF' },
timing: {
earliestMoveIn: '2026-01-01',
latestMoveIn: '2026-07-01',
contractDurationMonths: 48,
flexibleTiming: true,
},
mustCriteriaText: ['Gemischte Nutzung möglich', 'Hohe Decken', 'Kreative Atmosphäre'],
softFactors: {
minPrestige: 55,
minAccessibility: 70,
requireParking: false,
maxPublicTransportMinutes: 12,
},
weightingProfile: {
area: 0.20,
location: 0.20,
budget: 0.15,
timing: 0.15,
prestige: 0.10,
accessibility: 0.10,
expansionPotential: 0.05,
flexibility: 0.05,
},
confidenceInCriteria: 0.82,
extractedFromText: 'Kreativagentur sucht Gewerbe-/Bürofläche in Zürich oder Bern, 9001400m², gemischte Nutzung, Budget max. CHF 50/m².',
organizationId: 'org-wincasa',
createdAt: '2025-04-05T10:00:00Z',
updatedAt: '2025-05-03T11:00:00Z',
},
// --- need-008: Berner Produzenten GmbH — PRODUCTION Bern ---
{
id: 'need-008',
companyName: 'Berner Produzenten GmbH',
contactName: 'Hans Lüthi',
assetType: AssetType.PRODUCTION,
requiredArea: { min: 2000, max: 4000 },
preferredLocations: ['Bern', 'Brünnen', 'Münchenbuchsee', 'Bern West'],
budgetRange: { maxPerSqm: 14, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-12-01',
latestMoveIn: '2026-09-01',
contractDurationMonths: 120,
flexibleTiming: false,
},
mustCriteriaText: ['Kranbahn möglich', 'Hallenhöhe min 8m', 'Drehstrom 400V', 'Lkw-Andienung'],
softFactors: {
requireParking: true,
},
weightingProfile: {
area: 0.30,
location: 0.20,
budget: 0.20,
timing: 0.10,
prestige: 0.01,
accessibility: 0.10,
expansionPotential: 0.07,
flexibility: 0.02,
},
confidenceInCriteria: 0.95,
organizationId: 'org-wincasa',
createdAt: '2025-03-15T09:00:00Z',
updatedAt: '2025-04-20T12:00:00Z',
},
// --- need-009: Geneva Commerce SA — RETAIL Genf ---
{
id: 'need-009',
companyName: 'Geneva Commerce SA',
contactName: 'Pierre Dupont',
assetType: AssetType.RETAIL,
requiredArea: { min: 150, max: 400 },
preferredLocations: ['Genf', 'Genf Rive', 'Genf Centre'],
excludedLocations: [],
budgetRange: { maxPerSqm: 120, maxMonthlyTotal: 48000, currency: 'CHF' },
timing: {
earliestMoveIn: '2026-01-01',
latestMoveIn: '2026-06-01',
contractDurationMonths: 60,
flexibleTiming: false,
},
mustCriteriaText: ['Centre-ville Genève', 'Vitrine', 'Rez-de-chaussée', 'Passage piétonnier'],
softFactors: {
minPrestige: 88,
requireParking: false,
maxPublicTransportMinutes: 5,
},
weightingProfile: {
area: 0.15,
location: 0.35,
budget: 0.15,
timing: 0.10,
prestige: 0.15,
accessibility: 0.05,
expansionPotential: 0.02,
flexibility: 0.03,
},
confidenceInCriteria: 0.93,
extractedFromText: 'Recherche surface commerciale en centre-ville de Genève, 200350m², vitrine obligatoire, budget max CHF 115/m².',
organizationId: 'org-wincasa',
createdAt: '2025-02-28T15:00:00Z',
updatedAt: '2025-04-18T09:00:00Z',
},
// --- need-010: St.Galler Büros AG — OFFICE St.Gallen ---
{
id: 'need-010',
companyName: 'St.Galler Büros AG',
contactName: 'Brigitte Fässler',
assetType: AssetType.OFFICE,
requiredArea: { min: 400, max: 800 },
preferredLocations: ['St. Gallen', 'St. Gallen Centrum', 'Riethüsli', 'Ostschweiz'],
excludedLocations: [],
budgetRange: { maxPerSqm: 35, maxMonthlyTotal: 28000, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-11-01',
latestMoveIn: '2026-04-01',
contractDurationMonths: 48,
flexibleTiming: true,
},
mustCriteriaText: ['Stadtzentrumsnähe', 'ÖV < 8 Min', 'Helligkeit und Ausbauqualität'],
softFactors: {
minPrestige: 60,
minAccessibility: 70,
requireParking: true,
maxPublicTransportMinutes: 8,
},
weightingProfile: {
area: 0.22,
location: 0.28,
budget: 0.20,
timing: 0.12,
prestige: 0.08,
accessibility: 0.06,
expansionPotential: 0.02,
flexibility: 0.02,
},
confidenceInCriteria: 0.87,
extractedFromText: 'Büroflächen in St. Gallen oder Umgebung gesucht, 450750m², max. CHF 32/m², Bezug Anfang 2026.',
organizationId: 'org-wincasa',
createdAt: '2025-04-10T08:00:00Z',
updatedAt: '2025-05-06T13:00:00Z',
},
]
+786 -3
View File
@@ -2,7 +2,11 @@ import { AssetType, ResultType, AvailabilityStatus, DataFreshness, RiskLevel } f
import type { Property } from '../domain/property'
export const mockProperties: Property[] = [
// --- VERIFIED_PORTFOLIO ---
// ─────────────────────────────────────────────────────────────────────────────
// VERIFIED_PORTFOLIO (10)
// ─────────────────────────────────────────────────────────────────────────────
{
id: 'prop-001',
title: 'Bürofläche Zollstrasse 12',
@@ -41,6 +45,7 @@ export const mockProperties: Property[] = [
createdAt: '2025-01-10T08:00:00Z',
updatedAt: '2025-04-28T10:30:00Z',
},
{
id: 'prop-002',
title: 'Lagerfläche Hardstrasse 44',
@@ -79,7 +84,319 @@ export const mockProperties: Property[] = [
updatedAt: '2025-05-05T11:00:00Z',
},
// --- EXTERNAL_MARKET ---
{
id: 'prop-007',
title: 'Bürofläche Thurgauerstrasse 40',
assetType: AssetType.OFFICE,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Zürich', district: 'Oerlikon', canton: 'ZH', country: 'CH', coordinates: { lat: 47.4115, lng: 8.5502 } },
address: { street: 'Thurgauerstrasse', houseNumber: '40', postalCode: '8050', city: 'Zürich', country: 'CH' },
areaSqm: 720,
rentPricePerSqm: 36,
totalRentMonthly: 25920,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.98,
dataQuality: {
score: 0.94,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-05-01',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 72,
accessibility: 88,
visibilityScore: 60,
talentAccess: 80,
parkingSpots: 8,
publicTransportMinutes: 5,
},
floorLevel: 2,
expansionPotentialSqm: 200,
contractDurationMonths: 48,
ancillaryCosts: 5.0,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2025-02-01T09:00:00Z',
updatedAt: '2025-05-01T08:00:00Z',
},
{
id: 'prop-008',
title: 'Bürofläche Dreispitz Areal 9',
assetType: AssetType.OFFICE,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Basel', district: 'Dreispitz', canton: 'BS', country: 'CH', coordinates: { lat: 47.5398, lng: 7.5812 } },
address: { street: 'Hochbergerstrasse', houseNumber: '9', postalCode: '4057', city: 'Basel', country: 'CH' },
areaSqm: 900,
rentPricePerSqm: 32,
totalRentMonthly: 28800,
availabilityDate: '2025-09-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.97,
dataQuality: {
score: 0.93,
missingCriticalFields: [],
missingOptionalFields: ['expansionPotentialSqm'],
lastVerifiedAt: '2025-04-30',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 70,
accessibility: 82,
visibilityScore: 58,
talentAccess: 72,
parkingSpots: 14,
publicTransportMinutes: 8,
},
floorLevel: 4,
contractDurationMonths: 48,
ancillaryCosts: 4.5,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2025-01-20T10:00:00Z',
updatedAt: '2025-04-30T09:00:00Z',
},
{
id: 'prop-009',
title: 'Logistikzentrum Tössfeldstrasse 18',
assetType: AssetType.LOGISTICS,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Winterthur', district: 'Töss', canton: 'ZH', country: 'CH', coordinates: { lat: 47.4952, lng: 8.7082 } },
address: { street: 'Tössfeldstrasse', houseNumber: '18', postalCode: '8406', city: 'Winterthur', country: 'CH' },
areaSqm: 1800,
rentPricePerSqm: 13,
totalRentMonthly: 23400,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.98,
dataQuality: {
score: 0.95,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-05-02',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 38,
accessibility: 85,
parkingSpots: 25,
publicTransportMinutes: 14,
},
floorLevel: 0,
expansionPotentialSqm: 600,
contractDurationMonths: 60,
ancillaryCosts: 2.8,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2024-12-10T08:00:00Z',
updatedAt: '2025-05-02T10:00:00Z',
},
{
id: 'prop-010',
title: 'Retailfläche Löwenplatz 3',
assetType: AssetType.RETAIL,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Zürich', district: 'Innenstadt', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3758, lng: 8.5352 } },
address: { street: 'Löwenplatz', houseNumber: '3', postalCode: '8001', city: 'Zürich', country: 'CH' },
areaSqm: 285,
rentPricePerSqm: 88,
totalRentMonthly: 25080,
availabilityDate: '2025-08-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.99,
dataQuality: {
score: 0.96,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-05-06',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 95,
visibilityScore: 98,
passerbyFrequency: 'VERY_HIGH',
accessibility: 96,
publicTransportMinutes: 2,
},
floorLevel: 0,
contractDurationMonths: 60,
ancillaryCosts: 8.0,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2025-01-05T10:00:00Z',
updatedAt: '2025-05-06T11:00:00Z',
},
{
id: 'prop-011',
title: 'Produktionshalle Brünnen West 22',
assetType: AssetType.PRODUCTION,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Bern', district: 'Brünnen', canton: 'BE', country: 'CH', coordinates: { lat: 46.9562, lng: 7.3818 } },
address: { street: 'Brünnenstrasse', houseNumber: '22', postalCode: '3018', city: 'Bern', country: 'CH' },
areaSqm: 2800,
rentPricePerSqm: 12,
totalRentMonthly: 33600,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.98,
dataQuality: {
score: 0.95,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-05-03',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 35,
accessibility: 80,
parkingSpots: 40,
publicTransportMinutes: 18,
},
floorLevel: 0,
expansionPotentialSqm: 1200,
contractDurationMonths: 120,
ancillaryCosts: 2.5,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2024-10-15T09:00:00Z',
updatedAt: '2025-05-03T10:00:00Z',
},
{
id: 'prop-012',
title: 'Bürofläche Stadtturm Zug',
assetType: AssetType.OFFICE,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Zug', district: 'Zentrum', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1712, lng: 8.5150 } },
address: { street: 'Industriestrasse', houseNumber: '2', postalCode: '6300', city: 'Zug', country: 'CH' },
areaSqm: 550,
rentPricePerSqm: 42,
totalRentMonthly: 23100,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.97,
dataQuality: {
score: 0.93,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-04-29',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 82,
accessibility: 88,
visibilityScore: 70,
talentAccess: 78,
parkingSpots: 6,
publicTransportMinutes: 6,
},
floorLevel: 5,
contractDurationMonths: 36,
ancillaryCosts: 6.0,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2025-02-10T11:00:00Z',
updatedAt: '2025-04-29T08:00:00Z',
},
{
id: 'prop-013',
title: 'Gewerbe-/Bürofläche Altstetten Park',
assetType: AssetType.MIXED,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Zürich', district: 'Altstetten', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3908, lng: 8.4888 } },
address: { street: 'Badenerstrasse', houseNumber: '810', postalCode: '8048', city: 'Zürich', country: 'CH' },
areaSqm: 1300,
rentPricePerSqm: 45,
totalRentMonthly: 58500,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.96,
dataQuality: {
score: 0.92,
missingCriticalFields: [],
missingOptionalFields: ['expansionPotentialSqm'],
lastVerifiedAt: '2025-04-25',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 62,
accessibility: 84,
visibilityScore: 55,
talentAccess: 72,
parkingSpots: 18,
publicTransportMinutes: 7,
},
floorLevel: 1,
contractDurationMonths: 48,
ancillaryCosts: 5.0,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2025-01-15T09:00:00Z',
updatedAt: '2025-04-25T10:00:00Z',
},
{
id: 'prop-014',
title: 'Logistikhalle Pratteln Nord',
assetType: AssetType.LOGISTICS,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Pratteln', district: 'Industriezone', canton: 'BL', country: 'CH', coordinates: { lat: 47.5228, lng: 7.6958 } },
address: { street: 'Industriestrasse', houseNumber: '55', postalCode: '4133', city: 'Pratteln', country: 'CH' },
areaSqm: 3100,
rentPricePerSqm: 15,
totalRentMonthly: 46500,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.98,
dataQuality: {
score: 0.94,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-05-04',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 42,
accessibility: 90,
parkingSpots: 45,
publicTransportMinutes: 16,
},
floorLevel: 0,
expansionPotentialSqm: 1500,
contractDurationMonths: 60,
ancillaryCosts: 2.8,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2024-12-01T08:00:00Z',
updatedAt: '2025-05-04T09:00:00Z',
},
// ─────────────────────────────────────────────────────────────────────────────
// EXTERNAL_MARKET (10)
// ─────────────────────────────────────────────────────────────────────────────
{
id: 'prop-003',
title: 'Retail-Fläche Bahnhofstrasse 88',
@@ -113,6 +430,7 @@ export const mockProperties: Property[] = [
createdAt: '2025-02-15T14:00:00Z',
updatedAt: '2025-04-10T09:00:00Z',
},
{
id: 'prop-004',
title: 'Gemischte Gewerbeeinheit Europaallee',
@@ -140,7 +458,271 @@ export const mockProperties: Property[] = [
updatedAt: '2025-03-20T15:00:00Z',
},
// --- FUTURE_AVAILABILITY ---
{
id: 'prop-015',
title: 'Bürofläche Kasernenplatz Luzern',
assetType: AssetType.OFFICE,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Luzern', district: 'Innenstadt', canton: 'LU', country: 'CH', coordinates: { lat: 47.0502, lng: 8.3093 } },
address: { street: 'Kasernenplatz', houseNumber: '3', postalCode: '6003', city: 'Luzern', country: 'CH' },
areaSqm: 650,
rentPricePerSqm: 38,
totalRentMonthly: 24700,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'HOMEGATE_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-015',
confidenceScore: 0.70,
dataQuality: {
score: 0.60,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'expansionPotentialSqm'],
lastVerifiedAt: '2025-04-05',
freshness: DataFreshness.STALE,
warnings: ['Verfügbarkeit aus Drittquelle nicht bestätigt'],
},
softFactors: {
prestige: 74,
accessibility: 86,
publicTransportMinutes: 5,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-03-12T11:00:00Z',
updatedAt: '2025-04-05T10:00:00Z',
},
{
id: 'prop-016',
title: 'Logistikhalle Muttenz Rheinfelderstrasse',
assetType: AssetType.LOGISTICS,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Muttenz', district: 'Industriezone', canton: 'BL', country: 'CH', coordinates: { lat: 47.5202, lng: 7.6422 } },
address: { street: 'Rheinfelderstrasse', houseNumber: '80', postalCode: '4132', city: 'Muttenz', country: 'CH' },
areaSqm: 2200,
rentPricePerSqm: 16,
totalRentMonthly: 35200,
availabilityDate: '2025-09-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'IMMOSCOUT_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-016',
confidenceScore: 0.69,
dataQuality: {
score: 0.58,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts'],
lastVerifiedAt: '2025-03-28',
freshness: DataFreshness.STALE,
warnings: ['Hallenhöhe nicht angegeben', 'Daten nicht verifiziert'],
},
softFactors: {
prestige: 42,
accessibility: 88,
parkingSpots: 35,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-02-20T09:00:00Z',
updatedAt: '2025-03-28T12:00:00Z',
},
{
id: 'prop-017',
title: 'Ladenfläche Löwenstrasse 28',
assetType: AssetType.RETAIL,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Zürich', district: 'Innenstadt', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3766, lng: 8.5385 } },
address: { street: 'Löwenstrasse', houseNumber: '28', postalCode: '8001', city: 'Zürich', country: 'CH' },
areaSqm: 350,
rentPricePerSqm: 95,
totalRentMonthly: 33250,
availabilityDate: '2025-09-15',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'MATCHOFFICE_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-017',
confidenceScore: 0.71,
dataQuality: {
score: 0.61,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['floorLevel', 'ancillaryCosts'],
lastVerifiedAt: '2025-04-18',
freshness: DataFreshness.STALE,
warnings: ['Mietpreis nicht final bestätigt'],
},
softFactors: {
prestige: 90,
visibilityScore: 94,
passerbyFrequency: 'VERY_HIGH',
publicTransportMinutes: 3,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-03-05T13:00:00Z',
updatedAt: '2025-04-18T11:00:00Z',
},
{
id: 'prop-018',
title: 'Bürofläche Breitenrain 14',
assetType: AssetType.OFFICE,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Bern', district: 'Breitenrain', canton: 'BE', country: 'CH', coordinates: { lat: 46.9598, lng: 7.4522 } },
address: { street: 'Breitenrainstrasse', houseNumber: '14', postalCode: '3014', city: 'Bern', country: 'CH' },
areaSqm: 780,
rentPricePerSqm: 31,
totalRentMonthly: 24180,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'NEWHOME_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-018',
confidenceScore: 0.68,
dataQuality: {
score: 0.57,
missingCriticalFields: ['contractDurationMonths', 'ancillaryCosts'],
missingOptionalFields: ['floorLevel'],
lastVerifiedAt: '2025-04-02',
freshness: DataFreshness.STALE,
warnings: ['Daten aus Drittquelle', 'Renovierungsstand unklar'],
},
softFactors: {
prestige: 62,
accessibility: 78,
publicTransportMinutes: 8,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-02-28T10:00:00Z',
updatedAt: '2025-04-02T09:00:00Z',
},
{
id: 'prop-019',
title: 'Produktionsfläche Voltastrasse Basel',
assetType: AssetType.PRODUCTION,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Basel', district: 'Kleinhüningen', canton: 'BS', country: 'CH', coordinates: { lat: 47.5720, lng: 7.5882 } },
address: { street: 'Voltastrasse', houseNumber: '62', postalCode: '4056', city: 'Basel', country: 'CH' },
areaSqm: 1900,
rentPricePerSqm: 13,
totalRentMonthly: 24700,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'IMMOSCOUT_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-019',
confidenceScore: 0.68,
dataQuality: {
score: 0.56,
missingCriticalFields: ['contractDurationMonths', 'ancillaryCosts'],
missingOptionalFields: ['softFactors'],
lastVerifiedAt: '2025-03-25',
freshness: DataFreshness.STALE,
warnings: ['Hallenhöhe nicht verifiziert', 'Kranbahn Status unklar'],
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-03-10T08:00:00Z',
updatedAt: '2025-03-25T14:00:00Z',
},
{
id: 'prop-020',
title: 'Bürofläche Industriestrasse Zug',
assetType: AssetType.OFFICE,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Zug', district: 'Industrie', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1688, lng: 8.5228 } },
address: { street: 'Industriestrasse', houseNumber: '45', postalCode: '6300', city: 'Zug', country: 'CH' },
areaSqm: 820,
rentPricePerSqm: 44,
totalRentMonthly: 36080,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'HOMEGATE_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-020',
confidenceScore: 0.70,
dataQuality: {
score: 0.60,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'expansionPotentialSqm'],
lastVerifiedAt: '2025-04-12',
freshness: DataFreshness.STALE,
warnings: ['Ausbaustandard nicht bestätigt'],
},
softFactors: {
prestige: 68,
accessibility: 82,
publicTransportMinutes: 9,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-03-18T09:00:00Z',
updatedAt: '2025-04-12T11:00:00Z',
},
{
id: 'prop-021',
title: 'Surface commerciale Rue du Rhône',
assetType: AssetType.RETAIL,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Genf', district: 'Centre', canton: 'GE', country: 'CH', coordinates: { lat: 46.2044, lng: 6.1432 } },
address: { street: 'Rue du Rhône', houseNumber: '48', postalCode: '1204', city: 'Genf', country: 'CH' },
areaSqm: 250,
rentPricePerSqm: 112,
totalRentMonthly: 28000,
availabilityDate: '2026-01-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'MATCHOFFICE_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-021',
confidenceScore: 0.70,
dataQuality: {
score: 0.59,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel'],
lastVerifiedAt: '2025-04-08',
freshness: DataFreshness.STALE,
warnings: ['Prix non confirmé', 'Disponibilité à vérifier'],
},
softFactors: {
prestige: 94,
visibilityScore: 96,
passerbyFrequency: 'VERY_HIGH',
publicTransportMinutes: 3,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-02-10T10:00:00Z',
updatedAt: '2025-04-08T09:00:00Z',
},
{
id: 'prop-022',
title: 'Bürofläche St.Gallen Centrum 7',
assetType: AssetType.OFFICE,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'St. Gallen', district: 'Centrum', canton: 'SG', country: 'CH', coordinates: { lat: 47.4245, lng: 9.3767 } },
address: { street: 'Marktgasse', houseNumber: '7', postalCode: '9000', city: 'St. Gallen', country: 'CH' },
areaSqm: 700,
rentPricePerSqm: 28,
totalRentMonthly: 19600,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'NEWHOME_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-022',
confidenceScore: 0.69,
dataQuality: {
score: 0.58,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel'],
lastVerifiedAt: '2025-04-14',
freshness: DataFreshness.STALE,
warnings: ['Daten aus Drittquelle', 'Ausbauqualität nicht bestätigt'],
},
softFactors: {
prestige: 66,
accessibility: 80,
publicTransportMinutes: 6,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-03-08T08:00:00Z',
updatedAt: '2025-04-14T10:00:00Z',
},
// ─────────────────────────────────────────────────────────────────────────────
// FUTURE_AVAILABILITY (10)
// ─────────────────────────────────────────────────────────────────────────────
{
id: 'prop-005',
title: 'Bürofläche Technoparkstrasse (Signal: Expansion)',
@@ -165,6 +747,7 @@ export const mockProperties: Property[] = [
createdAt: '2025-05-01T07:00:00Z',
updatedAt: '2025-05-10T07:00:00Z',
},
{
id: 'prop-006',
title: 'Produktionsfläche Reinach (Signal: möglicher Auszug)',
@@ -189,4 +772,204 @@ export const mockProperties: Property[] = [
createdAt: '2025-05-03T08:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
{
id: 'prop-023',
title: 'Bürofläche Zürich-Nord Seebach (Signal: Auszug)',
assetType: AssetType.OFFICE,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Zürich', district: 'Seebach', canton: 'ZH', country: 'CH', coordinates: { lat: 47.4298, lng: 8.5362 } },
address: { street: 'Binzmühlestrasse', houseNumber: '95', postalCode: '8050', city: 'Zürich', country: 'CH' },
areaSqm: 850,
rentPricePerSqm: 38,
availabilityDate: '2026-02-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.54,
dataQuality: {
score: 0.36,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Mietpreis geschätzt'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-04-14T08:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
{
id: 'prop-024',
title: 'Logistikneubau Basel Hafen Klybeck (Signal: Neubau)',
assetType: AssetType.LOGISTICS,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Basel', district: 'Klybeck', canton: 'BS', country: 'CH', coordinates: { lat: 47.5762, lng: 7.5918 } },
address: { street: 'Klybeckstrasse', houseNumber: '180', postalCode: '4057', city: 'Basel', country: 'CH' },
areaSqm: 2600,
rentPricePerSqm: 14,
availabilityDate: '2026-07-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.52,
dataQuality: {
score: 0.35,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Baubewilligung erteilt, Mieter noch nicht bekannt', 'Konditionen geschätzt'],
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-01-20T09:00:00Z',
updatedAt: '2025-05-10T09:00:00Z',
},
{
id: 'prop-025',
title: 'Retailfläche Zürich Niederdorf (Signal: Auszug)',
assetType: AssetType.RETAIL,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Zürich', district: 'Niederdorf', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3748, lng: 8.5418 } },
address: { street: 'Münstergasse', houseNumber: '14', postalCode: '8001', city: 'Zürich', country: 'CH' },
areaSqm: 280,
rentPricePerSqm: 92,
availabilityDate: '2026-09-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.50,
dataQuality: {
score: 0.33,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Preis geschätzt'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-04-02T08:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
{
id: 'prop-026',
title: 'Bürofläche Zug Industriestrasse (Signal: Expansion)',
assetType: AssetType.OFFICE,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Zug', district: 'Industrie', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1672, lng: 8.5198 } },
address: { street: 'Industriestrasse', houseNumber: '60', postalCode: '6300', city: 'Zug', country: 'CH' },
areaSqm: 580,
rentPricePerSqm: 43,
availabilityDate: '2026-04-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.52,
dataQuality: {
score: 0.34,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Lage approximiert'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-04-22T07:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
{
id: 'prop-027',
title: 'Produktionsfläche Münchenbuchsee BE (Signal: Auszug)',
assetType: AssetType.PRODUCTION,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Münchenbuchsee', district: 'Industriezone', canton: 'BE', country: 'CH', coordinates: { lat: 47.0038, lng: 7.4542 } },
address: { street: 'Bernstrasse', houseNumber: '42', postalCode: '3053', city: 'Münchenbuchsee', country: 'CH' },
areaSqm: 2200,
rentPricePerSqm: 12,
availabilityDate: '2026-08-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.48,
dataQuality: {
score: 0.32,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Daten nicht verifiziert'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-03-14T08:00:00Z',
updatedAt: '2025-05-09T09:00:00Z',
},
{
id: 'prop-028',
title: 'Bürofläche Genf La Praille (Signal: Expansion)',
assetType: AssetType.OFFICE,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Genf', district: 'La Praille', canton: 'GE', country: 'CH', coordinates: { lat: 46.1912, lng: 6.1285 } },
address: { street: 'Route de la Praille', houseNumber: '30', postalCode: '1227', city: 'Genf', country: 'CH' },
areaSqm: 520,
rentPricePerSqm: 36,
availabilityDate: '2027-01-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.53,
dataQuality: {
score: 0.35,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal Standort approximiert', 'Mietzins geschätzt'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-03-10T09:00:00Z',
updatedAt: '2025-05-09T10:00:00Z',
},
{
id: 'prop-029',
title: 'Logistiklager Frenkendorf BL (Signal: Auszug)',
assetType: AssetType.LOGISTICS,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Frenkendorf', district: 'Industriezone', canton: 'BL', country: 'CH', coordinates: { lat: 47.5098, lng: 7.7182 } },
address: { street: 'Frenkenstrasse', houseNumber: '28', postalCode: '4402', city: 'Frenkendorf', country: 'CH' },
areaSqm: 3500,
rentPricePerSqm: 13,
availabilityDate: '2026-10-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.46,
dataQuality: {
score: 0.31,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Konditionen unbekannt'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-04-08T08:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
{
id: 'prop-030',
title: 'Bürofläche St.Gallen Riethüsli (Signal: Expansion)',
assetType: AssetType.OFFICE,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'St. Gallen', district: 'Riethüsli', canton: 'SG', country: 'CH', coordinates: { lat: 47.4182, lng: 9.3888 } },
address: { street: 'Riethüslistrasse', houseNumber: '40', postalCode: '9000', city: 'St. Gallen', country: 'CH' },
areaSqm: 480,
rentPricePerSqm: 27,
availabilityDate: '2026-05-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.55,
dataQuality: {
score: 0.36,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Lage und Preis approximiert'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-04-26T07:00:00Z',
updatedAt: '2025-05-10T08:00:00Z',
},
]