think
16px
820px

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

stateDiagram-v2 [*] --> CREATED CREATED --> EXTRACTING: POST /start EXTRACTING --> VALIDATING: OCR + ekstraksi LLM + company lookup (SABH) selesai VALIDATING --> READY: aturan validasi dijalankan (BSBHP + aturan PT bersama) READY --> COMPLETED: submit (7 bagian wajib disetujui, tidak ada FAIL tersisa) COMPLETED --> MENUNGGU_VERIFIKATOR: VerifikasiPerubahan dibuat pada transaksi submit MENUNGGU_VERIFIKATOR --> MENUNGGU_VOTING: verifikator APPROVE (e-voting pemegang saham dibuat dari roster SABH) MENUNGGU_VERIFIKATOR --> PERBAIKAN: verifikator REVISE (submission dibuka lagi ke READY) MENUNGGU_VERIFIKATOR --> DITOLAK: verifikator REJECT MENUNGGU_VOTING --> SELESAI: hasil voting memenuhi ambang (status badan hukum berakhir) MENUNGGU_VOTING --> DITOLAK: verifikator REJECT (veto) atau voting gagal PERBAIKAN --> READY: notaris memperbaiki dan kirim ulang EXTRACTING --> ERROR: kegagalan OCR/ekstraksi (transient, retry)

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)

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 6 dokumen di /klasifikasi (koreksi kategori bila perlu) FE->>BE: upload + classify tiap berkas (userOverride pada papan) FE->>BE: POST /api/submissions (infer BERAKHIRNYA_STATUS_PT) + /start BE->>OCR: ekstraksi akta (skema perubahan) + focused pass permohonan/laporan/kliping BE->>BE: company lookup SABH + jalankan validasi (BSBHP + aturan PT bersama, tanpa kuorum RUPS) N->>FE: Konfirmasi field, setujui 7 bagian wajib, override FAIL bila perlu FE->>BE: POST /api/berakhirnya/submissions/:id/sections/:key/approve N->>FE: Klik Kirim ke Verifikator FE->>BE: POST /api/berakhirnya/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 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-testid pada 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.