feat(domain): F004 – expand domain model layer

- need.ts: add SizeRange, MustHaveCriterion, WeightedPreference types; extend Need with desiredLocation, sizeRange, mustHaveCriteria, weightedPreferences, status
- futureSignal.ts: add SignalEvidence type; extend FutureSignal with title, evidence, matchabilityScore, reviewStatus
- aiOutput.ts: new AIOutput entity with type, inputHash, outputJson, provider/model/promptVersion/schemaVersion, reviewStatus
- activityEvent.ts: new ActivityEvent entity with actorId, action, entityType, entityId, timestamp, metadata
- unifiedResult.ts: discriminated union (VerifiedPortfolioResult | ExternalMarketResult | FutureAvailabilityResult)
- index.ts: export all three new files
- Properties.tsx: add LIGHT_INDUSTRIAL + UNKNOWN cases to exhaustive switches

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-15 10:58:27 +02:00
parent 3b45b0c121
commit 0b874865ba
10 changed files with 399 additions and 40 deletions
+28 -2
View File
@@ -1,4 +1,4 @@
import type { AssetType } from './enums'
import type { AssetType, MatchStatus } from './enums'
export interface AreaRange {
min: number
@@ -40,17 +40,43 @@ export interface SoftFactorPreferences {
requireHighVisibility?: boolean
}
export interface SizeRange {
minSqm: number
maxSqm: number
}
export interface MustHaveCriterion {
criterion: string
description?: string
weight?: number // 01, how much a miss hurts the score
}
export interface WeightedPreference {
criterion: string
weight: number // 01
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[]
mustCriteriaText?: string[] // legacy — prefer mustHaveCriteria
softFactors?: SoftFactorPreferences
weightingProfile: WeightingProfile
confidenceInCriteria: number