# Blueprint Database Umum dan Urutan MVP

**Status:** rancangan konseptual untuk SIAKAD satu kampus per instalasi. Ditujukan agar dapat dikonfigurasi dan dipakai kampus berbeda. Ini belum migration SQL final; aturan yang berbeda antarkampus menjadi konfigurasi/data, bukan hardcode.

## Prinsip pemodelan
- Simpan satu institusi per instalasi; profil institusi tunggal, tanpa tenant_id lintas kampus.
- Primary key internal stabil dan relasi foreign key; kode Feeder disimpan sebagai external mapping.
- Pisahkan orang/akun dari peran akademik. Seorang orang dapat memiliki relasi mahasiswa dan/atau dosen jika kebijakan kampus mengizinkan.
- Pisahkan definisi master dari transaksi per periode dan dari hasil/snapshot.
- Historikan perubahan penting; gunakan status dan transisi, bukan penghapusan fisik untuk rekam akademik/keuangan yang sudah disahkan.
- Gunakan periode akademik sebagai data konfigurasi dengan kode eksternal opsional. Jangan mengasumsikan satu pola kode/semester universal.
- PII, dokumen, nilai, dan keuangan memiliki akses/retensi terpisah.

## Kelompok tabel konseptual

### Institusi dan konfigurasi
`institution_profile`, `organizational_units`, `faculties`, `study_programs`, `academic_periods`, `academic_calendar_events`, `system_settings`, `academic_policy_versions`.

Profil, unit, zona waktu, locale, mata uang, label akademik, aturan SKS, kalender, skala nilai, dan alur persetujuan dikonfigurasi. Kebijakan diberi masa berlaku agar riwayat tidak berubah ketika aturan baru diterapkan.

### Identitas dan akses
`users`, `person_profiles`, `student_profiles`, `lecturer_profiles`, `roles`, `permissions`, pivot cakupan akses, `audit_events`.

Autentikasi tidak disamakan dengan entitas mahasiswa/dosen; identitas dapat dipautkan melalui relasi opsional. Batas akses prodi/unit/periode diterapkan melalui policy.

### PMB dan penerimaan
`admission_periods`, `admission_paths`, `applicants`, `applications`, `application_documents`, `selection_steps`, `admission_decisions`, `enrollment_confirmations`.

Konversi pendaftar menjadi mahasiswa harus idempotent dan menyimpan jejak asal aplikasi. Syarat, biaya, tahap seleksi, dan jadwal bersifat konfigurasi.

### Akademik inti
`curricula`, `courses`, `curriculum_courses`, `course_prerequisites`, `course_offerings`, `class_meetings`, `room_assignments`, `lecturer_assignments`, `student_academic_records`, `course_registrations`, `attendance_records`, `assessment_components`, `grades`, `semester_academic_records`.

Makna inti: mata kuliah adalah katalog; kurikulum adalah versi program studi; anggota kurikulum menyatakan semester rekomendasi/bobot; penawaran kelas adalah kelas pada periode; registrasi menghubungkan riwayat mahasiswa dan penawaran. Nilai per kelas berbeda dari rekap aktivitas/status mahasiswa per semester (AKM).

### Keuangan, layanan, dan kelulusan
`fee_definitions`, `student_charges`, `payment_transactions`, `financial_adjustments`, `student_services`, `student_activities`, `thesis_records`, `thesis_supervisors`, `thesis_reviews`, `graduation_reviews`, `graduation_events`, `graduation_records`.

Rincian dapat dikembangkan setelah prioritas MVP disetujui. Pembayaran perlu audit dan rekonsiliasi; jangan menyimpan data kartu atau rahasia gateway.

### Integrasi Feeder
`external_systems`, `external_entity_mappings`, `integration_contract_versions`, `sync_batches`, `sync_items`, `sync_staging_records`, `sync_field_ownership`, `sync_conflicts`, `sync_audit_events`.

Mapping minimal mencakup jenis entitas, ID lokal, sistem, ID eksternal, versi mapping, validasi, dan timestamps. Batch/item menyimpan arah, method, periode, status, percobaan, correlation ID, error yang sudah disanitasi, serta hasil rekonsiliasi. Token disimpan sementara secara aman, tidak di database log.

## Constraints dan indeks konseptual
- Unique constraint kode lokal dalam lingkup yang tepat (mis. NIM per instalasi atau aturan kampus); konfirmasi sebelum dipilih.
- Unik untuk relasi mahasiswa-kelas dan dosen-kelas sesuai peran, periode, dan kebijakan.
- Indeks foreign key dan filter umum: prodi, periode, status, kode mahasiswa, kelas; validasi dengan query nyata.
- Nilai numerik mengikuti skala yang dikonfigurasi; uang memakai integer satuan rupiah atau decimal yang disepakati, tidak floating point.
- Soft delete hanya untuk entitas yang kebijakan izinkan; jangan jadikan soft delete pengganti audit/historisasi.

## Urutan MVP yang disarankan

### MVP 0 — Fondasi
Konfigurasi institusi, identitas, RBAC, audit, design system terang global, layout/sidebar, pagination, seed data sintetis, migrasi dan backup lokal.

