{% extends "base.html" %} {% block judul %}Dasbor Monitoring — Informatika UNTAN{% endblock %} {% block isi %}

Dasbor Monitoring Prodi — {{ hasil.tahun }}

{{ hasil.n_mk_setor }}/{{ n_mk }} MK setor nilai
{{ cpl_urut|selectattr('tercapai')|list|length }}/{{ cpl_urut|length }} CPL tercapai
{{ cpmk_urut|rejectattr('skor', 'none')|list|length }}/{{ cpmk_urut|length }} CPMK terukur
{% if rata_cpl is not none %}{{ '%.1f'|format(rata_cpl) }}{% else %}—{% endif %} rata-rata skor CPL
{{ hasil.ambang|round(0)|int }} ambang ketercapaian
{% if hasil.n_mk_setor == 0 %}
Belum ada MK yang menyetor nilai pada {{ hasil.tahun }} — grafik ketercapaian akan terisi begitu nilai pertama masuk. Pantau dulu kelengkapan proses dokumen dan daftar tindak lanjut di bawah.
{% endif %} {# ── A. Ketercapaian CPL (bar vertikal, 10 CPL) ─────────────────────── #}

KETERCAPAIAN CPL — SEMESTER BERJALAN

Skor gabungan tiap CPL vs ambang {{ hasil.ambang|round(0)|int }}. Arahkan kursor ke batang untuk rincian kelengkapan bukti & penyumbang terlemah. Tabel rinci: Rekap.

tercapai (≥ ambang) di bawah ambang belum terukur garis ambang
{% for g in [0, 25, 50, 75, 100] %} {{ g }} {% endfor %} {% set lebar_slot = 706 / cpl_urut|length %} {% for c in cpl_urut %} {% set x_slot = 46 + loop.index0 * lebar_slot %} {% set x_bar = x_slot + (lebar_slot - 30) / 2 %} {{ c.kode }} — {% if c.skor is not none %}skor {{ '%.2f'|format(c.skor) }} ({{ 'tercapai' if c.tercapai else 'di bawah ambang' }}) bukti: {{ c.n_mk_setor }}/{{ c.n_mk_pemikul }} titik ukur{% if c.ada_agregat %} (ada bukti agregat){% endif %} {% if c.mk_terlemah %}terlemah: {{ c.cpmk_terlemah }} — {{ nama_mk.get(c.mk_terlemah[0], c.mk_terlemah[0]) }} ({{ '%.1f'|format(c.mk_terlemah[1]) }}){% endif %}{% else %}belum terukur — belum ada MK pemikulnya yang setor nilai{% endif %} {% if c.skor is not none %} {{ '%.1f'|format(c.skor) }} {% else %} {% endif %} {{ c.kode }} {{ c.n_mk_setor }}/{{ c.n_mk_pemikul }} bukti {% endfor %}
{# ── B. Kelengkapan proses dokumen (stacked bar per tahap) ──────────── #}

KELENGKAPAN PROSES DOKUMEN ({{ n_mk }} MK)

Alur per MK: RPS → Nilai → Portofolio. Batang menunjukkan berapa MK yang sudah menuntaskan tiap tahap.

selesai draft belum
{% for p in proses %}
{{ p.label }} {% if p.selesai %}{{ p.selesai }}{% endif %} {% if p.draft %}{{ p.draft }}{% endif %} {% if p.belum %}{{ p.belum }}{% endif %}
{% endfor %} {# ── C. Ketercapaian CPMK (bar horizontal, tampil bila ada data) ────── #} {% set cpmk_ternilai = cpmk_urut|rejectattr('skor', 'none')|list %} {% if cpmk_ternilai %}

KETERCAPAIAN CPMK — SEMESTER BERJALAN

Hanya CPMK yang sudah terukur ({{ cpmk_ternilai|length }} dari {{ cpmk_urut|length }}). Garis putus-putus = ambang. Arahkan kursor untuk melihat MK pengukur terlemah.

{% set tinggi = cpmk_ternilai|length * 22 + 34 %}
{% for g in [0, 25, 50, 75, 100] %} {{ g }} {% endfor %} {% for c in cpmk_ternilai %} {% set y = loop.index0 * 22 %} {{ c.kode }} (mendukung {{ c.cpl|join(', ') }}) — skor {{ '%.2f'|format(c.skor) }} setor: {{ c.n_setor }}/{{ c.n_pemikul }} MK pemikul{% if c.ada_agregat %} (ada bukti agregat){% endif %} {% if c.mk_terlemah %}terlemah: {{ nama_mk.get(c.mk_terlemah[0], c.mk_terlemah[0]) }} ({{ '%.1f'|format(c.mk_terlemah[1]) }}){% endif %} {{ c.kode }} {{ '%.1f'|format(c.skor) }} {% endfor %}
{% endif %} {# ── D. Tren lintas semester (sparkline per CPL, bila >1 tahun) ─────── #} {% if tren %}

TREN SKOR CPL LINTAS TAHUN AJARAN

Garis kecil per CPL; titik terakhir = {{ hasil.tahun }}. Rincian angka: Riwayat Lintas Semester.

{% for kode, titik in tren.items() %} {% set ada = titik|selectattr(1, 'ne', none)|list %}
{{ kode }} {% set lebar_x = 130 / (titik|length - 1) if titik|length > 1 else 0 %} {# skala vertikal mengikuti rentang data (± 2 poin) agar tren terlihat #} {% set nilai2 = ada|map(attribute=1)|list %} {% set lo = [nilai2|min - 2, 0]|max %} {% set span = [nilai2|max + 2 - lo, 4]|max %} {% if lo <= hasil.ambang <= lo + span %} {% endif %} {% for t, s in titik %}{% if s is not none %} {% endif %}{% endfor %} {% if ada %}{{ '%.1f'|format(ada[-1][1]) }}{% else %}—{% endif %}
{% endfor %}
{% endif %} {# ── E. Perlu perhatian ─────────────────────────────────────────────── #}

PERLU PERHATIAN

CPL di bawah ambang & penyumbang terlemahnya — mulai perbaikan dari sini.

{% set cpl_rendah = cpl_urut|rejectattr('skor', 'none')|rejectattr('tercapai')|list %} {% if cpl_rendah %} {% for c in cpl_rendah %} {% endfor %}
CPLSkorCPMK & MK Terlemah
{{ c.kode }} {{ '%.2f'|format(c.skor) }} {% 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 %}
{% else %}
Tidak ada CPL terukur yang berada di bawah ambang. ✓
{% endif %}

MK belum setor nilai ({{ belum_nilai|length }}) — hubungi pengampunya.

{% if belum_nilai %}
{% for m in belum_nilai %} {% endfor %}
KodeMata KuliahPengampu
{{ m.kode }} {{ m.nama }} {{ m.pengampu|join(', ') or '— belum ditugaskan' }}
{% else %}
Semua MK sudah menyetor nilai. ✓
{% endif %}
{% endblock %}