File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Admin/TransporterController.php
<?php
namespace App\Http\Controllers\Admin;
use App\DataTables\Admin\TransporterDataTable;
use App\DataTables\Admin\TransporterRequestDataTable;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\TransporterRequest;
use App\Models\Document;
use App\Models\Transporter;
use App\Models\TransporterRequest as ModelsTransporterRequest;
use App\Models\TransporterSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
class TransporterController extends Controller
{
public function index(TransporterDataTable $dataTable)
{
if (!auth()->user()->can('transporter.view')) {
abort(403, 'You do not have permission to view transporters.');
}
return $dataTable->render('admin.transporter.index');
}
public function requestIndex(TransporterRequestDataTable $dataTable)
{
if (!auth()->user()->can('transporter.view')) {
abort(403, 'You do not have permission to view transporters.');
}
return $dataTable->render('admin.transporter.requestIndex');
}
public function create(Request $request)
{
if (!auth()->user()->can('transporter.create')) {
abort(403, 'You do not have permission to create transporter.');
}
return view('admin.transporter.create');
}
public function store(TransporterRequest $request)
{
$transporter = new Transporter();
$transporter->company_name = $request->company_name;
$transporter->contact_person = $request->contact_person;
$transporter->first_name = $request->first_name;
$transporter->last_name = $request->last_name;
$transporter->email = $request->email;
$transporter->phone = $request->phone;
$transporter->status = $request->status;
$transporter->password = Hash::make($request->password);
$transporter->address = $request->address;
$transporter->transporter_type = $request->transporter_type;
$transporter->ride_permissions = $request->input('ride_permissions', []);
if ($request->hasFile('image')) {
$transporter->image = $request->file('image')->store("uploads/transporter/temp", 'public');
}
$transporter->save();
if ($transporter->image) {
$path = str_replace("temp", $transporter->id, $transporter->image);
Storage::disk('public')->move($transporter->image, $path);
$transporter->image = $path;
$transporter->save();
}
$documents = $request->file('documents', []);
$docNumbers = $request->input('doc_numbers', []);
foreach (['aadhaar', 'pan', 'gst'] as $type) {
$file = $documents[$type] ?? null;
$docNumber = $docNumbers[$type] ?? null;
if ($file || $docNumber) {
$path = $file ? $file->store("uploads/transporters/{$transporter->id}", 'public') : null;
$transporter->documents()->create([
'doc_type' => $type,
'doc_number' => $docNumber,
'file_url' => $path,
]);
}
}
if ($request->has('settings')) {
foreach ($request->settings as $key => $value) {
TransporterSetting::updateOrCreate(
[
'transporter_id' => $transporter->id,
'key' => $key,
],
[
'value' => $value ? 1 : 0,
]
);
}
}
$transporter->refreshVerificationStatus();
return redirect()->route('admin.transporter.index')->with('success', 'Transporter created successfully!');
}
public function view(string $id)
{
$transporter = Transporter::with('documents')->find($id);
if (!isset($transporter)) {
return redirect()->route('admin.transporter.index')->with('error', 'Transporter not found!');
}
$progress = 0;
$hasVerifiedDocs = $transporter->documents()->where('is_verified', 1)->count() > 0
&& $transporter->documents()->where('is_verified', 0)->count() == 0;
if ($hasVerifiedDocs) {
$progress += 50;
}
$hasVerifiedDriver = $transporter->drivers()->where('is_verified', 1)->exists();
if ($hasVerifiedDriver) {
$progress += 25;
}
$hasVerifiedVehicle = $transporter->vehicles()->where('is_verified', 1)->exists();
if ($hasVerifiedVehicle) {
$progress += 25;
}
// dd($transporter);
return view('admin.transporter.view', compact(['transporter','progress']));
}
public function edit(Request $request, $id)
{
if (!auth()->user()->can('transporter.edit')) {
abort(403, 'You do not have permission to edit transporter.');
}
$transporter = Transporter::with(['documents', 'settings'])->find($id);
if (!isset($transporter)) {
return redirect()->route('admin.transporter.index')->with('error', 'Transporter not found!');
}
$documents = $transporter->documents->keyBy('doc_type');
return view('admin.transporter.edit', compact('transporter', 'documents'));
}
public function update(TransporterRequest $request, $id)
{
// dd($request->all());
$transporter = Transporter::with('documents')->find($id);
$transporter->company_name = $request->company_name;
$transporter->contact_person = $request->contact_person;
$transporter->first_name = $request->first_name;
$transporter->last_name = $request->last_name;
$transporter->email = $request->email;
$transporter->phone = $request->phone;
$transporter->status = $request->status;
$transporter->address = $request->address;
$transporter->transporter_type = $request->transporter_type;
$transporter->ride_permissions = $request->input('ride_permissions', []);
if ($request->hasFile('image')) {
if ($transporter->image && Storage::disk('public')->exists($transporter->image)) {
Storage::disk('public')->delete($transporter->image);
}
$transporter->image = $request->file('image')
->store("uploads/transporter/{$transporter->id}", 'public');
}
$transporter->update();
$documents = $request->file('documents', []);
$docNumbers = $request->input('doc_numbers', []);
foreach (['aadhaar', 'pan', 'gst'] as $type) {
$file = $documents[$type] ?? null;
$docNumber = $docNumbers[$type] ?? null;
if (!$file && !$docNumber) continue;
$document = $transporter->documents()->where('doc_type', $type)->first();
$path = $file ? $file->store("uploads/transporters/{$transporter->id}", 'public') : null;
if ($document) {
$document->update([
'doc_number' => $docNumber ?? $document->doc_number,
'file_url' => $path ?? $document->file_url,
'uploaded_at' => now(),
]);
} else {
$transporter->documents()->create([
'doc_type' => $type,
'doc_number' => $docNumber,
'file_url' => $path,
'uploaded_at' => now(),
]);
}
}
if ($request->has('settings')) {
foreach ($request->settings as $key => $value) {
TransporterSetting::updateOrCreate(
[
'transporter_id' => $transporter->id,
'key' => $key,
],
[
'value' => $value ?? 0,
]
);
}
}
$transporter->refreshVerificationStatus();
return redirect()->route('admin.transporter.index')->with('success', 'Transporter updated successfully!');
}
public function delete(Request $request, $id)
{
$transporter = Transporter::find($id);
if (!isset($transporter)) {
return response()->json([
'status' => false,
'message' => 'Transporter not found!',
]);
}
foreach ($transporter->documents as $document) {
if ($document->file_url && Storage::disk('public')->exists($document->file_url)) {
Storage::disk('public')->delete($document->file_url);
}
$document->delete();
}
$transporter->delete();
return response()->json([
'status' => true,
'message' => 'Transporter deleted successfully!',
]);
}
public function requestStatus($id, $status)
{
$request = ModelsTransporterRequest::findOrFail($id);
if (!in_array($status, [0, 1, 2])) {
return response()->json([
'status' => false,
'message' => 'Invalid status.'
]);
}
$request->status = $status;
$request->save();
return response()->json([
'status' => true,
'message' => 'Request status updated successfully.'
]);
}
public function requestDestroy($id)
{
$request = ModelsTransporterRequest::findOrFail($id);
$request->delete();
return response()->json([
'status' => true,
'message' => 'Request deleted successfully.'
]);
}
public function verify(Request $request, $id)
{
$transporter = Transporter::with(['documents', 'drivers', 'vehicles'])->findOrFail($id);
if ($request->status == 1) {
$allDocumentsVerified =
$transporter->documents->count() > 0 &&
$transporter->documents->where('is_verified', 0)->count() == 0;
if (! $allDocumentsVerified) {
return response()->json([
'message' => 'All documents must be verified before verifying the transporter.'
], 422);
}
$hasVerifiedDriver = $transporter->drivers()->where('is_verified', 1)->exists();
$hasVerifiedVehicle = $transporter->vehicles()->where('is_verified', 1)->exists();
if (! $hasVerifiedDriver && ! $hasVerifiedVehicle) {
return response()->json([
'message' => 'At least one verified driver and one verified vehicle are required before verifying the transporter.'
], 422);
}
if (! $hasVerifiedDriver) {
return response()->json([
'message' => 'At least one verified driver is required before verifying the transporter.'
], 422);
}
if (! $hasVerifiedVehicle) {
return response()->json([
'message' => 'At least one verified vehicle is required before verifying the transporter.'
], 422);
}
}
$transporter->is_verified = $request->status == 1;
$transporter->save();
return response()->json(['message' => 'Transporter verification status updated 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!']);
}
}