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/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 DB;
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 = Auth::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 ($_SERVER['REQUEST_METHOD'] == 'GET') {
            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::user()->id)->with('user', 'service_type', 'payment', 'rating')->get();
            //$Jobs = UserRequests::where('provider_id', Auth::user()->id)->with('service_type')->get();
            return $Jobs;

            //$Jobs = UserRequests::where('provider_id', Auth::guard('provider')->user()->id)->with('user', 'service_type', 'payment', 'rating')->get();
            //$Provider = Auth::guard('provider')->user();
            //$Provider = Auth::user();
            //print_r($Provider);
            //die;
            //return response()->json(['status' => 'success', 'message' => '', 'data' => $Jobs]);
            //return view('provider.trip.index', compact('Jobs'));
        } else {
            $Jobs = array();
            try {
                $Jobs = UserRequests::where('provider_id', $request->input('providerId'))->with('user', 'service_type', 'payment', 'rating')->get();
                return response()->json(['status' => 'success', 'message' => '', 'data' => $Jobs]);
            } catch (Exception $e) {
                return response()->json(['status' => 'error', 'message' => 'Something Went Wrong', 'data' => $Jobs]);
            }
        }
    }
    /*NEW API STARTS*/
    /**
     * Cab Charge Summary of a provider
     *
     * @return \Illuminate\Http\Response
     */
    public function providerCabCharge(Request $request)
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            // $json = file_get_contents('php://input');
            // $inputData = json_decode($json);
            if ($request->input('providerId')) {
                $this->data = DB::table('payout_summary as psum')
                    ->select(
                        DB::raw('DISTINCT(psd.shift_total) as taxi_total'),
                        'psd.ride_summary_id as summaryId',
                        'psd.isPayOut as status',
                        'psum.process_date as date',
                        'p.id as providerId',
                        'p.first_name',
                        'p.last_name',
                        'ps.service_number as taxiNo',
                        'ps.certificate_number as dc'
                    )
                    ->join('payout_summary_details as psd', 'psd.ride_summary_id', '=', 'psum.id')
                    ->join('provider_services as ps', 'ps.certificate_number', '=', 'psd.driver_dc')
                    ->join('providers as p', 'p.id', '=', 'ps.provider_id')
                    ->where([
                        ['p.id', '=', $request->input('providerId')],
                    ])
                    ->orderBy('psum.process_date', 'desc')
                    ->get();
                return response()->json(['status' => 'success', 'message' => '', 'data' => $this->data]);
            } else {
                return response()->json(['status' => 'error', 'message' => 'Provider Id Missing', 'data' => $this->data]);
            }
        } else {
            return response()->json(['status' => 'error', 'message' => 'Must Be Post Method', 'data' => $this->data]);
        }
    }
    /**
     * Cab Charge Details of a provider
     *
     * @return \Illuminate\Http\Response
     */
    public function providerCabChargeDetails(Request $request)
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            if ($request->input('summaryId')) {
                $this->data = DB::table('payout_summary_details as psd')
                    ->select(
                        'psd.description',
                        'psd.charge',
                        'psd.eftpos',
                        'psd.i_hail as iHail',
                        'psd.e_ticket as eTicket',
                        'psd.isPayOut',
                        'psd.transactionId',
                        'psd.date',
                        'psd.time'
                    )
                    ->join('provider_services as ps', 'psd.driver_dc', '=', 'ps.certificate_number')
                    ->join('providers as p', 'p.id', '=', 'ps.provider_id')
                    ->where([
                        ['p.id', '=', $request->input('providerId')],
                        ['psd.ride_summary_id', '=', $request->input('summaryId')],
                    ])
                    ->get();
                return response()->json(['status' => 'success', 'message' => '', 'data' => $this->data]);
            } else {
                return response()->json(['status' => 'error', 'message' => 'Provider Id or Summary Id Missing', 'data' => $this->data]);
            }
        } else {
            return response()->json(['status' => 'error', 'message' => 'Must Be Post Method', 'data' => $this->data]);
        }
    }
    /*NEW API ENDS*/








    /**
     * 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')]);
            }
        }
    }
}