# Aplikasi Penyusunan RPS & Portofolio — Prodi Informatika UNTAN Web app untuk dosen menyusun **RPS (APTIKOM 2024)** dan **Portofolio MK** dengan keluaran .docx berformat identik template resmi, sekaligus mesin pengukuran ketercapaian CPL/CPMK (Kurikulum OBE). Rancangan lengkap: `RANCANGAN.md`. ## Menjalankan lokal ```bash pip install -r requirements.txt uvicorn app.main:app --reload # buka http://localhost:8000 ``` Database SQLite dibuat otomatis di `data/app.db` (atau path di env `DB_PATH`). Tahun ajaran aktif diatur lewat env `TAHUN_AJARAN` (default: "2026/2027 Ganjil"). ## Memperbarui data kurikulum Data CPL/CPMK/MK/Sub-CPMK di-seed dari dashboard pemetaan: ```bash python tools/extract_seed.py # baca ../dashboard-deploy/index.html python tools/extract_seed.py # atau sumber lain ``` Re-seed tidak menyentuh isian RPS dosen (tersimpan terpisah di SQLite). Dashboard Pemetaan CPMK (buatan user) ikut disajikan di rute **`/dashboard`** dari salinan `app/static/dashboard.html`. Bila dashboard sumber diperbarui, salin ulang dan re-seed sekaligus: ```bash cp ../dashboard-deploy/index.html app/static/dashboard.html python tools/extract_seed.py ``` ## Deploy via Coolify Prasyarat: kode berada di repositori Git yang bisa diakses Coolify (mis. GitHub private repo). `data/` di-gitignore — nilai mahasiswa tidak pernah ikut ke repositori. 1. Push repo ini ke GitHub (private), hubungkan ke Coolify: **New Resource → Application → Private Repository**, Build Pack: **Dockerfile**, Port **8000**. 2. Tambahkan **volume persisten** ke `/data` (wajib — tempat SQLite; tanpa ini data hilang tiap redeploy). 3. Env (opsional, ada default): `TAHUN_AJARAN` (mis. `2026/2027 Ganjil`; hanya fallback awal — tahun aktif selanjutnya diatur di `/metodologi`), `FAKULTAS`, `PRODI` (kop dokumen .docx). 4. Deploy, buka domainnya → kunjungan pertama membuka `/setup` untuk membuat akun kaprodi. 5. **Memindahkan data lokal ke server** (bila isian lokal mau dibawa): unduh `/cadangan.db` dari instalasi lokal, lalu salin ke volume server sebagai `/data/app.db` (`docker cp cadangan.db :/data/app.db` lalu restart), atau mulai bersih dari `/setup`. 6. Tombol PDF butuh LibreOffice — aktifkan baris `apt-get install libreoffice-writer` di Dockerfile bila diperlukan (image +±700 MB); tanpa itu pengguna diarahkan unduh .docx. Healthcheck sudah terpasang di Dockerfile (`/login`); uvicorn berjalan dengan `--proxy-headers` agar cocok di belakang proxy Coolify. ## Status fitur - [x] Tahap 1 — MVP RPS: beranda status 49 MK, form RPS (CPL/CPMK/Sub-CPMK otomatis dari pemetaan, validasi bobot 100 %, cek cakupan Sub-CPMK), unduh .docx **format resmi UNTAN** (template asli diisi langsung — logo, merge, dan tata letak terjaga; + lampiran kisi-kisi asesmen), arsip versi saat "selesai". Fakultas/prodi pada kop diatur env `FAKULTAS` / `PRODI`. - [x] Tahap 2 — Portofolio + Pengukuran: input nilai per MK di `/nilai/` (unggah Excel per mahasiswa dari template yang digenerate aplikasi, atau ketik rata-rata → ditandai "bukti agregat"); mesin roll-up bagi rata Sub-CPMK → CPMK → CPL (`app/hitung.py`); halaman `/rekap` (skor CPL/CPMK prodi, status vs ambang, kelengkapan bukti, penyumbang terlemah); `/metodologi` (dokumentasi rumus + pengaturan ambang/skala huruf, bisa dicetak); form portofolio `/portofolio/` + unduh .docx (Cover, Pengesahan, CPL, korelasi, rencana penilaian, matriks nilai mahasiswa, evaluasi ketercapaian, statistik & simpulan — struktur mengikuti `Contoh Portofolio MK 040126.xlsx`). - [x] Tahap 3 — Penyempurnaan: - **Tahun ajaran dinamis** — diatur di `/metodologi`; semua form & rekap mengikuti tahun aktif, data tahun lama tetap tersimpan. - **Duplikasi RPS antar tahun ajaran** — tombol "Salin dari " muncul di form RPS yang masih kosong; hasil salinan berstatus draft dan tidak pernah menimpa isian tahun aktif. - **Data SKS + semester per MK** (`seed/sks.json`, dari sheet `14. Susunan MK`; perbarui: `python tools/extract_sks.py`) — dipakai untuk prefill form RPS dan mengaktifkan **roll-up tertimbang SKS** (opsi di `/metodologi`). - **Riwayat lintas semester** (`/rekap/riwayat`) — matriks skor CPL × tahun ajaran + kelengkapan bukti, untuk melihat tren. - **Cadangan** — `/cadangan.json` (seluruh isian, termasuk arsip & pengaturan) dan `/cadangan.db` (file SQLite mentah). - **Ekspor PDF** — `/rps//unduh.pdf` & `/portofolio//unduh.pdf` via LibreOffice bila terpasang di server; bila tidak, pengguna diarahkan unduh .docx (lihat catatan Dockerfile). - [x] Tahap 4 — Akun & privasi nilai (14 Jul 2026): - **Login dengan NIP** (username = NIP, password awal = NIP; hash PBKDF2, cookie sesi HttpOnly). Kunjungan pertama saat belum ada akun membuka `/setup` untuk membuat akun kaprodi. "Reset password" di `/admin` mengembalikan password ke NIP. - **Dua peran** — *kaprodi*: kelola akun & reset password (`/admin`), penugasan MK per dosen, pengaturan prodi, cadangan; *dosen*: mengedit RPS/portofolio dan mengakses nilai hanya pada MK yang ditugaskan (RPS/porto MK lain tetap terbuka baca; unduhan portofolio yang memuat nilai mahasiswa ikut dibatasi). Nama penyimpan (`updated_by`) otomatis dari akun login. - **Impor daftar mahasiswa** — kaprodi mengunggah satu Excel kontrak semester (NPM, Nama, Kode MK, Kelas; template dari `/admin`); daftar ini mengisi otomatis template nilai tiap MK. - [x] Dasbor monitoring (`/pantau`, 18 Jul 2026): grafik ketercapaian CPL & CPMK semester berjalan vs ambang (SVG tanpa library, warna mengikuti status), kelengkapan proses dokumen RPS → Nilai → Portofolio, tren skor CPL lintas tahun ajaran (sparkline, tampil bila ≥ 2 tahun berdata), dan daftar "perlu perhatian": CPL di bawah ambang + penyumbang terlemahnya, serta MK yang belum setor nilai lengkap dengan pengampunya. - [x] Kerapian navigasi & team teaching (18 Jul 2026): - **Menu global** di semua halaman (base.html) menggantikan tautan ad-hoc per halaman; halaman aktif ditandai; Cadangan pindah ke `/admin`. - **Filter semester di beranda** (kolom Smt dari `seed/sks.json`) dengan KPI yang menghitung ulang sesuai filter + persentase berwarna (hijau ≥ 75 %, kuning 40–74 %, merah < 40 %). - **Semua tabel bisa diurut** klik header naik/turun (`static/tabel.js`; tabel di dalam form dilewati, baris total tetap di bawah). - **Team teaching nilai**: unggahan Excel **menggabung** per sel — tiap dosen mengunggah bagiannya (kolom Sub-CPMK sebelum/sesudah UTS atau baris mahasiswa kelasnya) tanpa menimpa dosen lain; riwayat unggahan tercatat per file+dosen; tombol "Mulai Ulang" menghapus total; mode rata-rata ditolak bila data per-mahasiswa sudah ada. Halaman nilai dirapikan: satu metodologi, cara agregat dilipat sebagai alternatif. - **Input nilai langsung di aplikasi** (cara utama): tabel mahasiswa × Sub-CPMK yang bisa diketik, terisi otomatis dari impor kaprodi + nilai tersimpan; menyimpan mengganti seluruh isi tabel dengan yang tampil. Unggah Excel tetap tersedia (dilipat) untuk nilai yang sudah direkap atau team teaching yang mengisi terpisah.