HEX
Server: nginx/1.24.0
System: Linux DGT-WORDPRESS-VM-SERVER 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/SubscriptionController.php
<?php

namespace App\Http\Controllers\api;

use App\Http\Controllers\Controller;
use App\SubscriptionPlan;
use App\SubscriptionPrice;
use App\SubscriptionDetail;
use App\Subscription;
use Illuminate\Support\Facades\Validator;
use Config;
use DB;
use Auth;
use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Throwable;


class SubscriptionController extends Controller
{
    /**
     * @param Request $request
     * @return string|null
     **/
    
    public function index(Request $request)
    {
    	try {
    		$subscriptionLibrary = new \App\Library\SubscriptionLibrary;
            $result = $subscriptionLibrary->list();
            return self::sentResponse(200, $result, __('digimed_validation.success_response.data_fetch_success'));
        } catch (Exception | Throwable | QueryException $e) {
            DB::rollback();

            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    public function subscriptionPlanCreate(Request $request)
    {
        try {

            $rules = [               
                'name' => 'required|unique:subscription_plans,name,' . ($request->id ?? 'NULL') . ',id',
                'description' => 'required',
                'price' => 'required',
                'currency_code' => 'required',
                'interval' => 'required|in:month,year,day,week',
                'isupdate' => 'required|in:0,1'
            ];
            $messages = [
                'name.required' => __('digimed_validation.form_validation_error.name_req'),
                'description.required' => __('digimed_validation.form_validation_error.description_req'),
                'price.required' => __('digimed_validation.form_validation_error.price_required'),
                'currency_code.required' => __('digimed_validation.form_validation_error.currency_code_req'),
                'interval.required' => __('digimed_validation.form_validation_error.interval_req'),
            ];

            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            }

            /** @var object $this */
            $authRole = Auth::user();
            $auth_id = auth()->user()->id;

            $isUpdate = isset($request->id) ? true : false;
          
            /**
             * @var string $name
             * @var string $description
             */
            if($isUpdate){
            // Update existing subscription
                $subscription = SubscriptionPlan::find($request->id);
                if (!$subscription) {
                    return self::sentResponse(404, [], __('digimed_validation.error_response.data_not_found'));
                }
                $subscription->name = $request->name;
                $subscription->description = $request->description;
                $subscription->updated_by = $auth_id;
                $subscription->save();
            
                $subscriptionPrice = SubscriptionPrice::where('plan_id', $subscription->id)->first();
                if ($subscriptionPrice) {
                    $subscriptionPrice->amount = $request->price;
                    $subscriptionPrice->currency_code = $request->currency_code;
                    $subscriptionPrice->interval = $request->interval;
                    $subscriptionPrice->save();
                }
                return self::sentResponse(200, [], __('digimed_validation.success_response.subscription_edit_success'));
            } else{
                $subscription = new SubscriptionPlan();
                $subscription->name = $request->name;
                $subscription->description = $request->description;
                $subscription->created_by = $auth_id;
                $subscription->save();

                $subscriptionPrice = new SubscriptionPrice();
                $subscriptionPrice->plan_id = $subscription->id;
                $subscriptionPrice->amount = $request->price;
                $subscriptionPrice->currency_code = $request->currency_code;
                $subscriptionPrice->interval = $request->interval;
                $subscriptionPrice->save();
                return self::sentResponse(200, [], __('digimed_validation.success_response.subscription_add_success'));
            }
            }catch(Exception | Throwable | QueryException $e){
                return self::sentResponse(500, [], $e->getMessage());
            }
        }
    
        //subscription details add/edit

        public function subscriptionDetailsAddEdit(Request $request)
        {
        try {
            $rules = [               
                'plan_id' => 'required',
                'title' => 'required',
                'content' => 'required',
                'status' => 'required|in:0,1',
                'important' => 'required|in:0,1'
            ];
            $messages = [
                'plan_id.required' => __('digimed_validation.form_validation_error.plan_id_req'),
                'title.required' => __('digimed_validation.form_validation_error.title_required'),
                'content.required' => __('digimed_validation.form_validation_error.content_required'),
                'status.required' => __('digimed_validation.form_validation_error.status_required'),
                'important.required' => __('digimed_validation.form_validation_error.important_required'),
            ];

            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            }

            /** @var object $this */
            $authRole = Auth::user();
            $auth_id = auth()->user()->id;

            $isUpdate = isset($request->subscription_details_id) ? true : false;
          
            /**
             * @var string $name
             * @var string $description
             */
            if($isUpdate){
            // Update existing subscription
                $subscriptionDetail = SubscriptionDetail::find($request->subscription_details_id);
                if (!$subscriptionDetail) {
                    return self::sentResponse(404, [], __('digimed_validation.error_response.data_not_found'));
                }
                $subscriptionDetail->plan_id = $request->plan_id;
                $subscriptionDetail->title = $request->title;
                $subscriptionDetail->content = $request->content;
                $subscriptionDetail->status = $request->status;
                $subscriptionDetail->important = $request->important;
                $subscriptionDetail->updated_by = $auth_id;

                $subscriptionDetail->save();
            
                return self::sentResponse(200, [], __('digimed_validation.success_response.subscriptiondetails_edit_success'));
            } else{
                $subscriptionDetail = new SubscriptionDetail();
                $subscriptionDetail->plan_id = $request->plan_id;
                $subscriptionDetail->title = $request->title;
                $subscriptionDetail->content = $request->content;
                $subscriptionDetail->status = $request->status;
                $subscriptionDetail->important = $request->important;
                $subscriptionDetail->created_by = $auth_id;
                $subscriptionDetail->save();

                return self::sentResponse(200, [], __('digimed_validation.success_response.subscriptiondetails_add_success'));
            }
            }catch(Exception | Throwable | QueryException $e){
                return self::sentResponse(500, [], $e->getMessage());
            }
        }
    

