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:
Benjamin Sutter
2026-05-19 15:43:52 +02:00
parent 52a2693cad
commit 920ce8eb09
17 changed files with 1036 additions and 476 deletions
+135 -52
View File
@@ -15,8 +15,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Zürich-West', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3882, lng: 8.5132 } },
address: { street: 'Zollstrasse', houseNumber: '12', postalCode: '8005', city: 'Zürich', country: 'CH' },
areaSqm: 850,
rentPricePerSqm: 38,
totalRentMonthly: 32300,
rentPricePerSqm: 456,
totalRentMonthly: 387600,
availabilityDate: '2025-09-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
@@ -41,7 +41,15 @@ export const mockProperties: Property[] = [
contractDurationMonths: 60,
ancillaryCosts: 5.5,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1486325212027-8081e485255e?w=800&h=400&fit=crop'],
images: ['https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'MediaGroup Schweiz AG',
leaseTerm: '5 Jahre',
leaseStartDate: '2020-09-01',
leaseEndDate: '2025-08-31',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2025-01-10T08:00:00Z',
updatedAt: '2025-04-28T10:30:00Z',
@@ -55,8 +63,8 @@ export const mockProperties: Property[] = [
location: { city: 'Basel', district: 'Kleinhüningen', canton: 'BS', country: 'CH', coordinates: { lat: 47.5736, lng: 7.5946 } },
address: { street: 'Hardstrasse', houseNumber: '44', postalCode: '4057', city: 'Basel', country: 'CH' },
areaSqm: 2400,
rentPricePerSqm: 14,
totalRentMonthly: 33600,
rentPricePerSqm: 168,
totalRentMonthly: 403200,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
@@ -81,6 +89,14 @@ export const mockProperties: Property[] = [
ancillaryCosts: 3.0,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1586528116311-ad8dd3c8310d?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Spedition Rhein GmbH',
leaseTerm: '3 Jahre',
leaseStartDate: '2022-07-01',
leaseEndDate: '2025-06-30',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2024-11-20T09:00:00Z',
updatedAt: '2025-05-05T11:00:00Z',
@@ -94,8 +110,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Oerlikon', canton: 'ZH', country: 'CH', coordinates: { lat: 47.4115, lng: 8.5502 } },
address: { street: 'Thurgauerstrasse', houseNumber: '40', postalCode: '8050', city: 'Zürich', country: 'CH' },
areaSqm: 720,
rentPricePerSqm: 36,
totalRentMonthly: 25920,
rentPricePerSqm: 432,
totalRentMonthly: 311040,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
@@ -122,6 +138,15 @@ export const mockProperties: Property[] = [
ancillaryCosts: 5.0,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Consulting Partners AG',
leaseTerm: '4 Jahre',
leaseStartDate: '2021-10-01',
leaseEndDate: '2025-09-30',
breakoutOption: true,
breakoutOptionDate: '2024-10-01',
organizationId: 'org-wincasa',
createdAt: '2025-02-01T09:00:00Z',
updatedAt: '2025-05-01T08:00:00Z',
@@ -135,8 +160,8 @@ export const mockProperties: Property[] = [
location: { city: 'Basel', district: 'Dreispitz', canton: 'BS', country: 'CH', coordinates: { lat: 47.5398, lng: 7.5812 } },
address: { street: 'Hochbergerstrasse', houseNumber: '9', postalCode: '4057', city: 'Basel', country: 'CH' },
areaSqm: 900,
rentPricePerSqm: 32,
totalRentMonthly: 28800,
rentPricePerSqm: 384,
totalRentMonthly: 345600,
availabilityDate: '2025-09-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
@@ -162,6 +187,14 @@ export const mockProperties: Property[] = [
ancillaryCosts: 4.5,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1481277542470-605612bd2d61?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Pharma Research GmbH',
leaseTerm: '4 Jahre',
leaseStartDate: '2021-09-01',
leaseEndDate: '2025-08-31',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2025-01-20T10:00:00Z',
updatedAt: '2025-04-30T09:00:00Z',
@@ -175,8 +208,8 @@ export const mockProperties: Property[] = [
location: { city: 'Winterthur', district: 'Töss', canton: 'ZH', country: 'CH', coordinates: { lat: 47.4952, lng: 8.7082 } },
address: { street: 'Tössfeldstrasse', houseNumber: '18', postalCode: '8406', city: 'Winterthur', country: 'CH' },
areaSqm: 1800,
rentPricePerSqm: 13,
totalRentMonthly: 23400,
rentPricePerSqm: 156,
totalRentMonthly: 280800,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
@@ -201,6 +234,14 @@ export const mockProperties: Property[] = [
ancillaryCosts: 2.8,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1566438480900-0b5b967f4a25?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Sperrgut Logistik AG',
leaseTerm: '5 Jahre',
leaseStartDate: '2020-07-01',
leaseEndDate: '2025-06-30',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2024-12-10T08:00:00Z',
updatedAt: '2025-05-02T10:00:00Z',
@@ -214,8 +255,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Innenstadt', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3758, lng: 8.5352 } },
address: { street: 'Löwenplatz', houseNumber: '3', postalCode: '8001', city: 'Zürich', country: 'CH' },
areaSqm: 285,
rentPricePerSqm: 88,
totalRentMonthly: 25080,
rentPricePerSqm: 1056,
totalRentMonthly: 300960,
availabilityDate: '2025-08-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
@@ -240,6 +281,14 @@ export const mockProperties: Property[] = [
ancillaryCosts: 8.0,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Fashion Concept GmbH',
leaseTerm: '5 Jahre',
leaseStartDate: '2020-08-01',
leaseEndDate: '2025-07-31',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2025-01-05T10:00:00Z',
updatedAt: '2025-05-06T11:00:00Z',
@@ -253,8 +302,8 @@ export const mockProperties: Property[] = [
location: { city: 'Bern', district: 'Brünnen', canton: 'BE', country: 'CH', coordinates: { lat: 46.9562, lng: 7.3818 } },
address: { street: 'Brünnenstrasse', houseNumber: '22', postalCode: '3018', city: 'Bern', country: 'CH' },
areaSqm: 2800,
rentPricePerSqm: 12,
totalRentMonthly: 33600,
rentPricePerSqm: 144,
totalRentMonthly: 403200,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
@@ -279,6 +328,14 @@ export const mockProperties: Property[] = [
ancillaryCosts: 2.5,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1581091226825-a6a2a5aee158?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Metallbau Bern AG',
leaseTerm: '10 Jahre',
leaseStartDate: '2015-07-01',
leaseEndDate: '2025-06-30',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2024-10-15T09:00:00Z',
updatedAt: '2025-05-03T10:00:00Z',
@@ -292,8 +349,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zug', district: 'Zentrum', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1712, lng: 8.5150 } },
address: { street: 'Industriestrasse', houseNumber: '2', postalCode: '6300', city: 'Zug', country: 'CH' },
areaSqm: 550,
rentPricePerSqm: 42,
totalRentMonthly: 23100,
rentPricePerSqm: 504,
totalRentMonthly: 277200,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
@@ -319,6 +376,15 @@ export const mockProperties: Property[] = [
ancillaryCosts: 6.0,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1564013799919-ab600027ffc6?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'FinTech Zug AG',
leaseTerm: '3 Jahre',
leaseStartDate: '2022-10-01',
leaseEndDate: '2025-09-30',
breakoutOption: true,
breakoutOptionDate: '2025-04-01',
organizationId: 'org-wincasa',
createdAt: '2025-02-10T11:00:00Z',
updatedAt: '2025-04-29T08:00:00Z',
@@ -332,8 +398,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Altstetten', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3908, lng: 8.4888 } },
address: { street: 'Badenerstrasse', houseNumber: '810', postalCode: '8048', city: 'Zürich', country: 'CH' },
areaSqm: 1300,
rentPricePerSqm: 45,
totalRentMonthly: 58500,
rentPricePerSqm: 540,
totalRentMonthly: 702000,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'ERP_IMPORT',
@@ -359,6 +425,14 @@ export const mockProperties: Property[] = [
ancillaryCosts: 5.0,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1524758631624-e2822e304c36?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Design Studio Zürich GmbH',
leaseTerm: '4 Jahre',
leaseStartDate: '2021-11-01',
leaseEndDate: '2025-10-31',
breakoutOption: false,
organizationId: 'org-wincasa',
createdAt: '2025-01-15T09:00:00Z',
updatedAt: '2025-04-25T10:00:00Z',
@@ -372,8 +446,8 @@ export const mockProperties: Property[] = [
location: { city: 'Pratteln', district: 'Industriezone', canton: 'BL', country: 'CH', coordinates: { lat: 47.5228, lng: 7.6958 } },
address: { street: 'Industriestrasse', houseNumber: '55', postalCode: '4133', city: 'Pratteln', country: 'CH' },
areaSqm: 3100,
rentPricePerSqm: 15,
totalRentMonthly: 46500,
rentPricePerSqm: 180,
totalRentMonthly: 558000,
availabilityDate: '2025-07-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_NOW,
sourceType: 'ERP_IMPORT',
@@ -398,6 +472,15 @@ export const mockProperties: Property[] = [
ancillaryCosts: 2.8,
riskLevel: RiskLevel.LOW,
images: ['https://images.unsplash.com/photo-1553413077-190dd305871c?w=800&h=400&fit=crop'],
importedFrom: 'SAP RE-FX',
importedAt: '2025-01-15T08:00:00Z',
lastUpdatedAt: '2025-05-10T10:00:00Z',
currentTenant: 'Handels- und Lagerbetrieb AG',
leaseTerm: '5 Jahre',
leaseStartDate: '2020-07-01',
leaseEndDate: '2025-06-30',
breakoutOption: true,
breakoutOptionDate: '2024-07-01',
organizationId: 'org-wincasa',
createdAt: '2024-12-01T08:00:00Z',
updatedAt: '2025-05-04T09:00:00Z',
@@ -415,8 +498,8 @@ export const mockProperties: Property[] = [
location: { city: 'Bern', district: 'Innenstadt', canton: 'BE', country: 'CH', coordinates: { lat: 46.9483, lng: 7.4474 } },
address: { street: 'Bahnhofstrasse', houseNumber: '88', postalCode: '3011', city: 'Bern', country: 'CH' },
areaSqm: 320,
rentPricePerSqm: 95,
totalRentMonthly: 30400,
rentPricePerSqm: 1140,
totalRentMonthly: 364800,
availabilityDate: '2025-08-15',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'MATCHOFFICE_SCRAPE',
@@ -450,8 +533,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Kreis 4', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3775, lng: 8.5398 } },
address: { street: 'Europaallee', houseNumber: '21', postalCode: '8004', city: 'Zürich', country: 'CH' },
areaSqm: 1150,
rentPricePerSqm: 52,
totalRentMonthly: 59800,
rentPricePerSqm: 624,
totalRentMonthly: 717600,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'IMMOSCOUT_SCRAPE',
@@ -478,8 +561,8 @@ export const mockProperties: Property[] = [
location: { city: 'Luzern', district: 'Innenstadt', canton: 'LU', country: 'CH', coordinates: { lat: 47.0502, lng: 8.3093 } },
address: { street: 'Kasernenplatz', houseNumber: '3', postalCode: '6003', city: 'Luzern', country: 'CH' },
areaSqm: 650,
rentPricePerSqm: 38,
totalRentMonthly: 24700,
rentPricePerSqm: 456,
totalRentMonthly: 296400,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'HOMEGATE_SCRAPE',
@@ -512,8 +595,8 @@ export const mockProperties: Property[] = [
location: { city: 'Muttenz', district: 'Industriezone', canton: 'BL', country: 'CH', coordinates: { lat: 47.5202, lng: 7.6422 } },
address: { street: 'Rheinfelderstrasse', houseNumber: '80', postalCode: '4132', city: 'Muttenz', country: 'CH' },
areaSqm: 2200,
rentPricePerSqm: 16,
totalRentMonthly: 35200,
rentPricePerSqm: 192,
totalRentMonthly: 422400,
availabilityDate: '2025-09-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'IMMOSCOUT_SCRAPE',
@@ -546,8 +629,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Innenstadt', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3766, lng: 8.5385 } },
address: { street: 'Löwenstrasse', houseNumber: '28', postalCode: '8001', city: 'Zürich', country: 'CH' },
areaSqm: 350,
rentPricePerSqm: 95,
totalRentMonthly: 33250,
rentPricePerSqm: 1140,
totalRentMonthly: 399000,
availabilityDate: '2025-09-15',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'MATCHOFFICE_SCRAPE',
@@ -581,8 +664,8 @@ export const mockProperties: Property[] = [
location: { city: 'Bern', district: 'Breitenrain', canton: 'BE', country: 'CH', coordinates: { lat: 46.9598, lng: 7.4522 } },
address: { street: 'Breitenrainstrasse', houseNumber: '14', postalCode: '3014', city: 'Bern', country: 'CH' },
areaSqm: 780,
rentPricePerSqm: 31,
totalRentMonthly: 24180,
rentPricePerSqm: 372,
totalRentMonthly: 290160,
availabilityDate: '2025-10-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'NEWHOME_SCRAPE',
@@ -615,8 +698,8 @@ export const mockProperties: Property[] = [
location: { city: 'Basel', district: 'Kleinhüningen', canton: 'BS', country: 'CH', coordinates: { lat: 47.5720, lng: 7.5882 } },
address: { street: 'Voltastrasse', houseNumber: '62', postalCode: '4056', city: 'Basel', country: 'CH' },
areaSqm: 1900,
rentPricePerSqm: 13,
totalRentMonthly: 24700,
rentPricePerSqm: 156,
totalRentMonthly: 296400,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'IMMOSCOUT_SCRAPE',
@@ -644,8 +727,8 @@ export const mockProperties: Property[] = [
location: { city: 'Zug', district: 'Industrie', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1688, lng: 8.5228 } },
address: { street: 'Industriestrasse', houseNumber: '45', postalCode: '6300', city: 'Zug', country: 'CH' },
areaSqm: 820,
rentPricePerSqm: 44,
totalRentMonthly: 36080,
rentPricePerSqm: 528,
totalRentMonthly: 432960,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'HOMEGATE_SCRAPE',
@@ -665,7 +748,7 @@ export const mockProperties: Property[] = [
publicTransportMinutes: 9,
},
riskLevel: RiskLevel.MEDIUM,
images: ['https://images.unsplash.com/photo-1486325212027-8081e485255e?w=800&h=400&fit=crop'],
images: ['https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&h=400&fit=crop'],
createdAt: '2025-03-18T09:00:00Z',
updatedAt: '2025-04-12T11:00:00Z',
},
@@ -678,8 +761,8 @@ export const mockProperties: Property[] = [
location: { city: 'Genf', district: 'Centre', canton: 'GE', country: 'CH', coordinates: { lat: 46.2044, lng: 6.1432 } },
address: { street: 'Rue du Rhône', houseNumber: '48', postalCode: '1204', city: 'Genf', country: 'CH' },
areaSqm: 250,
rentPricePerSqm: 112,
totalRentMonthly: 28000,
rentPricePerSqm: 1344,
totalRentMonthly: 336000,
availabilityDate: '2026-01-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'MATCHOFFICE_SCRAPE',
@@ -713,8 +796,8 @@ export const mockProperties: Property[] = [
location: { city: 'St. Gallen', district: 'Centrum', canton: 'SG', country: 'CH', coordinates: { lat: 47.4245, lng: 9.3767 } },
address: { street: 'Marktgasse', houseNumber: '7', postalCode: '9000', city: 'St. Gallen', country: 'CH' },
areaSqm: 700,
rentPricePerSqm: 28,
totalRentMonthly: 19600,
rentPricePerSqm: 336,
totalRentMonthly: 235200,
availabilityDate: '2025-11-01',
availabilityStatus: AvailabilityStatus.AVAILABLE_SOON,
sourceType: 'NEWHOME_SCRAPE',
@@ -751,7 +834,7 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Technopark', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3923, lng: 8.5142 } },
address: { street: 'Technoparkstrasse', houseNumber: '1', postalCode: '8005', city: 'Zürich', country: 'CH' },
areaSqm: 600,
rentPricePerSqm: 42,
rentPricePerSqm: 504,
availabilityDate: '2026-03-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -776,7 +859,7 @@ export const mockProperties: Property[] = [
location: { city: 'Reinach', district: 'Industriezone Nord', canton: 'BL', country: 'CH', coordinates: { lat: 47.4978, lng: 7.5933 } },
address: { street: 'Industriestrasse', houseNumber: '18', postalCode: '4153', city: 'Reinach', country: 'CH' },
areaSqm: 3200,
rentPricePerSqm: 11,
rentPricePerSqm: 132,
availabilityDate: '2026-06-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -801,7 +884,7 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Seebach', canton: 'ZH', country: 'CH', coordinates: { lat: 47.4298, lng: 8.5362 } },
address: { street: 'Binzmühlestrasse', houseNumber: '95', postalCode: '8050', city: 'Zürich', country: 'CH' },
areaSqm: 850,
rentPricePerSqm: 38,
rentPricePerSqm: 456,
availabilityDate: '2026-02-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -826,7 +909,7 @@ export const mockProperties: Property[] = [
location: { city: 'Basel', district: 'Klybeck', canton: 'BS', country: 'CH', coordinates: { lat: 47.5762, lng: 7.5918 } },
address: { street: 'Klybeckstrasse', houseNumber: '180', postalCode: '4057', city: 'Basel', country: 'CH' },
areaSqm: 2600,
rentPricePerSqm: 14,
rentPricePerSqm: 168,
availabilityDate: '2026-07-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -851,7 +934,7 @@ export const mockProperties: Property[] = [
location: { city: 'Zürich', district: 'Niederdorf', canton: 'ZH', country: 'CH', coordinates: { lat: 47.3748, lng: 8.5418 } },
address: { street: 'Münstergasse', houseNumber: '14', postalCode: '8001', city: 'Zürich', country: 'CH' },
areaSqm: 280,
rentPricePerSqm: 92,
rentPricePerSqm: 1104,
availabilityDate: '2026-09-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -876,7 +959,7 @@ export const mockProperties: Property[] = [
location: { city: 'Zug', district: 'Industrie', canton: 'ZG', country: 'CH', coordinates: { lat: 47.1672, lng: 8.5198 } },
address: { street: 'Industriestrasse', houseNumber: '60', postalCode: '6300', city: 'Zug', country: 'CH' },
areaSqm: 580,
rentPricePerSqm: 43,
rentPricePerSqm: 516,
availabilityDate: '2026-04-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -901,7 +984,7 @@ export const mockProperties: Property[] = [
location: { city: 'Münchenbuchsee', district: 'Industriezone', canton: 'BE', country: 'CH', coordinates: { lat: 47.0038, lng: 7.4542 } },
address: { street: 'Bernstrasse', houseNumber: '42', postalCode: '3053', city: 'Münchenbuchsee', country: 'CH' },
areaSqm: 2200,
rentPricePerSqm: 12,
rentPricePerSqm: 144,
availabilityDate: '2026-08-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -926,7 +1009,7 @@ export const mockProperties: Property[] = [
location: { city: 'Genf', district: 'La Praille', canton: 'GE', country: 'CH', coordinates: { lat: 46.1912, lng: 6.1285 } },
address: { street: 'Route de la Praille', houseNumber: '30', postalCode: '1227', city: 'Genf', country: 'CH' },
areaSqm: 520,
rentPricePerSqm: 36,
rentPricePerSqm: 432,
availabilityDate: '2027-01-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -951,7 +1034,7 @@ export const mockProperties: Property[] = [
location: { city: 'Frenkendorf', district: 'Industriezone', canton: 'BL', country: 'CH', coordinates: { lat: 47.5098, lng: 7.7182 } },
address: { street: 'Frenkenstrasse', houseNumber: '28', postalCode: '4402', city: 'Frenkendorf', country: 'CH' },
areaSqm: 3500,
rentPricePerSqm: 13,
rentPricePerSqm: 156,
availabilityDate: '2026-10-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',
@@ -976,7 +1059,7 @@ export const mockProperties: Property[] = [
location: { city: 'St. Gallen', district: 'Riethüsli', canton: 'SG', country: 'CH', coordinates: { lat: 47.4182, lng: 9.3888 } },
address: { street: 'Riethüslistrasse', houseNumber: '40', postalCode: '9000', city: 'St. Gallen', country: 'CH' },
areaSqm: 480,
rentPricePerSqm: 27,
rentPricePerSqm: 324,
availabilityDate: '2026-05-01',
availabilityStatus: AvailabilityStatus.FUTURE_SIGNAL,
sourceType: 'AI_SIGNAL',