From 628b99943ee9413811ad193a7ae9992f4d69a29e Mon Sep 17 00:00:00 2001 From: Dogfather Date: Sat, 3 Oct 2026 13:09:51 +0200 Subject: [PATCH] Personenliste zeigt, wen eine Benachrichtigung ueberhaupt erreicht Am 03.10.2026 am laufenden System nachgemessen: 20 aktive Personen, aber nur 8 mit einer Push-Anmeldung. Zwoelf bekommen keine einzige Benachrichtigung -- darunter ein Modi und die linke Hand. Das war fuer niemanden sichtbar. Die Glocke sagt es nur dem, der sie anschaut, und wer etwas Wichtiges schreibt, konnte nicht wissen, wen es erreicht. Die Dringlichkeit, die heute frueh behoben wurde, hilft diesen zwoelf gar nichts: Ohne Anmeldung geht nichts hinaus. Der Hinweis steht jetzt auf der Personenseite, also dort, wo ohnehin ueber Personen entschieden wird -- 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. NUR BEIM FEHLEN, UND DAS IST ABSICHT. Stuende bei jeder Person eine Zeile, stuenden bei zwanzig Personen zwanzig Zeilen da, und die, auf die es ankommt, gingen darin unter -- eine Angabe, die immer kommt, wird nicht mehr gelesen. Schweigen heisst hier: erreichbar. Die Zeilen verschwinden eine nach der anderen, sobald jemand die Glocke anschaltet. Nicht bei gesperrten Personen: Dort ist es keine Luecke, sondern richtig so. pruef-personen-liste 33 -> 37, mit der Gegenprobe in beide Richtungen: Eine Person bekommt im Testbestand ein angemeldetes Geraet, und bei genau ihr darf der Hinweis NICHT stehen. Stuende er ueberall, waere "er steht da" wertlos. Gegengemessen, dass die zusaetzliche Zeile nichts verschiebt: pruef-personen-kachel 45, pruef-hand-personen 49, pruef-modi-verborgen 94, pruef-betreuung 18, pruef-scout-zuteilung (liest dieselbe Klasse .person__bezug) -- alle ohne Fehler. Co-Authored-By: Claude Opus 5 --- server/pruef-personen-liste.mjs | 37 +++++++++++++++++++++++++++ server/workspace-personen.js | 20 +++++++++++++++ workspace/anruf-probe.html | 10 ++++---- workspace/app.webmanifest | 8 +++--- workspace/assets/js/personen.js | 20 +++++++++++++++ workspace/aufgaben.html | 38 ++++++++++++++-------------- workspace/automation.html | 32 ++++++++++++------------ workspace/befinden.html | 34 ++++++++++++------------- workspace/bereich.html | 44 ++++++++++++++++----------------- workspace/bewerben.html | 38 ++++++++++++++-------------- workspace/bewerbungen.html | 36 +++++++++++++-------------- workspace/buehne.html | 6 ++--- workspace/calls.html | 34 ++++++++++++------------- workspace/chat.html | 40 +++++++++++++++--------------- workspace/content.html | 34 ++++++++++++------------- workspace/crew-index.html | 12 ++++----- workspace/crew.webmanifest | 8 +++--- workspace/dateien.html | 34 ++++++++++++------------- workspace/entwicklung.html | 36 +++++++++++++-------------- workspace/hilfe.html | 30 +++++++++++----------- workspace/index.html | 10 ++++---- workspace/kalender.html | 34 ++++++++++++------------- workspace/leistung.html | 32 ++++++++++++------------ workspace/manager-ziele.html | 28 ++++++++++----------- workspace/material.html | 32 ++++++++++++------------ workspace/notizen.html | 28 ++++++++++----------- workspace/personen.html | 32 ++++++++++++------------ workspace/profil.html | 36 +++++++++++++-------------- workspace/reaktion.html | 38 ++++++++++++++-------------- workspace/rechte.html | 34 ++++++++++++------------- workspace/report.html | 36 +++++++++++++-------------- workspace/scouting.html | 32 ++++++++++++------------ workspace/start.html | 32 ++++++++++++------------ workspace/startcheck.html | 34 ++++++++++++------------- workspace/steckbrief.html | 36 +++++++++++++-------------- workspace/support.html | 28 ++++++++++----------- workspace/tafel.html | 6 ++--- workspace/talente.html | 36 +++++++++++++-------------- workspace/team.html | 32 ++++++++++++------------ workspace/teamlage.html | 34 ++++++++++++------------- workspace/teilen.html | 30 +++++++++++----------- workspace/treff-moderation.html | 32 ++++++++++++------------ workspace/treff-regeln.html | 32 ++++++++++++------------ workspace/uebersicht.html | 32 ++++++++++++------------ workspace/unsere-seiten.html | 30 +++++++++++----------- workspace/unterstuetzen.html | 32 ++++++++++++------------ workspace/werdegang.html | 32 ++++++++++++------------ workspace/willkommen.html | 30 +++++++++++----------- workspace/wissen.html | 34 ++++++++++++------------- 49 files changed, 761 insertions(+), 684 deletions(-) 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`. --> - - + + - +