CLAUDE.md und README.md verweisen auf docs/, die Dateien lagen aber im Wurzelverzeichnis. Verschoben. docs/13-entscheidungen.md hält fest, wo die Dokumente sich widersprechen und wie es aufgelöst wurde. Der wichtigste Punkt: 04-datenmodell.md verlangt eine Regel, die jedes UPDATE auf CaseEntryVersion verwirft, 05-akten-und-vorlagen.md verlangt, dass eine Umklassifizierung rückwirkend auf alle Versionen wirkt. Beides zusammen geht nicht. Aufgelöst über einen Trigger, der die Tabelle anhängend hält, aber das Anheben von minClearance zulässt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
62 lines
2.8 KiB
Markdown
62 lines
2.8 KiB
Markdown
# Suche und Export
|
|
|
|
## Suche
|
|
|
|
Postgres Full-Text-Search, deutsche Konfiguration. Kein Elasticsearch.
|
|
|
|
- `search_vector` auf `Case` per Trigger aus Aktenzeichen und Titel (Gewicht A),
|
|
Abschnittswerten (B) und Verlaufseinträgen (C)
|
|
- GIN-Index, `websearch_to_tsquery('german', $1)`
|
|
- Zusätzlich Trigram-Index (`pg_trgm`) auf `caseNumber` und `displayName` für Tippfehler
|
|
|
|
Filter: Status, Fallart, Zeitraum, Beteiligte, Klassifizierung, Tags, nur meine Fälle.
|
|
|
|
**Die Sichtbarkeitsprüfung gehört in dieselbe Abfrage**, nicht als Nachfilter. Sonst stimmen
|
|
Trefferzahl und Seitenlänge nicht und aus den Lücken lässt sich auf verborgene Akten
|
|
schließen. Gleiches gilt für Facettenzähler.
|
|
|
|
Gespeicherte Ansichten, die es ab Werk geben sollte: meine Fälle, Wiedervorlage diese Woche,
|
|
seit meinem letzten Besuch geändert, unbearbeitet seit 14 Tagen, zuletzt geöffnet.
|
|
|
|
## Export
|
|
|
|
### Einzelakte als PDF
|
|
|
|
Aufbau: Deckblatt mit Aktenzeichen, Klassifizierungsvermerk und `Stand:`-Zeitstempel,
|
|
Kopfdatentabelle, Abschnitte in Vorlagenreihenfolge, chronologischer Verlauf,
|
|
Anhangsverzeichnis mit Hashes.
|
|
|
|
Nachträglich geänderte Verlaufseinträge werden im Export als solche ausgewiesen
|
|
(`bearbeitet, v3, 31.08.2026`), zurückgezogene erscheinen als Grabstein mit Begründung.
|
|
Ein Export darf nie sauberer aussehen als die Akte ist. Der `Stand:`-Zeitstempel macht
|
|
erkennbar, dass ein älterer Ausdruck überholt sein kann.
|
|
|
|
Drei Regeln:
|
|
|
|
1. **Der Export respektiert die Stufe des Abrufers.** Gesperrte Felder werden als Schwärzung
|
|
ausgegeben, nicht weggelassen, mit dem Vermerk „Geschwärzt, Stufe 4". Sonst merkt der
|
|
Empfänger nicht, dass er eine gekürzte Fassung hat.
|
|
2. **Wasserzeichen** auf jeder Seite: Name des Abrufers, Zeitstempel, Freigabestufe.
|
|
3. **Jeder Export wird protokolliert.** Ab Stufe 3 zusätzlich Freigabe durch einen Nutzer mit
|
|
Recht `export.approve`, also Vier-Augen-Prinzip. Die Anfrage erscheint beim Leiter als
|
|
Aufgabe im Dashboard.
|
|
|
|
### Technik
|
|
|
|
Playwright-Container rendert eine dedizierte Druckansicht `/faelle/[caseNumber]/druck`
|
|
mit `@media print`-Styles. Kein PDF-Bibliotheks-Layout von Hand.
|
|
|
|
Erzeugte PDFs werden gecacht unter dem Schlüssel
|
|
`sha256(caseId + updatedAt + clearanceLevel + templateVersion)`. Auf einem Homeserver kostet
|
|
das Rendern spürbar CPU, und dieselbe Akte wird oft mehrfach exportiert.
|
|
|
|
Der Export läuft als Hintergrundauftrag: Klick erzeugt einen Job, die UI zeigt einen
|
|
Fortschrittsbalken und der Download startet automatisch, sobald der Job fertig ist. Bei über
|
|
3 Sekunden bekommt der Nutzer zusätzlich eine Benachrichtigung, damit er wegklicken kann.
|
|
|
|
### Weitere Wege
|
|
|
|
- ZIP mit PDFs und Anhängen für Sammelexporte, nur mit Recht `admin`
|
|
- Vollständiger JSON-Export der Datenbank als Umzugs- und Notfallformat, ohne
|
|
Stufenfilterung, nur für `admin`, immer protokolliert
|