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/DispatchController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Log;
use Setting;
use Auth;
use Exception;
use Carbon\Carbon;
use App\Helpers\Helper;

use App\User;
use App\Dispatcher;
use App\Provider;
use App\ServiceType;
use App\UserRequests;
use App\RequestFilter;
use App\ProviderService;


class DispatchController extends Controller
{

    /**
     * Dispatcher Panel.
     *
     * @param  \App\Provider  $provider
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        if(Auth::guard('admin')->user()){
            $services = ServiceType::all();
            return view('admin.dispatch.dispatcher', compact('services'));
        }elseif(Auth::guard('dispatcher')->user()){
             $services = ServiceType::all();
            return view('dispatcher.dispatch.dispatcher', compact('services'));
        }
    }
    /**
     * Display a listing of the users in the application.
     *
     * @return \Illuminate\Http\Response
     */
    public function users_phone(Request $request)
    {
        $term=$request->term;
        $data = User::where('mobile','LIKE', '%'.$term.'%')
        ->take(10)->select('first_name','last_name','mobile','email')->get();
        $results=array();
        foreach ($data as $key => $value){
            $v = str_replace(Setting::get('country_code', '+91'),"",$value->mobile);
            $results[]=['value' => $v, 'email' => $value->email, 'first_name' => $value->first_name, 'last_name' => $value->last_name];
        }
        return response()->json($results);
    }
    /**
     * Display a listing of the users in the application.
     *
     * @return \Illuminate\Http\Response
     */
    public function users_email(Request $request)
    {
        $term=$request->term;
        $data = User::where('email','LIKE', $term.'%')
        ->take(10)
        ->select('first_name','last_name','mobile','email')->get();
        $results=array();
        foreach ($data as $key => $value){
            $v = str_replace(Setting::get('country_code', '+91'),"",$value->mobile);
            $results[]=['value' => $value->email, 'phone' => $v, 'first_name' => $value->first_name, 'last_name' => $value->last_name];
        }
        return response()->json($results);
    }
    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function map_ajax(Request $request)
    {
        try {
            $filters = explode(',', $request->filters);
            $Providers = Provider::join('provider_devices', 'providers.id', '=', 'provider_devices.provider_id')
                        ->join('provider_services', 'providers.id', '=', 'provider_services.provider_id')
                        ->where('providers.latitude','!=', 0)
                        ->where('providers.longitude', '!=', 0)
                        ->where('provider_devices.udid','!=','')
                        ->whereIn('provider_services.status', $filters)
                        ->whereIn('provider_services.status', array('active','riding','offline'))
                        ->select('providers.id','providers.first_name','providers.last_name','providers.latitude','providers.longitude','provider_services.status')
                        ->getQuery()
                        ->get();
            
            return $Providers;

        } catch (Exception $e) {
            return [];
        }
    }
    /**
     * Create manual request.
     *
     * @return \Illuminate\Http\Response
     */

    public function store(Request $request) {

        $this->validate($request, [
                's_latitude' => 'required|numeric',
                's_longitude' => 'required|numeric',
                'd_latitude' => 'required|numeric',
                'd_longitude' => 'required|numeric',
                'service_type' => 'required|numeric|exists:service_types,id',
                'distance' => 'required|numeric',
                'first_name' =>'required',
                'last_name' =>'required',
                'email' =>'required',
                'mobile' =>'required',
            ]);

        try {
            $mobile = Setting::get('country_code', '+91').$request->mobile;
            $User = User::where('mobile', $mobile)->firstOrFail();
        } catch (Exception $e) {
            try {
                $User = User::where('email', $request->email)->firstOrFail();
            } catch (Exception $e) {
                $User = User::create([
                    'first_name' => $request->first_name,
                    'last_name' => $request->last_name,
                    'email' => $request->email,
                    'mobile' => Setting::get('country_code', '+91').$request->mobile,
                    'password' => bcrypt($request->mobile),
                    'payment_mode' => 'CASH'
                ]);
            }
        }

        if($request->has('schedule_time')){
            try {
                $CheckScheduling = UserRequests::where('status', 'SCHEDULED')
                        ->where('user_id', $User->id)
                        ->where('schedule_at', '>', strtotime($request->schedule_time." - 1 hour"))
                        ->where('schedule_at', '<', strtotime($request->schedule_time." + 1 hour"))
                        ->firstOrFail();
                
                return trans('api.ride.request_scheduled');
                return response()->json(['message' => trans('api.ride.request_scheduled')]);
                
            } catch (Exception $e) {
                // Do Nothing
            }
        }

        if($request->has('schedule_time')){
            $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$request->s_latitude.",".$request->s_longitude."&destination=".$request->d_latitude.",".$request->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);

            $details = json_decode($json, TRUE);

            $route_key = $details['routes'][0]['overview_polyline']['points'];

            $UserRequest = new UserRequests;
            $UserRequest->booking_id = Helper::generate_booking_id();
            $UserRequest->user_id = $User->id;
            $UserRequest->current_provider_id = 0;
            $UserRequest->service_type_id = $request->service_type;
            $UserRequest->payment_mode = 'CASH';
            
            $UserRequest->status = 'SCHEDULED';
            $UserRequest->push = 'AUTO';
            $UserRequest->booking_by = 'DISPATCHER';

            $UserRequest->s_address = $request->s_address ? : "";
            $UserRequest->s_latitude = $request->s_latitude;
            $UserRequest->s_longitude = $request->s_longitude;

            $UserRequest->d_address = $request->d_address ? : "";
            $UserRequest->d_latitude = $request->d_latitude;
            $UserRequest->d_longitude = $request->d_longitude;
            $UserRequest->driver_message = $request->driver_message ? : "";
            $UserRequest->route_key = $route_key;

            $UserRequest->distance = $request->distance;

            $UserRequest->assigned_at = Carbon::now();

            $UserRequest->use_wallet = 0;
            $UserRequest->surge = 0;        // Surge is not necessary while adding a manual dispatch
            $UserRequest->schedule_at = Carbon::parse($request->schedule_time);

            $UserRequest->save();
           
           return response()->json(['message' => 'Scheduled Trip created Successfully','id'=>$UserRequest->id]);
        }

