MIF_E31230892/sim-pkpps/app/Http/Controllers/Admin/UserController.php

188 lines
6.0 KiB
PHP

<?php
// app/Http/Controllers/Admin/UserController.php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Santri;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;
class UserController extends Controller
{
/**
* Tampilkan daftar akun Santri.
*/
public function santriAccounts()
{
$users = User::where('role', 'santri')->with('santri')->get();
$santris_tanpa_akun = Santri::whereDoesntHave('user', function($query) {
$query->where('role', 'santri');
})->get();
return view('admin.users.santri_accounts', compact('users', 'santris_tanpa_akun'));
}
/**
* Tampilkan daftar akun Wali Santri.
*/
public function waliAccounts()
{
$users = User::where('role', 'wali')->with('santri')->get();
$santris_tanpa_wali = Santri::whereDoesntHave('waliUser')->get();
return view('admin.users.wali_accounts', compact('users', 'santris_tanpa_wali'));
}
/**
* Tampilkan form untuk membuat akun baru.
*/
public function createAccount(string $role)
{
if (!in_array($role, ['santri', 'wali'])) {
abort(404);
}
if ($role === 'santri') {
$list_data = Santri::whereDoesntHave('user', function($query) {
$query->where('role', 'santri');
})->get();
} else {
// Wali: ambil santri yang belum punya akun wali
$list_data = Santri::whereDoesntHave('waliUser')->get();
}
return view('admin.users.create_account', compact('role', 'list_data'));
}
/**
* Simpan akun baru.
*/
public function storeAccount(Request $request, string $role)
{
if (!in_array($role, ['santri', 'wali'])) {
abort(404);
}
// Validasi berbeda untuk santri dan wali
$rules = [
'role_id' => [
'required',
Rule::exists('santris', 'id_santri'),
function ($attribute, $value, $fail) use ($role) {
$exists = User::where('role', $role)
->where('role_id', $value)
->exists();
if ($exists) {
$fail("Santri ini sudah memiliki akun {$role}.");
}
},
],
'username' => 'required|string|max:255|unique:users,username',
];
// Untuk wali: password tidak perlu min karena otomatis dari NIS
// Untuk santri: password minimal 8 karakter
if ($role === 'wali') {
$rules['password'] = 'required|string|confirmed';
} else {
$rules['password'] = 'required|string|min:8|confirmed';
}
$messages = [
'role_id.required' => 'Wajib memilih santri.',
'role_id.exists' => 'Data santri tidak ditemukan.',
'username.unique' => 'Username sudah digunakan.',
'username.required' => 'Username wajib diisi.',
'password.required' => 'Password wajib diisi.',
'password.min' => 'Password minimal 8 karakter.',
'password.confirmed' => 'Konfirmasi password tidak cocok.',
];
$validated = $request->validate($rules, $messages);
// Ambil data santri
$santri = Santri::where('id_santri', $validated['role_id'])->firstOrFail();
// Untuk wali: name = nama orang tua (jika ada) atau nama santri
// Untuk santri: name = nama santri
$name = ($role === 'wali')
? ($santri->nama_orang_tua ?? $santri->nama_lengkap)
: $santri->nama_lengkap;
// Simpan User
User::create([
'name' => $name,
'username' => $validated['username'],
'password' => Hash::make($validated['password']),
'role' => $role,
'role_id' => $validated['role_id'],
]);
$successMsg = $role === 'wali'
? "Akun wali untuk santri {$santri->nama_lengkap} berhasil dibuat. Login: Username={$validated['username']}, Password=NIS"
: "Akun santri {$santri->nama_lengkap} berhasil dibuat.";
return redirect()->route('admin.users.'.$role.'_accounts')
->with('success', $successMsg);
}
/**
* Hapus akun santri/wali.
*/
public function destroyAccount(string $role, string $userId)
{
if (!in_array($role, ['santri', 'wali'])) {
abort(404);
}
// Cari user berdasarkan ID
$user = User::findOrFail($userId);
// Pastikan user yang akan dihapus adalah role yang sesuai
if ($user->role !== $role) {
return redirect()->back()->with('error', 'Akun tidak valid.');
}
$userName = $user->name;
$user->delete();
return redirect()->route('admin.users.'.$role.'_accounts')
->with('success', "Akun {$role} {$userName} berhasil dihapus.");
}
/**
* Reset password akun santri/wali ke default (NIS).
*/
public function resetPassword(string $role, string $userId)
{
if (!in_array($role, ['santri', 'wali'])) {
abort(404);
}
// Cari user berdasarkan ID
$user = User::findOrFail($userId);
// Pastikan user adalah role yang sesuai
if ($user->role !== $role) {
return redirect()->back()->with('error', 'Akun tidak valid.');
}
// Ambil santri terkait
$santri = Santri::where('id_santri', $user->role_id)->first();
if (!$santri || !$santri->nis) {
return redirect()->back()->with('error', 'NIS santri tidak ditemukan. Tidak dapat mereset password.');
}
// Reset password ke NIS
$user->password = Hash::make($santri->nis);
$user->save();
return redirect()->route('admin.users.'.$role.'_accounts')
->with('success', "Password akun {$user->name} berhasil direset ke NIS: {$santri->nis}");
}
}