feat: Reale Jahresbelastung, must-have fixes, fitOut data coverage
Reale Jahresbelastung (Change 6): - FitOutCostPanel zeigt Jahresmiete + amortisierte Ausbaukosten für alle fitOut-Werte - FULL/PREMIUM: Ausbau CHF 0 (bezugsfertig), SHELL/BASIC: CRB/BKP-Richtwerte amortisiert über 5 J. - Match-Card-Chip zeigt geschätzte Investition (orange wenn >100k) - FitOutInvestment-Typ + calcFitOutInvestment() in fitOutUtils.ts - BackendAIService + MockAIService mit generateFitOutAdvice (IAIService-Interface) Must-have Kriterien (Nicht prüfbar Fix): - ÖV-Anbindung: Minutengrenze aus Freitext extrahiert, gegen publicTransportMinutes geprüft - Mindestfläche: m²-Wert aus Freitext extrahiert, gegen areaSqm geprüft - Ausbaugrad: neues Keyword-Rule für FULL/PREMIUM fitOut-Datenpflege: - fitOut-Werte zu 32 fehlenden Properties ergänzt (Logistik=SHELL, Standard=BASIC, Modern=FULL) - MAB-Werte (200/150/250 CHF/m²) zu 3 BASIC-Objekten hinzugefügt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -198,6 +198,13 @@ export function mockParseNeed(input: string): ParseNeedResult {
|
||||
: lower.includes('basisausbau') || lower.includes('rohbau') || lower.includes('einfach') ? 'BASIC'
|
||||
: undefined
|
||||
|
||||
// Search radius: "innerhalb von 30 km", "30km Umkreis", "im Umkreis von 50 km", "radius 20km"
|
||||
const radiusMatch =
|
||||
input.match(/(?:innerhalb\s+(?:von\s+)?|im\s+umkreis\s+(?:von\s+)?|radius\s+(?:von\s+)?)(\d+)\s*km/i) ??
|
||||
input.match(/(\d+)\s*km\s*(?:umkreis|radius|entfernung)/i) ??
|
||||
input.match(/(\d+)\s*km/i)
|
||||
const searchRadius = radiusMatch ? Math.min(100, Math.max(1, parseInt(radiusMatch[1]))) : undefined
|
||||
|
||||
// Contract duration: "7-jähriger Vertrag", "Laufzeit 7 Jahre", standalone "7 Jahre" at sentence start
|
||||
// Exclude "in X Jahren", "X Jahre im Geschäft", "X Jahre Erfahrung" etc.
|
||||
const contractMatch = input.match(/(\d+)[- ]?j[aä]hrige?(?:r)?\s+(?:vertrag|mietvertrag|laufzeit)/i)
|
||||
@@ -244,6 +251,7 @@ export function mockParseNeed(input: string): ParseNeedResult {
|
||||
budgetRange: budgetConfidence,
|
||||
timing: timingConfidence,
|
||||
mustHaveCriteria: mustHaveCriteria.length > 0 ? 0.85 : 0.10,
|
||||
searchRadius: searchRadius ? 0.90 : 0.20,
|
||||
prestigeImportance: prestigeImportance ? 0.80 : 0.20,
|
||||
parkingNeed: parkingNeed ? 0.90 : 0.30,
|
||||
}
|
||||
@@ -362,6 +370,7 @@ export function mockParseNeed(input: string): ParseNeedResult {
|
||||
requiredFitOut: fitOutStr,
|
||||
minCeilingHeightM,
|
||||
minContractDurationMonths,
|
||||
searchRadius,
|
||||
notes,
|
||||
},
|
||||
confidenceByField,
|
||||
|
||||
Reference in New Issue
Block a user