Eine dauerhafte Aufgabe wird nicht abgehakt -- auch nicht ueber den Status

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 AN EINER TUER.

`/mein-stand` lehnt „erledigt" bei einer dauerhaften Aufgabe seither
ab. Der STATUSWEG (`PATCH /workspace/api/aufgaben/:id`) 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. Zwei Tueren, eine Regel, und die Regel
hing nur an einer.

UND ICH HABE DAS LOCH HEUTE FRUEH VERBREITERT. Mit dem Commit davor
darf eine Modi den Status ihrer Aufgabe setzen (damit VanVans Satz
„es gibt darüber ja den button starten" fuer sie ueberhaupt stimmt).
Damit stand ihr genau der Weg offen, der ihr an der anderen Tuer
ausdruecklich verwehrt ist. Gefunden habe ich es nicht beim Bauen,
sondern beim Lesen der offenen Supportmeldungen -- ihr Satz stand seit
dem 28.09. da und passte ploetzlich auf meine eigene Aenderung.

GEAENDERT

 1. Der Statusweg lehnt „erledigt" bei einer dauerhaften Aufgabe ab,
    wenn die Person nicht verteilen darf. DERSELBE Fehlercode wie in
    `/mein-stand` (`dauerhafte_aufgabe`) -- die Oberflaeche uebersetzt
    ihn schon, und ein zweiter Code fuer dieselbe Sache waere der, den
    beim naechsten Mal jemand uebersetzt und der andere nicht.

 2. Der Knopf faellt weg, der die Absage holen wuerde (`darf_beenden`
    vom Server). Dieselbe Ueberlegung wie bei „Fertig" auf der
    Zuteilungskarte, die seit dem 30.09. daneben steht: Ein Knopf, der
    eine Absage holt, ist schlimmer als keiner.

    NUR DER LETZTE SCHRITT faellt weg. „starten" und „zur Freigabe"
    bleiben -- auch eine stehende Aufgabe hat einen Anfang, und der
    Unterschied zwischen „offen" und „in Arbeit" sagt etwas.

 3. BEENDET WIRD SIE VON DER LEITUNG. Das stand seit dem 30.09. als
    Satz im Kommentar von `/mein-stand`; jetzt stimmt er auch.

GEPRUEFT -- UND ZWAR BEIDE TUEREN, sonst wandert der Fehler nur:

    eine dauerhafte Aufgabe (#3)
    Tuer 1 (mein-stand) ist zu (409 dauerhafte_aufgabe)
    Tuer 2 (Status) jetzt auch (409 dauerhafte_aufgabe)
      anfangen darf sie trotzdem (200)
      und die Leitung beendet sie (200)
    und die Oberflaeche erfaehrt es (darf_beenden false)

Die dritte Zeile ist die Gegenprobe gegen zu viel Sperre: „gesperrt"
darf nicht heissen, dass gar nichts mehr geht.

GEPRUEFT: pruef-zuteilung 90 -> 96 ok · pruef-bewerbung-aufgaben 164 ·
pruef-aufgabenbrett 49 · pruef-aufgaben-vorlagen 46 · pruef-struktur 102.

WAS AUS DERSELBEN MELDUNG NOCH OFFEN IST (VanVan, #6): Bei den
VORLAGEN laesst sich weder die Frist anpassen noch „dauerhaft"
einstellen, und eine Anmerkung fehlt auch. Das ist ein eigener Umbau
und steht hier nur, damit es nicht untergeht.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-10-02 19:26:55 +02:00
co-authored by Claude Opus 5
parent 2fb92f86f3
commit 3ab69d36a5
49 changed files with 795 additions and 685 deletions
+54
View File
@@ -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
+40
View File
@@ -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; }