think
16px
820px

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).