Blackbox Testing — Akuisisi PT (PT)
- Domain: PT
- Fitur: Akuisisi PT (Pengambilalihan / Peralihan Saham)
- Role/aktor: notaris (input & pengajuan), verifikator_pt (verifikasi bertahap + voting), admin (akses menyeluruh)
- Tanggal uji: 2026-08-19
- Penguji (sesi): Supervisor PT
- Build/commit: 63c40a17
1. Ringkasan fitur
Akuisisi PT memproses Akta Pengambilalihan (Akta Akuisisi) yang menyatakan peralihan saham dan perubahan pengendalian perseroan. Notaris mengunggah akta, sistem OCR + LLM mengekstraksi field, mencocokkan perseroan dengan data SABH (company lookup), menghitung diff terhadap data lama, lalu menjalankan validasi termasuk kuorum kehadiran RUPS kategori Ps.89 dan jendela pengumuman koran. Berbeda dari Pendirian, flow ini bertahap lewat verifikator: setelah notaris menyetujui seksi perubahan yang muncul dan menekan Kirim, permohonan tercatat COMPLETED pada submission namun antrean verifikasi masuk status MENUNGGU_VERIFIKATOR, dan dapat melalui tahap voting pemegang saham sebelum putusan final. Akuisisi berbagi jalur route dan rule set dengan Perubahan PT (routeFamily "perubahan"), dengan tambahan aturan koran akuisisi dan kuorum Ps.89.
2. Full workflow
2.1 Diagram state
stateDiagram-v2
[*] --> CREATED
CREATED --> EXTRACTING: POST /start
EXTRACTING --> AWAITING_COMPANY_SELECTION: lookup >1 kandidat SABH
AWAITING_COMPANY_SELECTION --> VALIDATING: select-company
EXTRACTING --> VALIDATING: lookup 0/1 kandidat (auto)
VALIDATING --> READY
READY --> COMPLETED: submit (seksi tersetujui) + buat Verifikasi MENUNGGU_VERIFIKATOR
COMPLETED --> READY: verifikator REVISE (seksi di-unapprove, submission balik READY)
COMPLETED --> [*]: verifikator APPROVE lalu voting lalu final SELESAI
COMPLETED --> [*]: verifikator REJECT (DITOLAK)
Catatan: pada submit, kolom submission.status langsung menjadi COMPLETED, sedangkan alur verifikasi berjalan pada baris VerifikasiPerubahan (MENUNGGU_VERIFIKATOR, MENUNGGU_VOTING, DITOLAK, PERBAIKAN, SELESAI). Ini berbeda dari intuisi "MENUNGGU_VERIFIKATOR pada submission" tetapi konsisten dengan alur Perubahan/Penggabungan pada route family yang sama.
2.2 Sequence (aktor - sistem)
sequenceDiagram
actor N as Notaris
actor V as Verifikator PT
participant BE as Backend :47014
N->>BE: Unggah Akta Akuisisi + start
BE->>BE: ekstraksi + company lookup + diff + validasi (kuorum Ps.89, koran)
N->>BE: (opsional) POST attestations (jalur hukum: jenisPerseroan/caraPengambilalihan/deedType)
N->>BE: POST sections/nonpad:peralihanSaham/approve
N->>BE: POST submissions/:id/submit
BE->>BE: gate seksi tersetujui; status COMPLETED; buat Verifikasi MENUNGGU_VERIFIKATOR
V->>BE: GET /verifikator/submissions/:id/verifikasi
V->>BE: POST /verifikator/submissions/:id/decide (APPROVE/REJECT/REVISE)
BE->>BE: APPROVE -> buat ShareholderVote + MENUNGGU_VOTING; REVISE -> PERBAIKAN; REJECT -> DITOLAK
BE-->>N: status akhir COMPLETED / PERBAIKAN / REJECTED
2.3 Peta route & UI
| Langkah |
Route |
Komponen |
Elemen interaktif utama |
Selector |
| Unggah & klasifikasi |
/klasifikasi |
KlasifikasiPage |
file input (Akta auto-terdeteksi jadi AKTA_AKUISISI) |
input[type=file] |
| Ekstraksi (step 2) |
/akuisisi/:id/extraction |
AkuisisiExtractionPage |
auto-start |
(tanpa testid) |
| Tinjauan (step 3) |
/akuisisi/:id/review |
PtAkuisisiReviewPageV2 |
konfirmasi field, approve seksi, jalur hukum, panel validasi, tombol Kirim |
akuisisi-legal-path (kartu jalur hukum); tombol Kirim tanpa testid (OBS-1) |
| Verifikator |
/verifikator lalu /verifikator/review/:id |
VerifikatorDashboardPage, VerifikatorReviewPage |
Setujui/Tolak/Revisi |
(bagian dari route family perubahan) |
| Status |
/akuisisi/:id/status |
SubmissionStatusPage (type AKUISISI_PT) |
ringkasan |
(tanpa testid) |
3. Prasyarat & data uji
| ID data |
Tipe |
Berkas |
Deskripsi |
Ekspektasi sistem |
| D-POS-AK |
Positive |
e2e/data/real-intake/pt/akuisisi/...KARYA-ANAK-KEPRI...Transfer-of-Ownership.pdf (scan 10 halaman) |
Akta Pengambilalihan PT Karya Anak Kepri No.03 tgl 18-08-2026, peralihan saham ke pemegang saham asing |
READY; type AKUISISI_PT; kuorum PASS; sejumlah FAIL/WARNING dokumen pendukung & kontak |
| D-NEG-DOCS |
Negative |
(sama, kondisi bawaan) |
Tanpa AKTA_PEMINDAHAN_HAK & BERITA_ACARA_RUPS, tanpa data kontak pemegang saham |
REQUIRED_SUPPORTING_DOCS FAIL, PEMEGANG_SAHAM_CONTACT FAIL |
| D-NEG-KUORUM |
Negative |
(butuh BA RUPS/daftar hadir dengan kehadiran < 75%) |
Kehadiran RUPS di bawah ambang Ps.89 |
RUPS_ATTENDANCE_QUORUM WARNING (bukan FAIL) |
Catatan: data uji Akuisisi sangat minim (satu scan nyata). Corpus sintetis akta-txn-akuisisi-pkr.txt terlalu ringkas (6 baris, tanpa roster/tanggal/kuorum) sehingga tidak membentuk perseroan yang lolos company lookup maupun data kuorum; membangun akta sintetis lengkap yang bertahan di lookup SABH berisiko tinggi dan tidak dikerjakan. Kuorum negatif dan tanggal-akta negatif didokumentasikan dari kode dan dari paritas dengan Perubahan PT (jendela 30 hari, "sudah N hari lalu (maks 30 hari)" FAIL).
4. Matriks skenario uji
| ID |
Tipe |
Lapisan |
Langkah ringkas |
Ekspektasi |
Hasil aktual |
Status |
Bukti |
| TC-01 |
Positive |
API |
Drive D-POS-AK ke terminal |
type AKUISISI_PT, READY |
Sesuai: AKUISISI_PT, READY, klasifikasi 0.9552; 34 rule (21 SKIPPED/9 PASS/2 WARNING/2 FAIL) |
PASS |
probe log |
| TC-02 |
Aturan |
API |
Kuorum RUPS Ps.89 dari akta |
Ambang ke-1 min 75%; PASS bila terpenuhi |
Sesuai: "Kehadiran RUPS 100.00% (dari akta), memenuhi kuorum (min. 75%)" PASS |
PASS |
probe log |
| TC-03 |
Aturan |
API |
Dokumen pendukung wajib |
Diminta AKTA_PEMINDAHAN_HAK + BERITA_ACARA_RUPS |
Sesuai: REQUIRED_SUPPORTING_DOCS FAIL "belum diunggah: AKTA_PEMINDAHAN_HAK, BERITA_ACARA_RUPS" |
PASS |
probe log |
| TC-04 |
Aturan |
API |
Data kontak pemegang saham |
Wajib untuk dispatch persetujuan SABH |
Sesuai: PEMEGANG_SAHAM_CONTACT FAIL untuk 2 pemegang saham |
PASS |
probe log |
| TC-05 |
Aturan |
API |
Peralihan saham field-based |
SHARES_TRANSFER_BALANCE peringatan bila jenis peralihan tanpa baris terekstrak |
Sesuai: WARNING "menyebut Peralihan Saham, tapi tidak ada baris peralihan terekstrak" |
PASS |
probe log |
| TC-06 |
Aturan |
API |
Jendela koran akuisisi |
Tidak ada tanggal koran/RUPS lengkap |
Sesuai: AKUISISI_KORAN_WINDOW SKIPPED "Tanggal koran atau RUPS tidak tersedia" (severityFloor WARNING, tak pernah FAIL) |
PASS |
probe log |
| TC-07 |
Aturan |
API |
Jendela tanggal akta |
Akuisisi pakai jendela 30 hari |
Sesuai: AKTA_DATE_WINDOW PASS "Tanggal akta 2026-08-18 (1 hari lalu)"; jendela 30 hari (paritas Perubahan) |
PASS |
probe log |
| TC-08 |
Gate |
API |
Submit saat seksi belum disetujui |
Ditolak |
Sesuai: 400 "Not all sections approved" unapprovedSections ["nonpad:peralihanSaham"] |
PASS |
probe log |
| TC-09 |
Gate |
API |
Atestasi jalur hukum tidak valid |
Ditolak per-field |
Sesuai: 400 "jenisPerseroan must be TERTUTUP or TERBUKA" |
PASS |
probe log |
| TC-10 |
Gate |
API |
Atestasi jalur hukum valid |
Diterima (advisory) |
Sesuai: 200 {ok:true}; tidak mengubah gate submit |
PASS |
probe log |
| TC-11 |
Gate |
API |
Submit setelah seksi disetujui, FAIL masih ada |
(Diharapkan tertahan fail-gate) |
Aktual: 200 COMPLETED walau 2 FAIL belum di-override (lihat BUG-01) |
FAIL (bug) |
probe log |
| TC-12 |
State |
API |
Verifikator decide tanpa notes / decision salah |
400 |
Sesuai: 400 "Notes required"; 400 "Invalid decision" |
PASS |
probe log |
| TC-13 |
State |
API |
Verifikator REVISE (initial) |
PERBAIKAN, seksi di-unapprove, submission balik READY |
Sesuai: verifikasi PERBAIKAN, aiRecommendation FAIL; submission.status READY; seksi perlu re-approve |
PASS |
probe log |
| TC-14 |
State |
API |
Verifikator APPROVE (initial) |
MENUNGGU_VOTING + buat ShareholderVote |
Sesuai: MENUNGGU_VOTING, 2 vote dibuat (JEREMY LEE, VECNA PROPERTIES), belum direspons |
PASS |
probe log |
| TC-15 |
State |
API |
Decide saat status PERBAIKAN |
409 |
Sesuai: 409 "Status PERBAIKAN tidak dapat dikeputuskan" |
PASS |
probe log |
| TC-16 |
Positive |
UI |
Deep-link /akuisisi/:id/review sebagai notaris |
Render + kartu jalur hukum tampil |
Sesuai: render OK, akuisisi-legal-path count 1, 3 radio group tampil |
PASS |
artifacts/akuisisi/ui-review.png, ui-legal-path.png |
5. Cakupan UI
| Route/Elemen |
Diuji? |
Perilaku benar? |
Catatan |
/klasifikasi unggah |
Ya (API) |
Ya |
Akta auto-terdeteksi AKTA_AKUISISI (confidence 0.9552) |
/akuisisi/:id/extraction |
Ya (navigasi) |
Ya |
Auto-start |
/akuisisi/:id/review render |
Ya |
Ya |
Field + panel validasi + approve seksi + jalur hukum |
Kartu jalur hukum akuisisi-legal-path |
Ya |
Ya |
3 radio group (Jenis Perseroan, Cara Pengambilalihan, Bentuk Akta), advisory |
| Tombol Kirim (gate) |
Sebagian |
Ya (untuk gate seksi) |
Tanpa data-testid (OBS-1); gate hanya seksi, bukan FAIL (BUG-01) |
| Panel verifikator (Setujui/Tolak/Revisi) |
Ya (API) |
Ya |
decide diuji: APPROVE (voting), REVISE, guard notes/decision/status |
| Interstitial select-company |
Tidak (UI) |
- |
Tidak terpicu; perseroan nyata resolve tunggal |
/akuisisi/:id/status |
Tidak (UI) |
- |
Diverifikasi via API status (COMPLETED) |
6. Temuan bug & perbaikan
| ID bug |
Severity |
Ringkas |
Reproduksi |
Ekspektasi |
Aktual |
Screenshot |
Rekomendasi perbaikan |
| BUG-01 |
High |
Submit Akuisisi lolos walau ada rule FAIL belum di-override |
Drive akta (REQUIRED_SUPPORTING_DOCS + PEMEGANG_SAHAM_CONTACT FAIL), approve seksi, submit |
Tertahan fail-gate seperti flow v2 lain (422 VALIDATION_FAILED) sampai FAIL diselesaikan/di-override |
200 COMPLETED; permohonan naik ke verifikator dengan 2 FAIL belum tertangani |
probe log |
Tambahkan checkFailGate pada cabang AKUISISI_PT/PENGGABUNGAN_PT di routes/perubahan.ts (sekitar baris 1256), sebelum transisi COMPLETED, konsisten dengan cabang foreign v2 (baris 1223-1224). Bila memang by-design karena FAIL ini dokumen pendukung yang bisa dilengkapi belakangan, konfirmasikan dan turunkan severity |
| OBS-1 |
Low |
Tombol Kirim akuisisi tanpa testid |
Buka review akuisisi |
Selector stabil untuk uji |
Tombol biasa tanpa data-testid |
ui-review.png |
Tambah data-testid="akuisisi-submit-button" (samakan pola pt-finalize-button) |
| OBS-2 |
Info |
Submit langsung set submission COMPLETED |
Submit akuisisi lolos gate |
- |
submission.status COMPLETED sementara verifikasi masih MENUNGGU_VERIFIKATOR |
probe log |
Bukan bug; catat agar UI status tidak menandai "selesai final" sebelum verifikator memutus. REVISE mengembalikan submission ke READY dan meng-unapprove seksi |
| OBS-3 |
Info |
Kuorum RUPS terbaca dari recital akta |
Drive akta tanpa BA RUPS |
- |
RUPS_ATTENDANCE_QUORUM memakai aktaKehadiranRatio (fallback) dan PASS 100% min 75% |
probe log |
Sesuai desain: BA RUPS lebih otoritatif, recital akta dipakai bila BA RUPS tidak ada. Pesan sudah menandai "(dari akta)" |
7. Ringkasan & rekomendasi
- Total skenario: 16 (PASS 15 / FAIL 1). Satu FAIL (TC-11) adalah bug fungsional BUG-01, bukan kesalahan uji.
- Cakupan UI: render + kartu jalur hukum
akuisisi-legal-path teruji end-to-end di browser; alur verifikator (APPROVE ke voting, REVISE, guard) teruji penuh via API. Interstitial company-selection dan halaman status hanya diverifikasi via API/kode.
- Bug: High 1 (BUG-01 fail-gate tidak dijalankan pada submit Akuisisi), Med 0, Low 1 (OBS-1), Info 2 (OBS-2, OBS-3).
- Kuorum RUPS terverifikasi: Akuisisi memakai kategori ps89 (Ps.89 UUPT): RUPS ke-1 min 75%, RUPS ke-2 min 66.67% (2/3), keduanya komparator "paling sedikit". Menghasilkan WARNING (bukan FAIL) bila di bawah ambang, PASS bila terpenuhi, SKIPPED tanpa data kehadiran. Prioritas sumber: roster BA RUPS lalu recital akta lalu SKIPPED. Diamati PASS 100% dari recital akta.
- Aturan khas Akuisisi: AKUISISI_KORAN_WINDOW (severityFloor WARNING, tak pernah FAIL karena Ps.127(8) mengecualikan akuisisi langsung dari pemegang saham) dan hook
forcePeralihanOn yang memaksa jenis peralihan saham. Peralihan saham bersifat field-based: bila jenis peralihan muncul tanpa baris peralihan terekstrak, SHARES_TRANSFER_BALANCE memberi WARNING; REQUIRED_SUPPORTING_DOCS meminta AKTA_PEMINDAHAN_HAK.
- Jalur hukum (
akuisisi-legal-path): tiga pilihan (jenisPerseroan TERTUTUP/TERBUKA; caraPengambilalihan LANGSUNG/MELALUI_DIREKSI; deedType AKTA_NOTARIS/DI_BAWAH_TANGAN). Bersifat advisory penuh, tervalidasi per-field di backend (payload 3-field), tersimpan di akuisisiAttestation, dan TIDAK memblokir submit. Gate submit hanya persetujuan seksi yang muncul (di sini nonpad:peralihanSaham).
- Gate submit: urutannya adalah type-check lalu READY-check lalu gate seksi (persetujuan seksi yang muncul). Tidak ada gate atestasi wajib (berbeda dari Perubahan yang bergate s1-s5) dan, saat ini, tidak ada fail-gate (BUG-01).
- Gap/keterbatasan: kuorum negatif dan tanggal-akta negatif belum didorong dengan data nyata karena keterbatasan sampel Akuisisi; keduanya didokumentasikan dari kode/paritas. Rekomendasi lanjutan: siapkan sampel Akuisisi dengan BA RUPS/daftar hadir berkehadiran di bawah 75% untuk membuktikan WARNING ps89 secara end-to-end, dan lengkapi AKTA_PEMINDAHAN_HAK untuk melihat REQUIRED_SUPPORTING_DOCS lolos.