new_malcomm_oline/app/Http/Controllers/VehicleController.php

132 lines
5.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Vehicle;
use Illuminate\Http\Request;
use Illuminate\View\View;
class VehicleController extends Controller
{
public function index(Request $request): View
{
$query = Vehicle::with('user');
if ($request->user()->hasRole('pracownik')) {
$query->where('user_id', $request->user()->id);
}
$search = trim((string) $request->query('search', ''));
if ($search !== '') {
$query->where(function ($query) use ($search) {
$query->where('brand', 'like', "%{$search}%")
->orWhere('model', 'like', "%{$search}%")
->orWhere('registration_number', 'like', "%{$search}%")
->orWhere('insurance_provider', 'like', "%{$search}%")
->orWhere('status', 'like', "%{$search}%")
->orWhereHas('user', function ($userQuery) use ($search) {
$userQuery->where('name', 'like', "%{$search}%")
->orWhere('surname', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
});
});
}
$vehicles = $query->orderBy('brand')->orderBy('registration_number')->paginate(15)->withQueryString();
$users = User::orderBy('name')->orderBy('surname')->get();
return view('flota', compact('vehicles', 'users'));
}
public function create(Request $request): View
{
$this->authorizeVehicleManagement($request);
$users = User::orderBy('name')->orderBy('surname')->get();
return view('flota.create', compact('users'));
}
public function store(Request $request)
{
$this->authorizeVehicleManagement($request);
$validated = $request->validate([
'brand' => ['required', 'string', 'max:255'],
'model' => ['nullable', 'string', 'max:255'],
'registration_number' => ['required', 'string', 'max:50', 'unique:vehicles,registration_number'],
'user_id' => ['required', 'integer', 'exists:users,id'],
'year' => ['required', 'integer', 'min:1900', 'max:2100'],
'purchase_date' => ['required', 'date'],
'oc_expiry_date' => ['required', 'date'],
'oil_change_km' => ['required', 'integer', 'min:0'],
'insurance_provider' => ['required', 'string', 'max:255'],
'technical_inspection_date' => ['required', 'date'],
'mileage_km' => ['required', 'integer', 'min:0'],
'status' => ['required', 'string', 'in:aktywny,serwis,używany,sprzedany'],
]);
Vehicle::create($validated);
return redirect()->route('flota')->with('status', 'Pojazd został dodany.');
}
public function edit(Request $request, Vehicle $vehicle): View
{
$this->authorizeVehicleManagement($request);
$this->authorizeVehicleAccess($request, $vehicle);
$users = User::orderBy('name')->orderBy('surname')->get();
return view('flota.edit', compact('vehicle', 'users'));
}
public function update(Request $request, Vehicle $vehicle)
{
$this->authorizeVehicleManagement($request);
$this->authorizeVehicleAccess($request, $vehicle);
$validated = $request->validate([
'brand' => ['required', 'string', 'max:255'],
'model' => ['nullable', 'string', 'max:255'],
'registration_number' => ['required', 'string', 'max:50', 'unique:vehicles,registration_number,' . $vehicle->id],
'user_id' => ['required', 'integer', 'exists:users,id'],
'year' => ['required', 'integer', 'min:1900', 'max:2100'],
'purchase_date' => ['required', 'date'],
'oc_expiry_date' => ['required', 'date'],
'oil_change_km' => ['required', 'integer', 'min:0'],
'insurance_provider' => ['required', 'string', 'max:255'],
'technical_inspection_date' => ['required', 'date'],
'mileage_km' => ['required', 'integer', 'min:0'],
'status' => ['required', 'string', 'in:aktywny,serwis,używany,sprzedany'],
]);
$vehicle->update($validated);
return redirect()->route('flota')->with('status', 'Pojazd został zaktualizowany.');
}
public function destroy(Request $request, Vehicle $vehicle)
{
$this->authorizeVehicleManagement($request);
$this->authorizeVehicleAccess($request, $vehicle);
$vehicle->delete();
return redirect()->route('flota')->with('status', 'Pojazd został usunięty.');
}
private function authorizeVehicleManagement(Request $request): void
{
abort_unless($request->user()->can('flota_access'), 403);
}
private function authorizeVehicleAccess(Request $request, Vehicle $vehicle): void
{
if ($request->user()->hasRole('pracownik') && $vehicle->user_id !== $request->user()->id) {
abort(403);
}
}
}