Blackbox Testing — Pembubaran PT (PT)
- Domain: PT
- Fitur: Pembubaran PT
- Role/aktor: notaris (input & pengajuan), verifikator_pt (verifikasi bertahap), admin (akses menyeluruh)
- Tanggal uji: 2026-08-19
- Penguji (sesi): Supervisor PT (sub-supervisor Pembubaran)
- Build/commit: 63c40a17
1. Ringkasan fitur
Pembubaran PT memproses Akta Pembubaran (dasar UUPT Pasal 142-147) untuk membubarkan sebuah perseroan yang sudah berdiri. Notaris mengunggah akta lewat papan Klasifikasi, sistem menjalankan OCR dan ekstraksi LLM (akta memakai skema extractor Perubahan lewat override), mencocokkan perseroan dengan data SABH (company lookup satu sumber), lalu menjalankan validasi berbasis snapshot registri (tidak ada diff kapitalisasi). Berbeda dari Pendirian, flow ini bertahap lewat verifikator: setelah notaris menyetujui tiap bagian yang wajib dan menekan Kirim, permohonan menjadi COMPLETED sekaligus membuat antrean verifikator (MENUNGGU_VERIFIKATOR). Yang khas Pembubaran: tidak ada validasi kuorum kehadiran RUPS (di luar cakupan kuorum, sama seperti Berakhirnya Status dan Laporan RUPS), pengumuman koran Pasal 147 hanya bersifat peringatan (bukan penghalang), dan ada pengaman pembubaran ganda (PT_ALREADY_DISSOLVED) yang memblokir pengajuan kedua untuk PT yang sama.
2. Full workflow
2.1 Diagram state
stateDiagram-v2
[*] --> CREATED
CREATED --> EXTRACTING: POST /start
EXTRACTING --> VALIDATING: OCR + ekstraksi LLM + company lookup (SABH) selesai
VALIDATING --> READY: aturan validasi dijalankan
READY --> COMPLETED: submit (semua bagian wajib disetujui, tidak ada FAIL tersisa)
COMPLETED --> MENUNGGU_VERIFIKATOR: VerifikasiPerubahan dibuat pada transaksi submit
MENUNGGU_VERIFIKATOR --> MENUNGGU_VOTING: verifikator APPROVE (lihat OBS-1)
MENUNGGU_VOTING --> DITOLAK: verifikator REJECT (veto), atau voting gagal
MENUNGGU_VERIFIKATOR --> PERBAIKAN: verifikator REVISE (submission dibuka lagi ke READY)
MENUNGGU_VERIFIKATOR --> DITOLAK: verifikator REJECT
EXTRACTING --> ERROR: kegagalan OCR/ekstraksi akta (transient, retry)
2.2 Sequence (aktor - sistem)
sequenceDiagram
actor N as Notaris
actor V as Verifikator PT
participant FE as Frontend
participant BE as Backend :47014
participant OCR as OCR/LLM
N->>FE: Unggah akta di /klasifikasi
FE->>BE: upload + classify (AKTA_PEMBUBARAN)
FE->>BE: POST /api/submissions (infer PEMBUBARAN_PT) + /start
BE->>OCR: ekstraksi field akta (skema perubahan) + focused pass koran
BE->>BE: company lookup SABH + jalankan validasi (tanpa kuorum RUPS)
N->>FE: Konfirmasi field, setujui tiap bagian wajib, override FAIL bila perlu
FE->>BE: POST /api/pembubaran/submissions/:id/sections/:key/approve
N->>FE: Klik Kirim ke Verifikator
FE->>BE: POST /api/pembubaran/submissions/:id/submit
BE->>BE: gate: bagian wajib disetujui, lalu fail-gate; buat VerifikasiPerubahan
BE-->>N: { status: COMPLETED } (MENUNGGU_VERIFIKATOR)
V->>BE: GET /api/verifikator/submissions/:id/verifikasi
V->>BE: POST /api/verifikator/submissions/:id/decide (APPROVE/REJECT/REVISE)
BE-->>N: MENUNGGU_VOTING / DITOLAK / PERBAIKAN
2.3 Peta route & UI
| Langkah |
Route |
Komponen |
Elemen interaktif utama |
Selector |
| Unggah & klasifikasi |
/klasifikasi |
KlasifikasiPage |
file input, kartu akta |
input[type=file] |
| Ekstraksi (step 2) |
/pembubaran/:submissionId/extraction |
PembubaranExtractionPage |
auto-start pipeline |
(tanpa testid) |
| Tinjauan (step 3) |
/pembubaran/:submissionId/review |
PembubaranReviewPage |
konfirmasi field, tombol Setujui tiap bagian, edit koran, panel validasi, tombol Kirim ke Verifikator |
(tombol tanpa data-testid, lihat OBS-2) |
| Status (step 4) |
/pembubaran/:submissionId/status |
PembubaranStatusPage |
ringkasan status |
(tanpa testid) |
| Verifikator |
/verifikator lalu /verifikator/pembubaran/:id |
VerifikatorDashboardPage, VerifikatorPembubaranReviewPage |
Setujui/Tolak/Revisi (DecisionPanel) |
(tanpa testid) |
3. Prasyarat & data uji
| ID data |
Tipe |
Berkas |
Deskripsi |
Ekspektasi sistem |
| D-POS-01 |
Positive |
real-intake/pt/pembubaran/...AKTA-pembubaran-PT_KRISNA-FINISH.pdf |
Akta Pembubaran PT Krisna Sadhu Utama (born-digital, 7 halaman, keputusan sirkuler pemegang saham) |
Terklasifikasi AKTA_PEMBUBARAN (0.9), type PEMBUBARAN_PT, READY, company lookup SABH sukses |
| D-NEG-01 |
Negative |
D-POS-01 dengan tanggal_akta digeser ke 1986-08-10 (edit field runtime) |
Tanggal akta jauh kedaluwarsa |
AKTA_DATE_WINDOW FAIL, submit terblokir sampai override |
| D-DUP-01 |
Negative |
Pengajuan kedua atas PT yang sama setelah D-POS-01 COMPLETED |
Pembubaran ganda |
PT_ALREADY_DISSOLVED FAIL, submit terblokir (tidak dapat dilanjutkan) |
Catatan data: koran/KTP/NPWP/domisili nyata tidak tersedia dalam paket ini, jadi aturan berbasis dokungan dokumen tersebut ter-SKIP secara wajar (bukan cacat). Bukti tersimpan di e2e/artifacts/pembubaran/ (screenshot UI review).
4. Matriks skenario uji
| ID |
Tipe |
Lapisan |
Langkah ringkas |
Ekspektasi |
Hasil aktual |
Status |
Bukti |
| TC-01 |
Positive |
API |
Drive D-POS-01 ke terminal |
type PEMBUBARAN_PT, READY, field terekstraksi |
Sesuai: READY, klasifikasi AKTA_PEMBUBARAN 0.9, 6 PASS/9 SKIPPED/0 FAIL |
PASS |
probe log |
| TC-02 |
Aturan |
API |
Cek company lookup SABH |
Perseroan ter-resolve dari SABH |
Sesuai: nama "KRISNA SADHU UTAMA", OLD_DATA_CONSISTENCY PASS, PERSEROAN_STATE PASS |
PASS |
probe log |
| TC-03 |
Aturan |
API |
Cek kuorum RUPS |
Tidak divalidasi (di luar cakupan) |
Sesuai: tidak ada rule RUPS_ATTENDANCE_QUORUM di hasil (index.ts:113-115) |
PASS |
probe log + kode |
| TC-04 |
Aturan |
API |
Cek pengumuman koran (positif) |
PEMBUBARAN_KORAN PASS dalam jendela 30 hari |
Sesuai: "0 hari setelah akta pembubaran (maksimal 30, Ps.147(1))" PASS |
PASS |
probe log |
| TC-05 |
Aturan |
API |
Cek PT_ALREADY_DISSOLVED (positif) |
PASS bila belum pernah dibubarkan |
Sesuai: "Belum ada pembubaran tercatat untuk PT ini" PASS |
PASS |
probe log |
| TC-06 |
Gate |
API |
Submit tanpa menyetujui bagian |
400 SECTIONS_UNAPPROVED |
Sesuai: 5 bagian wajib diminta (perseroan, akta_pembubaran, rups_kehadiran, identitas, data_kontak) |
PASS |
probe log |
| TC-07 |
Gate |
API |
Setujui bagian tak dikenal |
400 Unknown section |
Sesuai: "Unknown section: bogus" |
PASS |
probe log |
| TC-08 |
Positive |
API |
Setujui 5 bagian wajib lalu submit (0 FAIL) |
200 COMPLETED + MENUNGGU_VERIFIKATOR |
Sesuai: {status: COMPLETED}, VerifikasiPerubahan MENUNGGU_VERIFIKATOR |
PASS |
probe log |
| TC-09 |
Gate |
API |
Submit lagi saat sudah COMPLETED |
409 WRONG_STATUS |
Sesuai: "submission cannot be edited in its current status" |
PASS |
probe log |
| TC-10 |
Verifikator |
API |
decide tanpa notes / decision salah |
400 |
Sesuai: "Notes required" dan "Invalid decision" |
PASS |
probe log |
| TC-11 |
Verifikator |
API |
Initial APPROVE |
Transisi lanjut |
MENUNGGU_VOTING; 2 baris voting pemegang saham dibuat dari roster SABH (lihat OBS-1) |
PASS (perilaku), lihat OBS-1 |
probe log |
| TC-12 |
Verifikator |
API |
REVISE saat status MENUNGGU_VOTING |
Ditolak |
Sesuai: "Hanya REJECT yang diizinkan saat status MENUNGGU_VOTING (veto verifikator)" |
PASS |
probe log |
| TC-13 |
Negative |
API |
D-NEG-01 (tanggal akta 1986) |
AKTA_DATE_WINDOW FAIL |
Sesuai: "sudah 14619 hari lalu (maks 30 hari)" FAIL |
PASS |
probe log |
| TC-14 |
Gate |
API |
Submit D-NEG-01 (FAIL + bagian belum) |
Gate bagian mendahului fail-gate |
Sesuai: 400 SECTIONS_UNAPPROVED dulu; setelah bagian ok jadi 422 VALIDATION_FAILED [AKTA_DATE_WINDOW, PT_ALREADY_DISSOLVED] |
PASS |
probe log |
| TC-15 |
Gate |
API |
Override AKTA_DATE_WINDOW pada D-NEG-01 |
200 (overridable, lihat OBS-3) |
Sesuai: 200 {overridden:true} |
PASS |
probe log |
| TC-16 |
Negative |
API |
Submit D-NEG-01 setelah override tanggal |
Tetap tertahan pembubaran ganda |
Sesuai: 422 VALIDATION_FAILED [PT_ALREADY_DISSOLVED] |
PASS |
probe log |
| TC-17 |
Aturan |
API |
PT_ALREADY_DISSOLVED (negatif, D-DUP-01) |
FAIL menyebut submission sebelumnya |
Sesuai: "Pembubaran untuk PT ini sudah pernah diajukan (submission 81e0...), pembubaran ganda tidak diizinkan" |
PASS |
probe log |
| TC-18 |
Aturan |
API |
PEMBUBARAN_KORAN saat tanggal kedaluwarsa |
WARNING (bukan FAIL) |
Sesuai: "14610 hari setelah akta, melewati jendela 30 hari Ps.147(1) ... bukan penghalang pengajuan" WARNING |
PASS |
probe log |
| TC-19 |
State |
API |
kehadiran/approve saat bukan READY |
Terblokir/aman |
Guard READY-only benar: submission tertahan di READY oleh PT_ALREADY_DISSOLVED sehingga aksi tetap sah (bukan bug) |
PASS |
probe log |
| TC-20 |
Positive |
UI |
Deep-link /pembubaran/:id/review sebagai notaris |
Halaman render, tombol Kirim tergate |
Sesuai render; "Kirim ke Verifikator" visible + disabled |
PASS |
artifacts/pembubaran/ui-review.png |
Ringkasan validasi happy path (D-POS-01, 1 akta): 6 PASS, 9 SKIPPED, 0 WARNING, 0 FAIL. PASS: PEMBUBARAN_KORAN, NPWP_COMPLETENESS, OLD_DATA_CONSISTENCY, AKTA_DATE_WINDOW, PERSEROAN_STATE, PT_ALREADY_DISSOLVED. SKIPPED (data pendukung tidak diunggah): NIK_KTP_AKTA, NAMA_NPWP_KTP, KTP_COMPLETENESS, DOMISILI_NAMA, NAMA_PT_CONSISTENCY, CONTACT_INFO_COMPLETE, NPWP_PERSEROAN_FUZZY, NOTARIS_TERAKHIR, PASSPORT_AKTA.
5. Cakupan UI (semua yang diakses user)
| Route/Elemen |
Diuji? |
Perilaku benar? |
Catatan |
/klasifikasi unggah akta |
Ya (via API drive) |
Ya |
Klasifikasi AKTA_PEMBUBARAN lalu inference PEMBUBARAN_PT |
/pembubaran/:id/extraction |
Tidak (navigasi) |
- |
Auto-start pipeline; tanpa testid stabil |
/pembubaran/:id/review render |
Ya |
Ya |
Field akta, kehadiran, koran, panel validasi tampil |
| Tombol Setujui tiap bagian |
Sebagian (API) |
Ya |
Diuji di API (approve/unapprove + unknown section); tombol UI tanpa data-testid (OBS-2) |
| Tombol Kirim ke Verifikator (gate) |
Ya |
Ya |
Visible + disabled saat bagian belum disetujui (READY) |
| Dialog konfirmasi Kirim |
Tidak |
- |
Terbuka setelah gate terpenuhi; tidak didorong end-to-end di UI |
| Panel verifikator (Setujui/Tolak/Revisi) |
Tidak (UI) |
- |
Diuji di API (decide APPROVE/REVISE + validasi body); halaman VerifikatorPembubaranReviewPage didokumentasikan dari kode |
/pembubaran/:id/status |
Tidak |
- |
Belum diuji terpisah (destinasi step 4) |
6. Temuan bug & perbaikan
| ID bug |
Severity |
Ringkas |
Reproduksi |
Ekspektasi |
Aktual |
Screenshot |
Rekomendasi perbaikan |
| OBS-1 |
Med (desain) |
APPROVE pembubaran memicu voting pemegang saham |
Submit pembubaran, lalu verifikator initial APPROVE |
Pembubaran tidak punya diff, seharusnya tidak butuh e-voting pemegang saham |
Status pindah ke MENUNGGU_VOTING dan 2 baris ShareholderVote dibuat dari roster SABH (ALISTER DAVID PARK 70%, KETUT KRISNA PUSPITA DEWI 30%). Email tidak terkirim di sesi ini hanya karena mode demo (tanpa SMTP); pada mode non-demo dengan email terisi, undangan voting akan benar-benar dikirim untuk sebuah pembubaran |
probe log |
Route decide dipakai bersama dengan Perubahan. Untuk PEMBUBARAN_PT, initial APPROVE sebaiknya langsung SELESAI (atau ke stage final) tanpa membuat ShareholderVote, karena pembubaran memang tidak melalui voting. Konfirmasikan ke produk; bila voting memang diinginkan, halaman verifikator harus menampilkan penjelasan (bukan hanya validasi) |
| OBS-2 |
Low |
Tombol Kirim/Setujui pembubaran tanpa data-testid |
Buka /pembubaran/:id/review |
Selector stabil untuk uji UI |
Tombol memakai teks biasa (Kirim ke Verifikator, Setujui) tanpa data-testid |
ui-review.png |
Tambah data-testid (mis. pembubaran-submit-button, pembubaran-approve-<key>) samakan pola dengan pt-finalize-button |
| OBS-3 |
Low (desain) |
AKTA_DATE_WINDOW overridable di Pembubaran |
Override AKTA_DATE_WINDOW pada submission pembubaran |
Konsisten dengan Pendirian (terkunci saat tanggal terverifikasi) |
200 OK (kebijakan override men-scope docType terkunci hanya ke AKTA_PENDIRIAN) |
probe log |
Sama dengan temuan Perubahan (OBS-2 di sana): bila akta pembubaran lewat jendela juga harus terkunci saat tanggal terverifikasi, tambah tipe aktanya ke docTypes kebijakan; bila legacy-overridable memang disengaja, konfirmasikan |
| OBS-4 |
Low |
Label "maks 30 hari" & "kuorum Ps.89(1)" pada teks Pembubaran |
Lihat pesan AKTA_DATE_WINDOW dan subtitle Kehadiran RUPS di halaman verifikator |
Pembubaran bukan Perubahan (jendela seharusnya 60 hari) dan tidak memvalidasi kuorum |
AKTA_DATE_WINDOW memakai jendela 30 hari karena akta pembubaran menumpang skema extractor perubahan (isPerubahan true), pesannya berbunyi "maks 30 hari". Subtitle halaman verifikator menulis "kuorum Ps.89(1) >=3/4" padahal kuorum tidak divalidasi untuk pembubaran |
probe log, VerifikatorPembubaranReviewPage.tsx:59 |
Konfirmasikan jendela tanggal yang benar untuk pembubaran (30 vs 60). Ubah subtitle Kehadiran RUPS di halaman verifikator agar tidak menyiratkan kuorum divalidasi (mis. hanya "sumber: ...") supaya tidak menyesatkan verifikator |
Severity: High = blokir alur/kehilangan data/salah hasil; Med = salah perilaku tapi ada workaround; Low = kosmetik/teks.
7. Ringkasan & rekomendasi
- Total skenario: 20 (PASS 20 / FAIL 0). Satu di antaranya (TC-11) PASS secara perilaku tetapi memunculkan temuan desain OBS-1.
- Cakupan UI: render halaman review + gate Kirim teruji di UI; approve/unapprove/submit/decide teruji di API. Halaman verifikator dan dialog konfirmasi Kirim belum didorong penuh end-to-end di browser (butuh menyelesaikan seluruh gate dan roster kontak).
- Bug: High 0, Med 1 (OBS-1, sifatnya desain untuk dikonfirmasi), Low 3 (OBS-2, OBS-3, OBS-4).
- Happy path terverifikasi: akta pembubaran nyata (PT Krisna) sampai READY lalu COMPLETED + MENUNGGU_VERIFIKATOR lewat submit. Company lookup SABH sukses (nama, status transaksi, status perseroan terisi), OLD_DATA_CONSISTENCY dan PERSEROAN_STATE PASS.
- Aturan khusus Pembubaran terverifikasi dari output langsung:
- Kuorum RUPS memang TIDAK divalidasi (tidak ada rule RUPS_ATTENDANCE_QUORUM), sesuai handoff dan kode
rules/pembubaran/index.ts:113-115.
- PEMBUBARAN_KORAN (Pasal 147) bersifat advisory: PASS dalam jendela 30 hari, WARNING bila lewat/mendahului/absen, tidak pernah FAIL (severityFloor WARNING).
- PT_ALREADY_DISSOLVED memblokir pembubaran ganda: pengajuan kedua atas PT yang sama menghasilkan FAIL yang menyebut submission sebelumnya, dan tidak bisa di-submit meski FAIL lain sudah di-override.
- Perilaku gate submit terbukti benar: bagian wajib (5 bagian: perseroan, akta_pembubaran, rups_kehadiran, identitas, data_kontak) harus disetujui lebih dulu (gate ini mendahului fail-gate), lalu tidak boleh ada FAIL tersisa (bisa di-override kecuali PT_ALREADY_DISSOLVED yang memang menahan). pengumuman_koran approvable tetapi tidak wajib.
- Rekomendasi prioritas: (1) klarifikasi apakah pembubaran seharusnya melewati voting pemegang saham (OBS-1) karena berisiko mengirim undangan voting untuk sebuah pembubaran di produksi; (2) perbaiki teks yang menyesatkan (jendela 30 vs 60, subtitle kuorum di halaman verifikator, OBS-4); (3) tambah
data-testid pada tombol review pembubaran (OBS-2).
- Gap/keterbatasan: dokumen pendukung nyata (KTP/NPWP/domisili/kliping koran) tidak tersedia sehingga sejumlah aturan ter-SKIP; jalur end-to-end verifikator sampai SELESAI belum didorong penuh (initial APPROVE masuk ke MENUNGGU_VOTING, membutuhkan hasil voting atau veto REJECT). Nama-availability/company lookup memakai DB SABH read-only sehingga hasil bergantung data registry nyata.