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/Admin/VehicleController.php
<?php

namespace App\Http\Controllers\Admin;

use App\DataTables\Admin\VehicleDataTable;
use App\DataTables\Admin\VehicleTypeDataTable;
use App\Http\Controllers\Controller;
use App\Models\Document;
use App\Models\Transporter;
use App\Models\Vehicle;
use App\Models\VehicleType;
use Yajra\DataTables\DataTables;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class VehicleController extends Controller
{
    public function index(VehicleDataTable $dataTable)
    {
        return $dataTable->render('admin.vehicle.index');
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        $transporters = Transporter::all();
        $vehicleTypes = VehicleType::all();
        return view('admin.vehicle.create', compact(['vehicleTypes', 'transporters']));
    }


    public function store(Request $request)
    {
        // dd($request->all());
        $request->validate([
            'transporter_id' => 'required|exists:transporters,id',
            'vehicle_type' => 'required|exists:vehicle_types,id',
            'make' => 'required|string|max:255',
            'model' => 'required|string|max:255',
            'manufacturing_year' => 'required|integer|min:1900|max:' . date('Y'),
            'status' => 'required|in:active,under_maintenance,inactive',
            'documents.*.type' => 'required|string|in:rc,insurance,pollution,permit,other',
            'documents.*.number' => 'nullable|string|max:255',
            'documents.*.file' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',
            'documents.*.expiry_date' => 'nullable|date',
            'vehicle_images.*' => 'nullable|file|mimes:jpg,jpeg,png|max:2048',
        ]);

        $vehicle = new Vehicle();
        $vehicle->vehicle_type_id = $request->vehicle_type;
        $vehicle->transporter_id = $request->transporter_id;
        $vehicle->make = $request->make;
        $vehicle->model = $request->model;
        $vehicle->year = $request->manufacturing_year;
        $vehicle->status = $request->status;

        // RC number set karo agar diya gaya hai
        $rcDocument = collect($request->documents)->firstWhere('type', 'rc');
        $vehicle->registration_number = $rcDocument['number'] ?? null;

        $vehicle->save();

        if ($request->has('documents')) {
            foreach ($request->documents as $doc) {
                $filePath = isset($doc['file'])
                    ? $doc['file']->store("uploads/vehicle/{$vehicle->id}", 'public')
                    : null;

                $vehicle->documents()->create([
                    'doc_type' => $doc['type'],
                    'doc_number' => $doc['number'] ?? null,
                    'file_url' => $filePath,
                    'expiry_date' => $doc['expiry_date'] ?? null,
                ]);
            }
        }
        $vehicle->refreshVerificationStatus();

        if ($request->hasFile('vehicle_images')) {
            $file = $request->file('vehicle_images');
            $path = $file->store("uploads/vehicle/{$vehicle->id}", 'public');
            $vehicle->vehicle_image = $path;
            $vehicle->save();
        }

        return redirect()->route('admin.vehicle.index')
            ->with('success', 'Vehicle created successfully!');
    }


    public function view(string $id)
    {
        $vehicle = Vehicle::with('documents')->find($id);
        if (!isset($vehicle)) {
            return redirect()->route('admin.vehicle.index')->with('error', 'vehicle not found!');
        }
        // dd($vehicle);
        return view('admin.vehicle.view', compact('vehicle'));
    }


    public function edit(string $id)
    {
        $vehicle = Vehicle::with('documents')->find($id);
        if (!isset($vehicle)) {
            return redirect()->route('admin.vehicle.index')->with('error', 'Vehicle not found!');
        }
        $transporters = Transporter::all();
        $vehicleTypes = VehicleType::all();
        return view('admin.vehicle.edit', compact(['vehicle', 'vehicleTypes', 'transporters']));
    }


    public function update(Request $request, string $id)
    {
        // dd($request->all());
        $vehicle = Vehicle::find($id);
        if (!$vehicle) {
            return redirect()->route('admin.vehicle.index')->with('error', 'Vehicle not found!');
        }

        $request->validate([
            'transporter_id' => 'required|exists:transporters,id',
            'vehicle_type' => 'required|exists:vehicle_types,id',
            'make' => 'required|string|max:255',
            'model' => 'required|string|max:255',
            'manufacturing_year' => 'required|integer|min:1900|max:' . date('Y'),
            'status' => 'required|in:active,under_maintenance,inactive',
            'documents.*.type' => 'required|string|in:rc,insurance,pollution,permit,other',
            'documents.*.number' => 'nullable|string|max:255',
            'documents.*.file' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',
            'documents.*.expiry_date' => 'nullable|date',
            'vehicle_images.*' => 'nullable|file|mimes:jpg,jpeg,png|max:2048',
        ], [
            'documents.required'      => 'At least one document is required.',
            'documents.*.type.required'   => 'Document type is required.',
            'documents.*.type.in'         => 'Invalid document type selected.',
            'documents.*.number.required' => 'Document number is required.',
            'documents.*.file.required'   => 'Document photo/file is required.',
            'documents.*.expiry_date.required_if' => 'Expiry date is required for Driving License.',
            'documents.*.expiry_date.after' => 'Expiry date must be a future date.',
        ]);

        $vehicle->vehicle_type_id = $request->vehicle_type;
        $vehicle->transporter_id = $request->transporter_id;
        $vehicle->make = $request->make;
        $vehicle->model = $request->model;
        $vehicle->year = $request->manufacturing_year;
        $vehicle->status = $request->status;

        $rcDocument = collect($request->documents)->firstWhere('type', 'rc');
        $vehicle->registration_number = $rcDocument['number'] ?? $vehicle->registration_number;

        $vehicle->save();

        if ($request->has('documents')) {
            foreach ($request->documents as $doc) {
                $existingDoc = $vehicle->documents()->where('doc_type', $doc['type'])->first();
                $filePath = null;

                if (isset($doc['file'])) {
                    if ($existingDoc && $existingDoc->file_url && Storage::disk('public')->exists($existingDoc->file_url)) {
                        Storage::disk('public')->delete($existingDoc->file_url);
                    }

                    $filePath = $doc['file']->store("uploads/vehicle/{$vehicle->id}", 'public');
                } else {
                    $filePath = $existingDoc->file_url ?? null;
                }

                $vehicle->documents()->updateOrCreate(
                    ['doc_type' => $doc['type']],
                    [
                        'doc_number' => $doc['number'] ?? null,
                        'file_url'   => $filePath,
                        'expiry_date' => $doc['expiry_date'] ?? null,
                    ]
                );
            }
        }
        $vehicle->refreshVerificationStatus();
        if ($request->hasFile('vehicle_images')) {
            if ($vehicle->vehicle_image && Storage::disk('public')->exists($vehicle->vehicle_image)) {
                Storage::disk('public')->delete($vehicle->vehicle_image);
            }

            $file = $request->file('vehicle_images');
            $path = $file->store("uploads/vehicle/{$vehicle->id}", 'public');

            $vehicle->vehicle_image = $path;
            $vehicle->save();
        }


        return redirect()->route('admin.vehicle.index')->with('success', 'Vehicle updated successfully!');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        $vehicle = Vehicle::find($id);
        if (!isset($vehicle)) {
            return response()->json([
                'status' => false,
                'message' => 'Vehicle not found!',
            ]);
        }
        foreach ($vehicle->documents as $document) {
            if ($document->file_url && Storage::disk('public')->exists($document->file_url)) {
                Storage::disk('public')->delete($document->file_url);
            }
            $document->delete();
        }
        $vehicle->delete();

        return response()->json([
            'status' => true,
            'message' => 'Vehicle deleted successfully!',
        ]);
    }

    public function deleteDocument(string $id)
    {
        $doc = Document::findOrFail($id);
        if ($doc->file_url && Storage::disk('public')->exists($doc->file_url)) {
            Storage::disk('public')->delete($doc->file_url);
        }

        $doc->delete();

        return response()->json(['success' => true, 'message' => 'Document deleted successfully.']);
    }
    public function verifyDocument($id)
    {
        $document = Document::findOrFail($id);
        $document->is_verified = 1;
        $document->save();

        return response()->json(['message' => 'Document verified successfully!']);
    }
    public function verifyVehicle(Request $request, $id)
    {
        $vehicle = Vehicle::with('documents')->findOrFail($id);

        if ($request->status == 1) {
            $allVerified = $vehicle->documents->count() > 0 &&
                $vehicle->documents->where('is_verified', 0)->count() == 0;

            if (! $allVerified) {
                return response()->json(['message' => 'All documents must be verified before marking vehicle verified.'], 422);
            }
        }

        $vehicle->is_verified = $request->status == 1;
        $vehicle->save();

        return response()->json(['message' => 'Vehicle verification status updated successfully!']);
    }
    public function updateStatus(Request $request, $id)
    {
        try {
            $vehicle = Vehicle::findOrFail($id);
            $vehicle->status = $request->status;
            $vehicle->save();

            return response()->json([
                'success' => true,
                'message' => 'Vehicle status updated successfully!',
                'status'  => $vehicle->status
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'Something went wrong: ' . $e->getMessage()
            ], 500);
        }
    }
}