Datenmodell Kern: Projekt, PFA, Vertrag, LV, Nachtrag, Dokument

- Mandant, Auftragnehmer, Projekt mit Suchreihenfolge, Abschnitt (PFA), Vertrag,
  Leistungsverzeichnis, Nachtrag (MKA nur als Bezug), Nachtragsposition, Dokument
- Projektmitglieder mit Projektrolle, Freigaben für vertrauliche Dokumente
- Mandant, Land und Projekt werden vom übergeordneten Datensatz übernommen;
  Fehlzuordnungen über Mandanten oder Projekte hinweg werden abgewiesen
- Feste Morph-Map, Factories, Demodaten (Musterbahn, PFA 1–4, N14/N16/N21), Tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Christoph
2026-10-05 08:34:24 +02:00
co-authored by Claude Opus 5.5
parent ca09d23a78
commit 6aac8b0a16
37 changed files with 1855 additions and 2 deletions
+62
View File
@@ -0,0 +1,62 @@
# KI-BauIN – Datenmodell (Kern)
Stand: 5. Oktober 2026. Grundlage für Phase 1. Später ergänzt werden LV-Positionen und
Vorbemerkungen (GAEB-Import, AP5), Prüfung, Feedback und Regeln (AP6–AP8) sowie die Einstellungen
der KI-Schnittstelle (AP3).
## Übersicht
```mermaid
erDiagram
MANDANT ||--o{ PROJEKT : hat
MANDANT ||--o{ AUFTRAGNEHMER : hat
MANDANT ||--o{ USER : hat
PROJEKT ||--o{ ABSCHNITT : "gliedert sich in (PFA)"
ABSCHNITT ||--o{ VERTRAG : enthält
AUFTRAGNEHMER ||--o{ VERTRAG : "ist Partner von"
VERTRAG ||--o{ LEISTUNGSVERZEICHNIS : "hat (oft 20–35)"
VERTRAG ||--o{ NACHTRAG : "erhält"
NACHTRAG ||--o{ NACHTRAGSPOSITION : hat
PROJEKT ||--o{ DOKUMENT : "enthält"
LEISTUNGSVERZEICHNIS ||--o{ DOKUMENT : "X86, D86, PDF"
NACHTRAG ||--o{ DOKUMENT : "Nachtrags-LV, Anschreiben, Anlagen"
PROJEKT }o--o{ USER : "Mitglieder mit Projektrolle"
DOKUMENT }o--o{ USER : "Freigaben (vertraulich)"
```
| Modell | Tabelle | Inhalt |
|---|---|---|
| `Mandant` | `mandanten` | Kunde der Anwendung (im Pilot nur BauIn) |
| `Projekt` | `projekte` | z. B. „Elektrifizierung Musterbahn“; Auftraggeber, Vertragsgrundlage, Status, Suchreihenfolge |
| `Abschnitt` | `abschnitte` | PFA bzw. Abschnitt; die Bezeichnung „PFA“ steht am Projekt (`abschnitt_bezeichnung`) |
| `Auftragnehmer` | `auftragnehmer` | Firma oder ARGE; kann in mehreren PFAs Verträge haben |
| `Vertrag` | `vertraege` | Auftrag an einen Auftragnehmer in einem Abschnitt, z. B. „Gleisbau“ |
| `Leistungsverzeichnis` | `leistungsverzeichnisse` | ein LV des Vertrags; Dateien als Dokumente, Importstatus |
| `Nachtrag` | `nachtraege` | Nr., Eingang, Betreff, MKA-Bezug (Liste), Status, zugewiesen an |
| `Nachtragsposition` | `nachtragspositionen` | OZ, Kurztext, Langtext, Menge, Einheit, EP (nur Information) |
| `Dokument` | `dokumente` | hochgeladene Datei; gehört zu Projekt und optional zu LV, Nachtrag usw.; vertraulich ja/nein |
Pivot-Tabellen: `projekt_mitglieder` (Benutzer, Projekt, Projektrolle) und `dokument_freigaben`
(vertrauliche Dokumente für benannte Personen).
## Festlegungen
- **Mandant, Land und Projekt an jedem Fachdatensatz.** `mandant_id` und `land` stehen an allen
Fachtabellen; `projekt_id` an allem unterhalb des Projekts. Die Werte werden beim Speichern vom
übergeordneten Datensatz übernommen (`App\Models\Concerns\ErbtZuordnung`). Ein Datensatz, der
auf einen Datensatz eines anderen Mandanten, Landes oder Projekts zeigt, wird abgewiesen. Das
gilt auch für Vertrag und Auftragnehmer.
- **Rollen:** Globale Rollen (Administrator, Regelverantwortlicher) über Spatie
laravel-permission. Projektrollen (Projektleiter, Bearbeiter, Leser) in `projekt_mitglieder`,
weil sie je Projekt verschieden sind. Der Teams-Modus von Spatie bleibt aus.
- **MKA nur als Bezug:** `nachtraege.mka_bezug` ist eine Liste von Nummern (Fragenkatalog A8).
- **Dokumente polymorph:** `dokumentable` zeigt auf LV, Nachtrag oder Vertrag; `projekt_id`
bleibt für die Rechteprüfung immer gesetzt. Ohne Projekt ist es ein allgemeines Dokument
(Einstellungen). Die Morph-Namen sind fest (`projekt`, `vertrag`, `leistungsverzeichnis`,
`nachtrag`, `user`), damit Klassennamen nicht in der Datenbank stehen.
- **Löschen:** Fachdaten werden nicht kaskadierend gelöscht; ein Projekt mit Abschnitten lässt
sich nicht löschen, sondern wird archiviert. Ausnahmen: Nachtragspositionen hängen am Nachtrag,
Pivot-Einträge an ihren beiden Seiten.
- **Suchreihenfolge je Projekt (vorläufig, Fragenkatalog A10):** andere Verträge im selben
Abschnitt einbeziehen = nein, andere Abschnitte = ja, nur gleicher Auftragnehmer = nein.
- **Beträge** als Dezimalzahlen (Menge 15,3, EP 15,2); Preise sind in Phase 1 nur Information.