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:
@@ -7,7 +7,7 @@ import type { UnifiedMatchResult } from '../../domain/unifiedResult'
|
||||
|
||||
export interface AIProvenance {
|
||||
/** Which AI provider produced this response */
|
||||
provider: 'openrouter' | 'mock'
|
||||
provider: 'openrouter' | 'mock' | 'backend'
|
||||
/** Exact model ID (e.g. 'anthropic/claude-3-5-haiku') or 'mock' */
|
||||
model: string
|
||||
/** ISO-8601 timestamp of generation */
|
||||
@@ -157,6 +157,25 @@ export interface DataQualityInput {
|
||||
warnings: string[]
|
||||
}
|
||||
|
||||
// ── Fit-out advice ────────────────────────────────────────────────────────────
|
||||
|
||||
export interface FitOutAdviceInput {
|
||||
fitOut: string
|
||||
areaSqm: number
|
||||
mabPerSqm: number
|
||||
requiredFitOut?: string
|
||||
tenantBudgetPerSqm?: number
|
||||
monthlyRentPerSqm: number
|
||||
}
|
||||
|
||||
export interface FitOutAdvice {
|
||||
recommendation: 'MIETERAUSBAU' | 'BKZ' | 'MAB_AMORTISATION'
|
||||
headline: string
|
||||
explanation: string
|
||||
negotiationTip: string
|
||||
estimatedNetInvestment: string
|
||||
}
|
||||
|
||||
// ── Legacy types (kept for backward compatibility) ────────────────────────────
|
||||
|
||||
export interface CriteriaExtractionResult {
|
||||
@@ -198,6 +217,9 @@ export interface IAIService {
|
||||
// Offer email (supply side)
|
||||
generateOfferEmail(payload: OfferEmailPayload): Promise<AIResponse<{ subject: string; body: string }>>
|
||||
|
||||
// Fit-out investment advice (demand side)
|
||||
generateFitOutAdvice(input: FitOutAdviceInput): Promise<AIResponse<FitOutAdvice>>
|
||||
|
||||
// Legacy methods
|
||||
extractCriteria(input: string): Promise<AIResponse<CriteriaExtractionResult>>
|
||||
generateFollowUp(partialNeed: Partial<CreateNeedInput>): Promise<AIResponse<string[]>>
|
||||
|
||||
Reference in New Issue
Block a user