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