Blackbox Testing — Perbaikan Data PT (PT)
- Domain: PT
- Fitur: Perbaikan Data PT
- Role/aktor: notaris (penyusun Surat Keterangan, atestasi, pengajuan), verifikator_pt (verifikasi bertahap), admin (akses menyeluruh)
- Tanggal uji: 2026-08-19
- Penguji (sesi): Supervisor PT
- Build/commit: 63c40a17
1. Ringkasan fitur
Perbaikan Data PT mengoreksi data perseroan yang sudah terdaftar di SABH tanpa akta perubahan baru, berdasarkan Surat Keterangan/Pernyataan Perbaikan yang dibuat notaris. Notaris memilih PT dan transaksi SABH yang dikoreksi, menyusun daftar koreksi per bidang (misalnya format NPWP, alamat, modal, roster pemegang saham/direksi), lalu sistem membandingkan nilai Lama terhadap snapshot SABH dan nilai Baru terhadap dokumen pendukung. Berbeda dari flow akta, intake utamanya berbasis formulir: Surat Keterangan dibuat lewat generator, divalidasi mode draft, di-generate menjadi PDF, lalu di-seed menjadi submission Perbaikan berstatus READY. Setelah notaris menuntaskan atestasi enam butir, menyetujui tiap bagian, dan menuntaskan gate finalisasi, permohonan masuk antrean verifikator (IN_VERIFICATION) yang memutus Setujui/Tolak/Revisi.
2. Full workflow
2.1 Diagram state
2.2 Sequence (aktor - sistem)
2.3 Peta route & UI
| Langkah | Route | Komponen | Elemen interaktif utama | Selector |
|---|---|---|---|---|
| Daftar Surat Keterangan (entry) | /perbaikan/keterangan |
SuratKeteranganListPage | Buat baru, buka detail, buat Perbaikan | (tanpa testid, lihat OBS-2) |
| Generator SK | /perbaikan/keterangan/new |
SuratKeteranganGeneratorPage | PtPicker, editor koreksi, panel validasi, generate | (tanpa testid) |
| Detail SK | /perbaikan/keterangan/:id |
SuratKeteranganDetailPage | pratinjau PDF, buat Perbaikan | (tanpa testid) |
| Pilih PT (jalur upload) | /perbaikan/:id/select-pt |
PerbaikanSelectPtPage | PtPicker, Lanjutkan ke Tinjauan | (tanpa testid) |
| Unggah dokumen pendukung | /perbaikan/:id/upload |
PerbaikanUploadPage | dropzone, checklist required-docs, Lanjut | (tanpa testid) |
| Tinjauan | /perbaikan/:id/review |
PtPerbaikanReviewPageV2 | konfirmasi bagian, atestasi, panel validasi, Kirim Perbaikan | perbaikan-attestation-card (kartu atestasi); tombol Kirim tanpa testid (OBS-2) |
| Status | /perbaikan/:id/status |
PerbaikanStatusPage | ringkasan | (tanpa testid) |
| Verifikator | /verifikator/perbaikan/:id |
VerifikatorPerbaikanReviewPage | Setujui/Tolak/Revisi, advisory | (tanpa testid) |
3. Prasyarat & data uji
| ID data | Tipe | Berkas | Deskripsi | Ekspektasi sistem |
|---|---|---|---|---|
| D-POS-30 | Positive | (API) PT Agencytama, transaksi 4024050615200259, koreksi NPWP valid | SK generated lalu seed READY; koreksi format NPWP | Draft PASS, generate 200, seed READY |
| D-NEG-31 | Negative | (API) koreksi NPWP "123" | NPWP di bawah 15 digit | PERBAIKAN_NPWP_FORMAT FAIL, generate 409 |
| D-NEG-32 | Negative | (submission) NPWP tanpa dokumen NPWP diunggah | Dokumen pendukung wajib belum ada | PERBAIKAN_DOC_REQUIRED_PRESENT FAIL, submit terblokir |
| Real-scan | Positive/OCR | e2e/data/real-intake/pt/perbaikan/ (Surat Pernyataan + Surat Kuasa + Surat Permohonan PT Agencytama) |
Scan asli untuk jalur multipart | Jalur multipart gagal di select-company (BUG-01) |
4. Matriks skenario uji
| ID | Tipe | Lapisan | Langkah ringkas | Ekspektasi | Hasil aktual | Status | Bukti |
|---|---|---|---|---|---|---|---|
| TC-01 | Positive | API | Cari PT Agencytama di SABH | Ketemu perseroanId 1135652 | Sesuai: satu kandidat AGENCYTAMA MARITIM NUSANTARA | PASS | probe log |
| TC-02 | Positive | API | Snapshot transaksi 4024050615200259 | Roster + modal + KBLI terisi | Sesuai: 4 pemegang saham, 1 direksi, 1 komisaris, modal terisi | PASS | probe log |
| TC-03 | Positive | API | Buat SK + patch koreksi NPWP valid, cek validasi draft | 3 PASS, 3 SKIPPED, tidak blokir | Sesuai: pass 3 / skipped 3 / blocked false | PASS | probe log |
| TC-04 | Negative | API | Patch NPWP "123", cek validasi draft | PERBAIKAN_NPWP_FORMAT FAIL, blocked | Sesuai: fail 1, "NPWP harus 15-16 digit", blocked true | PASS | probe log |
| TC-05 | Gate | API | Generate SK saat ada FAIL | 409 validation_failed | Sesuai: HTTP 409, error validation_failed, blocked true | PASS | probe log |
| TC-06 | Positive | API | Generate SK setelah NPWP valid | 200, docx + pdf dihasilkan | Sesuai: HTTP 200, pdfPath terisi | PASS | probe log |
| TC-07 | Positive | API | Seed Perbaikan dari SK generated | 201 submissionId, status READY | Sesuai: READY, 1 koreksi NPWP, oldData terisi | PASS | probe log |
| TC-08 | State | API | Seed dari SK yang sama lagi | 409 SK_ALREADY_USED + existingSubmissionId | Sesuai: 409, code SK_ALREADY_USED | PASS | probe log |
| TC-09 | State | API | Seed dari SK berstatus DRAFT | 400 not yet GENERATED | Sesuai: 400 "not yet GENERATED" | PASS | probe log |
| TC-10 | Aturan | API | Cek validasi submission mode pada seed | DOC_REQUIRED FAIL (tanpa dokumen NPWP), LAMA_VS_SABH PASS | Sesuai: DOC_REQUIRED FAIL, SIMPLE_LAMA_VS_SABH PASS | PASS | probe log |
| TC-11 | Gate | API | Submit tanpa apa-apa | 409 dengan blocker SECTION_NOT_APPROVED, ATTESTATION_INCOMPLETE, UNRESOLVED_FAIL_VALIDATION | Sesuai persis | PASS | probe log |
| TC-12 | Gate | API | Section approve NPWP saat FAIL scoped belum di-override | 409 unresolved_fail | Aktual: 200 OK (guard per-section tidak menyala, lihat BUG-02) | FAIL | probe log |
| TC-13 | Gate | API | Override DOC_REQUIRED FAIL lalu submit lengkap (approve + 6 atestasi) | 200, status IN_VERIFICATION | Sesuai: 200, IN_VERIFICATION, verifikasi MENUNGGU_VERIFIKATOR | PASS | probe log |
| TC-14 | State | API | Mutasi atestasi saat IN_VERIFICATION | 409 WRONG_STATUS | Sesuai: 409, code WRONG_STATUS | PASS | probe log |
| TC-15 | State | API | Submit ulang saat IN_VERIFICATION | 409 WRONG_STATUS | Sesuai: 409 "hanya dapat dikirim dari status READY" | PASS | probe log |
| TC-16 | Negative | API | Verifikator decide tanpa note/verifikatorId | 400 validation | Sesuai: 400, issues note + verifikatorId wajib | PASS | probe log |
| TC-17 | Positive | API | Verifikator APPROVE | status COMPLETED, verifikasi SELESAI | Sesuai: COMPLETED, SELESAI, decision APPROVE | PASS | probe log |
| TC-18 | State | API | Decide ulang setelah final | Ditolak | Sesuai: 409 SUBMISSION_LOCKED (lock global COMPLETED mendahului guard ALREADY_DECIDED, lihat OBS-3) | PASS | probe log |
| TC-19 | Positive | API | Verifikator advisory (LLM) | Objek saran terstruktur | Sesuai: 200, keys ringkasan/kekuatanPermohonan/perhatian/rekomendasi/... | PASS | probe log |
| TC-20 | Positive | API | Verifikator REVISE | status READY, atestasi + approval + override direset | Sesuai: READY, verifikasi PERBAIKAN, 6 atestasi false, section unapproved, override kosong | PASS | probe log |
| TC-21 | Negative | API | Multipart POST /perbaikan tanpa surat_pernyataan | 400 file required | Sesuai: 400 "surat_pernyataan_perbaikan file is required" | PASS | probe log |
| TC-22 | Negative | API | Multipart upload scan asli lalu select-company | Jalur OCR sampai READY | Aktual: 500 di select-company (Surat Pernyataan rawText NULL, lihat BUG-01), submission tersangkut EXTRACTING | FAIL | probe log |
| TC-23 | Positive | UI | Buka /perbaikan/keterangan sebagai notaris |
Halaman render | Sesuai render | PASS | ui-keterangan-list.png |
| TC-24 | Positive | UI | Buka /perbaikan/:id/review submission READY |
Render + kartu atestasi tampil | Sesuai: perbaikan-attestation-card visible |
PASS | ui-review.png |
| TC-25 | Positive | UI | Buka /verifikator/perbaikan/:id submission IN_VERIFICATION |
Render panel verifikator | Sesuai render | PASS | ui-verifikator.png |
5. Cakupan UI
| Route/Elemen | Diuji? | Perilaku benar? | Catatan |
|---|---|---|---|
/perbaikan/keterangan daftar SK |
Ya (render) | Ya | Entry point; navigasi ke generator/detail/review lewat tombol tanpa testid |
/perbaikan/keterangan/new generator |
Sebagian | Ya (via API) | Editor koreksi + validasi draft diuji di API (TC-03..06); UI belum diklik penuh |
/perbaikan/keterangan/:id detail |
Tidak | - | Pratinjau PDF; belum didorong di UI |
/perbaikan/:id/select-pt |
Tidak (UI) | - | Bagian jalur upload; select-company diuji di API |
/perbaikan/:id/upload |
Tidak (UI) | - | Unggah dokumen pendukung lewat /api/submissions/:id/upload + required-docs |
/perbaikan/:id/review render |
Ya | Ya | Kartu atestasi (perbaikan-attestation-card) tampil; panel validasi + bagian koreksi |
| Tombol Kirim Perbaikan (gate) | Sebagian | Ya | Tanpa data-testid (OBS-2); gate lewat approval/atestasi/FAIL diuji di API |
| Panel verifikator (Setujui/Tolak/Revisi) | Ya (render) | Ya | Keputusan APPROVE/REJECT/REVISE diuji end-to-end di API (TC-17/20) |
6. Temuan bug & perbaikan
| ID bug | Severity | Ringkas | Reproduksi | Ekspektasi | Aktual | Screenshot | Rekomendasi perbaikan |
|---|---|---|---|---|---|---|---|
| BUG-01 | High | Jalur intake multipart (POST /api/perbaikan) gagal end-to-end |
1. Upload Surat Pernyataan scan via multipart 2. select-company | select-company memproses OCR lalu READY | 500 di select-company; Surat Pernyataan tidak pernah di-OCR (rawText NULL) sehingga runSuratPernyataanExtraction melempar; submission tersangkut EXTRACTING |
probe log | Tambahkan pass OCR untuk SURAT_PERNYATAAN_PERBAIKAN sebelum ekstraksi LLM (mirip runSupportingDocExtraction), atau tolak upload multipart bila jalur belum siap. Catatan: UI tidak memakai jalur ini (selalu lewat generator SK), jadi dampak ke user saat ini kecil, tapi endpoint publik terbuka dan meninggalkan status kotor |
| BUG-02 | Med | Guard FAIL per-bagian di section-approve tidak menyala | 1. Seed READY dengan DOC_REQUIRED FAIL 2. POST sections/NPWP/approve tanpa override | 409 unresolved_fail | 200 OK, filter membaca details.correctionId/details.fieldKeys top-level, padahal persistResults menyimpan correctionId di dalam details.instances[] sehingga tidak pernah cocok |
probe log | Samakan bentuk baca: filter di endpoint approve harus menelusuri details.instances[].correctionId (bukan details.correctionId). Gate submit tetap menangkap via UNRESOLVED_FAIL_VALIDATION, jadi bukan bypass, tapi UX approve menyesatkan |
| OBS-2 | Low | Tombol Kirim Perbaikan dan tombol daftar SK tanpa data-testid |
Buka review/daftar SK | Selector stabil untuk uji | Tombol Button biasa; hanya kartu atestasi punya perbaikan-attestation-card |
ui-review.png | Tambah data-testid="perbaikan-submit-button" dan testid pada tombol daftar SK, samakan pola dengan pt-finalize-button |
| OBS-3 | Info | Decide ulang setelah final ditolak oleh lock global, bukan guard handler | Decide APPROVE lalu decide lagi | Ditolak | 409 SUBMISSION_LOCKED (middleware COMPLETED-lock) mendahului guard ALREADY_DECIDED di handler | probe log | Bukan bug: dua-duanya memblokir. Catat agar pesan konsisten bila submission belum COMPLETED (mis. setelah REJECT, guard ALREADY_DECIDED yang menangani) |
| OBS-4 | Info | Audit verifikator tidak muncul di endpoint logs | Decide lalu GET verifikasi/logs | auditEvents berisi keputusan | decisionLogs terisi, auditEvents kosong (decide memakai recordAuditEvent tingkat submission, bukan VerifikasiPerbaikanAuditEvent; hanya advisory menulis ke tabel itu) | probe log | Bila panel verifikator perlu menampilkan riwayat keputusan di auditEvents, tulis juga VerifikasiPerbaikanAuditEvent pada decide; jika cukup dari decisionLogs, biarkan |
Severity: High = blokir alur/kehilangan data/salah hasil; Med = salah perilaku tapi ada workaround; Low = kosmetik/teks.
7. Ringkasan & rekomendasi
- Total skenario: 25 (PASS 23 / FAIL 2). Dua FAIL adalah temuan nyata: BUG-01 (jalur multipart) dan BUG-02 (guard section-approve).
- Cakupan UI: tiga surface utama (daftar Surat Keterangan, review notaris dengan kartu atestasi, review verifikator) render dan terbukti lewat Playwright. Editor generator dan halaman upload diuji dari sisi API/kode, belum diklik penuh di UI.
- Bug: High 1 (BUG-01), Med 1 (BUG-02), Low 1 (OBS-2), 2 catatan info (OBS-3, OBS-4).
- Alur end-to-end terbukti penuh lewat jalur generator SK: buat SK, koreksi, validasi draft, generate (dengan gate FAIL), seed READY, override + approve + atestasi enam butir, submit ke IN_VERIFICATION, lalu verifikator APPROVE (COMPLETED) dan REVISE (kembali READY dengan reset). Semua dijalankan dengan data SABH nyata (PT Agencytama, transaksi 2024).
- Perbedaan penting vs flow akta lain: intake berbasis formulir (bukan akta-first), validator memancarkan aturan dinamis per-koreksi plus rollup, dan snapshot SABH ("Lama") dibekukan saat SK dibuat. NPWP/email-telp adalah koreksi khusus Perseroan; varian EMAIL_NO_TELP bersifat eksklusif (tidak boleh digabung bidang lain).
- Gap/keterbatasan: (1) Jalur multipart
POST /api/perbaikanbelum jalan (BUG-01), perlu OCR pass pada Surat Pernyataan sebelum bisa dipakai untuk uji OCR scan asli end-to-end. (2) Guard FAIL per-bagian (BUG-02) perlu perbaikan pembacaan details. (3) Company lookup di flow ini adalah pilihan manual lewat PtPicker (bukan interstitial AWAITING_COMPANY_SELECTION seperti Perubahan), jadi tidak ada state multi-match yang perlu diuji. (4) Enforcement role verifikator dalam mode shadow di lingkungan ini, sehingga guard 403 hanya tercatat would-deny; perlu SECURITY_ENFORCE=on untuk uji penolakan role sebenarnya.