132 lines
5.0 KiB
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);
|
|
}
|
|
}
|
|
}
|