Blackbox Testing — Berakhirnya Status Badan Hukum (PT)
- Domain: PT
- Fitur: Berakhirnya Status Badan Hukum PT
- Role/aktor: notaris (input & pengajuan), verifikator_pt (verifikasi bertahap), admin (akses menyeluruh)
- Tanggal uji: 2026-08-21
- Penguji (sesi): Supervisor PT (sub-supervisor Berakhirnya)
- Build/commit: e42453a6
1. Ringkasan fitur
Berakhirnya Status Badan Hukum adalah langkah administratif terakhir sesudah pembubaran dan likuidasi PT selesai: status badan hukum perseroan resmi berakhir (dasar UUPT Pasal 143, 149, dan 152). Notaris mengunggah satu paket berisi enam dokumen (Akta Berakhirnya, Berita Acara RUPS, Surat Permohonan, Laporan Akhir Likuidasi, serta kliping koran Pasal 149 dan Pasal 152) melalui papan Klasifikasi. Sistem menjalankan OCR dan ekstraksi LLM (akta memakai skema extractor Perubahan lewat override, ditambah focused pass untuk surat permohonan, laporan likuidasi, dan kliping koran), mencocokkan perseroan dengan data SABH (company lookup satu sumber), lalu menjalankan validasi berbasis snapshot registri. Yang khas Berakhirnya: ada gerbang prasyarat BSBHP_REGISTRY_STATE yang menuntut pembubaran PT sudah disetujui lebih dulu di SABH, aturan urutan dan jendela pengumuman koran (Pasal 149 mendahului RUPS, Pasal 152 maksimal 30 hari sesudah RUPS) yang bersifat peringatan, dan jendela tanggal akta 30 hari (parity SABH, dapat di-override). Seperti Pembubaran, flow ini bertahap lewat verifikator: setelah notaris menyetujui tiap bagian wajib dan menekan Kirim, permohonan menjadi COMPLETED sekaligus membuat antrean verifikator (MENUNGGU_VERIFIKATOR).
2. Full workflow
2.1 Diagram state
Catatan: penghitungan akhir hasil voting (ambang persetujuan, auto-reject undangan kedaluwarsa) ditangani oleh voting sweeper dan respons tiap pemegang saham lewat tautan voting. Pada mode demo (SMTP tidak diset, default runtime PoC) undangan tidak benar-benar dikirim; baris voting tetap dibuat dengan emailSent=false dan tautan dibagikan manual.
2.2 Sequence (aktor - sistem)
2.3 Peta route & UI
| Langkah | Route | Komponen | Elemen interaktif utama | Selector |
|---|---|---|---|---|
| Unggah & klasifikasi | /klasifikasi |
KlasifikasiPage | file input, kartu dokumen, koreksi kategori | input[type=file] |
| Ekstraksi (step 2) | /berakhirnya/:submissionId/extraction |
BerakhirnyaExtractionPage | auto-start pipeline, tombol Lanjut ke Tinjauan, modal pilih perusahaan | (tanpa data-testid) |
| Tinjauan (step 3) | /berakhirnya/:submissionId/review |
BerakhirnyaReviewPage | konfirmasi field, editor manual permohonan/laporan, kartu kliping, roster kehadiran, tombol Setujui tiap bagian, panel validasi, tombol Kirim ke Verifikator | berakhirnya-submit-button, berakhirnya-submit-confirm |
| Status (step 4) | /berakhirnya/:submissionId/status |
BerakhirnyaStatusPage | ringkasan status verifikasi | (tanpa data-testid) |
| Verifikator | /verifikator lalu /verifikator/berakhirnya/:id |
VerifikatorDashboardPage, VerifikatorBerakhirnyaReviewPage | Setujui/Tolak/Revisi (DecisionPanel), panel PDF sumber | (tanpa data-testid) |
3. Prasyarat & data uji
Paket nyata (6 dokumen, PT Global Putra Utama) tersedia di e2e/data/real-intake/pt/berakhirnya/. Classifier mentah salah melabeli sebagian berkas (koran menjadi OTHER, laporan menjadi AKTA_RUPS_TAHUNAN, notulen menjadi AKTA_PEMBUBARAN, surat permohonan menjadi BERITA_ACARA_RUPS). Di papan Klasifikasi notaris menyeret tiap kartu ke kategori yang benar; pada lapisan API hal ini direplikasi lewat userOverride (ground truth dari nama berkas). Ini menunjukkan classifier berfungsi sebagai pagar bantu, bukan penentu akhir.
| ID data | Tipe | Berkas | Klasifikasi (setelah koreksi) | Ekspektasi sistem |
|---|---|---|---|---|
| D-POS-01 | Positive | Salinan Akta Pembubaran Tahap 2 PT GPU No. 01 (03-08-2026) | AKTA_BERAKHIRNYA | Akta utama flow, memicu routing berakhirnya |
| D-POS-02 | Positive | Surat Permohonan Berakhirnya Status Badan Hukum PT GPU | SURAT_PERMOHONAN | Focused pass permohonan (nomor, tanggal, nama perseroan) |
| D-POS-03 | Positive | Laporan Hasil Akhir Likuidasi PT Global Putra Utama | LAPORAN_LIKUIDASI | Focused pass laporan (likuidator, nomor, tanggal, sisa kekayaan) |
| D-POS-04 | Positive | Koran Pasal 149 PT Global Putra Utama | BUKTI_PENGUMUMAN_149 | Kliping Pasal 149 (pemberitahuan kreditor) |
| D-POS-05 | Positive | Koran Pasal 152 PT Global Putra Utama | BUKTI_PENGUMUMAN_152 | Kliping Pasal 152 (hasil akhir likuidasi) |
| D-POS-06 | Positive | RUPS Notulen Pembubaran PT GPU (Dalam Likuidasi) | BERITA_ACARA_RUPS | Risalah RUPS, sumber tanggal RUPS dan roster kehadiran |
Catatan data: KTP/NPWP likuidator tidak tersedia dalam paket ini, sehingga aturan berbasis dokumen identitas ter-SKIP secara wajar (bukan cacat), dan bagian identitas_likuidator memang tidak wajib. Bukti tersimpan di docs/blackbox-testing/report/img/berakhirnya-01-review.png dan berakhirnya-02-verifikator.png.
4. Matriks skenario uji
| ID | Tipe | Lapisan | Langkah ringkas | Ekspektasi | Hasil aktual | Status | Bukti |
|---|---|---|---|---|---|---|---|
| TC-01 | Positive | API | Drive paket 6 dokumen ke terminal | type BERAKHIRNYA_STATUS_PT, READY | Sesuai: type BERAKHIRNYA_STATUS_PT, terminal READY | PASS | probe log |
| TC-02 | Aturan | API | Company lookup SABH | Perseroan ter-resolve | Sesuai: nama "GLOBAL PUTRA UTAMA", statusTransaksi 1, tertutup | PASS | probe log |
| TC-03 | Aturan | API | Kelengkapan paket (BSBHP_REQUIRED_DOCS) | 6 dokumen wajib lengkap | Sesuai: "Paket 6 dokumen lengkap" PASS | PASS | probe log |
| TC-04 | Aturan | API | Prasyarat pembubaran di SABH (BSBHP_REGISTRY_STATE) | PASS bila pembubaran sudah disetujui | Sesuai: "Pembubaran PT telah disetujui di SABH (id_aksi 12, status 1)" PASS | PASS | probe log |
| TC-05 | Aturan | API | Konsistensi nama likuidator (BSBHP_LIKUIDATOR_CONSISTENCY) | Nama laporan cocok dengan penghadap akta/KTP | Sesuai: cocok "BELLY DJALIEL" skor 100 PASS | PASS | probe log |
| TC-06 | Aturan | API | Kuorum kehadiran RUPS | Tidak divalidasi (di luar cakupan) | Sesuai: tidak ada rule RUPS_ATTENDANCE_QUORUM di hasil | PASS | probe log + kode |
| TC-07 | Aturan | API | Jendela tanggal akta (AKTA_DATE_WINDOW) | PASS dalam 30 hari | Sesuai: "Tanggal akta 2026-08-03 (18 hari lalu)" PASS (jendela 30 hari) | PASS | probe log |
| TC-08 | Aturan | API | Urutan pengumuman koran (BSBHP_PENGUMUMAN_ORDER) | WARNING bila urutan tidak sesuai (bukan FAIL) | Sesuai: "Pengumuman Ps.149 (4 Agustus 2026) tidak mendahului RUPS" WARNING | PASS | probe log |
| TC-09 | Aturan | API | Jendela Pasal 152 (BSBHP_PENGUMUMAN_152_WINDOW) | WARNING bila tak terbaca/lewat (bukan FAIL) | Sesuai: "Ps.152 (MEDIA INDONESIA): tanggal tidak terbaca" WARNING | PASS | probe log |
| TC-10 | Aturan | API | Kewajaran tanggal dokumen (BSBHP_DOC_DATE_SANITY) | WARNING bila urutan tanggal janggal | Sesuai: "laporan likuidasi bertanggal SETELAH RUPS" WARNING | PASS | probe log |
| TC-11 | Aturan | API | Sisa kekayaan terisi (BSBHP_SISA_KEKAYAAN_PRESENT) | WARNING bila tak terbaca | Sesuai: "Sisa kekayaan tidak terbaca, isi manual (boleh 'nihil')" WARNING | PASS | probe log |
| TC-12 | Aturan | API | Rujukan akta pembubaran (BSBHP_PEMBUBARAN_REF) | SKIPPED bila rujukan terbaca (cross-check belum tersedia) | Sesuai: rujukan terbaca "No. 0026273, 05-03-2025", verifikasi silang belum tersedia SKIPPED | PASS | probe log |
| TC-13 | Aturan | API | Pembubaran tercatat di PoC (BSBHP_PEMBUBARAN_PREREQ) | WARNING (bukan penghalang) | Sesuai: "Tidak ada Pembubaran PT tercatat di PoC" WARNING | PASS | probe log |
| TC-14 | Gate | API | Submit tanpa menyetujui bagian | 400 SECTIONS_UNAPPROVED | Sesuai: 7 bagian wajib diminta (data_perseroan, akta_berakhirnya, risalah_rups, surat_permohonan, laporan_likuidasi, pengumuman_149, pengumuman_152) | PASS | probe log |
| TC-15 | Gate | API | Setujui bagian tak dikenal | 400 Unknown section | Sesuai: "Unknown section: bogus" | PASS | probe log |
| TC-16 | Positive | API | Setujui 7 bagian wajib lalu submit (0 FAIL) | 200 COMPLETED + MENUNGGU_VERIFIKATOR | Sesuai: {status: COMPLETED}, VerifikasiPerubahan MENUNGGU_VERIFIKATOR |
PASS | probe log |
| TC-17 | Gate | API | Submit lagi saat sudah COMPLETED | 409 WRONG_STATUS | Sesuai: "submission cannot be edited in its current status" | PASS | probe log |
| TC-18 | Verifikator | API | decide tanpa notes / tanpa verifikatorId | 400 | Sesuai: "Notes required" lalu "verifikatorId required" | PASS | probe log |
| TC-19 | Verifikator | API | Initial APPROVE | Transisi ke voting | Sesuai: MENUNGGU_VOTING; 2 baris voting pemegang saham dibuat dari roster SABH (BELLY DJALIEL 50%, SUGANDA KUSUMA 50%, emailSent=false demo), lihat OBS-1 | PASS (perilaku), lihat OBS-1 | probe log |
| TC-20 | Verifikator | API | REVISE saat status MENUNGGU_VOTING | Ditolak | Sesuai: "Hanya REJECT yang diizinkan saat status MENUNGGU_VOTING (veto verifikator)" | PASS | probe log |
| TC-21 | Positive | UI | Deep-link /berakhirnya/:id/review sebagai notaris |
Halaman render, tombol Kirim tergate | Sesuai render; berakhirnya-submit-button visible + disabled saat bagian belum disetujui |
PASS | img/berakhirnya-01-review.png |
| TC-22 | Positive | UI | Deep-link /verifikator/berakhirnya/:id sesudah submit |
Halaman verifikator render, panel keputusan tampil | Sesuai render: likuidator, pengumuman, kehadiran, panel validasi, tombol Setujui/Tolak/Revisi, panel PDF | PASS | img/berakhirnya-02-verifikator.png |
Ringkasan validasi happy path (D-POS, 6 dokumen): 7 PASS, 5 WARNING, 7 SKIPPED, 0 FAIL. PASS: BSBHP_REQUIRED_DOCS, BSBHP_REGISTRY_STATE, BSBHP_LIKUIDATOR_CONSISTENCY, BSBHP_NAMA_PT_DOCS, NPWP_COMPLETENESS, OLD_DATA_CONSISTENCY, AKTA_DATE_WINDOW. WARNING: BSBHP_PENGUMUMAN_ORDER, BSBHP_PENGUMUMAN_152_WINDOW, BSBHP_DOC_DATE_SANITY, BSBHP_SISA_KEKAYAAN_PRESENT, BSBHP_PEMBUBARAN_PREREQ. SKIPPED: BSBHP_PEMBUBARAN_REF, NIK_KTP_AKTA, NAMA_NPWP_KTP, KTP_COMPLETENESS, NAMA_PT_CONSISTENCY, NPWP_PERSEROAN_FUZZY, NOTARIS_TERAKHIR.
5. Cakupan UI (semua yang diakses user)
| Route/Elemen | Diuji? | Perilaku benar? | Catatan |
|---|---|---|---|
/klasifikasi unggah 6 dokumen |
Ya (via API drive) | Ya | Classifier mentah salah label, dikoreksi lewat userOverride (papan), routing BERAKHIRNYA_STATUS_PT benar |
/berakhirnya/:id/extraction |
Tidak (navigasi) | - | Auto-start pipeline; tanpa data-testid stabil |
/berakhirnya/:id/review render |
Ya | Ya | Data perseroan, akta, risalah RUPS, surat permohonan, laporan likuidasi, kliping 149/152, identitas, panel validasi tampil |
| Tombol Setujui tiap bagian | Sebagian (API) | Ya | Diuji di API (approve 7 bagian + unknown section); tombol UI tanpa data-testid |
| Tombol Kirim ke Verifikator (gate) | Ya | Ya | berakhirnya-submit-button visible + disabled saat bagian belum disetujui (READY) |
| Dialog konfirmasi Kirim | Tidak (UI) | - | berakhirnya-submit-confirm tersedia; submit didorong lewat API |
| Panel verifikator (Setujui/Tolak/Revisi) | Ya (render) | Ya | Halaman render lengkap; keputusan (APPROVE/REVISE + validasi body) diuji di API |
/berakhirnya/: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 berakhirnya memicu e-voting pemegang saham | Submit berakhirnya, verifikator initial APPROVE | Status badan hukum berakhir adalah langkah administratif sesudah pembubaran; pemegang saham sudah memutuskan pembubaran di RUPS sebelumnya | Status pindah ke MENUNGGU_VOTING dan 2 baris ShareholderVote dibuat dari roster SABH. Berbeda dengan Pembubaran yang sudah diperbaiki (OBS-1 pembubaran, APPROVE langsung SELESAI tanpa voting), Berakhirnya masih melewati jalur voting. Di mode non-demo undangan voting benar-benar dikirim untuk sebuah berakhirnya | probe log | Konfirmasikan apakah Berakhirnya perlu e-voting. Bila tidak (paralel dengan keputusan Pembubaran), tambahkan BERAKHIRNYA_STATUS_PT ke logika skipVoting di routes/verifikator.ts agar initial APPROVE langsung SELESAI |
| OBS-2 | Low | Sebagian besar tombol review/verifikator tanpa data-testid | Buka /berakhirnya/:id/review dan halaman verifikator |
Selector stabil untuk uji UI | Tombol Setujui bagian dan tombol keputusan verifikator memakai teks biasa. Tombol submit sudah punya berakhirnya-submit-button/berakhirnya-submit-confirm |
img/berakhirnya-01-review.png | Tambah data-testid pada tombol Setujui bagian (mis. berakhirnya-approve-<key>) dan tombol keputusan verifikator, samakan pola dengan tombol submit yang sudah ada |
| OBS-3 | Low (data) | Beberapa field wajib SABH tidak terbaca OCR | Lihat WARNING sisa kekayaan dan tanggal Pasal 152 | Field terbaca otomatis | Sisa kekayaan dan tanggal kliping Pasal 152 tidak terbaca (WARNING, harus diisi manual). Bukan cacat sistem, tetapi menandakan kliping koran adalah permukaan OCR terlemah | probe log | Sediakan panduan input manual yang jelas pada editor kliping dan field sisa kekayaan; pertimbangkan focused pass tambahan untuk kliping |
Severity: High = blokir alur/kehilangan data/salah hasil; Med = salah perilaku tapi ada workaround; Low = kosmetik/teks.
7. Ringkasan & rekomendasi
- Total skenario: 22 (PASS 22 / FAIL 0). Satu di antaranya (TC-19) PASS secara perilaku tetapi memunculkan temuan desain OBS-1.
- Cakupan UI: halaman review (notaris) dan halaman verifikator terbukti render penuh di browser; approve/submit/decide serta seluruh gerbang diuji di API.
- Bug: High 0, Med 1 (OBS-1 e-voting pada berakhirnya, butuh keputusan paritas dengan Pembubaran), Low 2 (OBS-2 data-testid, OBS-3 field OCR tak terbaca).
- Happy path terverifikasi: paket nyata PT Global Putra Utama sampai READY lalu COMPLETED + MENUNGGU_VERIFIKATOR lewat submit. Company lookup SABH sukses (nama, status transaksi, status perseroan terisi), OLD_DATA_CONSISTENCY dan BSBHP_REGISTRY_STATE PASS.
- Aturan khusus Berakhirnya terverifikasi dari output langsung:
- Prasyarat BSBHP_REGISTRY_STATE benar: menuntut pembubaran PT sudah disetujui di SABH (id_aksi 12, status 1) sebelum berakhirnya boleh diproses; menggantikan PERSEROAN_STATE umum.
- Kuorum RUPS memang TIDAK divalidasi (tidak ada rule RUPS_ATTENDANCE_QUORUM), sesuai desain: kehadiran RUPS pembebasan sudah divalidasi pada tahap Pembubaran.
- Aturan pengumuman koran (urutan Pasal 149 sebelum RUPS, jendela Pasal 152 maksimal 30 hari) bersifat advisory: WARNING, tidak pernah FAIL (severityFloor WARNING).
- Jendela tanggal akta 30 hari (parity SABH, di-set eksplisit di
berakhirnya-context.ts), dapat di-override dengan alasan. Berbeda dari Pendirian yang 60 hari dan terkunci. - Perilaku gate submit terbukti benar: 7 bagian wajib (data_perseroan, akta_berakhirnya, risalah_rups, surat_permohonan, laporan_likuidasi, pengumuman_149, pengumuman_152) harus disetujui lebih dulu (gate ini mendahului fail-gate), lalu tidak boleh ada FAIL tersisa. Bagian identitas_likuidator approvable tetapi tidak wajib.
- Rekomendasi prioritas: (1) putuskan apakah Berakhirnya perlu e-voting pemegang saham (OBS-1), sejalan dengan keputusan Pembubaran, karena berisiko mengirim undangan voting di produksi; (2) tambah
data-testidpada tombol Setujui bagian dan keputusan verifikator (OBS-2); (3) perkuat panduan input manual untuk field yang kerap tak terbaca OCR (OBS-3). - Gap/keterbatasan: dokumen identitas nyata (KTP/NPWP likuidator) 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). Company lookup memakai DB SABH read-only sehingga hasil bergantung data registry nyata.