Files
Aplikasi-Kehadiran-KTM/app/Http/Controllers/PasswordResetController.php
Saufi dfd22ff2af Aplikasi kehadiran KTM ambil peti undi (SPR 2026)
Sistem untuk admin DUN merekod waktu KTM (Ketua Tempat Mengundi) hadir
mengambil peti undi. Data KTM dibaca daripada DB sppm (spr2026) melalui
connection kedua — hanya penempatan berjawatan KTM yang dipaparkan.

- Dashboard: senarai KTM ikut pusat mengundi (asc) & saluran (asc),
  status BELUM HADIR (merah) / HADIR (hijau) + tarikh & masa
- Carian nama/no. KP, tapisan pusat mengundi & status
- Tanda hadir / batal dengan kawalan DUN (admin terhad ke DUN sendiri)
- Eksport Excel (worksheet Hadir & Belum Hadir) guna SimpleXlsx
- Peranan: superadmin (urus pengguna, semua DUN) & admin DUN
- Docker: nginx + php-fpm + queue + scheduler + webhook deploy,
  port 127.0.0.1:8009, TZ Asia/Kuala_Lumpur di semua container
- Zon waktu aplikasi: Asia/Kuala_Lumpur (APP_TIMEZONE)

Berasaskan scaffold spr2026_taklimat.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 02:40:00 +08:00

68 lines
2.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
class PasswordResetController extends Controller
{
public function showLinkRequestForm()
{
return view('auth.lupa-katalaluan');
}
public function sendResetLink(Request $request)
{
$request->validate(['email' => ['required', 'email']]);
$status = Password::sendResetLink($request->only('email'));
return $status === Password::RESET_LINK_SENT
? back()->with('status', 'Pautan set semula kata laluan telah dihantar ke e-mel anda.')
: back()->withErrors(['email' => $this->mesejRalat($status)]);
}
public function showResetForm(Request $request, string $token)
{
return view('auth.set-kata-laluan', [
'token' => $token,
'email' => $request->query('email', ''),
]);
}
public function reset(Request $request)
{
$data = $request->validate([
'token' => ['required', 'string'],
'email' => ['required', 'email'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
], [
'password.min' => 'Kata laluan perlu sekurang-kurangnya 8 aksara.',
'password.confirmed' => 'Pengesahan kata laluan tidak sepadan.',
]);
$status = Password::reset(
$data,
function ($user, $password) {
$user->forceFill(['password' => Hash::make($password)])->save();
}
);
return $status === Password::PASSWORD_RESET
? redirect()->route('login')->with('status', 'Kata laluan berjaya ditetapkan semula. Sila log masuk.')
: back()->withErrors(['email' => $this->mesejRalat($status)])->onlyInput('email');
}
private function mesejRalat(string $status): string
{
return match ($status) {
Password::INVALID_USER => 'Akaun dengan e-mel ini tidak ditemui.',
Password::RESET_THROTTLED => 'Sila tunggu sebentar sebelum cuba lagi.',
Password::INVALID_TOKEN => 'Pautan set semula tidak sah atau telah tamat tempoh.',
default => 'Gagal memproses permintaan. Sila cuba lagi.',
};
}
}