File: //var/www/html/punjabcabs/Original_Backup/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 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 = $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($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::guard('provider')->user()->id)->with('user', 'service_type', 'payment', 'rating')->get();
return view('provider.trip.index', compact('Jobs'));
}
/**
* 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')]);
}
}
}
}