{% extends "base.html" %} {% block judul %}Nilai {{ peta.nama }} — Informatika UNTAN{% endblock %} {% block isi %}

Input Nilai — {{ peta.nama }} ({{ peta.kode }})

Skor per Sub-CPMK digulung ke CPMK lalu CPL (rincian di halaman Metodologi).

{% if kelas_dosen is not none %}
Anda hanya mengampu kelas {{ kelas_dosen|join(', ') }} pada MK ini — daftar & tombol di bawah cuma menampilkan mahasiswa kelas tersebut.
{% endif %} {% if pesan %}
{{ pesan }}
{% endif %} {% for w in peringatan %}
{{ w }}
{% endfor %} {% if komponen_daftar %}

ISI PER KOMPONEN

{% for k in komponen_daftar %} {% endfor %}
Komponen Sub-CPMK Bobot Status
{{ k.nama }}
{{ 'boleh diisi berkali-kali' if k.ulang else 'sekali-jalan' }}
{{ k.n_subs }} {% if k.bobot %}{{ k.bobot }}%{% else %}—{% endif %} {% if k.ulang %} {% if k.n_sesi %}{{ k.n_sesi }} SESI{% else %}BELUM ADA SESI{% endif %} {% else %} {% if k.n_sesi %}SUDAH DIISI{% else %}BELUM DIISI{% endif %} {% endif %} {{ 'Sesi Baru' if k.ulang else ('Edit' if k.n_sesi else 'Isi') }}
{% endif %} {% if tersimpan %}
Data tersimpan: mode {% if tersimpan.data.mode == 'per_mahasiswa' %}PER MAHASISWA ({{ tersimpan.data.mahasiswa|length }} mahasiswa){% else %}BUKTI AGREGAT (rata-rata kelas){% endif %} — terakhir disimpan {{ tersimpan.updated_at }}{% if tersimpan.updated_by %} oleh {{ tersimpan.updated_by }}{% endif %}. {% if riwayat_ringkas %}
Ringkasan pengisian — team teaching: {% for k in riwayat_ringkas %}{{ k.komponen }}: {% for d in k.per_dosen %}{{ d.n }}× {{ d.nama }}{{ ', ' if not loop.last }}{% endfor %}{{ ' · ' if not loop.last }}{% endfor %}.{% endif %}
{% endif %} {% if riwayat %}
Log Lengkap Pengisian Nilai ({{ riwayat|length }} entri)
{% for r in riwayat %} {% endfor %}
WaktuDosenAksiKomponen
{{ r.at or '—' }} {{ r.by or '—' }} {{ r.aksi }} {{ r.komponen or '—' }}
{% endif %} {% set ada_kelas = grid and grid|selectattr('kelas')|list|length > 0 %} {% if ada_kelas %} {% set semua_kelas = grid|map(attribute='kelas')|select|unique|sort|list %}
{% endif %} {% if grid and tabel_komponen and komponen_daftar %}

NILAI PER KOMPONEN — nilai mahasiswa berdasarkan komponen

Angka = rata-rata skor mentah tiap sesi/tugas komponen itu yang diikuti mahasiswa (bukan lewat Sub-CPMK). Ketik untuk menimpa — ditulis rata ke semua Sub-CPMK komponen itu; rincian per Sub-CPMK tetap presisi di grid bawah.

{% for k in komponen_daftar %}{% endfor %} {% for r in tabel_komponen %} {% set ri = loop.index0 %} {% for k in komponen_daftar %} {% endfor %} {% endfor %}
No. NIM Nama{{ k.nama }}Nilai Akhir
{{ loop.index }} {{ r.nim }} {{ r.nama }}{{ '%.1f'|format(akhir.get(r.nim)) if akhir.get(r.nim) is not none else '—' }}{% if r.nim in tidak_lengkap and akhir.get(r.nim) is not none %}*{% endif %}
{% if tidak_lengkap %}

* Sebagian Sub-CPMK mahasiswa ini belum ternilai — Nilai Akhir dihitung hanya dari yang sudah ternilai dan bisa berubah setelah sisanya diisi.

