Jede Rolle sieht ihre eigene Zahl -- Schulle zaehlte das ganze Haus

Filipe (screen22), nachdem Managerin Schulle "2 Creator" angezeigt bekam,
obwohl sie einen hat: "die zahl die da angezeigt wird soll bitte immer
jedem genau zutreffend sein." Und dazu (screen23), wer was sehen soll:

  "dogfather und cigdem haben die zahl vom insgesamten. manager sehen nur
   die gesamte zahl ihrer scouts und ihren creator die ihnen zugeteilt
   sind, die scout sehen die zahl nur von ihren creator und die creator
   da termine vom tag selber"

DIE ZAHL WAR NICHT FALSCH GERECHNET, SIE BEANTWORTETE DIE FALSCHE FRAGE.
Hier stand `SELECT ... FROM personen WHERE aktiv = 1` -- alle, fuer jeden
aus der Leitung gleich. Ein Manager sah damit das ganze Haus als "sein
Team", einschliesslich Leuten, mit denen er nichts zu tun hat.

Jetzt je Rolle:
  admin/spicy  alle aktiven Personen, ohne sich selbst
  manager      seine Scouts UND die Creator (eigene wie die der Scouts)
  scout        nur seine Creator
  creator      unveraendert der eigene Tag

SCOUTS BEKOMMEN DIESEN RING NEU. Sie zaehlen nicht zur Leitung und sahen
deshalb den Stundenring des eigenen Tages -- aber ein Scout hat ein Team,
naemlich seine Creator. Genau danach hat Filipe gefragt. Der Ring heisst
bei ihm "Creator versorgt" statt "Team versorgt": Sonst liest ein Scout
"Team" und sucht die anderen vier Rollen darin.

OHNE SICH SELBST: Wer den Ring ansieht, ist die Person, die ihn liest.
Sich selbst als Segment im eigenen Team mitzuzaehlen verschiebt jede
Prozentangabe um einen Platz.

KEINE ZWEITE RECHENVORSCHRIFT. Die Zuordnung wird nicht hier nachgebaut:
`betreuteIds` kennt die Kette Manager -> Scouts -> deren Creator bereits,
`scoutsVon` die Scouts. Eine eigene Fassung derselben Frage waere genau
der Weg, auf dem zwei Wahrheiten entstehen.

Dazu screen26: "liegt liegen, keine ahnung was das bedeuten soll aber das
soll viel besser sein bitte." Gezaehlt werden Personen mit unerledigten
Terminen aus der VERGANGENHEIT -- das Schild heisst jetzt "ueberfaellig".

GEMESSEN an einer Lage, die den Fehler enthaelt: fuenf aktive Personen,
darunter ein Creator, der zu niemandem gehoert.
  DogFather        4 im Team        [Fremder, Tili, Schulle, Patrick]
  Manager Schulle  2 im Team        [Tili, Patrick]   <- ohne "Fremder"
  Scout Patrick    1 meine Creator  [Tili]
  Creator Tili     eigener Tag
