File: //var/www/html/punjabcabs/app/Http/Controllers/UserApiController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Mail;
use DB;
use Log;
use Auth;
use Hash;
use Storage;
use Setting;
use Exception;
use Notification;
use Twilio;
use Carbon\Carbon;
use App\Http\Controllers\SendPushNotification;
use App\Notifications\ResetPasswordOTP;
use App\Helpers\Helper;
use Validator;
use App\Card;
use App\User;
use App\Provider;
use App\ContactList;
use App\Complaint;
use App\Settings;
use App\Promocode;
use App\ServiceType;
use App\UserRequests;
use App\RequestFilter;
use App\PromocodeUsage;
use App\ProviderService;
use App\UserRequestRating;
use App\Http\Controllers\ProviderResources\TripController;
class UserApiController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function signup(Request $request)
{
$validator = Validator::make($request->all(), [
'social_unique_id' => ['required_if:login_by,facebook,google','unique:users'],
'device_type' => 'required|in:android,ios',
'device_token' => 'required',
'device_id' => 'required',
'login_by' => 'required|in:manual,facebook,google',
'first_name' => 'required|max:255',
'last_name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'mobile' => 'required',
'password' => 'required|min:6',
]);
if($validator->fails()) {
return response()->json(['error' =>$validator->messages()], 500);
}
try{
$User = $request->all();
$User['payment_mode'] = 'CASH';
$User['password'] = bcrypt($request->password);
$User = User::create($User);
if($request->has('stripe_token')){
\Stripe\Stripe::setApiKey(Setting::get('stripe_secret_key'));
$customer = \Stripe\Customer::create([
'email' => $User->email,
]);
$strip_cust_id = $customer['id'];
$customer = \Stripe\Customer::retrieve($strip_cust_id);
$card = $customer->sources->create(["source" => $request->stripe_token]);
$create_card = new Card;
$create_card->user_id = $User->id;
$create_card->card_id = $card['id'];
$create_card->last_four = $card['last4'];
$create_card->brand = $card['brand'];
$create_card->save();
User::where('id',$User->id)->update(['stripe_cust_id' => $strip_cust_id]);
}
// send welcome email here
if(Setting::get('mail_enable', 0) == 1) {
$user = $request->all();
Mail::send('emails.user-register', ['user' => $user], function ($message) use ($user){
$message->to($user['email'], $user['first_name'])->subject(config('app.name').' Passenger Registration');
});
}
return $User;
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
try {
User::where('id', $request->id)->update(['device_id'=> '', 'device_token' => '']);
return response()->json(['message' => trans('api.logout_success')]);
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function change_password(Request $request){
$this->validate($request, [
'password' => 'required|confirmed|min:6',
'old_password' => 'required',
]);
$User = Auth::user();
if(Hash::check($request->old_password, $User->password))
{
$User->password = bcrypt($request->password);
$User->save();
if($request->ajax()) {
return response()->json(['message' => trans('api.user.password_updated')]);
}else{
return back()->with('flash_success', 'Password Updated');
}
} else {
if($request->ajax()) {
return response()->json(['error' => trans('api.user.incorrect_password')], 500);
}else{
return back()->with('flash_success', 'api.user.incorrect_password');
}
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function update_location(Request $request){
$this->validate($request, [
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
]);
if($user = User::find(Auth::user()->id)){
$user->latitude = $request->latitude;
$user->longitude = $request->longitude;
$user->save();
return response()->json(['message' => trans('api.user.location_updated')]);
}else{
return response()->json(['error' => trans('api.user.user_not_found')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function details(Request $request){
$this->validate($request, [
'device_type' => 'in:android,ios',
]);
try{
if($user = User::find(Auth::user()->id)){
if($request->has('device_token')){
$user->device_token = $request->device_token;
}
if($request->has('device_type')){
$user->device_type = $request->device_type;
}
if($request->has('device_id')){
$user->device_id = $request->device_id;
}
$user->save();
$user->currency = Setting::get('currency');
$user->sos = Setting::get('sos_number', '911');
return $user;
} else {
return response()->json(['error' => trans('api.user.user_not_found')], 500);
}
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function update_profile(Request $request)
{
$this->validate($request, [
'first_name' => 'required|max:255',
'last_name' => 'max:255',
'email' => 'email|unique:users,email,'.Auth::user()->id,
'mobile' => 'required',
'picture' => 'mimes:jpeg,bmp,png',
]);
try {
$user = User::findOrFail(Auth::user()->id);
if($request->has('first_name')){
$user->first_name = $request->first_name;
}
if($request->has('last_name')){
$user->last_name = $request->last_name;
}
if($request->has('email')){
$user->email = $request->email;
}
if($request->has('mobile')){
$user->mobile = $request->mobile;
}
if ($request->picture != "") {
Storage::delete($user->picture);
$user->picture = $request->picture->store('user/profile');
}
$user->save();
if($request->ajax()) {
return response()->json($user);
}else{
return back()->with('flash_success', trans('api.user.profile_updated'));
}
}
catch (ModelNotFoundException $e) {
return response()->json(['error' => trans('api.user.user_not_found')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function services() {
if($serviceList = ServiceType::all()) {
return $serviceList;
} else {
return response()->json(['error' => trans('api.services_not_found')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function apiservices() {
if($serviceList = ServiceType::all()) {
foreach ($serviceList as $key => $service_type) {
$service_type = ServiceType::findOrFail($service_type->id);
$current = Carbon::now()->toTimeString();
$sro_levy = Setting::get('sro_levy', 0);
$fare_flag=0.00;
$fare_distance=0.00;
$fare_booking=0.00;
$fare_waiting=0.00;
if($service_type->p_enable ==3 && ($current > '18:00:00' || $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;
}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;
}
}
$serviceList[$key]->fixed = $fare_flag;
$serviceList[$key]->booking_fee = $fare_booking;
$serviceList[$key]->waiting_fee = $fare_waiting;
$serviceList[$key]->distance_fee = $fare_distance;
$serviceList[$key]->sro_levy = $sro_levy;
}
return $serviceList;
} else {
return response()->json(['error' => trans('api.services_not_found')], 500);
}
}
public function countrylatlng() {
$countrylatlng['lat'] = Setting::get('countrylat', 0);
$countrylatlng['lng'] = Setting::get('countrylng', 0);
return $countrylatlng;
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function send_request(Request $request) {
$this->validate($request, [
's_latitude' => 'required|numeric',
'd_latitude' => 'required|numeric',
's_longitude' => 'required|numeric',
'd_longitude' => 'required|numeric',
'service_type' => 'required|numeric|exists:service_types,id',
'promo_code' => 'exists:promocodes,promo_code',
'distance' => 'required|numeric',
'use_wallet' => 'numeric',
'payment_mode' => 'required|in:CASH,CARD,PAYPAL',
'card_id' => ['required_if:payment_mode,CARD','exists:cards,card_id,user_id,'.Auth::user()->id],
]);
$ActiveRequests = UserRequests::PendingRequest(Auth::user()->id)->count();
if(Auth::user()->due_balance !=0.00){
if($request->ajax()) {
return response()->json(['message' => 'Clear Pending Dues to take trip']);
} else {
return redirect('dashboard')->with('flash_error', 'Clear Pending Dues to take trip');
}
}
if($ActiveRequests > 0) {
if($request->ajax()) {
return response()->json(['error' => trans('api.ride.request_inprogress')], 500);
} else {
return redirect('dashboard')->with('flash_error', 'Already request is in progress. Try again later');
}
}
if($request->has('schedule_date') && $request->has('schedule_time')){
$beforeschedule_time = (new Carbon("$request->schedule_date $request->schedule_time"))->subMinute(15);
$afterschedule_time = (new Carbon("$request->schedule_date $request->schedule_time"))->addMinute(15);
$CheckScheduling = UserRequests::where('status','SCHEDULED')
->where('user_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_scheduled')], 500);
}else{
return redirect('dashboard')->with('flash_error', 'Already request is Scheduled on this time.');
}
}
}
if($request->has('schedule_date') && $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 = Auth::user()->id;
$UserRequest->current_provider_id = 0;
$UserRequest->service_type_id = $request->service_type;
$UserRequest->tip_percent = $request->tip_percent ? : 0;
$UserRequest->payment_mode = $request->payment_mode;
$UserRequest->status = 'SCHEDULED';
$UserRequest->push = 'AUTO';
if($request->has('web')){
$UserRequest->booking_by = 'WEB';
}else{
$UserRequest->booking_by = 'APP';
}
$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 = '';
$UserRequest->distance = $request->distance;
$UserRequest->assigned_at = Carbon::now();
if(Auth::user()->wallet_balance > 0){
$UserRequest->use_wallet = $request->use_wallet ? : 0;
}
$UserRequest->surge = 0; // Surge is not necessary while adding a manual dispatch
if($request->has('schedule_date') && $request->has('schedule_time')){
$UserRequest->schedule_at = date("Y-m-d H:i:s",strtotime("$request->schedule_date $request->schedule_time"));
}
$UserRequest->save();
if($request->ajax()) {
return response()->json([
'message' => trans('api.new_request_dispatcher'),
'request_id' => $UserRequest->id,
'scheduled_status' => 1,
]);
}else{
return redirect('dashboard');
}
}
$distance = Setting::get('provider_search_radius', '10');
$latitude = $request->s_latitude;
$longitude = $request->s_longitude;
$service_type = $request->service_type;
$Active_fav =[];
$exists_driver = Auth::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) {
if($request->ajax()) {
// Push Notification to User
return response()->json(['message' => trans('api.ride.no_providers_found')]);
}else{
return back()->with('flash_success', 'No Drivers Found! Please try again.');
}
}
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 = Auth::user()->id;
$UserRequest->current_provider_id = $Providers[0]->id;
$UserRequest->service_type_id = $request->service_type;
$UserRequest->tip_percent = $request->tip_percent ? : 0;
$UserRequest->payment_mode = $request->payment_mode;
$UserRequest->status = 'SEARCHING';
if($request->has('web')){
$UserRequest->booking_by = 'WEB';
}else{
$UserRequest->booking_by = 'APP';
}
$UserRequest->s_address = $request->s_address ? : "";
$UserRequest->d_address = $request->d_address ? : "";
$UserRequest->s_latitude = $request->s_latitude;
$UserRequest->s_longitude = $request->s_longitude;
$UserRequest->d_latitude = $request->d_latitude;
$UserRequest->d_longitude = $request->d_longitude;
$UserRequest->distance = $request->distance;
$UserRequest->driver_message = $request->driver_message ? : "";
if(Auth::user()->wallet_balance > 0){
$UserRequest->use_wallet = $request->use_wallet ? : 0;
}
$UserRequest->assigned_at = Carbon::now();
$UserRequest->route_key = '';
if($Providers->count() <= Setting::get('surge_trigger') && $Providers->count() > 0){
$UserRequest->surge = 1;
}
if($request->has('schedule_date') && $request->has('schedule_time')){
$UserRequest->schedule_at = date("Y-m-d H:i:s",strtotime("$request->schedule_date $request->schedule_time"));
}
$UserRequest->save();
// update payment mode
User::where('id',Auth::user()->id)->update(['payment_mode' => $request->payment_mode]);
User::where('id',Auth::user()->id)->update(['trip_status' => 1]);
if($request->has('card_id')){
Card::where('user_id',Auth::user()->id)->update(['is_default' => 0]);
Card::where('card_id',$request->card_id)->update(['is_default' => 1]);
}
(new SendPushNotification)->IncomingRequest($Providers[0]->id);
ProviderService::where('provider_id',$Providers[0]->id)->update(['status' =>'riding']);
foreach ($Providers as $key => $Provider) {
$Filter = new RequestFilter;
$Filter->request_id = $UserRequest->id;
$Filter->provider_id = $Provider->id;
$Filter->save();
}
if($request->ajax()) {
return response()->json([
'message' => trans('api.new_request_created'),
'request_id' => $UserRequest->id,
'current_provider' => $UserRequest->current_provider_id,
'scheduled_status' => 0,
]);
}else{
return redirect('dashboard');
}
} catch (Exception $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}else{
return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
}
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function cancel_request(Request $request) {
$this->validate($request, [
'request_id' => 'required|numeric|exists:user_requests,id,user_id,'.Auth::user()->id,
]);
try{
$UserRequest = UserRequests::findOrFail($request->request_id);
if($UserRequest->status == 'CANCELLED')
{
if($request->ajax()) {
return response()->json(['error' => trans('api.ride.already_cancelled')], 500);
}else{
return back()->with('flash_error', 'Request is Already Cancelled!');
}
}
if(in_array($UserRequest->status, ['SEARCHING','STARTED','ARRIVED','SCHEDULED'])) {
if($UserRequest->status != 'SEARCHING'){
$this->validate($request, [
'cancel_reason'=> 'max:255',
]);
}
$cancellation = 0;
if($UserRequest->payment_mode =='CARD'){
if(Setting::get('cancellation_fare') !=0){
$startTime = Carbon::parse($UserRequest->accepted_at);
$finishTime = Carbon::now();
$totalDuration = $finishTime->diffInMinutes($startTime);
if($UserRequest->status !='SEARCHING' && $UserRequest->status !='SCHEDULED'){
User::where('id',Auth::user()->id)->update(['due_balance' => Setting::get('cancellation_fare'),'due_trip' => $UserRequest->id]);
app(\App\Http\Controllers\PaymentController::class)->due_payment(Auth::user()->id);
$cancellation = 1;
}
}
}else{
if(Auth::user()->cancel_points ==0){
if($request->ajax()) {
return response()->json(['message' => 'Ride Cannot be Cancelled']);
}else{
return redirect('dashboard')->with('flash_success','Ride Cannot be Cancelled');
}
}
User::where('id',Auth::user()->id)->decrement('cancel_points');
}
$UserRequest->status = 'CANCELLED';
$UserRequest->cancel_reason = $request->cancel_reason;
$UserRequest->cancelled_by = 'USER';
$UserRequest->save();
RequestFilter::where('request_id', $UserRequest->id)->delete();
if($UserRequest->status != 'SCHEDULED'){
if($UserRequest->provider_id != 0){
ProviderService::where('provider_id',$UserRequest->provider_id)->update(['status' => 'active']);
}
if($UserRequest->current_provider_id != 0){
ProviderService::where('provider_id',$UserRequest->current_provider_id)->update(['status' => 'active']);
}
}
// Send Push Notification to User
(new SendPushNotification)->UserCancellRide($UserRequest);
if($cancellation == 1){
if($request->ajax()) {
return response()->json(['message' => 'Cancellation charge applied'.Setting::get('cancellation_fare')]);
}else{
return redirect('dashboard')->with('flash_success','Request Cancelled Successfully');
}
}else{
if($request->ajax()) {
return response()->json(['message' => trans('api.ride.ride_cancelled')]);
}else{
return redirect('dashboard')->with('flash_success','Request Cancelled Successfully');
}
}
} else {
if($request->ajax()) {
return response()->json(['error' => trans('api.ride.already_onride')], 500);
}else{
return back()->with('flash_error', 'Service Already Started!');
}
}
}
catch (ModelNotFoundException $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}else{
return back()->with('flash_error', 'No Request Found!');
}
}
}
public function clear_status(Request $request) {
User::where('id',Auth::user()->id)->update(['trip_status' => 0]);
$data = [];
return response()->json($data);
}
/**
* Show the request status check.
*
* @return \Illuminate\Http\Response
*/
public function get_status(Request $request) {
try{
if(!empty($request->latitude)) {
User::where('id',Auth::user()->id)->update([
'latitude' => $request->latitude,
'longitude' => $request->longitude
]);
}
return response()->json(['ride_active' => Auth::user()->trip_status]);
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the request status check user web panel.
*
* @return \Illuminate\Http\Response
*/
public function dashboard_request_status_check() {
try{
$check_status = ['CANCELLED', 'SCHEDULED'];
$UserRequests = UserRequests::UserRequestStatusCheck(Auth::user()->id, $check_status)
->get()
->toArray();
$search_status = ['SEARCHING','SCHEDULED'];
$UserRequestsFilter = UserRequests::UserRequestAssignProvider(Auth::user()->id,$search_status)->get();
// Log::info($UserRequestsFilter);
$Timeout = Setting::get('provider_select_timeout', 180);
if(!empty($UserRequestsFilter)){
for ($i=0; $i < sizeof($UserRequestsFilter); $i++) {
$ExpiredTime = $Timeout - (time() - strtotime($UserRequestsFilter[$i]->assigned_at));
if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime < 0) {
$Providertrip = new TripController();
$Providertrip->assign_next_provider($UserRequestsFilter[$i]->id);
}else if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime > 0){
break;
}
}
}
return response()->json(['data' => $UserRequests]);
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the request status check.
*
* @return \Illuminate\Http\Response
*/
public function request_status_check() {
try{
$check_status = ['CANCELLED','SCHEDULED'];
$UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->whereNotIn('user_requests.status', $check_status)
->select('user_requests.status')
->get();
if($UserRequests->isNotEmpty()){
$status = $UserRequests[0]->status;
}else{
$status = '';
}
switch ($status) {
case "SEARCHING":
$UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->whereNotIn('user_requests.status', $check_status)
->select('user_requests.*')
->with('user')
->get()
->toArray();
break;
case "ACCEPTED":
case "STARTED":
case "ARRIVED":
case "PICKEDUP":
case "END":
$UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->whereNotIn('user_requests.status', $check_status)
->select('user_requests.*')
->with('user','provider','service_type','provider_service')
->get()
->toArray();
break;
case "DROPPED":
$UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->whereNotIn('user_requests.status', $check_status)
->select('user_requests.*')
->with('provider','payment')
->get()
->toArray();
break;
case "COMPLETED":
$UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->whereNotIn('user_requests.status', $check_status)
->select('user_requests.*')
->with('provider','payment','rating')
->get()
->toArray();
break;
default:
$UserRequests = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->orderBy('user_requests.updated_at', 'desc')
->select('user_requests.*')
->take(1)
->get()
->toArray();
}
$search_status = ['SEARCHING','SCHEDULED'];
$UserRequestsFilter = UserRequests::where('user_requests.user_id', Auth::user()->id)
->where('user_requests.user_rated',0)
->where('user_requests.provider_id',0)
->whereIn('user_requests.status', $search_status)
->select('user_requests.status','user_requests.assigned_at','user_requests.id')
->get();
// Log::info($UserRequestsFilter);
$Timeout = Setting::get('provider_select_timeout', 180);
if(!empty($UserRequestsFilter)){
for ($i=0; $i < sizeof($UserRequestsFilter); $i++) {
$ExpiredTime = 5+$Timeout - (time() - strtotime($UserRequestsFilter[$i]->assigned_at));
if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime < 0) {
$Providertrip = new TripController();
$Providertrip->assign_next_provider($UserRequestsFilter[$i]->id);
}else if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime > 0){
break;
}
}
}
return response()->json(['data' => $UserRequests]);
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function rate_provider(Request $request) {
$this->validate($request, [
'request_id' => 'required|integer|exists:user_requests,id,user_id,'.Auth::user()->id,
'rating' => 'required|integer|in:1,2,3,4,5',
'comment' => 'max:255',
]);
$UserRequests = UserRequests::where('id' ,$request->request_id)
->where('status' ,'COMPLETED')
->where('paid', 0)
->first();
if ($UserRequests) {
if($request->ajax()){
return response()->json(['error' => trans('api.user.not_paid')], 500);
} else {
return back()->with('flash_error', 'Service Already Started!');
}
}
try{
$UserRequest = UserRequests::findOrFail($request->request_id);
if($UserRequest->rating == null) {
UserRequestRating::create([
'provider_id' => $UserRequest->provider_id,
'user_id' => $UserRequest->user_id,
'request_id' => $UserRequest->id,
'user_rating' => $request->rating,
'user_comment' => $request->comment,
]);
} else {
$UserRequest->rating->update([
'user_rating' => $request->rating,
'user_comment' => $request->comment,
]);
}
$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]);
// Send Push Notification to Provider
if($request->ajax()){
return response()->json(['message' => trans('api.ride.provider_rated')]);
}else{
return redirect('dashboard')->with('flash_success', 'Driver Rated Successfully!');
}
} catch (Exception $e) {
if($request->ajax()){
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}else{
return back()->with('flash_error', 'Something went wrong');
}
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function trips(Request $request) {
$this->validate($request,[
'time_period' => 'required|numeric',
]);
try{
if($request->time_period ==1){
$timer = Carbon::now()->today();
}
if($request->time_period ==2){
$timer = Carbon::now()->subDays(7);
}
if($request->time_period ==3){
$timer = Carbon::now()->subDays(30);
}
$UserRequests = UserRequests::where('user_requests.user_id', '=', Auth::user()->id)
->where('user_requests.updated_at', '>=', $timer)
->whereIn('user_requests.status', ['CANCELLED', 'COMPLETED'])
->orderBy('user_requests.updated_at','desc')
->select('user_requests.*')
->with('payment','service_type')->get();
return $UserRequests;
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function dashboardtrips() {
try{
$UserRequests = UserRequests::DashboardUserTrips(Auth::user()->id)->get();
return $UserRequests;
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function estimated_fare(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',
]);
try{
$details = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$request->s_latitude.",".$request->s_longitude."&destinations=".$request->d_latitude.",".$request->d_longitude."&mode=driving&sensor=false&key=".env('GOOGLE_MAP_KEY');
$json = curl($details);
$details = json_decode($json, TRUE);
//dd($details);
$meter = $details['rows'][0]['elements'][0]['distance']['value'];
$time = $details['rows'][0]['elements'][0]['duration']['text'];
$seconds = $details['rows'][0]['elements'][0]['duration']['value'];
$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;
$tax_percentage = Setting::get('tax_percentage');
$sro_levy = Setting::get('sro_levy');
$service_type = ServiceType::findOrFail($request->service_type);
$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;
}
}
$price = $fare_flag;
if($kilometer > 1){
$kilometer1 = $kilometer - 1;
$price += ($kilometer1 * $fare_distance);
}
$tax_price = $tax_percentage;
$total = $price + $sro_levy + $fare_booking;
return response()->json([
'estimated_fare' => round($total,2),
'distance' => $kilometer,
'distance_unit' => $unit,
'time' => $time,
'tax_price' => $tax_price,
'sro_levy' => $sro_levy,
'booking_fee' => $fare_booking,
'base_price' => $fare_flag,
'wallet_balance' => Auth::user()->wallet_balance,
]);
} catch(Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function trip_details(Request $request) {
$this->validate($request, [
'request_id' => 'required|integer|exists:user_requests,id',
]);
try{
$UserRequests = UserRequests::UserTripDetails(Auth::user()->id,$request->request_id)->get();
return $UserRequests;
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}
}
/**
* get all promo code.
*
* @return \Illuminate\Http\Response
*/
public function promocodes() {
try{
$this->check_expiry();
return PromocodeUsage::Active()
->where('user_id', Auth::user()->id)
->with('promocode')
->get();
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
public function list_promocode(){
try{
$this->check_expiry();
$new_user = Promocode::where('status','ADDED')
->where('user_type','new')
->where('updated_at','<=', Auth::user()->created_at)
->pluck('id')->toArray();
$all_user = Promocode::where('status','ADDED')
->where('user_type','all')
->pluck('id')->toArray();
$promo_id=array_merge($new_user,$all_user);
$all = Promocode::whereIn('id',$promo_id)->get();
return response()->json(['promocode'=>$all]);
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
public function check_expiry(){
try{
$Promocode = Promocode::all();
foreach ($Promocode as $index => $promo) {
if(date("Y-m-d") > $promo->expiration){
$promo->status = 'EXPIRED';
$promo->save();
PromocodeUsage::where('promocode_id', $promo->id)->update(['status' => 'EXPIRED']);
}
}
} catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* add promo code.
*
* @return \Illuminate\Http\Response
*/
public function add_promocode(Request $request) {
$this->validate($request, [
'promocode' => 'required|exists:promocodes,promo_code',
]);
try{
$find_promo = Promocode::where('promo_code',$request->promocode)->first();
if($find_promo->status == 'EXPIRED' || (date("Y-m-d") > $find_promo->expiration)){
if($request->ajax()){
return response()->json([
'message' => trans('api.promocode_expired'),
'code' => 'promocode_expired'
]);
}else{
return back()->with('flash_error', trans('api.promocode_expired'));
}
}elseif(PromocodeUsage::where('promocode_id',$find_promo->id)->where('user_id', Auth::user()->id)->count() > 0){
if($request->ajax()){
return response()->json([
'message' => trans('api.promocode_already_in_use'),
'code' => 'promocode_already_in_use'
]);
}else{
return back()->with('flash_error', 'Promocode Already in use');
}
}else{
$promo = new PromocodeUsage;
$promo->promocode_id = $find_promo->id;
$promo->user_id = Auth::user()->id;
$promo->usage = $find_promo->use_count;
$promo->status = 'ADDED';
$promo->save();
if($request->ajax()){
return response()->json([
'message' => trans('api.promocode_applied') ,
'code' => 'promocode_applied'
]);
}else{
return back()->with('flash_success', trans('api.promocode_applied'));
}
}
}
catch (Exception $e) {
if($request->ajax()){
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}else{
return back()->with('flash_error', 'Something Went Wrong');
}
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function upcoming_trips() {
try{
$UserRequests = UserRequests::UserUpcomingTrips(Auth::user()->id)->get();
return $UserRequests;
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function dashboard_upcoming_trips() {
try{
$UserRequests = UserRequests::DashboardUserUpcomingTrips(Auth::user()->id)->get();
return $UserRequests;
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function upcoming_trip_details(Request $request) {
$this->validate($request, [
'request_id' => 'required|integer|exists:user_requests,id',
]);
try{
$UserRequests = UserRequests::UserUpcomingTripDetails(Auth::user()->id,$request->request_id)->get();
$services = ServiceType::select('id','name')->get();
if(!empty($UserRequests)){
foreach ($UserRequests as $key => $value) {
$UserRequests[$key]->available_services = $services;
}
}
return $UserRequests;
}
catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')]);
}
}
/**
* Show the nearby providers.
*
* @return \Illuminate\Http\Response
*/
public function show_providers(Request $request) {
$this->driver_detector();
$this->validate($request, [
'latitude' => 'required|numeric',
'longitude' => 'required|numeric',
'service' => 'numeric|exists:service_types,id',
]);
try{
$distance = Setting::get('provider_search_radius', '10');
$latitude = $request->latitude;
$longitude = $request->longitude;
if($request->has('service')){
$ActiveProviders = ProviderService::AvailableServiceProvider($request->service)->get()->pluck('provider_id');
$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")
->get();
} else {
$ActiveProviders = ProviderService::ActiveServiceProvider()->get()->pluck('provider_id');
$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")
->get();
}
if(count($Providers) == 0) {
if($request->ajax()) {
return response()->json(['message' => "No Drivers Found"]);
}else{
return back()->with('flash_success', 'No Drivers Found! Please try again.');
}
}
/*$shorter = 0;
if(!empty($Providers)){
foreach ($Providers as $key => $value) {
$details = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$value->latitude.",".$value->longitude."&destinations=".$latitude.",".$longitude."&mode=driving&sensor=false&key=".env('GOOGLE_MAP_KEY');
$json = curl($details);
$details = json_decode($json, TRUE);
$meter = $details['rows'][0]['elements'][0]['distance']['value'];
$time = $details['rows'][0]['elements'][0]['duration']['text'];
$seconds = $details['rows'][0]['elements'][0]['duration']['value'];
$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;
$Providers[$key]->distance = $kilometer;
$Providers[$key]->time = round($minutes).' min';
$short_time = $shorter;
if($short_time < $minutes){
$shorter = $minutes;
}
}
}*/
return response()->json([
'provider' => $Providers
]);
} catch (Exception $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}else{
return back()->with('flash_error', 'Something went wrong while sending request. Please try again.');
}
}
}
/**
* Forgot Password.
*
* @return \Illuminate\Http\Response
*/
public function forgot_password(Request $request){
$this->validate($request, [
'email' => 'required|email|exists:users,email',
]);
try{
$user = User::where('email' , $request->email)->first();
$otp = mt_rand(100000, 999999);
$user->otp = $otp;
$user->save();
Notification::send($user, new ResetPasswordOTP($otp));
//sms
if(Setting::get('sms_enable', 0) == 1) {
$mobile = $user->mobile;
$message = 'Kindly note your OTP : '.$otp.' Regards '.config('app.name');
try {
Twilio::message($mobile, $message);
} catch ( \Services_Twilio_RestException $e ) {
//return $e->getMessage();
}
}
return response()->json([
'message' => 'OTP sent to your email!',
'user' => $user
]);
}catch(Exception $e){
return response()->json(['error' => trans('api.something_went_wrong')], 500);
}
}
/**
* Reset Password.
*
* @return \Illuminate\Http\Response
*/
public function reset_password(Request $request){
$this->validate($request, [
'password' => 'required|confirmed|min:6',
'id' => 'required|numeric|exists:users,id'
]);
try{
$User = User::findOrFail($request->id);
$User->password = bcrypt($request->password);
$User->save();
if($request->ajax()) {
return response()->json(['message' => 'Password Updated']);
}
}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')]);
}
}
}
/**
* help Details.
*
* @return \Illuminate\Http\Response
*/
public function contact_list(Request $request){
try{
$Contacts = ContactList::where('user_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 = ContactList::where('user_id',Auth::user()->id)
->where('contact_number',$request->contact_number)
->get();
if(count($checklist) ==0){
$Contact = new ContactList;
$Contact->user_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 = ContactList::where('user_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')]);
}
}
}
/**
* Edit Scheduled Trip Details.
*
* @return \Illuminate\Http\Response
*/
public function edit_request(Request $request)
{
$this->validate($request, [
's_latitude' => 'required|numeric',
'd_latitude' => 'required|numeric',
's_longitude' => 'required|numeric',
'd_longitude' => 'required|numeric',
'service_type' => 'required|numeric|exists:service_types,id',
'trip_id' => 'required|numeric',
's_address' => 'required',
'd_address' => 'required',
"schedule_at" => 'required',
]);
try {
$trip = UserRequests::findOrFail($request->trip_id);
$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 = '';
$meter = $details['routes'][0]['legs'][0]['distance']['value'];
$unit =Setting::get('distance_unit');
if($unit =='km'){
$kilometer = $meter/1000;
}else{
$base = $meter/1000;
$kilometer = $base * 0.62137119;
}
$trip->distance = $kilometer;
$trip->s_latitude = $request->s_latitude;
$trip->s_longitude = $request->s_longitude;
$trip->d_latitude = $request->d_latitude;
$trip->d_longitude = $request->d_longitude;
$trip->route_key = $route_key;
$trip->s_address = $request->s_address;
$trip->d_address = $request->d_address;
$trip->service_type_id = $request->service_type;
$trip->provider_id = 0;
$trip->current_provider_id = 0;
$trip->cancelled_by ="NONE";
$trip->cancel_reason ="";
$trip->booking_by ="APP";
$trip->paid =0;
$trip->assigned_at = Carbon::now();
$trip->schedule_at = Carbon::parse($request->schedule_at);
$trip->status ="SCHEDULED";
$trip->push = 'AUTO';
$trip->user_rated =0;
$trip->provider_rated =0;
$trip->save();
if($request->ajax()) {
return response()->json([
'message' => 'Scheduled Trip Request has Updated!',
'request' => $trip,
]);
}else{
return redirect('dashboard');
}
}
catch (ModelNotFoundException $e) {
return back()->with('flash_error', 'Something Went Wrong');
}
}
public function driver_detector(){
$now = Carbon::now()->subMinutes(20);
$Providers = Provider::where('updated_at', '<', $now)
->get()->pluck('id');
foreach ($Providers as $Provider) {
ProviderService::where('provider_id',$Provider)->where('status', '!=', 'offline')
->where('status', '!=', 'riding')->update(['status' =>'offline']);
}
}
public function auto_assign(){
$UserRequests = UserRequests::where('push','=','AUTO')->whereNotIn('status', ['COMPLETED','CANCELLED'])->get();
foreach ($UserRequests as $key => $request) {
$original = $request->schedule_at;
$schedule = (new Carbon("$request->schedule_at"))->subMinutes(15);
$now = Carbon::now();
if($now > $schedule && $now < $original){
$distance = Setting::get('provider_search_radius', '10');
$latitude = $request->s_latitude;
$longitude = $request->s_longitude;
$Active_fav =[];
$exists_driver = User::where('id', $request->user_id)->pluck('favourite_driver')->first();
if(!empty($exists_driver)){
$drivers = explode(',', $exists_driver);
$Active_fav = ProviderService::whereIn('provider_id', $drivers)
->where('service_type_id', $request->service_type_id)
->where('status', 'active')->get()
->pluck('provider_id')->toArray();
}
$Active_base = ProviderService::where('service_type_id', $request->service_type_id)
->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();
if(count($Providers) > 0) {
$Request = UserRequests::findOrFail($request->id);
$Request->current_provider_id = $Providers[0]->id;
$Request->push = 'SENDED';
$Request->save();
// Incoming request push to provider
(new SendPushNotification)->IncomingRequest($Request->current_provider_id);
foreach ($Providers as $key => $Provider) {
$Filter = new RequestFilter;
$Filter->request_id = $Request->id;
$Filter->provider_id = $Provider->id;
$Filter->save();
}
}
}
if($now > $original){
$Request = UserRequests::findOrFail($request->id);
$Request->status = 'CANCELLED';
$Request->save();
User::where('id', $Request->user_id)->update(['trip_status' => 0]);
}
}
$UserRequestsFilter = UserRequests::where('status', 'SEARCHING')->get();
$Timeout = Setting::get('provider_select_timeout', 180);
if(!empty($UserRequestsFilter)){
for ($i=0; $i < sizeof($UserRequestsFilter); $i++) {
$ExpiredTime = 20+$Timeout - (time() - strtotime($UserRequestsFilter[$i]->assigned_at));
if($UserRequestsFilter[$i]->status == 'SEARCHING' && $ExpiredTime < 0){
$UserRequestsFilter[$i]->status = 'CANCELLED';
$UserRequestsFilter[$i]->cancelled_by = 'REJECTED';
$UserRequestsFilter[$i]->save();
User::where('id', $UserRequestsFilter[$i]->user_id)->update(['trip_status' => 0]);
$UnwantedRequest = RequestFilter::where('request_id',$UserRequestsFilter[$i]->id);
ProviderService::where('provider_id',$UserRequestsFilter[$i]->current_provider_id)->update(['status' =>'active']);
if($UnwantedRequest->count() > 0){
$UnwantedRequest->delete();
}
}
}
}
}
/**
* help Details.
*
* @return \Illuminate\Http\Response
*/
public function complaint(Request $request){
$this->validate($request, [
'complaint_type' => 'required',
'complaint_desc' => 'required',
]);
try{
$Complaint = new Complaint;
$Complaint->name = Auth::user()->first_name;
$Complaint->email = Auth::user()->email;
$Complaint->phone = Auth::user()->mobile;
$status = $request->complaint_type;
switch ($status) {
case "1":
$Complaint->complaint_type = "Driver behaviour";
break;
case "2":
$Complaint->complaint_type = "Driver driving skills";
break;
case "3":
$Complaint->complaint_type = "Lost property";
break;
case "4":
$Complaint->complaint_type = "Trip charges";
break;
default:
}
$Complaint->complaint_desc = $request->complaint_desc;
$Complaint->save();
if($request->ajax()){
return response()->json([
'message' => 'Complaint saved Successfully',
]);
}
}catch (Exception $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong')],500);
}
}
}
/**
* help Details.
*
* @return \Illuminate\Http\Response
*/
public function favourite_list(){
try{
$exists_driver = Auth::user()->favourite_driver;
if(!empty($exists_driver)){
$drivers = explode(',', $exists_driver);
}else{
$drivers =[];
}
$providers = Provider::whereIn('id', $drivers)->select('id','first_name','last_name','mobile','avatar','rating')->get();
if(!empty($providers)){
foreach ($providers as $key => $value) {
$providers[$key]->avatar = asset('storage/'.$value->avatar);
}
}
return $providers;
}catch (Exception $e) {
return response()->json(['error' => trans('api.something_went_wrong')],500);
}
}
/**
* help Details.
*
* @return \Illuminate\Http\Response
*/
public function favourite_add(Request $request){
$this->validate($request, [
'provider_id' => 'required',
]);
try{
$new_driver = $request->provider_id;
$exists_driver = Auth::user()->favourite_driver;
if(!empty($exists_driver)){
$drivers = explode(',', $exists_driver);
}else{
$drivers =[];
}
if(in_array($new_driver,$drivers))
{
return response()->json(['message' => 'Already driver in favourite list',]);
}elseif(count($drivers) ==3){
return response()->json(['message' => 'Adding favourite driver is limited',]);
}
else{
$drivers[] = $new_driver;
$updated_drivers = implode(',', $drivers);
User::where('id',Auth::user()->id)->update(['favourite_driver' => $updated_drivers]);
}
if($request->ajax()){
return response()->json([
'message' => 'Driver add as favourite driver Successfully',
]);
}
}catch (Exception $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong')],500);
}
}
}
/**
* help Details.
*
* @return \Illuminate\Http\Response
*/
public function favourite_delete(Request $request){
$this->validate($request, [
'provider_id' => 'required',
]);
try{
$remove_driver = $request->provider_id;
$exists_driver = Auth::user()->favourite_driver;
if(!empty($exists_driver)){
$drivers = explode(',', $exists_driver);
if (($key = array_search($remove_driver, $drivers)) !== false) {
unset($drivers[$key]);
$updated_drivers = implode(',', $drivers);
User::where('id',Auth::user()->id)->update(['favourite_driver' => $updated_drivers]);
return response()->json(['message' => 'Driver removed from list',]);
}else{
return response()->json(['message' => 'Driver not found in favourite list',]);
}
}else{
return response()->json(['message' => 'Favourite driver list is empty',]);
}
}catch (Exception $e) {
if($request->ajax()) {
return response()->json(['error' => trans('api.something_went_wrong')],500);
}
}
}
public function sendmail(Request $request){
//sms and email----------------
$user = Provider::with('service')->findOrFail(24);
if(Setting::get('mail_enable', 0) == 1) {
Mail::send('emails.driver-approved', ['user' => $user], function ($message) use ($user){
$message->to($user->email, $user->first_name)->subject(config('app.name').' Request Approval');
});
}
if(Setting::get('sms_enable', 0) == 1) {
$mobile = $user->mobile;
$message = 'You have become the authorised driver of '.config('app.name').' Name:'.$user->first_name.' '.$user->first_name.', Phone:'.$user->mobile.', Service Number:'.$user->service->service_number.', Service Model:'.$user->service->service_model.'. Regards '.config('app.name');
try {
Twilio::message($mobile, $message);
} catch ( \Services_Twilio_RestException $e ) {
//return $e->getMessage();
}
}
//---------------------
//Twilio::message('+919500698960', 'this is my first messge');
}
}