has('role') && request('role') != '') { $query->where('role', request('role')); } $users = $query->paginate(10)->appends(request()->query()); $whitelists = MasterInduk::orderBy('created_at', 'desc')->get(); return view('admin.pengguna.index', [ 'pageTitle' => 'Daftar Pengguna', 'users' => $users, 'whitelists' => $whitelists ]); } public function create() { return view('admin.pengguna.create', ['pageTitle' => 'Tambah Pengguna Baru']); } public function store(Request $request) { $request->validate([ 'nama_lengkap' => 'required|string|max:255', 'email' => 'required|email|unique:users,email', 'role' => 'required|in:siswa,guru,penjaga perpus', 'no_hp' => 'nullable|string|max:20', 'password' => 'required|min:6|confirmed', 'nomor_induk' => [ 'required', function ($attribute, $value, $fail) use ($request) { $label = $request->role == 'siswa' ? 'NISN' : 'NIP/NIK'; // Cek Nisn/Nip sudah dipakai di tabel users $sudahDipakai = User::where('nisn', $value)->orWhere('nip', $value)->exists(); if ($sudahDipakai) { $fail("{$label} ini sudah digunakan oleh akun lain."); return; } if (in_array($request->role, ['siswa', 'guru'])) { $terdaftar = MasterInduk::where('nomor_induk', $value) ->where('role', $request->role) ->exists(); if (!$terdaftar) { $fail("{$label} tidak terdaftar di data sekolah. Hubungi admin."); } } }, ], ], [ 'role.in' => 'Pilih role yang valid.', 'email.unique' => 'Email sudah terdaftar.', 'password.confirmed' => 'Konfirmasi password tidak cocok.' ]); $user = new User(); $user->name = $request->nama_lengkap; $user->email = $request->email; $user->role = $request->role; $user->password = Hash::make($request->password); $user->no_hp = $request->no_hp; // Validasi NISN dan NIP berdasarkan Role if ($request->role == 'siswa') { $user->nisn = $request->nomor_induk; $user->kelas = $request->kelas; $user->golongan = $request->golongan; } else { $user->nip = $request->nomor_induk; } $user->save(); return redirect()->route('admin.pengguna.index')->with('success', 'Pengguna berhasil ditambahkan.'); } public function edit($id) { $pengguna = User::findOrFail($id); return view('admin.pengguna.edit', [ 'pageTitle' => 'Edit Pengguna', 'pengguna' => $pengguna, ]); } public function update(Request $request, $id) { $request->validate([ 'nama_lengkap' => 'required|string|max:255', 'email' => 'required|email|unique:users,email,' . $id, 'role' => 'required|in:siswa,guru,penjaga perpus', 'no_hp' => 'nullable|string|max:20', 'password' => 'nullable|min:6|confirmed', 'nomor_induk' => [ 'required', function ($attribute, $value, $fail) use ($request, $id) { $label = $request->role == 'siswa' ? 'NISN' : 'NIP/NIK'; // cek nisn/nip sudah dipakai di tabel users (kecuali oleh dirinya sendiri) $sudahDipakai = User::where(function ($query) use ($value) { $query->where('nisn', $value)->orWhere('nip', $value); })->where('id', '!=', $id)->exists(); if ($sudahDipakai) { $fail("{$label} ini sudah digunakan oleh akun lain."); return; } if (in_array($request->role, ['siswa', 'guru'])) { $terdaftar = MasterInduk::where('nomor_induk', $value) ->where('role', $request->role) ->exists(); if (!$terdaftar) { $fail("{$label} tidak terdaftar di data sekolah. Hubungi admin."); } } }, ], ]); $user = User::findOrFail($id); $user->name = $request->nama_lengkap; $user->email = $request->email; $user->role = $request->role; $user->no_hp = $request->no_hp; // Jika password diisi, maka update. Jika kosong, biarkan password lama. if ($request->filled('password')) { $user->password = \Illuminate\Support\Facades\Hash::make($request->password); } $user->nisn = null; $user->nip = null; $user->kelas = null; $user->golongan = null; // Masukkan kembali sesuai role if ($request->role == 'siswa') { $user->nisn = $request->nomor_induk; $user->kelas = $request->kelas; $user->golongan = $request->golongan; } else { $user->nip = $request->nomor_induk; } $user->save(); return redirect()->route('admin.pengguna.index')->with('success', 'Data pengguna berhasil diperbarui.'); } public function destroy($id) { User::findOrFail($id)->delete(); return back()->with('success', 'Pengguna berhasil dihapus.'); } }