tenant; $user = $session->user; if (! $tenant && $user) { $tenant = $this->ensureTenant($user, $session); } if (! $tenant) { Log::warning('Checkout assignment skipped: missing tenant', ['session' => $session->id]); return; } $package = $session->package; if (! $package) { Log::warning('Checkout assignment skipped: missing package', ['session' => $session->id]); return; } $metadata = $session->provider_metadata ?? []; $providerReference = $options['provider_reference'] ?? $metadata['paddle_transaction_id'] ?? null ?? $metadata['paddle_checkout_id'] ?? null ?? $session->stripe_payment_intent_id ?? CheckoutSession::PROVIDER_FREE; $providerName = $options['provider'] ?? $session->provider ?? ($metadata['paddle_transaction_id'] ?? $metadata['paddle_checkout_id'] ? CheckoutSession::PROVIDER_PADDLE : null) ?? ($session->stripe_payment_intent_id ? CheckoutSession::PROVIDER_STRIPE : null) ?? CheckoutSession::PROVIDER_FREE; $purchase = PackagePurchase::updateOrCreate( [ 'tenant_id' => $tenant->id, 'package_id' => $package->id, 'provider_id' => $providerReference, ], [ 'provider' => $providerName, 'price' => $session->amount_total, 'type' => $package->type === 'reseller' ? 'reseller_subscription' : 'endcustomer_event', 'purchased_at' => now(), 'metadata' => $options['payload'] ?? null, ] ); TenantPackage::updateOrCreate( [ 'tenant_id' => $tenant->id, 'package_id' => $package->id, ], [ 'price' => $session->amount_total, 'active' => true, 'purchased_at' => now(), 'expires_at' => $this->resolveExpiry($package, $tenant), ] ); if ($user && $user->pending_purchase) { $this->activateUser($user); } if ($user) { $mailLocale = $user->preferred_locale ?? app()->getLocale(); Mail::to($user) ->locale($mailLocale) ->queue(new Welcome($user)); if ($purchase->wasRecentlyCreated) { Mail::to($user) ->locale($mailLocale) ->queue(new PurchaseConfirmation($purchase)); } AbandonedCheckout::query() ->where('user_id', $user->id) ->where('package_id', $package->id) ->where('converted', false) ->update([ 'converted' => true, 'reminder_stage' => 'converted', ]); } Log::info('Checkout session assigned', [ 'session' => $session->id, 'tenant' => $tenant->id, 'package' => $package->id, 'purchase' => $purchase->id, ]); }); } protected function ensureTenant(User $user, CheckoutSession $session): ?Tenant { if ($user->tenant) { if (! $user->tenant_id) { $user->forceFill(['tenant_id' => $user->tenant->getKey()])->save(); } return $user->tenant; } $tenant = Tenant::create([ 'user_id' => $user->id, 'name' => $session->package_snapshot['name'] ?? $user->name, 'slug' => Str::slug(($user->name ?: $user->email).' '.now()->timestamp), 'email' => $user->email, 'is_active' => true, 'is_suspended' => false, 'subscription_tier' => 'free', 'subscription_status' => 'active', 'settings' => [ 'contact_email' => $user->email, ], ]); if ($user->tenant_id !== $tenant->id) { $user->forceFill(['tenant_id' => $tenant->id])->save(); } event(new Registered($user)); return $tenant; } protected function resolveExpiry(Package $package, Tenant $tenant) { if ($package->type === 'reseller') { $hasActive = TenantPackage::where('tenant_id', $tenant->id) ->where('active', true) ->exists(); return $hasActive ? now()->addYear() : now()->addDays(14); } return now()->addYear(); } protected function activateUser(User $user): void { $user->forceFill([ 'email_verified_at' => $user->email_verified_at ?? now(), 'role' => $user->role === 'user' ? 'tenant_admin' : $user->role, 'pending_purchase' => false, ])->save(); } }