user(); $pengguna = User::query() ->when( $user->isPengurus(), fn ($q) => $q->where('dun_id', $user->dun_id)->whereIn('role', self::PERANAN_PENGURUS) ) ->with('dun') ->orderBy('role') ->orderBy('name') ->get(); return view('pengguna.index', compact('pengguna')); } public function create(Request $request) { $user = $request->user(); $senaraiDun = Dun::where('is_active', true) ->when($user->isPengurus(), fn ($q) => $q->where('id', $user->dun_id)) ->orderBy('code') ->get(); $peranan = $user->isAdmin() ? self::PERANAN_ADMIN : self::PERANAN_PENGURUS; return view('pengguna.create', compact('senaraiDun', 'peranan')); } public function store(Request $request) { $user = $request->user(); $perananDibenarkan = $user->isAdmin() ? self::PERANAN_ADMIN : self::PERANAN_PENGURUS; $data = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'email', 'max:255', 'unique:users,email'], 'role' => ['required', 'string', Rule::in($perananDibenarkan)], 'dun_id' => ['nullable', 'integer'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ], [ 'email.unique' => 'E-mel ini sudah didaftarkan.', 'password.min' => 'Kata laluan perlu sekurang-kurangnya 8 aksara.', 'password.confirmed' => 'Pengesahan kata laluan tidak sepadan.', ]); if ($user->isPengurus()) { // Pengurus hanya boleh daftar untuk DUN sendiri, tidak kira input. $data['dun_id'] = $user->dun_id; } elseif ($data['role'] === 'admin') { $data['dun_id'] = null; } elseif (empty($data['dun_id'])) { return back()->withErrors(['dun_id' => 'Sila pilih DUN untuk peranan ini.'])->withInput(); } if (! empty($data['dun_id']) && ! Dun::where('id', $data['dun_id'])->where('is_active', true)->exists()) { return back()->withErrors(['dun_id' => 'DUN tidak sah.'])->withInput(); } User::create([ 'name' => $data['name'], 'email' => $data['email'], 'role' => $data['role'], 'dun_id' => $data['dun_id'] ?? null, 'password' => Hash::make($data['password']), ]); return redirect()->route('pengguna.index')->with('status', 'Pengguna baharu berjaya didaftarkan.'); } }