# Report Test 4 (WPT)

## Overview

Test 4 (WPT — Wonderlic Personnel Test) adalah tes kecerdasan/kognitif umum. Terdiri dari 50 soal dengan berbagai tipe: verbal, numerik, logika, dan spasial. Setiap soal memiliki pilihan ganda (opsi 1-5 atau lebih).

## Flow Data

```
applicant_answers (answer: string | null)
        │
        ▼
mst_test4 (question_number, answer_key)
        │
        ▼
Per-soal:
  - answer null/kosong → Tidak Dijawab
  - strtoupper(answer) === strtoupper(answer_key) → Benar
  - selain itu → Salah
        │
        ▼
total_benar, total_salah, total_tidak_jawab
        │
        ▼
Count-based scoring (matching old app msjhr):
  - < 10   → SR (Sangat Rendah)
  - 10-14  → R (Rendah)
  - 15-19  → C- (Dibawah Rata-rata)
  - 20-26  → C (Rata-rata)
  - 27-29  → C+ (Diatas Rata-rata)
  - 30-35  → T (Tinggi)
  - 36-39  → ST (Sangat Tinggi)
  - ≥ 40   → ST (Jenius)
```

## Database Tables

| Table | Role |
|---|---|
| `mst_test4` | 50 soal WPT — question, image_url, options, answer_key |
| `applicant_answers` | Jawaban user (`answer` = opsi yang dipilih, bisa null) |

### `mst_test4`

| Column | Desc |
|---|---|
| `question_number` | Nomor soal (1-50) |
| `question` | Teks soal |
| `image_url` | Path gambar (opsional) |
| `options` | JSON array opsi pilihan ganda (jika ada) |
| `answer_key` | Kunci jawaban (nomor opsi) |
| `page_num` | Halaman saat test |

## Method: `getTest4Data($test4Session)`

1. Iterasi semua jawaban test session
2. Untuk setiap jawaban:
   - Jika `$ans->answer` null atau kosong → `Tidak Dijawab`
   - Jika jawaban === kunci (case-insensitive, trim) → `Benar`
   - Selain itu → `Salah`
3. Count-based scoring (matching old app msjhr):
   - `< 10` → `kategori='SR'`, `kesimpulan='Sangat Rendah'`
   - `10-14` → `kategori='R'`, `kesimpulan='Rendah'`
   - `15-19` → `kategori='C-'`, `kesimpulan='Dibawah Rata-rata'`
   - `20-26` → `kategori='C'`, `kesimpulan='Rata-rata'`
   - `27-29` → `kategori='C+'`, `kesimpulan='Diatas Rata-rata'`
   - `30-35` → `kategori='T'`, `kesimpulan='Tinggi'`
   - `36-39` → `kategori='ST'`, `kesimpulan='Sangat Tinggi'`
   - `≥ 40` → `kategori='ST'`, `kesimpulan='Jenius'`
4. `score` = total_benar (count, bukan percentage)

## View Components (`test4.blade.php`)

### Screen View
| Komponen | Detail |
|---|---|
| **Card Benar** | Hijau — `total_benar` |
| **Card Salah** | Merah — `total_salah` |
| **Card Tidak Dijawab** | Abu-abu — `total_tidak_jawab` |
| **Card Score + Kesimpulan** | Biru — `score%` + kode kesimpulan + label |
| **Tabel Detail** | 2 kolom × 25 baris — No, Jawaban, Kunci, Status (Benar/Salah/Kosong) |

### Print View
- Kop dokumen + identitas kandidat
- Tabel detail jawaban + kolom KETERANGAN
- Summary Benar/Salah/Tidak Dijawab
- Kesimpulan (Score% + Kode + Label)

## Struktur Data Return

```php
[
    'total_benar' => int,
    'total_salah' => int,
    'total_tidak_jawab' => int,
    'score' => int,            // total_benar count
    'kategori' => string,      // 'SR'|'R'|'C-'|'C'|'C+'|'T'|'ST'
    'kesimpulan' => string,    // 'Sangat Rendah'|'Rendah'|...|'Jenius'
    'details' => [
        ['no' => int, 'user' => string, 'kunci' => string, 'is_correct' => bool, 'status' => string],
        ...
    ],
]
```
