05ac0083b2
- Flächensuche: Flexibilität durch Steuerlast (taxEnvironment) ersetzt - MatchDetail: Bild als Hero-Banner oben, Karte eingebettet im Inhalt darunter - Ergebnisliste: Gold/Silber/Bronze-Abschnitte mit farbigen Trennlinien - ScoreBreakdown: KI-Steuerlast-Link zur kantonalen Steuerrechner-Seite - Beispieldaten: alle Objekte mit passenden Bildern versehen - locationIntelligence: taxCalculatorUrl pro Kanton ergänzt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
92 lines
2.1 KiB
TypeScript
92 lines
2.1 KiB
TypeScript
import type { AssetType, MatchStatus } from './enums'
|
||
|
||
export interface AreaRange {
|
||
min: number
|
||
max: number
|
||
}
|
||
|
||
export interface BudgetRange {
|
||
minPerSqm?: number
|
||
maxPerSqm: number
|
||
maxMonthlyTotal?: number
|
||
currency: string
|
||
}
|
||
|
||
export interface Timing {
|
||
earliestMoveIn: string
|
||
latestMoveIn: string
|
||
contractDurationMonths?: number
|
||
flexibleTiming: boolean
|
||
}
|
||
|
||
export interface WeightingProfile {
|
||
area: number
|
||
location: number
|
||
budget: number
|
||
timing: number
|
||
prestige: number
|
||
accessibility: number
|
||
expansionPotential: number
|
||
taxEnvironment: number
|
||
[key: string]: number
|
||
}
|
||
|
||
export interface SoftFactorPreferences {
|
||
minPrestige?: number
|
||
minAccessibility?: number
|
||
requireParking?: boolean
|
||
maxPublicTransportMinutes?: number
|
||
preferredEsgRating?: string
|
||
requireHighVisibility?: boolean
|
||
}
|
||
|
||
export interface SizeRange {
|
||
minSqm: number
|
||
maxSqm: number
|
||
}
|
||
|
||
export interface MustHaveCriterion {
|
||
criterion: string
|
||
description?: string
|
||
weight?: number // 0–1, how much a miss hurts the score
|
||
}
|
||
|
||
export interface WeightedPreference {
|
||
criterion: string
|
||
weight: number // 0–1
|
||
idealValue?: string | number
|
||
description?: string
|
||
}
|
||
|
||
export interface Need {
|
||
id: string
|
||
companyName: string
|
||
contactName?: string
|
||
assetType: AssetType
|
||
requiredArea: AreaRange
|
||
|
||
// F004 additions
|
||
desiredLocation?: string[] // preferred city/district list
|
||
sizeRange?: SizeRange // structured alias for requiredArea
|
||
mustHaveCriteria?: MustHaveCriterion[]
|
||
weightedPreferences?: WeightedPreference[]
|
||
status?: MatchStatus | 'ACTIVE' | 'INACTIVE' | 'DRAFT' | 'CLOSED'
|
||
|
||
preferredLocations: string[]
|
||
excludedLocations?: string[]
|
||
budgetRange: BudgetRange
|
||
timing: Timing
|
||
mustCriteriaText?: string[] // legacy — prefer mustHaveCriteria
|
||
softFactors?: SoftFactorPreferences
|
||
weightingProfile: WeightingProfile
|
||
confidenceInCriteria: number
|
||
extractedFromText?: string
|
||
notes?: string
|
||
organizationId?: string
|
||
createdAt: string
|
||
updatedAt: string
|
||
}
|
||
|
||
export type CreateNeedInput = Omit<Need, 'id' | 'createdAt' | 'updatedAt'>
|
||
export type UpdateNeedInput = Partial<CreateNeedInput>
|