# SUPERAPP ACADEMY V13 — EKSPOR / IMPOR BANK SOAL LENGKAP

Versi dasar: V12 (tryout gabungan, kelulusan per bank, mode latihan dan pembahasan).
Versi V13 menambahkan ekspor dan impor bank soal ZIP, tanpa mengganti skema database.

## Fitur baru

1. Masuk **Panel Admin → Bank Soal → Detail Bank**.
2. Tekan **↓ Export Bank Lengkap (ZIP)**. Unduhan berisi `manifest.json`,
   `PETUNJUK.txt`, dan gambar soal/opsi di folder `images/`.
3. ZIP menyimpan seluruh pertanyaan beserta urutan, tipe soal, kode subtes,
   status soal, model penilaian, skor benar/salah/kosong, teks dan gambar
   pertanyaan, opsi jawaban, kunci, bobot tiap opsi, serta pembahasan.
4. Untuk mengimpor, buat atau buka **bank tujuan** yang masih bisa diedit.
   Pilih **⇧ Impor Bank / Soal** → unggah ZIP hasil ekspor → periksa pratinjau
   → klik Konfirmasi. Soal ditambahkan dengan ID baru dan nama gambar acak baru.
5. Pada tahap konfirmasi, centang **Terapkan juga pengaturan bank sumber** bila
   ingin ikut menyalin judul, ringkasan, penulis, durasi, dan skor default.
   Status bank tujuan dan kategori tidak diubah karena ID kategori antar-server
   tidak selalu cocok. Bila ZIP memuat gambar, `allow_images` dinyalakan otomatis.
6. Format Excel `.xlsx` dan CSV `.csv` dari versi lama tetap bisa digunakan,
   melalui form impor yang sama. Format Excel/CSV tidak memindahkan gambar.

## Mengapa ZIP, bukan Excel saja?

Template Excel/CSV lama hanya memiliki kolom teks, kunci dan bobot.
ZIP menyertakan file gambar sekaligus JSON berstruktur supaya semua data soal
bisa dipindahkan tanpa kehilangan berkas pendukung dan tidak perlu Composer.

## Batasan dan keamanan

- ZIP maksimal 60 MB terkompresi; maksimal 5.000 soal per bank.
- Excel/CSV maksimal 3 MB dan 500 soal per file (tetap seperti V12).
- Gambar JPG, PNG atau WEBP maksimal 2 MB per berkas.
- Ekstensi PHP `zip`, `fileinfo` dan `mbstring` harus aktif; untuk XLSX
  diperlukan juga `dom`/`xml`.
- Pastikan konfigurasi server `upload_max_filesize` dan `post_max_size`
  cukup besar bila hendak mengunggah ZIP besar. Contoh untuk ZIP 60 MB:
  `upload_max_filesize=64M`, `post_max_size=68M`, `memory_limit=256M`.
- Pada pratinjau tidak ada INSERT database; perubahan baru dilakukan setelah
  klik konfirmasi. Proses INSERT dibungkus transaksi dan gambar baru dihapus
  jika transaksi gagal.
- Import **selalu menambahkan** soal; tidak meng-update soal dengan ID lama.
  Impor ZIP dua kali berarti dua salinan pertanyaan. Gunakan bank kosong jika
  ingin membuat bank hasil pemulihan dari arsip.
- Bank yang terkunci karena dipakai ujian yang telah terbit dapat diekspor,
  tetapi tidak dapat diimpor ke dalamnya. Salin bank menjadi draft dahulu.
- Data akun, pesanan, hasil peserta, tryout, dan materi **tidak** ada dalam ZIP.
  Ekspor hanya memindahkan isi bank dan metadata bank, bukan keseluruhan DB.

## Pemasangan upgrade V12 → V13 (database sudah memiliki data)

1. Backup database, aplikasi, `.env`, dan `writable/uploads/academy`.
2. Salin seluruh kode V13. Pertahankan nilai `.env` server Anda: nama database,
   password, baseURL, Google OAuth, gateway pembayaran, dan secret API.
3. JANGAN impor ulang `database/IMPORT_SEKALI.sql` ke DB lama.
4. Tidak ada penambahan tabel/kolom: SQL migrasi V13 **tidak diperlukan**.
5. Bersihkan cache framework **hanya jika diperlukan**, tanpa menghapus upload.
6. Uji: buka detail bank → export ZIP → buat bank draft baru → import ZIP
   → preview → konfirmasi → cocokkan jumlah soal, pembahasan dan gambar.
7. Pastikan tombol lama import Excel/CSV masih berfungsi.

## Instal baru dari nol

Impor `database/IMPORT_SEKALI.sql` pada database KOSONG sesuai panduan V12.
Isi `.env` dengan kredensial server Anda, arahkan document root ke `public`.
Sumber kode ini mencakup framework V12; kredensial asli Anda tidak dapat
kami isi karena tidak tersedia pada sistem pembuat kode.

## File yang ditambahkan/diubah

- `app/Services/QuestionBankArchiveService.php` (baru)
- `app/Controllers/Admin/BankController.php`
- `app/Config/Routes.php`
- `app/Views/admin/bank_detail.php`
- `public/assets/v8/bank-import.js`
- `MULAI_DISINI_V13.md`
- `tests/smoke_bank_archive_v13.php` (test format dan validasi)

## Diagnosa error Whoops!

Periksa `writable/logs/log-YYYY-MM-DD.log`. Jangan mengaktifkan mode development
pada website publik. Pastikan `.env` produksi tidak tertimpa placeholder.
