# Status fitur dan pemeriksaan

## Status deployment

Source dan arsip versi 1 tersimpan, tetapi deployment privat **gagal** dengan pesan `incomplete input: SQLITE_ERROR`. Belum ada URL aktif. Migrasi gagal diduga berkaitan dengan parser trigger SQLite; layanan tidak mengungkap berkas atau batas migrasi yang diterapkan. Pemeriksaan database hosting tidak mengembalikan binding atau tabel, sehingga riwayat migrasi dipertahankan. Panduan lanjutan ada pada `migrasi-hosting.md`.

## Implementasi

| Bagian | Status penyerahan |
|---|---|
| Halaman publik, lima program, target awal | Implementasi lengkap, database persisten |
| CMS, galeri, progres, draft/preview/publish | Implementasi lengkap; file R2 dan versi D1 |
| Transfer manual tanpa akun | Kode berfungsi dalam uji; rekening produksi sengaja belum aktif |
| Verifikasi dan buku keuangan | Ditegakkan oleh role, transaksi, constraint, dan trigger |
| Login admin | Identitas ChatGPT melalui Sites, bukan sandi aplikasi sendiri |
| Faktor kedua | TOTP server, secret terenkripsi, recovery sekali pakai; pemilik perlu enrollment |
| Versi dan konflik pengeditan | Snapshot, perbandingan, preview, restore draft baru, pemeriksaan revisi |
| Rekonsiliasi bank | CSV/manual, mapping, preview, referensi unik, kandidat duplikat, alokasi |
| Backup terenkripsi | Kode dan Worker terpisah lengkap; layanan produksi belum terhubung |
| Jadwal harian | Logika dan cron disiapkan serta diuji lokal; belum berjalan pada produksi |
| Pemulihan | Database/file berhasil dipulihkan ke lingkungan terpisah pada uji; dashboard merge dan operator full restore |
| QRIS/VA, bank otomatis, notifikasi eksternal | Belum terintegrasi dan tetap nonaktif |
| Proposal dan dokumentasi pembangunan | Belum diberikan; keadaan kosong yang jelas |
| Akreditasi, siswa, legalitas, pengurus, lokasi peta | Tidak dipublikasikan tanpa konfirmasi |

Aplikasi **belum dinyatakan siap rilis penggalangan dana produksi**. Aktivasi rekening, akun pemilik/keuangan dengan faktor kedua, pemasangan cron/storage terpisah, uji restore produksi pada resource uji, dan pemeriksaan browser masih diperlukan. Integrasi pembayaran otomatis dapat menyusul.

## Hasil yang telah dijalankan

TypeScript lulus. Build Worker/Vinext berhasil. Uji backend menggunakan Miniflare dengan D1/R2 terpisah. Hasil terakhir tercatat di `hasil-uji.json`: **25 kasus lulus**. Tidak ada data uji yang dimasukkan ke database produksi.

Uji meliputi target/seed, rekening belum aktif, hak akses, TOTP RFC 6238, enkripsi, validasi berkas, nominal bebas, token status, privasi, impor, pencocokan, verifikasi berulang/serentak, saldo, peran editor, kewajiban keuangan 2FA, draft/publish dan konflik, pemulihan versi, kode pemulihan sekali pakai, pemulihan database/file, alokasi, pengiriman cadangan terenkripsi, pemulihan file hilang, idempotensi pekerjaan harian, serta instruksi tetap dan pemisahan mutasi setelah pergantian rekening.

Render Worker lulus pada sembilan route: beranda, program, detail bangunan, progres, laporan, tentang, donasi, privasi, dan admin. CSS menyediakan breakpoint 650, 900, 1.150, dan 1.400 px, label, focus keyboard, reduced motion, safe-area, dialog dengan pengelolaan fokus, serta jarak untuk tombol donasi tetap.

Browser UI QA tidak dapat dijalankan karena kemampuan browser yang diwajibkan workflow lingkungan tidak tersedia. Render server dan CSS bukan pengganti pengujian interaksi browser atau audit aksesibilitas penuh. Uji aktual ponsel/desktop tercantum pada panduan sebelum rilis publik.

## Pemetaan kriteria penerimaan

| No. | Bukti / batas saat ini |
|---|---|
| 1 | Nominal 12.345 dan 5.000 diproses tanpa akun pada uji; produksi menunggu konfirmasi rekening |
| 2 | Unggah bukti menghasilkan waiting_verification; receipt tetap nol sebelum verifikasi |
| 3 | Verifikasi serentak dan berulang hanya satu receipt; callback merchant belum tersedia |
| 4 | ID transaksi dan token lain ditolak; token acak 256 bit |
| 5 | Kontak/pesan privat tidak muncul pada public API; media privat ditolak |
| 6 | API verifikasi/rekening editor ditolak, termasuk akses bukti |
| 7 | File R2 dan publikasi D1 dapat dibaca sesi/lingkungan terpisah; tidak memakai LocalStorage |
| 8 | Target tepat; expense/fee/refund/koreksi/alokasi dan saldo diperiksa |
| 9 | Arsip menjaga row donasi dan ledger |
| 10 | File palsu dan ukuran berlebih ditolak server; batas ditampilkan |
| 11 | Render sembilan route dan struktur responsif lulus; browser perangkat masih perlu uji |
| 12 | Bank belum terkonfirmasi, QRIS, dan VA tidak tampil siap menerima dana |
| 13 | API penuh pemilik/keuangan ditolak sebelum faktor kedua |
| 14 | Recovery code hanya dipakai sekali; login recovery tidak otomatis reauth |
| 15 | Snapshot/arsip/restore terpisah lulus lokal; cron dan storage produksi belum aktif |
| 16 | Restore konten tidak mengubah saldo/receipt/rekening |
| 17 | Simpan revisi usang ditolak 409 |
| 18 | Referensi unik, match unik, dan receipt unik mencegah penggandaan; no-ref tetap kandidat |
| 19 | Perbandingan periode memiliki cakupan, tanggal bank/situs, dan selisih jelas |
| 20 | Handler utama diimplementasikan dan API diuji; browser interaksi akhir masih diperlukan |

## Data awal

| Program | Target |
|---|---:|
| Pengadaan tanah 160 bata / 2.240 m² | Rp350.000.000 |
| Penyelesaian bangunan | Rp70.230.000 |
| Sender sungai dan pagar pengaman | Rp25.000.000 |
| Lapangan multifungsi | Rp75.000.000 |
| Tempat wudhu masjid dan 10 MCK | Rp95.000.000 |
| **Total** | **Rp615.230.000** |

Bangunan terdiri dari aluminium/kaca Rp45.030.000 dan granit Rp25.200.000. Tidak dihitung sebagai tambahan terhadap subtotal. Rekening awal BSI 7211001016 atas nama Yayasan Bina Pelajar Cirebon disimpan tetapi nonaktif. Proposal sumber belum terlampir dan website lembaga tidak dapat diambil saat pemeriksaan awal. Tidak ada foto stok/AI, jumlah donor, angka penerimaan, progres fisik, atau waktu penyelesaian yang dikarang.
