Flow Design — Pendirian Perkumpulan (PENDIRIAN_PERKUMPULAN)
Status: design, siap-eksekusi. Padanan: flow-pendirian-yayasan.md.
Scope: OCR + LLM ekstraksi & validasi lokal (read-only) untuk pendirian Perkumpulan di SABH.
Dokumen ini sengaja berbeda dari Yayasan pada titik-titik riil: organ (Rapat Anggota, bukan Pembina), kekayaan awal (tidak wajib), field AD/ART wajib, verifikator SABH (ada, tapi di hilir), dan varian asing (hanya identitas).
1. Ringkasan scope & keputusan pengikat
Sama seperti Yayasan: menggantikan pengisian form manual dengan upload-and-process akta, read-only (tak menulis balik ke SABH). Register terkunci yang mengikat (ringkas — detail identik di flow-pendirian-yayasan.md §1):
| ID | Efek khusus Perkumpulan |
|---|---|
| D4b | Terminal, tanpa verifikator PoC — meski SABH punya kasie-verifikator untuk pendirian perkumpulan (VerifikatorAktifPerkumpulanController.php:15; tanggal SK dari kasie PerkumpulanController.php:775), kasie ada di hilir SABH, di luar scope PoC read-only (D1/D12). |
| D7 | SubmissionType PENDIRIAN_PERKUMPULAN (terpisah dari Yayasan) |
| D8′ | v2-generic tenant (fork pensiun) |
| D10 | Extractor & context organ-aware bersama Yayasan, diskriminator variant: "perkumpulan" |
| D11 | Rule set disesuaikan — tanpa rule kekayaan (tidak wajib untuk Perkumpulan) — lihat §7 |
2. Dokumen & varian (dari kode SABH)
KOREKSI (verifikasi kode): seperti Yayasan, pendirian Perkumpulan adalah flow satu dokumen. Surat pernyataan kepengurusan/penunjukan BO yang sempat tercatat sebagai syarat pendirian sebenarnya milik PERUBAHAN (UploadAktaController.php:249, guard isPerkumpulanPerubahanTransaksi, id_aksi 15). Tidak ada file_ktp/file_npwp.
| Dokumen | Wajib? | Sumber kode | Peran OCR |
|---|---|---|---|
Akta Pendirian Perkumpulan (file_akta) |
Wajib | BadanHukumAkta.php:26,275,286; UploadAktaController.php:59 (actionPerkumpulan, id_aksi 14) |
Dokumen otoritatif |
| Kuesioner BO ("03") | Wajib (gate) | UploadAktaController.php:68-69 (checkStatusQuestionnaire("03")) |
Bukan OCR — form terstruktur |
Varian asing (jenis_transaksi == 'asing'): hanya identitas berubah ke paspor/KITAS (FormDataPerkumpulan.php:69,71). Tidak ada dokumen Kemenlu tambahan (kontras Yayasan). Aturan kekayaan asing Rp100jt ADA di kode tapi NONAKTIF untuk pendirian (FormDataPerkumpulan.php:130-131,243-247, checkKekayaan di-comment) → tidak dijadikan rule.
3. UI flow (4 step — akta-first, terminal)
Identik bentuknya dengan Yayasan (akta otoritatif, terminal). Stepper Unggah → Klasifikasi → Proses & Periksa → Selesai.
3a. Mermaid — UI flow / step
akta + varian lokal/asing] --> B[2. Klasifikasi
AI + board override] B --> C[3. Proses & Periksa
ekstraksi akta + validasi] C --> D[4. Review & Submit
Smart Review: organ + AD/ART] D --> E((Selesai
terminal, read-only)) A -. akta belum ada .-> W[/Warning: akta wajib/] W -. blokir lanjut .-> A
3b. Mermaid — arsitektur & data flow backend
submission-dispatch.ts"] DISP -->|"engine === v2-generic"| RF["runFlow(id, perkumpulanPendirianFlow)"] RF --> EX["Ekstraksi akta
schema akta organ-aware (variant=perkumpulan)"] EX --> DERIVE["hooks.beforeValidation
derive organ (Rapat Anggota/Pengurus/Pengawas) + AD/ART"] DERIVE --> VAL["Cross-validation
PERKUMPULAN_PENDIRIAN_RULE_SET (D11)"] VAL -. NAMA_AVAILABILITY .-> SABH[("SABH MySQL readonly
tbl_order_name + tbl_badan_hukum
base='perkumpulan'")] VAL --> READY[status READY → Smart Review] READY --> SUBMIT[Submit → COMPLETED terminal] Note1["Kasie SABH = di HILIR, di luar PoC (D4b)"] -.-> SUBMIT
3c. Mermaid — sequence ekstraksi
4. Extraction schema akta (organ-aware, variant=perkumpulan)
Berbagi tipe & extractor dengan Yayasan (D10), dibedakan variant. Perbedaan riil vs Yayasan:
| Field ekstraksi | Mapping SABH (FormDataPerkumpulan) |
Beda dari Yayasan |
|---|---|---|
nama_perkumpulan, nama_singkat, nama_asing |
nama_perkumpulan, nama_singkat |
— |
kedudukan {provinsi, kabupaten} |
provinsi_nama_perkumpulan, kabupaten_nama_perkumpulan |
— |
organ (Rapat Anggota/Pengurus/Pengawas) |
Rapat Anggota → kolom pembina; pengurus; pengawas (_formPengurusPerkumpulan.php:99-110) |
Rapat Anggota, bukan Pembina |
adart { asas_tujuan, hak_kewajiban, pengelola, mekanisme, pembubaran } |
asas_tujuan, hak_kewajiban, pengelola, mekanisme, pembubaran (wajib, FormDataPerkumpulan.php:126-128) |
Field AD/ART wajib — tidak ada di Yayasan |
kekayaan_awal |
kekayaan_awal (TIDAK wajib, :130-131 commented) |
opsional; tanpa rule |
akta {nomor, tanggal, notaris} |
nomor_akta, tgl_akta, notaris_akta |
— |
Catatan
nama_lambang(koreksi verifikasi):nama_lambangBUKAN field wajib (ada di rule'safe'FormDataPerkumpulan.php:116, tidak di required:126-128). Jangan masukkan sebagai AD/ART wajib. Field AD/ART wajib =asas_tujuan, hak_kewajiban, pengelola, mekanisme, pembubaran.
Organ Perkumpulan: rapat_anggota[], pengurus[], pengawas[] — struktur OrganMember sama seperti Yayasan; extractor memetakan Rapat Anggota ke slot pembina (paritas kolom DB SABH). Asing → paspor+negara+KITAS.
5. Field yang di-extract vs manual/form
- Diekstrak dari akta: nama, kedudukan, organ (Rapat Anggota/Pengurus/Pengawas) + identitas, AD/ART (asas_tujuan, hak_kewajiban, pengelola, mekanisme, pembubaran), kekayaan awal (opsional), nomor/tanggal akta, notaris.
- Bukan dokumen: kuesioner BO, voucher,
jenis_transaksi.
6. Kelas dokumen classifier (taksonomi terpisah — berbagi dgn Yayasan)
Satu taksonomi nirlaba (pola apostille-classifier.ts), diskriminatif per entitas:
| Kelas baru | Untuk |
|---|---|
AKTA_PENDIRIAN_PERKUMPULAN |
akta utama Perkumpulan (+ AKTA_SUBTYPE_MAP → subtype perkumpulan) |
Reuse: tidak ada KTP/NPWP (tak ada di flow). Tidak ada dokumen asing tambahan (kontras Yayasan yang punya Kemenlu).
7. Spesifikasi rule (D11 — DISESUAIKAN untuk Perkumpulan)
| Rule | Input field | Sumber data | Severity | Pesan | Overridable |
|---|---|---|---|---|---|
AKTA_PRESENT |
dokumen akta | submission docs | FAIL | "Akta Pendirian belum diunggah" | tidak |
ORGAN_COMPLETENESS |
organ.rapat_anggota/pengurus/pengawas |
ekstraksi akta | WARNING | "Organ belum lengkap: {daftar kosong}" | ya |
ADART_COMPLETENESS |
adart.* (5 field) |
ekstraksi akta | WARNING | "AD/ART belum lengkap: {field kosong}" (anchor FormDataPerkumpulan.php:126-128) |
ya |
NAMA_AVAILABILITY |
nama_perkumpulan, nama_singkat |
SABH readonly base='perkumpulan' |
WARNING | "Nama sudah dipesan/terdaftar" | ya |
Dibuang / tidak berlaku:
- KEKAYAAN_AWAL_PRESENT, KEKAYAAN_ASING_MIN — kekayaan tidak wajib & aturan Rp100jt nonaktif untuk Perkumpulan.
- NIK_KTP_ORGAN, NAMA_NPWP_ORGAN, KTP_COMPLETENESS, NPWP_COMPLETENESS, NAMA_BH_CONSISTENCY — tak ada dokumen/sumber kedua.
- Semua rule saham/modal/bukti-setor/KBLI.
Rule khusus Perkumpulan yang TIDAK ada di Yayasan: ADART_COMPLETENESS.
Rule Yayasan yang TIDAK ada di Perkumpulan: KEKAYAAN_AWAL_PRESENT, KEKAYAAN_ASING_MIN.
8. Penanda BLOCKED-ON-S5
Sama seperti Yayasan: prompt extractor akta + tuning + uji akurasi BLOCKED sampai akta asli tiba (sintetis ditolak). Schema, tenant, rules (logika), classifier, route family, frontend, NAMA_AVAILABILITY jalan paralel.
9. Ringkas perbedaan Yayasan vs Perkumpulan (untuk implementer)
| Aspek | Yayasan | Perkumpulan |
|---|---|---|
| id_aksi / product | 2 / 50 | 14 / 60 |
| Organ | Pembina/Pengurus/Pengawas | Rapat Anggota/Pengurus/Pengawas (pembina col = Rapat Anggota) |
| Kekayaan awal | Wajib (+rule) | Tidak wajib (tanpa rule) |
| AD/ART wajib | tidak | asas_tujuan, hak_kewajiban, pengelola, mekanisme, pembubaran |
| Asing | +Kemenlu +kekayaan≥Rp100jt +paspor | hanya paspor/KITAS |
| Verifikator SABH | tidak ada | ada (kasie) — tapi PoC tetap terminal (D4b) |
| Rule unik | KEKAYAAN_* |
ADART_COMPLETENESS |