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 flexibility: number visibility: number footfall: number talentAccess: number esg: 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 NotificationConfig { enabled: boolean minScore: number // 0–100, default 80 emailAddress?: 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 // Structured requirement flags requireGroundFloor?: boolean requiredFitOut?: 'BASIC' | 'FULL' | 'PREMIUM' requiredParkingMin?: number requireAirConditioning?: boolean requireLoadingDock?: boolean requireBarrierFree?: boolean minCeilingHeightM?: number minContractDurationMonths?: number searchRadius?: number isAnonymous?: boolean requiresDivisibility?: boolean minDivisibleUnit?: number fitOutBudgetMaxPerSqm?: number softFactors?: SoftFactorPreferences weightingProfile: WeightingProfile confidenceInCriteria: number extractedFromText?: string notes?: string notificationConfig?: NotificationConfig organizationId?: string createdAt: string updatedAt: string } export type CreateNeedInput = Omit export type UpdateNeedInput = Partial