HEX
Server: Apache/2.4.41 (Amazon) OpenSSL/1.0.2k-fips PHP/5.6.40
System: Linux ip-172-31-40-18 4.14.146-93.123.amzn1.x86_64 #1 SMP Tue Sep 24 00:45:23 UTC 2019 x86_64
User: apache (48)
PHP: 5.6.40
Disabled: NONE
Upload Files
File: //var/www/html/punjabcabs/Original_Backup/app/Http/Controllers/ProviderResources/TripController.php
<?php

namespace App\Http\Controllers\ProviderResources;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Log;
use Auth;
use Setting;
use Carbon\Carbon;
use App\Helpers\Helper;
use App\Http\Controllers\SendPushNotification;
use Twilio;
use Mail;
use Validator;

use App\User;
use App\Admin;
use App\Fleet;
use App\Provider;
use App\ProviderContacts;
use App\Promocode;
use App\UserRequests;
use App\RequestFilter;
use App\PromocodeUsage;
use App\ProviderService;
use App\UserRequestRating;
use App\UserRequestPayment;
use App\ServiceType;
use App\ProviderDevice;

use App\Waypoint;

class TripController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {

        try{
            if($request->ajax()) {
                $Provider = Auth::user();
            } else {
                $Provider = Auth::guard('provider')->user();
            }

            $provider = $Provider->id;

            $checker = ProviderDevice::where('provider_id',$provider)->first();
            if($checker->udid =='' && $checker->token ==''){
                return response()->json(['error' => 'You are logged out by admin'], 401);
            }

            if(!empty($request->latitude)) {
                $Provider->where('id',$provider)->update([
                        'latitude' => $request->latitude,
                        'longitude' => $request->longitude,
                        'updated_at' => Carbon::now()
                ]);
            }

            $AfterAssignProvider = RequestFilter::with(['request.user', 'request.payment', 'request'])
                ->where('provider_id', $provider)
                ->whereHas('request', function($query) use ($provider) {
                        $query->where('status','<>', 'CANCELLED');
                        $query->where('provider_id', $provider );
                        $query->where('current_provider_id', $provider);
                    });

            $BeforeAssignProvider = RequestFilter::with(['request.user', 'request.payment', 'request'])
                ->where('provider_id', $provider)
                ->whereHas('request', function($query) use ($provider){
                        $query->where('status','<>', 'CANCELLED');
                        $query->where('current_provider_id',$provider);
                    });

            $IncomingRequests = $BeforeAssignProvider->union($AfterAssignProvider)->get();

            $Timeout = Setting::get('provider_select_timeout', 180);
            if(!empty($IncomingRequests)){
                for ($i=0; $i < sizeof($IncomingRequests); $i++) {
                    $IncomingRequests[$i]->time_left_to_respond = $Timeout - (time() - strtotime($IncomingRequests[$i]->request->assigned_at));
                    if(($IncomingRequests[$i]->request->status == 'SEARCHING' || $IncomingRequests[$i]->request->status == 'SCHEDULED') && $IncomingRequests[$i]->time_left_to_respond < 0) {
                        $this->assign_next_provider($IncomingRequests[$i]->request->id);
                    }
                }
            }

            $edit_tripfare = Setting::get('fare_edit', 0);
            $toll_charge = Setting::get('toll_charge', 0);    
            $Response = [
                    'account_status' => $Provider->status,
                    'service_status' => $Provider->service ? Auth::user()->service->status : 'offline',
                    'requests' => $IncomingRequests,
                    'edit_tripfare' => $edit_tripfare,
                    'toll_enable' => $toll_charge,
                    'number_plate' =>$Provider->service ? Auth::user()->service->service_number : ''
                ];

            return $Response;
        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => 'Something went wrong']);
        }
    }

    /**
     * Cancel given request.
     *
     * @return \Illuminate\Http\Response
     */
    public function cancel(Request $request)
    {
        $this->validate($request, [
            'cancel_reason'=> 'max:255',
        ]);
        try{

            $UserRequest = UserRequests::findOrFail($request->id);
            $Cancellable = ['SEARCHING', 'ACCEPTED', 'ARRIVED', 'STARTED', 'CREATED','SCHEDULED'];

            if(!in_array($UserRequest->status, $Cancellable)) {
                return back()->with(['flash_error' => 'Cannot cancel request at this stage!']);
            }

            $UserRequest->status = "CANCELLED";
            $UserRequest->cancel_reason = $request->cancel_reason;
            $UserRequest->cancelled_by = "PROVIDER";
            $UserRequest->save();

             RequestFilter::where('request_id', $UserRequest->id)->delete();

             ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' =>'active']);
             //User::where('id', $UserRequest->user_id)->update(['trip_status' => 0]);
             // Send Push Notification to User
            (new SendPushNotification)->ProviderCancellRide($UserRequest);
             /*$result = UserRequests::with('user')
                        ->where('id', '=', $request->id)
                        ->get();
            return $result;*/
            return $UserRequest;

        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => 'Something went wrong']);
        }


    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function rate(Request $request, $id)
    {

        $this->validate($request, [
                'rating' => 'required|integer|in:1,2,3,4,5',
                'comment' => 'max:255',
            ]);
    
        try {

            $UserRequest = UserRequests::where('id', $id)
                ->where('status', 'COMPLETED')
                ->firstOrFail();

            if($UserRequest->rating == null) {
                UserRequestRating::create([
                        'provider_id' => $UserRequest->provider_id,
                        'user_id' => $UserRequest->user_id,
                        'request_id' => $UserRequest->id,
                        'provider_rating' => $request->rating,
                        'provider_comment' => $request->comment,
                    ]);
            } else {
                $UserRequest->rating->update([
                        'provider_rating' => $request->rating,
                        'provider_comment' => $request->comment,
                    ]);
            }

            $UserRequest->update(['provider_rated' => 1]);

            // Delete from filter so that it doesn't show up in status checks.
            RequestFilter::where('request_id', $id)->delete();

            ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' =>'active']);

            // Send Push Notification to Provider 
            $average = UserRequestRating::where('provider_id', $UserRequest->provider_id)->avg('provider_rating');

            $UserRequest->user->update(['rating' => $average]);

            return response()->json(['message' => 'Request Completed!']);

        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => 'Request not yet completed!'], 500);
        }
    }

    /**
     * Get the trip history of the provider
     *
     * @return \Illuminate\Http\Response
     */
    public function ongoing(Request $request)
    {
        
        try{

            $Jobs = UserRequests::where('provider_id', Auth::user()->id)
                    ->where('status','!=', 'COMPLETED')
                    ->where('status','!=', 'CANCELLED')
                    ->with('service_type')
                    ->get();

            return $Jobs;
            
        } catch(Exception $e) {
            return response()->json(['error' => "Something Went Wrong"]);
        }
    }

    /**
     * Get the trip history of the provider
     *
     * @return \Illuminate\Http\Response
     */
    public function history(Request $request)
    {
        if($request->ajax()) {

            $Jobs = UserRequests::where('provider_id', Auth::user()->id)
                    ->whereIn('status', ['CANCELLED','COMPLETED'])
                    ->whereBetween('created_at', [Carbon::now()->startOfWeek(),Carbon::now()->endOfWeek()])
                    ->orderBy('created_at','desc')
                    ->with('payment')
                    ->get();

            return $Jobs;
        }
        $Jobs = UserRequests::where('provider_id', Auth::guard('provider')->user()->id)->with('user', 'service_type', 'payment', 'rating')->get();
        return view('provider.trip.index', compact('Jobs'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function accept(Request $request, $id)
    {
        try {

            $UserRequest = UserRequests::findOrFail($id);

            if($UserRequest->status != "SEARCHING" && $UserRequest->status != "SCHEDULED") {
                return response()->json(['error' => 'Request already under progress!']);
            }
            
            $UserRequest->provider_id = Auth::user()->id;

            if($UserRequest->schedule_at != ""){

                $beforeschedule_time = strtotime($UserRequest->schedule_at."- 1 hour");
                $afterschedule_time = strtotime($UserRequest->schedule_at."+ 1 hour");

                $CheckScheduling = UserRequests::where('status','SCHEDULED')
                            ->where('provider_id', Auth::user()->id)
                            ->whereBetween('schedule_at',[$beforeschedule_time,$afterschedule_time])
                            ->count();

                if($CheckScheduling > 0 ){
                    if($request->ajax()) {
                        return response()->json(['error' => trans('api.ride.request_already_scheduled')]);
                    }else{
                        return redirect('dashboard')->with('flash_error', 'If the ride is already scheduled then we cannot schedule/request another ride for the after 1 hour or before 1 hour');
                    }
                }

                RequestFilter::where('request_id',$UserRequest->id)->where('provider_id',Auth::user()->id)->update(['status' => 2]);

                $UserRequest->status = "SCHEDULED";
                $UserRequest->save();
            }


                $UserRequest->status = "STARTED";
                $UserRequest->accepted_at = Carbon::now();
                $UserRequest->save();
                ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' =>'riding']);

                $Filters = RequestFilter::where('request_id', $UserRequest->id)->where('provider_id', '!=', Auth::user()->id)->get();
                // dd($Filters->toArray());
                foreach ($Filters as $Filter) {
                    $Filter->delete();
                }
            

            $UnwantedRequest = RequestFilter::where('request_id','!=' ,$UserRequest->id)
                                ->where('provider_id',Auth::user()->id )
                                ->whereHas('request', function($query){
                                    $query->where('status','<>','SCHEDULED');
                                });

            if($UnwantedRequest->count() > 0){
                $UnwantedRequest->delete();
            }  

            // Send Push Notification to User
            (new SendPushNotification)->RideAccepted($UserRequest);

            //sms and email----------------
            $user = UserRequests::with('user','provider','provider_service')->findOrFail($id);
            if($user->booking_by != 'STREET'){
                if(Setting::get('mail_enable', 0) == 1) {
                    Mail::send('emails.request-accept', ['user' => $user], function ($message) use ($user){
                        $message->to($user->user->email, $user->user->first_name)->subject(config('app.name').' Trip Confirmation');
                    });
                }
            }
            if(Setting::get('sms_enable', 0) == 1) {
                $mobile = $user->user->mobile;
                $message = 'Your trip has been accepted and Driver will arrive to your location shortly. Driver Name:'.$user->provider->first_name.''.$user->provider->last_name.', Mobile Number:'.$user->provider->mobile.', Taxi Number:'.$user->provider_service->service_number.'. Regards '.config('app.name'); 
                try {
                        Twilio::message($mobile, $message);
                    } catch ( \Services_Twilio_RestException $e ) {
                        //return $e->getMessage();  
                    }
            }
            //---------------------

            //$UserRequests = UserRequests::with('user')->findOrFail($id);
            //return $UserRequests;
            $result = UserRequests::with('user')
                        ->where('id', '=', $id)
                        ->get();
            return $result;

        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => 'Unable to accept, Please try again later']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Connection Error']);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $this->validate($request, [
              'status' => 'required|in:ACCEPTED,STARTED,ARRIVED,PICKEDUP,DROPPED,PAYMENT,COMPLETED,END',
           ]);

        try{

            $UserRequest = UserRequests::with('user')->findOrFail($id);
            if($request->status == 'END' && $UserRequest->status =='PICKEDUP'){
                $validator = Validator::make($request->all(), [
                    'latitude' =>'required',
                    'longitude' =>'required',
                ]);
                if($validator->fails()) {
                    return response()->json(['message'=>$validator->errors()->first(), 'success' =>0], 200);
                }
                $details = "https://maps.googleapis.com/maps/api/geocode/json?latlng=".$request->latitude.",".$request->longitude."&sensor=false&key=".env('GOOGLE_MAP_KEY');
                $json = curl($details);
                $details = json_decode($json, TRUE);
                if($details['status'] =='OK'){
                    $UserRequest->d_address = $details['results'][0]['formatted_address'];
                    $UserRequest->d_latitude = $request->latitude;
                    $UserRequest->d_longitude = $request->longitude;
                }
                if(preg_match("/(?:[01]\d|2[0123]):(?:[012345]\d):(?:[012345]\d)/", $request->waiting_time)) {
                    $UserRequest->waiting_time = $request->waiting_time;
                }
                $UserRequest->finished_at = Carbon::now();
                $UserRequest->status = $request->status;
                if($request->has('waypoints')){
                Waypoint::create([
                        'request_id' => $UserRequest->id,
                        'coordinates' => $request->waypoints,
                    ]);
                }
            }
            if($request->status == 'DROPPED' && $UserRequest->status =='END'){
                $UserRequest->status = $request->status;
            }
            /*if ($request->status == 'COMPLETED' && $UserRequest->payment_mode == 'CASH') {
                $UserRequest->status = $request->status;
                $UserRequest->paid = 1;
                ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' =>'active']);
                
            }*/
            if ($request->status == 'COMPLETED' && $UserRequest->status =='DROPPED') {
                if($UserRequest->payment_mode == 'CASH'){
                    $UserRequest->paid = 1;
                }
                $UserRequest->status = $request->status;
                ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' =>'active']);
                if($UserRequest->payment_mode == 'CARD' && $UserRequest->booking_by != 'STREET'){
                   app(\App\Http\Controllers\PaymentController::class)->trip_payment($id,$UserRequest->user->id);
                }
                User::where('id',$UserRequest->user_id)->increment('cancel_points');   
            }
            if($request->status == 'ARRIVED'){
                $UserRequest->status = $request->status;
                (new SendPushNotification)->Arrived($UserRequest);
            }

            if($request->status == 'PICKEDUP' && ($UserRequest->status =='SEARCHING' || $UserRequest->status =='ARRIVED')){
                $validator = Validator::make($request->all(), [
                    'latitude' =>'required',
                    'longitude' =>'required',
                ]);
                if($validator->fails()) {
                    return response()->json(['message'=>$validator->errors()->first(), 'success' =>0], 200);
                }
                if($request->has('latitude')){ 
                    $details = "https://maps.googleapis.com/maps/api/geocode/json?latlng=".$request->latitude.",".$request->longitude."&sensor=false&key=".env('GOOGLE_MAP_KEY');
                    $json = curl($details);
                    $details = json_decode($json, TRUE);
                    if($details['status'] =='OK'){
                        $UserRequest->s_address = $details['results'][0]['formatted_address'];
                        $UserRequest->s_latitude = $request->latitude;
                        $UserRequest->s_longitude = $request->longitude;
                    }
                }
                $UserRequest->status = $request->status;
                $UserRequest->provider_id = Auth::user()->id;
                ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' =>'riding']);
                $UserRequest->started_at = Carbon::now();
            }

            $UserRequest->save();

            if($request->status == 'END' && $UserRequest->status =='END'){
                $checker = $request->status;
                $UserRequest->invoice = $this->invoice($id,$checker);
            }
            if($request->status == 'DROPPED' && $UserRequest->status =='DROPPED'){
                $checker = $request->status;
                $UserRequest->invoice = $this->invoice($id,$checker);
            }
            //sms and email----------------
            if($request->status == 'COMPLETED' && $UserRequest->status =='DROPPED') {
            $UserRequest = UserRequests::with('user','payment')->findOrFail($id);
            $user = UserRequests::with('user','provider','provider_service','payment')->findOrFail($id);
            if($user->booking_by != 'STREET'){
                if(Setting::get('mail_enable', 0) == 1) {
                    Mail::send('emails.request-complete', ['user' => $user], function ($message) use ($user){
                        $message->to($user->user->email, $user->user->first_name)->subject(config('app.name').' Trip Completed');
                    });
                }
            }
            if(Setting::get('sms_enable', 0) == 1) {
                $mobile = $user->user->mobile;
                $message = 'Your trip has been completed successfully. Thanks for riding with '.config('app.name').' Pickup Location:'.$user->s_address.', Drop Location:'.$user->d_address.', Distance:'.$user->payment->distance.', Fare:'.$user->payment->total.', Payment Mode:'.$user->payment_mode.', Time:'.$user->finished_at.'. Regards '.config('app.name');

                    try {
                        Twilio::message($mobile, $message);
                    } catch ( \Services_Twilio_RestException $e ) {
                        //return $e->getMessage();  
                    }
            }

            }
            //---------------------
            // Send Push Notification to User
       
            return $UserRequest;

        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => 'Unable to update, Please try again later']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Connection Error']);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $UserRequest = UserRequests::find($id);

        try {
            $this->assign_next_provider($UserRequest->id);

            $result = UserRequests::with('user')
                        ->where('id', '=', $UserRequest->id)
                        ->get();
            return $result;

        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => 'Unable to reject, Please try again later']);
        } catch (Exception $e) {
            return response()->json(['error' => 'Connection Error']);
        }
    }

    public function assign_next_provider($request_id) {

        try {

            $UserRequest = UserRequests::findOrFail($request_id);
            $RequestFilter = RequestFilter::where('provider_id', $UserRequest->current_provider_id)
            ->where('request_id', $UserRequest->id)
            ->delete();
            ProviderService::where('provider_id',$UserRequest->current_provider_id)->update(['status' =>'active']);

            $next_provider = RequestFilter::where('request_id', $UserRequest->id)
                            ->join('provider_services','request_filters.provider_id','=','provider_services.provider_id')
                            ->where('provider_services.status','=','active')
                            ->select('request_filters.*','provider_services.status as driver_status')
                            ->orderBy('id')
                            ->first();

            if($next_provider !=null){
                $UserRequest->current_provider_id = $next_provider->provider_id;
                $UserRequest->assigned_at = Carbon::now();
                $UserRequest->save();
                ProviderService::where('provider_id',$next_provider->provider_id)->update(['status' =>'riding']);
                // incoming request push to provider
                (new SendPushNotification)->IncomingRequest($next_provider->provider_id);
            }else{
                UserRequests::where('id', $UserRequest->id)->update(['status' => 'CANCELLED','cancelled_by' => 'REJECTED']);
                RequestFilter::where('request_id', $UserRequest->id)->delete();

                //  request push to user provider not available
                (new SendPushNotification)->ProviderNotAvailable($UserRequest->user_id);
            }                

        } catch (ModelNotFoundException $e) {
            // Cancelled between update.
            return false;
        }

    }

    public function invoice($request_id,$checker)
    {
        try {
            if($checker =='END'){
                $UserRequest = UserRequests::findOrFail($request_id);
                $tax_percentage = Setting::get('tax_percentage', 0);
                $commission_enable = Setting::get('commission_enable', 0);
                $commission_percentage = Setting::get('commission_percentage', 0);
                $service_type = ServiceType::findOrFail($UserRequest->service_type_id);
                $sro_fare = Setting::get('sro_levy', 0);

                $Points = Waypoint::where('request_id', $UserRequest->id)->first();
                if($Points != null){
                    $coordinates = json_decode($Points->coordinates);
                    $splits = array_chunk($coordinates, 10);
                    $meter = 0;
                    $seconds = 0;
                    $route_key ='';
                    foreach ($splits as $coordinates){
                        $origin = $coordinates[0];
                        $des = end($coordinates);
                        $waypoints = implode('|via:', $coordinates);
                        $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$origin."&destination=".$des."&waypoints=via:".$waypoints."&mode=driving&key=".env('GOOGLE_MAP_KEY');
                        $json = curl($details);
                        $details = json_decode($json, TRUE);

                        if($details['status'] != 'OK'){
                              $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$origin."&destination=".$des."&mode=driving&key=AIzaSyCKF3VWbqBX_3Q208jXRBk0gwElLDyLwJk";    
                              $json = curl($details);
                              $details = json_decode($json, TRUE);
                        }

                        $meter += $details['routes'][0]['legs'][0]['distance']['value'];
                        $seconds += $details['routes'][0]['legs'][0]['duration']['value'];
                        $route_key .= $details['routes'][0]['overview_polyline']['points'];
                    }
                }else{
                    $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$UserRequest->s_latitude.",".$UserRequest->s_longitude."&destination=".$UserRequest->d_latitude.",".$UserRequest->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');    
                        
                    $json = curl($details);

                    $details = json_decode($json, TRUE);

                    $meter = $details['routes'][0]['legs'][0]['distance']['value'];
                    $seconds = $details['routes'][0]['legs'][0]['duration']['value'];
                    $route_key = $details['routes'][0]['overview_polyline']['points'];
                }

                $route_key ='';
                
                $unit =Setting::get('distance_unit');
                
                if($unit =='km'){
                    $kilometer = $meter/1000;
                }else{
                    $base = $meter/1000;
                    $kilometer = $base * 0.62137119;
                }
                
                $kilometer = round($kilometer,2);
                $minutes = $seconds/60;

                UserRequests::where('id',$request_id)->update(['distance' => $kilometer, 'route_key'=>$route_key]);

                $Fixed = 0;
                $Distance = 0;
                $Discount = 0; // Promo Code discounts should be added here.
                $Wallet = 0;
                $Tax =0;
                $Commision = 0.00;
                $Waiting_fare =0.00;
                $booking_fare =0.00;

                $current = Carbon::now()->toTimeString();
                $today = Carbon::now();
                if(($today->day == '25' && $today->month == '12') || ($today->day == '26' && $today->month == '12') || ($today->day == '1' && $today->month == '1') || ($today->day == '31' && $today->month == '12' && $current > '18:00:00')){
                    $fare_flag = $service_type->p_flag;
                    $fare_distance = $service_type->p_distance;
                    $fare_booking = $service_type->p_booking;
                    $fare_waiting = $service_type->p_waiting;
                }else{
                    $currentday = Carbon::now()->format('l');
                    if($service_type->p_enable ==2 && ($current > $service_type->p_stime || $current < $service_type->p_etime )){
                        $fare_flag = $service_type->p_flag;
                        $fare_distance = $service_type->p_distance;
                        $fare_booking = $service_type->p_booking;
                        $fare_waiting = $service_type->p_waiting;
                        
                    }elseif((($currentday =='Friday' || $currentday=='Saturday') && $current > $service_type->p_stime) || (($currentday=='Saturday' || $currentday=='Sunday') && $current < $service_type->p_etime)){
                        $fare_flag = $service_type->p_flag;
                        $fare_distance = $service_type->p_distance;
                        $fare_booking = $service_type->p_booking;
                        $fare_waiting = $service_type->p_waiting;
                        
                    }elseif($current > $service_type->n_stime || $current > $service_type->n_etime){
                        $fare_flag = $service_type->n_flag;
                        $fare_distance = $service_type->n_distance;
                        $fare_booking = $service_type->n_booking;
                        $fare_waiting = $service_type->n_waiting;
                       
                    }else{
                        $fare_flag = $service_type->d_flag;
                        $fare_distance = $service_type->d_distance;
                        $fare_booking = $service_type->d_booking;
                        $fare_waiting = $service_type->d_waiting;
                    
                    } 
                }

                $Fixed = $fare_flag;
                if($kilometer > 1){
                    $kilometer1 = $kilometer - 1;
                    $Distance= ($kilometer1 * $fare_distance); 
                }
                
                $taxi = ProviderService::where('provider_id', $UserRequest->provider_id)->first();
                if($commission_enable ==1){
                    $Commision = ($Distance + $Fixed) * ( $commission_percentage/100 );
                    if($taxi->taxi_type == 1){
                        if($taxi->fleet_id != 0){
                            $commission_fleet = Fleet::find($taxi->fleet_id);
                            if($commission_fleet != null){
                               $commission_percentage = $commission_fleet->fleet_percentage;
                            }
                            $Commision = ($Distance + $Fixed) * ( $commission_percentage/100 );
                        }else{
                            $Commision = ($Distance + $Fixed) * ( $commission_percentage/100 );
                        }
                    }
                }
                if($UserRequest->booking_by =='STREET'){
                    $fare_booking =0.00;
                }
                
                $waiting_time = strtotime("1970-01-01 $UserRequest->waiting_time UTC");
                $Waiting_fare = $fare_waiting * ($waiting_time / 60);


                $Tax = $tax_percentage;

                $final_fare = $Fixed + $Distance + $Waiting_fare + $fare_booking + $sro_fare;
                
                $wheelchair_service = Setting::get('wheelchair_service',0);
                if($wheelchair_service != $UserRequest->service_type_id){
                    if($PromocodeUsage = PromocodeUsage::where('user_id','=',$UserRequest->user_id)->where('status','ADDED')->first()){
                        if($Promocode = Promocode::find($PromocodeUsage->promocode_id)){
                            if($Promocode->discount_type =='flat'){
                                 $Discount = $Promocode->discount;   
                            }else{
                                 $Discount = ($Promocode->discount /100) * $final_fare;
                            }
                        }
                        if($PromocodeUsage->usage ==1){
                            $PromocodeUsage->status ='USED';
                            $PromocodeUsage->save();
                        }else{
                            $PromocodeUsage->usage = $PromocodeUsage->usage-1;
                            $PromocodeUsage->save();
                        }
                    }
                }
            
                $Total = $final_fare - $Discount;

                if($UserRequest->payment_mode == 'CASH') {
                    $Total = round($Total,2);
                }
                if($Total < 0){
                    $Total = 0.00; // prevent from negative value
                }

                $Payment = new UserRequestPayment;
                $Payment->request_id = $UserRequest->id;
                $Payment->fixed = $Fixed;
                $Payment->distance = $Distance;
                $Payment->waiting_fare = $Waiting_fare;
                $Payment->commision = $Commision;
                $Payment->sro_fare = $sro_fare;
                $Payment->booking_fare = $fare_booking;
                $Payment->tax = $Tax;
                $Payment->total = abs($Total);
                if($Discount != 0 && $PromocodeUsage){
                    $Payment->promocode_id = $PromocodeUsage->promocode_id;
                }
                $Payment->discount = $Discount;
                $Payment->cash = abs($Total);
                $Payment->save();
                return $Payment;
            }
            // END status finish

            $UserRequest = UserRequests::findOrFail($request_id);
            $Payment = UserRequestPayment::where('request_id',$request_id)->first();

            $wheelchair_service = Setting::get('wheelchair_service',0);
            if($wheelchair_service == $UserRequest->service_type_id){
                $w_percent = Setting::get('wheelchair_discount',0);
                $w_discount = ($Payment->fixed + $Payment->distance) * ($w_percent/100);
                if($w_discount >= 60){
                    $w_discount = 60;
                }
                $Payment->discount = $w_discount;
                $Payment->promocode_id = 'Wheelchair Discount';
                $Payment->total = abs($Payment->total - $w_discount);
                $Payment->save();
            }
             
            $transaction_fare =0.00;
            if($UserRequest->payment_mode == 'CARD'){
                if(Setting::get('transaction_percentage') !=0) {
                    $transaction_percentage = Setting::get('transaction_percentage');
                    $transaction_fare = $Payment->total * ($transaction_percentage/100);
                    $Payment->transaction_fare = $transaction_fare;
                }
            }

            $Payment->total = $Payment->total + $transaction_fare;
            $Total = $Payment->total + $transaction_fare;

            if($UserRequest->use_wallet == 1 && $Total > 0){
                $User = User::find($UserRequest->user_id);
                $Wallet = $User->wallet_balance;

                if($Wallet != 0){

                    if($Total > $Wallet) {
                        $Payment->wallet = $Wallet;
                        $Payable = $Total - $Wallet;
                        User::where('id',$UserRequest->user_id)->update(['wallet_balance' => 0 ]);
                        $Payment->cash = abs($Payable);
                        $Payment->payment_id = 'WALLET';
                        $Payment->payment_mode = $UserRequest->payment_mode;
                        // charged wallet money push 
                        (new SendPushNotification)->ChargedWalletMoney($UserRequest->user_id,currency($Wallet));

                    } else {
                        $Payment->cash = 0;
                        $WalletBalance = $Wallet - $Total;
                        User::where('id',$UserRequest->user_id)->update(['wallet_balance' => $WalletBalance]);
                        $Payment->wallet = $Total;
                        
                        $Payment->payment_id = 'WALLET';
                        $Payment->payment_mode = $UserRequest->payment_mode;
                        
                        $UserRequest->paid = 1;
                        $UserRequest->status = 'DROPPED';
                        $UserRequest->save();

                        // charged wallet money push 
                        (new SendPushNotification)->ChargedWalletMoney($UserRequest->user_id,currency($Total));
                    }

                }

            } else {
                $Payment->cash = abs($Total);
            }

            $Payment->save();

            if($UserRequest->payment_mode != 'CASH') {
                $UserRequest->status = 'DROPPED';
            }
            if($UserRequest->booking_by =='DISPATCHER' || $UserRequest->booking_by =='STREET'){
                if($UserRequest->rating == null) {
                    UserRequestRating::create([
                            'provider_id' => $UserRequest->provider_id,
                            'user_id' => $UserRequest->user_id,
                            'request_id' => $UserRequest->id,
                            'user_rating' => 3,
                            'user_comment' => $UserRequest->booking_by.'RIDE',
                        ]);
                } else {
                    $UserRequest->rating->update([
                            'user_rating' => 3,
                            'user_comment' => $UserRequest->booking_by.'RIDE',
                        ]);
                }
                $UserRequest->user_rated = 1;
                $UserRequest->save();
                $average = UserRequestRating::where('provider_id', $UserRequest->provider_id)->avg('user_rating');
                Provider::where('id',$UserRequest->provider_id)->update(['rating' => $average]);
                User::where('id', $UserRequest->user_id)->update(['trip_status' => 0]);
            }
            return $Payment;

        } catch (ModelNotFoundException $e) {
            return false;
        }
    }
    public function additional_fare(Request $request)
    {
        $this->validate($request, [
                'request_id' => 'required|integer|exists:user_requests,id',
            ]);

        try {
            $UserRequest = UserRequests::findOrFail($request->request_id);
            if($UserRequest->status =='END'){
                $Payment = UserRequestPayment::where('request_id',$request->request_id)->first();
                $total = $Payment->total;
                if($request->has('airport_fee')){
                    if($Payment->airport_fare ==0.00){
                        $Payment->airport_fare = $request->airport_fee;
                        $Payment->total = $total + $request->airport_fee;  
                    }else{
                        $app_fare = $total - $Payment->airport_fare;
                        $Payment->airport_fare = $request->airport_fee;
                        $Payment->total = $app_fare + $request->airport_fee;
                    }
                }
                if($request->has('toll_fee')){
                    if($Payment->toll ==0.00){
                        $Payment->toll = $request->toll_fee;
                        $Payment->total = $total + $request->toll_fee;  
                    }else{
                        $app_fare = $total - $Payment->toll;
                        $Payment->toll = $request->toll_fee;
                        $Payment->total = $app_fare + $request->toll_fee;
                    }  
                }
                if($request->has('extra_fee')){
                    if($Payment->extra_fare ==0.00){
                        $Payment->extra_fare = $request->extra_fee;
                        $Payment->total = $total + $request->extra_fee;  
                    }else{
                        $app_fare = $total - $Payment->extra_fare;
                        $Payment->extra_fare = $request->extra_fee;
                        $Payment->total = $app_fare + $request->extra_fee;
                    }
                    if($request->has('extra_desc')){
                        $Payment->extra_desc = $request->extra_desc;
                    } 
                }
                if($request->has('lifting_fee')){
                    $wheelchair_service = Setting::get('wheelchair_service',0);
                    if($UserRequest->service_type_id != $wheelchair_service){
                        return response()->json(['message' => 'Lifting fee available only for wheelchair services']);
                    }
                    if($Payment->lifting_fare ==0.00){
                        $Payment->lifting_fare = $request->lifting_fee;
                        $Payment->total = $total + $request->lifting_fee;  
                    }else{
                        $app_fare = $total - $Payment->lifting_fare;
                        $Payment->lifting_fare = $request->lifting_fee;
                        $Payment->total = $app_fare + $request->lifting_fee;
                    } 
                }
                $Payment->save();
                return response()->json(['message' => 'Added successfully']);
            }
        } catch (ModelNotFoundException $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }

    }
    /**
     * Get the trip history details of the provider
     *
     * @return \Illuminate\Http\Response
     */
    public function history_details(Request $request)
    {
        $this->validate($request, [
                'request_id' => 'required|integer|exists:user_requests,id',
            ]);

        if($request->ajax()) {
            
            $Jobs = UserRequests::where('id',$request->request_id)
                                ->where('provider_id', Auth::user()->id)
                                ->with('payment','service_type','user','rating')
                                ->get();
            
            return $Jobs;
        }

    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */

    public function upcoming_trips() {
    
        try{
            $UserRequests = UserRequests::ProviderUpcomingRequest(Auth::user()->id)->get();
            return $UserRequests;
        }

        catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }
    }

    /**
     * Get the trip history details of the provider
     *
     * @return \Illuminate\Http\Response
     */
    public function ongoing_details(Request $request)
    {
        $this->validate($request, [
                'request_id' => 'required|integer|exists:user_requests,id',
            ]);

        if($request->ajax()) {
            
            $Jobs = UserRequests::where('id',$request->request_id)
                                ->where('provider_id', Auth::user()->id)
                                ->with('service_type','user')
                                ->get();
            return $Jobs;
        }

    }

    /**
     * Get the trip history details of the provider
     *
     * @return \Illuminate\Http\Response
     */
    public function summary(Request $request)
    {
        try{
            Carbon::setWeekStartsAt(Carbon::SUNDAY);
            $type = $request->type;
            
            if($request->ajax()) {
                $rides = UserRequests::where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today())->count();
                    $total = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today());
                            })
                        ->sum('total');
                    $commision = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today());
                            })
                        ->sum('commision');
                    $revenue = $total - $commision;
                    $cancel_rides = UserRequests::where('status','CANCELLED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today())->count();
                    $scheduled_rides = UserRequests::where('status','SCHEDULED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today())->count();

                if($type ==0){
                    $rides = UserRequests::where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today())->count();
                    $total = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today());
                            })
                        ->sum('total');
                    $commision = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today());
                            })
                        ->sum('commision');
                    $revenue = $total - $commision;
                    $cancel_rides = UserRequests::where('status','CANCELLED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today())->count();
                    $scheduled_rides = UserRequests::where('status','SCHEDULED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::today())->count();
                }elseif($type ==1){
                    $rides = UserRequests::where('provider_id', Auth::user()->id)->whereBetween('created_at', [Carbon::now()->startOfWeek(),Carbon::now()->endOfWeek()])->count();
                    $total = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->whereBetween('created_at', [Carbon::now()->startOfWeek(),Carbon::now()->endOfWeek()]);
                            })
                        ->sum('total');
                    $commision = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->whereBetween('created_at', [Carbon::now()->startOfWeek(),Carbon::now()->endOfWeek()]);
                            })
                        ->sum('commision');
                    $revenue = $total - $commision;
                    $cancel_rides = UserRequests::where('status','CANCELLED')->where('provider_id', Auth::user()->id)->whereBetween('created_at', [Carbon::now()->startOfWeek(),Carbon::now()->endOfWeek()])->count();
                    $scheduled_rides = UserRequests::where('status','SCHEDULED')->where('provider_id', Auth::user()->id)->whereBetween('created_at', [Carbon::now()->startOfWeek(),Carbon::now()->endOfWeek()])->count();
                }elseif($type ==2){
                    $rides = UserRequests::where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->month)->count();
                    $total = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->month);
                            })
                        ->sum('total');
                    $commision = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->month);
                            })
                        ->sum('commision');
                    $revenue = $total - $commision;    
                    $cancel_rides = UserRequests::where('status','CANCELLED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->month)->count();
                    $scheduled_rides = UserRequests::where('status','SCHEDULED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->month)->count();
                }elseif($type ==3){
                    $rides = UserRequests::where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->year)->count();
                    $total = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->year);
                            })
                        ->sum('total');
                    $commision = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->year);
                            })
                        ->sum('commision');
                    $revenue = $total - $commision;
                    $cancel_rides = UserRequests::where('status','CANCELLED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->year)->count();
                    $scheduled_rides = UserRequests::where('status','SCHEDULED')->where('provider_id', Auth::user()->id)->where('created_at', '>=', Carbon::now()->year)->count();
                }elseif($type ==4){
                    $rides = UserRequests::where('provider_id', Auth::user()->id)->count();
                    $total = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id);
                            })
                        ->sum('total');
                    $commision = UserRequestPayment::whereHas('request', function($query) use ($request) {
                                $query->where('provider_id', Auth::user()->id);
                            })
                        ->sum('commision');
                    $revenue = $total - $commision;
                    $cancel_rides = UserRequests::where('status','CANCELLED')->where('provider_id', Auth::user()->id)->count();
                    $scheduled_rides = UserRequests::where('status','SCHEDULED')->where('provider_id', Auth::user()->id)->count();
                }

                return response()->json([
                    'rides' => $rides, 
                    'revenue' => $revenue,
                    'cancel_rides' => $cancel_rides,
                    'scheduled_rides' => $scheduled_rides,
                ]);
            }

        } catch (Exception $e) {
            return response()->json(['error' => trans('api.something_went_wrong')]);
        }

    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function contact_list(Request $request){

        try{

            $Contacts = ProviderContacts::where('provider_id', Auth::user()->id)->get();
            return $Contacts;
            
        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function add_contact(Request $request){

        $this->validate($request, [
                'contact_name' => 'required',
                'contact_number' => 'required',
            ]);

        try{
            $checklist = ProviderContacts::where('provider_id',Auth::user()->id)
                        ->where('contact_number',$request->contact_number)
                        ->get();
            if(count($checklist) ==0){
                $Contact = new ProviderContacts;
                $Contact->provider_id = Auth::user()->id;
                $Contact->contact_name = $request->contact_name;
                $Contact->contact_number = $request->contact_number;
                $Contact->save();
                if($request->ajax()) {
                    return response()->json([
                            'message' => trans('api.new_contact_added'),
                            'contact_name' => $Contact->contact_name,
                            'contact_number' => $Contact->contact_number,
                            'status' =>200

                        ]);
                }
            }else{
                if($request->ajax()) {
                    return response()->json([
                            'message' => trans('api.contact_already_exists'),
                            'status' =>201
                        ]);
                }
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')],500);
            }
        }
    }

    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function delete_contact(Request $request){

        $this->validate($request, [
                'contact_number' => 'required',
            ]);

        try{

            $Contact = ProviderContacts::where('provider_id',Auth::user()->id)
                        ->where('contact_number',$request->contact_number)
                        ->delete();
            
            if($request->ajax()) {
                return response()->json([
                        'message' => trans('api.contact_deleted')
                    ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }

    /**
     * help Details.
     *
     * @return \Illuminate\Http\Response
     */

    public function help_details(Request $request){

        try{

            if($request->ajax()) {
                return response()->json([
                    'contact_number' => Setting::get('contact_number',''), 
                    'contact_email' => Setting::get('contact_email','')
                     ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * privacy Details.
     *
     * @return \Illuminate\Http\Response
     */
    public function privacy_policy(Request $request){

        try{

            if($request->ajax()) {
                return response()->json([
                    'privacy_policy' => Setting::get('page_privacy','')
                     ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }
    /**
     * privacy Details.
     *
     * @return \Illuminate\Http\Response
     */
    public function term_condition(Request $request){

        try{

            if($request->ajax()) {
                return response()->json([
                    'terms_conditions' => Setting::get('term_condition','')
                     ]);
            }

        }catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['error' => trans('api.something_went_wrong')]);
            }
        }
    }

}