diff --git a/server/workspace-zentrale.js b/server/workspace-zentrale.js index 7745a4e7..d647b249 100644 --- a/server/workspace-zentrale.js +++ b/server/workspace-zentrale.js @@ -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" }, ], }); }