Buchungskalender: Abschluss – S1 keine doppelte Erstattung nach Heilung

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 15:20:23 +00:00
1 parent 2df56eccc5
commit 435dd0b746
3 files changed
+64 -11

No files matched your search

+19 -1
View File
@@ -1,6 +1,6 @@
import { config } from '../../config.js'
import { withLocks } from '../keyedLock.js'
import { checkoutAnlegen, erstatten, sessionAblaufen, sessionHolen } from '../shop/connect.js'
import { checkoutAnlegen, erstatten, erstattungenZurZahlung, sessionAblaufen, sessionHolen } from '../shop/connect.js'
import { formatTag } from './datum.js'
import { UkFehler } from './fehler.js'
import { aktualisiereAnfrage, ladeAnfrage, ladeRechnung, ladeUnterkunft } from './speicher.js'
@@ -185,3 +185,21 @@ export async function erstatte(ctx, anfrage, betragCent, { now, idempotencyKey }
if (testProtokoll()) _aufrufe.push({ anfrageId: anfrage?.$id, betragCent, idempotencyKey })
return erstatter(ctx, anfrage, betragCent, { now, idempotencyKey })
}
async function liveErstattetEcht(ctx, anfrage) {
const accountId = ctx?.einstellungen?.stripeAccountId
if (!accountId || !anfrage?.stripePaymentIntentId) return 0
const liste = await erstattungenZurZahlung(accountId, anfrage.stripePaymentIntentId)
return liste.filter((r) => r?.status !== 'failed' && r?.status !== 'canceled').reduce((s, r) => s + (Number.isInteger(r?.amount) ? r.amount : 0), 0)
}
let liveLeser = liveErstattetEcht
/** Nur fuer Tests: ersetzt die Abfrage des bei Stripe erstatteten Betrags (null stellt die echte wieder her). */
export function setzeLiveErstattetFuerTests(fn) {
liveLeser = typeof fn === 'function' ? fn : liveErstattetEcht
}
/** Summe der bei Stripe tatsaechlich erstatteten Betraege dieser Zahlung (0 ohne Konto oder Zahlung); Stripe-Fehler gehen nach oben. */
export async function liveErstattet(ctx, anfrage) {
return liveLeser(ctx, anfrage)
}