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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user