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.'); } } }