File: //var/www/html/punjabcabs/app/Http/Controllers/DispatcherController.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\UserRequests;
use App\RequestFilter;
use App\ProviderService;
class DispatcherController extends Controller
{
/**
* Dispatcher Panel.
*
* @param \App\Provider $provider
* @return \Illuminate\Http\Response
*/
public function index()
{
if(Auth::guard('admin')->user()){
return view('admin.dispatcher');
}elseif(Auth::guard('dispatcher')->user()){
return view('dispatcher.dispatcher');
}
}
/**
* Display a listing of the active trips in the application.
*
* @return \Illuminate\Http\Response
*/
public function trips(Request $request)
{
$Trips = UserRequests::with('user', 'provider')->orderBy('assigned_at','desc')->paginate(30);
return $Trips;
}
/**
* Display a listing of the users in the application.
*
* @return \Illuminate\Http\Response
*/
public function users(Request $request)
{
$Users = new User;
if($request->has('mobile')) {
$Users->where('mobile', 'like', $request->mobile."%");
}
if($request->has('first_name')) {
$Users->where('first_name', 'like', $request->first_name."%");
}
if($request->has('last_name')) {
$Users->where('last_name', 'like', $request->last_name."%");
}
if($request->has('email')) {
$Users->where('email', 'like', $request->email."%");
}
return $Users->paginate(10);
}
/**
* Display a listing of the users in the application.
*
* @return \Illuminate\Http\Response
*/
public function users_phone(Request $request)
{
$term=Setting::get('country_code', '+91').$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);
}
/**
* Display a listing of the active trips in the application.
*
* @return \Illuminate\Http\Response
*/
public function providers(Request $request)
{
$Providers = new Provider;
if($request->has('latitude') && $request->has('longitude')) {
$ActiveProviders = ProviderService::AllAvailableServiceProvider($request->service_type)
->get()
->pluck('provider_id');
$distance = Setting::get('provider_search_radius', '10');
$latitude = $request->latitude;
$longitude = $request->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')
->paginate(10);
return $Providers;
}
return $Providers;
}
/**
* Default map coordinates.
*
* @return \Illuminate\Http\Response
*/
public function default_map()
{
$lat = Setting::get('address_lat');
$lng = Setting::get('address_long');
$zoom = Setting::get('zoom');
$result = array($lat, $lng, $zoom);
return $result;
}
/**
* Map of all Users and Drivers.
*
* @return \Illuminate\Http\Response
*/
public function dispatch_ajax()
{
try {
$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', 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 [];
}
}
/**
* Map of all Users and Drivers.
*
* @return \Illuminate\Http\Response
*/
public function driver_ajax()
{
try {
$result = 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','!=','')
->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')
->getQuery()
->get();
return $result;
} catch (Exception $e) {
return [];
}
}
/**
* 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);
$Request->current_provider_id = $Provider->id;
$Request->save();
(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();
}
if(Auth::guard('admin')->user()){
return redirect()->back()
->with('flash_success', 'Request Assigned to Provider!');
}elseif(Auth::guard('dispatcher')->user()){
return redirect()->back()
->with('flash_success', 'Request Assigned to Provider!');
}
} catch (Exception $e) {
if(Auth::guard('admin')->user()){
return redirect()->back()->with('flash_error', 'Something Went Wrong!');
}elseif(Auth::guard('dispatcher')->user()){
return redirect()->route('dispatcher.index')->with('flash_error', 'Something Went Wrong!');
}
}
}
/**
* 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();
if($request->ajax()) {
return response()->json(['error' => trans('api.ride.request_scheduled')], 500);
} else {
return redirect('dashboard')->with('flash_error', 'Already request is Scheduled on this time.');
}
} 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->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();
if($request->ajax()) {
return $UserRequest;
} else {
return redirect('dashboard');
}
}
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->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')) {
$ActiveProviders = ProviderService::where('service_type_id', $request->service_type)
->where('status', 'active')->get()
->pluck('provider_id');
$distance = Setting::get('provider_search_radius', '10');
$latitude = $request->s_latitude;
$longitude = $request->s_longitude;
$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();
if($request->ajax()) {
// Push Notification to User
return response()->json(['message' => trans('api.ride.no_providers_found')]);
} else {
return back()->with('flash_success', 'No Providers Found! Please try again.');
}
}
//$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();
}
}
if($request->ajax()) {
return $UserRequest;
} else {
return redirect('dashboard');
}
} catch (Exception $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong'), 'message' => $e], 500);
}else{
return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
}
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Provider $provider
* @return \Illuminate\Http\Response
*/
public function profile()
{
return view('dispatcher.account.profile');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Provider $provider
* @return \Illuminate\Http\Response
*/
public function profile_update(Request $request)
{
$this->validate($request,[
'name' => 'required|max:255',
'mobile' => 'required|digits_between:6,13',
]);
try{
$dispatcher = Auth::guard('dispatcher')->user();
$dispatcher->name = $request->name;
$dispatcher->mobile = $request->mobile;
$dispatcher->save();
return redirect()->back()->with('flash_success','Profile Updated');
}
catch (Exception $e) {
return back()->with('flash_error','Something Went Wrong!');
}
}
/**
* Remove the specified resource from storage.
*
* @param \App\Provider $provider
* @return \Illuminate\Http\Response
*/
public function password()
{
return view('dispatcher.account.change-password');
}
/**
* Remove the specified resource from storage.
*
* @param \App\Provider $provider
* @return \Illuminate\Http\Response
*/
public function password_update(Request $request)
{
$this->validate($request,[
'old_password' => 'required',
'password' => 'required|min:6|confirmed',
]);
try {
$Dispatcher = Dispatcher::find(Auth::guard('dispatcher')->user()->id);
if(password_verify($request->old_password, $Dispatcher->password))
{
$Dispatcher->password = bcrypt($request->password);
$Dispatcher->save();
return redirect()->back()->with('flash_success','Password Updated');
}
} catch (Exception $e) {
return back()->with('flash_error','Something Went Wrong!');
}
}
}