Peserta tidak ditemukan.
'; page_end(); exit; } $error=''; if($_SERVER['REQUEST_METHOD']==='POST') { verify_csrf(); $action=$_POST['action']??''; if($action==='stage' && array_key_exists((string)($_POST['kode']??''),STAGES)) { query('UPDATE in_daper SET kode=? WHERE id=?','ii',[(int)$_POST['kode'],$id]); $_SESSION['flash']='Tahap seleksi diperbarui.'; redirect('idap_jawab.php?id='.$id); } if($action==='grade') { db()->begin_transaction(); try { $locked=one('SELECT level FROM in_daper WHERE id=? FOR UPDATE','i',[$id]); $answers=rows('SELECT j.id,j.cek FROM in_jawab j JOIN in_soal s ON s.id=j.isoal WHERE j.idap=? AND s.kat BETWEEN 1 AND 4 FOR UPDATE','i',[$id]); $grades=$_POST['grade']??[]; if((int)$locked['level']<4 || !$answers || !is_array($grades)) throw new InvalidArgumentException('Penilaian dapat disimpan setelah peserta menyelesaikan seluruh fase tes.'); foreach($answers as $answer) { $grade=$grades[$answer['id']]??''; if(!in_array($grade,['0','10'],true)) throw new InvalidArgumentException('Nilai semua jawaban fase 1–3 sebelum menyimpan.'); query('UPDATE in_jawab SET cek=? WHERE id=? AND idap=?','sii',[$grade,(int)$answer['id'],$id]); } $orphans=one('SELECT COUNT(*) n FROM in_jawab j LEFT JOIN in_soal s ON s.id=j.isoal WHERE j.idap=? AND s.id IS NULL','i',[$id]); if((int)$orphans['n']>0) throw new InvalidArgumentException('Ada jawaban yang kehilangan referensi soal. Pulihkan soal sebelum menyelesaikan penilaian.'); query('UPDATE in_daper SET cek=1 WHERE id=?','i',[$id]); db()->commit(); $_SESSION['flash']='Penilaian berhasil disimpan.'; redirect('idap_jawab.php?id='.$id); } catch(InvalidArgumentException $ex) { db()->rollback(); $error=$ex->getMessage(); } catch(Throwable $ex) { db()->rollback(); throw $ex; } } } $answers=rows('SELECT j.id,j.jawab,j.cek,s.id question_id,s.kat,s.soal,s.soal1,s.kunci FROM in_jawab j LEFT JOIN in_soal s ON s.id=j.isoal WHERE j.idap=? ORDER BY s.kat,j.id','i',[$id]); $score=0; $ungraded=0; $orphans=0; foreach($answers as $a) { if(!$a['question_id']) $orphans++; if((int)$a['kat']>=1 && (int)$a['kat']<=4) { if($a['cek']==='10') $score+=10; if(!in_array($a['cek'],['0','10'],true)) $ungraded++; } } $attemptLog=rows('SELECT a.phase,a.status,a.deadline,a.started_at,a.submitted_at,COUNT(e.id) event_count FROM rec_exam_attempt a LEFT JOIN rec_exam_event e ON e.attempt_id=a.id WHERE a.participant_id=? GROUP BY a.id ORDER BY a.phase','i',[$id]); $activityLog=rows('SELECT a.phase,e.event_type,e.created_at FROM rec_exam_event e JOIN rec_exam_attempt a ON a.id=e.attempt_id WHERE a.participant_id=? ORDER BY e.id DESC LIMIT 50','i',[$id]); page_start('Hasil Psikotest', 'participants'); ?>← Daftar peserta=e($p['posisi'])?> · =e($p['jk'])?>
=e($p['email'])?> · =e($p['nowa'])?>Progres tes: =min(4,max(0,(int)$p['level']))?> / 4 fase · =e(STAGES[(int)$p['kode']]??'Lainnya')?>
Aktivitas browser adalah laporan dari perangkat peserta, dapat tidak lengkap, dan bukan bukti kecurangan atau keputusan seleksi otomatis.
| Fase | Mulai | Deadline server | Status | Catatan aktivitas |
|---|---|---|---|---|
| =(int)$log['phase']?> | =e($log['started_at'])?> | =e(date('Y-m-d H:i:s',(int)$log['deadline']))?> | =e(['active'=>'Berjalan','expired'=>'Waktu habis','submitted'=>'Dikirim'][$log['status']]??$log['status'])?> | =(int)$log['event_count']?> |
| Data historis: belum ada catatan sesi tes. | ||||
| Waktu | Fase | Aktivitas |
|---|---|---|
| =e($log['created_at'])?> | =(int)$log['phase']?> | =e(['tab_hidden'=>'Halaman tidak terlihat','window_blur'=>'Jendela kehilangan fokus','copy'=>'Copy','cut'=>'Cut','paste'=>'Paste','contextmenu'=>'Menu konteks','page_resumed'=>'Kembali ke halaman','relogin'=>'Login ulang','stale_tab'=>'Permintaan dari tab/sesi yang sudah digantikan'][$log['event_type']]??$log['event_type'])?> |