Jedes Glied einer Liste kostet, auch in einem Gruppen-CC

Bisher zahlte nur, wer neu einstieg: wer in einer Kette mitgezogen
wurde oder einen Gruppen-CC mitbenutzte, stand darin ohne eigene
Buchung. Damit ging die Rechnung nicht auf - verbrauchte Redesigns sind
alle Glieder aller Listen minus die Anzahl der Listen, und das gilt fuer
jeden Nutzer einzeln.

Jetzt bucht jedes Glied: das unterste einen Platz, jedes weitere ein
Redesign. Wo eine Buchung fehlt, traegt der Abgleich sie nach, und das
Redesign eines Gruppen-CCs kostet jeden Nutzer sein eigenes.

Am Pfeil stehen alle offenen Buchungen eines Eintrags, nicht nur die
juengste - sonst bleibt eine zweite unsichtbar.
This commit is contained in:
2026-09-22 13:01:52 +02:00
parent fee4a4f73a
commit 367f1aace4
5 changed files with 613 additions and 305 deletions
+23 -8
View File
@@ -716,8 +716,9 @@ describe('Die Stelle in der Kette bestimmt, was ein Eintrag kostet', () => {
);
});
it('lässt einen Eintrag ohne Buchung in Ruhe', async () => {
// Nacherfassung ohne Guthaben-Angabe - da gibt es nichts umzustellen.
it('trägt eine fehlende Buchung nach', async () => {
// Jedes Glied einer Liste kostet: das unterste ein Paket, jedes weitere
// ein Redesign. Wo nichts gebucht ist, fehlt es in der Rechnung.
const spieler = await spielerMitPaketen('Ohne Buchung', 1);
const eins = await characters.createCharacter(spieler, { name: 'Mit Buchung' }, ctx);
@@ -735,7 +736,19 @@ describe('Die Stelle in der Kette bestimmt, was ein Eintrag kostet', () => {
ctx,
);
assert.deepEqual(await credits.getBalances(spieler), vorher, 'nichts gebucht, nichts geändert');
const danach = await credits.getBalances(spieler);
assert.equal(danach.CC, vorher.CC, 'der Platz bleibt, wie er war');
assert.equal(
danach.REDESIGN_PAID,
vorher.REDESIGN_PAID - 1,
'das zweite Glied kostet ein Redesign',
);
// Und allein gestellt kostet er wieder einen eigenen Platz.
await characters.detachFromChain(ohne.id, ctx);
const allein = await credits.getBalances(spieler);
assert.equal(allein.CC, vorher.CC - 1, 'eine eigene Liste, ein eigenes Paket');
assert.equal(allein.REDESIGN_PAID, vorher.REDESIGN_PAID, 'das Redesign ist wieder frei');
});
});
@@ -1345,11 +1358,13 @@ describe('Die Umstellung auf Listen je Nutzer', () => {
);
}
assert.equal(
await characters.richteBuchungenAus(),
0,
'und die Buchungen passen danach zu den Listen',
);
for (const wer of [wirt, gast]) {
assert.equal(
(await characters.rebuildFunding(wer, ctx)).umgebucht,
0,
'und die Buchungen passen danach zu den Listen',
);
}
// Der Gast zahlt für seinen Einstieg ein Redesign, nicht einen Platz.
assert.equal(