feat(sprint-6): Phase 3 — Stripe integration (SEPA + PayPal + Card)
Deploy to Production / test (push) Has been cancelled
Deploy to Production / deploy (push) Has been cancelled

- V7 migration: subscriptions table with plan tiers
- Subscription entity + PlanTier/SubscriptionStatus enums
- StripeService: customer creation, checkout, portal, webhook handling
- SubscriptionController: /api/v1/billing endpoints
- Webhook handler: invoice.paid, payment_failed, subscription.deleted/updated
- Plan enforcement: member limit interceptor, trial expiry check
- Frontend: /settings/billing page (plan card, usage, upgrade, portal link)
- Trial expired banner on all admin pages
- React Query hooks (useSubscriptionQuery, checkout/portal mutations)
- Stripe Java SDK 28.2.0
- Full i18n (de/en) for billing namespace
This commit is contained in:
Patrick Plate
2026-06-12 22:31:03 +02:00
parent 3232d2f7fd
commit 61e481b37b
17 changed files with 892 additions and 0 deletions
+29
View File
@@ -370,5 +370,34 @@
"deleteButton": "Konto endgültig löschen",
"deleteConfirm": "Bist du sicher? Diese Aktion kann nicht rückgängig gemacht werden.",
"deleteSuccess": "Dein Konto wurde gelöscht. Du wirst jetzt abgemeldet."
},
"billing": {
"title": "Plan & Abrechnung",
"currentPlan": "Aktueller Plan",
"trial": "Testphase",
"starter": "Starter",
"pro": "Pro",
"enterprise": "Enterprise",
"trialEnds": "Testphase endet am {date}",
"trialExpired": "Deine Testphase ist abgelaufen. Wähle einen Plan, um fortzufahren.",
"trialDaysLeft": "{days} Tage verbleibend",
"memberLimit": "Mitglieder-Limit",
"membersUsed": "{used} / {limit} Mitglieder",
"price": "{price}/Monat",
"nextBilling": "Nächste Abrechnung",
"upgrade": "Plan upgraden",
"manageBilling": "Zahlungsdetails verwalten",
"invoices": "Rechnungen",
"noInvoices": "Noch keine Rechnungen.",
"starterDesc": "Für kleine Vereine bis 30 Mitglieder",
"proDesc": "Für wachsende Vereine bis 100 Mitglieder",
"enterpriseDesc": "Für große Vereine — unbegrenzte Mitglieder",
"starterPrice": "€19",
"proPrice": "€49",
"enterprisePrice": "Auf Anfrage",
"selectPlan": "Plan wählen",
"active": "Aktiv",
"pastDue": "Zahlung ausstehend",
"canceled": "Gekündigt"
}
}