# Dokumentasi Sistem Penilaian — Bimbel Triton Denpasar

Bagaimana nilai seorang siswa dihitung dari sebuah tryout, mulai dari saat ia
menekan tombol **Selesai** sampai angka yang muncul di papan peringkat.

Dokumentasi ini menjawab satu pertanyaan pokok: **kalau tiap soal punya bobot
yang berbeda-beda, bagaimana nilai akhirnya dihitung?**

## Daftar Isi

| Berkas | Isi |
| --- | --- |
| [01-model-penilaian.md](./01-model-penilaian.md) | Rumus inti, arti bobot, dan contoh perhitungan lengkap |
| [02-aturan-per-tipe-soal.md](./02-aturan-per-tipe-soal.md) | Cara tiap dari 6 tipe soal dinilai, termasuk nilai parsial |
| [03-temuan-dan-batasan.md](./03-temuan-dan-batasan.md) | Perilaku yang perlu diketahui, terutama soal essay |

Versi ringkas berbentuk halaman web: [index.html](./index.html)

## Ringkasan Satu Menit

Nilai **bukan** persentase jumlah soal yang benar. Nilai adalah **persentase
bobot yang berhasil dikumpulkan**:

```
nilai = ( Σ bobot_soal × fraksi_benar ) / ( Σ bobot_soal ) × 100
```

- **bobot** — angka bulat positif yang ditetapkan guru per soal (bawaan `1`).
  Soal bobot 5 bernilai lima kali lipat soal bobot 1.
- **fraksi_benar** — angka `0` sampai `1` per soal. Sebagian besar tipe soal
  hanya menghasilkan `0` atau `1`, tetapi *menjodohkan* dan *tabel pernyataan
  benar/salah* bisa menghasilkan nilai pecahan (nilai parsial).
- Hasilnya selalu berada pada skala **0–100**, disimpan dengan 2 angka desimal.

Perhitungan berjalan **satu kali**, di server, pada saat sesi diselesaikan.

## Sumber Kode

Seluruh isi dokumen ini diverifikasi langsung terhadap kode, bukan dari ingatan:

| Berkas | Peran |
| --- | --- |
| `services/{sd,smp,sma}-service/src/routes/jawaban.routes.ts` | `gradeAnswer()` dan rumus nilai pada `POST /sesi/:sesiId/selesai` |
| `services/{sd,smp,sma}-service/src/lib/benarSalahTabel.ts` | `hitungFraksiBenarSalahTabel()` — nilai parsial tabel pernyataan |
| `services/{sd,smp,sma}-service/src/db/schema.sql` | Kolom `soal.bobot` dan tabel `hasil` |

Ketiga service jenjang menjalankan **kode penilaian yang identik** (terverifikasi
dengan `diff`: 0 baris perbedaan). Jadi seluruh aturan di sini berlaku sama untuk
SD, SMP, maupun SMA.
