CC-Guthaben wird vorher umgewandelt, nicht am CC eingesetzt
Ein Redesign wird nie aus dem CC-Topf bezahlt. Wer sein Guthaben dafuer einsetzen will, tauscht es oben um und setzt es danach ein wie jedes andere Redesign. Damit faellt die Wahl CC-Guthaben an den CC-Aktionen weg; was ein Eintrag kostet, entscheidet seine Stelle in der Liste. Die Bezahlart gilt jetzt je Nutzer: bei einem Gruppen-CC hat jeder seine eigene Buchung, und umstellen liess sich bisher nur die des Erstellers. Die Guthaben-Historie laesst sich nach Topf filtern.
This commit is contained in:
+65
-56
@@ -1067,72 +1067,81 @@ describe('Ein CC-Guthaben für ein Redesign einsetzen', () => {
|
||||
return buchung?.kind;
|
||||
}
|
||||
|
||||
it('wandelt es um, statt eine Ausnahme zu buchen', async () => {
|
||||
const spieler = await spielerMitPaketen('Ausnahmefall', 2);
|
||||
it('geht nur über eine Umwandlung, nicht direkt am CC', async () => {
|
||||
const spieler = await spielerMitPaketen('Direktzahler', 2);
|
||||
const eins = await characters.createCharacter(spieler, { name: 'Basis' }, ctx);
|
||||
|
||||
const vorher = await credits.getBalances(spieler);
|
||||
const zwei = await characters.redesignCharacter(
|
||||
eins.character.id,
|
||||
{ name: 'Aus dem CC-Topf', useKind: 'CC' },
|
||||
ctx,
|
||||
await assert.rejects(
|
||||
() =>
|
||||
characters.redesignCharacter(eins.character.id, { name: 'Zweites', useKind: 'CC' }, ctx),
|
||||
(error: Error & { code?: string }) => error.code === 'CONVERT_FIRST',
|
||||
'ein Redesign wird nicht aus dem CC-Topf bezahlt',
|
||||
);
|
||||
});
|
||||
|
||||
assert.equal(zwei.balances.CC, vorher.CC - 1, 'der Platz ist weg');
|
||||
it('tauscht einen Platz gegen ein bezahltes Redesign', async () => {
|
||||
const spieler = await spielerMitPaketen('Umwandler', 2);
|
||||
const vorher = await credits.getBalances(spieler);
|
||||
|
||||
const danach = await credits.convertCcToRedesign(spieler, ctx);
|
||||
|
||||
assert.equal(danach.balances.CC, vorher.CC - 1, 'ein Platz weniger');
|
||||
assert.equal(danach.balances.REDESIGN_PAID, vorher.REDESIGN_PAID + 1, 'ein Redesign mehr');
|
||||
assert.equal(
|
||||
zwei.balances.REDESIGN_PAID,
|
||||
vorher.REDESIGN_PAID,
|
||||
'das eingetauschte Redesign wird sofort wieder verbraucht',
|
||||
danach.balances.granted.CC,
|
||||
vorher.granted.CC,
|
||||
'gekauft wurde deswegen nicht weniger - der Platz ist verbraucht',
|
||||
);
|
||||
assert.equal(
|
||||
await verbrauchtAls(zwei.character.id),
|
||||
'REDESIGN_PAID',
|
||||
'der Eintrag selbst ist ein Redesign wie jedes andere',
|
||||
);
|
||||
assert.equal(
|
||||
zwei.balances.granted.REDESIGN_PAID,
|
||||
danach.balances.granted.REDESIGN_PAID,
|
||||
vorher.granted.REDESIGN_PAID + 1,
|
||||
'und das umgewandelte Guthaben ist als erhalten ausgewiesen',
|
||||
'und das eingetauschte Redesign ist erhalten worden',
|
||||
);
|
||||
assert.equal(zwei.balances.granted.CC, vorher.granted.CC, 'die Käufe bleiben, wie sie waren');
|
||||
});
|
||||
|
||||
it('bleibt beim Ausrichten an den Ketten stehen', async () => {
|
||||
const spieler = await spielerMitPaketen('Bleibt so', 2);
|
||||
const eins = await characters.createCharacter(spieler, { name: 'Erstes' }, ctx);
|
||||
it('setzt das umgewandelte Redesign ein wie jedes andere', async () => {
|
||||
const spieler = await spielerMitPaketen('Einsetzer', 2);
|
||||
const eins = await characters.createCharacter(spieler, { name: 'Erster' }, ctx);
|
||||
|
||||
// Beide Redesigns aus den Paketen erst verbrauchen.
|
||||
const zwei = await characters.redesignCharacter(
|
||||
eins.character.id,
|
||||
{ name: 'Zweites', useKind: 'CC' },
|
||||
{ name: 'Zweiter', useKind: 'REDESIGN_PAID' },
|
||||
ctx,
|
||||
);
|
||||
const drei = await characters.redesignCharacter(
|
||||
zwei.character.id,
|
||||
{ name: 'Dritter', useKind: 'REDESIGN_PAID' },
|
||||
ctx,
|
||||
);
|
||||
assert.equal((await credits.getBalances(spieler)).REDESIGN_PAID, 0);
|
||||
|
||||
await credits.convertCcToRedesign(spieler, ctx);
|
||||
const vier = await characters.redesignCharacter(
|
||||
drei.character.id,
|
||||
{ name: 'Vierter', useKind: 'REDESIGN_PAID' },
|
||||
ctx,
|
||||
);
|
||||
|
||||
const vorher = await credits.getBalances(spieler);
|
||||
const lauf = await characters.rebuildFunding(spieler, ctx);
|
||||
|
||||
assert.equal(lauf.umgebucht, 0, 'es passt bereits alles');
|
||||
assert.equal(await verbrauchtAls(zwei.character.id), 'REDESIGN_PAID');
|
||||
assert.deepEqual(lauf.balances, vorher, 'und am Guthaben ändert sich nichts');
|
||||
});
|
||||
|
||||
it('gibt den Tausch zurück, wenn der Eintrag wieder allein steht', async () => {
|
||||
const spieler = await spielerMitPaketen('Rueckzieher', 2);
|
||||
const eins = await characters.createCharacter(spieler, { name: 'A' }, ctx);
|
||||
const zwei = await characters.redesignCharacter(
|
||||
eins.character.id,
|
||||
{ name: 'B', useKind: 'CC' },
|
||||
ctx,
|
||||
);
|
||||
|
||||
await characters.detachFromChain(zwei.character.id, ctx);
|
||||
|
||||
assert.equal(await verbrauchtAls(zwei.character.id), 'CC', 'allein steht er für sich');
|
||||
assert.equal(await verbrauchtAls(vier.character.id), 'REDESIGN_PAID');
|
||||
const stand = await credits.getBalances(spieler);
|
||||
assert.equal(stand.CC, 0, 'beide Plätze sind belegt');
|
||||
assert.equal(stand.REDESIGN_PAID, 2, 'die Redesigns sind wieder frei');
|
||||
assert.equal(stand.REDESIGN_PAID, 0, 'das umgewandelte ist aufgebraucht');
|
||||
assert.equal(stand.CC, 0, 'und der Platz dafür weg');
|
||||
});
|
||||
|
||||
it('lässt sich auch nachträglich einsetzen', async () => {
|
||||
const spieler = await spielerMitPaketen('Von Hand', 2);
|
||||
it('lässt sich zurücknehmen wie jede andere Handeingabe', async () => {
|
||||
const spieler = await spielerMitPaketen('Reumuetig', 1);
|
||||
const vorher = await credits.getBalances(spieler);
|
||||
|
||||
await credits.convertCcToRedesign(spieler, ctx);
|
||||
const danach = await credits.removeLastGrant(spieler, 'CONVERSION', ctx);
|
||||
|
||||
assert.equal(danach.balances.CC, vorher.CC, 'der Platz ist wieder da');
|
||||
assert.equal(danach.balances.REDESIGN_PAID, vorher.REDESIGN_PAID, 'das Redesign wieder weg');
|
||||
});
|
||||
|
||||
it('lässt die Bezahlart eines Redesigns nicht auf den CC-Topf stellen', async () => {
|
||||
const spieler = await spielerMitPaketen('Umsteller zwei', 1);
|
||||
const eins = await characters.createCharacter(spieler, { name: 'A' }, ctx);
|
||||
const zwei = await characters.redesignCharacter(
|
||||
eins.character.id,
|
||||
@@ -1140,16 +1149,16 @@ describe('Ein CC-Guthaben für ein Redesign einsetzen', () => {
|
||||
ctx,
|
||||
);
|
||||
|
||||
const danach = await characters.changeFunding(zwei.character.id, 'CC', ctx);
|
||||
await assert.rejects(
|
||||
() => characters.changeFunding(zwei.character.id, 'CC', ctx),
|
||||
(error: Error & { code?: string }) => error.code === 'CONVERT_FIRST',
|
||||
);
|
||||
|
||||
assert.equal(await verbrauchtAls(zwei.character.id), 'REDESIGN_PAID');
|
||||
assert.equal(danach.balances.CC, 0, 'der Platz ist eingetauscht');
|
||||
assert.equal(danach.balances.REDESIGN_PAID, 2, 'das Redesign dafür wieder frei');
|
||||
|
||||
// Und zurück: der Tausch wird rückgängig gemacht.
|
||||
const zurueck = await characters.changeFunding(zwei.character.id, 'REDESIGN_PAID', ctx);
|
||||
assert.equal(zurueck.balances.CC, 1, 'der Platz kommt zurück');
|
||||
assert.equal(zurueck.balances.REDESIGN_PAID, 1, 'und das Redesign wird wieder verbraucht');
|
||||
// Zwischen bezahlt und Kulanz bleibt die Wahl.
|
||||
await credits.bookKulanz(spieler, ctx);
|
||||
const umgestellt = await characters.changeFunding(zwei.character.id, 'REDESIGN_KULANZ', ctx);
|
||||
assert.equal(await verbrauchtAls(zwei.character.id), 'REDESIGN_KULANZ');
|
||||
assert.equal(umgestellt.balances.REDESIGN_KULANZ, 0, 'die Kulanz ist verbraucht');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user