fix: Stripe-Ratenplan bei Prüfung anhalten, doppelte Pläne verhindern

Befunde aus dem Sicherheits-Review des vorherigen Commits:

- Gerät eine Buchung in "Prüfung nötig" (Rückbuchung, Doppelzahlung ...),
  wird der Stripe-Plan beendet und offene Rechnungen storniert. Nach
  Bestätigung legt der Worker einen neuen Plan für die offenen Raten an.
  Vorher zog Stripe auch bei Buchungen in Prüfung weiter ein.
- Vor dem Anlegen wird bei Stripe nach einem laufenden Plan der Buchung
  gesucht; der Idempotenzschlüssel enthält Generation und Start. Verhindert
  einen zweiten Plan nach verlorener ID und die Rückgabe des alten,
  beendeten Plans nach einer Prüfung.
- Start bei bereits verstrichener Fälligkeit deterministisch am nächsten
  9-Uhr-Termin, letzte Rate bleibt am Stichtag.
- Rückbuchungs-Event meldet die betroffene Buchung zurück.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-10-06 06:28:41 +02:00
1 parent c1ad9ad2ca
commit 1ce7947d93
8 files changed
+168 -23

No files matched your search

+7
View File
@@ -115,6 +115,13 @@ export class FakeGateway implements PaymentGateway {
});
}
async findInstallmentSchedule(customerId: string, bookingId: string): Promise<{ id: string } | null> {
const found = [...this.schedules.values()].find(
(s) => s.status === "active" && s.params.customerId === customerId && s.params.metadata.bookingId === bookingId,
);
return found ? { id: found.id } : null;
}
async cancelInstallmentSchedule(id: string): Promise<void> {
const schedule = this.schedules.get(id);
if (!schedule) throw new Error(`Unbekannter Zeitplan ${id}`);