wiki/mandates/pek/datenmodell/PEK Datenmodell.md
ValueOn AG 15f0e51bd0 pek
2025-10-24 21:42:47 +02:00

558 lines
20 KiB
Markdown

# Datenmodell Architektur-Planungs-App
## Übersicht
Dieses Datenmodell bildet die Grundlage für eine Schweizer Architektur-Planungs-App zur Verwaltung von Bauprojekten, Parzellen, Dokumenten und regulatorischen Kontextinformationen.
## Datenfluss-Diagramm
```mermaid
---
title: Hauptflüsse - Architektur-Planungs-App
---
flowchart TD
Start([Datenmodell Start])
subgraph Admin[Administrative Ebene]
Land[LAND<br/>Schweiz]
Kanton[KANTON<br/>z.B. Zürich]
Gemeinde[GEMEINDE<br/>z.B. Zürich Stadt]
Land --> Kanton
Kanton --> Gemeinde
end
subgraph Geo[Geografische Daten]
Parzelle[PARZELLE<br/>Grundstück mit<br/>Bauparametern]
GeoPunkt[GEO_PUNKT<br/>Koordinaten]
Gemeinde --> Parzelle
Parzelle --> GeoPunkt
end
subgraph Core[Kern-Business-Logik]
Projekt[PROJEKT<br/>Bauprojekt]
Dokument[DOKUMENT<br/>Dateien & URLs]
Projekt -.Perimeter.-> Parzelle
Projekt -.Dokumente.-> Dokument
Parzelle -.Dokumente.-> Dokument
end
subgraph Support[Unterstützende Daten]
Kontext[KONTEXT<br/>Zusatzinfos]
Projekt --> Kontext
Parzelle --> Kontext
end
Start --> Admin
style Land fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff
style Kanton fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff
style Gemeinde fill:#50C878,stroke:#2D7A4A,stroke-width:2px,color:#fff
style Parzelle fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
style Projekt fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
style Dokument fill:#4A90E2,stroke:#2E5C8A,stroke-width:3px,color:#fff
style GeoPunkt fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff
style Kontext fill:#F5A623,stroke:#C17D11,stroke-width:2px,color:#fff
```
---
## Alle Datenobjekte als Tabellen
### Übersichtstabelle
| Objekt | Typ | Beschreibung | Hauptfelder |
|--------|-----|--------------|-------------|
| **Projekt** | Hauptentität | Bauprojekt mit Status und Perimeter | id, label, statusProzess |
| **Parzelle** | Hauptentität | Grundstück mit Bauparametern | id, label, bauzone, AZ, BZ |
| **Dokument** | Hauptentität | Dateien und URLs mit Versionierung | id, label, typ, format |
| **Land** | Admin | Nationale Ebene | id, label |
| **Kanton** | Admin | Kantonale Ebene mit Baurecht | id, label, Baureglement |
| **Gemeinde** | Admin | Gemeinde-Ebene mit BZO | id, label, plz, BZO |
| **GeoPunkt** | Hilfsobjekt | 3D-Koordinate im LV95 | x, y, z, referenzen |
| **Kontext** | Hilfsobjekt | Flexible Zusatzinformationen | id, thema, inhalt |
| **Tag** | Enum | Dokumentkategorien | - |
| **GeoTag** | Enum | Geopunkt-Kategorien | - |
| **JaNein** | Enum | Drei-wertiger Status | "", "Ja", "Nein" |
| **StatusProzess** | Enum | Projektstatus | 7 Werte |
---
## Zentrale Entitäten
### 1. Projekt
**Das Kernobjekt, das ein Bauprojekt repräsentiert.**
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `label` | String | ✓ | Projektbezeichnung |
| `statusProzess` | Array[Enum] | - | Projektstatus: Eingang, Analyse, Studie, Planung, Baurechtsverfahren, Umsetzung, Archiv |
| `perimeter` | Array[Parzelle] | - | Betroffene Parzellen (n:m Beziehung) |
| `dokumenteBauherrschaft` | Array[Dokument] | - | Dokumente vom Bauherrn (n:m Beziehung) |
| `dokumentePlanung` | Array[Dokument] | - | Planungsdokumente (n:m Beziehung) |
| `geoBaulinie` | Array[GeoPunkt] | - | Baulinie als Polygonzug (1:n Beziehung) |
| `kontextInformationen` | Array[Kontext] | - | Projektspezifische Kontextinfos (1:n Beziehung) |
**Beziehungen:**
- **n:m** zu Parzelle (Perimeter über `projekt_parzelle`)
- **n:m** zu Dokument (Bauherrschaft über `projekt_dokument_bauherrschaft`)
- **n:m** zu Dokument (Planung über `projekt_dokument_planung`)
- **1:n** zu GeoPunkt (Baulinie)
- **1:n** zu Kontext
---
### 2. Parzelle
**Repräsentiert ein Grundstück mit allen baurechtlichen Eigenschaften.**
#### Grunddaten
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `label` | String | ✓ | Parzellenbezeichnung |
| `parzellenNummern` | Array[String] | - | Offizielle Parzellennummern |
| `eigentuemerschaaft` | String | - | Eigentümer der Parzelle |
| `strasseNr` | String | - | Straße und Hausnummer |
#### Geografischer Kontext
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `kontextLand` | Land | - | Land der Parzelle (n:1 Beziehung) |
| `kontextKanton` | Kanton | - | Kanton der Parzelle (n:1 Beziehung) |
| `kontextGemeinde` | Gemeinde | - | Gemeinde der Parzelle (n:1 Beziehung) |
| `geoUmfang` | Array[GeoPunkt] | - | Parzellengrenze als Polygon |
#### Nachbarschaft
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `nachbarEigentuemer` | Array[Parzelle] | - | Selbstreferenz zu angrenzenden Parzellen (n:m Beziehung) |
#### Schutzzonen
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `hochwasserschutzzone` | String | - | Hochwasserschutzzone (falls zutreffend) |
| `laermschutzzone` | String | - | Lärmschutzzone |
| `grundwasserschutzzone` | String | - | Grundwasserschutzzone (falls zutreffend) |
#### Bebauungsparameter
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `bauzone` | String | - | Bauzonenbezeichnung (z.B. W3, WG2, etc.) |
| `az` | Float | - | Ausnützungsziffer |
| `bz` | Float | - | Bebauungsziffer |
| `vollgeschossZahl` | Integer | - | Anzahl zulässiger Vollgeschosse |
| `anrechenbarDachgeschoss` | Float | - | Anrechenbarer Anteil Dachgeschoss (0.0 - 1.0) |
| `anrechenbarUntergeschoss` | Float | - | Anrechenbarer Anteil Untergeschoss (0.0 - 1.0) |
| `gebaeudehoehe_max` | Float | - | Maximale Gebäudehöhe in Metern |
#### Abstandsregelungen
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `regelnGrenzabstand` | String | - | Regelungen zum Grenzabstand |
| `regelnMehrlaengenzuschlag` | String | - | Regelungen zum Mehrlängenzuschlag |
| `regelnMehrhoehenzuschlag` | String | - | Regelungen zum Mehrhöhenzuschlag |
#### Eigenschaften (Ja/Nein)
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `parzelleBebaut` | JaNein | - | Ist die Parzelle bebaut? ("", "Ja", "Nein") |
| `parzelleErschlossen` | JaNein | - | Ist die Parzelle erschlossen? ("", "Ja", "Nein") |
| `hanglage` | JaNein | - | Liegt die Parzelle in Hanglage? ("", "Ja", "Nein") |
#### Weitere Informationen
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `spezifischeDokumente` | Array[Dokument] | - | Parzellenspezifische Dokumente (n:m Beziehung) |
| `kontextInformationen` | Array[Kontext] | - | Parzellenspezifische Kontextinfos (1:n Beziehung) |
**Beziehungen:**
- **n:1** zu Land, Kanton, Gemeinde (geografischer Kontext)
- **n:m** zu Parzelle (Nachbarn über `parzelle_nachbar`)
- **n:m** zu Dokument (über `parzelle_dokument`)
- **1:n** zu GeoPunkt (Umfang als Polygon)
- **1:n** zu Kontext
---
### 3. Dokument
**Verwaltet Dateien und URLs mit Versionierung.**
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `label` | String | ✓ | Dokumentbezeichnung |
| `versionsbezeichnung` | String | - | Versionsnummer oder -bezeichnung (z.B. "v1.0", "Rev. A") |
| `typ` | Enum | ✓ | Art des Dokuments: `Datei` oder `Url` |
| `format` | String | - | Dateiformat (z.B. "PDF", "DWG", "IFC", "URL") |
| `dokumentReferenz` | String | ✓ | Dateipfad oder URL |
| `tags` | Array[Tag] | - | Kategorisierung (siehe Tag-Enum) |
#### Tag-Enum (Dokumentkategorien)
| Tag | Beschreibung |
|-----|--------------|
| `Kataster Objekte` | Amtliche Vermessung |
| `Kataster Werkeleitungen` | Leitungskataster |
| `Kataster Belastete Standorte` | Altlasten |
| `Kataster Bäume` | Baumkataster |
| `Zonenplan` | Zonenpläne |
| `Planungs- und Baugesetz (PGB)` | Kantonale Baugesetze |
| `Bau- und Zonenordnung (BZO)` | Gemeinde BZO |
| `Parkplatzverordnung` | Parkplatzregelungen |
| `Eigentümerauskunft` | Grundbuch-Auszüge Eigentümer |
| `Grundbuchauszug` | Vollständige Grundbuch-Auszüge |
**Beziehungen:**
- **n:m** zu allen Entitäten, die Dokumente referenzieren (Projekt, Parzelle, Land, Kanton, Gemeinde)
---
### 4. Geografische Entitäten
#### GeoPunkt
**Repräsentiert einen 3D-Punkt im Schweizer Koordinatensystem LV95 (EPSG:2056).**
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `x` | Float | ✓ | LV95 Ostwert (E), typisch 2'480'000 - 2'840'000 |
| `y` | Float | ✓ | LV95 Nordwert (N), typisch 1'070'000 - 1'300'000 |
| `z` | Float | - | Höhe über Meer in Metern |
| `referenzen` | Array[GeoTag] | - | Kategorisierung des Punktes |
**Verwendung:**
- Parzellenumfang (Polygon)
- Baulinie (Linienzug)
- Einzelne Referenzpunkte
#### GeoTag (Enum)
| Kategorie | Beschreibung |
|-----------|--------------|
| `Referenzpunkt Kat. 1` | Fixpunkt höchster Genauigkeit |
| `Referenzpunkt Kat. 2` | Fixpunkt mittlerer Genauigkeit |
| `Referenzpunkt Kat. 3` | Fixpunkt niedriger Genauigkeit |
| `Geometeraufnahme` | Vom Geometer vermessener Punkt |
**Koordinatensystem-Beispiel (Zürich Hauptbahnhof):**
- X (Ost): 2'683'140
- Y (Nord): 1'247'850
- Z (Höhe): 408 m ü. M.
---
### 5. Administrative Hierarchie
#### Land
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `label` | String | ✓ | Landesname (z.B. "Schweiz") |
| `dokumente` | Array[Dokument] | - | Nationale Gesetze (1:n Beziehung) |
| `kontextInformationen` | Array[Kontext] | - | Nationale Kontextinformationen (1:n Beziehung) |
**Beziehungen:**
- **1:n** zu Kanton
---
#### Kanton
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `label` | String | ✓ | Kantonsname (z.B. "Zürich") |
| `dokumente` | Array[Dokument] | - | Kantonale Dokumente (1:n Beziehung) |
| `kontextInformationen` | Array[Kontext] | - | Kantonsspezifische Kontextinfos (1:n Beziehung) |
| `baureglementAktuell` | Dokument | - | Aktuelles Baureglement |
| `baureglementRevision` | Dokument | - | Baureglement in Revision |
| `bauverordnungAktuell` | Dokument | - | Aktuelle Bauverordnung |
| `bauverordnungRevision` | Dokument | - | Bauverordnung in Revision |
**Beziehungen:**
- **n:1** zu Land
- **1:n** zu Gemeinde
---
#### Gemeinde
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `label` | String | ✓ | Gemeindename (z.B. "Zürich") |
| `plz` | String | - | Postleitzahl |
| `dokumente` | Array[Dokument] | - | Gemeindedokumente (1:n Beziehung) |
| `kontextInformationen` | Array[Kontext] | - | Gemeindespezifische Kontextinfos (1:n Beziehung) |
| `bzoAktuell` | Dokument | - | Aktuelle Bau- und Zonenordnung (BZO) |
| `bzoRevision` | Dokument | - | BZO in Revision |
**Beziehungen:**
- **n:1** zu Kanton
- **1:n** zu Parzelle
---
### 6. Kontext
**Flexibles System für spezifische Informationen und Hinweise.**
| Feld | Datentyp | Pflicht | Beschreibung |
|------|----------|---------|--------------|
| `id` | UUID | ✓ | Eindeutiger Identifier |
| `thema` | String | ✓ | Bezeichnung des Themas |
| `inhalt` | String | ✓ | Detaillierte Information (Text) |
**Polymorphe Beziehung** - Kontext kann gehören zu:
- Projekt (n:1)
- Parzelle (n:1)
- Land (n:1)
- Kanton (n:1)
- Gemeinde (n:1)
#### Beispielthemen (nicht abschliessend)
| Themenbereich | Beispiele |
|---------------|-----------|
| **Nutzung** | Vorgaben zur Erdgeschossnutzung (Wohnen erlaubt oder Pflicht für Gewerbe) |
| **Rechte** | Dienstbarkeiten (Wegrechte, Nähebaurechte, etc.) |
| **Parkierung** | Anforderung Parkplätze (Berechnung / Reduktionsfaktoren) |
| **Ausnützung** | Ausnützungsübertragungen |
| **Umwelt** | Schadstoffbelastungen auf Parzellen |
| **Planung** | Aktive Gestaltungspläne |
| **Lärm** | Lärmempfindlichkeitsstufen |
| **Energie** | Mögliche Wärmenutzung (Wärmeverbundnetze; Fernwärme, Anergie) |
| **Natur** | Baumbestand auf privaten Grundstücken |
| **Schutz** | Isos (Ortsbild, Schutzstatus, Denkmalschutz, Weilergebiet, etc.) |
| **Gefahren** | Naturgefahren (z.B. Objektschutzmassnahmen (Hochwasser)) |
| **Revision** | Verweis auf aktuell in oder zukünftig in Revision befindlichen Normen/Gesetze (z.B. Revision PBG mit aktuell negativer Vorwirkung) |
**Design-Rationale:**
Das Kontext-Objekt ermöglicht flexibles Hinzufügen von projektspezifischen, parzellen-spezifischen oder regionalen Informationen ohne Schemaänderungen.
---
### 7. Hilfsentitäten & Enumerationen
#### JaNein (Enum)
**Drei-wertiger Zustand für optionale Ja/Nein-Fragen.**
| Wert | Bedeutung |
|------|-----------|
| `""` (leer) | Unbekannt / Nicht erfasst |
| `"Ja"` | Ja / Zutreffend |
| `"Nein"` | Nein / Nicht zutreffend |
**Verwendung:**
- `parzelleBebaut`: Ist die Parzelle bebaut?
- `parzelleErschlossen`: Ist die Parzelle erschlossen?
- `hanglage`: Liegt die Parzelle in Hanglage?
---
#### StatusProzess (Enum)
**Projektstatus zur Nachverfolgung des Projektfortschritts.**
| Wert | Beschreibung |
|------|--------------|
| `Eingang` | Projekt wurde eingereicht |
| `Analyse` | Projekt wird analysiert |
| `Studie` | Machbarkeitsstudie läuft |
| `Planung` | Planungsphase |
| `Baurechtsverfahren` | Baubewilligung läuft |
| `Umsetzung` | Bauprojekt in Umsetzung |
| `Archiv` | Projekt abgeschlossen |
**Besonderheit:**
Ein Projekt kann mehrere Status gleichzeitig haben (z.B. "Analyse" und "Studie").
---
#### DokumentTyp (Enum)
| Wert | Beschreibung |
|------|--------------|
| `Datei` | Physische Datei (PDF, DWG, etc.) |
| `Url` | Externer Link / URL |
---
## Beziehungsdiagramm
```
PROJEKT
├── perimeter [1:n] ──────────> PARZELLE
│ ├── dokumenteBauherrschaft [1:n] ──> DOKUMENT
│ ├── dokumentePlanung [1:n] ────────> DOKUMENT
│ ├── geoBaulinie [1:n] ─────────────> GEO_PUNKT
│ └── kontextInformationen [1:n] ───> KONTEXT
PARZELLE
├── nachbarEigentuemer [n:n] ──> PARZELLE (selbst)
├── kontextLand [n:1] ──────────> LAND
├── kontextKanton [n:1] ────────> KANTON
├── kontextGemeinde [n:1] ──────> GEMEINDE
├── geoUmfang [1:n] ────────────> GEO_PUNKT
├── spezifischeDokumente [1:n] ─> DOKUMENT
└── kontextInformationen [1:n] ─> KONTEXT
DOKUMENT
└── tags [n:n] ─────────────────> TAG
GEO_PUNKT
└── referenzen [1:n] ───────────> GEO_TAG
LAND / KANTON / GEMEINDE
├── dokumente [1:n] ────────────> DOKUMENT
└── kontextInformationen [1:n] ─> KONTEXT
```
---
## Junction Tables (Many-to-Many Beziehungen)
**Zwischentabellen zur Auflösung von n:m Beziehungen:**
| Tabelle | Verbindet | Felder | Beschreibung |
|---------|-----------|--------|--------------|
| `projekt_parzelle` | Projekt ↔ Parzelle | `projekt_id`, `parzelle_id` | Projektperimeter |
| `projekt_dokument_bauherrschaft` | Projekt ↔ Dokument | `projekt_id`, `dokument_id` | Dokumente der Bauherrschaft |
| `projekt_dokument_planung` | Projekt ↔ Dokument | `projekt_id`, `dokument_id` | Planungsdokumente |
| `parzelle_nachbar` | Parzelle ↔ Parzelle | `parzelle_id`, `nachbar_id` | Nachbarschaftsbeziehungen |
| `parzelle_dokument` | Parzelle ↔ Dokument | `parzelle_id`, `dokument_id` | Parzellenspezifische Dokumente |
**Besonderheiten:**
- `parzelle_nachbar`: Selbstreferenzierende Tabelle mit Constraint `parzelle_id != nachbar_id`
- Alle Junction Tables haben zusammengesetzte Primärschlüssel aus beiden Foreign Keys
- CASCADE DELETE empfohlen für automatische Bereinigung
---
## Implementierungshinweise
### Datenbank-Design
#### Empfehlung: Hybrid-Ansatz
**Relationale Datenbank (PostgreSQL mit PostGIS):**
- Stammdaten: Projekt, Parzelle, Land, Kanton, Gemeinde
- Geografische Daten: GeoPunkt mit PostGIS-Geometrie-Typen
- Strukturierte Queries und Joins
**Dokumenten-Datenbank oder Blob Storage:**
- Dokumente: S3, Azure Blob Storage oder MinIO
- Metadaten in relationaler DB, Binärdaten extern
#### Schema-Überlegungen
**Normalisierung:**
1. Land, Kanton, Gemeinde als separate Tabellen mit Referenzen
2. Dokument als zentrale Tabelle, referenziert von mehreren Entitäten (Polymorphic Associations oder Junction Tables)
3. GeoPunkt entweder embedded (JSON) oder separate Tabelle mit Foreign Keys
**Denormalisierung für Performance:**
- Häufig abgefragte Parzellendaten können gecached werden
- Gemeinde.plz könnte redundant in Parzelle gespeichert werden
### Geografische Daten
**Koordinatensystem:**
Schweizer Landessystem LV95 (EPSG:2056):
- X (Ost): 2'480'000 - 2'840'000
- Y (Nord): 1'070'000 - 1'300'000
- Z (Höhe): Meter über Meer
### Validierung
**Pflichtfelder:**
- Alle IDs (UUID)
- Alle Labels
- Dokument: typ, dokumentReferenz
- GeoPunkt: x, y (z optional)
- Kontext: thema, inhalt
**Geschäftslogik-Validierungen:**
- AZ und BZ müssen > 0 sein
- VollgeschossZahl muss ≥ 0 sein
- Geo-Koordinaten müssen in gültigem CH-Bereich liegen
- Parzelle muss mindestens 3 GeoPunkte für gültiges Polygon haben
### Sicherheit & Zugriffskontrolle
**Überlegungen:**
- Dokumente: Zugriffskontrolle nach Projekt-/Benutzerrolle
- Eigentümerdaten: DSGVO-konforme Behandlung
- Audit-Log für Änderungen an Bebauungsparametern
- Versionierung von Dokumenten (via versionsbezeichnung)
### Erweiterbarkeit
**Flexible Bereiche:**
1. **Kontext-Objekt**: Neue Themen können ohne Schema-Änderung hinzugefügt werden
2. **Tag-System**: Erweiterbar um neue Dokumentkategorien
3. **StatusProzess**: Kann projektspezifisch angepasst werden
4. **GeoTag**: Neue Kategorien für Vermessungspunkte möglich
**Migration-Strategy:**
- Verwende Datenbank-Migrationen (z.B. Alembic für Python, Flyway für Java)
- Behalte alte Enums bei, füge neue hinzu
- Nutze nullable Felder für neue Eigenschaften
---
## Anwendungsfälle
### Use Case 1: Neues Projekt anlegen
1. Erstelle Projekt mit Label und Status
2. Füge Parzellen zum Perimeter hinzu
3. Lade Dokumente der Bauherrschaft hoch
4. Verknüpfe Kontext-Informationen
### Use Case 2: Bebaubarkeit prüfen
1. Lade Parzelle mit allen Eigenschaften
2. Prüfe AZ, BZ, Vollgeschosszahl
3. Berücksichtige Hanglage, Schutzzonen
4. Lade BZO der Gemeinde
5. Prüfe Kontext-Informationen (Dienstbarkeiten, etc.)
### Use Case 3: Nachbaranalyse
1. Lade Parzelle
2. Folge nachbarEigentuemer-Referenzen
3. Zeige Eigentümer und Bebauung der Nachbarparzellen
### Use Case 4: Dokumentensuche
1. Suche über Tags (z.B. "Zonenplan")
2. Filtere nach Format (z.B. PDF)
3. Gruppiere nach Projekt/Parzelle/Gemeinde
### Use Case 5: Revisionen verfolgen
1. Prüfe Gemeinde.bzoRevision
2. Prüfe Kanton.baureglementRevision
3. Erstelle Kontext-Eintrag mit Hinweis auf negative Vorwirkung
---
## Offene Fragen / Zu klären
1. **Versionierung**: Sollen Änderungen an Parzellen historisiert werden?
2. **Mehrsprachigkeit**: Labels in DE/FR/IT?
3. **Benutzer & Rollen**: Wer darf was bearbeiten?
4. **Workflow-Engine**: Für Statusübergänge und Genehmigungen?
5. **Integration**: Anbindung an amtliche Geodaten (z.B. Swisstopo API)?
6. **Berechnungen**: Sollen Ausnützungsberechnungen automatisiert werden?
---
## Nächste Schritte
1. **Validierung**: Review mit PEK
2. **Prototyp**: Implementierung der Datenmodell-Klassen
3. **GIS-Integration**: PostGIS aufsetzen, Test-Geodaten importieren
4. **API-Design**: RESTful API (FastAPI) mit OpenAPI-Dokumentation