**Selesai bila:** satu admin dapat masuk; profil kampus/periode dasar dapat diatur; route/resource dibatasi per role; audit mencatat perubahan sensitif; UI memakai komponen global.

**Status implementasi:** profil institusi, periode akademik, login, pengelolaan akun staf, peran dan editor permission, pembatasan route, audit log, penggantian/pemulihan kata sandi, dan design system/layout global sudah tersedia. MFA belum tersedia. Keberadaan fondasi ini belum menjadi bukti kesiapan produksi: konfigurasi email, UAT, backup/restore, hardening deployment dan kebijakan akses/retensi masih menjadi gerbang. Lihat [keamanan dan privasi](10-keamanan-privasi.md), [deployment](04-deployment.md), dan [operasi/backup](14-operasi-backup.md).

### MVP 1 — Master akademik
Unit/prodi, periode dan kalender, katalog mata kuliah, kurikulum versi, ruang, dosen dan penugasan.

**Selesai bila:** data master dapat dibuat/diubah dengan validasi; kurikulum historis tetap terbaca; periode dapat dibuka/ditutup tanpa perubahan kode.

**Status implementasi master:** unit akademik, program studi, katalog mata kuliah, kalender akademik, versi kurikulum, ruang, dosen, penawaran kelas, pertemuan kelas, dan penugasan dosen telah memiliki layar/rute terkelola serta permission terkait. Kurikulum memakai alur draf → terbit → arsip; katalog tidak mengubah snapshot mata kuliah pada kurikulum terbit. Periode, kode, dan label tetap data konfigurasi; entitas Feeder tidak dicampur ke tabel domain. Perluasan prasyarat, bentrok/perencanaan jadwal tingkat lanjut, dan pembatasan akses per prodi masih mengikuti aturan kampus dan belum menjadi cakupan lengkap.

### MVP 2 — Mahasiswa dan PMB
Pendaftar, dokumen privat, tahap seleksi, keputusan, daftar ulang, pembuatan profil mahasiswa dan riwayat pendidikan.

**Selesai bila:** aplikasi calon yang diterima dikonversi tepat satu kali; status dan dokumen hanya terlihat oleh role berwenang.

### MVP 3 — Kelas dan KRS
Penawaran kelas, jadwal, kapasitas, prasyarat, bentrok, pengajuan/persetujuan KRS, perubahan dan pembekuan periode.

**Selesai bila:** aturan berasal dari konfigurasi; pendaftaran ganda/bentrok/kuota berlebih ditolak server-side; audit persetujuan tersedia.

### MVP 4 — Presensi, nilai, KHS
Presensi, komponen evaluasi, finalisasi nilai, rekap semester, transkrip awal dan koreksi terkendali.

**Selesai bila:** perhitungan menggunakan kebijakan versi yang berlaku; publikasi/koreksi berizin dan teraudit.

### MVP 5 — Feeder read-only lalu ekspor terkontrol
Pertama mapping referensi dan preview impor; kemudian ekspor satu entitas nonkritis per batch setelah kontrak dan urutan dependensi tervalidasi. Tambahkan rekonsiliasi dan retry aman sebelum cakupan luas.

**Selesai bila:** bisa membandingkan lokal-eksternal, menjelaskan mismatch, mencegah duplikasi, mencatat actor/status, dan meninjau batch tanpa secret/PII di log.

### MVP 6 — Layanan lanjutan
**Status implementasi:** tersedia register tugas akhir, catatan bimbingan, pencatatan ujian, kasus dan keputusan yudisium awal, acara/pendaftaran wisuda, tagihan/pembayaran manual dengan pembatalan beralasan, aktivitas/prestasi mahasiswa, serta laporan agregat. Ini belum mencakup alur persetujuan topik/pembimbing yang disahkan kampus, aturan kelayakan yudisium otomatis, koreksi keputusan, rekonsiliasi/pengembalian dana, dan seluruh prosedur wisuda. Konseling/aduan menunggu kebijakan akses dan retensi. Integrasi Feeder nyata menunggu kontrak versi kampus yang tervalidasi.

## Urutan dependensi untuk Feeder
Referensi institusi/prodi/periode → dosen/mahasiswa dan riwayat pendidikan → katalog mata kuliah/kurikulum → kelas dan pengajar → KRS/peserta → nilai → aktivitas/status semester → kelulusan. Urutan final dikonfirmasi terhadap dictionary, validasi, dan kontrak versi Feeder sasaran.

## Hal yang sengaja configurable
Struktur fakultas/unit; jenis jenjang/prodi; kode periode dan semester antara; batas SKS; prasyarat; skala dan bobot nilai; rumus IPS/IPK; status cuti/aktif; syarat PMB; persetujuan; biaya; bahasa/branding; zona waktu; retensi; serta field mapping Feeder.

## Referensi silang
- [Model data](05-model-data.md)
- [Mapping Feeder awal](17-mapping-feeder-awal.md)
- [Roadmap](12-roadmap.md)
- [Kebutuhan](02-kebutuhan.md)
- [RBAC](08-rbac.md)
- [QA](11-pengujian-qa.md)
