Support: der Melder hat das letzte Wort -- und die Kachel bekommt ihren eigenen Stil

Filipe: "ich will dass die leute die mir was geschickt haben im support,
auch meine notiz bekommen wenn ich fertig bin. damit die bescheid wissen
und dan anklicken koennen, es funktioniert, oder noch nicht. und erst
wenn es funktioniert gedrueckt wird, will ich dass alles richtig fertig
ist. perfektionier den ganzen weg und mit dem gedanken das manchmal
sachen mehrmal nicht sofort perfekt sein werden."

DER GANZE WEG, nicht nur der Schlusspunkt:

1. Die Leitung drueckt "Behoben - nachfragen ...". Der Knopf hiess
   vorher "Erledigt ..." und tat auch das; jetzt stellt er eine Frage,
   also heisst er auch so. Eine Beschriftung, die etwas anderes sagt
   als der Knopf tut, glaubt man genau einmal.

2. Die Meldung steht auf "wartet" -- ein vierter Stand zwischen "wird
   bearbeitet" und "erledigt". Beim Melder heisst er "geht es wieder?",
   weil er aus SEINER Sicht keine Wartezeit ist, sondern eine Frage.

3. Er sieht die Notiz und zwei Knoepfe. "Geht wieder" ohne Rueckfrage
   (der haeufige, harmlose Fall). "Noch nicht" verlangt ein Wort --
   sonst faengt die Suche von vorn an und die naechste Runde waere
   dieselbe wie die letzte.

4. "Noch nicht" ist keine Beschwerde, sondern Runde 2: zurueck in
   Arbeit, Rundenzahl plus eins, Leitung bekommt eine Nachricht, und
   der Verlauf behaelt, was beim letzten Mal versucht wurde. Niemand
   faengt von vorn an -- genau der Fall, den Filipe genannt hat.

5. Erst sein "Geht wieder" schliesst die Meldung. Danach kann weder er
   noch die Leitung sie wieder aufmachen (409).

NUR DER MELDER darf bestaetigen, ausdruecklich nicht die Leitung
(`person_id !== req.person.id`, nicht "ist Leitung") -- sonst nickt sie
ihre eigene Arbeit ab und der ganze Umweg waere Zierde. Eine fremde
Meldung gibt 404, nicht 403: Wer sie nicht sehen darf, soll auch nicht
erfahren, dass es sie gibt.

DER VERLAUF STEHT UNTEREINANDER statt nur der letzten Antwort. Bei
Runde drei war sonst nicht mehr zu sehen, was beim ersten Mal versucht
wurde, und genau das loest einen wiederkehrenden Fehler. Meldungen von
vor diesem Umbau haben keinen Verlauf -- die zeigen wie bisher ihre
blosse Antwort, ein leerer Kasten waere schlechter als der alte Satz.

