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:
+82
-16
@@ -1,14 +1,17 @@
|
||||
import type { AssetType, ResultType, AvailabilityStatus, DataFreshness, RiskLevel } from './enums'
|
||||
import type {
|
||||
AssetType, ResultType, AvailabilityStatus, AvailabilityType,
|
||||
FreshnessStatus, RiskLevel, SourceType, DataQualityLevel,
|
||||
} from './enums'
|
||||
|
||||
// ── Location / Address ────────────────────────────────────────────────────────
|
||||
|
||||
export interface Location {
|
||||
city: string
|
||||
district?: string
|
||||
canton?: string
|
||||
region?: string
|
||||
country: string
|
||||
coordinates?: {
|
||||
lat: number
|
||||
lng: number
|
||||
}
|
||||
coordinates?: { lat: number; lng: number }
|
||||
}
|
||||
|
||||
export interface Address {
|
||||
@@ -19,10 +22,58 @@ export interface Address {
|
||||
country: string
|
||||
}
|
||||
|
||||
// ── Source Metadata ───────────────────────────────────────────────────────────
|
||||
|
||||
export interface SourceMeta {
|
||||
sourceType: SourceType | string
|
||||
sourceLabel?: string
|
||||
sourceUrl?: string
|
||||
sourceUpdatedAt?: string
|
||||
externalId?: string
|
||||
}
|
||||
|
||||
// ── Data Quality ──────────────────────────────────────────────────────────────
|
||||
|
||||
export interface DataQuality {
|
||||
score: number
|
||||
qualityLevel?: DataQualityLevel
|
||||
missingCriticalFields: string[]
|
||||
missingOptionalFields: string[]
|
||||
lastVerifiedAt?: string
|
||||
freshness: FreshnessStatus
|
||||
warnings: string[]
|
||||
}
|
||||
|
||||
// ── Hard Facts ────────────────────────────────────────────────────────────────
|
||||
|
||||
export interface PropertyHardFacts {
|
||||
floor?: number
|
||||
fitOut?: 'SHELL' | 'BASIC' | 'FULL' | 'PREMIUM'
|
||||
parking?: number
|
||||
publicTransportScore?: number
|
||||
usageType?: string
|
||||
ceilingHeightM?: number
|
||||
loadingDocksCount?: number
|
||||
powerSupplyKva?: number
|
||||
hasServerRoom?: boolean
|
||||
isBarrierFree?: boolean
|
||||
}
|
||||
|
||||
// ── Soft Factors ──────────────────────────────────────────────────────────────
|
||||
|
||||
export interface SoftFactors {
|
||||
prestigeScore?: number
|
||||
visibilityScore?: number
|
||||
footfallScore?: number
|
||||
commuterAccessScore?: number
|
||||
talentAccessScore?: number
|
||||
esgScore?: number
|
||||
flexibilityScore?: number
|
||||
expansionPotentialScore?: number
|
||||
taxEnvironmentScore?: number
|
||||
// Legacy aliases kept for mock-data backward compatibility
|
||||
prestige?: number
|
||||
accessibility?: number
|
||||
visibilityScore?: number
|
||||
talentAccess?: number
|
||||
esgRating?: string
|
||||
passerbyFrequency?: 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH'
|
||||
@@ -31,40 +82,55 @@ export interface SoftFactors {
|
||||
infrastructureNotes?: string
|
||||
}
|
||||
|
||||
export interface DataQuality {
|
||||
score: number
|
||||
missingCriticalFields: string[]
|
||||
missingOptionalFields: string[]
|
||||
lastVerifiedAt?: string
|
||||
freshness: DataFreshness
|
||||
warnings: string[]
|
||||
}
|
||||
// ── Property ──────────────────────────────────────────────────────────────────
|
||||
|
||||
export interface Property {
|
||||
id: string
|
||||
organizationId?: string
|
||||
title: string
|
||||
|
||||
assetType: AssetType
|
||||
resultType: ResultType
|
||||
|
||||
location: Location
|
||||
address: Address
|
||||
|
||||
areaSqm: number
|
||||
areaSqmMin?: number
|
||||
areaSqmMax?: number
|
||||
|
||||
rentPricePerSqm: number
|
||||
rentChfSqmYear?: number
|
||||
totalRentMonthly?: number
|
||||
ancillaryCosts?: number
|
||||
|
||||
availabilityDate: string
|
||||
availabilityStatus: AvailabilityStatus
|
||||
availabilityType?: AvailabilityType
|
||||
|
||||
sourceType: string
|
||||
sourceLabel?: string
|
||||
sourceUrl?: string
|
||||
sourceUpdatedAt?: string
|
||||
sourceMeta?: SourceMeta
|
||||
|
||||
confidenceScore: number
|
||||
dataQuality: DataQuality
|
||||
|
||||
softFactors?: SoftFactors
|
||||
hardFacts?: PropertyHardFacts
|
||||
|
||||
// Legacy fields — kept for backward compat
|
||||
floorLevel?: number
|
||||
expansionPotentialSqm?: number
|
||||
|
||||
contractDurationMonths?: number
|
||||
ancillaryCosts?: number
|
||||
riskLevel?: RiskLevel
|
||||
description?: string
|
||||
images?: string[]
|
||||
organizationId?: string
|
||||
|
||||
status?: 'ACTIVE' | 'INACTIVE' | 'DRAFT' | 'ARCHIVED'
|
||||
lastReviewedAt?: string
|
||||
createdAt: string
|
||||
updatedAt: string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user