From c1e631c3ce896cc6b273535d9840370c6275e825 Mon Sep 17 00:00:00 2001 From: zhadaarsita Date: Thu, 5 Feb 2026 16:45:25 +0700 Subject: [PATCH 1/7] Feat: Master data induk NIP/NISN --- .../Admin/MasterIndukController.php | 31 ++ app/Http/Controllers/Admin/UserController.php | 34 ++- .../Controllers/Auth/AdminLoginController.php | 2 +- .../Auth/RegisteredUserController.php | 75 ++--- app/Http/Controllers/ProfileController.php | 46 +-- app/Http/Requests/Auth/LoginRequest.php | 116 ++------ app/Models/MasterInduk.php | 12 + app/Models/User.php | 11 + app/Providers/AuthServiceProvider.php | 12 +- config/auth.php | 6 +- .../0001_01_01_000000_create_users_table.php | 5 + ...2_05_064036_create_master_induks_table.php | 29 ++ database/seeders/DatabaseSeeder.php | 90 +++++- .../views/admin/pengguna/index.blade.php | 279 +++++++++++------- resources/views/auth/register.blade.php | 93 +++--- routes/web.php | 26 +- 16 files changed, 531 insertions(+), 336 deletions(-) create mode 100644 app/Http/Controllers/Admin/MasterIndukController.php create mode 100644 app/Models/MasterInduk.php create mode 100644 database/migrations/2026_02_05_064036_create_master_induks_table.php diff --git a/app/Http/Controllers/Admin/MasterIndukController.php b/app/Http/Controllers/Admin/MasterIndukController.php new file mode 100644 index 0000000..ad7c415 --- /dev/null +++ b/app/Http/Controllers/Admin/MasterIndukController.php @@ -0,0 +1,31 @@ +validate([ + 'nomor_induk' => 'required|unique:master_induks,nomor_induk', + 'role' => 'required|in:siswa,guru', + 'nama_pemilik' => 'required|string', + ]); + + MasterInduk::create($request->all()); + + return back()->with('success', 'Data Induk berhasil ditambahkan. User dengan NIP/NISN ini sekarang bisa mendaftar.'); + } + + // Menghapus Data + public function destroy($id) + { + MasterInduk::findOrFail($id)->delete(); + return back()->with('success', 'Data Induk dihapus.'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 8643ef7..d0cd80d 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -3,40 +3,42 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; -use App\Services\DummyDataService; +use App\Models\User; // Model User Asli +use App\Models\MasterInduk; // Model Whitelist +use Illuminate\Http\Request; class UserController extends Controller { public function index() { - $semuaSiswa = DummyDataService::getAllSiswa(); + $users = User::orderBy('created_at', 'desc')->paginate(10); + + $whitelists = MasterInduk::orderBy('created_at', 'desc')->get(); + return view('admin.pengguna.index', [ - 'pageTitle' => 'Manajemen Pengguna', - 'semuaSiswa' => $semuaSiswa + 'pageTitle' => 'Daftar Pengguna', + 'users' => $users, + 'whitelists' => $whitelists ]); } - /** - * Menampilkan form untuk membuat pengguna baru. - */ public function create() { - return view('admin.pengguna.create', [ - 'pageTitle' => 'Tambah Pengguna Baru', - ]); + return view('admin.pengguna.create', ['pageTitle' => 'Tambah Pengguna Baru']); } - /** - * Menampilkan form untuk mengedit pengguna yang ada. - */ public function edit($id) { - $pengguna = collect(DummyDataService::getAllSiswa())->firstWhere('id', (int)$id); - abort_if(!$pengguna, 404); - + $pengguna = User::findOrFail($id); return view('admin.pengguna.edit', [ 'pageTitle' => 'Edit Pengguna', 'pengguna' => $pengguna, ]); } + + public function destroy($id) + { + User::findOrFail($id)->delete(); + return back()->with('success', 'Pengguna berhasil dihapus.'); + } } \ No newline at end of file diff --git a/app/Http/Controllers/Auth/AdminLoginController.php b/app/Http/Controllers/Auth/AdminLoginController.php index 9f41832..3d4e140 100644 --- a/app/Http/Controllers/Auth/AdminLoginController.php +++ b/app/Http/Controllers/Auth/AdminLoginController.php @@ -19,7 +19,7 @@ public function create(): View // Memproses login admin public function store(LoginRequest $request): RedirectResponse { - $request->authenticate(); // Menjalankan logika ketat di LoginRequest + $request->authenticate(); $request->session()->regenerate(); return redirect()->route('admin.dashboard'); } diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 30d907f..0ab087a 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -4,83 +4,72 @@ use App\Http\Controllers\Controller; use App\Models\User; +use App\Models\MasterInduk; use Illuminate\Auth\Events\Registered; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules; +use Illuminate\Validation\ValidationException; use Illuminate\View\View; class RegisteredUserController extends Controller { - /** - * Menampilkan halaman registrasi. - */ public function create(Request $request): View { - // Bagian Pengambilan Role dari URL - $role = $request->query('role', 'siswa'); // Ambil 'role' dari URL, default ke 'siswa' - - // Kirim $role ke view + $role = $request->query('role', 'siswa'); return view('auth.register', ['role' => $role]); } - /** - * Menangani permintaan registrasi yang masuk. - */ public function store(Request $request): RedirectResponse { - // Bagian Validasi Dinamis $role = $request->input('role'); + $rules = [ 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'confirmed', Rules\Password::defaults()], - 'role' => ['required', 'in:siswa,guru'], // Sesuaikan dengan role yang diizinkan + 'role' => ['required', 'in:siswa,guru'], ]; - // Tambahkan validasi NISN atau NIP berdasarkan role + if ($role === 'siswa') { - $rules['nisn'] = ['required', 'string', 'max:255']; // Tambahkan 'unique:users' jika perlu - } else { // Asumsi 'guru' - $rules['nip'] = ['required', 'string', 'max:255']; // Tambahkan 'unique:users' jika perlu + $rules['nisn'] = ['required', 'string', 'max:255', 'unique:users,nisn']; + } else { + $rules['nip'] = ['required', 'string', 'max:255', 'unique:users,nip']; } $request->validate($rules); - // Bagian Pembuatan User - $userArray = [ - 'id' => rand(100, 999), // ID unik sementara - 'nama_lengkap' => $request->name, - 'name' => $request->name, - 'password' => Hash::make($request->password), // Gunakan Hash jika login Anda sudah pakai Hash - // 'password' => $request->password, // Gunakan ini jika login (LoginRequest) masih cek teks biasa - 'role' => $request->role, - ]; - - // Tambahkan field dinamis (NISN/NIP) dan buat email unik palsu - if ($role === 'siswa') { - $userArray['nisn'] = $request->nisn; - $userArray['email'] = $request->nisn . '@smkn1perpus.sch.id'; // Email unik sementara - } else { - $userArray['nip'] = $request->nip; - $userArray['email'] = $request->nip . '@smkn1perpus.sch.id'; // Email unik sementara - } - $user = new User(); - $user->forceFill($userArray); - // $user->save(); // Aktifkan ini jika menggunakan database + $nomorInduk = ($role === 'siswa') ? $request->nisn : $request->nip; + + $isWhitelisted = MasterInduk::where('nomor_induk', $nomorInduk) + ->where('role', $role) + ->exists(); + + if (!$isWhitelisted) { + throw ValidationException::withMessages([ + ($role === 'siswa' ? 'nisn' : 'nip') => ['Nomor induk tidak terdaftar di Data Sekolah. Hubungi petugas.'], + ]); + } + + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'role' => $role, + 'nisn' => ($role === 'siswa') ? $nomorInduk : null, + 'nip' => ($role === 'guru') ? $nomorInduk : null, + ]); event(new Registered($user)); Auth::login($user); - // Bagian Redirect - if ($user->role === 'penjaga perpus') { - return redirect()->route('admin.dashboard'); - } else { - return redirect()->route('dashboard'); - } + return redirect()->route('dashboard'); } } \ No newline at end of file diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 912d71c..b4a6669 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -2,42 +2,36 @@ namespace App\Http\Controllers; -use App\Http\Requests\ProfileUpdateRequest; +use App\Http\Requests\ProfileUpdateRequest; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Redirect; use Illuminate\View\View; +use Illuminate\Support\Facades\Hash; use App\Services\DummyDataService; class ProfileController extends Controller { /** - * Menampilkan halaman utama profil pengguna secara dinamis berdasarkan role. + * Tampilkan halaman profil user. */ - public function index(): RedirectResponse|View + public function index(Request $request): View { - $user = Auth::user(); - if (!$user) { - return redirect()->route(route: 'login'); - } - + $user = $request->user(); + $viewData = ['user' => $user]; - // Menyiapkan data berdasarkan role pengguna if ($user->role === 'penjaga perpus') { - // Data untuk Penjaga Perpus: Statistik global & aktivitas terkini $viewData['statistik'] = DummyDataService::getAdminDashboardStats(); $viewData['aktivitasTerakhir'] = DummyDataService::getAktivitasTerakhir(); } elseif ($user->role === 'guru') { - // Data untuk Guru: Data personal + ringkasan laporan minat baca $viewData['bukuOffline'] = DummyDataService::getBukuPinjamOffline($user); $viewData['bukuOnline'] = DummyDataService::getBacaBukuOnline($user); $viewData['laporan'] = DummyDataService::getLaporanMinatBaca(); } else { - // Data default untuk Siswa $viewData['bukuOffline'] = DummyDataService::getBukuPinjamOffline($user); $viewData['bukuOnline'] = DummyDataService::getBacaBukuOnline($user); $viewData['statistik'] = DummyDataService::getDashboardStats(); @@ -47,7 +41,7 @@ public function index(): RedirectResponse|View } /** - * Menampilkan form untuk mengedit profil. + * Tampilkan form edit profil. */ public function edit(Request $request): View { @@ -57,23 +51,31 @@ public function edit(Request $request): View } /** - * Memperbarui informasi profil pengguna. + * Update data profil ke Database MySQL. */ - public function update(ProfileUpdateRequest $request): RedirectResponse + public function update(Request $request): RedirectResponse { - $request->user()->fill($request->validated()); + // Validasi input + $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,'.Auth::id()], + 'nomor_hp' => ['nullable', 'string', 'max:15'], + ]); - if ($request->user()->isDirty('email')) { - $request->user()->email_verified_at = null; + $user = $request->user(); + $user->fill($request->all()); + + if ($user->isDirty('email')) { + $user->email_verified_at = null; } - $request->user()->save(); + $user->save(); return Redirect::route('profile.edit')->with('status', 'profile-updated'); } /** - * Menghapus akun pengguna. + * Hapus akun user. */ public function destroy(Request $request): RedirectResponse { @@ -85,11 +87,11 @@ public function destroy(Request $request): RedirectResponse Auth::logout(); - $user->delete(); + $user->delete(); $request->session()->invalidate(); $request->session()->regenerateToken(); return Redirect::to('/'); } -} +} \ No newline at end of file diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php index fc9d73e..b3bca95 100644 --- a/app/Http/Requests/Auth/LoginRequest.php +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -2,129 +2,74 @@ namespace App\Http\Requests\Auth; -use App\Models\User; -use App\Services\DummyDataService; +use Illuminate\Auth\Events\Lockout; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\RateLimiter; use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; -use Illuminate\Auth\Events\Lockout; class LoginRequest extends FormRequest { - /** - * Menentukan apakah pengguna diizinkan untuk membuat request ini. - * Selalu true karena semua orang boleh mencoba login. - */ public function authorize(): bool { return true; } - /** - * Mendapatkan aturan validasi yang berlaku untuk request ini. - * Aturan ini dinamis, berubah tergantung pada 'role' yang dikirim dari form. - */ public function rules(): array { - // Jika form mengirim 'role' dengan nilai 'siswa'... - if ($this->input('role') === 'siswa') { - // ...maka validasi input 'nisn' dan 'password'. - return [ - 'nisn' => ['required', 'string'], - 'password' => ['required', 'string'], - ]; - } - - // Jika tidak (untuk 'guru' dan 'penjaga perpus') return [ - 'nip' => ['required', 'string'], 'password' => ['required', 'string'], ]; } - /** - * Mencoba untuk mengautentikasi kredensial dari request. - * Ini adalah "otak" dari proses login yang berisi logika paling penting. - * - * @throws \Illuminate\Validation\ValidationException - */ public function authenticate(): void { - // Pastikan pengguna tidak mencoba login terlalu sering (mencegah brute-force). $this->ensureIsNotRateLimited(); - // Ambil data yang dikirim dari form login. - $roleDariForm = $this->input('role'); - $allUsers = DummyDataService::getAllSiswa(); - $inputPassword = $this->input('password'); - $userArray = null; + $loginString = $this->input('email') ?? $this->input('nisn') ?? $this->input('nip'); - // Tentukan field mana yang akan menerima pesan error jika gagal (nisn atau email). - $errorField = $this->filled('nisn') ? 'nisn' : 'nip'; + $password = $this->input('password'); - // Cari data pengguna berdasarkan input yang diberikan. - if ($this->filled('nisn')) { - // Jika form diisi dengan 'nisn', cari pengguna berdasarkan 'nisn'. - $userArray = collect($allUsers)->firstWhere('nisn', $this->input('nisn')); - } else { - // Jika tidak, cari pengguna berdasarkan 'nip'. - $userArray = collect($allUsers)->firstWhere('nip', $this->input('nip')); + if (!$loginString) { + throw ValidationException::withMessages([ + 'email' => 'Mohon masukkan NISN, NIP, atau Email.', + ]); } - // Lakukan Pengecekan Kredensial dan Role. - if ($userArray && $userArray['password'] === $inputPassword) { - - // Cek #2: Jika kredensial benar, apakah role pengguna sesuai dengan form yang digunakan? - if (isset($userArray['role']) && $userArray['role'] === $roleDariForm) { - - // Buat objek User dari data dummy. - $userModel = new User(); - $userArray['name'] = $userArray['nama_lengkap']; - $userModel->forceFill($userArray); - - // Loginkan pengguna secara resmi ke dalam sistem. - Auth::login($userModel); - - // Reset hitungan percobaan login yang gagal. - RateLimiter::clear($this->throttleKey()); - return; // Proses autentikasi berhasil. - - } else { - // Tambah hitungan percobaan login yang gagal. - RateLimiter::hit($this->throttleKey()); - - // Ambil nama role asli pengguna untuk ditampilkan di pesan error. - $actualRole = Str::title($userArray['role'] ?? 'Tidak Dikenal'); - - // Lemparkan error validasi khusus 'forbidden' dengan pesan yang jelas. - throw ValidationException::withMessages([ - 'forbidden' => "Akses ditolak. Akun ini terdaftar sebagai {$actualRole}.", - ]); - } + if (Auth::attempt(['nisn' => $loginString, 'password' => $password], $this->boolean('remember'))) { + RateLimiter::clear($this->throttleKey()); + return; + } + + if (Auth::attempt(['nip' => $loginString, 'password' => $password], $this->boolean('remember'))) { + RateLimiter::clear($this->throttleKey()); + return; + } + + if (Auth::attempt(['email' => $loginString, 'password' => $password], $this->boolean('remember'))) { + RateLimiter::clear($this->throttleKey()); + return; } - // Jika pengguna tidak ditemukan atau password salah. RateLimiter::hit($this->throttleKey()); + + $fieldError = $this->input('nisn') ? 'nisn' : ($this->input('nip') ? 'nip' : 'email'); + throw ValidationException::withMessages([ - $errorField => trans('auth.failed'), // Pesan error umum "These credentials do not match...". + $fieldError => trans('auth.failed'), ]); } - /** - * Memastikan request login tidak dibatasi karena terlalu banyak percobaan. - */ public function ensureIsNotRateLimited(): void { - // Jika percobaan belum melebihi 5 kali, lanjutkan. - if (!RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { return; } - // Jika sudah lebih dari 5 kali, lemparkan error 'throttle'. event(new Lockout($this)); $seconds = RateLimiter::availableIn($this->throttleKey()); + throw ValidationException::withMessages([ 'email' => trans('auth.throttle', [ 'seconds' => $seconds, @@ -133,14 +78,9 @@ public function ensureIsNotRateLimited(): void ]); } - /** - * Mendapatkan kunci throttle untuk request ini. - * Kunci ini unik untuk setiap pengguna (berdasarkan nisn/email) dan alamat IP. - */ public function throttleKey(): string { - // Gunakan 'nisn' jika ada, jika tidak, gunakan 'email' sebagai identitas. - $loginIdentifier = $this->input('nisn') ?: $this->input('nip'); - return Str::transliterate(Str::lower($loginIdentifier) . '|' . $this->ip()); + $field = $this->input('email') ?? $this->input('nisn') ?? $this->input('nip') ?? 'unknown'; + return Str::transliterate(Str::lower($field).'|'.$this->ip()); } } \ No newline at end of file diff --git a/app/Models/MasterInduk.php b/app/Models/MasterInduk.php new file mode 100644 index 0000000..316593b --- /dev/null +++ b/app/Models/MasterInduk.php @@ -0,0 +1,12 @@ + 'hashed', ]; } + + public function getNamaLengkapAttribute() + { + return $this->name; + } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index ab98e25..b41e66c 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,16 +2,14 @@ namespace App\Providers; -use App\Auth\DummyUserProvider; -use Illuminate\Support\Facades\Auth; +// use App\Auth\DummyUserProvider; // Hapus atau Komen baris ini +use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { /** * The model to policy mappings for the application. - * - * @var array */ protected $policies = [ // @@ -22,9 +20,13 @@ class AuthServiceProvider extends ServiceProvider */ public function boot(): void { - // Daftarkan provider kustom kita di sini + // $this->registerPolicies(); // Laravel 10/11 biasanya auto-discovery + + // HAPUS atau KOMENTARI bagian ini: + /* Auth::provider('dummy', function ($app, array $config) { return new DummyUserProvider(); }); + */ } } \ No newline at end of file diff --git a/config/auth.php b/config/auth.php index 688de68..48e4d3f 100644 --- a/config/auth.php +++ b/config/auth.php @@ -38,7 +38,7 @@ 'guards' => [ 'web' => [ 'driver' => 'session', - 'provider' => 'dummy', + 'provider' => 'users', ], ], @@ -64,10 +64,6 @@ 'driver' => 'eloquent', 'model' => env('AUTH_MODEL', App\Models\User::class), ], - - 'dummy' => [ - 'driver' => 'dummy', - ], ], /* diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index 05fb5d9..6db1882 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -17,6 +17,11 @@ public function up(): void $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); + $table->string('role')->default('siswa'); + $table->string('nisn')->nullable(); + $table->string('nip')->nullable(); + $table->string('nomor_hp')->nullable(); + $table->string('kelas')->nullable(); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2026_02_05_064036_create_master_induks_table.php b/database/migrations/2026_02_05_064036_create_master_induks_table.php new file mode 100644 index 0000000..bd1f62a --- /dev/null +++ b/database/migrations/2026_02_05_064036_create_master_induks_table.php @@ -0,0 +1,29 @@ +id(); + $table->string('nomor_induk')->unique(); + $table->enum('role', ['siswa', 'guru']); + $table->string('nama_pemilik')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('master_induks'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index d01a0ef..4bb7441 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,22 +2,90 @@ namespace Database\Seeders; -use App\Models\User; -// use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; +use App\Models\User; +use App\Models\MasterInduk; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\DB; class DatabaseSeeder extends Seeder { - /** - * Seed the application's database. - */ - public function run(): void + public function run() { - // User::factory(10)->create(); + // Bersihkan data lama + DB::statement('SET FOREIGN_KEY_CHECKS=0;'); + User::truncate(); + MasterInduk::truncate(); + DB::statement('SET FOREIGN_KEY_CHECKS=1;'); - User::factory()->create([ - 'name' => 'Test User', - 'email' => 'test@example.com', + // 1. ISI DATA INDUK (WHITELIST) + $whitelist = [ + ['nomor_induk' => '1234567890', 'role' => 'siswa', 'nama_pemilik' => 'Silvi Rahmawati'], + ['nomor_induk' => '9988776655', 'role' => 'siswa', 'nama_pemilik' => 'Siti Nurhaliza'], + ['nomor_induk' => '5566778899', 'role' => 'siswa', 'nama_pemilik' => 'Andi Pratama'], + ['nomor_induk' => '198506152010012', 'role' => 'guru', 'nama_pemilik' => 'Rina Marlina'], + ]; + + foreach ($whitelist as $w) { + MasterInduk::create($w); + } + + // 2. ISI USER ASLI (ID USER DISAMAKAN DENGAN DUMMY) + + // ID 1: Silvi (Siswa) + User::create([ + 'id' => 1, + 'name' => 'Silvi Rahmawati', // Pakai 'name' saja, 'nama_lengkap' dihapus + 'email' => 'silvi.rahmawati@smkn1perpus.sch.id', + 'password' => Hash::make('password'), + 'role' => 'siswa', + 'nisn' => '1234567890', + 'nomor_hp' => '08123456789', + 'kelas' => 'XII RPL' + ]); + + // ID 2: Budi (Admin/Penjaga) + User::create([ + 'id' => 2, + 'name' => 'Budi Santoso', + 'email' => 'budi.santoso@smkn1perpus.sch.id', + 'password' => Hash::make('password'), + 'role' => 'penjaga perpus', + 'nip' => '197812312005011', + ]); + + // ID 3: Siti (Siswa) + User::create([ + 'id' => 3, + 'name' => 'Siti Nurhaliza', + 'email' => 'siti.nurhaliza@smkn1perpus.sch.id', + 'password' => Hash::make('password'), + 'role' => 'siswa', + 'nisn' => '9988776655', + 'nomor_hp' => '081998877665', + 'kelas' => 'XII RPL A' + ]); + + // ID 4: Andi (Siswa) + User::create([ + 'id' => 4, + 'name' => 'Andi Pratama', + 'email' => 'andi.pratama@smkn1perpus.sch.id', + 'password' => Hash::make('password'), + 'role' => 'siswa', + 'nisn' => '5566778899', + 'nomor_hp' => '081556677889', + 'kelas' => 'XII RPL A' + ]); + + // ID 5: Rina (Guru) + User::create([ + 'id' => 5, + 'name' => 'Rina Marlina', + 'email' => 'rina.marlina@smkn1perpus.sch.id', + 'password' => Hash::make('password'), + 'role' => 'guru', + 'nip' => '198506152010012', ]); } -} +} \ No newline at end of file diff --git a/resources/views/admin/pengguna/index.blade.php b/resources/views/admin/pengguna/index.blade.php index 9ff289e..c8b793f 100644 --- a/resources/views/admin/pengguna/index.blade.php +++ b/resources/views/admin/pengguna/index.blade.php @@ -1,116 +1,191 @@ - @section('page-title', $pageTitle) - -
-
-
Daftar Semua Pengguna
- - Tambah Pengguna - + @section('page-title', content: 'Manajemen Pengguna') +
+ +
+

