screen where users pick an eligible end‑customer purchase and confirm. Eligibility is enforced server‑side
(endcustomer_event, within 14 days, no event package created after purchase), refund is issued via Paddle, the
purchase is marked refunded, the tenant package is deactivated, and a new confirmation email is sent using resources/
views/emails/partials/layout.blade.php.
Details
- New controller + form request for the confirm flow: app/Http/Controllers/WithdrawalController.php, app/Http/
Requests/Marketing/WithdrawalConfirmRequest.php
- New confirmation page + CTA: resources/js/pages/marketing/WithdrawalConfirm.tsx, resources/js/pages/legal/Show.tsx
- Routes + locale rewrites: routes/web.php, resources/js/lib/localizedPath.ts
- New email notification + template: app/Notifications/Customer/WithdrawalConfirmed.php, resources/views/emails/
withdrawal-confirmation.blade.php
- Translations added for marketing UI + backend flash + email copy: public/lang/de/marketing.json, public/lang/en/
marketing.json, resources/lang/de/marketing.php, resources/lang/en/marketing.php, resources/lang/de/emails.php,
resources/lang/en/emails.php
- Tests: tests/Feature/Marketing/WithdrawalConfirmationTest.php
the MailMessage builders to use view(). This keeps the existing copy/labels but aligns the look with resources/views/
emails/partials/layout.blade.php. I also switched the customer add‑on receipt notification to reuse the existing
branded view and added missing translations for the upload pipeline alert.
app/Services/Checkout/CheckoutAssignmentService.php
- TenantPackage setzt für Endkunden kein addCentury mehr (Default jetzt 1 Jahr, nur wenn expires_at fehlt)
app/Models/TenantPackage.php
- Tests angepasst
tests/Unit/TenantPackageTest.php
checkout_id direkt an das Backend, damit der Server die Session via Paddle‑API finalisiert (auch wenn der Webhook
nicht greift). Dadurch sollte “Zahlung wird verarbeitet” nicht mehr hängen bleiben.
Services/Helpers sind entfernt, API/Frontend angepasst, Tests auf Paddle umgestellt. Außerdem wurde die CSP gestrafft
und Stripe‑Texte in den Abandoned‑Checkout‑Mails ersetzt.