refactor: Refactor user management logic, fix route URL generation in Blade templates, and enhance user action button UI.

This commit is contained in:
cukiprit 2026-02-27 06:45:36 +07:00
parent 6f94cb2a91
commit f63628e48e
5 changed files with 32 additions and 164 deletions

View File

@ -7,10 +7,6 @@
use App\Models\MasterInduk; use App\Models\MasterInduk;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\MasterInduk;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller class UserController extends Controller
{ {
@ -38,63 +34,6 @@ public function create()
return view('admin.pengguna.create', ['pageTitle' => 'Tambah Pengguna Baru']); 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) public function edit($id)
{ {
$pengguna = User::findOrFail($id); $pengguna = User::findOrFail($id);
@ -104,77 +43,6 @@ 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();
return back()->with('success', 'Pengguna berhasil dihapus.');
}
public function store(Request $request) public function store(Request $request)
{ {
$validated = $request->validate([ $validated = $request->validate([

View File

@ -5,7 +5,6 @@
use App\Models\Loan; use App\Models\Loan;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Auth;
class RiwayatController extends Controller class RiwayatController extends Controller
{ {

View File

@ -218,8 +218,7 @@ function(settings, data, dataIndex) {
}); });
$.ajax({ $.ajax({
url: '{{ route(' url: "{{ route('admin.denda.sanksi') }}",
admin.denda.sanksi ') }}',
method: 'POST', method: 'POST',
data: { data: {
_token: '{{ csrf_token() }}', _token: '{{ csrf_token() }}',
@ -266,8 +265,7 @@ function(settings, data, dataIndex) {
}); });
$.ajax({ $.ajax({
url: '{{ route(' url: "{{ route('admin.denda.sanksi ') }}",
admin.denda.sanksi ') }}',
method: 'POST', method: 'POST',
data: { data: {
_token: '{{ csrf_token() }}', _token: '{{ csrf_token() }}',

View File

@ -382,8 +382,7 @@ function hitungTotalDenda(modal) {
function finishTransaction(returnsData, userId, waLink) { function finishTransaction(returnsData, userId, waLink) {
$.ajax({ $.ajax({
url: '{{ route(' url: "{{ route('admin.peminjaman.kembali ') }}",
admin.peminjaman.kembali ') }}',
method: 'POST', method: 'POST',
data: { data: {
_token: '{{ csrf_token() }}', _token: '{{ csrf_token() }}',

View File

@ -71,23 +71,26 @@
@endif @endif
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{{ route('admin.pengguna.edit', $user->id) }}" <div class="d-flex justify-content-center gap-1">
class="btn btn-sm btn-warning"> <a href="{{ route('admin.pengguna.edit', $user->id) }}"
<i class="bi bi-pencil"></i> Edit class="btn btn-sm btn-warning" title="Edit Pengguna">
</a> <i class="bi bi-pencil"></i>
</a>
<button type="button" class="btn btn-sm btn-secondary btn-reset-password" <button type="button" class="btn btn-sm btn-secondary btn-reset-password"
data-nama="{{ $user->name }}" title="Reset Password (OTP)"> data-nama="{{ $user->name }}" title="Reset Password (OTP)">
<i class="bi bi-key-fill"></i> <i class="bi bi-key-fill"></i>
</button> </button>
<form action="{{ route('admin.pengguna.destroy', $user->id) }}" method="POST" <form action="{{ route('admin.pengguna.destroy', $user->id) }}" method="POST"
class="d-inline form-delete-user" data-nama="{{ $user->name }}"> class="form-delete-user" data-nama="{{ $user->name }}">
@csrf @csrf
@method('DELETE') @method('DELETE')
<button type="button" class="btn btn-sm btn-danger btn-hapus"><i <button type="button" class="btn btn-sm btn-danger btn-hapus" title="Hapus Pengguna">
class="bi bi-trash"></i></button> <i class="bi bi-trash"></i>
</form> </button>
</form>
</div>
</td> </td>
</tr> </tr>
@empty @empty
@ -149,8 +152,7 @@ class="bi bi-trash"></i></button>
</td> </td>
<td class="text-center"> <td class="text-center">
@php @php
$isRegistered = \App\Models\User::where('nisn', $item->nomor_induk)->orWhere('nip', $isRegistered = \App\Models\User::where('nomor_induk', $item->nomor_induk)->exists();
$item->nomor_induk)->exists();
@endphp @endphp
@if ($isRegistered) @if ($isRegistered)
<span class="badge bg-success text-white"><i <span class="badge bg-success text-white"><i
@ -161,14 +163,16 @@ class="bi bi-hourglass-split me-1"></i>Belum Daftar</span>
@endif @endif
</td> </td>
<td class="text-center"> <td class="text-center">
<form action="{{ route('admin.master-induk.destroy', $item->id) }}" method="POST" <div class="d-flex justify-content-center">
class="d-inline form-delete-whitelist" data-induk="{{ $item->nomor_induk }}"> <form action="{{ route('admin.master-induk.destroy', $item->id) }}" method="POST"
@csrf class="form-delete-whitelist" data-induk="{{ $item->nomor_induk }}">
@method('DELETE') @csrf
<button type="button" class="btn btn-sm btn-outline-danger btn-hapus-whitelist"> @method('DELETE')
<i class="bi bi-trash"></i> Hapus <button type="button" class="btn btn-sm btn-outline-danger btn-hapus-whitelist" title="Hapus Data Induk">
</button> <i class="bi bi-trash"></i>
</form> </button>
</form>
</div>
</td> </td>
</tr> </tr>
@empty @empty