From d6469a01dc8f958feddeaf634865e8f1726dd4d4 Mon Sep 17 00:00:00 2001 From: Power BI Dev Date: Thu, 23 Jul 2026 23:31:01 +0700 Subject: [PATCH] Gitignore semua file markdown kecuali README RANCANGAN.md dan METODOLOGI_ASESMEN_KOMPONEN.md jadi catatan lokal saja (berkasnya tetap ada, cuma tidak lagi ikut repositori). Co-Authored-By: Claude Sonnet 5 --- .gitignore | 4 + METODOLOGI_ASESMEN_KOMPONEN.md | 234 --------------------------------- RANCANGAN.md | 227 -------------------------------- 3 files changed, 4 insertions(+), 461 deletions(-) delete mode 100644 METODOLOGI_ASESMEN_KOMPONEN.md delete mode 100644 RANCANGAN.md diff --git a/.gitignore b/.gitignore index 7163fa8..23e4f10 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ __pycache__/ # pengaturan lokal Claude Code .claude/ + +# dokumen markdown lokal (catatan/rancangan kerja) — kecuali README +*.md +!README.md diff --git a/METODOLOGI_ASESMEN_KOMPONEN.md b/METODOLOGI_ASESMEN_KOMPONEN.md deleted file mode 100644 index ebefbca..0000000 --- a/METODOLOGI_ASESMEN_KOMPONEN.md +++ /dev/null @@ -1,234 +0,0 @@ -# Metodologi Asesmen: Sub-CPMK vs Komponen - -Dokumen ini menjelaskan **dua sudut pandang nilai** di halaman Input Nilai -(`/nilai/`) — 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) -``` diff --git a/RANCANGAN.md b/RANCANGAN.md deleted file mode 100644 index cbfa763..0000000 --- a/RANCANGAN.md +++ /dev/null @@ -1,227 +0,0 @@ -# Rancangan Aplikasi Penyusunan RPS & Portofolio Mata Kuliah - -**Prodi Informatika (S-1) · Universitas Tanjungpura — Kurikulum OBE** - -## 1. Tujuan - -Membantu dosen menyusun **RPS (format APTIKOM 2024)** dan **Portofolio Mata Kuliah** -melalui form web, lalu menghasilkan dokumen **.docx yang formatnya identik dengan -template resmi** — tanpa dosen menyentuh Word sama sekali. - -Nilai tambah utama: data kurikulum yang sudah ada (10 CPL, 34 CPMK, 49 MK, -549 Sub-CPMK — sumber: dashboard pemetaan) dipakai untuk **mengisi otomatis** -bagian CPL/CPMK/Sub-CPMK begitu dosen memilih mata kuliah. Dosen hanya melengkapi -bagian yang memang pengetahuannya: tabel mingguan, penilaian, referensi. - -## 2. Keputusan desain (sudah disepakati) - -| Aspek | Keputusan | -|---|---| -| Deployment | Web app + server, deploy via Coolify (Dockerfile), seperti dashboard | -| Backend | Python: FastAPI + SQLite + python-docx | -| Autentikasi | **Login dengan NIP** — username = NIP, password awal = NIP (revisi 14 Jul 2026 — dibutuhkan karena aplikasi menyimpan nilai per mahasiswa; kredensial dibuat sesederhana mungkin atas keputusan user). Dua peran: **kaprodi** (kelola akun, penugasan MK, impor daftar mahasiswa, pengaturan, cadangan) dan **dosen** (edit RPS/porto & lihat nilai hanya pada MK yang ditugaskan; RPS MK lain terbuka baca). Keputusan awal "tanpa login" dibatalkan. | -| Template RPS | `Template_RPS_APTIKOM2024.docx` (kode generatornya sudah ada: `buat_template_rps.py`) | -| Template Portofolio | Akan diberikan user — generator dibuat setelah file diterima | - -## 3. Arsitektur - -``` -┌──────────────────────────── Docker (Coolify) ────────────────────────────┐ -│ FastAPI (uvicorn, port 8000) │ -│ ├── UI: Jinja2 templates + sedikit JS vanilla (tanpa build step) │ -│ ├── API: CRUD RPS/Portofolio, generate .docx │ -│ ├── Generator dokumen: python-docx (refactor dari buat_template_rps.py) │ -│ └── SQLite ←── volume persisten Coolify (/data/app.db) │ -└──────────────────────────────────────────────────────────────────────────┘ -Seed data: JSON kurikulum diekstrak dari dashboard-deploy/index.html (baris 237) -``` - -Prinsip: **satu container, tanpa build frontend, tanpa dependensi eksternal saat runtime.** -Form dirender server-side; interaktivitas (tambah baris minggu, hitung total bobot) -pakai JS vanilla inline. - -## 4. Model data - -Entitas kurikulum (read-only, di-seed sekali dari JSON dashboard, bisa di-reseed): - -- `cpl` — kode, deskripsi -- `mk` — kode, nama, sks, semester -- `cpmk` — kode, deskripsi, relasi ke CPL -- `sub_cpmk` — kode, uraian, relasi ke CPMK & MK - -Entitas isian dosen: - -- `rps` — satu per MK per tahun ajaran: - - identitas (bobot teori/praktikum, prasyarat, dosen pengampu, koordinator, kaprodi) - - deskripsi singkat MK - - pilihan CPL/CPMK/Sub-CPMK yang dibebankan (default: semua hasil pemetaan, bisa dikurangi) - - `rps_minggu` — 16 baris (minggu, sub-CPMK, indikator, kriteria & bentuk penilaian, - metode & estimasi waktu, materi & referensi, bobot %) — minggu 8 = UTS, 16 = UAS - - `rps_bobot` — rekap komponen penilaian (Tugas/Kuis, Praktikum, UTS, UAS) - - `rps_referensi` — daftar pustaka (APA) - - status: `draft` / `selesai`, `updated_at`, `updated_by` (nama diketik bebas) -- `portofolio` — satu per MK per semester berjalan; **struktur field mengikuti template - yang akan diberikan** (umumnya: realisasi pembelajaran, ketercapaian CPMK, distribusi - nilai, refleksi, rencana perbaikan) - -Entitas pengukuran (lihat §7): - -- `nilai_komponen` — realisasi skor per komponen penilaian per MK per semester - (rata-rata kelas 0–100; opsional per mahasiswa via impor CSV pada tahap lanjut) -- Bobot penilaian per Sub-CPMK **tidak perlu entitas baru** — sudah terkandung di - `rps_minggu.bobot` (tiap baris minggu terikat ke Sub-CPMK) dan `rps_bobot` - -## 5. Arah visual (UI) - -Kekhawatiran user: tampilan tidak boleh terasa "template buatan AI". Kesepakatan kerja: - -- **Tanpa framework CSS** (tanpa Tailwind/Bootstrap) — CSS ditulis tangan mengikuti - satu arah visual yang dipilih dari mockup. -- Tiga kandidat arah sudah dibuat sebagai mockup nyata (artifact - `Arah Visual — Aplikasi RPS & Portofolio`): - - **A · Dokumen Dinas** — tata naskah resmi: kop bergaris ganda, Times New Roman, - tabel bergaris penuh, biru `#1F4E79` dari template Word, status berupa stempel. - - **B · Lembar Kerja Teknik** — kertas milimeter, blok judul gambar teknik, - monospace untuk data, aksen oranye drafting. - - **C · Papan Prodi** — modernisme layanan publik: blok warna datar hijau - pinus + marigold, huruf Bahnschrift besar, sudut siku, tanpa bayangan. -- Orientasi layout **landscape/lebar** (keputusan user, 14 Jul 2026): "kertas" - aplikasi selebar `min(96vw, 1720px)` — memudahkan pengisian tabel mingguan - dan selaras dengan format RPS UNTAN yang memang landscape. -- Arah terpilih: **A · Dokumen Dinas** (keputusan user, 13 Jul 2026) — palet, tipografi, - dan komponen (tabel, chip status, tombol, form) dibakukan jadi style guide kecil - di `app/static/` dan dipakai konsisten di seluruh halaman. - -## 6. Alur pengguna - -1. **Beranda** — daftar 49 MK + status RPS/Portofolio (belum ada / draft / selesai). - Ini sekaligus jadi tampilan pantauan untuk kaprodi. -2. **Pilih MK** → form RPS terbuka dengan bagian B/C/D **sudah terisi** dari pemetaan. -3. Dosen melengkapi identitas, deskripsi, tabel mingguan, bobot, referensi. - Validasi ringan: total bobot harus 100 %, minggu 8/16 terkunci sebagai UTS/UAS, - saran kata kerja operasional Bloom (C1–C6) pada uraian. -4. **Simpan** kapan saja (draft) → **Unduh .docx** kapan saja; dokumen selalu - digenerate ulang dari data terkini sehingga format pasti konsisten. -5. Alur portofolio serupa: pilih MK → sebagian terisi dari RPS-nya → lengkapi → unduh. - -## 7. Pengukuran ketercapaian CPL & CPMK — inti OBE - -Dashboard yang ada (`dashboard-deploy/index.html`) memuat **graf relasi lengkap** -CPL → CPMK → MK → Sub-CPMK (549 Sub-CPMK) + matriks MK × CPL, tapi **tanpa bobot dan -tanpa nilai** — ia memetakan desain kurikulum, belum mengukur realisasinya. -Aplikasi ini melengkapi dua bahan yang hilang itu: - -| Bahan | Sumber di aplikasi | -|---|---| -| Relasi Sub-CPMK–CPMK–CPL–MK | Seed dari JSON dashboard (read-only) | -| Bobot penilaian per Sub-CPMK | Tabel mingguan (F) & rekap bobot (G) pada form RPS | -| Nilai realisasi | Form portofolio: rata-rata kelas per komponen penilaian | - -**Rumus penggulungan (roll-up):** - -1. **Ketercapaian Sub-CPMK** = skor komponen penilaian yang menilainya - (bila dinilai >1 komponen: rata-rata tertimbang bobot). -2. **Ketercapaian CPMK dalam satu MK** = Σ(bobot × skor Sub-CPMK pendukung) / Σ bobot. -3. **Ketercapaian CPMK tingkat prodi** = rata-rata ketercapaian CPMK itu lintas - semua MK yang mengukurnya (**bagi rata**, default — lihat catatan di bawah). -4. **Ketercapaian CPL** = rata-rata ketercapaian CPMK pendukungnya (**bagi rata**). - -> **Catatan bobot antar-MK** (hasil audit spreadsheet `Draft Kurikulum Terbaru -> 2025.xlsx`, 13 Jul 2026): tidak ada matriks bobot kontribusi MK→CPL di dokumen -> kurikulum. Sheet `(%)Pemetaan CPL-MK` hanya biner (1 = memikul) + kolom "beban -> CPL" (SKS + jumlah CPL) untuk cek beban, dan sheet 18 hanya distribusi MK per -> semester. Karena itu default mengikuti praktik umum panduan KPT/OBE Dikti: -> **rata-rata sederhana dua tahap** (MK → CPMK → CPL). Opsi **tertimbang SKS** -> disediakan sebagai toggle pengaturan prodi; matriks kontribusi manual = fitur -> lanjutan bila prodi kelak menetapkannya. -5. Ambang ketercapaian (mis. ≥ 70 = tercapai) dapat diatur di pengaturan prodi. - -Default bobot komponen penilaian untuk prefill rekap bobot (G) di form RPS — -diambil dari sheet `Asessement` draft kurikulum (Tabel 25): Kuis 15 %, -UTS 20 %, UAS 30 %, Tugas 35 %. Dosen bebas mengubahnya per MK. - -**Keluaran pengukuran:** - -- Halaman **Rekap Ketercapaian** — skor CPL & CPMK tingkat prodi per semester, - daftar CPL/CPMK di bawah ambang, dan MK mana penyumbangnya (pelengkap dashboard - pemetaan yang sudah ada). -- Tabel ketercapaian CPMK **otomatis masuk ke dokumen portofolio** tiap MK. -- Validasi di form RPS: setiap Sub-CPMK yang dipetakan ke MK harus ternilai oleh - minimal satu komponen — jika tidak, CPMK/CPL-nya tidak akan pernah terukur - (deteksi celah sejak perencanaan). - -**Keputusan final (disepakati user, 13 Jul 2026, hasil kajian "auditor OBE"):** - -1. **Bobot antar-MK: bagi rata dua tahap + terdokumentasi.** Aplikasi menyediakan - halaman **Metodologi Pengukuran** yang bisa dicetak (rumus roll-up, ambang, - periode) sebagai jawaban baku untuk asesor. Toggle SKS ada tapi baru diaktifkan - bila ada keputusan resmi prodi. -2. **Nilai per mahasiswa sejak awal di lapisan data.** Pintu masuk utama: unggah - Excel nilai (yang sudah dibuat dosen untuk SIAKAD). Ketik rata-rata kelas tetap - boleh sebagai transisi, tapi MK tersebut ditandai **"bukti agregat"** di rekap. - Rekap ketercapaian menampilkan **kelengkapan bukti** per CPL (x dari y MK - pemikul sudah setor nilai) berdampingan dengan skor. -3. **Kisi-kisi komponen × Sub-CPMK tampil**, terisi otomatis dari tabel mingguan - (bagi rata), dapat dikoreksi dosen, dan tercetak sebagai lampiran di dokumen - RPS/portofolio (bukti constructive alignment). -4. **Pengaturan prodi** (ambang kelulusan, skala huruf mutu, bobot default - komponen) jadi halaman sendiri — menggantikan kebijakan pinjaman dari pedoman - kampus lain yang ditemukan di sheet `Asessement`. - -Temuan data yang memengaruhi UI rekap: distribusi pemikul timpang (CPL-03: 27 MK -vs CPL-10: 6 MK; CPMK-043/101/103 hanya diukur 2 MK) → indikator kelengkapan bukti -wajib tampil; granularitas tinggi (median 10, maks 24 Sub-CPMK/MK) → kisi-kisi -wajib prefill otomatis. - -## 8. Generator dokumen - -**Keputusan format (user, 13 Jul 2026):** RPS memakai **format resmi UNTAN** -(`RPS Template.docx`, standar Dikti SN-Dikti Permendikbud 3/2020 — landscape, -satu tabel besar berlogo UNTAN); portofolio dibuat sebagai **.docx** dengan -struktur mengikuti `Contoh Portofolio MK 040126.xlsx` (10 bagian, termasuk -Evaluasi Ketercapaian yang diisi mesin roll-up tahap 2). - -- `generator/rps_untan.py` — pendekatan **isi-template-asli**: file template resmi - dimuat, sel diisi data, baris CPL/CPMK/Sub-CPMK/mingguan digandakan dari baris - prototipe (merge & gaya ikut tersalin), teks petunjuk pengisian dibuang, kop - diganti identitas prodi (fakultas/prodi via env `FAKULTAS` / `PRODI`), plus - lampiran kisi-kisi asesmen. Logo UNTAN bawaan template ikut tersalin otomatis; - logo yang sama dipakai di kop aplikasi web (`static/logo-untan.png`). -- `generator/rps_docx.py` — generator format APTIKOM 2024 (versi awal), disimpan - sebagai alternatif; tidak dipakai rute unduh. -- `generator/portofolio_docx.py` — tahap 2, meniru struktur contoh xlsx dalam - bentuk .docx. - -## 9. Struktur proyek - -``` -rps-portofolio-app/ -├── app/ -│ ├── main.py # FastAPI, routing -│ ├── db.py # SQLite (sqlite3/SQLModel), skema & seed -│ ├── generator/ -│ │ ├── rps_docx.py -│ │ └── portofolio_docx.py -│ ├── templates/ # Jinja2: beranda, form RPS, form portofolio -│ └── static/ # css + js vanilla -├── seed/kurikulum.json # hasil ekstraksi dari dashboard -├── Dockerfile -├── requirements.txt -└── RANCANGAN.md -``` - -## 10. Tahapan pengerjaan - -1. **MVP RPS** — seed data kurikulum, beranda status, form RPS, generate .docx, Dockerfile. -2. **Portofolio + Pengukuran** — setelah template diterima: analisis struktur, form portofolio, input nilai komponen, mesin roll-up ketercapaian CPMK/CPL, halaman Rekap Ketercapaian, generator .docx portofolio. -3. **Penyempurnaan** — duplikasi RPS antar tahun ajaran, ekspor PDF, rekap - ketercapaian CPMK lintas MK, backup/ekspor seluruh database ke JSON. - -## 11. Risiko & mitigasi - -- **Tanpa login → bisa saling timpa**: setiap simpan mencatat nama & waktu; riwayat - versi sederhana (simpan snapshot JSON tiap kali status berubah ke `selesai`). -- **Data kurikulum berubah**: seed dipisah sebagai JSON; ada perintah re-seed yang - tidak menyentuh data isian dosen. -- **SQLite di container**: wajib volume persisten di Coolify (`/data`), plus tombol - ekspor database dari UI sebagai cadangan.