added rule-based refunding-logic

This commit is contained in:
Rajpreet0 2026-08-07 17:03:47 +02:00
parent 3105bbd4d9
commit 7cd831cbc4
25 changed files with 1390 additions and 125 deletions

View file

@ -0,0 +1,8 @@
-- AlterTable
ALTER TABLE "Business" ADD COLUMN "cancellationPolicy" JSONB;
-- AlterTable
ALTER TABLE "CourseBooking" ADD COLUMN "cancellationReason" TEXT,
ADD COLUMN "cancelledBy" TEXT,
ADD COLUMN "refundedAmount" INTEGER,
ADD COLUMN "refundedAt" TIMESTAMP(3);

View file

@ -102,6 +102,7 @@ model Business {
stripeAccountId String? @unique // Stripe Connect Account ID
stripeAccountStatus String? // "pending" | "active" | "restricted"
invoiceCounter Int @default(0) // Fortlaufender Zähler für Rechnungsnummern
cancellationPolicy Json? // { tiers: [{ hoursBeforeStart: number, refundPercent: number }, ...] }, absteigend sortiert. null = immer 100% Rückerstattung.
manager Manager @relation(fields: [managerId], references: [id])
courses Course[]
createdAt DateTime @default(now())
@ -171,13 +172,17 @@ model CourseBooking {
courseId String
userId String?
guestLeadId String?
paymentStatus String @default("pending") // "pending" | "paid" | "failed" | "refunded"
paymentStatus String @default("pending") // "pending" | "paid" | "failed" | "refunded" | "partially_refunded"
stripeSessionId String? @unique
stripePaymentIntentId String? @unique
amountPaid Int? // tatsächlich gezahlter Betrag in Cents
platformFee Int? // unsere Service-Fee in Cents
invoiceNumber String? @unique // Rechnungsnummer, wird lazy beim ersten PDF-Download vergeben
invoiceIssuedAt DateTime? // Zeitpunkt der Rechnungsnummer-Vergabe, damit das Rechnungsdatum bei jedem Download gleich bleibt
refundedAmount Int? // tatsächlich erstatteter Betrag in Cents
refundedAt DateTime? // Zeitpunkt der erfolgreichen Stripe-Rückerstattung
cancelledBy String? // "user" | "manager" | "system" (system = automatischer Überbuchungs-Refund)
cancellationReason String?
course Course @relation(fields: [courseId], references: [id], onDelete: Cascade)
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
guestLead GuestLead? @relation(fields: [guestLeadId], references: [id], onDelete: SetNull)