Buchungskalender: Zustimmungs-Test streng, Online-Zahlung nur beim Einschalten prüfen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 14:32:20 +00:00
1 parent 32cffb3518
commit e3b399e003
3 files changed
+17 -5

No files matched your search

+1 -1
View File
@@ -273,7 +273,7 @@ router.put('/einstellungen', ...schreib, route(async (req, res) => {
if (rechnungAuftrag !== undefined && typeof rechnungAuftrag !== 'boolean') throw ungueltig({ rechnungAuftrag: 'Ungültige Eingabe.' })
const r = vw.pruefeEinstellungen(rest, vorher)
if (r.fehler) throw ungueltig(r.fehler)
if (r.werte.onlineZahlung === true && stripeZustand(vorher) !== 'aktiv') {
if (r.werte.onlineZahlung === true && !vorher.onlineZahlung && stripeZustand(vorher) !== 'aktiv') {
throw new UkFehler(409, 'stripe_nicht_aktiv', { onlineZahlung: 'Online-Zahlung ist erst möglich, wenn dein Stripe-Konto aktiv ist.' })
}
if (r.werte.rechnungsPraefix !== undefined && r.werte.rechnungsPraefix !== (vorher.rechnungsPraefix ?? '') && !vw.zaehlerLeer(vorher)) {
-1
View File
@@ -83,7 +83,6 @@ export function pruefeEinstellungen(eingabe, vorher = {}) {
}
if (e.onlineZahlung !== undefined) {
if (typeof e.onlineZahlung !== 'boolean') fehler.onlineZahlung = 'Ungültige Eingabe.'
else if (e.onlineZahlung && !vorher.stripeAccountId) fehler.onlineZahlung = 'Dafür muss zuerst Stripe verbunden werden.'
else werte.onlineZahlung = e.onlineZahlung
}
const gesamt = { ...vorher, ...werte }
+16 -3
View File
@@ -581,9 +581,13 @@ test('Zustimmung: ohne rechnungAuftrag verweigern freigeben und bucheVerbindlich
assert.equal(r.body.fehler, 'zustimmung_fehlt')
assert.equal(aw.docs('ukAnfragen').get('a1').status, 'neu')
const ab = await import('../server/services/unterkunft/ablauf.js')
anfrage('a2', { status: 'freigegeben', tokenHash: 'x', fristAt: new Date(Date.now() + 86400000).toISOString(), posten: JSON.stringify(POSTEN), summen: JSON.stringify({ bruttoCent: 20000, nettoCent: 20000, ust: [] }) })
const ctx = { featureId: FEATURE, einstellungen: { ...EINST } }
await assert.rejects(ab.bucheVerbindlich(ctx, 'a2', 'x', { rechnungsadresse: {}, zahlart: 'vorort' }), (e) => e instanceof UkFehler && e.code === 'zustimmung_fehlt' || e.code === 'nicht_gefunden')
const { token, hash } = (await import('../server/services/unterkunft/token.js')).neuesToken()
anfrage('a2', { status: 'freigegeben', tokenHash: hash, fristAt: new Date(Date.now() + 86400000).toISOString(), posten: JSON.stringify(POSTEN), summen: JSON.stringify({ bruttoCent: 20000, nettoCent: 20000, ust: [] }) })
const ctx = { featureId: FEATURE, einstellungen: { ...EINST, rechnungAuftragAt: null } }
await assert.rejects(
ab.bucheVerbindlich(ctx, 'a2', token, { rechnungsadresse: { name: 'Eva', strasse: 'Weg 1', plz: '12345', ort: 'Berlin', land: 'DE' }, zahlart: 'vorort' }),
(e) => e instanceof UkFehler && e.status === 409 && e.code === 'zustimmung_fehlt',
)
assert.equal(aw.docs('ukAnfragen').get('a2').status, 'freigegeben')
assert.equal(aw.docs('ukRechnungen').size, 0)
})
@@ -597,4 +601,13 @@ test('Online-Zahlung: nur mit aktivem Stripe-Konto, sonst 409 mit felder.onlineZ
assert.equal(r.status, 409)
assert.ok(r.body.felder.onlineZahlung)
assert.notEqual(aw.docs('ukEinstellungen').get(FEATURE).onlineZahlung, true)
// ohne Konto ebenfalls 409
aw.seed('ukEinstellungen', { $id: FEATURE, featureId: FEATURE, ...EINST })
const ohne = await put('/einstellungen', { onlineZahlung: true })
assert.equal(ohne.status, 409)
assert.ok(ohne.body.felder.onlineZahlung)
// bereits eingeschaltet: andere Aenderungen scheitern nicht, auch wenn Stripe inaktiv ist
aw.seed('ukEinstellungen', { $id: FEATURE, featureId: FEATURE, ...EINST, onlineZahlung: true })
assert.equal((await put('/einstellungen', { telefon: '123' })).status, 200)
assert.equal((await put('/einstellungen', { onlineZahlung: true })).status, 200)
})