Files
Power BI Dev 5d7ab16733 Tambah Analisis Proses Asesmen, Kelompok Capaian, riwayat nilai terstruktur, dan perbaikan bug CPL
- Portofolio: section "Analisis Proses Asesmen" (dropdown tertutup default) —
  distribusi huruf mutu, kelompok capaian (mean ± SD), Sub-CPMK terlemah/terkuat,
  kesenjangan rencana vs realisasi, mahasiswa berisiko, tren lintas tahun ajaran
- Portofolio: Nomor Dokumen & Tanggal Terbit terisi otomatis; placeholder contoh
  di Realisasi Pembelajaran dan Kendala & Tindak Lanjut; tombol "Isi Otomatis"
  merangkai draf Simpulan dari analisis + realisasi + kendala
- Nilai: tabel Kelompok Capaian (Atas/Tengah/Bawah, shading warna) dipindah ke
  dropdown "Detail Tambahan" bersama Skala Poin/Rincian Bobot/Hasil Ketercapaian;
  tabel utama tak lagi ada scroll vertikal internal
- Nilai: riwayat pengisian dicatat terstruktur (waktu, dosen, aksi, komponen),
  tanpa batas 8 entri, dengan ringkasan per komponen + dropdown Log Lengkap —
  mendukung akuntabilitas team teaching
- Fix bug data: seed kurikulum menyimpan 'cpl' CPMK sebagai string tunggal,
  bukan list, sehingga pecah per huruf saat di-join() di tabel Hasil
  Ketercapaian/Rekap (mis. "CPL-03" -> "C, P, L, -, 0, 3"); dinormalisasi di
  db.py (runtime) dan tools/extract_seed.py (agar re-seed berikutnya benar)
- Hover tooltip deskripsi lengkap di kode Sub-CPMK/CPMK/CPL (halaman Nilai
  dan Rekap CPL/CPMK)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-08 00:09:57 +07:00

80 lines
3.8 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends "base.html" %}
{% block judul %}Rekap Ketercapaian CPL/CPMK — Informatika UNTAN{% endblock %}
{% block isi %}
<h1>Rekap Ketercapaian CPL &amp; CPMK — {{ hasil.tahun }}</h1>
<div class="kpi-baris">
<div><b>{{ hasil.n_mk_setor }}</b> <span>MK sudah setor nilai</span></div>
<div><b>{{ hasil.ambang|round(0)|int }}</b> <span>ambang ketercapaian</span></div>
<div><b>{{ 'SKS' if hasil.metode == 'sks' else 'Bagi rata' }}</b> <span>metode antar-MK</span></div>
<div><b>{{ cpl_urut|selectattr('tercapai')|list|length }}</b> <span>CPL tercapai</span></div>
<div><b>{{ cpl_urut|rejectattr('skor', 'none')|rejectattr('tercapai')|list|length }}</b> <span>CPL di bawah ambang</span></div>
</div>
{% if hasil.n_mk_setor == 0 %}
<div class="peringatan">Belum ada MK yang menyetor nilai — seluruh CPL berstatus "belum terukur". Mulai dari halaman <b>Input Nilai</b> tiap MK di beranda.</div>
{% endif %}
<h2 class="bagian">KETERCAPAIAN CPL</h2>
<p class="keterangan">Kelengkapan bukti = berapa dari seluruh titik ukur (MK × CPMK pemikul) yang sudah menyetor nilai. Skor dari bukti yang belum lengkap harus dibaca hati-hati.</p>
<div class="gulir">
<table class="grid">
<thead>
<tr>
<th style="width:80px">CPL</th><th>Deskripsi</th>
<th class="tengah" style="width:80px">Skor</th>
<th class="tengah" style="width:130px">Status</th>
<th class="tengah" style="width:120px">Kelengkapan Bukti</th>
<th style="width:210px">Penyumbang Terlemah</th>
</tr>
</thead>
<tbody>
{% for c in cpl_urut %}
<tr>
<td class="tengah"><b class="kode-hover" title="{{ c.desk }}">{{ c.kode }}</b></td>
<td>{{ c.desk[:130] }}{% if c.desk|length > 130 %}…{% endif %}</td>
<td class="tengah">{% if c.skor is not none %}<b>{{ '%.2f'|format(c.skor) }}</b>{% else %}—{% endif %}</td>
<td class="tengah">
{% if c.skor is none %}<span class="stamp stamp-draft">BELUM TERUKUR</span>
{% elif c.tercapai %}<span class="stamp stamp-ok">TERCAPAI</span>
{% else %}<span class="stamp stamp-no">DI BAWAH AMBANG</span>{% endif %}
</td>
<td class="tengah">{{ c.n_mk_setor }}/{{ c.n_mk_pemikul }} titik ukur{% if c.ada_agregat %}<br><span style="color:var(--red);font-size:11px">ada bukti agregat</span>{% endif %}</td>
<td>
{% if c.mk_terlemah %}
{{ c.cpmk_terlemah }} — {{ nama_mk.get(c.mk_terlemah[0], c.mk_terlemah[0]) }}
({{ '%.1f'|format(c.mk_terlemah[1]) }})
{% else %}—{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<h2 class="bagian">KETERCAPAIAN CPMK (TINGKAT PRODI)</h2>
<div class="gulir">
<table class="grid">
<thead>
<tr>
<th style="width:110px">CPMK</th>
<th style="width:120px">CPL Didukung</th>
<th class="tengah" style="width:80px">Skor</th>
<th class="tengah" style="width:130px">MK Setor / Pemikul</th>
<th style="width:230px">MK Terlemah</th>
</tr>
</thead>
<tbody>
{% for c in cpmk_urut %}
<tr>
<td class="tengah"><span class="kode-hover" title="{{ desk_cpmk.get(c.kode, '') }}">{{ c.kode }}</span></td>
<td class="tengah">{% for cp in c.cpl %}<span class="kode-hover" title="{{ desk_cpl.get(cp, '') }}">{{ cp }}</span>{{ ', ' if not loop.last }}{% endfor %}</td>
<td class="tengah">{% if c.skor is not none %}<b>{{ '%.2f'|format(c.skor) }}</b>{% else %}—{% endif %}</td>
<td class="tengah">{{ c.n_setor }}/{{ c.n_pemikul }}</td>
<td>{% if c.mk_terlemah %}{{ nama_mk.get(c.mk_terlemah[0], c.mk_terlemah[0]) }} ({{ '%.1f'|format(c.mk_terlemah[1]) }}){% else %}—{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}