feat: UC-A/B/C demo — 50 mock properties, district scoring, gold/silver cards visible

- Add 50 mock properties (prop-050–099) tuned for UC-A (Fahrradhändler RETAIL),
  UC-B (Umzugsfirma OFFICE Zürich-West) and UC-C (Vermögensverwalter PREMIUM)
- District-aware scoreLocation: district match→100, city-only→70 when need
  specifies districts, canton→60, no match→35; fixes UC-C prop-001 over-scoring
- mustHaveScorer: add klimatisierung keyword; parking minimum count logic
- Soft factor scale fix: integer 0–100 values no longer multiplied ×100
- footfall: map passerbyFrequency string (HIGH→85, MEDIUM_HIGH→68…) before
  enrichment fallback so RETAIL properties score correctly
- Parser: Kreis list extraction ("Kreis 3, 4, 5, und 8" → 4 district entries),
  neighbourhood→district map (Seefeld, Bahnhofstrasse), prestige signals
- Results: remove VERIFIED_PORTFOLIO role gate — all users see portfolio cards,
  enabling gold (85+) and silver (70–84) cards for every demo use case
- Fix flash of wrong cards on NeedBuilder nav (effectiveNeedId not activeNeed?.id)
- needs.ts: UC-A preferredLocations now includes Kreis 3/4/5/8 entries

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-22 20:31:30 +02:00
parent 98b4a1146b
commit 9f7062d137
16 changed files with 3942 additions and 52 deletions
+104
View File
@@ -368,4 +368,108 @@ export const mockNeeds: Need[] = [
createdAt: '2025-04-10T08:00:00Z',
updatedAt: '2025-05-06T13:00:00Z',
},
// --- need-uc-a: Renato's Fahrradhändler — Use Case A ---
{
id: 'need-uc-a',
companyName: 'Velo City GmbH',
contactName: 'Renato Marchetti',
assetType: AssetType.RETAIL,
requiredArea: { min: 120, max: 160 },
preferredLocations: ['Zürich Kreis 3', 'Zürich Kreis 4', 'Zürich Kreis 5', 'Zürich Kreis 8', 'Wädenswil', 'Thalwil', 'Uster'],
budgetRange: { maxPerSqm: 620, currency: 'CHF' },
timing: {
earliestMoveIn: '2026-10-01',
latestMoveIn: '2027-03-31',
contractDurationMonths: 60,
flexibleTiming: true,
},
mustCriteriaText: ['Schaufenster', 'Erdgeschoss', 'Werkstatt möglich'],
requireGroundFloor: true,
requiredFitOut: 'FULL',
notes: 'Wunsch: 3.5-Zi-Wohnung im Haus oder in der Nähe, max. CHF 2\'200/Mt. inkl. NK',
softFactors: {
requireHighVisibility: true,
},
weightingProfile: {
area: 0.13, location: 0.20, budget: 0.14, timing: 0.12,
prestige: 0.04, accessibility: 0.07, expansionPotential: 0.02, flexibility: 0.04,
visibility: 0.12, footfall: 0.12, talentAccess: 0.01, esg: 0.01, taxEnvironment: 0.00,
},
confidenceInCriteria: 0.90,
extractedFromText: 'Fahrradhändler sucht Verkaufslokal 120150m² EG mit Schaufenster und Werkstatt in Zürich Kreis 3/4/5/8 oder Wädenswil/Thalwil/Uster, bezugsfertig Q4/2026 oder Q1/2027.',
organizationId: 'org-wincasa',
createdAt: '2025-05-20T10:00:00Z',
updatedAt: '2025-05-22T10:00:00Z',
},
// --- need-uc-b: Renato's Umzugsfirma — Use Case B ---
{
id: 'need-uc-b',
companyName: 'Alp Transit Umzüge GmbH',
contactName: 'Renato Marchetti',
assetType: AssetType.OFFICE,
requiredArea: { min: 140, max: 200 },
preferredLocations: ['Zürich', 'Zürich-West', 'Zürich Kreis 5', 'Zürich Kreis 4'],
budgetRange: { maxPerSqm: 300, currency: 'CHF' },
timing: {
earliestMoveIn: '2025-10-01',
latestMoveIn: '2026-06-01',
contractDurationMonths: 84,
flexibleTiming: false,
},
mustCriteriaText: ['3-5 Parkplätze', 'Verpflegungsmöglichkeit', 'Startup-Umfeld', 'Erweiterungsoption vorhanden', 'Repräsentativer Charakter'],
requiredParkingMin: 3,
requiredFitOut: 'BASIC',
minContractDurationMonths: 84,
softFactors: {
requireParking: true,
},
weightingProfile: {
area: 0.14, location: 0.17, budget: 0.22, timing: 0.11,
prestige: 0.04, accessibility: 0.08, expansionPotential: 0.07, flexibility: 0.07,
visibility: 0.02, footfall: 0.01, talentAccess: 0.07, esg: 0.02, taxEnvironment: 0.01,
},
confidenceInCriteria: 0.88,
extractedFromText: 'Büro 140200m², Zürich-West, max. CHF 300/m²/a, einfacher Ausbau, 3-5 Parkplätze, 7 Jahre Mietvertrag, Startup-Umfeld, Erweiterungsoption.',
organizationId: 'org-wincasa',
createdAt: '2025-05-22T10:00:00Z',
updatedAt: '2025-05-22T10:00:00Z',
},
// --- need-uc-c: Renato's Vermögensverwalter — Use Case C ---
{
id: 'need-uc-c',
companyName: 'Wealth Advisory Partners AG',
contactName: 'Renato Marchetti',
assetType: AssetType.OFFICE,
requiredArea: { min: 450, max: 560 },
preferredLocations: ['Zürich', 'Zürich Kreis 1', 'Zürich Seefeld', 'Zürich Innenstadt'],
budgetRange: { maxPerSqm: 900, currency: 'CHF' },
timing: {
earliestMoveIn: '2026-01-01',
latestMoveIn: '2027-06-01',
contractDurationMonths: 120,
flexibleTiming: false,
},
mustCriteriaText: ['Klimaanlage', 'Tageslicht', 'Prestige-Adresse', 'Repräsentativer Eingang', '2×5-Jahre-Mietoption'],
notes: 'Mietvertrag min. 10 Jahre + 2×5 Jahre echte Optionen gefordert',
requireAirConditioning: true,
requiredFitOut: 'PREMIUM',
minContractDurationMonths: 120,
softFactors: {
minPrestige: 85,
minAccessibility: 80,
},
weightingProfile: {
area: 0.10, location: 0.25, budget: 0.09, timing: 0.08,
prestige: 0.20, accessibility: 0.10, expansionPotential: 0.02, flexibility: 0.02,
visibility: 0.04, footfall: 0.01, talentAccess: 0.06, esg: 0.03, taxEnvironment: 0.05,
},
confidenceInCriteria: 0.95,
extractedFromText: 'Vermögensverwalter sucht repräsentative Bürofläche 500m² in Zürich Kreis 1 oder Seefeld/Bellevue, Klimaanlage, PREMIUM-Ausbau, 10-Jahres-Mietvertrag.',
organizationId: 'org-wincasa',
createdAt: '2025-05-20T10:00:00Z',
updatedAt: '2025-05-22T10:00:00Z',
},
]