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>
This commit is contained in:
Saufi
2026-07-11 02:40:00 +08:00
commit dfd22ff2af
95 changed files with 14681 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class ProfilController extends Controller
{
public function edit(Request $request)
{
return view('profil.edit', ['pengguna' => $request->user()]);
}
public function updatePassword(Request $request)
{
$data = $request->validate([
'kata_laluan_semasa' => ['required', 'string'],
'kata_laluan_baharu' => ['required', 'string', 'min:8', 'confirmed'],
], [
'kata_laluan_semasa.required' => 'Sila masukkan kata laluan semasa.',
'kata_laluan_baharu.required' => 'Sila masukkan kata laluan baharu.',
'kata_laluan_baharu.min' => 'Kata laluan baharu perlu sekurang-kurangnya 8 aksara.',
'kata_laluan_baharu.confirmed' => 'Pengesahan kata laluan baharu tidak sepadan.',
]);
$user = $request->user();
if (! Hash::check($data['kata_laluan_semasa'], $user->password)) {
return back()->withErrors(['kata_laluan_semasa' => 'Kata laluan semasa tidak tepat.']);
}
$user->update(['password' => Hash::make($data['kata_laluan_baharu'])]);
return back()->with('status', 'Kata laluan berjaya dikemaskini.');
}
}