diff --git a/server/routes/unterkunft.js b/server/routes/unterkunft.js index 8eb3269..e953275 100644 --- a/server/routes/unterkunft.js +++ b/server/routes/unterkunft.js @@ -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)) { diff --git a/server/services/unterkunft/verwaltung.js b/server/services/unterkunft/verwaltung.js index 53af398..23a6cb9 100644 --- a/server/services/unterkunft/verwaltung.js +++ b/server/services/unterkunft/verwaltung.js @@ -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 } diff --git a/test/unterkunftVerwaltung.test.js b/test/unterkunftVerwaltung.test.js index 925073e..6b26ae6 100644 --- a/test/unterkunftVerwaltung.test.js +++ b/test/unterkunftVerwaltung.test.js @@ -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) })