query('type', 'endcustomer'); $packages = Package::where('type', $type) ->orderBy('price') ->get(); $packages->each(function ($package) { $package->features = json_decode($package->features ?? '[]', true); }); return response()->json([ 'data' => $packages, 'message' => "Packages for type '{$type}' loaded successfully.", ]); } public function purchase(Request $request): JsonResponse { $request->validate([ 'package_id' => 'required|exists:packages,id', 'type' => 'required|in:endcustomer_event,reseller_subscription', 'payment_method' => 'required|in:stripe,paypal', 'event_id' => 'nullable|exists:events,id', // For endcustomer ]); $package = Package::findOrFail($request->package_id); $tenant = $request->attributes->get('tenant'); if (!$tenant) { throw ValidationException::withMessages(['tenant' => 'Tenant not found.']); } if ($package->price == 0) { // Free package - direct assignment return $this->handleFreePurchase($request, $package, $tenant); } // Paid purchase return $this->handlePaidPurchase($request, $package, $tenant); } private function handleFreePurchase(Request $request, Package $package, $tenant): JsonResponse { DB::transaction(function () use ($request, $package, $tenant) { $purchaseData = [ 'tenant_id' => $tenant->id, 'event_id' => $request->event_id, 'package_id' => $package->id, 'provider_id' => 'free', 'price' => $package->price, 'type' => $request->type, 'metadata' => json_encode([ 'note' => 'Free package assigned', 'ip' => $request->ip(), ]), ]; PackagePurchase::create($purchaseData); if ($request->event_id) { // Assign to event \App\Models\EventPackage::create([ 'event_id' => $request->event_id, 'package_id' => $package->id, 'price' => $package->price, 'purchased_at' => now(), ]); } else { // Reseller subscription \App\Models\TenantPackage::create([ 'tenant_id' => $tenant->id, 'package_id' => $package->id, 'price' => $package->price, 'purchased_at' => now(), 'expires_at' => now()->addYear(), 'active' => true, ]); } }); return response()->json([ 'message' => 'Free package assigned successfully.', 'purchase' => ['package' => $package->name, 'type' => $request->type], ], 201); } private function handlePaidPurchase(Request $request, Package $package, $tenant): JsonResponse { $type = $request->type; if ($type === 'reseller_subscription') { $response = (new StripeController())->createSubscription($request); return $response; } else { $response = (new StripeController())->createPaymentIntent($request); return $response; } } }