HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Transporter/RideController.php
<?php

namespace App\Http\Controllers\Transporter;

use App\DataTables\Transporter\RideDataTable;
use App\Http\Controllers\Controller;
use App\Models\Booking;
use App\Models\BookingRide;
use App\Models\Driver;
use App\Models\RideRequest;
use App\Models\TransporterRequest;
use App\Models\TransporterSetting;
use App\Models\Vehicle;
use Illuminate\Http\Request;

class RideController extends Controller
{
    public function index(RideDataTable $dataTable)
    {
        $transporterId = auth()->guard('trans')->user()->id;
        $drivers = Driver::where('transporter_id', $transporterId)->where('status', 'active')->where('is_verified', 1)->limit(10)->get();
        $vehicles = Vehicle::with(['documents' => function ($q) {
            $q->where('doc_type', 'rc');
        }])
            ->where('transporter_id', $transporterId)
            ->where('status', 'active')
            ->where('is_verified', 1)
            ->limit(10)
            ->get();
        return $dataTable->render('transporter.rides.index', compact('drivers', 'vehicles'));
    }
    public function view($id)
    {
        $transporterId = auth()->guard('trans')->user()->id;
        $drivers = Driver::where('transporter_id', $transporterId)->where('status', 'active')->where('is_verified', 1)->limit(10)->get();
        $vehicles = Vehicle::with(['documents' => function ($q) {
            $q->where('doc_type', 'rc');
        }])
            ->where('transporter_id', $transporterId)
            ->where('status', 'active')
            ->where('is_verified', 1)
            ->limit(10)
            ->get();
        $ride = BookingRide::with('booking')->findOrFail(decrypt($id));

        $canSeeCustomer = TransporterSetting::where('transporter_id', $transporterId)
            ->where('key', 'can_see_customer')
            ->where('value', 1)
            ->exists();
        return view('transporter.rides.view', compact(['ride', 'drivers', 'vehicles', 'canSeeCustomer']));
    }
    public function assign(Request $request, $rideId)
    {
        try {
            $transporterId = auth()->guard('trans')->user()->id;
            $ride = BookingRide::findOrFail(decrypt($rideId));

            $driverId = $request->driver_id;
            $vehicleId = $request->vehicle_id;
            $assignType = $request->assign_type;
            $isAcceptFlow = $request->is_accept_flow ?? false;

            $booking = Booking::find($ride->booking_id);
            $vehicle = Vehicle::findOrFail($vehicleId);

            if (!empty($booking->vehicle_preferred) && $vehicle->vehicle_type_id != $booking->vehicle_preferred) {
                return response()->json([
                    'message' => 'Selected vehicle does not match the preferred type'
                ], 422);
            }

            if ($assignType === "all") {
                BookingRide::where('trip_id', $ride->trip_id)
                    ->update([
                        'driver_id'      => $driverId,
                        'vehicle_id'     => $vehicleId,
                        'transporter_id' => $transporterId,
                        'status'         => BookingRide::ASSIGNED,
                    ]);
            } else {
                $ride->update([
                    'driver_id'      => $driverId,
                    'vehicle_id'     => $vehicleId,
                    'transporter_id' => $transporterId,
                    'status'         => BookingRide::ASSIGNED,
                ]);
            }

            // if ($isAcceptFlow) {
            //     // Update transporter for this ride
            //     $ride->update([
            //         'transporter_id' => $transporterId,
            //     ]);

            // Update the ride request to accepted
            // $rideRequest = RideRequest::where('ride_id', $ride->id)
            //     ->where('transporter_id', $transporterId)
            //     ->first();

            // if ($rideRequest) {
            //     $rideRequest->update([
            //         'status' => RideRequest::ACCEPTED,
            //     ]);

            //     // Expire other pending ride requests for the same ride
            //     RideRequest::where('ride_id', $ride->id)
            //         ->where('id', '!=', $rideRequest->id)
            //         ->where('status', RideRequest::PENDING)
            //         ->update(['status' => RideRequest::EXPIRED]);
            // }
            // }

            return response()->json(['message' => 'Assignment successful!']);
        } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
            return response()->json([
                'message' => 'Invalid ride ID.'
            ], 400);
        } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) {
            return response()->json([
                'message' => 'Ride or vehicle not found.'
            ], 404);
        } catch (\Exception $e) {
            return response()->json([
                'message' => 'Something went wrong: ' . $e->getMessage()
            ], 500);
        }
    }
    public function requestChange(Request $request, $rideId)
    {
        $rideId = decrypt($rideId);
        $request->validate([
            'reason' => 'required|string|max:500',
        ]);

        $ride = BookingRide::findOrFail($rideId);
        $transporterId = auth()->guard('trans')->user()->id;

        TransporterRequest::create([
            'ride_id'        => $ride->id,
            'transporter_id' => $transporterId,
            'reason'         => $request->reason,
            'status'         => 0, // pending
        ]);

        return back()->with('success', 'Change request submitted successfully.');
    }
    public function getByType($type)
    {
        $query = Vehicle::query();

        if ($type != 0) {
            $query->where('vehicle_type_id', $type);
        }

        $vehicles = $query->get();

        return response()->json([
            'success' => true,
            'data' => $vehicles
        ]);
    }
}