url = $url; $this->user = Auth::guard('admin')->user(); } public function getSubscriptionList() { try { $this->authorizeForUser($this->user, 'list', new Subscription); $subscriptions = Subscription::with(['cart', 'item.plansV1', 'patient']) ->join('patients', 'subscription.patient_id', '=', 'patients.id') // Join with the patient table ->join('items', 'subscription.item_id', '=', 'items.id') // Join with the plansV1 table ->join('plans_v1', 'items.plans_id', '=', 'plans_v1.id') // Join with the plansV1 table ->select([ 'subscription.*', 'patients.first_name', 'patients.last_name', 'plans_v1.title as product_title', 'plans_v1.price as price' ]); // Select necessary columns return DataTables::of($subscriptions) ->addColumn('product_title', function ($subscription) { return $subscription->item?->plansV1?->title ?? 'N/A'; }) ->addColumn('price', function ($subscription) { return $subscription->item?->plansV1?->price ?? 'N/A'; }) ->addColumn('currency', function ($subscription) { $plan = $subscription->item?->plansV1; return $plan ? $plan->currency : 'N/A'; }) ->addColumn('first_name', function ($subscription) { return $subscription->first_name ?? 'N/A'; }) ->addColumn('last_name', function ($subscription) { return $subscription->last_name ?? 'N/A'; }) ->filterColumn('first_name', function ($query, $keyword) { $query->where('patients.first_name', 'like', "%{$keyword}%"); }) ->filterColumn('last_name', function ($query, $keyword) { $query->where('patients.last_name', 'like', "%{$keyword}%"); }) ->filterColumn('product_title', function ($query, $keyword) { $query->where('plans_v1.title', 'like', "%{$keyword}%"); }) ->filterColumn('product_price', function ($query, $keyword) { $query->where('plans_v1.price', 'like', "%{$keyword}%"); }) ->make(true); } catch (AuthorizationException $e) { return $e->getMessage(); } } public function updateSubscription(Request $request, $subid) { try { $this->authorizeForUser($this->user, 'edit', new Subscription); // Find the subscription $subscription = Subscription::find($subid); if (!$subscription) { return response()->json(['message' => 'Subscription not found'], 404); } // Define the fillable fields $fillable = [ 'subscription_start_date', 'subscription_renewal_date', 'subscription_status', 'cart_id', 'item_id', 'patient_id', 'status' ]; // Filter the request data to only include fillable fields that are present $dataToUpdate = array_filter( $request->only($fillable), function ($value) { return $value !== null; } ); // Validate the filtered data $validator = Validator::make($dataToUpdate, [ 'subscription_start_date' => 'required', 'subscription_renewal_date' => 'required', 'subscription_status' => 'string', 'cart_id' => 'exists:carts,id', 'item_id' => 'exists:items,id', 'patient_id' => 'exists:patients,id', 'status' => 'string', ]); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 422); } // Update the subscription $subscription->update($dataToUpdate); return response()->json(['message' => 'Subscription updated successfully', 'data' => $subscription], 200); } catch (AuthorizationException $e) { return $e->getMessage(); } } public function CreateSubscription(Request $request) { try { $this->authorizeForUser($this->user, 'add', new Subscription); // Validate the incoming request data $validator = Validator::make($request->all(), [ 'subscription_start_date' => 'required', 'subscription_renewal_date' => 'required', 'subscription_status' => 'required', 'cart_id' => 'required|exists:carts,id', 'item_id' => 'required|exists:items,id', 'patient_id' => 'required|exists:patients,id', //'status' => 'required' ]); if ($validator->fails()) { return response()->json(['errors' => $validator->errors()], 422); } // Create the subscription $subscription = Subscription::create($request->all()); return response()->json([ 'message' => 'Subscription created successfully', 'data' => $subscription ], 201); } catch (AuthorizationException $e) { return $e->getMessage(); } } public function getSubscription(Subscription $subscription, Request $request) { try { $this->authorizeForUser($this->user, 'list', new Subscription); return response()->json([ 'data' => $subscription ], 201); } catch (AuthorizationException $e) { return $e->getMessage(); } } public function deleteSubscription(Subscription $subscription, Request $request) { try { $this->authorizeForUser($this->user, 'delete', new Subscription); $subscription->delete(); return response()->json([ 'status' => 'deleted', 'message' => 'subscription deleted' ], 201); } catch (AuthorizationException $e) { return $e->getMessage(); } } }