diff --git a/server/pruef-teilnehmer.mjs b/server/pruef-teilnehmer.mjs index 312ef6a4..db3328c5 100644 --- a/server/pruef-teilnehmer.mjs +++ b/server/pruef-teilnehmer.mjs @@ -314,6 +314,46 @@ console.log("\n=== Gegenprobe ==="); }, K.dogi); ok(!(await siehtTermin(K.luna, c.daten?.id)), "einen Termin ganz ohne Teilnehmer sieht nur, wer ihn angelegt hat"); + + /* ================================================================ + AENDERN DARF NUR, WER IHN EINGETRAGEN HAT (07.09.2026) + + Filipe: "jeder der in seinem kalender was eintraegt soll es auch + bearbeiten koennen, nur diese person selber." + + Der Prueffall ist ein Termin MIT einem zweiten Teilnehmer: Der + sieht ihn, darf ihn aber nicht umschreiben. Vorher durfte jeder + aendern, der ihn ueberhaupt sah -- bei einem Termin mit mehreren + Beteiligten also alle. + ================================================================ */ + const meiner = await ruf("POST", "/workspace/api/termine", { + titel: "Lunas eigener Termin", art: "termin", beginn: heute + "T09:15", + /* PAT, nicht Bea. Luna darf nur einladen, wer zu ihr gehoert -- Bea + betreut Nora. Mein erster Aufbau nahm Bea, und die Pruefung + meldete brav 404 statt 403: Bea sah den Termin gar nicht. Der + Fehler lag im Aufbau, nicht im Code -- und die Pruefung hat + genau das richtig gemeldet. */ + teilnehmer: [idPat], + }, K.luna); + ok(meiner.status === 201, `Luna legt einen Termin an (${meiner.status})`); + + const selbst = await ruf("PATCH", `/workspace/api/termine/${meiner.daten?.id}`, + { titel: "Lunas Termin, umbenannt" }, K.luna); + ok(selbst.status === 200, `sie selbst darf ihn umbenennen (${selbst.status})`); + + ok(await siehtTermin(K.pat, meiner.daten?.id), "Pat sieht ihn (er ist eingetragen)"); + const fremd = await ruf("PATCH", `/workspace/api/termine/${meiner.daten?.id}`, + { titel: "von Pat umbenannt" }, K.pat); + ok(fremd.status === 403, + `darf ihn aber nicht umbenennen (${fremd.status})`); + + /* Und die Ausnahme, die es dabei geben MUSS: Ein Haken "erledigt" + ist eine Rueckmeldung zum Termin, keine Aenderung an ihm. Ohne + diese Zeile muesste jeder Beteiligte den Anleger bitten, den + eigenen Call abzuhaken. */ + const haken = await ruf("PATCH", `/workspace/api/termine/${meiner.daten?.id}`, + { erledigt: true }, K.pat); + ok(haken.status === 200, `abhaken darf sie aber (${haken.status})`); ok(await siehtTermin(K.dogi, c.daten?.id), " – der nämlich schon, sonst wäre die Zeile darüber wertlos"); } diff --git a/server/workspace-kalender.js b/server/workspace-kalender.js index 1dc613c2..dffac73a 100644 --- a/server/workspace-kalender.js +++ b/server/workspace-kalender.js @@ -447,6 +447,28 @@ kalenderRouter.patch("/workspace/api/termine/:id", gleicheHerkunft, (req, res) = const termin = db().prepare(`SELECT t.* ${VERBUND} WHERE ${wo} AND t.id = ?`).get(...werte, id); if (!termin) return res.status(404).json({ fehler: "nicht_gefunden" }); + /* AENDERN DARF, WER IHN EINGETRAGEN HAT -- und die Leitung + (07.09.2026). + + Filipe: "jeder der in seinem kalender was eintraegt soll es auch + bearbeiten koennen, nur diese person selber." + + Bis hierher durfte JEDER aendern, der den Termin ueberhaupt sieht. + Seit der Kalender nur noch eigene Termine zeigt, faellt das kaum + auf -- aber ein Termin mit mehreren Teilnehmern sehen eben alle, + und dann haette jeder von ihnen Titel und Uhrzeit verstellen + koennen. Dieselbe Regel wie beim Loeschen ein paar Zeilen + weiter unten; sie stand dort schon richtig. + + AUSNAHME "erledigt": Ein Haken, dass ein Gespraech stattgefunden + hat, ist keine Aenderung am Termin, sondern eine Rueckmeldung + dazu -- die darf jeder Beteiligte setzen. Sonst muesste man den + Anleger bitten, den eigenen Call abzuhaken. */ + const nurErledigt = Object.keys(req.body || {}).every((k) => k === "erledigt"); + if (!nurErledigt && !istLeitung(req.person) && termin.erstellt_von !== req.person.id) { + return res.status(403).json({ fehler: "nicht_erlaubt" }); + } + const { aus, fehler } = pruefe(req.body || {}, { neu: false }); if (fehler.length) return res.status(400).json({ fehler: fehler.join(" ") }); if (!istLeitung(req.person)) { diff --git a/workspace/assets/css/calls.css b/workspace/assets/css/calls.css index bbc75312..3a7ae8f5 100644 --- a/workspace/assets/css/calls.css +++ b/workspace/assets/css/calls.css @@ -420,20 +420,74 @@ /* Der Kopf ist der Schalter --