# -*- coding: utf-8 -*- """ Ekstrak SKS + semester per MK dari sheet '14. Susunan MK' spreadsheet kurikulum → seed/sks.json ({kode: {"sks": x, "semester": n}}). SKS dipakai untuk opsi roll-up tertimbang SKS; semester untuk prefill form RPS. Jalankan: python tools/extract_sks.py [path_xlsx] """ import json import pathlib import sys import openpyxl BASE = pathlib.Path(__file__).resolve().parent.parent DEFAULT_SRC = BASE.parent / "Draft Kurikulum Terbaru 2025.xlsx" OUT = BASE / "seed" / "sks.json" SHEET = "14. Susunan MK" def main() -> None: src = pathlib.Path(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT_SRC kur = json.loads((BASE / "seed" / "kurikulum.json").read_text(encoding="utf-8")) kode_valid = set(kur["mk"].keys()) wb = openpyxl.load_workbook(src, read_only=True, data_only=True) ws = wb[SHEET] rows = [list(r) for r in ws.iter_rows(values_only=True)] # baris header: memuat 'Kode MK' dan 'SKS' header_i = next(i for i, r in enumerate(rows) if any(str(v).strip() == "Kode MK" for v in r if v)) header = [str(v).strip() if v is not None else "" for v in rows[header_i]] i_kode = header.index("Kode MK") i_sks = header.index("SKS") kolom_smt = {ci: int(h) for ci, h in enumerate(header) if h.isdigit()} data = {} for r in rows[header_i + 1:]: if i_kode >= len(r) or not isinstance(r[i_kode], str): continue kode = r[i_kode].strip() if kode not in kode_valid: continue try: sks = float(r[i_sks]) except (TypeError, ValueError, IndexError): continue semester = next((smt for ci, smt in kolom_smt.items() if ci < len(r) and r[ci] not in (None, "")), None) data[kode] = {"sks": sks, "semester": semester} OUT.write_text(json.dumps(data, ensure_ascii=False, indent=1), encoding="utf-8") hilang = sorted(kode_valid - set(data)) print(f"[OK] {OUT.name}: SKS untuk {len(data)}/{len(kode_valid)} MK " f"(total SKS: {sum(v['sks'] for v in data.values()):g})") if hilang: print(" tanpa SKS:", ", ".join(hilang)) if __name__ == "__main__": main()