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