DIE KACHEL SIEHT ANDERS AUS (zweiter Wunsch: "viel geiler viel
profissioneller ... die hauptfarbe soll babyblau sein mit bissl lila").
`support-seite` traegt den Stil; alle Regeln haengen daran und gelten
damit nur hier. Zwei weiche Lichter, Pillen statt Kaesten als Filter,
eine leuchtende Naht ueber dem Meldefeld. Augenschonend: gedeckt, kein
Neon, Kontrast geprueft.

GEMESSEN:
- pruef-support: 45 -> 58 Pruefungen, 0 Fehler. Der ganze Weg einmal
  durch, MIT einer Runde, die schiefgeht. Dazu drei Gegenproben: die
  Leitung kann nicht fuer den Melder bestaetigen (404), "noch nicht"
  ohne Wort wird abgelehnt (400), eine geschlossene Meldung bleibt zu
  (409, aus beiden Richtungen).
- Die Schemaaenderung auf einer KOPIE der echten Datenbank
  durchgespielt: 72 Tabellen, keine Zeile und keine Spalte verloren,
  support_runden und `runde` da, 'wartet' in der CHECK-Regel.
- pruef-css-klassen, pruef-deutsche-texte, pruef-code, pruef-glocke:
  alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-25 04:55:14 +02:00
co-authored by Claude Opus 5
parent 939aa6371b
commit cebdd88e8d
47 changed files with 1377 additions and 661 deletions
+107 -13
View File
@@ -414,20 +414,114 @@ melde("\n=== Sich kuemmern ===");
});
ok(zu.status === 200, `mit Satz geht es (${zu.status})`);
/* ERLEDIGT IST ERLEDIGT -- auch fuer die Leitung. */
const nochmal = await hol("admin", `/workspace/api/support/${meldungMitBild}`, {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: "in_arbeit", antwort: "doch nicht" }),
});
ok(nochmal.status === 409,
`eine erledigte Meldung wird nicht wieder geoeffnet (${nochmal.status})`);
/* =====================================================================
DER MELDER HAT DAS LETZTE WORT (25.09.2026)
=====================================================================
/* Und der Melder sieht die Antwort. */
const beimMelder = await (await hol("modi", "/workspace/api/support")).json();
const meine = beimMelder.meldungen.find((m) => m.id === meldungMitBild);
ok(meine?.stand === "erledigt" && /Behoben/.test(meine?.antwort || ""),
"der Melder sieht Stand und Antwort");
Filipe: „ich will dass die leute die mir was geschickt haben im
support, auch meine notiz bekommen wenn ich fertig bin. damit die
bescheid wissen und dan anklicken koennen, es funktioniert, oder
noch nicht. und erst wenn es funktioniert gedrueckt wird, will ich
dass alles richtig fertig ist. perfektionier den ganzen weg und
mit dem gedanken das manchmal sachen mehrmal nicht sofort perfekt
sein werden."
HIER STAND, dass „erledigt" die Meldung zumacht und der Melder
danach Stand und Antwort sieht. Das war richtig -- und ist es seit
heute nicht mehr: „erledigt" schickt sie ZUERST an den Melder.
Erst sein Druck schliesst.
GEMESSEN WIRD DER GANZE WEG, einmal durch, mit einer Runde, die
schiefgeht -- genau der Fall, den Filipe ausdruecklich genannt
hat („manchmal ... nicht sofort perfekt"). Eine Pruefung, die nur
den glatten Weg kennt, misst die Haelfte.
===================================================================== */
const standVon = async (wer, id) => {
const d = await (await hol(wer, "/workspace/api/support")).json();
return (d.meldungen || []).find((m) => m.id === id) || null;
};
{
/* ---- Runde 1: die Leitung sagt „behoben" ---------------------- */
const nach1 = await standVon("modi", meldungMitBild);
ok(nach1?.stand === "wartet",
`„erledigt" schickt die Meldung zuerst an den Melder (${nach1?.stand})`);
ok(/Behoben/.test(nach1?.antwort || "") && nach1?.darf_bestaetigen === true,
`er sieht die Notiz und darf bestaetigen (${nach1?.darf_bestaetigen})`);
ok((nach1?.verlauf || []).length === 1 && nach1.verlauf[0].nr === 1,
`und der Verlauf hat Runde 1 (${(nach1?.verlauf || []).length})`);
/* GEGENPROBE: Die Leitung darf NICHT fuer ihn bestaetigen. Ohne
diese Zeile koennte sie ihre eigene Arbeit abnicken, und der
ganze Umweg waere Zierde. */
const fremd = await hol("hand", `/workspace/api/support/${meldungMitBild}/rueckmeldung`, {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ geht: true }),
});
ok(fremd.status === 404,
`Gegenprobe: die Leitung bestaetigt nicht fuer den Melder (${fremd.status})`);
/* ---- „Noch nicht" -- und ohne Wort geht das nicht ------------- */
const ohneWort = await hol("modi", `/workspace/api/support/${meldungMitBild}/rueckmeldung`, {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ geht: false }),
});
ok(ohneWort.status === 400,
`„noch nicht" ohne Wort wird abgelehnt (${ohneWort.status})`);
const zurueck = await hol("modi", `/workspace/api/support/${meldungMitBild}/rueckmeldung`, {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ geht: false, text: "Die Farbe ja, das Datum nicht." }),
});
ok(zurueck.status === 200, `mit Wort geht es zurueck (${zurueck.status})`);
const nach2 = await standVon("hand", meldungMitBild);
ok(nach2?.stand === "in_arbeit" && nach2?.runde === 2,
`die Meldung ist wieder in Arbeit, Runde 2 (${nach2?.stand}, ${nach2?.runde})`);
ok((nach2?.verlauf || [])[0]?.urteil === "nicht"
&& /Datum/.test((nach2?.verlauf || [])[0]?.urteil_text || ""),
`und Runde 1 traegt sein Urteil (${(nach2?.verlauf || [])[0]?.urteil})`);
/* ---- Runde 2: diesmal klappt es ------------------------------- */
const zu2 = await hol("hand", `/workspace/api/support/${meldungMitBild}`, {
method: "PATCH", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: "erledigt", antwort: "Das Datum stimmt jetzt auch." }),
});
ok(zu2.status === 200, `die Leitung antwortet ein zweites Mal (${zu2.status})`);
const bestaetigt = await hol("modi", `/workspace/api/support/${meldungMitBild}/rueckmeldung`, {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ geht: true }),
});
ok(bestaetigt.status === 200, `der Melder bestaetigt (${bestaetigt.status})`);
const ende = await standVon("modi", meldungMitBild);
ok(ende?.stand === "erledigt",
`ERST JETZT ist die Meldung erledigt (${ende?.stand})`);
ok((ende?.verlauf || []).length === 2,
`und der ganze Weg steht da -- beide Runden (${(ende?.verlauf || []).length})`);
ok((ende?.verlauf || [])[1]?.urteil === "geht",
` mit „geht" an der letzten (${(ende?.verlauf || [])[1]?.urteil})`);
/* ERLEDIGT IST ERLEDIGT -- auch fuer die Leitung. */
const nochmal = await hol("admin", `/workspace/api/support/${meldungMitBild}`, {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ stand: "in_arbeit", antwort: "doch nicht" }),
});
ok(nochmal.status === 409,
`eine erledigte Meldung wird nicht wieder geoeffnet (${nochmal.status})`);
/* UND AUCH DER MELDER KANN NICHT NOCHMAL. Ohne diese Zeile liesse
sich eine geschlossene Sache durch ein zweites „noch nicht"
wieder aufmachen -- „zugemacht" waere dann eine Meinung. */
const nochmal2 = await hol("modi", `/workspace/api/support/${meldungMitBild}/rueckmeldung`, {
method: "POST", headers: { "Content-Type": "application/json" },
body: JSON.stringify({ geht: false, text: "doch nicht" }),
});
ok(nochmal2.status === 409,
` und der Melder kann sie auch nicht wieder aufmachen (${nochmal2.status})`);
}
}
/* =====================================================================