Buchungskalender: Abgleich – gleichzeitige Zweitzahlung wird erstattet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f01e6def59
commit
95cbd473d0
2 files changed
+19
-1
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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 })
|
||||
|
||||
Reference in new issue
Block a user