File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Admin/DriverController.php
<?php
namespace App\Http\Controllers\Admin;
use App\DataTables\Admin\DriverDataTable;
use App\Http\Controllers\Controller;
use App\Models\Document;
use App\Models\Driver;
use App\Models\Transporter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class DriverController extends Controller
{
public function index(DriverDataTable $dataTable)
{
return $dataTable->render('admin.driver.index');
}
public function create()
{
$transporters = Transporter::all();
return view('admin.driver.create', compact('transporters'));
}
public function store(Request $request)
{
$request->validate([
'transporter_id' => 'required|exists:transporters,id',
'name' => 'required|string|max:255',
'email' => 'required|email|max:255|unique:drivers,email',
'phone' => 'required|string|max:10|unique:drivers,phone',
'age' => 'required|string',
'gender' => 'required|in:male,female,other',
'profile_image' => 'required|file|mimes:jpg,jpeg,png|max:2048',
'documents' => 'required|array|min:1',
'documents.*.type' => 'required|string|in:dl,aadhar,pan,passport',
'documents.*.number' => 'required|string|max:255',
'documents.*.file' => 'required|file|mimes:jpg,jpeg,png,pdf|max:2048',
// 'documents.*.expiry_date' => 'required_if:documents.*.type,dl|date|after:today',
], [
'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.',
]);
$driver = new Driver();
$driver->transporter_id = $request->transporter_id;
$driver->name = $request->name;
$driver->email = $request->email;
$driver->phone = $request->phone;
$driver->about = $request->about;
$driver->experience = $request->experience;
$driver->alternate_number = $request->alternate_number;
$driver->age = $request->age;
$driver->gender = $request->gender;
$driver->status = $request->status;
if ($request->hasFile('profile_image')) {
$driver->image = $request->file('profile_image')->store("uploads/driver/temp", 'public');
}
$driver->save();
if ($driver->image) {
$path = str_replace("temp", $driver->id, $driver->image);
Storage::disk('public')->move($driver->image, $path);
$driver->image = $path;
$driver->save();
}
foreach ($request->documents as $doc) {
$filePath = null;
if (!empty($doc['file'])) {
$filePath = $doc['file']->store("uploads/driver/{$driver->id}", 'public');
}
$driver->documents()->create([
'doc_type' => $doc['type'],
'doc_number' => $doc['number'],
'file_url' => $filePath,
'expiry_date' => $doc['expiry_date'] ?? null,
]);
}
$driver->refreshVerificationStatus();
return redirect()->route('admin.driver.index')->with('success', 'Driver created successfully!');
}
public function edit(string $id)
{
$driver = Driver::find($id);
if (!isset($driver)) {
return redirect()->route('admin.driver.index')->with('error', 'Driver not found!');
}
$transporters = Transporter::all();
return view('admin.driver.edit', compact('driver', 'transporters'));
}
public function view(string $id)
{
$driver = Driver::with('documents')->find($id);
if (!isset($driver)) {
return redirect()->route('admin.driver.index')->with('error', 'Driver not found!');
}
// dd($driver);
return view('admin.driver.view', compact('driver'));
}
public function update(Request $request, string $id)
{
$driver = Driver::find($id);
if (!$driver) {
return redirect()->route('admin.driver.index')->with('error', 'Driver not found!');
}
$hasDocuments = $driver->documents()->exists();
$rules = [
'transporter_id' => 'required|exists:transporters,id',
'name' => 'required|string|max:255',
'email' => 'required|email|max:255|unique:drivers,email,' . $driver->id,
'phone' => 'required|string|max:15|unique:drivers,phone,' . $driver->id,
'age' => 'required|string',
'gender' => 'required|in:male,female,other',
'status' => 'required|in:active,inactive,suspended',
'profile_image' => 'nullable|file|mimes:jpg,jpeg,png|max:2048',
];
if (!$hasDocuments) {
$rules['documents'] = 'nullable|array';
} else {
$rules['documents'] = 'nullable|array';
}
$rules['documents.*.type'] = 'required|string|in:dl,aadhar,pan,passport';
$rules['documents.*.number'] = 'required|string|max:255';
$rules['documents.*.file'] = 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048';
$request->validate($rules, [
'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.',
]);
$driver->transporter_id = $request->transporter_id;
$driver->name = $request->name;
$driver->email = $request->email;
$driver->phone = $request->phone;
$driver->about = $request->about;
$driver->experience = $request->experience;
$driver->alternate_number = $request->alternate_number;
$driver->age = $request->age;
$driver->gender = $request->gender;
$driver->status = $request->status;
if ($request->hasFile('profile_image')) {
if ($driver->image && Storage::disk('public')->exists($driver->image)) {
Storage::disk('public')->delete($driver->image);
}
$driver->image = $request->file('profile_image')
->store("uploads/driver/{$driver->id}", 'public');
}
$driver->save();
if ($request->filled('documents')) {
foreach ($request->documents as $doc) {
$existingDoc = $driver->documents()->where('doc_type', $doc['type'])->first();
$filePath = $existingDoc->file_url ?? null;
if (!empty($doc['file'])) {
if ($filePath && Storage::disk('public')->exists($filePath)) {
Storage::disk('public')->delete($filePath);
}
$filePath = $doc['file']->store("uploads/driver/{$driver->id}", 'public');
}
$driver->documents()->updateOrCreate(
['doc_type' => $doc['type']],
[
'doc_number' => $doc['number'],
'file_url' => $filePath,
'expiry_date' => $doc['expiry_date'] ?? ($existingDoc->expiry_date ?? null),
]
);
}
}
$driver->refreshVerificationStatus();
return redirect()->route('admin.driver.index')->with('success', 'Driver updated successfully!');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
$driver = Driver::find($id);
if (!isset($driver)) {
return response()->json([
'status' => false,
'message' => 'Driver not found!',
]);
}
foreach ($driver->documents as $document) {
if ($document->file_url && Storage::disk('public')->exists($document->file_url)) {
Storage::disk('public')->delete($document->file_url);
}
$document->delete();
}
$driver->delete();
return response()->json([
'status' => true,
'message' => 'Driver 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 verifyDriver(Request $request, $id)
{
$driver = Driver::with('documents')->findOrFail($id);
if ($request->status == 1) {
$allVerified = $driver->documents->count() > 0 &&
$driver->documents->where('is_verified', 0)->count() == 0;
if (! $allVerified) {
return response()->json(['message' => 'All documents must be verified before marking driver verified.'], 422);
}
}
$driver->is_verified = $request->status == 1;
$driver->save();
return response()->json(['message' => 'Driver verification status updated successfully!']);
}
public function updateStatus(Request $request, $id)
{
try {
$driver = Driver::findOrFail($id);
$driver->status = $request->status;
$driver->save();
return response()->json([
'success' => true,
'message' => 'Driver status updated successfully!',
'status' => $driver->status
]);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Something went wrong: ' . $e->getMessage()
], 500);
}
}
}