'required|string|max:255', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', 'role' => 'required|string|exists:roles,name', 'contractor_id' => 'required|exists:contractors,id', ]; } public function mount() { $this->loadData(); } public function loadData() { $user = Auth::user(); // Populate available permissions strictly based on what the current user possesses // (to prevent privilege escalation). $this->availablePermissions = $user->getAllPermissions()->pluck('name', 'name')->toArray(); // 1. Determine which users this person can see if ($user->hasRole('admin')) { $this->users = User::all(); $this->availableRoles = Role::pluck('name', 'name')->toArray(); $this->availableContractors = Contractor::all(); } elseif ($user->hasRole('Main Contractor Admin') && $user->contractor) { $contractorIds = array_merge( [$user->contractor_id], $user->contractor->children()->pluck('id')->toArray() ); $this->users = User::whereIn('contractor_id', $contractorIds)->get(); $this->availableRoles = ['Main Contractor Admin', 'Construction Supervisor', 'Site Technical']; $this->availableContractors = Contractor::whereIn('id', $contractorIds)->get(); } else { $this->users = collect(); $this->availableRoles = []; $this->availableContractors = collect(); $this->availablePermissions = []; } } public function createUser() { $this->validate(); $contractor = Contractor::find($this->contractor_id); // Enforce user limits in the UI layer as well before saving if ($contractor && $contractor->user_limit > 0) { $currentUsers = $contractor->users()->count(); if ($currentUsers >= $contractor->user_limit) { session()->flash('error', 'Cannot create user: The contractor has reached its limit of ' . $contractor->user_limit . ' users.'); return; } } try { $newUser = User::create([ 'name' => $this->name, 'email' => $this->email, 'password' => bcrypt($this->password), 'contractor_id' => $this->contractor_id, ]); $newUser->assignRole($this->role); // Assign direct permissions explicitly chosen if (!empty($this->selectedPermissions)) { $newUser->syncPermissions($this->selectedPermissions); } $this->reset(['name', 'email', 'password', 'role', 'contractor_id', 'selectedPermissions']); $this->loadData(); session()->flash('message', 'User created successfully.'); } catch (\Exception $e) { session()->flash('error', $e->getMessage()); } } public function render() { return view('usermanagement::livewire.user-manager'); } }