Tambah ringkasan nilai per komponen, rincian tugas ala RTM, auto-save RPS

- Halaman Nilai: tabel "Nilai per Komponen" (rata-rata skor mentah tiap
  sesi, bisa diedit langsung) berdampingan dengan grid Sub-CPMK yang tetap
  presisi; kolom persentase ternilai di Hasil Ketercapaian.
- Komponen Tugas: sesi bisa menyasar subset Sub-CPMK (RPS tetap batasannya),
  lengkap dengan field ala RTM (bentuk tugas, deskripsi, metode, luaran,
  indikator/bobot, jadwal) dan tombol isi-otomatis per bentuk tugas.
- RPS: auto-save berkala sebagai draft, tombol ke atas, validasi total
  bobot komponen 100% saat ditandai selesai, komponen berbobot kosong
  disembunyikan dari halaman Nilai.
- Admin: tampilkan kelas yang tersedia dari data mahasiswa saat mengatur
  penugasan dosen per kelas.
- Perbaikan step="any" pada input nilai (mencegah validasi HTML5 menolak
  nilai desimal hasil roll-up).
- Tambah METODOLOGI_ASESMEN_KOMPONEN.md: dokumentasi metodologi Sub-CPMK
  vs komponen, termasuk skenario tugas menyasar sebagian Sub-CPMK.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Power BI Dev