{% endif %}
Disimpan atas nama {{ user.nama }}
{% endif %} {% if grid %} {% set per_mhs = tersimpan and tersimpan.data.mode == 'per_mahasiswa' %}

NILAI PER MAHASISWA — nilai mahasiswa berdasarkan Sub-CPMK

{% set n_kiri = 4 if ada_kelas else 3 %} {% if ada_kelas %}{% endif %} {% for s in peta.subs %}{% endfor %} {% for m in grid %} {% set i = loop.index0 %} {% if ada_kelas %}{% endif %} {% for s in peta.subs %} {% endfor %} {% endfor %} {% if per_mhs and hasil %} {% for s in peta.subs %} {% set info = hasil.sub.get(s.kode) %} {% endfor %} {% for s in peta.subs %} {% set info = hasil.sub.get(s.kode) %} {% endfor %} {% endif %}
No. NIM NamaKelas{{ s.kode }}Nilai Akhir
{{ loop.index }} {{ m.nim }} {{ m.nama }}{{ m.kelas or '—' }}{% if (m.nim, s.kode) in dikatrol %}{% endif %}{{ '%.1f'|format(akhir.get(m.nim)) if akhir.get(m.nim) is not none else '—' }}{% if m.nim in tidak_lengkap and akhir.get(m.nim) is not none %}*{% endif %}
Rata-rata kelas (tersimpan){{ '%.1f'|format(info.rata) if info else '—' }}{{ '%.1f'|format(akhir.values()|sum / akhir|length) if akhir else '—' }}
% lulus (≥ {{ ambang|round(0)|int }}){{ '%.0f'|format(info.lulus_pct) ~ '%' if info and info.lulus_pct is not none else '—' }}
{% if tidak_lengkap %}

* Sebagian Sub-CPMK mahasiswa ini belum ternilai — Nilai Akhir dihitung hanya dari yang sudah ternilai dan bisa berubah setelah sisanya diisi.

{% endif %} {% if dikatrol %}

✎ = nilai sudah dikoreksi manual di sini (beda dari hasil hitung sesi/tugas komponennya) — hati-hati, koreksi ini akan tertimpa balik kalau sesi/komponen yang mengukur Sub-CPMK itu diisi/disimpan lagi.

{% endif %}
Disimpan atas nama {{ user.nama }}
{% endif %} {% if kelompok or tabel_poin or bobot_komponen or hasil %}
DETAIL TAMBAHAN — Kelompok Capaian, Skala Poin, Rincian Bobot & Hasil Ketercapaian {% if kelompok %}

KELOMPOK CAPAIAN — ATAS / TENGAH / BAWAH (acuan norma: mean ± SD kelas ini, bukan ambang kelulusan)

Batas: Atas > {{ '%.1f'|format(kelompok.batas_atas) }} · Bawah < {{ '%.1f'|format(kelompok.batas_bawah) }} — untuk melihat sebaran capaian relatif dalam kelas ini, pelengkap tabel Hasil Ketercapaian (acuan ambang tetap) di bawah.

{% set ns = namespace(no=0) %} {% for label, kelas, warna, daftar in [('Atas', 'kelompok-atas', '#205020', kelompok.atas), ('Tengah', 'kelompok-tengah', '#7a5c00', kelompok.tengah), ('Bawah', 'kelompok-bawah', 'var(--red)', kelompok.bawah)] %} {% for m in daftar %} {% set ns.no = ns.no + 1 %} {% endfor %} {% endfor %}
No.NIMNamaNilai AkhirKelompok
{{ ns.no }} {{ m.nim }} {{ m.nama }} {{ '%.1f'|format(m.akhir) }} {{ label }}
{% endif %} {% if tabel_poin %} {% set ada_kelas_p = tabel_poin|selectattr('kelas')|list|length > 0 %} {% set n_kiri_p = 4 if ada_kelas_p else 3 %}

NILAI PER MAHASISWA — SKALA POIN — nilai yang sama, ditampilkan sebagai poin yang didapat dari total 100 (lihat rincian bobot di bawah); hanya tampilan, bukan isian

