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>
67 lines
1.9 KiB
PHP
67 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\KehadiranKtm;
|
|
use App\Models\Sppm\PetugasAssignment;
|
|
use Illuminate\Http\Request;
|
|
|
|
class KehadiranController extends Controller
|
|
{
|
|
/**
|
|
* Tanda KTM sebagai hadir mengambil peti undi. Rekod tarikh dan masa.
|
|
*/
|
|
public function hadir(Request $request, int $assignmentId)
|
|
{
|
|
$assignment = PetugasAssignment::ktm()
|
|
->with(['permohonan', 'pusatMengundi'])
|
|
->findOrFail($assignmentId);
|
|
|
|
$this->pastikanDunDibenarkan($request, $assignment);
|
|
|
|
KehadiranKtm::firstOrCreate(
|
|
['assignment_id' => $assignment->id],
|
|
[
|
|
'permohonan_id' => $assignment->permohonan_id,
|
|
'dun_id' => $assignment->pusatMengundi->dun_id,
|
|
'hadir_at' => now(),
|
|
'dicatat_oleh_user_id' => $request->user()->id,
|
|
],
|
|
);
|
|
|
|
return back()->with('status', ($assignment->permohonan?->nama_ic ?? 'KTM').' ditanda HADIR.');
|
|
}
|
|
|
|
/**
|
|
* Batalkan rekod kehadiran (jika tersilap tanda).
|
|
*/
|
|
public function batal(Request $request, int $assignmentId)
|
|
{
|
|
$assignment = PetugasAssignment::ktm()
|
|
->with(['permohonan', 'pusatMengundi'])
|
|
->findOrFail($assignmentId);
|
|
|
|
$this->pastikanDunDibenarkan($request, $assignment);
|
|
|
|
KehadiranKtm::where('assignment_id', $assignment->id)->delete();
|
|
|
|
return back()->with('status', 'Rekod kehadiran '.($assignment->permohonan?->nama_ic ?? 'KTM').' dibatalkan.');
|
|
}
|
|
|
|
/**
|
|
* Admin DUN hanya boleh urus KTM dalam DUN sendiri.
|
|
*/
|
|
private function pastikanDunDibenarkan(Request $request, PetugasAssignment $assignment): void
|
|
{
|
|
$user = $request->user();
|
|
|
|
if ($user->isSuperadmin()) {
|
|
return;
|
|
}
|
|
|
|
if ((int) $assignment->pusatMengundi?->dun_id !== (int) $user->dun_id) {
|
|
abort(403, 'KTM ini bukan dalam DUN anda.');
|
|
}
|
|
}
|
|
}
|