die webseite benötigt einen modernen checkout, der die seite nicht neu lädt, sondern immer nur den jeweiligen schritt anzeigt. Er soll wir ein Multi-Step Wizard aufgebaut sein. Er startet von der Paket-Auswahlseite kommend mit der bestätigung des Pakets anhand der package_id.
Schritt 1: gewähltes Paket

Anzeige des ausgewählten pakets mit allen details. möglichkeit, ein anderes paket (aber nur gleichartig, also wenn das paket vom typ "endcustomer" ist, nur solche andere pakete anzeigen, wenn das Paket vom Typ "reseller" ist, nur solche pakete anzeigen).

schritt  2: "login" und "registrierung" 
nahtlose integration beider formular mit umschalter. Loginformular: fehleingaben sollen direkt am formular und per toast sichtbar sein. Der erfolgreiche Login sollte das sichtbare formular ersetzen mit "Sie sind nun eingeloggt" => weiter zum nächsten schritt. toast-benachrichtigung. Fehler bei der registrierung sollen im formular widergespiegelt werden. ist der nutzer angemeldet, soll beides nicht mehr sichtbar sein, sondern "Sie sind bereits eingeloggt". Eine erfolgreiche Registrierung loggt den nutzer mit status "purchase_pending" ein und leitet zu schritt 3.
Frage klären: kann man den login oder die registrierung ersetzen durch daten von paypal/strip registrierung (callback)?

schritt 3: Zahlung
pakettyp "endcustomer": 
auswahl paypal / Stripe. Buttons für "Mit Paddle bezahlen" und "Mit Stripe bezahlen" anzeigen. Der Benutzer klickt einen aus.
Zahlungsinitierung:
Paddle: Umleitung zu Paddle's Express Checkout (via API-Call in Laravel-Controller, z. B. create_order). Der Benutzer loggt sich bei Paddle ein, bestätigt den Einmalkauf (keine Subscription-Option). Rückleitung mit Token zur Bestätigung (Webhook oder Redirect-Handler).
Stripe: Client-seitige Integration mit Stripe Elements (React-Komponente in Ihrer PWA). Der Benutzer gibt Kartendaten ein (ohne Umleitung), oder nutzt Stripe Checkout (hosted Page). Backend-Call zu Stripe API für PaymentIntent erstellen und bestätigen.
Bestätigung: Nach Zahlung (z. B. 29,99 €) wird der Kauf im Backend gespeichert (z. B. TenantPackage::createPurchase()), Zugang freigeschaltet (z. B. Event-Zugriff via EventController), und der Benutzer sieht eine Erfolgsseite.
Fehlerbehandlung: Abbruch → Zurück zur Bestellübersicht mit Fehlermeldung (z. B. "Zahlung fehlgeschlagen").

pakettyp "reseller": 
Paddle: 
Nutzung von Paddle Subscriptions API (in Laravel via SDK). Erstellen eines Subscription-Plans (z. B. create_subscription), Umleitung zu Paddle für Autorisierung. Der Benutzer stimmt wiederkehrenden Abbuchungen zu. Rückleitung mit Subscription-ID, die im Backend (z. B. PackagePurchases) gespeichert wird. Webhooks für Updates (z. B. Kündigung).
Stripe: 
Erstellen eines Subscription-Plans via Stripe Dashboard/API (z. B. stripe.subscriptions.create()). Client-seitig: Stripe Elements für SetupIntent (Kartenspeicherung), dann Subscription aktivieren. Keine Umleitung nötig, wenn Sie benutzerdefinierte UI bauen. Backend-Handling für Billing-Cycles, Invoices und Webhooks (z. B. für invoice.paid).
Bestätigung: Erste Zahlung erfolgt sofort, Subscription startet. Backend-Update: Reseller-Status aktivieren (z. B. in Tenants-Tabelle), Willkommens-E-Mail. 
Für Kündigungen: Link im profil und in der Admin-PWA (z. B. via Filament).
Fehlerbehandlung: Bei Kartenablehnung → Retry-Option oder Wechsel zu anderem Anbieter. Proration bei Paket-Wechsel (z. B. via Stripe's Proration-Feature).

Schritt 4: Abschluss und bestätigen der bestellung, falls noch erforderlich.
Bestätigungsseite mit link zum tenant-admin bereich. Ergänzen des profilmenüs um den link zum tenant-admin.

bei allem die lokalisierung beachten