{% if ada_kelas_p %}{% endif %} {% for s in peta.subs %}{% endfor %} {% for m in tabel_poin %} {% if ada_kelas_p %}{% endif %} {% for s in peta.subs %} {% set p = m.poin.get(s.kode) %} {% endfor %} {% endfor %}
No. NIM NamaKelas{{ s.kode }}Total
{{ loop.index }} {{ m.nim }} {{ m.nama }}{{ m.kelas or '—' }}{% if p %}{{ '%.2f'|format(p.dapat) }}/{{ '%.2f'|format(p.maks) }}{% else %}—{% endif %}{{ '%.2f'|format(m.total) }}
{% endif %} {% if bobot_komponen %}

RINCIAN BOBOT PENILAIAN — bobot komponen (RPS bagian G) dibagi rata ke Sub-CPMK-nya; murni dari RPS, tak bergantung nilai

{% for k in bobot_komponen %} {% endfor %}
KomponenBobotJumlah Sub-CPMKPoin per Sub-CPMKVerifikasi (Jumlah × Poin)
{{ k.nama }} {{ '%g'|format(k.bobot) }}% {{ k.n_subs }} {{ '%.2f'|format(k.poin) }}% {{ k.n_subs }} × {{ '%.2f'|format(k.poin) }}% = {{ '%.2f'|format(k.n_subs * k.poin) }}%
Total {{ '%.2f'|format(bobot_komponen|sum(attribute='bobot')) }}%

Dijumlah per Sub-CPMK (karena sebagian Sub-CPMK diukur lebih dari satu komponen):

{% for s in peta.subs %} {% set kontribusi = bobot_sub_rincian.get(s.kode) %} {% if kontribusi %} {% endif %} {% endfor %}
Sub-CPMKTotal PoinRincian
{{ s.kode }} {{ '%.2f'|format(kontribusi|sum(attribute='poin')) }} {% for c in kontribusi %}{{ c.nama }} {{ '%.2f'|format(c.poin) }}{{ ' + ' if not loop.last }}{% endfor %}
Total {{ '%.2f'|format(bobot_komponen|sum(attribute='bobot')) }}
{% endif %} {% if hasil %}

HASIL KETERCAPAIAN SUB-CPMK (ambang {{ ambang|round(0)|int }})

{% for s in peta.subs %} {% set info = hasil.sub.get(s.kode) %} {% endfor %}
Sub-CPMKSkorMaksStatus
{{ s.kode }} {% if info and info.rata is not none %}{{ '%.1f'|format(info.rata) }}{% else %}—{% endif %} 100 {% if not info or info.rata is none %}BELUM TERUKUR {% elif info.rata >= ambang %}TERCAPAI {% else %}DI BAWAH AMBANG{% endif %}

HASIL KETERCAPAIAN MK (ambang {{ ambang|round(0)|int }})

{% for kode_c, v in hasil.cpmk.items() %} {% set cm = peta.cpmks|selectattr('kode', 'equalto', kode_c)|first %} {% endfor %}
CPMKSkorSub Ternilai% TernilaiCPL Didukung
{{ kode_c }} {% if v.skor is not none %}{{ '%.2f'|format(v.skor) }}{% else %}—{% endif %} {{ v.n_ternilai }}/{{ v.n_sub }} {{ '%.0f'|format(100 * v.n_ternilai / v.n_sub) ~ '%' if v.n_sub else '—' }} {{ v.cpl|join(', ') }}
{% for kode_c, v in hasil.cpl.items() %} {% set cp = peta.cpls|selectattr('kode', 'equalto', kode_c)|first %} {% endfor %}
CPLSkor% CPMK TernilaiStatus
{{ kode_c }} {% if v.skor is not none %}{{ '%.2f'|format(v.skor) }}{% else %}—{% endif %} {{ '%.0f'|format(100 * v.n_cpmk_ternilai / v.n_cpmk) ~ '%' if v.n_cpmk else '—' }} {% if v.skor is none %}BELUM TERUKUR {% elif v.skor >= ambang %}TERCAPAI {% else %}DI BAWAH AMBANG{% endif %}
{% endif %}
{% endif %} {% if ada_kelas %} {% endif %} {% endblock %}