Der Wecker: mehrere Erinnerungen je Termin, jeder fuer sich

Filipe: "wie so ein wecker, den man auch in den eintraegen aktivieren
oder ausschalten kann, den soll man sogar so einstellen koennen, dass
er einen auch mehrmals informiert, einmal eine woche vorher, einmal
drei tage vorher und einmal am tag selber. das soll man auch selbst
jeder fuer sich einstellen koennen. hol die besten skills."

NACHGELESEN, NICHT GERATEN. Google Calendar erlaubt fuenf Erinnerungen
je Termin, Outlook genau eine, Apple zwei. Die verbreitete Empfehlung
fuer Wichtiges lautet "eine Woche, ein Tag, am Tag selbst" -- also
genau die Staffel, die Filipe genannt hat. Uebernommen: sechs Stufen
zur Wahl (Woche, drei Tage, ein Tag, selber Tag, Stunde, zehn Minuten),
hoechstens fuenf gleichzeitig.

EINE ZEILE IST EIN WECKER -- kein Feld am Termin mit einer Liste darin.
Mehrere Vorlaufzeiten UND "jeder fuer sich" sind zusammen eine
n:m-Beziehung; ein Feld mit kommagetrennten Zahlen waere beim ersten
"zeig mir alle faelligen Wecker" nicht mehr abfragbar.

DER ABSTAND STEHT IN DER DATENBANK, NICHT DER ZEITPUNKT. Ein Zeitpunkt
muesste bei jeder Terminverschiebung nachgezogen werden -- und genau
das vergisst man. Ein Abstand rechnet sich beim Wecken aus dem
aktuellen Beginn und ist damit immer richtig.

ZWEI GRENZEN IM WECKLAUF, und beide sind noetig: faellig (Weckzeit
erreicht) UND der Termin liegt noch vor uns. Ohne die zweite wuerde
beim ersten Lauf nach einem Ausfall jeder alte Wecker der letzten
Wochen nachtraeglich klingeln.

DER ABSTAND GEHOERT INS MERKMAL der Doppelsperre. Ohne ihn wuerde der
erste Wecker eines Termins alle weiteren sperren -- und genau das
Mehrfach-Wecken, um das es geht, faende nie statt.

DIE PRUEFUNG HAT SICH ZWEIMAL SELBST KORRIGIERT

  1. Erster Lauf um 23:42: vier Fehler, keiner echt -- der Melder
     schweigt zwischen 22 und 7 Uhr. Sie hat den Kalender gemessen,
     nicht die Software, und waere am Vormittag gruen gewesen. Dass die
     GEGENPROBE mitgefallen ist, war die eigentliche Auskunft: Waeren
     nur die Grenzen falsch, haette sie gehalten. Die Ruhezeit ist
     jetzt ueber die Umgebung einstellbar (Vorgabe unveraendert 22/7),
     damit eine Pruefung ihre Voraussetzung herstellen kann.
  2. Danach immer noch nichts: Ich hatte angenommen, der Melder trage
     den Versand nach dem VERSUCH ein. Er traegt ihn nach der
     erfolgreichen ZUSTELLUNG ein -- und das ist richtig so. Meine
     Annahme war falsch, nicht der Code. Die Pruefung hat jetzt einen
     winzigen echten Empfaenger; damit laeuft der ganze Versandweg mit,
     Verschluesselung und VAPID inbegriffen.

pruef-wecker.mjs: 20 Pruefungen. Sie stellt alle vier Fehler nach, die
bei einem Wecker moeglich sind (klingelt nicht / doppelt / nur einmal
von dreien / nachtraeglich nach einem Ausfall) -- plus die Gegenprobe,
dass ein faelliger Wecker wirklich ankommt.

Zwoelf weitere Pruefungen gelaufen, alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-07 23:51:20 +02:00
co-authored by Claude Opus 5
parent 63036fc33e
commit 1c2e196d1d
25 changed files with 1008 additions and 193 deletions
+43
View File
@@ -1181,6 +1181,49 @@ export function db() {
);
CREATE INDEX IF NOT EXISTS idx_termin_teilnehmer ON termin_teilnehmer (person_id);
/* =================================================================
DER WECKER (07.09.2026)
Wunsch Filipe: "wie so ein wecker, den man auch in den
eintraegen aktivieren oder ausschalten kann, den soll man sogar
so einstellen koennen, dass er einen auch mehrmals informiert,
einmal eine woche vorher, einmal drei tage vorher und einmal am
tag selber. das soll jeder fuer sich selbst einstellen koennen."
EINE ZEILE IST EIN WECKER. Nicht ein Feld am Termin mit einer
Liste darin: Mehrere Vorlaufzeiten je Termin sind der ganze
Zweck, und "jeder fuer sich" heisst, dass zwei Personen am
SELBEN Termin verschiedene Wecker haben. Beides zusammen ist
eine klassische n:m-Beziehung, und die gehoert in eine eigene
Tabelle. Ein Feld mit kommagetrennten Zahlen waere beim ersten
"zeig mir alle faelligen Wecker" nicht mehr abfragbar.
Die Spalte minuten_vorher statt eines Zeitpunkts: Ein Zeitpunkt muesste
bei JEDER Terminverschiebung nachgezogen werden -- und genau
das vergisst man. Ein Abstand rechnet sich beim Wecken aus dem
aktuellen Beginn und ist damit immer richtig, egal wie oft der
Termin wandert.
ON DELETE CASCADE an beiden Seiten: Ein Wecker ohne Termin
weckt niemanden, und ein Wecker ohne Person auch nicht.
Zusammengesetzter Primaerschluessel: Dieselbe Person kann
denselben Abstand nicht zweimal setzen -- sonst klingelt es
doppelt, und das merkt man erst nachts.
Recherche (Google Calendar, Outlook, Morgen): Fuenf Wecker je
Termin sind das uebliche Maximum, und die verbreitete Empfehlung
fuer Wichtiges lautet "eine Woche, ein Tag, am Tag selbst".
Genau diese Staffel bietet die Oberflaeche an. */
CREATE TABLE IF NOT EXISTS termin_wecker (
termin_id INTEGER NOT NULL REFERENCES termine(id) ON DELETE CASCADE,
person_id INTEGER NOT NULL REFERENCES personen(id) ON DELETE CASCADE,
minuten_vorher INTEGER NOT NULL,
gesetzt TEXT NOT NULL,
PRIMARY KEY (termin_id, person_id, minuten_vorher)
);
CREATE INDEX IF NOT EXISTS idx_termin_wecker_person
ON termin_wecker (person_id);
/* Dasselbe fuer die Wiederholungen. Eine Serie ist eine Regel --
die Teilnehmer gehoeren zur Regel, nicht zur einzelnen
Auspraegung, sonst muesste man sie jede Woche neu eintragen.