think
16px
820px

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

flowchart LR A[1. Unggah
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

flowchart TD UP[Upload akta] --> DISP["dispatchProcessor()
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

sequenceDiagram participant U as Notaris participant K as KlasifikasiPage participant P as runFlow (engine) participant O as OCR+LLM (organ extractor) participant S as SABH readonly U->>K: unggah akta perkumpulan K->>P: create PENDIRIAN_PERKUMPULAN + start P->>O: ekstrak akta (primaryAkta AKTA_PENDIRIAN_PERKUMPULAN, variant=perkumpulan) O-->>P: organ (rapat anggota/pengurus/pengawas) + AD/ART + metadata Note over P: hooks.beforeValidation — derive organ + AD/ART fields P->>S: NAMA_AVAILABILITY (base=perkumpulan) S-->>P: sudah dipesan/terdaftar? P->>P: rules D11 (organ/AD-ART/akta/nama) P-->>K: READY → Smart Review

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_lambang BUKAN 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