diff --git a/server/pruef-personen-liste.mjs b/server/pruef-personen-liste.mjs
index db7d85f7..57363b21 100644
--- a/server/pruef-personen-liste.mjs
+++ b/server/pruef-personen-liste.mjs
@@ -71,6 +71,18 @@ anlegen("Patrick", "scout", "CODE-PATR-0001");
anlegen("SpongBobSchwammKopf", "creator", "CODE-SPON-0001");
anlegen("Tili", "creator", "CODE-TILI-0001");
anlegen("BanaStift", "manager", "CODE-BSTF-0001", 0); // gesperrt
+
+/* GENAU EINE PERSON IST PER BENACHRICHTIGUNG ERREICHBAR (03.10.2026).
+
+ Damit laesst sich der Hinweis "bekommt keine Benachrichtigungen"
+ in beide Richtungen pruefen: Er muss bei den anderen stehen UND
+ bei dieser fehlen. Stuende er ueberall, waere die Pruefung "er
+ steht da" wertlos -- sie koennte gar nichts anderes messen. */
+d.prepare(`INSERT INTO push_anmeldungen
+ (endpunkt, person_id, p256dh, auth, geraet, erstellt, zuletzt_ok, fehler)
+ VALUES (?, (SELECT id FROM personen WHERE name = 'Patrick'), ?,?,?,?,?,0)`)
+ .run("https://example.invalid/push/patrick", "p256dh-platzhalter",
+ "auth-platzhalter", "Pruefgeraet", jetzt, jetzt);
d.close();
const { chromium } = await import(
@@ -91,6 +103,13 @@ async function seiteFuer(kontext) {
const lesen = (seite) => seite.evaluate(() => ({
namen: [...document.querySelectorAll(".person__name")].map((n) => n.textContent.replace(" (du)", "")),
+ /* Zu wem gehoert welcher Hinweis? Die Kachel ist die Klammer --
+ sonst waere nicht zu unterscheiden, ob der Hinweis bei Patrick
+ oder bei seinem Nachbarn steht. */
+ ohnePush: [...document.querySelectorAll(".person")]
+ .filter((k) => [...k.querySelectorAll(".person__bezug")]
+ .some((z) => /keine Benachrichtigungen/.test(z.textContent)))
+ .map((k) => k.querySelector(".person__name")?.textContent.replace(" (du)", "")),
abschnitte: [...document.querySelectorAll(".gruppe")].map((g) => ({
name: g.querySelector(".gruppe__name")?.textContent,
zahl: g.querySelector(".gruppe__zahl")?.textContent,
@@ -188,6 +207,24 @@ console.log("\n3) Der Sammelknopf klappt alles auf und wieder zu");
`Zusatztext wörtlich von der Zugangsseite ("${r.abschnitte[2]?.unter}")`);
}
+console.log("\n3b) Wer bekommt ueberhaupt eine Benachrichtigung?");
+{
+ const r = await lesen(seite);
+ /* Am 03.10.2026 nachgemessen: 20 aktive Personen im Haus, 8 mit
+ einer Anmeldung. Zwoelf bekamen nichts, und niemand konnte das
+ sehen -- auch sie selbst nicht. */
+ ok(r.ohnePush.length > 0 && r.ohnePush.includes("Tili"),
+ `der Hinweis steht bei den Unerreichbaren (${r.ohnePush.join(", ") || "nirgends"})`);
+ ok(!r.ohnePush.includes("Patrick"),
+ "aber NICHT bei Patrick, der ein Geraet angemeldet hat");
+ /* Bei einer gesperrten Person ist es keine Luecke, sondern richtig
+ so -- sie soll ja nichts mehr bekommen. */
+ ok(!r.ohnePush.includes("BanaStift"),
+ "und nicht bei der gesperrten Person (dort waere es kein Mangel)");
+ ok(r.ohnePush.length === r.namen.length - 2,
+ `genau die ${r.namen.length - 2} aktiven ohne Geraet (${r.ohnePush.length})`);
+}
+
console.log("\n4) Der Zustand überlebt das Neuladen – je Rolle einzeln");
{
/* Nur die Creator zuklappen. Es muss die EINZELNE Einstellung
diff --git a/server/workspace-personen.js b/server/workspace-personen.js
index 46e70ad1..7bdcc801 100644
--- a/server/workspace-personen.js
+++ b/server/workspace-personen.js
@@ -355,6 +355,26 @@ personenRouter.get("/workspace/api/verwaltung/personen", (req, res) => {
Scouts an ihm haengen. Beides aus derselben Abfrage --
eine zweite waere eine zweite Gelegenheit, dass die
Liste etwas anderes sagt als die Rechte. */
+ /* ERREICHT SIE UEBERHAUPT EINE BENACHRICHTIGUNG? (03.10.2026)
+
+ Am 03.10. nachgemessen: 20 aktive Personen, aber nur
+ 8 mit einer Anmeldung. Zwoelf bekommen nichts --
+ darunter ein Modi und die linke Hand. Niemand konnte
+ das sehen, auch sie selbst nicht: Die Glocke sagt es
+ nur dem, der sie anschaut.
+
+ Wer etwas Wichtiges schreibt, soll nicht raten
+ muessen, wen es erreicht. Deshalb steht es dort, wo
+ ohnehin ueber Personen entschieden wird, und nicht
+ auf einer eigenen Seite, die niemand aufruft.
+
+ Aus DERSELBEN Abfrage wie alles andere -- eine
+ zweite waere eine zweite Gelegenheit, dass die Liste
+ etwas anderes sagt als die Wirklichkeit. */
+ (SELECT COUNT(*) FROM push_anmeldungen pa
+ WHERE pa.person_id = p.id) AS push_geraete,
+ (SELECT MAX(pa.zuletzt_ok) FROM push_anmeldungen pa
+ WHERE pa.person_id = p.id) AS push_zuletzt,
sz.manager_id,
(SELECT name FROM personen m WHERE m.id = sz.manager_id) AS manager_name,
(SELECT COUNT(*) FROM scout_zuteilung z WHERE z.manager_id = p.id) AS scouts_anzahl
diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html
index 0d0d8e79..36dc6236 100644
--- a/workspace/anruf-probe.html
+++ b/workspace/anruf-probe.html
@@ -16,8 +16,8 @@
verdeckt. Gefunden hat es pruef-struktur.
Richtig sind `gate.css` (die Farbwerte des Hauses) und `haus.css`. -->
-
-
+
+
-
+