{{ $pageTitle }}

-
-
- - - - - - - - - - - - @forelse($semuaSiswa as $siswa) - - - - - - - - @empty - - - - @endforelse - -
NoNama LengkapEmailRoleAksi
{{ $loop->iteration }}{{ $siswa['nama_lengkap'] }}{{ $siswa['email'] }} - @if($siswa['role'] == 'penjaga perpus') - {{ Str::title($siswa['role']) }} - @else - {{ Str::title($siswa['role']) }} - @endif - - -
Tidak ada data pengguna.
+ +
+
+
Daftar Pengguna Aktif
+
+
+
+ + + + + + + + + + + + + @forelse($users as $index => $user) + + + + + + + + + @empty + + + + @endforelse + +
NoNama LengkapEmailRoleNomor IndukAksi
{{ $index + 1 }}{{ $user->name }}{{ $user->email }} + + {{ ucfirst($user->role) }} + + + {{ $user->nisn ?? $user->nip ?? '-' }} + + + Edit + +
+ @csrf + @method('DELETE') + +
+
Belum ada pengguna terdaftar.
+ + {{-- Pagination --}} +
+ {{ $users->links() }} +
+
+ +
+ +
+
+

+ Data Induk (Whitelist) +

+

Daftar NIP/NISN yang diizinkan untuk mendaftar.

+
+ + +
+ +
+
+
+ + + + + + + + + + + + + @forelse($whitelists as $index => $item) + + + + + + + + + @empty + + + + @endforelse + +
NoNIP / NISNNama PemilikRoleStatus AkunAksi
{{ $index + 1 }}{{ $item->nomor_induk }}{{ $item->nama_pemilik }} + + {{ ucfirst($item->role) }} + + + {{-- Cek apakah user sudah daftar pakai NIP ini --}} + @php + $isRegistered = \App\Models\User::where('nisn', $item->nomor_induk) + ->orWhere('nip', $item->nomor_induk)->exists(); + @endphp + + @if($isRegistered) + + Terdaftar + + @else + + Belum Daftar + + @endif + +
+ @csrf + @method('DELETE') + +
+
+ Belum ada data whitelist. Silakan tambah data. +
+
+
+
+
-