From c5f1d9545c57ef7725e8c880a4ea96cdf1a802ab Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 22:40:53 +0000 Subject: [PATCH] Kundenansicht neu E-Fix F1 (Nachkorrektur): Wechsel nennt "mit 1 Paket" / "mit 2 Paketen" Zusatzspeicher (Dativ) Co-Authored-By: Claude Sonnet 5.5 --- public/neu/ansicht-wechsel.js | 5 +++-- test/knAnsichtWechsel.test.js | 14 +++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/public/neu/ansicht-wechsel.js b/public/neu/ansicht-wechsel.js index 0be250a..752fab7 100644 --- a/public/neu/ansicht-wechsel.js +++ b/public/neu/ansicht-wechsel.js @@ -77,7 +77,8 @@ export async function zeigeWechsel(wurzel, { route, me, nav, daten } = {}) { const lauf = { busy: false, preview: null, error: '', loading: true, token: 0, early: false, fehler: '', fehlerKlasse: null, zeichne: null } aktiv = lauf - const paketText = `${units} Paket${units === 1 ? '' : 'e'}` + const paketText = `${units} Paket${units === 1 ? '' : 'e'}` // Nominativ: „2 Pakete bleiben gebucht“ + const paketMit = `${units} Paket${units === 1 ? '' : 'en'}` // Dativ nach „mit“: „mit 1 Paket“, „mit 2 Paketen“ const speicherGb = units * (Number(mail.gbPerUnit) || 0) /** @@ -91,7 +92,7 @@ export async function zeigeWechsel(wurzel, { route, me, nav, daten } = {}) { return [ { label: 'Leistung', text: 'Wartungs-Abo statt Hosting-Abo', link: { text: 'Leistungen ansehen', href: leistungLink(T.wechsel.linkzeile, 'wartung') } }, { label: 'Preis', text: units > 0 - ? `${fmtEuro((monthly + units * unitCents) / 100)} pro Monat mit ${paketText} Zusatzspeicher (+${speicherGb} GB) (Gesamtpreis, ${UST})` + ? `${fmtEuro((monthly + units * unitCents) / 100)} pro Monat mit ${paketMit} Zusatzspeicher (+${speicherGb} GB) (Gesamtpreis, ${UST})` : `${fmtEuro(monthly / 100)} pro Monat (Gesamtpreis, ${UST})` }, { label: 'Fällig', text: `heute ${fmtEuro(p.amountDueCents / 100)}${gutschrift}; danach ab ${fmtDatum(p.nextChargeAt)}${tag ? ` jeweils am ${tag.t}.` : ''}` }, { label: 'Laufzeit', text: `Mindestlaufzeit bis ${fmtDatum(p.minTermEnd)} (12 Monate), danach monatlich kündbar` }, diff --git a/test/knAnsichtWechsel.test.js b/test/knAnsichtWechsel.test.js index 0f0a798..f267847 100644 --- a/test/knAnsichtWechsel.test.js +++ b/test/knAnsichtWechsel.test.js @@ -34,7 +34,7 @@ test('Betrieb: Block, Linkzeile, Knopf, kein Häkchen, Knopf nach der Vorschau f assert.deepEqual(zeilen.map(([l]) => l), ['Leistung', 'Preis', 'Fällig', 'Laufzeit', 'Beginn']) assert.deepEqual(zeilen[0], ['Leistung', 'Wartungs-Abo statt Hosting-Abo · Leistungen ansehen']) assert.equal(fx.finde(fx.finde(w, '#switch-block'), 'a').getAttribute('href'), `${TERMS_URL}#wartung`) - assert.ok(zeilen[1][1].includes('2 Pakete Zusatzspeicher (+10 GB)') && zeilen[1][1].includes('gemäß § 19 UStG ohne Umsatzsteuer'), zeilen[1][1]) + assert.ok(zeilen[1][1].includes('mit 2 Paketen Zusatzspeicher (+10 GB)') && zeilen[1][1].includes('gemäß § 19 UStG ohne Umsatzsteuer'), zeilen[1][1]) assert.ok(zeilen[2][1].startsWith('heute 30,00') && zeilen[2][1].includes('Gutschrift von 15,00') && zeilen[2][1].includes('ab 16.11.2026'), zeilen[2][1]) assert.equal(zeilen[3][1], 'Mindestlaufzeit bis 16.10.2027 (12 Monate), danach monatlich kündbar') assert.ok(zeilen[4][1].startsWith('sofort mit der Zahlung')) @@ -54,6 +54,18 @@ test('Betrieb: Block, Linkzeile, Knopf, kein Häkchen, Knopf nach der Vorschau f assert.match(fx.text(w), /Dein Wechsel wartet auf die Zahlung\. Wir leiten dich zur Zahlung weiter\./) })) +// E-Fix F1 (Nachkorrektur): nach „mit“ steht der Dativ Plural; „Paket“ im Singular bleibt, „Pakete“ in „… bleiben gebucht“ ist ein Nominativ +test('Preiszeile: „mit 1 Paket“ und „mit 2 Paketen“ Zusatzspeicher (Dativ), die Einzelheiten nennen „1 Paket“ bzw. „2 Pakete“', mit(SRV, async (fx) => { + for (const [einheiten, mitText, einzelText] of [[1, 'mit 1 Paket Zusatzspeicher (+5 GB)', '1 Paket (+5 GB) bleiben gebucht'], [2, 'mit 2 Paketen Zusatzspeicher (+10 GB)', '2 Pakete (+10 GB) bleiben gebucht']]) { + const daten = HOSTING({ subscription: abo({ produkt: 'hosting', canSwitch: true, storage: { units: einheiten, pendingSetup: false, pendingReduction: null } }) }) + const w = await zeige(fx, daten, meMit('unternehmen')) + const preis = fx.text(fx.alle(fx.finde(w, '#switch-block'), '.kn-block-zeile')[1]) + assert.ok(preis.includes(mitText), preis) + assert.ok(!/mit \d+ Pakete /.test(preis), preis) // nie „mit 2 Pakete Zusatzspeicher“ + assert.ok(fx.text(fx.finde(w, '#switch-einzelheiten')).includes(einzelText), einzelText) + } +})) + test('Privat und leer: Knopf gesperrt mit Sperrzeile, nach dem Häkchen frei, Body mit earlyStart true', mit(SRV, async (fx) => { for (const m of [meMit('privat'), meMit('')]) { const w = await zeige(fx, HOSTING(), m)