think
16px
820px

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.