- Wired the checkout wizard for Google “comfort login”: added Socialite controller + dependency, new Google env

hooks in config/services.php/.env.example, and updated wizard steps/controllers to store session payloads,
attach packages, and surface localized success/error states.
- Retooled payment handling for both Stripe and PayPal, adding richer status management in CheckoutController/
PayPalController, fallback flows in the wizard’s PaymentStep.tsx, and fresh feature tests for intent
creation, webhooks, and the wizard CTA.
- Introduced a consent-aware Matomo analytics stack: new consent context, cookie-banner UI, useAnalytics/
useCtaExperiment hooks, and MatomoTracker component, then instrumented marketing pages (Home, Packages,
Checkout) with localized copy and experiment tracking.
- Polished package presentation across marketing UIs by centralizing formatting in PresentsPackages, surfacing
localized description tables/placeholders, tuning badges/layouts, and syncing guest/marketing translations.
- Expanded docs & reference material (docs/prp/*, TODOs, public gallery overview) and added a Playwright smoke
test for the hero CTA while reconciling outstanding checklist items.
This commit is contained in:
Codex Agent
2025-10-19 11:41:03 +02:00
parent ae9b9160ac
commit a949c8d3af
113 changed files with 5169 additions and 712 deletions

View File

@@ -5,6 +5,9 @@ return [
'platform' => 'Plattform',
'library' => 'Bibliothek',
'content' => 'Inhalte',
'platform_management' => 'Plattformverwaltung',
'billing' => 'Billing & Finanzen',
'security' => 'Sicherheit',
],
'common' => [
@@ -33,6 +36,8 @@ return [
'settings' => 'Einstellungen',
'join' => 'Beitreten',
'unnamed' => 'Ohne Namen',
'from' => 'Von',
'until' => 'Bis',
],
'photos' => [
@@ -213,6 +218,23 @@ return [
'uploads_per_day' => [
'heading' => 'Uploads (14 Tage)',
],
'credit_alerts' => [
'low_balance_label' => 'Mandanten mit niedrigen Credits',
'low_balance_desc' => 'Benötigen Betreuung',
'monthly_revenue_label' => 'Umsatz (Monat)',
'monthly_revenue_desc' => 'Aktueller Monat (:month)',
'active_subscriptions_label' => 'Aktive Abos',
'active_subscriptions_desc' => 'Laufende Pakete',
],
'revenue_trend' => [
'heading' => 'Monatliche Einnahmen',
'series' => 'Umsatz (€)',
],
'top_tenants_by_revenue' => [
'heading' => 'TopMandanten nach Umsatz',
'total' => 'Gesamt (€)',
'count' => 'Käufe',
],
],
'notifications' => [
@@ -228,6 +250,82 @@ return [
'contact_email' => 'KontaktEMail',
'event_credits_balance' => 'EventCreditsKontostand',
'features' => 'Funktionen',
'total_revenue' => 'Gesamtumsatz',
'active_reseller_package' => 'Aktives Reseller-Paket',
'remaining_events' => 'Verbleibende Events',
'package_expires_at' => 'Ablaufdatum Paket',
'is_active' => 'Aktiv',
'is_suspended' => 'Suspendiert',
],
'actions' => [
'adjust_credits' => 'Credits anpassen',
'adjust_credits_delta' => 'Anzahl Credits (positiv/negativ)',
'adjust_credits_delta_hint' => 'Positive Werte fügen Credits hinzu, negative Werte ziehen ab.',
'adjust_credits_reason' => 'Interne Notiz',
'adjust_credits_success_title' => 'Credits aktualisiert',
'adjust_credits_success_body' => 'Die Credits wurden um :delta verändert. Neuer Kontostand: :balance.',
],
],
'purchase_history' => [
'fields' => [
'tenant' => 'Mandant',
'package' => 'Paket',
'credits' => 'Credits',
'price' => 'Preis',
'currency' => 'Währung',
'platform' => 'Plattform',
'transaction_id' => 'Transaktions-ID',
'purchased_at' => 'Kaufdatum',
],
'filters' => [
'purchased_at' => 'Zeitraum',
'platform' => 'Plattform',
'currency' => 'Währung',
'tenant' => 'Mandant',
],
'actions' => [
'export' => 'Exportieren',
],
'platforms' => [
'ios' => 'iOS',
'android' => 'Android',
'web' => 'Web',
'manual' => 'Manuell',
],
'export_success' => 'Export abgeschlossen. :count Einträge exportiert.',
],
'oauth' => [
'fields' => [
'name' => 'Name',
'client_id' => 'Client-ID',
'client_secret' => 'Client-Secret',
'tenant' => 'Mandant',
'redirect_uris' => 'Redirect-URIs',
'scopes' => 'Scopes',
'is_active' => 'Aktiv',
'description' => 'Beschreibung',
'updated_at' => 'Zuletzt geändert',
],
'hints' => [
'client_secret' => 'Leer lassen, um das bestehende Secret zu behalten oder für PKCE-Clients ohne Secret.',
'redirect_uris' => 'Eine URL pro Zeile. Die Callback-URL muss exakt übereinstimmen.',
],
'filters' => [
'is_active' => 'Status',
'any' => 'Alle',
'active' => 'Aktiv',
'inactive' => 'Inaktiv',
],
'actions' => [
'regenerate_secret' => 'Secret neu generieren',
],
'notifications' => [
'secret_regenerated_title' => 'Neues Secret erstellt',
'secret_regenerated_body' => 'Speichere das neue Secret sicher: :secret',
'created_title' => 'OAuth-Client erstellt',
'updated_title' => 'OAuth-Client gespeichert',
],
],