From 692ee5009be0888e14868cfd5979e01f1eb988d8 Mon Sep 17 00:00:00 2001 From: zhadaarsita Date: Wed, 18 Feb 2026 00:32:27 +0700 Subject: [PATCH] Refactor: form tambah pengguna & penyesuaian struktur tabel users --- app/Http/Controllers/Admin/UserController.php | 132 ++++++++++++- .../0001_01_01_000000_create_users_table.php | 3 +- database/seeders/DatabaseSeeder.php | 20 +- .../views/admin/pengguna/create.blade.php | 179 ++++++++++++++--- resources/views/admin/pengguna/edit.blade.php | 131 ++++++++---- .../views/admin/pengguna/index.blade.php | 186 ++++++++++-------- routes/web.php | 2 + 7 files changed, 499 insertions(+), 154 deletions(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index d0cd80d..eb556a1 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -3,22 +3,22 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; -use App\Models\User; // Model User Asli -use App\Models\MasterInduk; // Model Whitelist +use App\Models\User; +use App\Models\MasterInduk; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Hash; class UserController extends Controller { public function index() { $users = User::orderBy('created_at', 'desc')->paginate(10); - $whitelists = MasterInduk::orderBy('created_at', 'desc')->get(); return view('admin.pengguna.index', [ 'pageTitle' => 'Daftar Pengguna', - 'users' => $users, - 'whitelists' => $whitelists + 'users' => $users, + 'whitelists' => $whitelists ]); } @@ -27,6 +27,63 @@ 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); @@ -36,6 +93,71 @@ public function edit($id) ]); } + 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(); 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 6db1882..2e24fd0 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -20,7 +20,8 @@ public function up(): void $table->string('role')->default('siswa'); $table->string('nisn')->nullable(); $table->string('nip')->nullable(); - $table->string('nomor_hp')->nullable(); + $table->string('no_hp')->nullable(); + $table->string('golongan')->nullable(); $table->string('kelas')->nullable(); $table->rememberToken(); $table->timestamps(); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 4bb7441..71f06f8 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -18,7 +18,6 @@ public function run() MasterInduk::truncate(); DB::statement('SET FOREIGN_KEY_CHECKS=1;'); - // 1. ISI DATA INDUK (WHITELIST) $whitelist = [ ['nomor_induk' => '1234567890', 'role' => 'siswa', 'nama_pemilik' => 'Silvi Rahmawati'], ['nomor_induk' => '9988776655', 'role' => 'siswa', 'nama_pemilik' => 'Siti Nurhaliza'], @@ -30,18 +29,19 @@ public function run() MasterInduk::create($w); } - // 2. ISI USER ASLI (ID USER DISAMAKAN DENGAN DUMMY) + // ISI USER ASLI // ID 1: Silvi (Siswa) User::create([ 'id' => 1, - 'name' => 'Silvi Rahmawati', // Pakai 'name' saja, 'nama_lengkap' dihapus + 'name' => 'Silvi Rahmawati', 'email' => 'silvi.rahmawati@smkn1perpus.sch.id', 'password' => Hash::make('password'), 'role' => 'siswa', 'nisn' => '1234567890', - 'nomor_hp' => '08123456789', - 'kelas' => 'XII RPL' + 'no_hp' => '08123456789', + 'kelas' => 'XII RPL', + 'golongan' => 'A' ]); // ID 2: Budi (Admin/Penjaga) @@ -62,8 +62,9 @@ public function run() 'password' => Hash::make('password'), 'role' => 'siswa', 'nisn' => '9988776655', - 'nomor_hp' => '081998877665', - 'kelas' => 'XII RPL A' + 'no_hp' => '081998877665', + 'kelas' => 'XII RPL', + 'golongan' => 'B' ]); // ID 4: Andi (Siswa) @@ -74,8 +75,9 @@ public function run() 'password' => Hash::make('password'), 'role' => 'siswa', 'nisn' => '5566778899', - 'nomor_hp' => '081556677889', - 'kelas' => 'XII RPL A' + 'no_hp' => '081556677889', + 'kelas' => 'XII RPL', + 'golongan' => 'C' ]); // ID 5: Rina (Guru) diff --git a/resources/views/admin/pengguna/create.blade.php b/resources/views/admin/pengguna/create.blade.php index e284779..a8020dc 100644 --- a/resources/views/admin/pengguna/create.blade.php +++ b/resources/views/admin/pengguna/create.blade.php @@ -11,48 +11,171 @@
-
-
+ + @csrf + +
+ + + @error('role') +
{{ $message }}
+ @enderror +
+ + {{-- Bagian Form Dinamis --}} +
+ + {{-- Nama Lengkap --}}
- +
+ + {{-- Identitas Unik (NISN/NIP) --}}
- - -
-
- - -
-
- - + + + @error('nomor_induk') +
{{ $message }}
+ @enderror
+ + {{-- Kontak (Email & HP) --}}
- - + + + @error('email') +
{{ $message }}
+ @enderror
- - + +
-
-
- + + {{-- Field Khusus Siswa (Kelas & Golongan) --}} + - -
+ +
+ + {{-- Keamanan (Password) --}} +
+
+ +
+ + + @error('password') +
{{ $message }}
+ @enderror +
+
+ +
+ +
+ + +
+
+
+ +
+ +
+
+
+ + diff --git a/resources/views/admin/pengguna/edit.blade.php b/resources/views/admin/pengguna/edit.blade.php index 40bebef..6c345f9 100644 --- a/resources/views/admin/pengguna/edit.blade.php +++ b/resources/views/admin/pengguna/edit.blade.php @@ -11,52 +11,117 @@
-
-
+ + @csrf + @method('PUT') + +
+ + + @error('role')
{{ $message }}
@enderror +
+ + {{-- Bagian Form Dinamis --}} +
+ + {{-- Nama Lengkap --}}
- +
+ + {{-- Identitas Unik (NISN/NIP) --}}
- - -
-
- - -
-
- - + @php + $oldNomorInduk = old('nomor_induk', $pengguna->role == 'siswa' ? $pengguna->nisn : $pengguna->nip); + @endphp + + + @error('nomor_induk')
{{ $message }}
@enderror
+ + {{-- Kontak (Email & HP) --}}
- - + + + @error('email')
{{ $message }}
@enderror
- - + +
-
-
- + + {{-- Field Khusus Siswa (Kelas & Golongan) --}} + - -
+ +
+ + {{-- Keamanan (Password) --}} +
+
+ + + @error('password')
{{ $message }}
@enderror +
+
+ + +
+
+ +
+ +
+
+
- + + + \ 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 c8b793f..c4f645c 100644 --- a/resources/views/admin/pengguna/index.blade.php +++ b/resources/views/admin/pengguna/index.blade.php @@ -1,61 +1,81 @@ @section('page-title', content: 'Manajemen Pengguna')
- +

{{ $pageTitle }}

-
+
Daftar Pengguna Aktif
+ + Tambah Pengguna +
- - +
+ - + - - + + + @forelse($users as $index => $user) - - - - - - - - + + + + + + + + + @empty - - - + + + @endforelse
No Nama LengkapEmailKontak (Email & HP) RoleNomor IndukAksiNISN / NIPKelas / GolonganAksi
{{ $index + 1 }}{{ $user->name }}{{ $user->email }} - - {{ ucfirst($user->role) }} - - - {{ $user->nisn ?? $user->nip ?? '-' }} - - - Edit - -
- @csrf - @method('DELETE') - -
-
{{ $users->firstItem() + $index }}{{ $user->name }} +
{{ $user->email }}
+
{{ $user->no_hp ?? '-' }}
+
+ @if($user->role == 'guru') + Guru + @elseif($user->role == 'siswa') + Siswa + @else + Petugas + @endif + + {{ $user->nisn ?? ($user->nip ?? '-') }} + + @if($user->role == 'siswa') + Kelas: {{ $user->kelas ?? '-' }} / {{ $user->golongan ?? '-' }} + @else + - + @endif + + + Edit + +
+ @csrf + @method('DELETE') + +
+
Belum ada pengguna terdaftar.
Belum ada pengguna terdaftar.
- + {{-- Pagination --}}
{{ $users->links() }} @@ -66,6 +86,7 @@
+ {{-- BAGIAN DATA INDUK (WHITELIST) --}}

@@ -73,7 +94,7 @@

Daftar NIP/NISN yang diizinkan untuk mendaftar.

- + @@ -95,48 +116,54 @@ @forelse($whitelists as $index => $item) - - {{ $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 + + {{ $index + 1 }} + {{ $item->nomor_induk }} + {{ $item->nama_pemilik }} + + @if($item->role == 'guru') + Guru + @elseif($item->role == 'siswa') + Siswa + @else + Petugas + @endif + + + @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') - -
- - + @if ($isRegistered) + + Terdaftar + + @else + + Belum Daftar + + @endif + + +
+ @csrf + @method('DELETE') + +
+ + @empty - - - Belum ada data whitelist. Silakan tambah data. - - + + + Belum ada data whitelist. Silakan tambah data. + + @endforelse @@ -161,23 +188,26 @@ Masukkan data siswa/guru yang valid agar mereka bisa mendaftar.
- +
- +
- +