feat(archiv): Uebersicht, Volltextsuche und Druckansicht
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

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:
2026-09-25 20:59:38 +00:00
co-authored by Claude Opus 5
parent e7a2e2d5c7
commit ab5777a57e
32 changed files with 4202 additions and 38 deletions
+37
View File
@@ -0,0 +1,37 @@
/**
* Was „ueberfaellig“ heisst — an einer Stelle (#015).
*
* Die Regel steht im Auftrag: **`faelligAm` verstrichen und der Lauf laeuft
* noch.** Zwei Feinheiten entscheiden darueber, ob sie stimmt:
*
* 1. **Verstrichen heisst „vor heute“, nicht „vor jetzt“.** Ein Datumsfeld im
* Browser liefert einen Tag, keine Uhrzeit; gespeichert wird daraus
* Mitternacht UTC. Verglichen mit dem Augenblick waere ein Lauf, der *heute*
* faellig ist, hierzulande ab zwei Uhr morgens „ueberfaellig“ — an dem Tag,
* an dem er erledigt werden soll. Wer eine Warnung zweimal umsonst sieht,
* liest die dritte nicht mehr (Reviewbefund zu #015).
* 2. **Fertig ist nicht ueberfaellig.** Ein abgeschlossener Lauf mit
* verstrichenem Datum ist fertig, kein Rueckstand; ein archivierter erst
* recht nicht.
*
* Framework- und datenbankfrei, damit Lesemodell und Anzeige **dieselbe** Grenze
* benutzen. Zwei Fassungen derselben Regel laufen auseinander, und dann steht
* ein Lauf im Block „Ueberfaellig“ und traegt daneben eine unauffaellige Frist.
*/
/** Mitternacht des Tages, in dem dieser Zeitpunkt liegt – in **lokaler** Zeit. */
export function tagesbeginn(zeitpunkt: Date): Date {
const beginn = new Date(zeitpunkt);
beginn.setHours(0, 0, 0, 0);
return beginn;
}
/**
* Ist diese Frist verstrichen?
*
* Ohne Frist gibt es nichts zu versaeumen. Der heutige Tag gilt **nicht** als
* verstrichen.
*/
export function fristVerstrichen(faelligAm: Date | null | undefined, jetzt: Date): boolean {
return faelligAm !== null && faelligAm !== undefined && faelligAm < tagesbeginn(jetzt);
}
+1 -1
View File
@@ -48,7 +48,7 @@ export const NAVIGATION: readonly NavEintrag[] = [
symbol: "Building2",
verfuegbar: true,
},
{ pfad: "/archiv", beschriftung: "Archiv", symbol: "Archive", verfuegbar: false, ausIssue: 15 },
{ pfad: "/archiv", beschriftung: "Archiv", symbol: "Archive", verfuegbar: true },
{ pfad: "/admin", beschriftung: "Admin", symbol: "Settings", recht: "verwaltung", verfuegbar: true },
];