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:
@@ -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 (600–750m²). 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 (500–600m²). 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 2025–2027',
|
||||
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 2025–2027',
|
||||
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. 700–900m², 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, 500–800m², 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, 250–450m², 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, 350–600m², 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, 900–1400m², 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, 200–350m², 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, 450–750m², 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.60–0.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,
|
||||
},
|
||||
]
|
||||
Reference in New Issue
Block a user