Kundenansicht neu E-Fix M2: aboModellFuerKunde liest bei Modus off kein Kundendokument

aboModellFuerKunde las das Kundendokument auch bei KUNDENANSICHT_NEU=off, obwohl neueAnsichtFuerKunde dort sofort false liefert. Alt-Kunden
bekamen so eine zusätzliche Lesung und einen neuen Fehlerpfad (ein 503 beim Widerruf des Wechsels ließ die Beenden-Mail der Analyse
entfallen, die Team-Aktivierung und GET /api/admin/analyse/:id antworteten mit 500). Jetzt sofort false im Modus off; Pilot und on
lesen wie bisher (kein Dokument: false). Test in analyseAboModell.test.js (eingeplanter 503 wird im Modus off nicht verbraucht).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 21:41:28 +00:00
1 parent 306c53871d
commit ddaf2879c4
2 files changed
+25 -1

No files matched your search

+4 -1
View File
@@ -2,7 +2,7 @@ import { config } from '../config.js'
import { getDocument } from './appwriteAdmin.js' import { getDocument } from './appwriteAdmin.js'
import { ACTIVE_STATUSES, getCurrentSubscription } from './stripeBilling.js' import { ACTIVE_STATUSES, getCurrentSubscription } from './stripeBilling.js'
import { listContractEvents, openWithdrawals } from './contractEvents.js' import { listContractEvents, openWithdrawals } from './contractEvents.js'
import { neueAnsichtFuerKunde } from './kundenansicht/schalter.js' import { neueAnsichtFuerKunde, neueAnsichtModus } from './kundenansicht/schalter.js'
/** /**
* Abo-Zuordnung der Funktionen (V5, Spec E3/E8): Welches Abo deckt welche Funktion? Ein Lesepfad (lies) fuer alle * Abo-Zuordnung der Funktionen (V5, Spec E3/E8): Welches Abo deckt welche Funktion? Ein Lesepfad (lies) fuer alle
@@ -98,6 +98,9 @@ export async function aboLaeuftFuer(customerId, key) {
*/ */
export async function aboModellFuerKunde(customerId) { export async function aboModellFuerKunde(customerId) {
if (typeof customerId !== 'string' || customerId === '') return false if (typeof customerId !== 'string' || customerId === '') return false
// Modus off: sofort false, ohne das Kundendokument zu lesen (E-Fix M2). Alt-Kunden bekommen so keine zusätzliche Lesung und keinen neuen Fehlerpfad
// (ein transienter Lesefehler liess die Beenden-Mail beim Widerruf des Wechsels und die Team-Aktivierung scheitern).
if (neueAnsichtModus() === 'off') return false
let kunde let kunde
try { try {
kunde = await getDocument(config.collections.customers, customerId) kunde = await getDocument(config.collections.customers, customerId)
+21
View File
@@ -198,3 +198,24 @@ test('Tagesprüfung: Hosting-Analyse bleibt für Kunden der neuen Ansicht, sonst
assert.equal(await aboModellFuerKunde('gibtEsNicht'), false) // kein Kundendokument: kein Abo-Modell assert.equal(await aboModellFuerKunde('gibtEsNicht'), false) // kein Kundendokument: kein Abo-Modell
assert.equal(await aboModellFuerKunde(''), false) assert.equal(await aboModellFuerKunde(''), false)
}) })
test('M2: aboModellFuerKunde liest bei Modus off kein Kundendokument (keine zusätzliche Lesung, kein neuer Fehlerpfad für Alt-Kunden)', async () => {
const vorher = { mode: config.kundenansichtNeu.mode, pilotEmails: [...config.kundenansichtNeu.pilotEmails] }
try {
Object.assign(config.kundenansichtNeu, { mode: 'off', pilotEmails: ['*'] })
// ein transienter Lesefehler (503) trifft im Modus off nie: es wird gar nicht gelesen, die Antwort ist sofort false
aw.failNext({ collection: 'customers', method: 'GET', status: 503 })
assert.equal(await aboModellFuerKunde('c1'), false)
// der eingeplante Fehler ist nicht verbraucht: die erste Lesung im Pilot trifft ihn (Lesefehler werden weitergereicht)
Object.assign(config.kundenansichtNeu, { mode: 'pilot', pilotEmails: ['k@example.invalid'] })
await assert.rejects(() => aboModellFuerKunde('c1'), (err) => err.status === 500 && err.code === 503) // adminFetch macht aus jedem 5xx den Status 500, code bleibt 503
// danach wie bisher: Pilot und on lesen das Kundendokument (kein Dokument: false)
assert.equal(await aboModellFuerKunde('c1'), true)
assert.equal(await aboModellFuerKunde('gibtEsNicht'), false)
Object.assign(config.kundenansichtNeu, { mode: 'on', pilotEmails: [] })
assert.equal(await aboModellFuerKunde('c1'), true)
assert.equal(await aboModellFuerKunde('gibtEsNicht'), false)
} finally {
Object.assign(config.kundenansichtNeu, vorher)
}
})