Blackbox Testing — Peralihan PP ke PT (PT)
- Domain: PT
- Fitur: Peralihan Perseroan Perorangan ke PT (konversi PP menjadi PT; SABH lama "Perubahan PTP")
- Role/aktor: notaris (input & finalisasi). Tidak ada tahap verifikator (flow terminal self-service).
- Tanggal uji: 2026-08-19
- Penguji (sesi): Supervisor PT
- Build/commit: 63c40a17
1. Ringkasan fitur
Peralihan PP ke PT memproses satu Akta Peralihan (akta konversi yang mengubah Perseroan Perorangan menjadi Perseroan Terbatas) beserta entitas akta bawaannya (direksi, komisaris, pemegang saham, penghadap, modal, KBLI). Notaris mengunggah akta konversi, sistem menjalankan OCR dan ekstraksi LLM lewat pipeline PENDIRIAN_PT generik, lalu menambahkan satu lapisan khusus: nama Perseroan Perorangan asal yang disebut dalam akta dicocokkan ke registri PP dan disimpan sebagai snapshot pada oldData. Delapan aturan PP_ASAL / PP_PT dijalankan di atas hasil ekstraksi. Notaris meninjau field dan kartu Data PP Asal, lalu menuntaskan lewat tombol Finalisasi. Flow ini terminal: begitu difinalisasi statusnya langsung COMPLETED tanpa antrean verifikator (di SABH lama konversi PTP juga tidak melewati verifikator), dan sistem AHU yang akan menonaktifkan PP asal (di luar lingkup PoC).
2. Full workflow
2.1 Diagram state
stateDiagram-v2
[*] --> CREATED
CREATED --> EXTRACTING: POST /api/pp/peralihan-pt/start (akta AKTA_PERALIHAN_PP_PT dipin)
EXTRACTING --> VALIDATING: OCR + ekstraksi LLM selesai
VALIDATING --> READY: matchAsalPp (cocokkan PP asal) + aturan PP_ASAL/PP_PT dijalankan
READY --> COMPLETED: POST /:id/finalize (READY + PP asal tercocok + PP asal aktif + tidak ada FAIL tersisa)
COMPLETED --> [*]
EXTRACTING --> ERROR: kegagalan OCR/ekstraksi akta
2.2 Sequence (aktor - sistem)
sequenceDiagram
actor N as Notaris
participant FE as Frontend
participant BE as Backend :47014
participant OCR as OCR/LLM
participant REG as Registri PP
N->>FE: Unggah akta konversi di /klasifikasi
FE->>BE: POST /api/klasifikasi/classify (deteksi AKTA_PERALIHAN_PP_PT)
FE->>BE: POST /api/pp/peralihan-pt/start (akta dipin, tanpa round-trip classifier)
BE->>OCR: OCR + ekstraksi field akta (async)
BE->>REG: matchAsalPp (cocokkan nama PP asal ke registri)
REG-->>BE: snapshot PP asal (auto) atau kandidat fuzzy
BE->>BE: jalankan aturan PP_ASAL / PP_PT (scoped)
FE->>BE: GET /api/pp/peralihan-pt/:id/review-data (poll ke READY)
N->>FE: Tinjau field + kartu Data PP Asal
alt PP asal tidak tercocok otomatis
N->>FE: Cari & pilih PP asal manual
FE->>BE: POST /api/pp/peralihan-pt/:id/match-pp { idPtp }
BE->>REG: snapshot PP terpilih (matchedBy manual) + re-validasi
end
N->>FE: Klik Finalisasi
FE->>BE: POST /api/pp/peralihan-pt/:id/finalize
BE->>REG: re-cek PP_ASAL_ACTIVE live
BE-->>FE: { status: COMPLETED }
2.3 Peta route & UI
| Langkah |
Route |
Komponen |
Elemen interaktif utama |
Selector |
| Unggah & klasifikasi |
/klasifikasi |
KlasifikasiPage |
dropzone/file input, deteksi konversi otomatis |
input[type=file] |
| Redirect route lama |
/pt/peralihan-pp |
Navigate |
redirect ke /klasifikasi |
(redirect) |
| Ekstraksi (step 2) |
/pt/peralihan-pp/:id/extraction |
PeralihanExtractionPage |
auto-start pipeline, progres |
(tanpa testid stabil) |
| Tinjauan (step 3) |
/pt/peralihan-pp/:id/review |
PpPeralihanPtReviewPageV2 |
konfirmasi field, kartu Data PP Asal (picker), tombol Finalisasi, banner selesai |
peralihan-finalize-button, peralihan-pt-completed-banner, pp-asal-unmatched-hint, pp-asal-candidate-*, pp-asal-search-result-* |
3. Prasyarat & data uji
| ID data |
Tipe |
Berkas |
Deskripsi |
Ekspektasi sistem |
| D-POS-50 |
Positive |
PT__peralihan-pp-pt__positive__D-POS-50__akta-peralihan.pdf |
Akta konversi PP "YES FITNESS INDONESIA" (cert AHU-024875.AH.01.30.Tahun 2024), lahir digital dengan text layer |
Ekstraksi lolos (READY), PP asal tercocok otomatis (idPtp 730554), finalisasi sampai COMPLETED |
| D-NEG-N1 |
Negative |
dibuat runtime |
Akta pendirian biasa tanpa recital PP / cert PP / klausul konversi |
PP_ASAL_RECITED FAIL, PP asal tidak tercocok, finalisasi terblokir |
| D-NEG-N2 |
Negative |
dibuat runtime |
D-POS-50 dengan nama PP asal diganti ke nama bogus |
PP_ASAL_EXISTS FAIL, tidak ada kandidat, finalisasi terblokir |
| D-GATE-G1 |
Positive (recovery) |
dibuat runtime |
Nama PP asal diganti agar auto-match gagal, lalu dipilih manual |
match-pp manual berhasil (matchedBy manual), finalisasi sampai COMPLETED |
Bukti tersimpan di e2e/artifacts/peralihan/ (results.json, results-neg.json, results-gate.json, ui-review-gate.png, ui-completed.png).
4. Matriks skenario uji
| ID |
Tipe |
Lapisan |
Langkah ringkas |
Ekspektasi |
Hasil aktual |
Status |
Bukti |
| TC-01 |
Positive |
API |
Unggah D-POS-50 lewat /start, poll |
type PERALIHAN_PP_KE_PT, status READY, 21 field akta terekstraksi |
Sesuai: READY, type benar, 21 field, 8 hasil validasi |
PASS |
results.json |
| TC-02 |
Positive |
API |
Cek match PP asal otomatis |
matchedBy auto, snapshot YES FITNESS INDONESIA, idPtp 730554 |
Sesuai |
PASS |
results.json (ppAsal) |
| TC-03 |
Positive |
API |
Dump validasi D-POS-50 |
7 PASS, 1 WARNING (PP_ASAL_SK_MATCH), 0 FAIL |
Sesuai persis |
PASS |
results.json (validation) |
| TC-04 |
Positive |
API |
Finalisasi D-POS-50 (body kosong) |
COMPLETED |
Sesuai: {status: COMPLETED} langsung |
PASS |
results.json (finalizeBeforeConfirm) |
| TC-05 |
Gate |
API |
Finalisasi sebelum READY (segera setelah /start) |
409 WRONG_STATUS |
Sesuai: "status is EXTRACTING, expected READY" |
PASS |
results-gate.json (G2) |
| TC-06 |
Gate |
API |
Registry search /registry?q=YES FITNESS |
Kembalikan ref PP |
Sesuai: 1 hasil, idPtp 730554 |
PASS |
results-gate.json (G3) |
| TC-07 |
Negative |
API |
Unggah akta pendirian biasa (tanpa recital PP) |
PP_ASAL_RECITED FAIL, finalisasi terblokir |
Sesuai: FAIL; finalisasi 409 PP_ASAL_NOT_MATCHED |
PASS |
results-neg.json (N1) |
| TC-08 |
Negative |
API |
Nama PP asal diganti bogus |
PP_ASAL_EXISTS FAIL, finalisasi terblokir |
Sesuai: FAIL "tidak sesuai registri"; finalisasi 409 PP_ASAL_NOT_MATCHED |
PASS |
results-neg.json (N2) |
| TC-09 |
Gate |
API |
match-pp manual pada deed unmatched lalu finalisasi |
matchedBy manual, lalu COMPLETED |
Sesuai: manual OK, finalisasi COMPLETED |
PASS |
results-gate.json (G1) |
| TC-10 |
Positive |
API |
Jalur classifier generik: /klasifikasi upload+classify+submissions |
Terdeteksi AKTA_PERALIHAN_PP_PT, type PERALIHAN_PP_KE_PT |
Sesuai: conf 0.9997, type benar |
PASS |
results-neg.json (N3) |
| TC-11 |
Positive |
UI |
Route lama /pt/peralihan-pp |
Redirect ke /klasifikasi |
Sesuai |
PASS |
spec peralihan-ui |
| TC-12 |
Positive |
UI |
Deep-link /pt/peralihan-pp/:id/review saat READY |
Halaman tinjauan render, kartu Data PP Asal, tombol Finalisasi ada, tanpa hint unmatched |
Sesuai |
PASS |
ui-review-gate.png |
| TC-13 |
Positive |
UI |
Buka review submission COMPLETED |
Banner selesai tampil |
Sesuai |
PASS |
ui-completed.png |
| TC-14 |
Observasi |
API |
Finalisasi tanpa mengonfirmasi field apa pun |
Server tidak wajibkan konfirmasi field |
Sesuai kode: langsung COMPLETED (lihat OBS-1) |
PASS |
results.json (finalizeBeforeConfirm) |
Ringkasan validasi D-POS-50 (8 aturan, semua selalu diemit): PP_ASAL_RECITED PASS, PP_ASAL_EXISTS PASS, PP_ASAL_ACTIVE PASS, PP_ASAL_SK_MATCH WARNING, PP_PT_NAME_PATH PASS (PADNN, nama dipertahankan), PP_PT_NAME_CONSISTENT PASS, PP_OWNER_AMONG_FOUNDERS PASS (skor 1.00), PP_PT_MIN_SHAREHOLDERS PASS (2 pemegang saham).
5. Cakupan UI (semua yang diakses user)
| Route/Elemen |
Diuji? |
Perilaku benar? |
Catatan |
/klasifikasi unggah + deteksi konversi |
Ya (API) |
Ya |
Classifier mendeteksi AKTA_PERALIHAN_PP_PT (0.9997) lalu jalur peralihan |
Redirect /pt/peralihan-pp ke /klasifikasi |
Ya |
Ya |
Route unggah lama sudah dipensiunkan |
/pt/peralihan-pp/:id/extraction |
Tidak (navigasi tidak diuji terpisah) |
- |
Auto-start pipeline; belum ada testid stabil (rekomendasi) |
/pt/peralihan-pp/:id/review render |
Ya |
Ya |
Field + kartu Data PP Asal + panel validasi tampil |
| Kartu Data PP Asal (matched) |
Ya |
Ya |
Badge "Dicocokkan otomatis", DetailGrid PP asal, NIK termasker |
| Kartu Data PP Asal (not-found picker) |
Sebagian (API) |
Ya |
match-pp manual terbukti via API (G1); chip kandidat/pencarian UI belum di-drive di browser |
| Tombol Finalisasi (gate) |
Ya |
Ya |
Tampil dan tidak terhalang saat PP asal tercocok; hint unmatched absen |
| Banner selesai |
Ya |
Ya |
peralihan-pt-completed-banner muncul setelah COMPLETED, dengan tombol Unduh Packet |
6. Temuan bug & perbaikan
| ID bug |
Severity |
Ringkas |
Reproduksi |
Ekspektasi |
Aktual |
Screenshot |
Rekomendasi perbaikan |
| OBS-1 |
Med (parity gate) |
Server /finalize tidak mewajibkan konfirmasi field |
Unggah D-POS-50, tunggu READY, POST /finalize dengan body {} tanpa konfirmasi field apa pun |
Server menolak sampai semua field dikonfirmasi (seperti gate UI submitGate) |
Langsung COMPLETED; hanya UI (submitGate + tombol disabled) yang menahan konfirmasi, server hanya cek status READY + PP asal tercocok + aktif + tidak ada FAIL |
results.json (finalizeBeforeConfirm) |
Selaraskan gate server dengan flow lain: tambahkan cek konfirmasi field di route /finalize agar konsistensi tidak bergantung pada FE. Bandingkan dengan PENDIRIAN_PT yang di server memeriksa UNCONFIRMED_FIELDS |
| OBS-2 |
Low (data/registri) |
PP_ASAL_SK_MATCH selalu WARNING pada data uji |
Unggah D-POS-50 |
Idealnya PASS bila cert cocok di registri |
WARNING karena registri PP asal tidak mengembalikan daftar cert untuk dibandingkan (data mock/read-only); rule memang advisory (tidak pernah hard-block) |
results.json |
Bukan cacat: rule sengaja advisory. Untuk uji PASS penuh perlu registri dengan tr_ptp_sertifikat_temp terisi untuk PP tersebut |
| OBS-3 |
Low (UI coverage) |
Extraction page tanpa testid stabil |
Deep-link /pt/peralihan-pp/:id/extraction |
Ada penanda stabil untuk uji UI |
Halaman auto-start tanpa data-testid |
- |
Tambah data-testid pada halaman extraction untuk uji UI yang stabil (sama seperti rekomendasi Pendirian) |
Catatan urutan gate finalisasi (bukan bug): gate struktural PP_ASAL_NOT_MATCHED dievaluasi SEBELUM gate VALIDATION_FAILED. Pada N1/N2 yang punya FAIL sekaligus PP asal belum tercocok, respons yang muncul adalah 409 PP_ASAL_NOT_MATCHED (bukan VALIDATION_FAILED). Ini benar secara desain: konversi yang belum tertaut ke PP asal tidak boleh COMPLETE. Gate VALIDATION_FAILED baru relevan bila PP asal sudah tercocok tetapi masih ada FAIL non-PP_ASAL tersisa.
7. Ringkasan & rekomendasi
- Total skenario: 14 (PASS 14 / FAIL 0). Tidak ada skenario gagal; temuan berupa observasi desain/coverage.
- Cakupan UI: 6 dari 8 elemen inti diuji langsung di browser (extraction step dan chip kandidat picker belum di-drive di browser; picker manual sudah terbukti via API).
- Bug: High 0, Med 1 (OBS-1, parity gate server vs FE), Low 2 (OBS-2 data registri, OBS-3 coverage).
- Happy path terminal COMPLETED terbukti di API (finalize langsung) dan di UI (banner selesai). Type PERALIHAN_PP_KE_PT dan status READY terverifikasi.
- Empat gate finalisasi terbukti benar: (1) WRONG_STATUS bila belum READY, (2) PP_ASAL_NOT_MATCHED bila PP asal belum tercocok, (3) re-cek PP_ASAL_ACTIVE live (PASS pada data uji, PP masih aktif), (4) VALIDATION_FAILED bila ada FAIL tersisa. Jalur pemulihan manual (match-pp) juga terbukti membawa deed yang tadinya unmatched sampai COMPLETED.
- Rekomendasi prioritas: (1) selaraskan gate konfirmasi field di server
/finalize (OBS-1) agar tidak bergantung pada UI; (2) tambah data-testid pada halaman extraction (OBS-3); (3) untuk uji PASS penuh PP_ASAL_SK_MATCH, siapkan data registri dengan nomor sertifikat PP asal terisi.
- Gap/keterbatasan: match PP asal memakai registri PP read-only/mock, sehingga hasil match dan cert bergantung data registry nyata. Nonaktifasi PP asal (status ke is_pt) bersifat display-only di PoC (di luar lingkup).