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