$package, 'packageOptions' => $packages, 'stripePublishableKey' => config('services.stripe.key'), 'privacyHtml' => view('legal.datenschutz-partial')->render(), 'auth' => [ 'user' => Auth::user(), ], ]); } public function register(Request $request) { $validator = Validator::make($request->all(), [ 'email' => 'required|email|unique:users,email', 'password' => ['required', 'confirmed', Password::defaults()], 'package_id' => 'required|exists:packages,id', 'terms' => 'required|accepted', ]); if ($validator->fails()) { return response()->json([ 'errors' => $validator->errors(), ], 422); } $package = Package::findOrFail($request->package_id); $validated = $validator->validated(); DB::transaction(function () use ($request, $package, $validated) { // User erstellen $user = User::create([ 'email' => $request->email, 'password' => Hash::make($request->password), 'pending_purchase' => true, ]); // Tenant erstellen $tenant = Tenant::create([ 'user_id' => $user->id, 'name' => $validated['first_name'] . ' ' . $validated['last_name'], 'slug' => Str::slug($validated['first_name'] . ' ' . $validated['last_name'] . '-' . now()->timestamp), 'email' => $validated['email'], 'is_active' => true, 'is_suspended' => false, 'event_credits_balance' => 0, 'subscription_tier' => 'free', 'subscription_expires_at' => null, 'settings' => json_encode([ 'branding' => [ 'logo_url' => null, 'primary_color' => '#3B82F6', 'secondary_color' => '#1F2937', 'font_family' => 'Inter, sans-serif', ], 'features' => [ 'photo_likes_enabled' => false, 'event_checklist' => false, 'custom_domain' => false, 'advanced_analytics' => false, ], 'custom_domain' => null, 'contact_email' => $validated['email'], 'event_default_type' => 'general', ]), ]); // Package zuweisen $tenant->packages()->attach($package->id, [ 'purchased_at' => now(), 'expires_at' => $package->is_free ? null : now()->addYear(), 'is_active' => $package->is_free, // Kostenlose Pakete sofort aktivieren ]); // E-Mail-Verifizierung senden $user->sendEmailVerificationNotification(); // Willkommens-E-Mail senden Mail::to($user->email)->send(new \App\Mail\WelcomeMail($user, $package)); }); return response()->json([ 'message' => 'Registrierung erfolgreich. Bitte überprüfen Sie Ihre E-Mail zur Verifizierung.', ]); } public function createPaymentIntent(Request $request) { $request->validate([ 'package_id' => 'required|exists:packages,id', ]); $package = Package::findOrFail($request->package_id); \Log::info('Create Payment Intent', [ 'package_id' => $package->id, 'package_name' => $package->name, 'price' => $package->price, 'is_free' => $package->is_free, 'user_id' => Auth::id(), ]); if ($package->is_free) { \Log::info('Free package detected, returning null client_secret'); return response()->json([ 'client_secret' => null, 'free_package' => true, ]); } // Stripe API Key setzen Stripe::setApiKey(config('services.stripe.secret')); try { $paymentIntent = PaymentIntent::create([ 'amount' => $package->price * 100, // Stripe erwartet Cent 'currency' => 'eur', 'metadata' => [ 'package_id' => $package->id, 'user_id' => Auth::id(), ], ]); \Log::info('PaymentIntent created successfully', [ 'payment_intent_id' => $paymentIntent->id, 'client_secret' => substr($paymentIntent->client_secret, 0, 50) . '...', ]); return response()->json([ 'client_secret' => $paymentIntent->client_secret, ]); } catch (\Exception $e) { \Log::error('Stripe PaymentIntent creation failed', [ 'error' => $e->getMessage(), 'package_id' => $package->id, ]); return response()->json([ 'error' => 'Fehler beim Erstellen der Zahlungsdaten: ' . $e->getMessage(), ], 500); } } public function confirmPayment(Request $request) { $request->validate([ 'payment_intent_id' => 'required|string', 'package_id' => 'required|exists:packages,id', ]); // Stripe API Key setzen Stripe::setApiKey(config('services.stripe.secret')); $paymentIntent = PaymentIntent::retrieve($request->payment_intent_id); if ($paymentIntent->status !== 'succeeded') { return response()->json([ 'error' => 'Zahlung nicht erfolgreich.', ], 400); } $package = Package::findOrFail($request->package_id); $user = Auth::user(); // Package dem Tenant zuweisen $user->tenant->packages()->attach($package->id, [ 'purchased_at' => now(), 'expires_at' => now()->addYear(), 'is_active' => true, ]); // pending_purchase zurücksetzen $user->update(['pending_purchase' => false]); return response()->json([ 'message' => 'Zahlung erfolgreich bestätigt.', ]); } }