e169f8e310
Mieterausbau / fit-out economics — surface true total cost of occupancy: - Annuity calc (annuityFactor + effectiveAnnualBurdenPerSqm) replaces straight-line ÷5; FITOUT_ANNUITY_RATE=5% - New hardFacts.fitOutByLandlord: "Wer baut aus?" toggle in NewListing — landlord-borne fit-out is priced into rent (no surcharge), tenant-borne SHELL/BASIC adds annuitized cost minus MAB - scoreBudget now compares effective annual burden (rent + fit-out annuity) vs budget instead of cold rent only; FULL/PREMIUM and landlord-borne unchanged - FitOutCostPanel + CompareTableBody compute annuitized, tenant-aware burden - Central FIT_OUT_LABELS with industry/international vocabulary (Rohbau·Core&Shell, Edelrohbau·CAT A, etc.) - Activate existing generateFitOutAdvice via useFitOutAdvice hook + new FitOutAdvicePanel (MIETERAUSBAU/BKZ/MAB-Amortisation + negotiation tip), shown for tenant-borne SHELL/BASIC - MAB field only asked when tenant builds out (optional) — one new toggle, no extra data burden for property managers Fix: DQ/confidence modifiers were computed but never applied to finalScore (hardcoded 0 in output) — now folded into rawFinal and exposed. Trust-first: weak data quality lowers the score. Resolves 3 pre-existing red tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
export const ASSET_TYPE_LABELS: Record<string, string> = {
|
|
OFFICE: 'Büro',
|
|
RETAIL: 'Einzelhandel',
|
|
LIGHT_INDUSTRIAL: 'Gewerbe',
|
|
LOGISTICS: 'Logistik',
|
|
PRODUCTION: 'Produktion',
|
|
MIXED: 'Gemischt',
|
|
}
|
|
|
|
export const SOFT_FACTORS = [
|
|
{ key: 'prestige', label: 'Prestige / Adressqualität' },
|
|
{ key: 'accessibility', label: 'ÖV-Anbindung' },
|
|
{ key: 'visibility', label: 'Sichtbarkeit' },
|
|
{ key: 'footfall', label: 'Passantenfrequenz' },
|
|
{ key: 'talentAccess', label: 'Fachkräfte / Talent' },
|
|
{ key: 'esg', label: 'ESG / Nachhaltigkeit' },
|
|
{ key: 'flexibility', label: 'Flexibilität Grundriss' },
|
|
{ key: 'expansionPotential', label: 'Expansionspotenzial' },
|
|
{ key: 'taxEnvironment', label: 'Steuerumgebung' },
|
|
]
|
|
|
|
export const LEVEL_OPTIONS = [
|
|
{ value: '', label: 'Keine Angabe' },
|
|
{ value: 'LOW', label: 'Tief' },
|
|
{ value: 'MEDIUM', label: 'Mittel' },
|
|
{ value: 'HIGH', label: 'Hoch' },
|
|
]
|
|
|
|
export const LEVEL_TO_SCORE: Record<string, number | undefined> = {
|
|
LOW: 0.30, MEDIUM: 0.55, HIGH: 0.85, '': undefined,
|
|
}
|
|
|
|
import { FIT_OUT_LABELS } from '../../lib/constants'
|
|
|
|
export const FIT_OUT_OPTIONS = [
|
|
{ value: '', label: 'Keine Angabe' },
|
|
{ value: 'SHELL', label: FIT_OUT_LABELS.SHELL },
|
|
{ value: 'BASIC', label: FIT_OUT_LABELS.BASIC },
|
|
{ value: 'FULL', label: FIT_OUT_LABELS.FULL },
|
|
{ value: 'PREMIUM', label: FIT_OUT_LABELS.PREMIUM },
|
|
]
|
|
|
|
export interface LocationState {
|
|
prefill?: {
|
|
assetType?: string
|
|
street?: string
|
|
houseNumber?: string
|
|
postalCode?: string
|
|
city?: string
|
|
areaSqm?: number
|
|
rentPricePerSqm?: number
|
|
unitLabel?: string
|
|
propertyId?: string
|
|
floor?: string
|
|
fitOut?: string
|
|
fitOutByLandlord?: boolean
|
|
parking?: number
|
|
ceilingHeight?: number
|
|
mieterausbaubeitragPerSqm?: number
|
|
isFlexible?: boolean
|
|
minLettableSqm?: number
|
|
availableFrom?: string
|
|
softLevels?: Record<string, string>
|
|
}
|
|
}
|
|
|
|
export type Prefill = NonNullable<LocationState['prefill']>
|