feat(archiv): Uebersicht, Volltextsuche und Druckansicht
Der Einstieg am Schreibtisch und das Gedaechtnis der Anwendung. Die Uebersicht
sortiert nach Dringlichkeit — ueberfaellig zuerst, und das ist das Einzige in
Warnfarbe; alles andere auf der Seite ist Auskunft.
Das Archiv sucht ueber Titel, Notizen, erfasste Werte und Kommentare in einer
SQL-Anweisung: `Schrittergebnis.wert` ist ein Json, und nur `("wert")::text`
trifft den Trigramm-Index aus #006. Vor allem aber gehoert die Fundstelle zum
Treffer — ein Treffer ohne sichtbaren Grund ist fuer den Suchenden wertlos.
Die Druckansicht ist ein eigenes Lesemodell und kein Schalter an
`laufZumAbarbeiten`: dort entsteht beim Fuellen der Befehle ein Passwort, und auf
einem Blatt, das jemand abheftet, darf keines stehen. Vom Mitarbeiter holt sie
nur Name, UPN und Abteilung — nicht alles und dann gefiltert.
Der unabhaengige Review fand zwei Blocker, beide im Dashboard: „ueberfaellig“
verglich mit dem Augenblick statt mit dem Tagesbeginn, und der Schnellstart
zaehlte Laeufe fremder Kunden mit. Was „ueberfaellig“ heisst, steht seitdem in
`src/lib/fristen.ts` — eine Regel fuer Lesemodell und Anzeige.
Closes #15
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit was merged in pull request #29.
This commit is contained in:
@@ -240,6 +240,42 @@ ein `'wasm-unsafe-eval'` — die schmale Erlaubnis, WebAssembly zu uebersetzen,
|
||||
an derselben Stelle ein Feld fuer den abgetippten Code: der steht lesbar unter
|
||||
jedem QR, und ein Scanner, der nicht startet, darf keine Sackgasse sein.
|
||||
|
||||
## 5f. Archiv und Ausdruck: das Gedaechtnis
|
||||
|
||||
Die **Archivsuche** geht ueber drei Tabellen — `Lauf.titel`, `Schrittergebnis.notiz`,
|
||||
`Schrittergebnis.wert` und `Kommentar.rumpf` — und steht deshalb als **eine**
|
||||
SQL-Anweisung in `src/server/queries/archiv.ts` statt als vier Prisma-Abfragen.
|
||||
Zwei Gruende, beide handfest:
|
||||
|
||||
1. `Schrittergebnis.wert` ist ein Json. Nur `("wert")::text` trifft den
|
||||
`pg_trgm`-GIN-Index aus #006; eine ganze Json-Spalte als Text zu durchsuchen
|
||||
kann Prisma nicht.
|
||||
2. Die Fundstelle gehoert zum Treffer. Wer im Archiv sucht, will nicht wissen
|
||||
**dass** etwas passt, sondern **wo** — Titel, Notiz, Wert oder Kommentar, mit
|
||||
dem Ausschnitt drumherum. Vier getrennte Abfragen muessten das hinterher
|
||||
wieder zusammenlegen.
|
||||
|
||||
Jeder Wert geht als Parameter in die Anweisung (`Prisma.sql`), und `%`, `_` und
|
||||
`\` werden fuer `ILIKE` maskiert: die Suche nach „50 %“ trifft sonst „5099“.
|
||||
`tsvector` bleibt die spaetere Optimierung, so wie in §5a festgehalten.
|
||||
|
||||
**Abgelegt heisst `COALESCE(archiviertAm, abgeschlossenAm, erstelltAm)`** — derselbe
|
||||
Ausdruck fuer die Sortierung **und** den Zeitraumfilter. Zwei verschiedene
|
||||
Ausdruecke hiessen: ein Lauf steht ausserhalb des Zeitraums, den die Liste an
|
||||
seiner Position anzeigt.
|
||||
|
||||
Die **Druckansicht** (`/drucken/lauf/<id>`) ist ein eigenes Lesemodell und kein
|
||||
Schalter an `laufZumAbarbeiten`. Dort entsteht beim Fuellen der Befehle ein
|
||||
`{{generiertes_passwort}}`; auf einem Blatt, das jemand abheftet, darf keines
|
||||
stehen — dort erscheint `[Passwort – nicht gespeichert]`, und erzeugt wird
|
||||
keines. Der Beweis dafuer ist ein Vergleich: zwei Ausdrucke desselben Laufs sind
|
||||
Zeichen fuer Zeichen gleich, ein erzeugtes Passwort waere bei jedem Aufbau ein
|
||||
anderes.
|
||||
|
||||
Vom Mitarbeiter holt dieses Lesemodell **nur Name, UPN und Abteilung** — nicht
|
||||
alles und dann gefiltert. Ein Ausdruck liegt herum, wird kopiert und weitergegeben;
|
||||
was darauf steht, ist aus der Hand gegeben.
|
||||
|
||||
## 6. Betrieb: zwei Wege, eine Regel
|
||||
|
||||
Die Datenbank ist auf beiden Wegen von außen nicht erreichbar:
|
||||
|
||||
Reference in New Issue
Block a user