Buchungskalender: Abgleich – gleichzeitige Zweitzahlung wird erstattet

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 14:53:36 +00:00
1 parent f01e6def59
commit 95cbd473d0
2 files changed
+19 -1

No files matched your search

+5 -1
View File
@@ -111,7 +111,11 @@ export async function verbucheZahlung(ctx, anfrageId, paymentIntentId, { now = n
return vorher
}
try {
return await markiereBezahlt(ctx, anfrageId, { via: 'stripe', paymentIntentId: pi, now })
const bezahlt = await markiereBezahlt(ctx, anfrageId, { via: 'stripe', paymentIntentId: pi, now })
// gleichzeitige Zweitzahlung: zwischen dem Lesen oben und der Sperre hat eine andere Zahlung gebucht (markiereBezahlt gibt dann
// die bezahlte Anfrage ohne Fehler zurueck) -> die Zahlung, die nicht gebucht wurde, voll erstatten
if (pi && bezahlt?.stripePaymentIntentId !== pi) await erstatteUeberzaehligeZahlung(ctx, pi)
return bezahlt
} catch (err) {
if (!(err instanceof UkFehler) || err.status !== 409) throw err
const jetzt = await ladeAnfrage(anfrageId)
+14
View File
@@ -384,6 +384,20 @@ test('Zahlung nach Frist-Ablauf der Sitzung/Storno ueber Rueckkehr-Abgleich: ebe
assert.equal(erstattungen('pi_sp2').length, 1)
})
test('Gleichzeitige Zweitzahlung (beide lesen noch gebucht): genau eine wird gebucht, die andere erstattet', async () => {
const f = await onlineGebucht('2026-11-10', '2026-11-12')
st.setPaymentIntent(ACCOUNT, 'pi_x', { amount: 20000 })
st.setPaymentIntent(ACCOUNT, 'pi_y', { amount: 20000 })
await Promise.all([zahlung.verbucheZahlung(f.ctx, f.id, 'pi_x', { now: NOW }), zahlung.verbucheZahlung(f.ctx, f.id, 'pi_y', { now: NOW })])
const a = await sp.ladeAnfrage(f.id)
assert.equal(a.status, 'bezahlt')
const gebucht = a.stripePaymentIntentId
const andere = gebucht === 'pi_x' ? 'pi_y' : 'pi_x'
assert.equal(erstattungen(gebucht).length, 0)
assert.equal(erstattungen(andere).length, 1)
assert.equal(erstattungen(andere)[0].metadata?.webklar ?? 'unterkunft', 'unterkunft')
})
test('Zweite Zahlung auf bereits bezahlte Buchung (andere Zahlung): automatisch erstattet; dieselbe Zahlung nicht', async () => {
const f = await onlineGebucht('2026-11-10', '2026-11-12')
st.setPaymentIntent(ACCOUNT, 'pi_a', { amount: 20000 })