feat: Verwaltungszugang refactor — lease data, 3-tab detail, market signals
- Dashboard: remove QuickActionPanel, StrongMatchOverview, FutureSignalWidget,
DataQualityWidget, header buttons, Marktchancen nav; KpiGrid → 4 cards
- Property domain: 9 new fields (leaseTerm, leaseStartDate/End, breakoutOption,
currentTenant, importedFrom, importedAt, lastUpdatedAt)
- Mock data: annual CHF/m²/Jahr prices (×12), Swiss images, tenant/lease data
for all 10 VERIFIED_PORTFOLIO properties; need budgets updated to annual
- PropertyTable: swap columns — add Aktueller Mieter, Mietlaufzeit,
Breakoutoption, Breakoutoption Zeitpunkt; remove Verfügbarkeit, Konfidenz, Quelle
- PropertyDetailView: 3 tabs (Übersicht, Matchability, Marktsignale) with
inline edit mode, NeedMatchCard list, PropertyMarketSignalsTab
- New: marketReport domain + mock data + service, NeedMatchCard,
PropertyMarketSignalsTab with 4 sections + PDF button
- matchService: getNeedMatchesForProperty(propertyId, {minScore})
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+10
-10
@@ -11,7 +11,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 600, max: 1000 },
|
||||
preferredLocations: ['Zürich', 'Zürich-West', 'Zürich Kreis 5'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 45, maxMonthlyTotal: 40000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 540, maxMonthlyTotal: 40000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-08-01',
|
||||
latestMoveIn: '2026-01-01',
|
||||
@@ -50,7 +50,7 @@ export const mockNeeds: Need[] = [
|
||||
assetType: AssetType.LOGISTICS,
|
||||
requiredArea: { min: 1500, max: 4000 },
|
||||
preferredLocations: ['Basel', 'Muttenz', 'Pratteln', 'Reinach BL'],
|
||||
budgetRange: { maxPerSqm: 18, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 216, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-09-01',
|
||||
latestMoveIn: '2026-06-01',
|
||||
@@ -86,7 +86,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 500, max: 800 },
|
||||
preferredLocations: ['Basel', 'Allschwil', 'Binningen', 'Dreispitz'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 40, maxMonthlyTotal: 32000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 480, maxMonthlyTotal: 32000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-10-01',
|
||||
latestMoveIn: '2026-04-01',
|
||||
@@ -126,7 +126,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 200, max: 500 },
|
||||
preferredLocations: ['Zürich Innenstadt', 'Zürich Bahnhofstrasse', 'Zürich Niederdorf', 'Zürich City'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 100, maxMonthlyTotal: 50000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 1200, maxMonthlyTotal: 50000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-09-01',
|
||||
latestMoveIn: '2026-03-01',
|
||||
@@ -165,7 +165,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 300, max: 700 },
|
||||
preferredLocations: ['Zug', 'Zürich', 'Baar', 'Steinhausen'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 48, maxMonthlyTotal: 33000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 576, maxMonthlyTotal: 33000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-10-01',
|
||||
latestMoveIn: '2026-06-01',
|
||||
@@ -204,7 +204,7 @@ export const mockNeeds: Need[] = [
|
||||
assetType: AssetType.LOGISTICS,
|
||||
requiredArea: { min: 1200, max: 3000 },
|
||||
preferredLocations: ['Winterthur', 'Wülflingen', 'Oberwinterthur', 'Töss'],
|
||||
budgetRange: { maxPerSqm: 16, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 192, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-11-01',
|
||||
latestMoveIn: '2026-05-01',
|
||||
@@ -240,7 +240,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 800, max: 1500 },
|
||||
preferredLocations: ['Zürich', 'Zürich-West', 'Zürich Altstetten', 'Bern'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 55, maxMonthlyTotal: 75000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 660, maxMonthlyTotal: 75000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2026-01-01',
|
||||
latestMoveIn: '2026-07-01',
|
||||
@@ -279,7 +279,7 @@ export const mockNeeds: Need[] = [
|
||||
assetType: AssetType.PRODUCTION,
|
||||
requiredArea: { min: 2000, max: 4000 },
|
||||
preferredLocations: ['Bern', 'Brünnen', 'Münchenbuchsee', 'Bern West'],
|
||||
budgetRange: { maxPerSqm: 14, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 168, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-12-01',
|
||||
latestMoveIn: '2026-09-01',
|
||||
@@ -315,7 +315,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 150, max: 400 },
|
||||
preferredLocations: ['Genf', 'Genf Rive', 'Genf Centre'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 120, maxMonthlyTotal: 48000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 1440, maxMonthlyTotal: 48000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2026-01-01',
|
||||
latestMoveIn: '2026-06-01',
|
||||
@@ -354,7 +354,7 @@ export const mockNeeds: Need[] = [
|
||||
requiredArea: { min: 400, max: 800 },
|
||||
preferredLocations: ['St. Gallen', 'St. Gallen Centrum', 'Riethüsli', 'Ostschweiz'],
|
||||
excludedLocations: [],
|
||||
budgetRange: { maxPerSqm: 35, maxMonthlyTotal: 28000, currency: 'CHF' },
|
||||
budgetRange: { maxPerSqm: 420, maxMonthlyTotal: 28000, currency: 'CHF' },
|
||||
timing: {
|
||||
earliestMoveIn: '2025-11-01',
|
||||
latestMoveIn: '2026-04-01',
|
||||
|
||||
Reference in New Issue
Block a user