{% 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
| Komponen |
Sub-CPMK |
Bobot |
Status |
|
{% for k in komponen_daftar %}
{{ 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') }}
|
{% endfor %}
{% 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)
| Waktu | Dosen | Aksi | Komponen |
{% for r in riwayat %}
| {{ r.at or '—' }} |
{{ r.by or '—' }} |
{{ r.aksi }} |
{{ r.komponen or '—' }} |
{% endfor %}
{% 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.
{% endif %}
{% if grid %}
{% set per_mhs = tersimpan and tersimpan.data.mode == 'per_mahasiswa' %}
NILAI PER MAHASISWA — nilai mahasiswa berdasarkan Sub-CPMK
{% 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.
| No. | NIM | Nama | Nilai Akhir | Kelompok |
{% 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 %}
| {{ ns.no }} |
{{ m.nim }} |
{{ m.nama }} |
{{ '%.1f'|format(m.akhir) }} |
{{ label }} |
{% endfor %}
{% endfor %}
{% 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
| No. |
NIM |
Nama |
{% if ada_kelas_p %}Kelas | {% endif %}
{% for s in peta.subs %}{{ s.kode }} | {% endfor %}
Total |
{% for m in tabel_poin %}
| {{ loop.index }} |
{{ m.nim }} |
{{ m.nama }} |
{% if ada_kelas_p %}{{ m.kelas or '—' }} | {% endif %}
{% for s in peta.subs %}
{% set p = m.poin.get(s.kode) %}
{% if p %}{{ '%.2f'|format(p.dapat) }}/{{ '%.2f'|format(p.maks) }}{% else %}—{% endif %} |
{% endfor %}
{{ '%.2f'|format(m.total) }} |
{% endfor %}
{% endif %}
{% if bobot_komponen %}
RINCIAN BOBOT PENILAIAN — bobot komponen (RPS bagian G) dibagi rata ke Sub-CPMK-nya; murni dari RPS, tak bergantung nilai
| Komponen | Bobot | Jumlah Sub-CPMK | Poin per Sub-CPMK | Verifikasi (Jumlah × Poin) |
{% for k in bobot_komponen %}
| {{ 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) }}% |
{% endfor %}
| Total |
{{ '%.2f'|format(bobot_komponen|sum(attribute='bobot')) }}% |
Dijumlah per Sub-CPMK (karena sebagian Sub-CPMK diukur lebih dari satu komponen):
| Sub-CPMK | Total Poin | Rincian |
{% for s in peta.subs %}
{% set kontribusi = bobot_sub_rincian.get(s.kode) %}
{% if kontribusi %}
| {{ s.kode }} |
{{ '%.2f'|format(kontribusi|sum(attribute='poin')) }} |
{% for c in kontribusi %}{{ c.nama }} {{ '%.2f'|format(c.poin) }}{{ ' + ' if not loop.last }}{% endfor %} |
{% endif %}
{% endfor %}
| Total |
{{ '%.2f'|format(bobot_komponen|sum(attribute='bobot')) }} |
|
{% endif %}
{% if hasil %}
HASIL KETERCAPAIAN SUB-CPMK (ambang {{ ambang|round(0)|int }})
| Sub-CPMK | Skor | Maks | Status |
{% for s in peta.subs %}
{% set info = hasil.sub.get(s.kode) %}
| {{ 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 %}
|
{% endfor %}
HASIL KETERCAPAIAN MK (ambang {{ ambang|round(0)|int }})
| CPMK | Skor | Sub Ternilai | % Ternilai | CPL Didukung |
{% for kode_c, v in hasil.cpmk.items() %}
{% set cm = peta.cpmks|selectattr('kode', 'equalto', kode_c)|first %}
| {{ 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(', ') }} |
{% endfor %}
| CPL | Skor | % CPMK Ternilai | Status |
{% for kode_c, v in hasil.cpl.items() %}
{% set cp = peta.cpls|selectattr('kode', 'equalto', kode_c)|first %}
| {{ 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 %}
|
{% endfor %}
{% endif %}
{% endif %}
{% endblock %}