        try{

            $details = "https://maps.googleapis.com/maps/api/directions/json?origin=".$request->s_latitude.",".$request->s_longitude."&destination=".$request->d_latitude.",".$request->d_longitude."&mode=driving&key=".env('GOOGLE_MAP_KEY');

            $json = curl($details);

            $details = json_decode($json, TRUE);

            $route_key = $details['routes'][0]['overview_polyline']['points'];

            $UserRequest = new UserRequests;
            $UserRequest->booking_id = Helper::generate_booking_id();
            $UserRequest->user_id = $User->id;
            $UserRequest->current_provider_id = 0;
            $UserRequest->service_type_id = $request->service_type;
            $UserRequest->payment_mode = 'CASH';
            
            $UserRequest->status = 'SEARCHING';
            $UserRequest->booking_by = 'DISPATCHER';
            
            $UserRequest->s_address = $request->s_address ? : "";
            $UserRequest->s_latitude = $request->s_latitude;
            $UserRequest->s_longitude = $request->s_longitude;

            $UserRequest->d_address = $request->d_address ? : "";
            $UserRequest->d_latitude = $request->d_latitude;
            $UserRequest->d_longitude = $request->d_longitude;
            $UserRequest->driver_message = $request->driver_message ? : "";
            $UserRequest->route_key = $route_key;

            $UserRequest->distance = $request->distance;

            $UserRequest->assigned_at = Carbon::now();

            $UserRequest->use_wallet = 0;
            $UserRequest->surge = 0;        // Surge is not necessary while adding a manual dispatch

            if($request->has('schedule_time')) {
                $UserRequest->schedule_at = Carbon::parse($request->schedule_time);
            }

            $UserRequest->save();

            if($request->has('provider_auto_assign')) {
                $distance = Setting::get('provider_search_radius', '10');
                $latitude = $request->s_latitude;
                $longitude = $request->s_longitude;
                
                $Active_fav =[];
                $exists_driver = $User->favourite_driver;
                if(!empty($exists_driver)){
                    $drivers = explode(',', $exists_driver);
                    $Active_fav = ProviderService::whereIn('provider_id', $drivers)
                        ->where('service_type_id', $request->service_type)
                        ->where('status', 'active')->get()
                        ->pluck('provider_id')->toArray();
                }

                $Active_base = ProviderService::where('service_type_id', $request->service_type)
                        ->where('status', 'active')->get()
                        ->pluck('provider_id')->toArray();

                $ActiveProviders = array_unique (array_merge ($Active_fav, $Active_base));

                $Providers = Provider::whereIn('id', $ActiveProviders)
                    ->where('status', 'approved')
                    ->selectRaw("* , (1.609344 * 3956 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) AS distance")
                    ->having('distance', '<', $distance)
                    ->orderBy('distance') 
                    ->get();

                // List Providers who are currently busy and add them to the filter list.

                if(count($Providers) == 0) {

                    $UserRequest->status = 'CANCELLED';
                    $UserRequest->cancelled_by = 'NODRIVER';
                    $UserRequest->save();

                    return response()->json(['message' => 'No Providers Found! Please try again','id'=>$UserRequest->id]);
                }

                $Providers[0]->service()->update(['status' => 'riding']);

                $UserRequest->current_provider_id = $Providers[0]->id;
                $UserRequest->save();

                Log::info('New Dispatch : ' . $UserRequest->id);
                Log::info('Assigned Provider : ' . $UserRequest->current_provider_id);

                // Incoming request push to provider
                (new SendPushNotification)->IncomingRequest($UserRequest->current_provider_id);

                foreach ($Providers as $key => $Provider) {
                    $Filter = new RequestFilter;
                    $Filter->request_id = $UserRequest->id;
                    $Filter->provider_id = $Provider->id; 
                    $Filter->save();
                }
            }
            return response()->json(['message' => 'New Trip Created Successfully','id'=>$UserRequest->id]);

        } catch (Exception $e) {
            if($request->ajax()) {
                return response()->json(['message' => trans('api.something_went_wrong'), 'message' => $e], 500);
            }else{
                return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
            }
        }
    }
    public function viewtrip($request_id)
    {
           /*$trip = UserRequests::with('user', 'service_type')->findOrFail($request_id);*/
           $trip = UserRequests::with('service_type')->join('users', 'user_requests.user_id', '=', 'users.id')->select('users.first_name','users.last_name','users.mobile','user_requests.id','user_requests.s_address','user_requests.d_address','user_requests.s_latitude','user_requests.s_longitude','user_requests.service_type_id','user_requests.status','user_requests.distance','user_requests.payment_mode','user_requests.current_provider_id','user_requests.cancelled_by','user_requests.schedule_at','user_requests.created_at')->findOrFail($request_id);

           $currency =setting::get('currency');
           $diskm =setting::get('distance_unit');
        if($trip->current_provider_id ==0 || $trip->status =='CANCELLED'){

            $ActiveProviders = ProviderService::AllAvailableServiceProvider($trip->service_type_id)
                    ->get()
                    ->pluck('provider_id');

            $distance = Setting::get('provider_search_radius', '10');
            $latitude = $trip->s_latitude;
            $longitude = $trip->s_longitude;

            $Providers = Provider::whereIn('id', $ActiveProviders)
                ->where('status', 'approved')
                ->whereRaw("(1.609344 * 3956 * acos( cos( radians('$latitude') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('$longitude') ) + sin( radians('$latitude') ) * sin( radians(latitude) ) ) ) <= $distance")
                ->with('service', 'service.service_type')
                ->get();

            if(Auth::guard('admin')->user()){
                return view('admin.dispatch.view', compact('trip','currency','diskm','Providers'));
            }elseif(Auth::guard('dispatcher')->user()){
                return view('dispatcher.dispatch.view', compact('trip','currency','diskm','Providers'));
            }

        }else{
            if(Auth::guard('admin')->user()){
                return view('admin.dispatch.view', compact('trip','currency','diskm'));
            }elseif(Auth::guard('dispatcher')->user()){
                return view('dispatcher.dispatch.view', compact('trip','currency','diskm'));
            }
        }
        
    }
    /**
     * Create manual request.
     *
     * @return \Illuminate\Http\Response
     */
    public function assign($request_id, $provider_id)
    {
        try {
            $Request = UserRequests::findOrFail($request_id);
            $Provider = Provider::findOrFail($provider_id);
            if($Request->status =='CANCELLED'){
                $Request->provider_id = 0;
                $Request->cancelled_by ="NONE";
                $Request->cancel_reason ="";
                $Request->booking_by ="DISPATCHER";
                $Request->paid =0;
                $Request->assigned_at = Carbon::now();
                $Request->push = Null;
                $Request->schedule_at = Null;
                $Request->status ="SEARCHING";
            }
            $Request->current_provider_id = $Provider->id;
            $Request->save();
            ProviderService::where('provider_id', $Provider->id)->update(['status' =>'riding']);
            (new SendPushNotification)->IncomingRequest($Request->current_provider_id);

            try {
                RequestFilter::where('request_id', $Request->id)
                    ->where('provider_id', $Provider->id)
                    ->firstOrFail();
            } catch (Exception $e) {
                $Filter = new RequestFilter;
                $Filter->request_id = $Request->id;
                $Filter->provider_id = $Provider->id; 
                $Filter->save();
            }

            return response()->json(['message' => 'Request Assigned to Provider!']);

        } catch (Exception $e) {
            return response()->json(['message' => $e]);
        }
    }
    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function driver_list()
    {
        try {
            $drivers = Provider::join('provider_devices', 'providers.id', '=', 'provider_devices.provider_id')
                    ->join('provider_services', 'providers.id', '=', 'provider_services.provider_id')
                    ->join('service_types', 'provider_services.service_type_id', '=', 'service_types.id')
                    ->where('provider_devices.udid','!=','')
                    ->where('provider_services.status','!=','offline')
                    ->select('providers.id AS id','providers.first_name AS firstname', 'providers.last_name AS lastname', 'provider_services.service_number AS taxinumber', 'provider_services.status AS currentstatus', 'service_types.name AS servicename', 'provider_services.service_number AS servicenumber')
                    ->getQuery()
                    ->get();
                if(Auth::guard('admin')->user()){
                    return view('admin.dispatch.driver', compact('drivers'));
                }elseif(Auth::guard('dispatcher')->user()){
                    return view('dispatcher.dispatch.driver', compact('drivers'));
                }

        } catch (Exception $e) {
            return [];
        }
    }
    /**
     * Map of all Users and Drivers.
     *
     * @return \Illuminate\Http\Response
     */
    public function ride_list()
    {
        try {
            $trips = UserRequests::orderBy('assigned_at','desc')->paginate(100);
            if(Auth::guard('admin')->user()){
                return view('admin.dispatch.ride', compact('trips'));
            }elseif(Auth::guard('dispatcher')->user()){
                return view('dispatcher.dispatch.ride', compact('trips'));
            }

        } catch (Exception $e) {
            return [];
        }
    }
}