feat: Reminder Manager + Schattenmarkt-Freigabe + mock data overhaul
- Add Reminder Manager page (/supply/reminder-manager) with KPI bar, filter bar, list/card feed, and detail drawer (7 sections incl. activity log, snooze, complete, dismiss actions) - Add Schattenmarkt-Freigabe toggle on PropertyDetailView: Verwaltung can opt-in properties for early market exposure before contract expiry - Auto-generate FutureSignal cards via useSchattenmarktSignals hook when leaseEndDate - leadTimeMonths <= MOCK_TODAY - Fix useUnifiedResults: use property.resultType as fallback (was defaulting everything to VERIFIED_PORTFOLIO) - Fix demand Results: hide VERIFIED_PORTFOLIO from non-manager users even when showOwnProperties toggle was previously enabled - Fix AppShell: redirect to allowed workspace on user role switch - Fix 3 wrong match scores (match-002: 93→62, match-009: 86→55, match-017: 87→52) - Add 7 new match records (match-050–056) for need-001, need-002, need-011 - Add need-011 (Retail Bern Innenstadt) - Add prop-031–036 (EXTERNAL_MARKET / MAISON_WORK / FUTURE_AVAILABILITY) - Fix duplicate image URLs across all properties - Add signal-011 (Bern Altstadt, Mode Boutique) + propertyId to signal-001 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+335
-24
@@ -42,26 +42,28 @@ export const mockMatches: Match[] = [
|
||||
id: 'match-002',
|
||||
propertyId: 'prop-004',
|
||||
needId: 'need-001',
|
||||
matchScore: 93,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
matchScore: 62,
|
||||
matchStrength: MatchStrength.MODERATE,
|
||||
status: MatchStatus.SHORTLISTED,
|
||||
scoreBreakdown: { hardMatchScore: 95, softFactorScore: 91, confidenceModifier: 0.82, dataQualityModifier: 0.75, totalScore: 93 },
|
||||
scoreBreakdown: { hardMatchScore: 72, softFactorScore: 62, confidenceModifier: 0.68, dataQualityModifier: 0.55, totalScore: 62 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 88, contribution: 17.6, explanation: '1150m² liegt im erweiterten Korridor' },
|
||||
{ criterion: 'Standort', weight: 0.20, score: 80, contribution: 16, explanation: 'Zürich Kreis 4 nahe bevorzugten Lagen' },
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 78, contribution: 15.6, explanation: '1150m² überschreitet Zielkorridor leicht (600–1000m²)' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 40, contribution: 4, explanation: 'Mehrere kritische Felder fehlen – Verlässlichkeit eingeschränkt' },
|
||||
{ criterion: 'Mietpreis', weight: 0.15, score: 55, contribution: 8.25, explanation: 'CHF 52/m² deutlich über Budget' },
|
||||
{ criterion: 'Objekttyp', weight: 0.25, score: 30, contribution: 7.5, explanation: 'MIXED-Fläche – Bedarf ist OFFICE, Typ-Mismatch' },
|
||||
{ criterion: 'Standort', weight: 0.20, score: 55, contribution: 11, explanation: 'Zürich Kreis 4 ist nicht Zürich-West – andere Lage' },
|
||||
{ criterion: 'Mietpreis', weight: 0.15, score: 40, contribution: 6, explanation: 'CHF 52/m² ist 15% über Budget-Maximum (CHF 45/m²)' },
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 40, contribution: 4, explanation: 'Externe Quelle – Mietpreis und Verfügbarkeit nicht bestätigt' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Datenqualität', concern: 'Externe Quelle – Mietpreis und Verfügbarkeit nicht bestätigt', severity: 'HIGH', mitigation: 'Direkte Anfrage beim Anbieter empfohlen' },
|
||||
{ criterion: 'Budget', concern: 'Mietpreis 30% über Budget-Maximum', severity: 'HIGH' },
|
||||
{ criterion: 'Objekttyp', concern: 'MIXED-Fläche statt reiner Bürofläche – Nutzungseinschränkungen möglich', severity: 'HIGH' },
|
||||
{ criterion: 'Budget', concern: 'Mietpreis 15% über Budget-Maximum', severity: 'HIGH' },
|
||||
{ criterion: 'Standort', concern: 'Kreis 4 ist nicht Zürich-West – längere Pendeldistanz für Innovatech-Team', severity: 'MEDIUM' },
|
||||
],
|
||||
explainabilitySummary: 'Moderater Match – Fläche und Lage passen, aber Mietpreis und Datenqualität sind kritische Vorbehalte.',
|
||||
confidenceLevel: 0.58,
|
||||
explainabilitySummary: 'Schwacher Match aufgrund Typ-Mismatch (MIXED statt OFFICE), falschem Stadtteil (Kreis 4 ≠ Zürich-West) und Budgetüberschreitung von 15%.',
|
||||
confidenceLevel: 0.55,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Daten aus Drittquelle unvollständig', 'Mietpreis nicht verifiziert'],
|
||||
uncertaintyIndicators: ['Daten aus Drittquelle unvollständig', 'Mietpreis nicht verifiziert', 'Typ-Mismatch'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-10T08:05:00Z',
|
||||
updatedAt: '2025-05-10T08:05:00Z',
|
||||
@@ -181,21 +183,21 @@ export const mockMatches: Match[] = [
|
||||
id: 'match-009',
|
||||
propertyId: 'prop-015',
|
||||
needId: 'need-001',
|
||||
matchScore: 86,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
matchScore: 55,
|
||||
matchStrength: MatchStrength.MODERATE,
|
||||
status: MatchStatus.SHORTLISTED,
|
||||
scoreBreakdown: { hardMatchScore: 90, softFactorScore: 84, confidenceModifier: 0.76, dataQualityModifier: 0.72, totalScore: 86 },
|
||||
scoreBreakdown: { hardMatchScore: 68, softFactorScore: 60, confidenceModifier: 0.70, dataQualityModifier: 0.60, totalScore: 55 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 88, contribution: 17.6, explanation: '650m² im Zielkorridor' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 90, contribution: 13.5, explanation: 'CHF 38/m² unter Maximum' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Standort', weight: 0.20, score: 35, contribution: 7, explanation: 'Luzern liegt ausserhalb bevorzugter Lage Zürich' },
|
||||
{ criterion: 'Standort', weight: 0.20, score: 35, contribution: 7, explanation: 'Luzern ist eine andere Stadt und ein anderer Kanton – nicht Zürich' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Standort', concern: 'Luzern ist nicht in Zürich – komplett andere Stadt und Kanton', severity: 'HIGH' },
|
||||
{ criterion: 'Standort', concern: 'Luzern liegt 55 km von Zürich – kein Pendeln möglich', severity: 'HIGH' },
|
||||
],
|
||||
explainabilitySummary: 'Fläche und Budget passen, aber die Lage in Luzern ist nicht mit dem Bedarf Zürich kompatibel. Nur als letzte Option geeignet.',
|
||||
explainabilitySummary: 'Luzern passt nicht zu Zürich-West. Trotz passendem Budget und Fläche ist die Lage nicht kompatibel.',
|
||||
confidenceLevel: 0.55,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Standort ausserhalb bevorzugter Region'],
|
||||
@@ -466,22 +468,22 @@ export const mockMatches: Match[] = [
|
||||
id: 'match-017',
|
||||
propertyId: 'prop-018',
|
||||
needId: 'need-003',
|
||||
matchScore: 87,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
matchScore: 52,
|
||||
matchStrength: MatchStrength.WEAK,
|
||||
status: MatchStatus.SHORTLISTED,
|
||||
scoreBreakdown: { hardMatchScore: 92, softFactorScore: 85, confidenceModifier: 0.78, dataQualityModifier: 0.70, totalScore: 87 },
|
||||
scoreBreakdown: { hardMatchScore: 62, softFactorScore: 54, confidenceModifier: 0.68, dataQualityModifier: 0.57, totalScore: 52 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Budget', weight: 0.20, score: 95, contribution: 19, explanation: 'CHF 31/m² deutlich unter Maximum' },
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 88, contribution: 17.6, explanation: '780m² nahe am Zielkorridor' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Standort', weight: 0.25, score: 35, contribution: 8.75, explanation: 'Bern liegt ausserhalb Präferenz Basel' },
|
||||
{ criterion: 'Standort', weight: 0.25, score: 35, contribution: 8.75, explanation: 'Bern liegt 90 km von Basel – kritisches Ausschlusskriterium' },
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 42, contribution: 4.2, explanation: 'Externe Quelle, Renovierungsstand unklar' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Standort', concern: 'Bern ist nicht Basel – keine Nähe zur Pharma-Industrie-Achse', severity: 'HIGH' },
|
||||
{ criterion: 'Standort', concern: 'Bern liegt 90 km von Basel – keine Nähe zur Pharma-Industrie-Achse', severity: 'HIGH' },
|
||||
],
|
||||
explainabilitySummary: 'Schwacher Match aufgrund Standort-Mismatch. Bern ist nicht im Präferenzgebiet Basel. Budget und Fläche ok, aber Lage kritisch.',
|
||||
explainabilitySummary: 'Bern liegt 90 km von Basel entfernt. Lage ist kritisches Ausschlusskriterium trotz passender Fläche und Budget.',
|
||||
confidenceLevel: 0.54,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Standort ausserhalb Präferenzregion', 'Externe Quelle'],
|
||||
@@ -1554,4 +1556,313 @@ export const mockMatches: Match[] = [
|
||||
createdAt: '2025-05-12T08:15:00Z',
|
||||
updatedAt: '2025-05-12T08:15:00Z',
|
||||
},
|
||||
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
// need-001 · Innovatech AG · OFFICE Zürich-West — new external/maison matches
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
|
||||
{
|
||||
id: 'match-050',
|
||||
propertyId: 'prop-031',
|
||||
needId: 'need-001',
|
||||
matchScore: 91,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 95, softFactorScore: 88, confidenceModifier: 0.72, dataQualityModifier: 0.64, totalScore: 91 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.25, score: 100, contribution: 25, explanation: 'Zürich-West trifft bevorzugte Lage exakt' },
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 100, contribution: 20, explanation: '780m² im Zielkorridor (600–1000m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 100, contribution: 15, explanation: 'CHF 35/m² liegt klar unter Maximum (CHF 45/m²)' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 55, contribution: 5.5, explanation: 'Externe Quelle – Konditionen nicht endgültig bestätigt' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Datenqualität', concern: 'Direktinserat aus Drittquelle – Verfügbarkeit noch verifizieren', severity: 'LOW', mitigation: 'Direkte Anfrage beim Anbieter empfohlen' },
|
||||
],
|
||||
explainabilitySummary: 'Optimaler Match: Zürich-West, 780m², CHF 35/m² – alle drei Hauptkriterien vollständig erfüllt. Einziger Vorbehalt ist die externe Datenquelle.',
|
||||
confidenceLevel: 0.72,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Daten aus Drittquelle'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-15T08:00:00Z',
|
||||
updatedAt: '2025-05-15T08:00:00Z',
|
||||
},
|
||||
|
||||
{
|
||||
id: 'match-051',
|
||||
propertyId: 'prop-032',
|
||||
needId: 'need-001',
|
||||
matchScore: 84,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 88, softFactorScore: 82, confidenceModifier: 0.71, dataQualityModifier: 0.62, totalScore: 84 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 100, contribution: 20, explanation: '720m² im Zielkorridor (600–1000m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 92, contribution: 13.8, explanation: 'CHF 40/m² unter Maximum (CHF 45/m²)' },
|
||||
{ criterion: 'Standort', weight: 0.25, score: 88, contribution: 22, explanation: 'Kreis 5 direkt angrenzend an Zürich-West' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 52, contribution: 5.2, explanation: 'Externe Quelle – Ausbaustandard nicht bestätigt' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Standort', concern: 'Kreis 5 ist nicht Zürich-West, aber angrenzend und ähnliches Profil', severity: 'LOW' },
|
||||
{ criterion: 'Datenqualität', concern: 'Ausbaustandard aus externer Quelle – Besichtigung empfohlen', severity: 'MEDIUM' },
|
||||
],
|
||||
explainabilitySummary: 'Starker Match: Fläche und Budget erfüllt, Kreis 5 angrenzend an bevorzugte Lage. Maison Work-Plattform mit bewährten Objektqualitäten.',
|
||||
confidenceLevel: 0.71,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Daten aus externer Quelle'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-15T08:05:00Z',
|
||||
updatedAt: '2025-05-15T08:05:00Z',
|
||||
},
|
||||
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
// need-002 · Schweizer Logistik GmbH · LOGISTICS Basel — new silver external
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
|
||||
{
|
||||
id: 'match-056',
|
||||
propertyId: 'prop-036',
|
||||
needId: 'need-002',
|
||||
matchScore: 86,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 92, softFactorScore: 84, confidenceModifier: 0.70, dataQualityModifier: 0.60, totalScore: 86 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.25, score: 98, contribution: 24.5, explanation: 'Basel Kleinhüningen – exakt im Zielgebiet' },
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 100, contribution: 20, explanation: '2600m² im Zielkorridor (1500–4000m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 95, contribution: 14.25, explanation: 'CHF 15/m² unter Maximum (CHF 18/m²)' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 50, contribution: 5, explanation: 'Hallenhöhe und Konditionen nicht final bestätigt' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Datenqualität', concern: 'Hallenhöhe aus Drittquelle – kritisch für Logistiknutzung', severity: 'MEDIUM', mitigation: 'Hallenhöhe vor Vertragsabschluss verifizieren' },
|
||||
],
|
||||
explainabilitySummary: 'Starker Match: Basel Kleinhüningen exakt, 2600m², CHF 15/m². Hallenhöhe sollte vor Vertragsabschluss bestätigt werden.',
|
||||
confidenceLevel: 0.70,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Hallenhöhe nicht bestätigt', 'Daten aus Drittquelle'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-15T08:10:00Z',
|
||||
updatedAt: '2025-05-15T08:10:00Z',
|
||||
},
|
||||
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
// need-011 · Stadtladen Bern GmbH · RETAIL Bern Innenstadt — all new matches
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
|
||||
{
|
||||
id: 'match-052',
|
||||
propertyId: 'prop-003',
|
||||
needId: 'need-011',
|
||||
matchScore: 91,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 96, softFactorScore: 90, confidenceModifier: 0.71, dataQualityModifier: 0.62, totalScore: 91 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.35, score: 100, contribution: 35, explanation: 'Bern Innenstadt – exakt bevorzugte Lage' },
|
||||
{ criterion: 'Fläche', weight: 0.15, score: 100, contribution: 15, explanation: '320m² im Zielkorridor (200–400m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 100, contribution: 15, explanation: 'CHF 95/m² deutlich unter Maximum (CHF 150/m²)' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 55, contribution: 5.5, explanation: 'Externe Quelle – Schaufensterfront nicht explizit bestätigt' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Datenqualität', concern: 'Must-have "Schaufensterfront" aus externer Quelle – Besichtigung nötig', severity: 'LOW', mitigation: 'Vor-Ort-Besichtigung zur Bestätigung empfohlen' },
|
||||
],
|
||||
explainabilitySummary: 'Optimaler Match: Bern Innenstadt exakt, 320m², CHF 95/m² – 37% unter Budget. Alle Hauptkriterien erfüllt.',
|
||||
confidenceLevel: 0.71,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Schaufensterfront nicht bestätigt'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-18T08:00:00Z',
|
||||
updatedAt: '2025-05-18T08:00:00Z',
|
||||
},
|
||||
|
||||
{
|
||||
id: 'match-053',
|
||||
propertyId: 'prop-033',
|
||||
needId: 'need-011',
|
||||
matchScore: 83,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 88, softFactorScore: 82, confidenceModifier: 0.70, dataQualityModifier: 0.60, totalScore: 83 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.35, score: 100, contribution: 35, explanation: 'Marktgasse – exakt in bevorzugter Innenstadtlage' },
|
||||
{ criterion: 'Fläche', weight: 0.15, score: 100, contribution: 15, explanation: '260m² im Zielkorridor (200–400m²)' },
|
||||
{ criterion: 'Prestige', weight: 0.15, score: 88, contribution: 13.2, explanation: 'Hochfrequentierte Fussgängerzone – Laufkundschaft garantiert' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Budget', weight: 0.15, score: 80, contribution: 12, explanation: 'CHF 120/m² nahe am Maximum (CHF 150/m²)' },
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 52, contribution: 5.2, explanation: 'Mietpreis nicht final bestätigt' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Budget', concern: 'CHF 120/m² lässt wenig Spielraum zum Maximum', severity: 'LOW' },
|
||||
{ criterion: 'Datenqualität', concern: 'Mietpreis aus externer Quelle – Verhandlung möglich', severity: 'MEDIUM', mitigation: 'Direktanfrage empfohlen' },
|
||||
],
|
||||
explainabilitySummary: 'Starker Match: Marktgasse/Innenstadt, 260m², CHF 120/m² im Budget. Maison Work-Plattform mit verifizierten Retailflächen.',
|
||||
confidenceLevel: 0.70,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Mietpreis nicht final bestätigt'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-18T08:05:00Z',
|
||||
updatedAt: '2025-05-18T08:05:00Z',
|
||||
},
|
||||
|
||||
{
|
||||
id: 'match-054',
|
||||
propertyId: 'prop-034',
|
||||
needId: 'need-011',
|
||||
matchScore: 74,
|
||||
matchStrength: MatchStrength.MODERATE,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 82, softFactorScore: 74, confidenceModifier: 0.68, dataQualityModifier: 0.56, totalScore: 74 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Fläche', weight: 0.15, score: 100, contribution: 15, explanation: '340m² im Zielkorridor (200–400m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 94, contribution: 14.1, explanation: 'CHF 110/m² unter Maximum (CHF 150/m²)' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Standort', weight: 0.35, score: 75, contribution: 26.25, explanation: 'Lorraine ist Bern, aber nicht Innenstadt – weniger Laufkundschaft' },
|
||||
{ criterion: 'Timing', weight: 0.10, score: 80, contribution: 8, explanation: 'Verfügbar ab 01.01.2026 – leicht nach Wunschzeitraum' },
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 48, contribution: 4.8, explanation: 'Schaufensterfront nicht bestätigt – kritisches Must-have' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Standort', concern: 'Lorraine ist kein Fussgängerzonenviertel – geringere Laufkundschaft als Innenstadt', severity: 'MEDIUM' },
|
||||
{ criterion: 'Timing', concern: 'Ab Januar 2026 – 4 Monate nach gewünschtem Einzug', severity: 'LOW' },
|
||||
],
|
||||
explainabilitySummary: 'Moderater Match: Bern Lorraine, 340m², Budget ok. Abzug wegen Abweichung von Innenstadt-Lage und fehlender Schaufensterfront-Bestätigung.',
|
||||
confidenceLevel: 0.68,
|
||||
riskLevel: RiskLevel.MEDIUM,
|
||||
uncertaintyIndicators: ['Schaufensterfront nicht bestätigt', 'Daten aus Drittquelle'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-18T08:10:00Z',
|
||||
updatedAt: '2025-05-18T08:10:00Z',
|
||||
},
|
||||
|
||||
{
|
||||
id: 'match-055',
|
||||
propertyId: 'prop-035',
|
||||
needId: 'need-011',
|
||||
matchScore: 66,
|
||||
matchStrength: MatchStrength.MODERATE,
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 88, softFactorScore: 72, confidenceModifier: 0.55, dataQualityModifier: 0.36, totalScore: 66 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.35, score: 100, contribution: 35, explanation: 'Bern Altstadt Gerechtigkeitsgasse – Premiumlage' },
|
||||
{ criterion: 'Fläche', weight: 0.15, score: 100, contribution: 15, explanation: '290m² im Zielkorridor (200–400m²)' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Konfidenz', weight: 0.15, score: 38, contribution: 5.7, explanation: 'Future-Signal mit 62% Wahrscheinlichkeit – kein bestätigtes Objekt' },
|
||||
{ criterion: 'Datenqualität', weight: 0.10, score: 25, contribution: 2.5, explanation: 'Mietpreis nur geschätzt, kein offizielles Inserat' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Verfügbarkeit', concern: 'Probabilistisches Signal – kein bestätigtes Inserat', severity: 'HIGH', mitigation: 'Früher Erstkontakt mit Eigentümer kann Vorteil sichern' },
|
||||
{ criterion: 'Timing', concern: 'Frühestens April 2026 verfügbar', severity: 'MEDIUM' },
|
||||
],
|
||||
explainabilitySummary: 'Premiumlage Gerechtigkeitsgasse, aber nur probabilistisches Signal. Nur weiterverfolgen, wenn Frühkontakt mit Eigentümer möglich.',
|
||||
confidenceLevel: 0.55,
|
||||
riskLevel: RiskLevel.HIGH,
|
||||
uncertaintyIndicators: ['Probabilistisches Signal', 'Mietpreis geschätzt', 'Kein bestätigtes Inserat'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2025-05-18T08:15:00Z',
|
||||
updatedAt: '2025-05-18T08:15:00Z',
|
||||
},
|
||||
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
// Schattenmarkt-Freigabe — verified contract signals from Verwaltung
|
||||
// ───────────────────────────────────────────────────────────────────────────
|
||||
|
||||
{
|
||||
id: 'match-060',
|
||||
propertyId: 'prop-001',
|
||||
needId: 'need-001',
|
||||
matchScore: 78,
|
||||
matchStrength: MatchStrength.MODERATE,
|
||||
resultType: 'FUTURE_AVAILABILITY',
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 90, softFactorScore: 82, confidenceModifier: 0.92, dataQualityModifier: 0.92, totalScore: 78 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.25, score: 100, contribution: 25, explanation: 'Zürich-West trifft bevorzugte Lage exakt' },
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 100, contribution: 20, explanation: '850m² im Zielkorridor (600–1000m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 92, contribution: 13.8, explanation: 'CHF 38/m² liegt unter Maximum (CHF 45/m²)' },
|
||||
{ criterion: 'Konfidenz', weight: 0.10, score: 100, contribution: 10, explanation: 'Vertragsende aus ERP bestätigt — keine Schätzung' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Verfügbarkeit', weight: 0.10, score: 55, contribution: 5.5, explanation: 'Objekt erst ab Oktober 2026 verfügbar — 5 Monate Vorlaufzeit' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Timing', concern: 'Einzug frühestens Oktober 2026 möglich', severity: 'LOW', mitigation: 'Frühzeitige Reservierungsanfrage sichert Priorität' },
|
||||
],
|
||||
explainabilitySummary: 'Idealer Match: Zürich-West exakt, 850m², im Budget. Vertragsende verifiziert — Verwaltung hat Objekt für Schattenmarkt freigegeben.',
|
||||
confidenceLevel: 0.92,
|
||||
riskLevel: RiskLevel.LOW,
|
||||
uncertaintyIndicators: ['Verfügbar ab Oktober 2026'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-05-20T08:00:00Z',
|
||||
updatedAt: '2026-05-20T08:00:00Z',
|
||||
},
|
||||
|
||||
{
|
||||
id: 'match-061',
|
||||
propertyId: 'prop-007',
|
||||
needId: 'need-001',
|
||||
matchScore: 71,
|
||||
matchStrength: MatchStrength.MODERATE,
|
||||
resultType: 'FUTURE_AVAILABILITY',
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 82, softFactorScore: 74, confidenceModifier: 0.92, dataQualityModifier: 0.94, totalScore: 71 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 100, contribution: 20, explanation: '720m² im Zielkorridor (600–1000m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 95, contribution: 14.25, explanation: 'CHF 36/m² unter Maximum (CHF 45/m²)' },
|
||||
{ criterion: 'Konfidenz', weight: 0.10, score: 100, contribution: 10, explanation: 'Vertragsende und Breakout-Option aus ERP bestätigt' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Standort', weight: 0.25, score: 80, contribution: 20, explanation: 'Zürich Oerlikon — nicht Zürich-West, aber gute ÖV-Anbindung' },
|
||||
{ criterion: 'Verfügbarkeit', weight: 0.10, score: 55, contribution: 5.5, explanation: 'Breakout-Option September 2026, Vertragsende November 2026' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Standort', concern: 'Oerlikon ist Zürich, aber nicht Zürich-West — andere Quartierscharakter', severity: 'MEDIUM' },
|
||||
{ criterion: 'Timing', concern: 'Früheste Verfügbarkeit über Breakout-Option September 2026', severity: 'LOW', mitigation: 'Breakout-Option aktiv — frühzeitige Anfrage möglich' },
|
||||
],
|
||||
explainabilitySummary: 'Guter Match: Zürich Oerlikon, 720m², im Budget. Vertragsende verifiziert, Breakout-Option ab September 2026. Lage nicht Zürich-West.',
|
||||
confidenceLevel: 0.92,
|
||||
riskLevel: RiskLevel.LOW,
|
||||
uncertaintyIndicators: ['Lage Oerlikon statt Zürich-West', 'Verfügbar ab September 2026'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-05-20T08:05:00Z',
|
||||
updatedAt: '2026-05-20T08:05:00Z',
|
||||
},
|
||||
|
||||
{
|
||||
id: 'match-062',
|
||||
propertyId: 'prop-002',
|
||||
needId: 'need-002',
|
||||
matchScore: 84,
|
||||
matchStrength: MatchStrength.STRONG,
|
||||
resultType: 'FUTURE_AVAILABILITY',
|
||||
status: MatchStatus.PENDING_REVIEW,
|
||||
scoreBreakdown: { hardMatchScore: 94, softFactorScore: 86, confidenceModifier: 0.92, dataQualityModifier: 0.96, totalScore: 84 },
|
||||
positiveFactors: [
|
||||
{ criterion: 'Standort', weight: 0.25, score: 98, contribution: 24.5, explanation: 'Basel Kleinhüningen — exakt im Zielgebiet' },
|
||||
{ criterion: 'Fläche', weight: 0.20, score: 100, contribution: 20, explanation: '2400m² im Zielkorridor (1500–4000m²)' },
|
||||
{ criterion: 'Budget', weight: 0.15, score: 100, contribution: 15, explanation: 'CHF 14/m² weit unter Maximum (CHF 18/m²)' },
|
||||
{ criterion: 'Konfidenz', weight: 0.10, score: 100, contribution: 10, explanation: 'Vertragsende aus ERP bestätigt — keine Schätzung' },
|
||||
],
|
||||
negativeFactors: [
|
||||
{ criterion: 'Verfügbarkeit', weight: 0.10, score: 60, contribution: 6, explanation: 'Objekt erst ab September 2026 verfügbar' },
|
||||
],
|
||||
tradeoffs: [
|
||||
{ criterion: 'Timing', concern: 'Verfügbar ab September 2026 — 4 Monate Vorlaufzeit', severity: 'LOW', mitigation: 'Frühe Reservierungsanfrage sichert Priorität vor Vertragsende' },
|
||||
],
|
||||
explainabilitySummary: 'Starker Match: Basel Kleinhüningen exakt, 2400m², CHF 14/m². Vertragsende September 2026 aus ERP bestätigt — höchste Verlässlichkeit.',
|
||||
confidenceLevel: 0.92,
|
||||
riskLevel: RiskLevel.LOW,
|
||||
uncertaintyIndicators: ['Verfügbar ab September 2026'],
|
||||
organizationId: 'org-wincasa',
|
||||
createdAt: '2026-05-20T08:10:00Z',
|
||||
updatedAt: '2026-05-20T08:10:00Z',
|
||||
},
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user