Ketten mit Vorgeschichte: unterstes Glied ist nicht immer ein Kauf

Ein Spieler mit drei Paketen und drei Plaetzen stand bei "-1 von 3". Der
dritte Platz kam aus einem fremden Gruppen-CC: beigetreten mit einem
CC-Guthaben, spaeter per Redesign ausgestiegen und als eigener CC
weitergefuehrt. Damit beginnt zwar eine neue Kette, aber kein neuer Platz -
bezahlt ist er laengst, naemlich mit dem Beitritt.

Die Automatik sah nur "unterstes Glied" und buchte es auf CC-Paket um. Der
Platz stand damit zweimal im Konto, einmal fuer den Beitritt und einmal fuer
den eigenen CC. Jetzt zaehlt, ob der Kette etwas vorausging: Zeigt ihr erstes
Glied auf einen Vorgaenger ausserhalb, ist auch dieses Glied ein Redesign.

Dabei fiel ein zweiter Fehler auf: Das Neuverketten loeschte genau diesen
Verweis, weil es die Verkettung innerhalb der Linie normalisierte. Damit ging
die einzige Spur zur Herkunft verloren - und mit ihr der Eintrag "war dabei"
am Fuss der Kette. Ein Vorgaenger ausserhalb bleibt jetzt stehen.

Fuer die Korrektur bereits falsch gebuchter Eintraege kann "Bezahlart" jetzt
auch zwischen CC-Paket und Redesign wechseln, nicht nur zwischen bezahlt und
Kulanz. Der Knopf steht an jedem Eintrag, nicht nur an Redesigns.
This commit is contained in:
2026-09-21 19:07:29 +02:00
parent f7b48a9891
commit 1b643cb758
6 changed files with 180 additions and 56 deletions
+7 -6
View File
@@ -24,7 +24,7 @@ import {
removeLink,
moveInChain,
detachFromChain,
changeRedesignKind,
changeFunding,
addMemberToChain,
} from '../services/characters.js';
import { parseThreadId } from '../lib/forum.js';
@@ -183,18 +183,19 @@ export async function characterRoutes(app: FastifyInstance): Promise<void> {
});
/**
* Nachträglich umstellen, woraus ein Redesign bezahlt wurde. Umgebucht
* wird im Kontobuch, nicht überschrieben.
* Nachträglich umstellen, woraus ein CC bezahlt wurde - aus einem Paket,
* einem bezahlten Redesign oder aus Kulanz. Umgebucht wird im Kontobuch,
* nicht überschrieben.
*/
app.post('/api/characters/:id/redesign-kind', { preHandler: requireEditor }, async (request) => {
app.post('/api/characters/:id/funding', { preHandler: requireEditor }, async (request) => {
const { id } = parseWith(idParam, request.params);
const body = parseWith(
z.object({
useKind: z.enum([CreditKind.REDESIGN_PAID, CreditKind.REDESIGN_KULANZ]),
useKind: z.enum([CreditKind.CC, CreditKind.REDESIGN_PAID, CreditKind.REDESIGN_KULANZ]),
}),
request.body,
);
return changeRedesignKind(id, body.useKind, contextOf(request));
return changeFunding(id, body.useKind, contextOf(request));
});
// --- Ketten ---