303 lines
10 KiB
TypeScript
303 lines
10 KiB
TypeScript
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.',
|
||
},
|
||
]
|