        //fetch Sucbscription by ID
        public function fetchSubscriptionPlan(Request $request)
        {
            try {
                $rules = [               
                    'subscription_id' => 'required'
                ];
                $messages = [
                    'subscription_id.required' => __('digimed_validation.form_validation_error.name_req'),
                ];
    
                $validator = Validator::make($request->all(), $rules, $messages);
    
                if ($validator->fails()) {
                    return self::sentResponse(422, [], $validator->errors()); 
                }
                
                $subscription_details = SubscriptionPlan::where('id',$request->subscription_id)->with(['subscriptionDetails','priceDetails' => function($q){
                    $q->where('status','active');
                }])->get();

                return self::sentResponse(200, $subscription_details, __('digimed_validation.success_response.data_fetch_success'));
            
            }catch(Exception | Throwable | QueryException $e){
                return self::sentResponse(500, [], $e->getMessage());
            }
        }

        //subscription History
        public function subscriptionHistory(Request $request)
        {
            try {
                $subscription_history = Subscription::with(['subscriberDetails:id,first_name,last_name,profile_image','subscriptionPlanDetails' => function ($query) { // Specify fields from subscriptionPlanDetails
                    $query->select('id', 'name');
                },'subscriptionPriceDetails'])->get();

                return self::sentResponse(200, $subscription_history, __('digimed_validation.success_response.data_fetch_success'));

            }catch(Exception | Throwable | QueryException $e){
                return self::sentResponse(500, [], $e->getMessage());
            }
        }

        //Patient Subscription
        public function subscribe(Request $request){
        try {
            $rules = [               
                'plan_id' => 'required',
                'price_id' => 'required'//0-Free Acount 
            ];
            $messages = [
              
                'plan_id.required'       => __('digimed_validation.form_validation_error.plan_id_req'),
                'price_id.required' => __('digimed_validation.form_validation_error.price_id_req'), 
            ];
            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            } 
            $auth_id = auth()->user()->id;

            $checkSubscription = Subscription::where('user_id',$auth_id)->where('status','1')->first();
           
            if($checkSubscription){
             
                $checkSubscription->status = '0';
                $checkSubscription->update();
            }
            $subscription = new Subscription();
            $subscription->user_id = $auth_id;
            $subscription->price_id = $request->price_id;
            $subscription->plan_id = $request->plan_id;
            $subscription->created_by = $auth_id;
            $subscription->save();
            return self::sentResponse(200, [], __('digimed_validation.error_response.user_subscribed_success'));         
        }
        catch(Exception | Throwable | QueryException $e){
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function userSubscriptionDetails(Request $request){
        try {
           
            $auth_id = auth()->user()->id;
           
            $subscription_history = Subscription::where('user_id',$auth_id)->where('status','1')->with(['subscriptionPlanDetails' => function ($query) { // Specify fields from subscriptionPlanDetails
                $query->select('id', 'name');
            },'subscriptionPriceDetails'])->get()->toArray();
        
            if (empty($subscription_history)) {
                $data[] = [
                    'subscription_plan_name' => "Free account",
                    'subscription_amount' => "-",
                    'currency_code' => "-",
                    'next_due' => "-"
                ];
                return self::sentResponse(200, $data, __('digimed_validation.error_response.user_subscribed_details'));  
            }
    
            $createdAt = $subscription_history[0]['created_at'];
         
            $date = new \DateTime($createdAt);

            $interval = $subscription_history[0]['subscription_price_details']['interval'] ?? null;

            if ($interval === 'year') {
                $date->modify('+365 days');
            } elseif ($interval === 'month') {
                $date->modify('+30 days');
            } elseif ($interval === 'week') {
                $date->modify('+7 days');
            } elseif ($interval === 'day') {
                $date->modify('+1 day');
            } else {
                return self::sentResponse(400, [], __('digimed_validation.error_response.invalid_interval'));
            }
            $nextDue = $date->format('Y-m-d');

            // Populate subscription details
        $data[] = [
            'subscription_plan_name' => $subscription_history[0]['subscription_plan_details']['name'] ?? 'N/A',
            'subscription_amount' => $subscription_history[0]['subscription_price_details']['amount'] ?? '-',
            'currency_code' => $subscription_history[0]['subscription_price_details']['currency_code'] ?? '-',
            'next_due' => $nextDue
        ];

            return self::sentResponse(200, $data, __('digimed_validation.error_response.user_subscribed_details'));         
        }
        catch(Exception | Throwable | QueryException $e){
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function subscriptionCancel(Request $request)
    {
        try {
            /** @var object $this */
            /** @var \App\User $authRole */
            $authRole = Auth::user();
            $auth_id = auth()->user()->id;
           
            $data = Subscription::where('user_id',$auth_id)->where('status','1')->latest()->first();

            if(!empty($data)) {
      
                if($data['status'] == '1') {
                    $data->status = '0';
                    $data->save();
                    return self::sentResponse(200, [], __('digimed_validation.success_response.subscription_cancel_success'));
                }
                return self::sentResponse(401, [], __('digimed_validation.error_response.subscription_not_found'));
            } else {
                return self::sentResponse(401, [], __('digimed_validation.error_response.stripe_id_not_exist'));
            }
        } catch(Exception | Throwable | QueryException $e){
            return self::sentResponse(500, [], $e->getMessage());
        }
    }
}