pruef-start-ansicht EXIT=0 (140), pruef-rollen EXIT=0 (97).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-08 05:23:30 +02:00
co-authored by Claude Opus 5
parent ff8ea38595
commit e3f7826ca5
+73 -10
View File
@@ -50,7 +50,7 @@
===================================================================== */
import express from "express";
import { db, sitzungLesen, istLeitung, betreuteIds } from "./workspace.js";
import { db, sitzungLesen, istLeitung, betreuteIds, scoutsVon } from "./workspace.js";
export const zentraleRouter = express.Router();
@@ -85,19 +85,71 @@ zentraleRouter.get("/workspace/api/zentrale", (req, res) => {
ihrs?" gefuehrt. */
const zeigt = req.person.sicht || req.person;
if (istLeitung(ich)) {
/* ================================================================
WESSEN TEAM? JEDE ROLLE SIEHT IHR EIGENES (08.09.2026)
Filipe, nachdem Managerin Schulle "2 Creator" angezeigt bekam,
obwohl sie einen hat: "die zahl die da angezeigt wird soll bitte
immer jedem genau zutreffend sein" -- und dazu, wer was sieht:
"dogfather und cigdem haben die zahl vom insgesamten. manager
sehen nur die gesamte zahl ihrer scouts und ihren creator die
ihnen zugeteilt sind, die scout sehen die zahl nur von ihren
creator und die creator da termine vom tag selber"
Vorher stand hier `SELECT ... FROM personen WHERE aktiv = 1` --
ALLE, fuer jeden aus der Leitung gleich. Deshalb sah Schulle das
ganze Haus statt ihres Teams. Die Zahl war nicht falsch berechnet,
sie beantwortete die falsche Frage.
Die Zuordnung selbst wird NICHT hier nachgebaut: `betreuteIds`
kennt die Kette Manager -> Scouts -> deren Creator bereits, und
`scoutsVon` die Scouts. Eine zweite Rechenvorschrift fuer
dieselbe Frage waere genau der Weg, auf dem zwei Wahrheiten
entstehen.
SCOUTS BEKOMMEN JETZT AUCH DIESEN RING. Sie zaehlen nicht zur
Leitung und sahen deshalb den Stundenring des eigenen Tages --
aber ein Scout hat ein Team, naemlich seine Creator. Genau danach
hat Filipe gefragt. */
const istTeamsicht = istLeitung(ich) || ich.rolle === "scout";
if (istTeamsicht) {
/* ---------- DAS TEAM ----------
Ein Segment je aktiver Person. Der Zustand einer Person ist
bewusst GROB in drei Stufen -- mehr taeuschte Genauigkeit vor,
die es nicht gibt (dieselbe Ueberlegung steht in VanVans Kranz).
Ein Segment je Person im eigenen Verantwortungsbereich. Der
Zustand einer Person ist bewusst GROB in drei Stufen -- mehr
taeuschte Genauigkeit vor, die es nicht gibt (dieselbe
Ueberlegung steht in VanVans Kranz).
frei - nichts Offenes, keine Termine heute -> ruhig
dran - hat heute Termine -> die sind versorgt
offen - hat unerledigte Termine aus der VERGANGENHEIT
-> das ist das, was liegen bleibt
*/
const leute = d.prepare(
`SELECT id, name, rolle FROM personen WHERE aktiv = 1 ORDER BY rolle, name`).all();
let leute;
if (ich.rolle === "admin" || ich.rolle === "spicy") {
/* Das ganze Haus -- und zwar ohne sich selbst: Wer den Ring
ansieht, ist die Person, die ihn liest; sich selbst als
Segment im eigenen Team zu zaehlen, verschiebt jede Prozent-
angabe um einen Platz. */
leute = d.prepare(
`SELECT id, name, rolle FROM personen
WHERE aktiv = 1 AND id <> ? ORDER BY rolle, name`).all(ich.id);
} else {
/* Manager: seine Scouts UND die Creator (eigene wie die seiner
Scouts). Scout: nur seine Creator. */
const ids = [...new Set([
...(ich.rolle === "manager" ? scoutsVon(ich.id) : []),
...betreuteIds(ich),
])].filter((id) => id !== ich.id);
leute = ids.length
? d.prepare(
`SELECT id, name, rolle FROM personen
WHERE aktiv = 1 AND id IN (${ids.map(() => "?").join(",")})
ORDER BY rolle, name`).all(...ids)
: [];
}
const heuteZaehler = d.prepare(
`SELECT COUNT(*) AS n FROM termine t
@@ -123,15 +175,26 @@ zentraleRouter.get("/workspace/api/zentrale", (req, res) => {
});
const versorgt = segmente.filter((s) => s.stufe !== "offen").length;
/* Ein Scout fuehrt Creator, kein "Team" im Sinne des Hauses. Das
Wort auf dem Ring sagt deshalb, WEN er zaehlt -- sonst liest ein
Scout "Team versorgt" und sucht die anderen vier Rollen darin. */
const nurCreator = ich.rolle === "scout";
return res.json({
art: "team",
titel: "Team versorgt",
titel: nurCreator ? "Creator versorgt" : "Team versorgt",
prozent: segmente.length ? Math.round((versorgt / segmente.length) * 100) : 100,
segmente,
zahlen: [
{ wert: segmente.length, schild: "im Team" },
{ wert: segmente.length, schild: nurCreator ? "meine Creator" : "im Team" },
{ wert: segmente.filter((s) => s.stufe === "dran").length, schild: "heute dran" },
{ wert: segmente.filter((s) => s.stufe === "offen").length, schild: "liegt liegen" },
/* "liegt liegen" stand hier und war nicht zu verstehen -- Filipe
wortwoertlich: "keine ahnung was das bedeuten soll". Gezaehlt
werden Personen mit unerledigten Terminen aus der
VERGANGENHEIT. "Ueberfaellig" sagt das in einem Wort und ist
der Begriff, der auch sonst im Haus dafuer steht. */
{ wert: segmente.filter((s) => s.stufe === "offen").length, schild: "überfällig" },
],
});
}