# Report Test 2 (DISC)

## Overview

Test 2 (DISC) mengukur 4 dimensi kepribadian: **D**ominance, **I**nfluence, **S**teadiness, **C**ompliance. Terdiri dari 12 soal, tiap soal memiliki 4 opsi jawaban. Peserta memilih satu **Most** (paling sesuai) dan satu **Least** (paling tidak sesuai).

## Alur Scoring

```
applicant_answers (most_option: 0-3, least_option: 0-3)
        │
        ▼
mst_test2.options (JSON: [{text, type: D|I|S|C|null}])
        │
        ▼
Raw count: Most (Line 1) & Least (Line 2) — count per D/I/S/C/*
        │
        ▼
ref_disc_grafik (tipe: M|L|C, nomor: raw_count → val_d/i/s/c)
        │
        ▼
Grafik values: Most_graph, Least_graph, Change_graph (range -8..8)
        │
        ▼
ref_disc_rumus_def (evaluasi expr thd D1..C3 grafik values)
        │
        ▼
ref_disc_result (desc1, desc2, desc3, desc4 per kode karakter)
```

## Database Tables

| Table | Role |
|---|---|
| `mst_test2` | Soal DISC — 12 soal, options JSON array 4 objek `{text, type}` |
| `ref_disc_grafik` | Mapping raw score → graph coordinates per tipe (M/L/C) |
| `ref_disc_rumus_def` | 40+ formula PHP untuk menentukan karakter berdasarkan D1..C3 |
| `ref_disc_result` | Deskripsi karakter per kode (desc1-judul, desc2-ciri, desc3-job, desc4-kepribadian) |
| `applicant_answers` | Jawaban user (most_option, least_option = index 0-3) |

## Data Structure

### `ref_disc_grafik`

Mapping raw count ke nilai grafik (-8..8) untuk 3 line chart.

| Column | Desc |
|---|---|
| `tipe` | `M` (Most/Line 1), `L` (Least/Line 2), `C` (Change/Line 3) |
| `nomor` | Raw score (-22..22) |
| `val_d` | Nilai grafik untuk dimensi D pada nomor tsb |
| `val_i` | Nilai grafik untuk dimensi I |
| `val_s` | Nilai grafik untuk dimensi S |
| `val_c` | Nilai grafik untuk dimensi C |

### `ref_disc_rumus_def`

Formula evaluasi karakter. Expression PHP yang dievaluasi terhadap grafik values.

| Column | Desc |
|---|---|
| `kode` | Kode karakter (contoh: `C`, `D`, `C-I`, `D-C-S`) |
| `line1` | Expression untuk Mask Public Self (evaluasi thd D1,I1,S1,C1) |
| `line2` | Expression untuk Core Private Self (evaluasi thd D2,I2,S2,C2) |
| `line3` | Expression untuk Mirror Perceived Self (evaluasi thd D3,I3,S3,C3) |

Contoh expression: `$D1 > 0 && $I1 <= 0 && $S1 <= 0 && $C1 <= 0`

### `ref_disc_result`

Deskripsi karakter hasil evaluasi rumus.

| Column | Desc |
|---|---|
| `kode` | Kode karakter (sama dengan rumus_def.kode) |
| `desc1` | Judul/tipe karakter (contoh: "LOGICAL THINKER") |
| `desc2` | Ciri-ciri karakter (bullets) |
| `desc3` | Job match / pekerjaan yang cocok |
| `desc4` | Deskripsi kepribadian lengkap |

## Method: `getTest2Data($test2Session)`

### Step 1 — Raw Scoring
1. Load semua `mst_test2` questions
2. Iterasi jawaban test session:
   - `most_option` (0-3) → index ke `options[index].type` → count per D/I/S/C/*
   - `least_option` (0-3) → index ke `options[index].type` → count per D/I/S/C/*
3. Hitung raw change = raw_most - raw_least (untuk D,I,S,C)
4. Simpan di `table.most`, `table.least`, `table.change`

### Step 2 — Grafik Mapping
1. Load `ref_disc_grafik` (deduplikasi by tipe+nomor)
2. Untuk tiap dimensi D/I/S/C:
   - `grafik.most[D]` = cari tipe=M, nomor=raw_most[D] → val_d
   - `grafik.least[D]` = cari tipe=L, nomor=raw_least[D] → val_d
   - `grafik.change[D]` = cari tipe=C, nomor=raw_change[D] → val_d

### Step 3 — Evaluasi Rumus Karakter
1. Load `ref_disc_rumus_def` (deduplikasi by kode)
2. Load `ref_disc_result` (deduplikasi by kode)
3. Untuk setiap rumus, evaluasi expression untuk line1, line2, line3:
   - Ganti `$D1..$C3` dengan nilai grafik aktual
   - Eksekusi `eval("return $expr;")`
   - Jika true → overwrite karakter untuk line tsb (last-match-wins)
4. Ambil desc4 untuk kepribadian, desc3 untuk job match dari line3

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

### Screen View
| Komponen | Detail |
|---|---|
| **Tabel Hasil** | 3 baris (Most/Least/Change) × 7 kolom (Line/D/I/S/C/*/Total) |
| **Chart Most** | ECharts line chart — Graph 1 Most (Mask Public Self) |
| **Chart Least** | ECharts line chart — Graph 2 Least (Core Private Self) |
| **Chart Change** | ECharts line chart — Graph 3 Change (Mirror Perceived Self) |
| **Mask Public Self** | Judul karakter (desc1) + ciri-ciri (desc2) |
| **Core Private Self** | Judul karakter (desc1) + ciri-ciri (desc2) |
| **Mirror Perceived Self** | Judul karakter (desc1) + ciri-ciri (desc2) |
| **Deskripsi Kepribadian** | Paragraf kepribadian (desc4) |
| **Job Match** | Pekerjaan cocok (desc3) |

### Print View
- Kop dokumen + identitas kandidat
- Tabel hasil DISC
- 3 tabel karakter (Mask/Core/Mirror)
- Deskripsi Kepribadian
- Job Match

## Struktur Data Return

```php
[
    'table' => [
        'most' => ['D' => int, 'I' => int, 'S' => int, 'C' => int, '*' => int],
        'least' => ['D' => int, 'I' => int, 'S' => int, 'C' => int, '*' => int],
        'change' => ['D' => int, 'I' => int, 'S' => int, 'C' => int],
        'total_most' => int,
        'total_least' => int,
    ],
    'grafik' => [
        'most' => ['D' => float, 'I' => float, 'S' => float, 'C' => float],
        'least' => ['D' => float, 'I' => float, 'S' => float, 'C' => float],
        'change' => ['D' => float, 'I' => float, 'S' => float, 'C' => float],
    ],
    'karakter' => [
        'line1' => object{desc1, desc2, desc3, desc4} | null,
        'line2' => object{desc1, desc2, desc3, desc4} | null,
        'line3' => object{desc1, desc2, desc3, desc4} | null,
    ],
    'kepribadian' => string,  // desc4 dari line3
    'job_match' => string,    // desc3 dari line3
]
```
