feat: remove Administration workspace — keep only Verwaltung + Suche

- Delete all ops page components (ReviewQueue, AIMonitoring, Governance,
  SourceMonitoring, ActivityTimeline, SignalPipeline)
- Remove OPERATIONS workspace from AppShell config, nav order, path detection
- Remove all /ops/* routes from App.tsx
- Remove WorkspaceType.OPERATIONS from allowedWorkspaces in authService,
  sessionStore, permissions
- Keep MarketIntelligence page (already moved to /supply/market-intelligence)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-19 20:32:41 +02:00
parent d22e72f945
commit d15a13e485
378 changed files with 35441 additions and 42 deletions
@@ -0,0 +1,243 @@
import type { AIOutput } from '../domain/aiOutput'
export const mockAIOutputs: AIOutput[] = [
{
id: 'aio-001',
type: 'NEED_PARSE',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'need-parse-v2.3',
schemaVersion: 'schema-v4',
inputHash: 'a7f3b2c1',
outputPreview: '{"criteria":{"area":{"min":300,"max":800},"location":"Zürich","type":"Büro","budget":{"max":12000}},"confidence":0.94}',
createdAt: '2026-05-17T10:24:00Z',
latencyMs: 1240,
costEstimate: 0.0034,
reviewStatus: 'UNREVIEWED',
relatedEntityType: 'NEED',
relatedEntityId: 'need-001',
},
{
id: 'aio-002',
type: 'MATCH_EXPLANATION',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'match-explain-v1.8',
schemaVersion: 'schema-v3',
inputHash: 'c8d4e9f2',
outputPreview: 'Dieses Objekt erfüllt 4 von 5 Hardkriterien: Fläche 450m² (✓), Lage Zürich-Innenstadt (✓), Budget CHF 9\'500/Mt (✓), Parkplätze 2/3 (✗), Verfügbarkeit Q3 2026 (✓).',
createdAt: '2026-05-17T09:15:00Z',
latencyMs: 2100,
costEstimate: 0.0089,
reviewStatus: 'APPROVED',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-003',
},
{
id: 'aio-003',
type: 'DATA_QUALITY_SUMMARY',
provider: 'anthropic',
model: 'claude-3-haiku-20240307',
promptVersion: 'dq-summary-v1.2',
schemaVersion: 'schema-v2',
inputHash: 'f1a2b3c4',
outputPreview: '[FEHLER: Antwort nach 8.5s unterbrochen]',
createdAt: '2026-05-17T08:45:00Z',
latencyMs: 8500,
reviewStatus: 'FLAGGED',
relatedEntityType: 'PROPERTY',
relatedEntityId: 'prop-007',
error: {
type: 'PROVIDER_TIMEOUT',
message: 'Request timed out after 8500ms. Provider did not respond within the allowed window.',
recoverable: true,
},
},
{
id: 'aio-004',
type: 'FOLLOW_UP_QUESTIONS',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'follow-up-v1.5',
schemaVersion: 'schema-v3',
inputHash: 'b2c9d7e3',
outputPreview: '["Welche Nutzungsart bevorzugen Sie: Open Space oder Einzelbüros?","Ist ein Außenbereich oder Dachterrasse gewünscht?","Bis wann benötigen Sie die Fläche?"]',
createdAt: '2026-05-17T08:02:00Z',
latencyMs: 890,
costEstimate: 0.0021,
reviewStatus: 'UNREVIEWED',
relatedEntityType: 'NEED',
relatedEntityId: 'need-002',
},
{
id: 'aio-005',
type: 'COMPARE_SUMMARY',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'compare-v2.0',
schemaVersion: 'schema-v4',
inputHash: 'e4f5a6b7',
outputPreview: 'Vergleich prop-001 vs prop-003: prop-001 bietet 15% mehr Fläche (+90m²), jedoch CHF 800/Mt höhere Mietkosten. prop-003 überzeugt durch Lage und Ausbaustandard.',
createdAt: '2026-05-16T16:30:00Z',
latencyMs: 3200,
costEstimate: 0.0122,
reviewStatus: 'IN_REVIEW',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-001',
},
{
id: 'aio-006',
type: 'DECISION_BRIEF',
provider: 'anthropic',
model: 'claude-3-opus-20240229',
promptVersion: 'decision-v1.1',
schemaVersion: 'schema-v2',
inputHash: 'c3d2e1f0',
outputPreview: 'Empfehlung: prop-002 priorisieren. Höchste Gesamtkongruenz (87%), einziges Objekt mit Außenfläche (250m²). Risiko: Mietpreiserhöhung +5% ab 2027 gemäß Mietvertrag.',
createdAt: '2026-05-16T14:10:00Z',
latencyMs: 4800,
costEstimate: 0.0341,
reviewStatus: 'UNREVIEWED',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-005',
},
{
id: 'aio-007',
type: 'MATCH_EXPLANATION',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'match-explain-v1.8',
schemaVersion: 'schema-v3',
inputHash: 'd9e8f7a6',
outputPreview: '[Schema-Validierung fehlgeschlagen: Pflichtfeld \'hardCriteria\' nicht vorhanden im Output]',
createdAt: '2026-05-16T11:55:00Z',
latencyMs: 1850,
reviewStatus: 'REJECTED',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-002',
error: {
type: 'SCHEMA_VALIDATION',
message: 'Output schema validation failed: required field \'hardCriteria\' missing. Output was not delivered to UI.',
recoverable: false,
},
},
{
id: 'aio-008',
type: 'NEED_PARSE',
provider: 'anthropic',
model: 'claude-3-haiku-20240307',
promptVersion: 'need-parse-v2.2',
schemaVersion: 'schema-v4',
inputHash: 'a1b2c3d4',
outputPreview: '{"criteria":{"area":{"min":500},"location":"Bern","type":"Logistik","budget":{"max":8000}},"confidence":0.91}',
createdAt: '2026-05-16T09:40:00Z',
latencyMs: 560,
costEstimate: 0.0009,
reviewStatus: 'APPROVED',
relatedEntityType: 'NEED',
relatedEntityId: 'need-003',
},
{
id: 'aio-009',
type: 'DATA_QUALITY_SUMMARY',
provider: 'anthropic',
model: 'claude-3-haiku-20240307',
promptVersion: 'dq-summary-v1.2',
schemaVersion: 'schema-v2',
inputHash: 'f8e7d6c5',
outputPreview: 'Qualitätsscore: 72%. Fehlende Felder: Mietpreis/m² (kritisch), letzte Aktualisierung > 6 Monate. Empfehlung: Aktualisierung anfordern.',
createdAt: '2026-05-16T08:15:00Z',
latencyMs: 1100,
costEstimate: 0.0018,
reviewStatus: 'UNREVIEWED',
relatedEntityType: 'PROPERTY',
relatedEntityId: 'prop-003',
},
{
id: 'aio-010',
type: 'COMPARE_SUMMARY',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'compare-v2.0',
schemaVersion: 'schema-v4',
inputHash: 'b5c4d3e2',
outputPreview: '[Invalid JSON: unexpected token at position 142 — output truncated mid-generation]',
createdAt: '2026-05-15T17:20:00Z',
latencyMs: 2900,
reviewStatus: 'FLAGGED',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-007',
error: {
type: 'INVALID_JSON',
message: 'Response contained malformed JSON: unexpected token at position 142. Likely caused by mid-stream truncation.',
recoverable: true,
},
},
{
id: 'aio-011',
type: 'FOLLOW_UP_QUESTIONS',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'follow-up-v1.5',
schemaVersion: 'schema-v3',
inputHash: 'c6d5e4f3',
outputPreview: '["Welche ÖPNV-Anbindung ist Mindestanforderung?","Benötigen Sie eigene Ladeinfrastruktur für E-Fahrzeuge?","Ist Co-Working-Anteil vorstellbar?"]',
createdAt: '2026-05-15T14:50:00Z',
latencyMs: 1450,
costEstimate: 0.0028,
reviewStatus: 'IN_REVIEW',
relatedEntityType: 'NEED',
relatedEntityId: 'need-004',
},
{
id: 'aio-012',
type: 'DECISION_BRIEF',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'decision-v1.2',
schemaVersion: 'schema-v2',
inputHash: 'd7e6f5a4',
outputPreview: 'Empfehlung: Angebot annehmen. Match-Score 91%, alle Hardkriterien erfüllt. Fläche 680m² entspricht Profil (600750m²). Nächste Schritte: Kontaktfreigabe beantragen.',
createdAt: '2026-05-15T11:30:00Z',
latencyMs: 3900,
costEstimate: 0.0198,
reviewStatus: 'APPROVED',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-004',
},
{
id: 'aio-013',
type: 'NEED_PARSE',
provider: 'anthropic',
model: 'claude-3-5-sonnet-20241022',
promptVersion: 'need-parse-v2.3',
schemaVersion: 'schema-v4',
inputHash: 'e8f7a6b5',
outputPreview: '[Leere Antwort empfangen — kein Output generiert]',
createdAt: '2026-05-15T09:05:00Z',
reviewStatus: 'FLAGGED',
relatedEntityType: 'NEED',
relatedEntityId: 'need-005',
error: {
type: 'EMPTY_RESPONSE',
message: 'Provider returned an empty response body. No tokens were generated. Request may have been filtered.',
recoverable: true,
},
},
{
id: 'aio-014',
type: 'MATCH_EXPLANATION',
provider: 'anthropic',
model: 'claude-3-opus-20240229',
promptVersion: 'match-explain-v1.9',
schemaVersion: 'schema-v3',
inputHash: 'f9a8b7c6',
outputPreview: 'Detailbegründung: Bürofläche 520m² entspricht exakt dem Suchprofil (500600m²). Mietpreis CHF 11\'200/Mt liegt 6.7% über Budget, jedoch kompensiert durch Lagequalität Zürich City.',
createdAt: '2026-05-15T08:00:00Z',
latencyMs: 5200,
costEstimate: 0.0412,
reviewStatus: 'UNREVIEWED',
relatedEntityType: 'MATCH',
relatedEntityId: 'match-009',
},
]
@@ -0,0 +1,302 @@
import type { DataSource, ConnectorRun } from '../domain/dataSource'
import {
DataSourceType,
SourceStatus,
TermsStatus,
ConnectorRunStatus,
} from '../domain/dataSource'
import { FreshnessStatus } from '../domain/enums'
export const MOCK_DATA_SOURCES: DataSource[] = [
{
id: 'src-001',
name: 'ImmoScout24 Zürich/Bern Feed',
sourceType: DataSourceType.PUBLIC_WEB_SOURCE,
legalBasis: 'Öffentlich zugängliche Listings keine personenbezogenen Daten',
termsStatus: TermsStatus.NEEDS_LEGAL_REVIEW,
dataCategories: ['Gewerbeimmobilien', 'Mietpreise', 'Verfügbarkeit'],
supportedAssetTypes: ['OFFICE', 'RETAIL', 'LIGHT_INDUSTRIAL'],
regionCoverage: ['Zürich', 'Bern', 'Basel'],
reliabilityScore: 0.72,
freshnessStatus: FreshnessStatus.FRESH,
lastRunAt: '2026-05-15T06:00:00Z',
nextRunAt: '2026-05-16T06:00:00Z',
status: SourceStatus.ACTIVE,
notes: 'Daily refresh via FUTURE_CRAWLER_STUB. Rechtliche Freigabe ausstehend.',
},
{
id: 'src-002',
name: 'Ideal Sharing Portfolio Export',
sourceType: DataSourceType.INTERNAL_PORTFOLIO_EXPORT,
ownerOrganizationId: 'org-001',
legalBasis: 'Internes Dateneigentum vollständig genehmigt',
termsStatus: TermsStatus.APPROVED,
dataCategories: ['Portoflio', 'Mietverträge', 'Flächen'],
supportedAssetTypes: ['OFFICE', 'LOGISTICS', 'MIXED'],
regionCoverage: ['Zürich', 'Zug', 'Luzern'],
reliabilityScore: 0.97,
freshnessStatus: FreshnessStatus.FRESH,
lastRunAt: '2026-05-15T02:00:00Z',
nextRunAt: '2026-05-15T14:00:00Z',
status: SourceStatus.ACTIVE,
},
{
id: 'src-003',
name: 'CBRE Market Data API',
sourceType: DataSourceType.API_CONNECTOR,
ownerOrganizationId: 'org-002',
legalBasis: 'API-Lizenzvertrag mit CBRE vom 12.01.2026',
termsStatus: TermsStatus.APPROVED,
dataCategories: ['Marktdaten', 'Mietindizes', 'Transaktionsvolumen'],
supportedAssetTypes: ['OFFICE', 'RETAIL', 'LOGISTICS'],
regionCoverage: ['Schweiz', 'DACH'],
reliabilityScore: 0.91,
freshnessStatus: FreshnessStatus.STALE,
lastRunAt: '2026-05-13T10:00:00Z',
nextRunAt: '2026-05-17T10:00:00Z',
status: SourceStatus.ACTIVE,
notes: 'Wöchentlicher Refresh Quarterly Report verfügbar.',
},
{
id: 'src-004',
name: 'Handelsregister CH Firmenumzüge',
sourceType: DataSourceType.PUBLIC_WEB_SOURCE,
legalBasis: 'Öffentliches Staatsregister (SHAB)',
termsStatus: TermsStatus.APPROVED,
dataCategories: ['Firmensitze', 'Umzüge', 'Neugründungen'],
supportedAssetTypes: ['OFFICE', 'MIXED'],
regionCoverage: ['Schweiz'],
reliabilityScore: 0.88,
freshnessStatus: FreshnessStatus.FRESH,
lastRunAt: '2026-05-15T03:30:00Z',
nextRunAt: '2026-05-16T03:30:00Z',
status: SourceStatus.ACTIVE,
},
{
id: 'src-005',
name: 'Baubewilligungsregister Kt. Zürich',
sourceType: DataSourceType.FUTURE_CRAWLER_STUB,
legalBasis: 'Amtliche Publikation öffentlich zugänglich',
termsStatus: TermsStatus.UNKNOWN,
dataCategories: ['Baubewilligungen', 'Umnutzungen', 'Abbrüche'],
supportedAssetTypes: ['OFFICE', 'PRODUCTION', 'LIGHT_INDUSTRIAL'],
regionCoverage: ['Kanton Zürich'],
reliabilityScore: 0.65,
freshnessStatus: FreshnessStatus.OUTDATED,
lastRunAt: '2026-04-30T08:00:00Z',
status: SourceStatus.PENDING_REVIEW,
notes: 'Crawler-Implementierung noch ausstehend. Manuelle Prüfung erforderlich.',
},
{
id: 'src-006',
name: 'Mietvertragsdaten (CSV Upload Q1 2026)',
sourceType: DataSourceType.CSV_IMPORT,
ownerOrganizationId: 'org-001',
legalBasis: 'Interner Upload durch Portfoliomanager DSGVO-konform',
termsStatus: TermsStatus.APPROVED,
dataCategories: ['Mietverträge', 'Laufzeiten', 'Mieter'],
supportedAssetTypes: ['OFFICE', 'RETAIL'],
regionCoverage: ['Zürich', 'Basel'],
reliabilityScore: 0.84,
freshnessStatus: FreshnessStatus.STALE,
lastRunAt: '2026-03-31T09:00:00Z',
status: SourceStatus.PAUSED,
notes: 'Q2-Upload ausstehend. Quelle pausiert bis neue Datei verfügbar.',
},
{
id: 'src-007',
name: 'JLL Research Partner Feed',
sourceType: DataSourceType.PARTNER_FEED,
ownerOrganizationId: 'org-003',
legalBasis: 'Datenaustauschabkommen mit JLL Schweiz AG vertraulich',
termsStatus: TermsStatus.RESTRICTED,
dataCategories: ['Marktberichte', 'Leerstandsquoten', 'Prime Rents'],
supportedAssetTypes: ['OFFICE', 'LOGISTICS'],
regionCoverage: ['Zürich', 'Genf', 'Basel'],
reliabilityScore: 0.93,
freshnessStatus: FreshnessStatus.FRESH,
lastRunAt: '2026-05-15T07:00:00Z',
nextRunAt: '2026-05-22T07:00:00Z',
status: SourceStatus.ACTIVE,
notes: 'Wöchentlicher Push durch JLL. Nur für interne Nutzung kein Re-Export.',
},
{
id: 'src-008',
name: 'Analyst-Eingaben (Team Zürich)',
sourceType: DataSourceType.ANALYST_ENTRY,
ownerOrganizationId: 'org-001',
legalBasis: 'Interne Datenerhebung durch Analysten-Team',
termsStatus: TermsStatus.APPROVED,
dataCategories: ['Marktsignale', 'Qualitative Einschätzungen', 'Netzwerkinfos'],
supportedAssetTypes: ['OFFICE', 'RETAIL', 'MIXED'],
regionCoverage: ['Zürich', 'Winterthur'],
reliabilityScore: 0.78,
freshnessStatus: FreshnessStatus.FRESH,
lastRunAt: '2026-05-14T16:45:00Z',
status: SourceStatus.ACTIVE,
},
{
id: 'src-009',
name: 'Homegate Gewerbe-Scraper (Beta)',
sourceType: DataSourceType.FUTURE_CRAWLER_STUB,
legalBasis: 'In rechtlicher Prüfung noch nicht freigegeben',
termsStatus: TermsStatus.BLOCKED,
dataCategories: ['Gewerbelistings', 'Mietpreise'],
supportedAssetTypes: ['OFFICE', 'RETAIL'],
regionCoverage: ['Schweiz'],
reliabilityScore: 0.0,
freshnessStatus: FreshnessStatus.OUTDATED,
status: SourceStatus.DISABLED,
errorState: 'Quelle gesperrt robots.txt-Prüfung negativ, AGB untersagt automatisiertes Crawling.',
},
]
export const MOCK_CONNECTOR_RUNS: ConnectorRun[] = [
// src-001 runs
{
id: 'run-001-a',
sourceId: 'src-001',
startedAt: '2026-05-15T06:00:00Z',
finishedAt: '2026-05-15T06:12:34Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 342,
itemsNormalized: 318,
itemsRejected: 24,
signalsCreated: 7,
errors: [],
warnings: ['24 Einträge ohne gültige Flächenangabe übersprungen'],
runSummary: '342 Listings importiert. 318 normalisiert, 7 neue Marktsignale erkannt.',
},
{
id: 'run-001-b',
sourceId: 'src-001',
startedAt: '2026-05-14T06:00:00Z',
finishedAt: '2026-05-14T06:09:11Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 289,
itemsNormalized: 277,
itemsRejected: 12,
signalsCreated: 4,
errors: [],
warnings: [],
runSummary: '289 Listings importiert. 4 neue Marktsignale erkannt.',
},
{
id: 'run-001-c',
sourceId: 'src-001',
startedAt: '2026-05-13T06:00:00Z',
finishedAt: '2026-05-13T06:04:22Z',
status: ConnectorRunStatus.PARTIAL,
itemsDetected: 310,
itemsNormalized: 201,
itemsRejected: 109,
signalsCreated: 2,
errors: ['HTTP 429 nach 201 Einträgen Rate Limit erreicht'],
warnings: ['109 Einträge konnten nicht abgerufen werden'],
runSummary: 'Teilimport wegen Rate Limiting. 201 von 310 Einträgen verarbeitet.',
},
// src-002 runs
{
id: 'run-002-a',
sourceId: 'src-002',
startedAt: '2026-05-15T02:00:00Z',
finishedAt: '2026-05-15T02:03:08Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 1240,
itemsNormalized: 1240,
itemsRejected: 0,
signalsCreated: 12,
errors: [],
warnings: [],
runSummary: 'Vollständiger Portfolio-Sync. 12 Lease-Expiry-Signale erzeugt.',
},
{
id: 'run-002-b',
sourceId: 'src-002',
startedAt: '2026-05-14T14:00:00Z',
finishedAt: '2026-05-14T14:02:55Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 1238,
itemsNormalized: 1238,
itemsRejected: 0,
signalsCreated: 3,
errors: [],
warnings: [],
runSummary: 'Delta-Sync erfolgreich. 3 neue Objekte hinzugefügt.',
},
// src-003 runs
{
id: 'run-003-a',
sourceId: 'src-003',
startedAt: '2026-05-13T10:00:00Z',
finishedAt: '2026-05-13T10:18:42Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 86,
itemsNormalized: 86,
itemsRejected: 0,
signalsCreated: 0,
errors: [],
warnings: ['Quartalsdaten verfügbar manueller Review empfohlen'],
runSummary: 'Marktdaten-Update Q1 2026 importiert. 86 Datenpunkte aktualisiert.',
},
// src-004 runs
{
id: 'run-004-a',
sourceId: 'src-004',
startedAt: '2026-05-15T03:30:00Z',
finishedAt: '2026-05-15T03:44:17Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 523,
itemsNormalized: 498,
itemsRejected: 25,
signalsCreated: 9,
errors: [],
warnings: ['25 Einträge ohne Adressangabe ignoriert'],
runSummary: '523 Handelsregistereinträge geprüft. 9 Firmensitz-Signale erkannt.',
},
// src-007 runs
{
id: 'run-007-a',
sourceId: 'src-007',
startedAt: '2026-05-15T07:00:00Z',
finishedAt: '2026-05-15T07:05:30Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 14,
itemsNormalized: 14,
itemsRejected: 0,
signalsCreated: 3,
errors: [],
warnings: [],
runSummary: 'JLL Weekly Report verarbeitet. 3 Marktberichte als Signale importiert.',
},
// src-008 runs
{
id: 'run-008-a',
sourceId: 'src-008',
startedAt: '2026-05-14T16:45:00Z',
finishedAt: '2026-05-14T16:45:52Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 3,
itemsNormalized: 3,
itemsRejected: 0,
signalsCreated: 3,
errors: [],
warnings: [],
runSummary: '3 manuelle Analysten-Einträge verarbeitet. Je 1 Signal pro Eintrag.',
},
// src-006 last run before pause
{
id: 'run-006-a',
sourceId: 'src-006',
startedAt: '2026-03-31T09:00:00Z',
finishedAt: '2026-03-31T09:02:19Z',
status: ConnectorRunStatus.COMPLETED,
itemsDetected: 412,
itemsNormalized: 408,
itemsRejected: 4,
signalsCreated: 18,
errors: [],
warnings: ['4 Einträge mit doppelter Vertrags-ID ignoriert'],
runSummary: 'Q1 CSV verarbeitet. 408 Mietverträge importiert, 18 Lease-Expiry-Signale.',
},
]
@@ -0,0 +1,428 @@
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,
companyName: 'DataCloud Systems AG',
locationHint: 'Zürich-West / Technopark',
areaSqmEstimate: 600,
probability: 0.72,
confidenceScore: 0.68,
timeHorizonMonths: 10,
source: {
type: 'JOB_POSTING',
url: 'https://example.com/jobs/datacloud',
publishedAt: '2025-04-20',
credibility: 'MEDIUM',
},
sensitivityLevel: 'INTERNAL',
disclaimer: 'Dieses Signal basiert auf AI-Analyse öffentlicher Daten (Stelleninserate, Presseberichte). Es handelt sich um ein probabilistisches Signal, kein bestätigtes Objekt.',
riskLevel: RiskLevel.MEDIUM,
marketIndicator: 'Tech-Sektor Stellenwachstum +38% YoY',
relevanceScore: 0.76,
isVerified: false,
expiresAt: '2026-03-01',
organizationId: 'org-wincasa',
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,
companyName: 'Helvetia Produktion GmbH',
propertyId: 'prop-006',
locationHint: 'Reinach BL, Industriezone Nord',
areaSqmEstimate: 3200,
probability: 0.48,
confidenceScore: 0.44,
timeHorizonMonths: 13,
source: {
type: 'PRESS',
url: 'https://example.com/news/helvetia-restrukturierung',
publishedAt: '2025-03-15',
credibility: 'HIGH',
},
sensitivityLevel: 'CONFIDENTIAL',
disclaimer: 'Dieses Signal basiert auf Pressemeldungen zu Restrukturierungsplänen. Kein bestätigter Auszug. Vertraulich behandeln.',
riskLevel: RiskLevel.HIGH,
marketIndicator: 'Restrukturierungsankündigung Mutterkonzern',
relevanceScore: 0.61,
isVerified: false,
expiresAt: '2026-06-01',
organizationId: 'org-wincasa',
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,
locationHint: 'Bern, Wankdorf',
areaSqmEstimate: 4500,
probability: 0.85,
confidenceScore: 0.80,
timeHorizonMonths: 24,
source: {
type: 'CONSTRUCTION_PERMIT',
publishedAt: '2025-02-10',
credibility: 'HIGH',
},
sensitivityLevel: 'PUBLIC',
disclaimer: 'Baubewilligung öffentlich eingesehen. Fertigstellung gemäss Baugesuch Q1 2027. Vermietungsstart noch offen.',
riskLevel: RiskLevel.LOW,
marketIndicator: 'Neubau Büro/Gewerbeflächen Wankdorf West',
relevanceScore: 0.82,
isVerified: true,
verifiedBy: 'admin@ideal-sharing.ch',
verifiedAt: '2025-05-05T09:00:00Z',
expiresAt: '2027-03-01',
organizationId: 'org-wincasa',
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',
},
]
@@ -0,0 +1,6 @@
export { mockProperties } from './properties'
export { mockNeeds } from './needs'
export { mockMatches } from './matches'
export { mockFutureSignals } from './futureSignals'
export { mockShortlists } from './shortlists'
export { mockReviewQueue } from './reviewQueue'
@@ -0,0 +1,281 @@
import {
MarketSignalSourceCategory,
SignalProcessingStatus,
EvidenceType,
ExtractedEntityType,
} from '../domain/marketSignal'
import type { MarketSignal } from '../domain/marketSignal'
import { AssetType, SignalType, SensitivityLevel, FreshnessStatus } from '../domain/enums'
export const MOCK_MARKET_SIGNALS: MarketSignal[] = [
{
id: 'sig-001',
title: 'UBS plant 200 neue Stellen Büroflächenbedarf Zürich Innenstadt',
summary: 'UBS AG plant laut Medienbericht die Einstellung von 200 Spezialisten im Bereich Digital Banking bis Ende 2025. Standort ist primär Zürich. Der abgeleitete Flächenbedarf beträgt ca. 2\'500 m² zusätzlicher Bürofläche.',
sourceCategory: MarketSignalSourceCategory.COMPANY_NEWS,
sourceLabel: 'Neue Zürcher Zeitung',
sourceUrl: 'https://www.nzz.ch/',
detectedAt: '2025-05-10T09:23:00Z',
location: 'Zürich, ZH',
affectedAssetTypes: [AssetType.OFFICE],
signalType: SignalType.EXPANSION,
rawEvidenceSummary: '"UBS plant signifikante Aufstockung der digitalen Teams" NZZ 10.05.2025',
extractedEntities: [
{ type: ExtractedEntityType.COMPANY, value: 'UBS AG', confidence: 0.98 },
{ type: ExtractedEntityType.LOCATION, value: 'Zürich', confidence: 0.95 },
{ type: ExtractedEntityType.DATE, value: 'Ende 2025', confidence: 0.87 },
],
evidence: [
{
id: 'ev-001-1', signalId: 'sig-001',
evidenceType: EvidenceType.TEXT_EXCERPT,
content: '"UBS plant signifikante Aufstockung der digitalen Teams in Zürich" NZZ, 10.05.2025',
sourceUrl: 'https://www.nzz.ch/',
retrievedAt: '2025-05-10T09:23:00Z', confidence: 0.92,
},
],
sourceReliabilityScore: 0.85,
confidenceScore: 0.72,
sensitivityLevel: SensitivityLevel.INTERNAL,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.NEEDS_REVIEW,
analystNotes: 'Flächenbedarf abgeleitet, nicht direkt kommuniziert. Bestätigung durch Quellenanfrage empfohlen.',
createdAt: '2025-05-10T10:00:00Z',
updatedAt: '2025-05-11T08:00:00Z',
},
{
id: 'sig-002',
title: 'Baugesuch für neues Gewerbepark-Areal in Basel-Nord',
summary: 'Im Handelsregister Basel-Stadt wurde ein Baugesuch für ein gemischt genutztes Gewerbeareal mit ca. 8\'000 m² Nutzfläche eingereicht. Projekt umfasst Büro, Logistik und Retail. Baubeginn geplant für Q1 2026.',
sourceCategory: MarketSignalSourceCategory.BUILDING_PERMIT_REGISTER,
sourceLabel: 'Bau- und Gastgewerbeinspektorat Basel-Stadt',
detectedAt: '2025-05-08T14:00:00Z',
location: 'Basel, BS',
affectedAssetTypes: [AssetType.OFFICE, AssetType.LOGISTICS, AssetType.RETAIL],
signalType: SignalType.CONSTRUCTION_PROJECT,
rawEvidenceSummary: 'Baugesuch Nr. BS-2025-0312 gemischte Gewerbefläche, 8\'000 m², Basel-Nord',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Basel-Nord', confidence: 0.97 },
{ type: ExtractedEntityType.ASSET, value: 'Gewerbeareal 8\'000 m²', confidence: 0.88 },
{ type: ExtractedEntityType.DATE, value: 'Q1 2026', confidence: 0.83 },
],
evidence: [
{
id: 'ev-002-1', signalId: 'sig-002',
evidenceType: EvidenceType.URL_REFERENCE,
content: 'Baugesuch Nr. BS-2025-0312, Bau- und Gastgewerbeinspektorat Basel-Stadt',
retrievedAt: '2025-05-08T14:00:00Z', confidence: 0.95,
},
],
sourceReliabilityScore: 0.92,
confidenceScore: 0.88,
sensitivityLevel: SensitivityLevel.PUBLIC,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.APPROVED_AS_SIGNAL,
analystNotes: 'Öffentliches Register. Hohe Verlässlichkeit. Eigentümerstruktur noch nicht ermittelt.',
createdAt: '2025-05-08T15:00:00Z',
updatedAt: '2025-05-12T09:30:00Z',
},
{
id: 'sig-003',
title: 'Crypto-Unternehmen in Zug verdreifacht Belegschaft Expansionsbedarf',
summary: 'Ein in Zug ansässiges Blockchain-Unternehmen hat laut LinkedIn-Auswertung innerhalb von 6 Monaten 80 neue Stellen ausgeschrieben. Bisherige Bürofläche reicht nicht mehr aus. Umzug oder Erweiterung erwartet.',
sourceCategory: MarketSignalSourceCategory.JOB_GROWTH_SIGNAL,
sourceLabel: 'LinkedIn Hiring Data',
detectedAt: '2025-05-09T11:30:00Z',
location: 'Zug, ZG',
affectedAssetTypes: [AssetType.OFFICE],
signalType: SignalType.EXPANSION,
rawEvidenceSummary: '80 offene Stellen in 6 Monaten (LinkedIn), Mitarbeiterzahl +210% YoY',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Zug', confidence: 0.91 },
{ type: ExtractedEntityType.DATE, value: '6 Monate', confidence: 0.78 },
],
evidence: [
{
id: 'ev-003-1', signalId: 'sig-003',
evidenceType: EvidenceType.TEXT_EXCERPT,
content: '80 offene Stellen in den letzten 6 Monaten. Mitarbeiterwachstum +210% gegenüber Vorjahr.',
retrievedAt: '2025-05-09T11:30:00Z', confidence: 0.78,
},
],
sourceReliabilityScore: 0.67,
confidenceScore: 0.61,
sensitivityLevel: SensitivityLevel.PUBLIC,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.ENRICHED,
analystNotes: 'Unternehmensname nicht öffentlich kommuniziert. Weitere Verifizierung über HR-Netzwerke empfohlen.',
createdAt: '2025-05-09T12:00:00Z',
updatedAt: '2025-05-11T14:00:00Z',
},
{
id: 'sig-004',
title: 'Vertragslaufdaten: Grossmieter Hardturmstrasse 201 läuft 03/2026 aus',
summary: 'Laut internen Vertragsdaten läuft der Mietvertrag eines Grossmieters an der Hardturmstrasse 201, Zürich, im März 2026 aus. Kontakt für Verlängerung wurde noch nicht aufgenommen. Mietfläche: ca. 3\'200 m².',
sourceCategory: MarketSignalSourceCategory.LEASE_EXPIRY_DATA,
sourceLabel: 'Internes ERP Vertragsverwaltung',
detectedAt: '2025-05-05T08:00:00Z',
location: 'Zürich-West, ZH',
affectedAssetTypes: [AssetType.OFFICE],
signalType: SignalType.POSSIBLE_MOVE_OUT,
rawEvidenceSummary: 'Vertrag ID V-2019-0481, Ablauf 31.03.2026, keine Verlängerungsoption',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Hardturmstrasse 201, Zürich', confidence: 0.99 },
{ type: ExtractedEntityType.DATE, value: '31.03.2026', confidence: 0.99 },
{ type: ExtractedEntityType.ASSET, value: '3\'200 m² Bürofläche', confidence: 0.97 },
],
evidence: [
{
id: 'ev-004-1', signalId: 'sig-004',
evidenceType: EvidenceType.DOCUMENT,
content: 'Mietvertrag V-2019-0481, Laufzeit bis 31.03.2026, keine Option auf Verlängerung.',
retrievedAt: '2025-05-05T08:00:00Z', confidence: 0.99,
},
],
sourceReliabilityScore: 0.99,
confidenceScore: 0.97,
sensitivityLevel: SensitivityLevel.CONFIDENTIAL,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.NEEDS_REVIEW,
analystNotes: 'VERTRAULICH Nur intern. Mieteridentität darf nicht in Demand Feed erscheinen. Property Manager informieren.',
createdAt: '2025-05-05T08:30:00Z',
updatedAt: '2025-05-10T10:00:00Z',
},
{
id: 'sig-005',
title: 'Sitzverlegung: Logistikunternehmen wechselt von Bern nach Zürich-Flughafen',
summary: 'Laut Handelsregistermutation hat ein mittelgrosses Logistikunternehmen seinen Hauptsitz von Bern nach Kloten verlegt. Aktiver Suchprozess nach Lagerfläche am Flughafen Zürich wahrscheinlich.',
sourceCategory: MarketSignalSourceCategory.COMMERCIAL_REGISTER,
sourceLabel: 'Handelsregister Schweiz Zefix',
sourceUrl: 'https://www.zefix.ch/',
detectedAt: '2025-05-07T16:20:00Z',
location: 'Kloten, ZH',
affectedAssetTypes: [AssetType.LOGISTICS],
signalType: SignalType.POSSIBLE_MOVE_OUT,
rawEvidenceSummary: 'HR-Mutation: Sitzverlegung von 3014 Bern nach 8302 Kloten, eingetragen 07.05.2025',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Kloten', confidence: 0.97 },
{ type: ExtractedEntityType.LOCATION, value: 'Bern', confidence: 0.97 },
{ type: ExtractedEntityType.DATE, value: '07.05.2025', confidence: 0.99 },
],
evidence: [
{
id: 'ev-005-1', signalId: 'sig-005',
evidenceType: EvidenceType.URL_REFERENCE,
content: 'Handelsregistermutation: Sitzverlegung von 3014 Bern nach 8302 Kloten, eingetragen 07.05.2025',
sourceUrl: 'https://www.zefix.ch/',
retrievedAt: '2025-05-07T16:20:00Z', confidence: 0.97,
},
],
sourceReliabilityScore: 0.91,
confidenceScore: 0.63,
sensitivityLevel: SensitivityLevel.PUBLIC,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.NORMALIZED,
analystNotes: 'Sitzverlegung bestätigt. Flächenbedarf am Zielort noch zu validieren.',
createdAt: '2025-05-07T17:00:00Z',
updatedAt: '2025-05-08T09:00:00Z',
},
{
id: 'sig-006',
title: 'Neue Ausschreibung: 800 m² Lager-/Logistik in Winterthur',
summary: 'Auf Immoscout24 wurde eine neue Ausschreibung für 800 m² Lagerfläche in Winterthur publiziert. Suche aktiv, Einzug ab September 2025 gewünscht.',
sourceCategory: MarketSignalSourceCategory.PUBLIC_LISTING_PLATFORM,
sourceLabel: 'Immoscout24',
sourceUrl: 'https://www.immoscout24.ch/',
detectedAt: '2025-05-12T08:15:00Z',
location: 'Winterthur, ZH',
affectedAssetTypes: [AssetType.LOGISTICS],
signalType: SignalType.EXPANSION,
rawEvidenceSummary: 'Inseratstitel: "800m² Lager gesucht Winterthur sofort" Immoscout24, 12.05.2025',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Winterthur', confidence: 0.99 },
{ type: ExtractedEntityType.ASSET, value: '800 m² Lagerfläche', confidence: 0.96 },
{ type: ExtractedEntityType.DATE, value: 'September 2025', confidence: 0.88 },
],
evidence: [
{
id: 'ev-006-1', signalId: 'sig-006',
evidenceType: EvidenceType.URL_REFERENCE,
content: '"800m² Lager gesucht Winterthur sofort" Immoscout24, 12.05.2025',
sourceUrl: 'https://www.immoscout24.ch/',
retrievedAt: '2025-05-12T08:15:00Z', confidence: 0.96,
},
],
sourceReliabilityScore: 0.78,
confidenceScore: 0.83,
sensitivityLevel: SensitivityLevel.PUBLIC,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.DETECTED,
analystNotes: '',
createdAt: '2025-05-12T08:30:00Z',
updatedAt: '2025-05-12T08:30:00Z',
},
{
id: 'sig-007',
title: 'Neue S-Bahn-Station Schlieren 2027 Aufwertung für Gewerbeflächen',
summary: 'Die SBB hat die neue Haltestelle Schlieren-West für 2027 bestätigt. Das umliegende Gewerbegebiet wird deutlich aufgewertet. Frühzeitige Positionierung im Büro- und Produktionssegment empfohlen.',
sourceCategory: MarketSignalSourceCategory.INFRASTRUCTURE_PROJECT,
sourceLabel: 'SBB Medienmitteilung',
sourceUrl: 'https://www.sbb.ch/de/medien.html',
detectedAt: '2025-05-06T10:00:00Z',
location: 'Schlieren, ZH',
affectedAssetTypes: [AssetType.OFFICE, AssetType.PRODUCTION],
signalType: SignalType.PROJECT_DEVELOPMENT,
rawEvidenceSummary: 'SBB bestätigt neue Haltestelle Schlieren-West, Inbetriebnahme Dezember 2027',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Schlieren-West', confidence: 0.98 },
{ type: ExtractedEntityType.DATE, value: 'Dezember 2027', confidence: 0.95 },
],
evidence: [
{
id: 'ev-007-1', signalId: 'sig-007',
evidenceType: EvidenceType.URL_REFERENCE,
content: 'SBB Medienmitteilung: Neue Haltestelle Schlieren-West, Inbetriebnahme Dezember 2027',
sourceUrl: 'https://www.sbb.ch/de/medien.html',
retrievedAt: '2025-05-06T10:00:00Z', confidence: 0.95,
},
],
sourceReliabilityScore: 0.96,
confidenceScore: 0.79,
sensitivityLevel: SensitivityLevel.PUBLIC,
freshnessStatus: FreshnessStatus.FRESH,
processingStatus: SignalProcessingStatus.ENRICHED,
analystNotes: 'Infrastrukturverbesserung. Kein direktes Verfügbarkeitssignal, aber relevanter Standortfaktor.',
createdAt: '2025-05-06T11:00:00Z',
updatedAt: '2025-05-10T15:00:00Z',
},
{
id: 'sig-008',
title: 'Analyst-Beobachtung: Leerstehende Etage Tour de Berne, Lausanne',
summary: 'Eigene Marktbeobachtung: Die 4. Etage im Bürogebäude "Tour de Berne" in Lausanne steht seit mindestens 3 Monaten leer. Kein offizielles Inserat gefunden. Mögliche Vermarktung oder Leerstand durch Eigentümer.',
sourceCategory: MarketSignalSourceCategory.MANUAL_ANALYST_SIGNAL,
sourceLabel: 'Eigene Beobachtung Marktanalyse Mai 2025',
detectedAt: '2025-05-03T14:30:00Z',
location: 'Lausanne, VD',
affectedAssetTypes: [AssetType.OFFICE],
signalType: SignalType.POSSIBLE_MOVE_OUT,
rawEvidenceSummary: 'Begehung 03.05.2025: 4. OG leer, keine Beschilderung, kein Inserat gefunden.',
extractedEntities: [
{ type: ExtractedEntityType.LOCATION, value: 'Tour de Berne, Lausanne', confidence: 0.94 },
{ type: ExtractedEntityType.ASSET, value: '4. Obergeschoss', confidence: 0.92 },
],
evidence: [
{
id: 'ev-008-1', signalId: 'sig-008',
evidenceType: EvidenceType.ANALYST_NOTE,
content: 'Vor-Ort-Begehung am 03.05.2025: 4. OG im Tour de Berne leer stehend, keine aktive Vermarktung erkennbar.',
retrievedAt: '2025-05-03T14:30:00Z', confidence: 0.82,
},
],
sourceReliabilityScore: 0.72,
confidenceScore: 0.68,
sensitivityLevel: SensitivityLevel.INTERNAL,
freshnessStatus: FreshnessStatus.STALE,
processingStatus: SignalProcessingStatus.CONVERTED_TO_FUTURE_AVAILABILITY,
possibleFutureSignalId: 'fs-lausanne-001',
analystNotes: 'Zu Future Availability überführt. Eigentümer Kontaktaufnahme ausstehend.',
createdAt: '2025-05-03T15:00:00Z',
updatedAt: '2025-05-13T11:00:00Z',
},
]
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,387 @@
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',
contactName: 'Sandra Meier',
assetType: AssetType.OFFICE,
requiredArea: { min: 600, max: 1000 },
preferredLocations: ['Zürich', 'Zürich-West', 'Zürich Kreis 5'],
excludedLocations: [],
budgetRange: { maxPerSqm: 45, maxMonthlyTotal: 40000, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-08-01',
latestMoveIn: '2026-01-01',
contractDurationMonths: 60,
flexibleTiming: true,
},
mustCriteriaText: ['ÖV-Anbindung < 5 Min', 'Mindestfläche 600m²', 'Ausbaugrad modern'],
softFactors: {
minPrestige: 70,
minAccessibility: 80,
requireParking: false,
maxPublicTransportMinutes: 6,
},
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.88,
extractedFromText: 'Wir suchen moderne Büroflächen in Zürich-West, ca. 700900m², Budget max CHF 42/m², Bezug Herbst 2025.',
organizationId: 'org-wincasa',
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',
contactName: 'Thomas Brun',
assetType: AssetType.LOGISTICS,
requiredArea: { min: 1500, max: 4000 },
preferredLocations: ['Basel', 'Muttenz', 'Pratteln', 'Reinach BL'],
budgetRange: { maxPerSqm: 18, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-09-01',
latestMoveIn: '2026-06-01',
contractDurationMonths: 36,
flexibleTiming: false,
},
mustCriteriaText: ['Autobahnanschluss < 5 Min', 'Rampe / Andienung', 'Hallenhöhe min 6m'],
softFactors: {
requireParking: true,
},
weightingProfile: {
area: 0.25,
location: 0.20,
budget: 0.20,
timing: 0.15,
prestige: 0.02,
accessibility: 0.10,
expansionPotential: 0.05,
flexibility: 0.03,
},
confidenceInCriteria: 0.94,
organizationId: 'org-wincasa',
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',
},
]
@@ -0,0 +1,975 @@
import { AssetType, ResultType, AvailabilityStatus, DataFreshness, RiskLevel } from '../domain/enums'
import type { Property } from '../domain/property'
export const mockProperties: Property[] = [
// ─────────────────────────────────────────────────────────────────────────────
// VERIFIED_PORTFOLIO (10)
// ─────────────────────────────────────────────────────────────────────────────
{
id: 'prop-001',
title: 'Bürofläche Zollstrasse 12',
assetType: AssetType.OFFICE,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Zürich', district: 'Zürich-West', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3882, lng: 8.5132 } },
address: { street: 'Zollstrasse', houseNumber: '12', postalCode: '8005', city: 'Zürich', country: 'CH' },
areaSqm: 850,
rentPricePerSqm: 38,
totalRentMonthly: 32300,
availabilityDate: '2025-09-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.97,
dataQuality: {
score: 0.92,
missingCriticalFields: [],
missingOptionalFields: ['expansionPotentialSqm'],
lastVerifiedAt: '2025-04-28',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 78,
accessibility: 90,
visibilityScore: 65,
talentAccess: 85,
parkingSpots: 12,
publicTransportMinutes: 4,
},
floorLevel: 3,
contractDurationMonths: 60,
ancillaryCosts: 5.5,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2025-01-10T08:00:00Z',
updatedAt: '2025-04-28T10:30:00Z',
},
{
id: 'prop-002',
title: 'Lagerfläche Hardstrasse 44',
assetType: AssetType.LOGISTICS,
resultType: ResultType.VERIFIED_PORTFOLIO,
location: { city: 'Basel', district: 'Kleinhüningen', canton: 'BS', country: 'CH', coordinates: { lat: 47.5736, lng: 7.5946 } },
address: { street: 'Hardstrasse', houseNumber: '44', postalCode: '4057', city: 'Basel', country: 'CH' },
areaSqm: 2400,
rentPricePerSqm: 14,
totalRentMonthly: 33600,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
confidenceScore: 0.99,
dataQuality: {
score: 0.96,
missingCriticalFields: [],
missingOptionalFields: [],
lastVerifiedAt: '2025-05-05',
freshness: DataFreshness.FRESH,
warnings: [],
},
softFactors: {
prestige: 40,
accessibility: 88,
parkingSpots: 30,
publicTransportMinutes: 12,
},
floorLevel: 0,
expansionPotentialSqm: 800,
contractDurationMonths: 36,
ancillaryCosts: 3.0,
riskLevel: RiskLevel.LOW,
organizationId: 'org-wincasa',
createdAt: '2024-11-20T09:00:00Z',
updatedAt: '2025-05-05T11:00:00Z',
},
{
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',
assetType: AssetType.RETAIL,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Bern', district: 'Innenstadt', canton: 'BE', country: 'CH', coordinates: { lat: 46.9483, lng: 7.4474 } },
address: { street: 'Bahnhofstrasse', houseNumber: '88', postalCode: '3011', city: 'Bern', country: 'CH' },
areaSqm: 320,
rentPricePerSqm: 95,
totalRentMonthly: 30400,
availabilityDate: '2025-08-15',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'MATCHOFFICE_SCRAPE',
sourceUrl: 'https://example.com/listing/prop-003',
confidenceScore: 0.71,
dataQuality: {
score: 0.62,
missingCriticalFields: ['contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel'],
lastVerifiedAt: '2025-04-10',
freshness: DataFreshness.STALE,
warnings: ['Mietpreis nicht bestätigt', 'Verfügbarkeit nicht verifiziert'],
},
softFactors: {
prestige: 92,
visibilityScore: 98,
passerbyFrequency: 'VERY_HIGH',
publicTransportMinutes: 2,
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-02-15T14:00:00Z',
updatedAt: '2025-04-10T09:00:00Z',
},
{
id: 'prop-004',
title: 'Gemischte Gewerbeeinheit Europaallee',
assetType: AssetType.MIXED,
resultType: ResultType.EXTERNAL_MARKET,
location: { city: 'Zürich', district: 'Kreis 4', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3775, lng: 8.5398 } },
address: { street: 'Europaallee', houseNumber: '21', postalCode: '8004', city: 'Zürich', country: 'CH' },
areaSqm: 1150,
rentPricePerSqm: 52,
totalRentMonthly: 59800,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'IMMOSCOUT_SCRAPE',
confidenceScore: 0.68,
dataQuality: {
score: 0.55,
missingCriticalFields: ['contractDurationMonths', 'ancillaryCosts'],
missingOptionalFields: ['softFactors'],
lastVerifiedAt: '2025-03-20',
freshness: DataFreshness.STALE,
warnings: ['Daten aus Drittquelle nicht verifiziert'],
},
riskLevel: RiskLevel.MEDIUM,
createdAt: '2025-03-01T10:00:00Z',
updatedAt: '2025-03-20T15:00:00Z',
},
{
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)',
assetType: AssetType.OFFICE,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Zürich', district: 'Technopark', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3923, lng: 8.5142 } },
address: { street: 'Technoparkstrasse', houseNumber: '1', postalCode: '8005', city: 'Zürich', country: 'CH' },
areaSqm: 600,
rentPricePerSqm: 42,
availabilityDate: '2026-03-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.55,
dataQuality: {
score: 0.38,
missingCriticalFields: ['totalRentMonthly', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'floorLevel', 'parkingSpots'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Daten nicht verifiziert'],
},
riskLevel: RiskLevel.HIGH,
createdAt: '2025-05-01T07:00:00Z',
updatedAt: '2025-05-10T07:00:00Z',
},
{
id: 'prop-006',
title: 'Produktionsfläche Reinach (Signal: möglicher Auszug)',
assetType: AssetType.PRODUCTION,
resultType: ResultType.FUTURE_AVAILABILITY,
location: { city: 'Reinach', district: 'Industriezone Nord', canton: 'BL', country: 'CH', coordinates: { lat: 47.4978, lng: 7.5933 } },
address: { street: 'Industriestrasse', houseNumber: '18', postalCode: '4153', city: 'Reinach', country: 'CH' },
areaSqm: 3200,
rentPricePerSqm: 11,
availabilityDate: '2026-06-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
confidenceScore: 0.48,
dataQuality: {
score: 0.30,
missingCriticalFields: ['totalRentMonthly', 'rentPricePerSqm', 'contractDurationMonths'],
missingOptionalFields: ['ancillaryCosts', 'softFactors'],
freshness: DataFreshness.FRESH,
warnings: ['Probabilistisches Signal kein bestätigtes Objekt', 'Mietpreis geschätzt'],
},
riskLevel: RiskLevel.HIGH,
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',
},
]
@@ -0,0 +1,187 @@
import type { ReviewTask } from '../domain/review'
export const mockReviewQueue: ReviewTask[] = [
{
id: 'rev-001',
entityType: 'FUTURE_SIGNAL',
entityId: 'sig-001',
title: 'Vertrauliches Signal: Auszug Zürich-Nord Seebach',
description: 'Signal mit Sensitivity RESTRICTED — muss vor Anzeige im Demand Feed manuell geprüft werden. KI-Konfidenz 82%. Quelle: Stellenausschreibungen.',
priority: 'CRITICAL',
status: 'PENDING',
createdBy: 'system',
createdAt: '2026-05-15T08:00:00Z',
updatedAt: '2026-05-15T08:00:00Z',
dueDate: '2026-05-19T17:00:00Z',
reviewNotes: [],
relatedOrganizationId: 'org-wincasa',
confidenceScore: 0.82,
riskLevel: 'HIGH',
},
{
id: 'rev-002',
entityType: 'LOW_CONFIDENCE_MATCH',
entityId: 'match-021',
title: 'Niedriger Konfidenz-Match: Bern Wabern Office',
description: 'Match-Score 47 mit Konfidenz 0.38. Fehlende Daten: Mietpreis, Ausbaustandard. AI-Begründung unsicher.',
priority: 'HIGH',
status: 'PENDING',
createdBy: 'system',
createdAt: '2026-05-15T09:30:00Z',
updatedAt: '2026-05-15T09:30:00Z',
dueDate: '2026-05-22T17:00:00Z',
reviewNotes: [],
relatedOrganizationId: 'org-wincasa',
confidenceScore: 0.38,
riskLevel: 'MEDIUM',
matchId: 'match-021',
matchScore: 47,
},
{
id: 'rev-003',
entityType: 'CONTACT_RELEASE',
entityId: 'need-005',
title: 'Kontaktfreigabe: Mobimo Management AG → Zollstrasse 12',
description: 'Nachfrager Mobimo AG bittet um Direktkontakt mit Eigentümer Wincasa. Anfrage durch property-manager prüfen.',
priority: 'HIGH',
status: 'PENDING',
createdBy: 'user-dem',
createdAt: '2026-05-15T11:00:00Z',
updatedAt: '2026-05-15T11:00:00Z',
dueDate: '2026-05-20T17:00:00Z',
reviewNotes: [
{
id: 'note-001',
content: 'Nachfrager hat Bonität A+ bei CRIF. Anfrage scheint seriös.',
createdBy: 'admin@ideal-sharing.ch',
createdAt: '2026-05-15T12:00:00Z',
},
],
relatedOrganizationId: 'org-wincasa',
confidenceScore: 0.91,
riskLevel: 'LOW',
},
{
id: 'rev-004',
entityType: 'MATCH_EXPLANATION',
entityId: 'match-008',
title: 'Match-Begründung prüfen: Basel Logistik',
description: 'AI-Erklärung für Match enthält widersprüchliche Faktoren. Konfidenz niedrig bei Soft Factors.',
priority: 'HIGH',
status: 'IN_REVIEW',
assignedTo: 'user-rev',
createdBy: 'system',
createdAt: '2026-05-14T14:00:00Z',
updatedAt: '2026-05-15T08:30:00Z',
dueDate: '2026-05-18T17:00:00Z',
reviewNotes: [
{
id: 'note-002',
content: 'Soft Factor "Passantenfrequenz" ist für Logistik nicht relevant. Score neu berechnen.',
createdBy: 'reviewer@ideal-sharing.ch',
createdAt: '2026-05-15T08:30:00Z',
},
],
relatedOrganizationId: 'org-mobimo',
confidenceScore: 0.55,
riskLevel: 'MEDIUM',
matchId: 'match-008',
matchScore: 63,
},
{
id: 'rev-005',
entityType: 'AI_OUTPUT',
entityId: 'ai-summary-zug-001',
title: 'AI Portfolio-Zusammenfassung: Zug Kantonsstrasse',
description: 'Automatisch generierte Marktzusammenfassung für Zug-Portfolio. Vor Weitergabe an Eigentümer prüfen.',
priority: 'MEDIUM',
status: 'PENDING',
createdBy: 'system',
createdAt: '2026-05-14T10:00:00Z',
updatedAt: '2026-05-14T10:00:00Z',
reviewNotes: [],
relatedOrganizationId: 'org-ubs',
confidenceScore: 0.72,
riskLevel: 'LOW',
promptVersion: 'claude-3-5-sonnet-v1.2',
},
{
id: 'rev-006',
entityType: 'PROPERTY_DATA_ISSUE',
entityId: 'prop-031',
title: 'Datenfehler: Mietpreis fehlt — Bürofläche Winterthur',
description: 'Pflichtfeld Mietpreis/m² fehlt seit Import. Match-Scoring wird blockiert. Quelle: HomegateImport 2026-05-10.',
priority: 'MEDIUM',
status: 'NEEDS_MORE_DATA',
createdBy: 'system',
createdAt: '2026-05-13T07:00:00Z',
updatedAt: '2026-05-14T16:00:00Z',
reviewNotes: [
{
id: 'note-003',
content: 'PM wurde benachrichtigt. Wartet auf Rückmeldung vom Eigentümer.',
createdBy: 'admin@ideal-sharing.ch',
createdAt: '2026-05-14T16:00:00Z',
},
],
relatedOrganizationId: 'org-wincasa',
riskLevel: 'MEDIUM',
propertyId: 'prop-031',
},
{
id: 'rev-007',
entityType: 'FUTURE_SIGNAL',
entityId: 'sig-004',
title: 'Signal genehmigt: Baugesuch Basel-Gündeldingen',
description: 'Öffentliches Baugesuch für Büroumbau. Quelle: Kantonales Amtsblatt.',
priority: 'LOW',
status: 'APPROVED',
assignedTo: 'user-rev',
createdBy: 'system',
createdAt: '2026-05-10T09:00:00Z',
updatedAt: '2026-05-12T14:30:00Z',
reviewNotes: [
{
id: 'note-004',
content: 'Quelle verifiziert. Baugesuch öffentlich zugänglich. Freigabe für Demand Feed.',
createdBy: 'reviewer@ideal-sharing.ch',
createdAt: '2026-05-12T14:30:00Z',
},
],
relatedOrganizationId: 'org-wincasa',
confidenceScore: 0.78,
riskLevel: 'LOW',
},
{
id: 'rev-008',
entityType: 'LOW_CONFIDENCE_MATCH',
entityId: 'match-015',
title: 'Eskaliert: Match Zürich Retail — widersprüchliche Daten',
description: 'Match wurde eskaliert weil Fläche lt. Inserat (320m²) und Katasterdaten (290m²) abweichen.',
priority: 'CRITICAL',
status: 'ESCALATED',
assignedTo: 'user-001',
createdBy: 'user-rev',
createdAt: '2026-05-11T15:00:00Z',
updatedAt: '2026-05-13T09:00:00Z',
reviewNotes: [
{
id: 'note-005',
content: 'Abweichung 30m² zwischen Inserat und Kataster. Klärung mit Eigentümer notwendig.',
createdBy: 'reviewer@ideal-sharing.ch',
createdAt: '2026-05-12T10:00:00Z',
},
{
id: 'note-006',
content: 'An Org-Admin eskaliert für finale Entscheidung.',
createdBy: 'reviewer@ideal-sharing.ch',
createdAt: '2026-05-13T09:00:00Z',
},
],
relatedOrganizationId: 'org-wincasa',
confidenceScore: 0.44,
riskLevel: 'HIGH',
matchId: 'match-015',
matchScore: 61,
},
]
@@ -0,0 +1,71 @@
import type { Shortlist } from '../domain/shortlist'
import { ShortlistStatus } from '../domain/enums'
export const mockShortlists: Shortlist[] = [
{
id: 'shortlist-001',
title: 'Top Büroflächen Zürich',
description: 'Beste Bürooptionen für Innovatech AG',
needId: 'need-001',
items: [
{
resultId: 'match-001',
resultType: 'VERIFIED_PORTFOLIO',
title: 'Bürofläche Zollstrasse 12',
matchScore: 88,
confidenceScore: 0.92,
dataQualityScore: 0.85,
sourceLabel: 'Portfolio',
addedAt: '2025-03-01T10:00:00Z',
addedBy: 'admin@ideal-sharing.ch',
note: 'Erste Wahl',
propertyId: 'prop-001',
},
{
resultId: 'match-004',
resultType: 'VERIFIED_PORTFOLIO',
title: 'Gemischte Gewerbeeinheit Europaallee',
matchScore: 74,
confidenceScore: 0.78,
dataQualityScore: 0.80,
sourceLabel: 'Portfolio',
addedAt: '2025-03-02T14:30:00Z',
addedBy: 'admin@ideal-sharing.ch',
note: 'Interessante Alternative',
propertyId: 'prop-004',
},
],
status: ShortlistStatus.ACTIVE,
createdBy: 'user-001',
organizationId: 'org-wincasa',
createdAt: '2025-03-01T10:00:00Z',
updatedAt: '2025-03-02T14:30:00Z',
},
{
id: 'shortlist-002',
title: 'Logistik Optionen Basel',
description: 'Auswahl für Schweizer Logistik GmbH',
needId: 'need-002',
items: [
{
resultId: 'match-002',
resultType: 'VERIFIED_PORTFOLIO',
title: 'Lagerfläche Hardstrasse 44',
matchScore: 82,
confidenceScore: 0.88,
dataQualityScore: 0.90,
sourceLabel: 'Portfolio',
addedAt: '2025-03-05T09:00:00Z',
addedBy: 'admin@ideal-sharing.ch',
note: 'Perfekte Grösse',
propertyId: 'prop-002',
},
],
status: ShortlistStatus.REVIEW_READY,
createdBy: 'user-001',
organizationId: 'org-wincasa',
sharedWith: ['client@schweizer-logistik.ch'],
createdAt: '2025-03-05T09:00:00Z',
updatedAt: '2025-03-06T11:00:00Z',
},
]
@@ -0,0 +1,860 @@
import type { PipelineState, GateEvaluation, AuditTrailEntry } from '../domain/signalPipeline'
import { PipelineStage, GateType, GateStatus } from '../domain/signalPipeline'
function gate(
gateType: GateType,
status: GateStatus,
reason: string,
checks: GateEvaluation['checks'],
nextAction?: string,
): GateEvaluation {
return { gateType, status, reason, checks, nextAction, evaluatedAt: '2026-05-15T06:00:00Z' }
}
// ── sig-001: STAGE_4_REVIEW_CANDIDATE ─────────────────────────────────────────
const sig001Pipeline: PipelineState = {
signalId: 'sig-001',
currentStage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Mindestens ein valides Evidenzstück vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Neue Zürcher Zeitung' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.72 liegt über dem Mindestschwellenwert von 0.60.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.72' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.72', note: 'Mittlere Konfidenz' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Sensitivitätsstufe INTERNAL ist für interne Feed-Nutzung zulässig.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'INTERNAL' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal wartet auf manuellen Analyst-Review.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: false },
],
'Analyst-Review durchführen und Signal genehmigen oder ablehnen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit kann erst nach abgeschlossenem Review bewertet werden.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Zürich' },
{ label: 'Zeithorizont definiert', passed: false },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
'Review abschliessen, dann Matchbarkeit neu bewerten.',
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Review-Gate noch ausstehend.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
'Review und Matchbarkeits-Prüfung abschliessen.',
),
},
}
// ── sig-002: STAGE_5_APPROVED_FUTURE ─────────────────────────────────────────
const sig002Pipeline: PipelineState = {
signalId: 'sig-002',
currentStage: PipelineStage.STAGE_5_APPROVED_FUTURE,
overallEligible: true,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Baugesuchdokument als verlässliche Primärquelle vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Baugesuchregister BS' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.88 überschreitet den hohen Schwellenwert von 0.75.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.88' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.88' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche Quelle keine Einschränkungen.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PASSED,
'Signal durch Analyst M. Huber am 12.05.2026 genehmigt.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: true, value: 'M. Huber, 12.05.2026' },
{ label: 'Genehmigt', passed: true },
],
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PASSED,
'Alle Pflichtfelder für Match-Engine vorhanden.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE, LOGISTICS, RETAIL' },
{ label: 'Standort definiert', passed: true, value: 'Basel' },
{ label: 'Zeithorizont definiert', passed: true, value: 'Q1 2026' },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.PASSED,
'Alle Gates bestanden Signal ist feed-fähig.',
[
{ label: 'Review-Gate bestanden', passed: true },
{ label: 'Matchbarkeits-Gate bestanden', passed: true },
{ label: 'Sensitivität zulässig', passed: true, value: 'PUBLIC' },
],
),
},
}
// ── sig-003: STAGE_3_ENRICHED ─────────────────────────────────────────────────
const sig003Pipeline: PipelineState = {
signalId: 'sig-003',
currentStage: PipelineStage.STAGE_3_ENRICHED,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'LinkedIn-Datenauszug als Evidenz vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'LinkedIn Hiring Data' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PENDING,
'Konfidenzwert 0.61 liegt im Grenzbereich (0.600.65). Zusätzliche Validierung empfohlen.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.61', note: 'Grenzbereich' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.61' },
],
'Unternehmensidentität über HR-Netzwerke verifizieren, um Konfidenz zu erhöhen.',
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche Quelle keine Einschränkungen.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal noch nicht für Review eingereicht.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Signal für Analyst-Review einreichen nach Konfidenz-Verbesserung.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit noch nicht bewertet Anreicherung läuft.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Zug' },
{ label: 'Zeithorizont definiert', passed: false },
{ label: 'Geschäftsrelevanz vorhanden', passed: false, note: 'Unternehmensname unbekannt' },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Mehrere vorgelagerte Gates ausstehend.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
),
},
}
// ── sig-004: STAGE_4_REVIEW_CANDIDATE ─────────────────────────────────────────
const sig004Pipeline: PipelineState = {
signalId: 'sig-004',
currentStage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Mietvertragsdokument als primäre Evidenz vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Internes ERP' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.97 sehr hohe Verlässlichkeit (interne Vertragsdaten).',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.97' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.97' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.FAILED,
'Sensitivitätsstufe CONFIDENTIAL: Signal darf nicht im Demand Feed erscheinen. Mieteridentität ist schützenswert.',
[
{ label: 'Nicht CONFIDENTIAL', passed: false, value: 'CONFIDENTIAL', note: 'Interne Vertragsdaten nur für Property Manager' },
{ label: 'Nicht RESTRICTED', passed: true },
],
'Daten anonymisieren oder auf aggregierter Ebene veröffentlichen.',
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Review angefordert Sensitivitäts-Gate muss zuerst adressiert werden.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: false },
],
'Sensitivitätsproblem lösen, dann Review abschliessen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit ausstehend zuerst Sensitivitätsproblem lösen.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Zürich-West' },
{ label: 'Zeithorizont definiert', passed: true, value: '03/2026' },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Sensitivitäts-Gate fehlgeschlagen.',
[
{ label: 'Sensitivitäts-Gate bestanden', passed: false, value: 'CONFIDENTIAL' },
{ label: 'Review-Gate bestanden', passed: false },
],
'Anonymisierung der Mieterdaten durchführen.',
),
},
}
// ── sig-005: STAGE_2_NORMALIZED ───────────────────────────────────────────────
const sig005Pipeline: PipelineState = {
signalId: 'sig-005',
currentStage: PipelineStage.STAGE_2_NORMALIZED,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Handelsregistermutation als verlässliche Primärquelle.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Zefix Handelsregister Schweiz' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PENDING,
'Konfidenzwert 0.63 Sitzverlegung bestätigt, aber Flächenbedarf am Zielort noch nicht validiert.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.63', note: 'Grenzbereich' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.63' },
],
'Flächenbedarf in Kloten durch Direktkontakt oder weitere Quellenrecherche bestätigen.',
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliches Handelsregister keine Sensitivitätsbedenken.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal noch in Normalisierungsphase kein Review angefordert.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Anreicherung abschliessen, dann für Review einreichen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Anreicherung noch nicht abgeschlossen.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'LOGISTICS' },
{ label: 'Standort definiert', passed: true, value: 'Kloten' },
{ label: 'Zeithorizont definiert', passed: false },
{ label: 'Geschäftsrelevanz vorhanden', passed: false },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Signal befindet sich noch in der Normalisierungsphase.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
),
},
}
// ── sig-006: STAGE_1_RAW_EVIDENCE ────────────────────────────────────────────
const sig006Pipeline: PipelineState = {
signalId: 'sig-006',
currentStage: PipelineStage.STAGE_1_RAW_EVIDENCE,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Inserat auf Immoscout24 als Primärquelle vorhanden.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Immoscout24' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.83 direkte Nachfrage-Ausschreibung mit hoher Relevanz.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.83' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.83' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche Plattform keine Einschränkungen.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Signal soeben erkannt Normalisierung und Anreicherung noch ausstehend.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Signal normalisieren und anreichern, dann für Review einreichen.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PENDING,
'Matchbarkeit noch nicht bewertet Signal in früher Phase.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'LOGISTICS' },
{ label: 'Standort definiert', passed: true, value: 'Winterthur' },
{ label: 'Zeithorizont definiert', passed: true, value: 'September 2025' },
{ label: 'Geschäftsrelevanz vorhanden', passed: false },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Signal in Rohphase mehrere Stufen offen.',
[
{ label: 'Review-Gate bestanden', passed: false },
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
],
),
},
}
// ── sig-007: STAGE_3_ENRICHED ─────────────────────────────────────────────────
const sig007Pipeline: PipelineState = {
signalId: 'sig-007',
currentStage: PipelineStage.STAGE_3_ENRICHED,
overallEligible: false,
publishedToFutureAvailability: false,
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'SBB-Medienmitteilung als verlässliche behördliche Quelle.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'SBB Medienmitteilung' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.79 behördliche Bestätigung vorhanden.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.79' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: true, value: '0.79' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Öffentliche SBB-Mitteilung keine Sensitivitätsbedenken.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'PUBLIC' },
{ label: 'Nicht RESTRICTED', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PENDING,
'Matchbarkeits-Problem muss zuerst gelöst werden.',
[
{ label: 'Review angefordert', passed: false },
{ label: 'Review abgeschlossen', passed: false },
],
'Matchbarkeits-Frage klären (kein direktes Verfügbarkeitssignal), dann Review starten.',
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.FAILED,
'Signal Typ PROJECT_DEVELOPMENT ohne direktes Verfügbarkeitssignal kein konkreter Flächenbedarf erkennbar.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE, PRODUCTION' },
{ label: 'Standort definiert', passed: true, value: 'Schlieren' },
{ label: 'Zeithorizont definiert', passed: true, value: 'Dezember 2027' },
{ label: 'Direktes Verfügbarkeitssignal', passed: false, note: 'Infrastrukturverbesserung ohne konkreten Flächenbedarf' },
],
'Signal als strategischen Kontext-Input klassifizieren oder konkreten Bedarf nachweisen.',
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.BLOCKED,
'Feed-Eignung blockiert: Matchbarkeits-Gate fehlgeschlagen.',
[
{ label: 'Matchbarkeits-Gate bestanden', passed: false },
{ label: 'Review-Gate bestanden', passed: false },
],
'Signal als strategischen Input behandeln oder Matchbarkeit nachweisen.',
),
},
}
// ── sig-008: STAGE_6_MATCHABLE_RESULT ────────────────────────────────────────
const sig008Pipeline: PipelineState = {
signalId: 'sig-008',
currentStage: PipelineStage.STAGE_6_MATCHABLE_RESULT,
overallEligible: true,
publishedToFutureAvailability: true,
publishedAt: '2026-05-13T11:00:00Z',
feedDisclaimer: 'Nur in aggregierter Form Mieteridentität anonymisiert. Kein Rückschluss auf Vertragsparteien möglich.',
gates: {
EVIDENCE_GATE: gate(
GateType.EVIDENCE_GATE,
GateStatus.PASSED,
'Eigene Marktbeobachtung mit Vor-Ort-Begehung dokumentiert.',
[
{ label: 'Evidenz vorhanden', passed: true, value: '1 Stück' },
{ label: 'Quelle angegeben', passed: true, value: 'Eigene Beobachtung Marktanalyse' },
{ label: 'Inhalt nicht leer', passed: true },
],
),
CONFIDENCE_GATE: gate(
GateType.CONFIDENCE_GATE,
GateStatus.PASSED,
'Konfidenzwert 0.68 ausreichend für interne Verarbeitung.',
[
{ label: 'Konfidenz ≥ 0.60', passed: true, value: '0.68' },
{ label: 'Konfidenz ≥ 0.75 (hoch)', passed: false, value: '0.68', note: 'Mittlere Konfidenz akzeptiert' },
],
),
SENSITIVITY_GATE: gate(
GateType.SENSITIVITY_GATE,
GateStatus.PASSED,
'Sensitivitätsstufe INTERNAL mit Anonymisierungsauflage zulässig.',
[
{ label: 'Nicht CONFIDENTIAL', passed: true, value: 'INTERNAL' },
{ label: 'Nicht RESTRICTED', passed: true },
{ label: 'Anonymisierungsauflage gesetzt', passed: true },
],
),
REVIEW_GATE: gate(
GateType.REVIEW_GATE,
GateStatus.PASSED,
'Signal durch Analyst A. Müller am 13.05.2026 genehmigt und zur Publikation freigegeben.',
[
{ label: 'Review angefordert', passed: true },
{ label: 'Review abgeschlossen', passed: true, value: 'A. Müller, 13.05.2026' },
{ label: 'Genehmigt', passed: true },
],
),
MATCHABILITY_GATE: gate(
GateType.MATCHABILITY_GATE,
GateStatus.PASSED,
'Alle notwendigen Felder für Match-Engine vorhanden.',
[
{ label: 'Asset-Typ definiert', passed: true, value: 'OFFICE' },
{ label: 'Standort definiert', passed: true, value: 'Lausanne' },
{ label: 'Zeithorizont definiert', passed: true, value: 'Sofort verfügbar (3+ Monate leer)' },
{ label: 'Geschäftsrelevanz vorhanden', passed: true },
],
),
FEED_ELIGIBILITY_GATE: gate(
GateType.FEED_ELIGIBILITY_GATE,
GateStatus.PASSED,
'Signal im Future Availability Feed publiziert anonymisiert und aggregiert.',
[
{ label: 'Review-Gate bestanden', passed: true },
{ label: 'Matchbarkeits-Gate bestanden', passed: true },
{ label: 'Anonymisierungsauflage umgesetzt', passed: true },
{ label: 'Im Feed publiziert', passed: true, value: '13.05.2026' },
],
),
},
}
export const MOCK_PIPELINE_STATES: PipelineState[] = [
sig001Pipeline,
sig002Pipeline,
sig003Pipeline,
sig004Pipeline,
sig005Pipeline,
sig006Pipeline,
sig007Pipeline,
sig008Pipeline,
]
// ── Audit Trails ──────────────────────────────────────────────────────────────
export const MOCK_AUDIT_TRAILS: AuditTrailEntry[] = [
// sig-001
{
id: 'audit-001-1',
signalId: 'sig-001',
timestamp: '2025-05-10T09:23:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / NZZ-Connector',
details: 'Signal automatisch aus NZZ-Medienbericht extrahiert. Rohtext gespeichert.',
},
{
id: 'audit-001-2',
signalId: 'sig-001',
timestamp: '2025-05-10T10:05:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Felder normalisiert: Standort "Zürich ZH", Asset-Typ OFFICE, Signaltyp EXPANSION.',
},
{
id: 'audit-001-3',
signalId: 'sig-001',
timestamp: '2025-05-11T08:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Anreicherung abgeschlossen',
performedBy: 'System / Enrichment-Engine',
details: 'Entitäten extrahiert: UBS AG (Konfidenz 0.98), Zürich (0.95), Ende 2025 (0.87). Konfidenzwert: 0.72.',
},
{
id: 'audit-001-4',
signalId: 'sig-001',
timestamp: '2025-05-11T08:05:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Zur Prüfung eingereicht',
performedBy: 'System / Gate-Evaluator',
details: 'Evidenz-Gate, Konfidenz-Gate und Sensitivitäts-Gate bestanden. Review-Gate offen wartet auf Analyst.',
gateType: GateType.REVIEW_GATE,
},
// sig-002
{
id: 'audit-002-1',
signalId: 'sig-002',
timestamp: '2025-05-08T14:00:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / Baugesuch-Connector',
details: 'Baugesuch Nr. BS-2025-0312 aus öffentlichem Register extrahiert.',
},
{
id: 'audit-002-2',
signalId: 'sig-002',
timestamp: '2025-05-08T15:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Normalisierung und Anreicherung',
performedBy: 'System / NLP-Pipeline',
details: 'Alle Felder normalisiert und angereichert. Standort Basel-Nord, Asset-Typen: OFFICE, LOGISTICS, RETAIL. Konfidenz: 0.88.',
},
{
id: 'audit-002-3',
signalId: 'sig-002',
timestamp: '2025-05-12T09:30:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Analyst-Review gestartet',
performedBy: 'M. Huber',
details: 'Review-Kandidat angenommen. Öffentliche Quelle mit hoher Verlässlichkeit.',
},
{
id: 'audit-002-4',
signalId: 'sig-002',
timestamp: '2025-05-12T09:45:00Z',
stage: PipelineStage.STAGE_5_APPROVED_FUTURE,
action: 'Signal genehmigt',
performedBy: 'M. Huber',
details: 'Signal als Future Availability genehmigt. Alle Gates bestanden. Bereit zur Feed-Publikation.',
gateType: GateType.REVIEW_GATE,
},
// sig-003
{
id: 'audit-003-1',
signalId: 'sig-003',
timestamp: '2025-05-09T11:30:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / LinkedIn-Connector',
details: 'Stellenwachstumssignal aus LinkedIn-Daten extrahiert. 80 neue Stellenausschreibungen in 6 Monaten.',
},
{
id: 'audit-003-2',
signalId: 'sig-003',
timestamp: '2025-05-09T12:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Zug, Asset-Typ OFFICE, Signaltyp EXPANSION normalisiert. Unternehmensname nicht öffentlich.',
},
{
id: 'audit-003-3',
signalId: 'sig-003',
timestamp: '2025-05-11T14:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Anreicherung abgeschlossen',
performedBy: 'System / Enrichment-Engine',
details: 'Konfidenzwert 0.61 Grenzbereich. Unternehmensverifizierung empfohlen. Weiterer Review nötig.',
},
// sig-004
{
id: 'audit-004-1',
signalId: 'sig-004',
timestamp: '2025-05-05T08:00:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / ERP-Connector',
details: 'Vertragslaufdaten aus internem ERP importiert. Vertrag V-2019-0481, Ablauf 31.03.2026.',
},
{
id: 'audit-004-2',
signalId: 'sig-004',
timestamp: '2025-05-05T08:30:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Normalisierung und Anreicherung',
performedBy: 'System / NLP-Pipeline',
details: 'Alle Felder normalisiert. Hohe Konfidenz (0.97) da Primärquelle. Sensitivität CONFIDENTIAL erkannt.',
},
{
id: 'audit-004-3',
signalId: 'sig-004',
timestamp: '2025-05-10T10:00:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Sensitivitäts-Warnung gesetzt',
performedBy: 'System / Gate-Evaluator',
details: 'Sensitivitäts-Gate fehlgeschlagen: CONFIDENTIAL. Signal zur Review eingereicht mit Anonymisierungsauflage.',
gateType: GateType.SENSITIVITY_GATE,
},
{
id: 'audit-004-4',
signalId: 'sig-004',
timestamp: '2025-05-10T10:05:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Property Manager benachrichtigt',
performedBy: 'System / Notification-Service',
details: 'Property Manager über auslaufenden Grossmietvertrag informiert. Verlängerungsgespräch empfohlen.',
},
// sig-005
{
id: 'audit-005-1',
signalId: 'sig-005',
timestamp: '2025-05-07T16:20:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / Handelsregister-Connector',
details: 'Sitzverlegung aus Zefix extrahiert: 3014 Bern → 8302 Kloten, eingetragen 07.05.2025.',
},
{
id: 'audit-005-2',
signalId: 'sig-005',
timestamp: '2025-05-07T17:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Kloten (Zielort), Asset-Typ LOGISTICS normalisiert. Flächenbedarf noch nicht validiert.',
},
{
id: 'audit-005-3',
signalId: 'sig-005',
timestamp: '2025-05-08T09:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Anreicherung gestartet',
performedBy: 'System / Enrichment-Engine',
details: 'Konfidenzwert 0.63 Sitzverlegung bestätigt, konkreter Flächenbedarf am Zielort ausstehend.',
},
// sig-006
{
id: 'audit-006-1',
signalId: 'sig-006',
timestamp: '2025-05-12T08:15:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / Immoscout-Connector',
details: 'Neue Suchanzeige auf Immoscout24 erkannt: 800 m² Lagerfläche Winterthur, sofort gesucht.',
},
{
id: 'audit-006-2',
signalId: 'sig-006',
timestamp: '2025-05-12T08:30:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Evidenz-Gate bestanden',
performedBy: 'System / Gate-Evaluator',
details: 'Evidenz-Gate und Konfidenz-Gate (0.83) bestanden. Signal in Pipeline aufgenommen, Normalisierung startet.',
gateType: GateType.EVIDENCE_GATE,
},
// sig-007
{
id: 'audit-007-1',
signalId: 'sig-007',
timestamp: '2025-05-06T10:00:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal erkannt',
performedBy: 'System / SBB-Feed-Connector',
details: 'SBB-Medienmitteilung zur neuen Haltestelle Schlieren-West 2027 automatisch verarbeitet.',
},
{
id: 'audit-007-2',
signalId: 'sig-007',
timestamp: '2025-05-06T11:00:00Z',
stage: PipelineStage.STAGE_2_NORMALIZED,
action: 'Normalisierung abgeschlossen',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Schlieren, Asset-Typen OFFICE und PRODUCTION, Zeithorizont Dezember 2027 normalisiert.',
},
{
id: 'audit-007-3',
signalId: 'sig-007',
timestamp: '2025-05-10T15:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Matchbarkeits-Problem identifiziert',
performedBy: 'System / Gate-Evaluator',
details: 'Matchbarkeits-Gate fehlgeschlagen: PROJECT_DEVELOPMENT ohne direktes Verfügbarkeitssignal. Kein konkreter Flächenbedarf nachweisbar.',
gateType: GateType.MATCHABILITY_GATE,
},
{
id: 'audit-007-4',
signalId: 'sig-007',
timestamp: '2025-05-10T15:05:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Analyst-Notiz hinzugefügt',
performedBy: 'K. Bauer',
details: 'Infrastrukturverbesserung dokumentiert. Empfehlung: Als strategischen Kontext-Input behandeln, nicht als direktes Matchingobjekt.',
},
// sig-008
{
id: 'audit-008-1',
signalId: 'sig-008',
timestamp: '2025-05-03T14:30:00Z',
stage: PipelineStage.STAGE_1_RAW_EVIDENCE,
action: 'Signal manuell erfasst',
performedBy: 'A. Müller',
details: 'Vor-Ort-Begehung Tour de Berne, Lausanne. 4. OG leer stehend, keine Vermarktung erkennbar.',
},
{
id: 'audit-008-2',
signalId: 'sig-008',
timestamp: '2025-05-03T15:00:00Z',
stage: PipelineStage.STAGE_3_ENRICHED,
action: 'Normalisierung und Anreicherung',
performedBy: 'System / NLP-Pipeline',
details: 'Standort Lausanne, Asset-Typ OFFICE, Signaltyp POSSIBLE_MOVE_OUT normalisiert. Konfidenz 0.68.',
},
{
id: 'audit-008-3',
signalId: 'sig-008',
timestamp: '2025-05-13T10:30:00Z',
stage: PipelineStage.STAGE_4_REVIEW_CANDIDATE,
action: 'Analyst-Review abgeschlossen',
performedBy: 'A. Müller',
details: 'Signal geprüft und genehmigt. Anonymisierungsauflage gesetzt: Mieteridentität darf nicht kommuniziert werden.',
gateType: GateType.REVIEW_GATE,
},
{
id: 'audit-008-4',
signalId: 'sig-008',
timestamp: '2025-05-13T11:00:00Z',
stage: PipelineStage.STAGE_6_MATCHABLE_RESULT,
action: 'In Future Availability publiziert',
performedBy: 'A. Müller',
details: 'Signal als Future Availability "fs-lausanne-001" in den Feed übertragen. Anonymisierter Disclaimer aktiv.',
gateType: GateType.FEED_ELIGIBILITY_GATE,
},
]