diff --git a/src/components/supply/PropertyDetailOverview.tsx b/src/components/supply/PropertyDetailOverview.tsx
index fa24f79..d2fafbb 100644
--- a/src/components/supply/PropertyDetailOverview.tsx
+++ b/src/components/supply/PropertyDetailOverview.tsx
@@ -1,4 +1,5 @@
-import { Box, Divider, LinearProgress, TextField, Typography } from '@mui/material'
+import { Box, Button, Divider, LinearProgress, TextField, Typography } from '@mui/material'
+import { ExternalLink, FileText, Plus } from 'lucide-react'
import type { Property, UpdatePropertyInput } from '../../domain/property'
import { PropertyMap } from '../shared'
import { getAssetTypeLabel, qualityColor } from './propertyHelpers'
@@ -97,18 +98,75 @@ export function PropertyDetailOverview({ p, editing, draft, onDraftChange }: Pro
onChange={e => onDraftChange({ ...draft, leaseEndDate: e.target.value })}
/>
+
+
+
+ Mietvertrag
+
+
+
+ onDraftChange({ ...draft, leaseContractUrl: e.target.value })}
+ placeholder="https://…"
+ slotProps={{ input: { startAdornment: } }}
+ />
+ onDraftChange({ ...draft, leaseContractName: e.target.value })}
+ placeholder="z.B. Mietvertrag 2021–2026"
+ />
+
) : (
-
-
-
-
-
-
-
-
-
-
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ {/* Mietvertrag */}
+
+
+
+
+ Mietvertrag
+
+
+ {p.leaseContractUrl ? (
+
+
+ {p.leaseContractName ?? 'Mietvertrag'}
+
+ }
+ href={p.leaseContractUrl}
+ target="_blank"
+ rel="noopener noreferrer"
+ sx={{ textTransform: 'none', fontSize: '0.7rem', py: 0.25, px: 1, borderColor: '#cbd5e1', color: '#1e3a5f', whiteSpace: 'nowrap', flexShrink: 0 }}
+ >
+ Öffnen
+
+
+ ) : (
+
+ Noch kein Mietvertrag hinterlegt — im Bearbeitungsmodus hinzufügen.
+
+ )}
+
+ >
)}
{/* Floor / unit structure */}
diff --git a/src/components/supply/ReminderDetailDrawer.tsx b/src/components/supply/ReminderDetailDrawer.tsx
index d0d78dc..0da2c8c 100644
--- a/src/components/supply/ReminderDetailDrawer.tsx
+++ b/src/components/supply/ReminderDetailDrawer.tsx
@@ -12,9 +12,10 @@ import {
FormControlLabel,
Tooltip,
} from '@mui/material'
-import { X, MapPin, Calendar, DollarSign, Eye, Activity } from 'lucide-react'
+import { X, MapPin, Calendar, DollarSign, Eye, Activity, FileText, ExternalLink } from 'lucide-react'
import { useReminderStore } from '../../stores/reminderStore'
import { useReminder, useCompleteReminder, useDismissReminder, useSnoozeReminder } from '../../hooks/useReminders'
+import { usePropertyById } from '../../hooks/useProperties'
import { ReminderPriorityBadge } from './ReminderPriorityBadge'
import { ReminderTypeBadge } from './ReminderTypeBadge'
import { ReminderDaysIndicator } from './ReminderDaysIndicator'
@@ -24,6 +25,7 @@ import { SHADOW_RISK_COLOR, SHADOW_RISK_LABEL, STATUS_CHIP_COLOR, STATUS_LABEL,
export function ReminderDetailDrawer() {
const { selectedId, drawerOpen, setDrawerOpen, setSelectedId } = useReminderStore()
const { data: reminder } = useReminder(selectedId ?? '')
+ const { data: reminderProperty } = usePropertyById(reminder?.propertyId ?? '')
const complete = useCompleteReminder()
const dismiss = useDismissReminder()
const snooze = useSnoozeReminder()
@@ -101,6 +103,27 @@ export function ReminderDetailDrawer() {
Mieter: {reminder.tenantName}
Fläche: {reminder.areaSqm.toLocaleString('de-CH')} m²
+ {reminderProperty?.leaseContractUrl ? (
+
+
+ }
+ href={reminderProperty.leaseContractUrl}
+ target="_blank"
+ rel="noopener noreferrer"
+ sx={{ textTransform: 'none', fontSize: '0.68rem', py: 0.125, px: 0.75, borderColor: '#cbd5e1', color: '#1e3a5f' }}
+ >
+ {reminderProperty.leaseContractName ?? 'Mietvertrag'}
+
+
+ ) : (
+
+
+ Kein Mietvertrag hinterlegt
+
+ )}
diff --git a/src/domain/property.ts b/src/domain/property.ts
index 52303e3..6aacc62 100644
--- a/src/domain/property.ts
+++ b/src/domain/property.ts
@@ -135,6 +135,8 @@ export interface Property {
description?: string
images?: string[]
floorPlanUrl?: string
+ leaseContractUrl?: string // link to the signed lease document
+ leaseContractName?: string // display label, e.g. "Mietvertrag 2021–2026"
propertyNumber?: string
units?: PropertyUnit[]