refactor: unit-centric lease view — Einheiten & Mietverträge
Replace building-level Miet- & Mieterinformationen section with unit-level lease display. Each unit row now shows tenant name and lease end date directly; expand reveals full contract details (Mietbeginn, Mietende, Laufzeit, Breakout, source system, doc link). Floor grouping groups consecutive same-floor units under one label. Domain model extended with Lease and Tenant types; deprecated property-level tenant fields preserved via @deprecated for compat. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
d771029633
commit
ee229f8f4f
9 files changed
+518
-343
No files matched your search
@@ -11,8 +11,9 @@ import type {
|
||||
MatchCardReason,
|
||||
} from '../../components/match-card/MatchCardViewModel'
|
||||
import { getCityIntelligence } from '../../lib/locationIntelligence'
|
||||
import { formatUnitTitle, formatMultiUnitFloors } from '../../domain/unit'
|
||||
import { formatUnitTitle, formatMultiUnitFloors, getUnitAvailability } from '../../domain/unit'
|
||||
import { calcFitOutInvestment } from '../../lib/fitOutUtils'
|
||||
import { AvailabilityStatus } from '../../domain/enums'
|
||||
|
||||
const HARD_CRITERIA = new Set(['area', 'location', 'budget', 'timing'])
|
||||
|
||||
@@ -69,9 +70,19 @@ export function buildMatchCardViewModel(
|
||||
cardTitle = property?.title ?? signal?.companyName ?? signal?.locationHint ?? '–'
|
||||
}
|
||||
|
||||
const availabilityLabel =
|
||||
property?.availabilityDate ??
|
||||
(signal?.timeHorizonMonths ? `~${signal.timeHorizonMonths} Monate` : undefined)
|
||||
// Prefer unit-level availability (from Lease), fall back to property-level date, then signal
|
||||
const unitAvail = unit ? getUnitAvailability(unit) : null
|
||||
const availabilityLabel = (() => {
|
||||
if (unitAvail?.availableFrom) {
|
||||
return `ab ${new Date(unitAvail.availableFrom).toLocaleDateString('de-CH', { month: 'short', year: '2-digit' })}`
|
||||
}
|
||||
if (unitAvail?.status === AvailabilityStatus.AVAILABLE_NOW) return 'Sofort verfügbar'
|
||||
if (property?.availabilityDate) {
|
||||
return `ab ${new Date(property.availabilityDate).toLocaleDateString('de-CH', { month: 'short', year: '2-digit' })}`
|
||||
}
|
||||
if (signal?.timeHorizonMonths) return `~${signal.timeHorizonMonths} Monate`
|
||||
return undefined
|
||||
})()
|
||||
|
||||
const sourceLabel =
|
||||
property?.sourceLabel ??
|
||||
@@ -134,6 +145,8 @@ export function buildMatchCardViewModel(
|
||||
signalConfirmedFacts: signal?.confirmedFacts,
|
||||
signalUnconfirmedFacts: signal?.unconfirmedFacts,
|
||||
signalAreaSqmEstimate: signal?.areaSqmEstimate,
|
||||
areaSqm: unit?.areaSqm ?? property?.areaSqm ?? signal?.areaSqmEstimate,
|
||||
rentPerSqm: property?.rentPricePerSqm,
|
||||
propertyId: property?.id ?? signal?.propertyId,
|
||||
unitId: match.unitId ?? unit?.id ?? signal?.unitId,
|
||||
preMarketUnit: unit,
|
||||
|
||||
Reference in new issue
Block a user