2026-07-23 23:28:46 +07:00
parent bdaacf1c8f
commit d5edbe2134
7 changed files with 668 additions and 67 deletions
+234
View File
@@ -0,0 +1,234 @@
# Metodologi Asesmen: Sub-CPMK vs Komponen
Dokumen ini menjelaskan **dua sudut pandang nilai** di halaman Input Nilai
(`/nilai/<kode>`) — bagaimana keduanya dihitung, bagaimana keduanya berbeda,
dan bagaimana pembagian bobot bekerja ketika satu komponen (mis. Tugas) diisi
lewat beberapa sesi yang masing-masing menyasar sebagian Sub-CPMK saja.
Pelengkap `RANCANGAN.md §7` (roll-up CPMK/CPL tingkat prodi) dan halaman
`/metodologi` (dokumentasi resmi untuk asesor) — dokumen ini fokus ke lapisan
**di dalam satu MK**: dari nilai mentah yang diketik dosen, sampai ke skor
Sub-CPMK yang jadi bahan roll-up CPMK/CPL.
## 1. Dua tampilan, satu sumber data
| | **Nilai per Mahasiswa** (berdasarkan Sub-CPMK) | **Nilai per Komponen** (berdasarkan komponen) |
|---|---|---|
| Kolom tabel | Tiap Sub-CPMK (Sub-051-1, Sub-051-2, ...) | Tiap komponen (Kuis, Tugas, UTS, ...) |
| Isi sel | Skor Sub-CPMK — presisi, boleh beda-beda dalam satu komponen | Rata-rata skor **mentah** tiap sesi/instrumen komponen itu yang diikuti mahasiswa |
| Dipakai untuk roll-up CPMK/CPL? | **Ya** — ini sumber kebenaran satu-satunya | **Tidak** — murni ringkasan & alat edit cepat |
| Efek saat diedit | Menulis persis ke Sub-CPMK yang diketik | Menulis nilai yang sama ke **semua** Sub-CPMK komponen itu (menimpa presisi bila sebelumnya beda-beda) |
Intinya: **Sub-CPMK adalah satuan ukur OBE yang sesungguhnya.** "Komponen" (Kuis,
Tugas, UTS, dst.) hanyalah *label pengelompokan instrumen penilaian* — satu
komponen bisa mengukur beberapa Sub-CPMK sekaligus, dan satu Sub-CPMK bisa
diukur oleh lebih dari satu komponen. "Nilai per Komponen" cuma jendela lain
untuk melihat/mengedit data yang sama, dari sudut instrumen bukan dari sudut
capaian.
## 2. Alur data lengkap
```mermaid
flowchart TD
ISI["Isi Nilai per komponen\n(sesi bernama; Tugas boleh pilih\nsubset Sub-CPMK per sesi)"] --> SESI
GRID["Nilai per Mahasiswa\n(ketik langsung per Sub-CPMK)"] --> SK
SESI["sesi[komponen]\n= daftar sesi mentah tiap komponen\n(nim → skor, subset Sub-CPMK opsional)"]
SESI <--> KOMP["Nilai per Komponen\n(tampil = rata-rata sesi;\nketik = sesi baru 'Input Cepat')"]
SESI --> H["skor_dari_sesi()\nbagi kontribusi per Sub-CPMK,\ntertimbang bobot_komponen ÷ n_subs_komponen"]
H --> SK["Skor Sub-CPMK per mahasiswa\n(mahasiswa[].skor — SUMBER KEBENARAN)"]
SK --> CPMK["rollup_mk(): Skor CPMK\n= rata-rata Sub-CPMK pendukung"]
CPMK --> CPL["Skor CPL (dalam MK)\n= rata-rata CPMK pendukung"]
CPMK --> PRODI["rollup_prodi(): CPMK/CPL tingkat prodi\n(lintas semua MK pemikul)"]
SK --> AKHIR["Nilai Akhir mahasiswa\n= Σ(bobot_sub × skor_sub) / Σ bobot_sub\n(bobot dari RPS, bagi rata per komponen)"]
```
Dua hal penting dari diagram ini:
1. **"Nilai per Komponen" bukan jalur data terpisah — ia baca/tulis ke sesi
yang sama** yang dipakai `skor_dari_sesi()`. Angka yang **ditampilkan** di
situ (rata-rata sesi) tidak dipakai langsung oleh rumus manapun — ia
sekadar ringkasan. Tapi begitu diedit (diketik ulang), perubahan itu
tercatat sebagai sesi baru "Input Cepat" dan **ikut dihitung** lewat jalur
yang sama seperti sesi bernama lain — jadi tetap satu sumber kebenaran,
bukan data ganda yang bisa tidak sinkron.
2. **"Nilai Akhir" (nilai huruf/angka mahasiswa) dan "Ketercapaian CPMK/CPL"
(OBE) adalah dua rumus berbeda** yang sama-sama diturunkan dari skor
Sub-CPMK, tapi dengan cara menimbang yang berbeda (lihat §6).
## 3. Komponen berulang vs sekali-jalan
| Tipe | Contoh | Bisa berapa sesi? | Sub-CPMK per sesi |
|---|---|---|---|
| **Berulang** | Kuis, Presentasi, Tes Lisan | Banyak — tiap sesi dirata-rata sederhana | Selalu semua Sub-CPMK komponen itu |
| **Berulang + subset** | **Tugas** (Observasi/Praktik) | Banyak, tiap sesi = satu tugas bernama | **Bisa dipilih sebagian** — lihat §4 |
| **Sekali-jalan** | UTS, UAS | Satu — mengisi lagi menimpa sesi yang sama | Selalu semua Sub-CPMK komponen itu |
Komponen **Tugas** adalah satu-satunya yang mendukung penyasaran Sub-CPMK per
sesi (checklist di form "Isi Nilai"), karena secara alami satu MK sering punya
beberapa tugas berbeda yang masing-masing menguji kemampuan (Sub-CPMK) yang
berbeda pula — beda dari Kuis/Presentasi yang biasanya satu instrumen menguji
semua Sub-CPMK yang sama tiap kali.
## 4. Sub-CPMK per sesi — bagaimana pembagiannya
Saat RPS menetapkan komponen Tugas mengukur, misalnya, **4 Sub-CPMK** dengan
bobot **20%**, checklist di form "Isi Nilai" **selalu dibatasi ke 4 Sub-CPMK
itu saja** (tak bisa menambah Sub-CPMK di luar yang RPS tetapkan) — bawaannya
semua tercentang, dosen tinggal **mengurangi** centang sesuai Sub-CPMK mana
yang benar-benar diuji tugas tsb.
**Aturan penggabungan kontribusi** (fungsi `skor_dari_sesi`):
- Untuk tiap Sub-CPMK di dalam komponen itu, sistem mencari **semua sesi**
yang menyasarnya (baik yang eksplisit memilihnya, atau sesi lama yang tak
punya pilihan subset sama sekali → dianggap menyasar semua Sub-CPMK
komponen).
- Sesi-sesi yang relevan itu dirata-rata sederhana dulu **per Sub-CPMK**
(bukan rata dulu antar-tugas lalu disebar rata — tiap Sub-CPMK punya rata-
ratanya sendiri dari tugas yang benar-benar mengukurnya).
- **Bobot komponen (20%) dibagi rata ke SEMUA 4 Sub-CPMK milik komponen itu**
(5% tiap Sub-CPMK) — pembagian ini memakai jumlah Sub-CPMK **komponen**,
bukan jumlah Sub-CPMK **sesi tertentu**. Bobot per-Sub-CPMK inilah yang
dipakai untuk menimbang kalau Sub-CPMK yang sama juga diukur komponen lain
(mis. Presentasi turut menilai Sub-052).
```mermaid
flowchart LR
subgraph RPS["RPS: Observasi (Praktik/Tugas) — bobot 20%, 4 Sub-CPMK"]
direction TB
RSub1["Sub-051-1"]
RSub2["Sub-051-2"]
RSub3["Sub-052-1"]
RSub4["Sub-052-2"]
end
T1["Tugas 1: Analisis Kasus\n(centang: Sub-051-1, Sub-051-2)"] --> RSub1
T1 --> RSub2
T2["Tugas 2: Proyek Mini\n(centang: Sub-052-1, Sub-052-2)"] --> RSub3
T2 --> RSub4
T3["Tugas 3: Presentasi Studi Kasus\n(centang: semua 4)"] --> RSub1
T3 --> RSub2
T3 --> RSub3
T3 --> RSub4
```
## 5. Skenario nyata: tugas menyasar sebagian Sub-CPMK
Studi kasus dari MK Logika Komputasional — komponen **Observasi (Praktik/
Tugas)**, bobot RPS **20%**, mencakup 4 Sub-CPMK: `Sub-051-1`, `Sub-051-2`,
`Sub-052-1`, `Sub-052-2`.
> **Penyederhanaan untuk ilustrasi:** contoh di bawah mengasumsikan keempat
> Sub-CPMK itu **hanya** diukur komponen Tugas, supaya mekanisme pembagiannya
> kelihatan jelas. Di data MK ini yang sebenarnya, `Sub-051-1/2` juga ikut
> diukur komponen **Tes Tulis (UTS)** — lihat §5.1 untuk contoh gabungan
> lintas-komponen dengan angka riil.
**Tiga tugas dibuat sepanjang semester:**
| Sesi | Sub-CPMK disasar | Nilai per mahasiswa |
|---|---|---|
| Tugas 1: Analisis Kasus | Sub-051-1, Sub-051-2 | Andi 85 · Budi 92 |
| Tugas 2: Proyek Mini | Sub-052-1, Sub-052-2 | Citra 78 · Dedi 88 |
| Tugas 3: Presentasi Studi Kasus | Semua 4 Sub-CPMK | Andi 88 · Budi 90 · Citra 82 · Dedi 86 · Eka 79 |
**Hasil skor per Sub-CPMK** (rata-rata sederhana dari sesi yang relevan tiap
Sub-CPMK):
| Mahasiswa | Sub-051-1 / -2 | Sub-052-1 / -2 | Keterangan |
|---|---|---|---|
| Andi | (85 + 88) / 2 = **86,5** | 88 (dari Tugas 3 saja) | Ikut Tugas 1 & 3 |
| Budi | (92 + 90) / 2 = **91** | 90 (dari Tugas 3 saja) | Ikut Tugas 1 & 3 |
| Citra | 82 (dari Tugas 3 saja) | (78 + 82) / 2 = **80** | Ikut Tugas 2 & 3 |
| Dedi | 86 (dari Tugas 3 saja) | (88 + 86) / 2 = **87** | Ikut Tugas 2 & 3 |
| Eka | 79 (dari Tugas 3 saja) | 79 (dari Tugas 3 saja) | Cuma ikut Tugas 3 |
Perhatikan: **Sub-051 dan Sub-052 milik satu mahasiswa boleh berbeda** — itu
tepat sesuai fakta bahwa Tugas 1 dan Tugas 2 mengukur kemampuan yang berbeda.
Ini yang dipakai untuk ketercapaian **CPMK051** dan **CPMK052** — masing-
masing presisi sesuai tugas yang benar-benar mengukurnya, bukan dicampur rata.
**Tampilan "Nilai per Komponen"** (rata-rata mentah tiap tugas yang diikuti,
independen dari Sub-CPMK):
| Mahasiswa | Tugas 1 | Tugas 2 | Tugas 3 | Rata-rata tampil |
|---|---|---|---|---|
| Andi | 85 | — | 88 | (85+88)/2 = **86,5** |
| Budi | 92 | — | 90 | (92+90)/2 = **91** |
| Citra | — | 78 | 82 | (78+82)/2 = **80** |
| Dedi | — | 88 | 86 | (88+86)/2 = **87** |
| Eka | — | — | 79 | **79** |
Perhatikan Andi: "Nilai per Komponen"-nya **86,5** kebetulan sama dengan skor
Sub-051 (86,5), tapi **berbeda** dari skor Sub-052-nya (88) — karena kolom
"Nilai per Komponen" cuma satu angka gabungan dari *seluruh* tugas yang
diikuti (Tugas 1 + Tugas 3), tanpa mempedulikan Sub-CPMK mana yang disasar
tiap tugas. Pola yang sama berlaku untuk Budi, Citra, dan Dedi. Kalau kolom
ini **diketik ulang** (dijadikan override manual), nilai baru itu akan
ditulis **rata ke keempat Sub-CPMK** sekaligus — jadi presisi Sub-051 vs
Sub-052 akan hilang untuk mahasiswa itu kalau memang sengaja ditimpa.
### 5.1 Saat Sub-CPMK yang sama diukur >1 komponen (angka riil)
Di RPS MK ini, `Sub-051-1`/`Sub-051-2` sebenarnya diukur **dua komponen**:
Observasi (Praktik/Tugas) — bobot 20%, 4 Sub-CPMK — **dan** Tes Tulis (UTS)
— bobot 25%, 6 Sub-CPMK. Andi punya nilai UTS = 80 (sesi tunggal, berlaku ke
keenam Sub-CPMK UTS) selain nilai Tugas-nya di atas.
**Bobot kontribusi tiap komponen ke Sub-051** = bobot komponen ÷ jumlah
Sub-CPMK komponen itu (bukan jumlah Sub-CPMK yang disasar sesi tertentu):
```
w(Tugas) = 20% ÷ 4 Sub-CPMK = 5,0%
w(UTS) = 25% ÷ 6 Sub-CPMK = 4,1667%
```
**Skor Sub-051 Andi** = rata-rata tertimbang kedua kontribusi itu:
```
rata Tugas (Tugas 1 & 3) = (85 + 88) / 2 = 86,5
rata UTS = 80
skor Sub-051 = (5,0% × 86,5) + (4,1667% × 80)
────────────────────────────────
5,0% + 4,1667%
= (4,325 + 3,3333) / 0,091667 = 83,55
```
Ini **persis** angka yang muncul di grid Sub-CPMK aplikasi (83,5455 — beda
tipis karena pembulatan). Jadi kalau sebuah Sub-CPMK diukur lebih dari satu
komponen, komponen dengan **bobot lebih besar relatif terhadap jumlah
Sub-CPMK yang ditanggungnya** akan lebih dominan menentukan skor akhir
Sub-CPMK itu — bukan sekadar rata-rata polos antar komponen.
## 6. Nilai Akhir (huruf mutu) vs Ketercapaian CPL/CPMK (OBE)
Dua angka yang **kelihatannya mirip** tapi rumusnya beda tujuan:
| | **Nilai Akhir mahasiswa** | **Ketercapaian CPMK/CPL** |
|---|---|---|
| Untuk apa | Nilai/huruf mutu mahasiswa (transkrip) | Evaluasi kurikulum (OBE) |
| Rumus | Σ(bobot Sub-CPMK × skor mahasiswa) / Σ bobot — bobot dari RPS, dibagi rata per Sub-CPMK dalam tiap komponen | Rata-rata sederhana Sub-CPMK → CPMK → CPL (bagi rata, tanpa bobot RPS) |
| Level | Per mahasiswa, per MK | Per angkatan/kelas, lintas MK (tingkat prodi) |
| Halaman | Kolom "Nilai Akhir" di form Nilai | Halaman Rekap CPL/CPMK, Dasbor Monitoring |
Keduanya bersumber dari **skor Sub-CPMK yang sama** — bedanya cuma di cara
menimbang saat digulung ke atas.
## 7. Ringkasan rumus
```
skor Sub-CPMK = rata-rata sesi yang menyasarnya (lintas komponen,
tertimbang bobot_komponen ÷ n_subs_komponen)
Nilai Akhir = Σ(bobot_sub × skor_sub) / Σ bobot_sub
Skor CPMK (dlm MK) = rata-rata skor Sub-CPMK pendukung
Skor CPL (dlm MK) = rata-rata skor CPMK pendukung
Skor CPMK (prodi) = rata-rata skor CPMK itu lintas semua MK pemikul
Skor CPL (prodi) = rata-rata skor CPMK pendukung, lintas prodi
Nilai per Komponen = rata-rata skor MENTAH sesi komponen itu yang diikuti
mahasiswa (tampilan/edit cepat — tidak dipakai di
rumus manapun di atas secara langsung; edit di sini
menulis balik ke skor Sub-CPMK secara rata)
```