Perubahan Yayasan + Perkumpulan — rencana implementasi (component-first)
Status: DRAFT untuk review Efran. Tanggal 2026-08-13.
Increment pertama dari ekspansi transaksi nirlaba (di luar Pendirian yang sudah ada).
Keputusan yang sudah disepakati (Q&A 2026-08-13):
- Urutan: per-transaksi lintas entitas — kerjakan Perubahan untuk yayasan DAN perkumpulan dulu, baru lanjut Pembubaran, Perbaikan, Penggabungan.
- Entitas: dua-duanya paralel lewat lapisan komponen bersama.
- Status akhir: ikut SABH — jalur Persetujuan Menteri (PAD) berujung verifikator; jalur Pemberitahuan (PPAD/PPD) terminal.
- Blocker S5: bangun scaffolding sekarang, akurasi ekstraksi nyusul sampel akta asli.
Catatan ownership: di catatan kerja, yayasan domain dev5 dan perkumpulan domain dev_4. Increment ini menyentuh dua-duanya atas arahan langsung — perlu koordinasi supaya tidak tabrakan.
1. Apa yang sudah ada dan dipakai ulang
| Kebutuhan Perubahan | Sudah ada di | Rencana pakai |
|---|---|---|
| Pola tambah flow (registry, defineFlow) | flow-engine | ikuti apa adanya |
| Rules bersama nirlaba (AKTA_PRESENT, ORGAN, NAMA) | rules/nirlaba-shared |
pakai ulang |
| Cek ketersediaan nama (SABH) | services/nirlaba-nama-availability.ts |
pakai ulang |
| Ekstraktor akta nirlaba (variant yayasan/perkumpulan) | services/nirlaba-akta-extract.ts |
tambah variant perubahan |
| Review diff sebelum-vs-sesudah | review/projectors/pt-perubahan-review.ts (makePtDeltaReviewProjection) |
jadikan factory nirlaba |
| Pilih jenis perubahan (multi-select + kontradiksi) | PP: services/pp-jenis.ts + PpPerubahanFormPage |
mirror untuk nirlaba |
| Old-data (keadaan sebelum) | PP: resolveLatestPpTransaction; PT: loadOldData (SABH) |
GAP — bangun baru |
| Routing terminal vs verifikator | routes/* (inline per rute) |
mirror, cabang PAD vs Pemberitahuan |
2. Gap utama: sumber "old data" nirlaba
Perubahan itu diff sebelum-vs-sesudah, jadi butuh keadaan lama badan hukum. Untuk nirlaba
belum ada sama sekali (Pendirian companyLookup: false, hanya cek nama).
Rencana: layanan baru services/nirlaba-badan-hukum-lookup.ts, meniru pola null-safe
nirlaba-nama-availability.ts:
- Query SABH read-only (
tbl_badan_hukum+ tabel transaksi yayasan/perkumpulan), discan by base ("yayasan"/"perkumpulan") + nama/nomor SK. - Kembalikan
nullkalau SABH belum dikonfigurasi atau query gagal (bukan "kosong = tidak ada perubahan"). Rule memetakannullke SKIPPED, sama seperti cek nama. - Kolom DDL diverifikasi ke source SABH (
TransaksiYayasan.php,TransaksiPerkumpulan.php,BadanHukum.php) sebelum dipakai; disentralkan di satu konstantaSOURCESsepertiNAMA_SOURCES.
Karena scaffolding-now: skeleton dulu (null-safe), kolom-kolom final menyusul verifikasi DDL.
3. Jenis perubahan dan routing status
Dari form SABH, Perubahan nirlaba terbagi tiga jalur. Catalogue SSOT baru:
services/nirlaba-jenis-perubahan.ts (mirror pp-jenis.ts).
Yayasan:
- PAD (Persetujuan Menteri):
nama,kegiatan - PPAD (Pemberitahuan AD):
kedudukan,pasal_lain - PPD (Pemberitahuan Data):
organ,pengangkatan_kembali,alamat
Perkumpulan:
- PAD (Persetujuan Menteri):
nama,keseluruhan_ad,organ_kepengurusan,kedudukan,data_lain - PPD (Pemberitahuan Data):
nama_pengurus_pengawas,pengangkatan_kembali,alamat
Routing status = fungsi dari jenis terpilih:
Aturannya: kalau ada satu saja item jalur PAD, seluruh permohonan masuk antrean verifikator.
Kalau semua item cuma Pemberitahuan (PPAD/PPD), terminal. Helper requiresVerifikator(jenis)
di catalogue jadi satu-satunya tempat keputusan ini.
4. Alur end-to-end (target)
5. Lapisan komponen bersama (yang dibangun)
Supaya yayasan dan perkumpulan tidak copy-paste:
services/nirlaba-badan-hukum-lookup.ts— old data, base-parameterized (baru).services/nirlaba-jenis-perubahan.ts— catalogue PAD/PPAD/PPD +requiresVerifikator(baru).flow-engine/context/nirlaba-perubahan-context.ts— builder ctx variant-parameterized (baru).flow-engine/rules/nirlaba-perubahan/index.ts— rule set bersama, di-config per base (baru).review/projectors/make-nirlaba-delta-review.ts— factory delta review organ-aware (baru, adaptasi darimakePtDeltaReviewProjection).- Halaman frontend generik nirlaba-perubahan (select, extraction, review, status) yang di-parameter
base.
Tiap flow (yayasan/perkumpulan) lalu cuma deklarasi tipis di atas lapisan ini.
6. Urutan build (Perubahan)
Fase A — fondasi bersama (tanpa sentuh enum, aman, bisa typecheck sendiri):
nirlaba-jenis-perubahan.ts(catalogue + routing helper) + unit test.nirlaba-badan-hukum-lookup.ts(skeleton null-safe) + unit test.
Fase B — enum + skema (memaksa registry lewat compile error, jadi dibundel dengan flow def):
- Prisma:
DocumentType+=AKTA_PERUBAHAN_YAYASAN,AKTA_PERUBAHAN_PERKUMPULAN;
SubmissionType+=PERUBAHAN_YAYASAN,PERUBAHAN_PERKUMPULAN. Bikin file migrasi
(bukan cuma db push — staging pakai migrate deploy). bun run db:gen-enums.
Fase C — mesin per-flow:
- Skema ekstraksi perubahan (best-effort, S5) + wiring variant di
document-processor.ts+nirlaba-akta-extract.ts. nirlaba-perubahan-context.ts(extract blob + old data + jenis).rules/nirlaba-perubahan/index.ts(shared nirlaba + JENIS_PRESENT, DATA_ACTUALLY_CHANGED, organ PAD checks, gated by jenis).review/projectors/make-nirlaba-delta-review.ts+ dua projector tipis (yayasan, perkumpulan).- Flow def
yayasan-perubahan.ts,perkumpulan-perubahan.ts+ daftar diregistry.ts+submission-type-inference.ts.
Fase D — rute + UI:
- Route family
nirlaba-perubahan(start dengan jenis, submit dengan cabang PAD/pemberitahuan). - Halaman frontend generik + routes.tsx.
Fase E — verifikasi:
bunx tsc --noEmitbackend + frontend; jalankan suite backend+frontend; migration ke test DB.
7. Yang S5-blocked (jujur di depan)
- Akurasi prompt ekstraksi akta perubahan (skema struktur boleh jalan, angka akurasi nunggu sampel).
- Verifikasi DDL kolom SABH untuk old-data (skeleton null-safe dulu).
Struktur, rules, review, routing, UI semua bisa selesai dan diuji tanpa sampel; hanya ketepatan
ekstraksi dan query old-data nyata yang menunggu.