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
@@ -538,7 +538,7 @@ export default function PlayerDetail() {
onSubmit={(useKind) =>
void run(
() =>
api(`/api/characters/${dialog.character.id}/redesign-kind`, {
api(`/api/characters/${dialog.character.id}/funding`, {
method: 'POST',
body: { useKind },
}),
@@ -1749,7 +1749,7 @@ function ProblemModal({
}
/**
* Stellt um, woraus ein Redesign bezahlt wurde.
* Stellt um, woraus ein CC bezahlt wurde.
*
* Umgebucht wird im Kontobuch: die alte Zeile wird gegengebucht, die neue
* kommt dazu. Überschrieben wird nichts - in der Historie bleibt sichtbar,
@@ -1763,7 +1763,7 @@ function RedesignKindModal({
onSubmit,
}: {
character: Character;
balances: { REDESIGN_PAID: number; REDESIGN_KULANZ: number };
balances: { CC: number; REDESIGN_PAID: number; REDESIGN_KULANZ: number };
busy: boolean;
onClose: () => void;
onSubmit: (useKind: CreditKind) => void;
@@ -1773,14 +1773,15 @@ function RedesignKindModal({
return (
<Modal title={`Bezahlart von "${character.name}"`} onClose={onClose}>
<Notice kind="info">
Ob ein Redesign aus einem gekauften Paket oder aus Kulanz kam, stellt sich manchmal erst
später heraus. Umgebucht wird über eine Gegenbuchung - in der Historie bleibt beides
sichtbar.
Woraus ein CC bezahlt wurde, stellt sich manchmal erst später heraus - etwa wenn eine
Absprache auftaucht oder sich zeigt, dass ein Eintrag gar nicht der Anfang einer Kette
war. Umgebucht wird über eine Gegenbuchung; in der Historie bleibt beides sichtbar.
</Notice>
<div className="radio-group">
{(
[
['CC', 'CC-Paket (eigener Platz)', balances.CC],
['REDESIGN_KULANZ', 'Kulanz-Redesign', balances.REDESIGN_KULANZ],
['REDESIGN_PAID', 'Bezahltes Redesign', balances.REDESIGN_PAID],
] as const