Sendeprotokoll fuer Benachrichtigungen: "ich bekomme nichts" ist jetzt beantwortbar

Beim Nachsehen zu Dienes Meldung ist aufgefallen, dass ueber den
Versand selbst nichts festgehalten wird. Im Protokoll standen nur
push_angemeldet und push_abgemeldet -- kein Wort darueber, ob je
etwas verschickt wurde, an wie viele Geraete, und warum nicht.

Von neun Aufrufstellen wertete genau eine den Rueckgabewert aus; die
anderen acht warfen ihn weg. Sagt jemand "ich bekomme nichts", liess
sich also nicht nachsehen, OB gesendet wurde -- dieselbe Falle wie am
06.09. in VanVans Shop, wo zwei Stunden in die Zustellung ermittelt
wurden, bevor jemand fragte, ob die Mails abgeschickt waren. Sie
waren es, alle, nachweisbar in einer Abfrage.

zuletzt_ok reicht dafuer nicht: Es sagt, wann zuletzt irgendetwas
ankam -- nicht was, nicht an wen sonst, und nichts ueber die Faelle,
in denen gar nicht erst gesendet wurde. Genau die (abgeschaltet,
Ruhezeit, kein Geraet) sind die haeufigste Antwort auf die Frage.

Neue Tabelle push_versand: Zeit, Person, Art, Grund, Geraete,
zugestellt. Festgehalten wird JEDER Ausgang, auch der, bei dem nichts
hinausging -- ein Protokoll, das nur Erfolge kennt, kann die Frage
nicht beantworten, fuer die es angelegt wurde.

Das Protokoll sitzt als Huelle um den Versand, nicht in ihm: Sieben
Ausgaenge einzeln zu protokollieren waere eine Liste zum Pflegen, und
der achte, den jemand naechstes Jahr einbaut, umginge sie still --
so sind am 11.09. die Spalten beim Tabellenumbau verschwunden. So
steht ein neuer Ausgang ohne Zutun mit drin.

Aufraeumen nach 30 Tagen, neben dem bestehenden Aufraeumen von
push_verschickt. Gemessen statt geschaetzt: rund 16 Chat-Nachrichten
am Tag an bis zu acht angemeldete Geraete -- ein paar tausend Zeilen
im Monat.

Das Schreiben kann den Versand nicht aufhalten (try), meldet sich
aber, wenn es scheitert: ein Protokoll, das heimlich nichts
schreibt, ist schlimmer als keins.

pruef-push-eilig 13 -> 20. Darunter die Gegenprobe, dass auch das
NICHT-Senden protokolliert wird, und dass ein Fehlschlag nicht als
zugestellt gilt.

Datenbank vorher gesichert und die Sicherung geprueft (integrity_check,
20 Personen, 10 Anmeldungen lesbar).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-03 13:03:29 +02:00
co-authored by Claude Opus 5
parent 73f9b24793
commit e349de0040
3 changed files with 146 additions and 2 deletions
+40
View File
@@ -5216,6 +5216,46 @@ export function db() {
);
CREATE INDEX IF NOT EXISTS idx_push_verschickt_zeit ON push_verschickt (zeit);
/* WAS HINAUSGING -- das Sendeprotokoll (03.10.2026).
ACHTUNG: In diesem Block duerfen keine schraegen Anfuehrungs-
striche stehen, er liegt in einem Template-Literal. Zweimal
hat genau das den Serverstart zerlegt.
WARUM ES DAS BRAUCHT. Diene meldete "ich bekomme nichts", und
niemand konnte nachsehen, OB etwas hinausging. Es gab nur
push_angemeldet und push_abgemeldet im Protokoll -- kein
Wort darueber, ob je eine Meldung verschickt wurde, an wie
viele Geraete, und was der Dienst geantwortet hat.
Das ist dieselbe Falle wie am 06.09. in VanVans Shop: Zwei
Stunden Suche nach dem Grund, warum eine Mail nicht ankommt,
bevor jemand fragte, ob sie ueberhaupt abgeschickt wurde. Sie
war es, alle, nachweisbar. Eine einzige Abfrage haette am
Anfang stehen muessen statt am Ende.
zuletzt_ok in push_anmeldungen reicht dafuer NICHT: Es sagt
nur, wann zuletzt IRGENDETWAS ankam, nicht was, nicht an wen
sonst, und vor allem nichts ueber die Faelle, in denen gar
nicht erst gesendet wurde -- abgeschaltet, Ruhezeit, kein
Geraet. Genau die sind die haeufigste Antwort auf "ich
bekomme nichts".
Deshalb wird JEDER Ausgang festgehalten, auch der, bei dem
nichts hinausging. Ein Protokoll, das nur Erfolge kennt, kann
die Frage nicht beantworten, fuer die es angelegt wurde. */
CREATE TABLE IF NOT EXISTS push_versand (
id INTEGER PRIMARY KEY AUTOINCREMENT,
zeit TEXT NOT NULL,
person_id INTEGER NOT NULL REFERENCES personen(id) ON DELETE CASCADE,
art TEXT NOT NULL,
grund TEXT NOT NULL,
geraete INTEGER NOT NULL DEFAULT 0,
zugestellt INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX IF NOT EXISTS idx_push_versand_zeit ON push_versand (zeit);
CREATE INDEX IF NOT EXISTS idx_push_versand_person ON push_versand (person_id, zeit);
/* Rueckmeldungen zu einer Aufgabe (Konzept: "Aufgaben & Feedback").
Ohne sie endet jede Rueckfrage ausserhalb des Systems -- in
WhatsApp, und damit ausserhalb dessen, was spaeter noch