diff --git a/server/pruef-zuteilung.mjs b/server/pruef-zuteilung.mjs index 9bc1baa5..4adcee8b 100644 --- a/server/pruef-zuteilung.mjs +++ b/server/pruef-zuteilung.mjs @@ -436,6 +436,60 @@ melde("\n=== Fertig machen und bewerten ==="); ok(fremderStatus.code === 403 || fremderStatus.code === 404, ` und wer sie nicht hat, setzt auch keinen Status (${fremderStatus.code})`); + /* =================================================================== + EINE DAUERHAFTE AUFGABE WIRD NICHT ABGEHAKT -- AUCH NICHT UEBER + DEN STATUS (02.10.2026) + + VanVan im Support, Meldung #6: „Der Modi kann die dauerhafte + Aufgabe immer noch auf erledigt setzen." + + Die Sperre gab es seit dem 30.09., aber nur in `/mein-stand`. Der + Statusweg kannte `dauerhaft` nicht -- und seit die Modi den Status + setzen darf (zwanzig Zeilen weiter oben), stand ihr genau der Weg + offen, der ihr an der anderen Tuer verwehrt ist. Zwei Tueren, eine + Regel, und die Regel hing nur an einer. + + GEPRUEFT WERDEN BEIDE TUEREN, sonst wandert der Fehler nur. */ + { + const d = await rufe("/workspace/api/aufgaben", { method: "POST", keks: chef, + body: { titel: "Neue begruessen", dauerhaft: true, zuteilung: [idAnna] } }); + const idDauer = d.json?.id; + ok(d.code === 201 && Number.isInteger(idDauer), + `eine dauerhafte Aufgabe (#${idDauer})`); + await rufe(`/workspace/api/aufgaben/${idDauer}/annehmen`, { method: "POST", keks: anna }); + + const ueberStand = await rufe(`/workspace/api/aufgaben/${idDauer}/mein-stand`, + { method: "POST", keks: anna, body: { zustand: "erledigt" } }); + ok(ueberStand.code === 409 && ueberStand.json?.fehler === "dauerhafte_aufgabe", + `Tuer 1 (mein-stand) ist zu (${ueberStand.code} ${ueberStand.json?.fehler})`); + + const ueberStatus = await rufe(`/workspace/api/aufgaben/${idDauer}`, + { method: "PATCH", keks: anna, body: { status: "erledigt" } }); + ok(ueberStatus.code === 409 && ueberStatus.json?.fehler === "dauerhafte_aufgabe", + `Tuer 2 (Status) jetzt auch (${ueberStatus.code} ${ueberStatus.json?.fehler})` + + " — das war VanVans Befund"); + + /* ANFANGEN DARF SIE SEHR WOHL. Auch eine stehende Aufgabe hat + einen Anfang; gesperrt ist nur das Abhaken. Ohne diese Zeile + waere „gesperrt" eine Regel, die zu viel sperrt. */ + const anfangen = await rufe(`/workspace/api/aufgaben/${idDauer}`, + { method: "PATCH", keks: anna, body: { status: "arbeit" } }); + ok(anfangen.code === 200, ` anfangen darf sie trotzdem (${anfangen.code})`); + + /* UND DIE LEITUNG BEENDET SIE. Eine Pflicht, die niemand mehr + beenden kann, waere eine Falle statt einer Regel. */ + const chefBeendet = await rufe(`/workspace/api/aufgaben/${idDauer}`, + { method: "PATCH", keks: chef, body: { status: "erledigt" } }); + ok(chefBeendet.code === 200, ` und die Leitung beendet sie (${chefBeendet.code})`); + + /* DER KNOPF FEHLT AUCH AUF DEM BILDSCHIRM -- einer, der eine + Absage holt, ist schlimmer als keiner. */ + const liste = await rufe("/workspace/api/aufgaben", { keks: anna }); + const dAnna = (liste.json?.aufgaben || []).find((x) => x.id === idDauer); + ok(dAnna?.darf_beenden === false, + `und die Oberflaeche erfaehrt es (darf_beenden ${dAnna?.darf_beenden})`); + } + /* ZURUECKRAEUMEN -- und die Rueckfahrt ist selbst eine Messung. Dieser Abschnitt hat Annas Aufgabe auf „arbeit" gestellt. Ein diff --git a/server/workspace-aufgaben.js b/server/workspace-aufgaben.js index 47926626..bcc0c38e 100644 --- a/server/workspace-aufgaben.js +++ b/server/workspace-aufgaben.js @@ -544,6 +544,12 @@ aufgabenRouter.get("/workspace/api/aufgaben", (req, res) => { Recht -- vorher hing sie am falschen, und eine Modi sah gar keinen. */ r.darf_status = darfStatusSetzen(req.person, r); + /* UND DARF ER SIE BEENDEN? Bei einer dauerhaften Aufgabe nur + die Leitung. Ohne diese Zeile stuende dort ein Knopf + „erledigt", der eine Absage holt -- und ein Knopf, der + eine Absage holt, ist schlimmer als keiner (so steht es + seit dem 30.09. in /mein-stand). */ + r.darf_beenden = !r.dauerhaft || darfAufgabenVerteilen(req.person); /* DIE OBERFLAECHE SOLL DEN KNOPF NUR ZEIGEN, WENN ER GEHT. Bisher entschied sie es an `darf_verteilen` -- einer Auskunft ueber die PERSON. Loeschen haengt aber an der AUFGABE: Die @@ -1121,6 +1127,40 @@ aufgabenRouter.patch("/workspace/api/aufgaben/:id", gleicheHerkunft, (req, res) const { aus, fehler } = pruefeFelder(req.body || {}, { neu: false, person: req.person }); if (fehler.length) return res.status(400).json({ fehler: fehler.join(" ") }); + /* ==== EINE DAUERHAFTE AUFGABE WIRD NICHT ABGEHAKT ============== + (02.10.2026 — und der Anlass ist zur Haelfte meiner) + + VanVan im Support, Meldung #6: „Der Modi kann die dauerhafte + Aufgabe immer noch auf erledigt setzen." + + Die Sperre gab es seit dem 30.09. — aber nur in `/mein-stand`. + Der Statusweg kannte `dauerhaft` ueberhaupt nicht. Wer die + Aufgabe ohnehin aendern durfte (etwa weil das Uebernehmen aus + dem Pool ihn verantwortlich macht), hakte sie damit einfach ab. + + UND ICH HABE DAS LOCH HEUTE VERBREITERT: Seit die Modi den + Status setzen darf, stand ihr dieser Weg offen, der ihr in + `/mein-stand` ausdruecklich verwehrt ist. Zwei Tueren, eine + Regel — und die Regel hing nur an einer. + + „Neue begruessen" ist nicht fertig, wenn man es einmal gemacht + hat. Sie ist keine Aufgabe, die man abarbeitet, sondern eine, + die man TUT. + + BEENDET WIRD SIE VON DER LEITUNG. Das stand schon im Kommentar + in `/mein-stand` — jetzt stimmt es auch hier. Wer verteilen + darf, darf auch beenden; eine Pflicht, die niemand mehr beenden + kann, waere eine Falle statt einer Regel. + + DERSELBE FEHLERCODE wie in `/mein-stand` (`dauerhafte_aufgabe`): + Die Oberflaeche uebersetzt ihn schon. Ein zweiter Code fuer + dieselbe Sache waere der, den beim naechsten Mal jemand + uebersetzt und der andere nicht. */ + if (aus.status === "erledigt" && aufgabe.dauerhaft + && !darfAufgabenVerteilen(req.person)) { + return res.status(409).json({ fehler: "dauerhafte_aufgabe" }); + } + /* Zuordnungen darf nur das Management verschieben. */ if (!istLeitung(req.person)) { delete aus.creator_id; delete aus.verantwortlich_id; } diff --git a/workspace/anruf-probe.html b/workspace/anruf-probe.html index 11069850..b6c99030 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`. --> - - + + - +