# SUPERAPP ACADEMY V12 — FULL SOURCE CODE (CI 4.7.6)

## Tujuan perbaikan

1. Tryout/quiz dari banyak bank soal menjumlahkan seluruh skor, **tetapi setiap bank WAJIB mencapai nilai minimal masing-masing** (ditambah batas total dan subtes jika ada).
2. Ranking resmi menampilkan satu baris/peserta: **skor masing-masing bank, batas minimal, lulus/gagal per bank, skor total, status kelulusan, dan waktu**. Peringkat memakai satu percobaan terbaik yang sama untuk nilai dan durasi.
3. **Metode Latihan** (pengajar mengaktifkan melalui Admin → Tryout → Detail) memperlihatkan pembahasan instan setelah peserta menjawab; jawaban yang sudah dibahas terkunci.
4. Pembahasan hasil memakai satu kolom vertikal; hijau untuk kunci/jawaban bernilai maksimum, merah untuk pilihan peserta yang bukan kunci/tidak maksimum. Jawaban peserta dan alasan lengkap ditampilkan.
5. Hak akses quiz/tryout tetap terpisah berdasarkan **ID quiz**; quiz/tryout dalam kelas atau pelatihan yang dibeli tidak perlu dibeli ulang (aturan V11).
6. Latihan tidak ikut ranking, dan tidak mengurangi kuota percobaan resmi; sesi latihan dibatasi maksimal 100 percobaan per ujian.

## Instalasi untuk website yang SUDAH MEMAKAI V11

1. **Backup database, `.env`, folder `writable/uploads`, dan seluruh source code V11**.
2. **JALANKAN `database/UPGRADE_V11_KE_V12.sql` SEKALI** melalui phpMyAdmin pada database yang benar. SQL menambah `exams.practice_enabled`, `attempts.attempt_mode`, dan indeks; tidak menghapus data lama.
3. Pastikan di cPanel domain document root menunjuk ke **`public/`**.
4. Ekstrak ZIP V12 ke folder proyek, sehingga `app`, `public`, `system`, `writable`, `.env` berada di lokasi yang sama. Jangan menaruhnya sebagai folder bertingkat di atas proyek.
5. **Wajib salin nilai asli `.env` V11 ke `.env` V12** sebelum ditimpa: database, domain, Google OAuth, DOKU/iPaymu/Duitku, WhatsApp. `.env` dalam paket hanya **template**, berisi placeholder dan TIDAK dapat tersambung ke database nyata tanpa penyesuaian.
6. Pertahankan data file yang sudah ada di `writable/uploads`. Jangan hapus `writable/logs` jika sedang diperlukan untuk diagnosis.
7. Setelah SQL berhasil, upload kode aplikasi. Periksa `writable/logs/log-YYYY-MM-DD.log` apabila muncul Whoops.
8. Masuk Admin → Tryout → Detail → isi Passing Grade setiap bank, aktifkan "Izinkan Metode Latihan" bila dibutuhkan, lalu simpan. Untuk ujian yang sudah Published, arsipkan terlebih dahulu sebelum mengubah ketentuan.
9. Uji dengan dua akun: peserta tanpa akses dan peserta yang telah membeli kelas/pelatihan. Uji dua quiz dari satu bank tetap punya tiket jual berbeda.

**Jangan impor `database/IMPORT_SEKALI.sql` ke database yang sudah memiliki data!**

## Jika basis aplikasi masih V10

Setelah backup, jalankan SQL `database/UPGRADE_V10_KE_V11.sql` dahulu, **kemudian** `database/UPGRADE_V11_KE_V12.sql`, masing-masing satu kali, baru pasang kode V12. Jangan menjalankan upgrade yang sudah pernah dijalankan.

## Instalasi database BARU dari nol

Untuk database baru dan kosong, gunakan **hanya** `database/IMPORT_SEKALI.sql`.
Jangan menjalankan skrip upgrade pada database kosong tersebut.

## Konfigurasi `.env`

Contoh (ganti dengan nilai sebenarnya dari hosting Anda):

```ini
CI_ENVIRONMENT = production
app.baseURL = 'https://DOMAIN-ANDA/'
app.indexPage = ''
database.default.hostname = localhost
database.default.database = 'ISI_NAMA_DATABASE'
database.default.username = 'ISI_USER_DATABASE'
database.default.password = 'ISI_PASSWORD_DATABASE'
database.default.DBDriver = MySQLi
database.default.port = 3306
```

Jangan pernah mengirim secret merchant/Google/database lewat halaman umum atau menyimpan nilai rahasia di source public.

## Cara memakai penilaian gabungan

- Bank A: passing grade 80, nilai peserta 100 (lulus).
- Bank B: passing grade 85, nilai peserta 75 (gagal).
- Bank C: passing grade 166, nilai peserta 200 (lulus).
- Total nilai = 100 + 75 + 200 = **375**, tetapi hasil keseluruhan = **TIDAK LULUS**, karena Bank B tidak memenuhi minimum.

## Perbedaan CAT vs Latihan

- CAT: tidak ada pembahasan saat memilih jawaban; masuk ranking setelah dinilai final.
- Latihan: pembahasan muncul begitu pilihan tunggal disimpan; untuk pilihan majemuk peserta memilih beberapa opsi lalu klik "Periksa Jawaban". Pilihan terkunci setelah feedback muncul. Tidak masuk ranking.
- Admin harus mengaktifkan `practice_enabled` pada ujian. Bank soal langsung bisa berlatih bila peserta memiliki hak akses bank tersebut.

## Perbaikan tampilan data V11

Attempt V11 mode gabungan yang dulu menyimpan batas setiap bank = 0 akan **ditampilkan ulang** dengan nilai minimal pada `exam_banks` yang berlaku saat ini pada halaman **Hasil, Riwayat, dan Ranking**. Nilai skor per soal dan transaksi tidak diubah. Untuk rekam historis yang ketat, simpan arsip aturan passing grade sebelum admin mengubahnya di kemudian hari. Mulai V12, setiap attempt baru menyimpan snapshot batas bank yang benar agar perubahan admin berikutnya tidak memengaruhi riwayat hasilnya.

## Pemeriksaan setelah upload

- `php tests/smoke_v12.php`
- `php tests/smoke_score_v8.php`
- `php tests/smoke_v10.php`

Pengujian tersebut memeriksa logika dan sintaks, **bukan pengganti pengujian integrasi database nyata/payment gateway produksi**.
