# SUPERAPP ACADEMY V15 — Panduan Instalasi & Upgrade

Versi V15 (turunan langsung V14). Source penuh CodeIgniter 4, bukan patch.

## Ringkasan fitur V15

1. **Dua model harga produk:** Tanpa Member (harga/harga coret/masa akses produk sendiri) atau **Dengan Member** (pilih beberapa tier; harga dan masa akses diatur pada tier).
2. Satu produk member dapat menawarkan Silver, Gold, Platinum, dan tier lainnya sekaligus. Peserta memilih **satu** tier di halaman detail sebelum masuk keranjang. Harga tidak dapat dipalsukan dari browser: dihitung ulang di server pada add-to-cart dan checkout.
3. Tier dalam keranjang dapat diganti dengan membuka ulang halaman detail dan memilih tier berbeda. Satu produk hanya satu entri keranjang per akun.
4. Akses yang dibeli berlaku sampai `expires_at`. Setelah habis, server menolak akses ke materi/CAT dan program tidak muncul sebagai akses aktif di **Belajar Saya**. Pembelian ulang dapat memperpanjang sesuai durasi tier.
5. Katalog dengan pagination 12 konten/halaman, kategori, dan pencarian; kartu menuju detail terlebih dahulu. Detail materi/kelas memuat judul bab, daftar pelajaran, tipe konten, durasi, serta mentor bila tersedia.
6. Admin memilih banyak bank, ujian, materi, dan kelas melalui **modal dengan pencarian/filter dan halaman** (10 entri/halaman). Tanpa perlu select panjang.
7. Checkout Rp0, kuota WAR, Tryout Akbar, ranking gabungan, latihan, TinyMCE, dan export/import bank dari V14/V13 tetap dipertahankan.

## A. Instalasi tes baru dengan database kosong (direkomendasikan bila belum ada data)

1. Buat database MySQL/MariaDB **baru dan kosong** via phpMyAdmin.
2. Impor hanya `database/IMPORT_SEKALI.sql` sekali. **Jangan** impor skrip upgrade apa pun.
3. Ekstrak semua berkas ZIP ini ke folder aplikasi. Arahkan document root ke `public/`.
4. Edit `.env` dengan nilai server Anda. File bawaan adalah **contoh dengan placeholder**, bukan konfigurasi produksi yang siap dipakai.
5. Pastikan PHP >= 8.2 dan ekstensi `intl`, `mbstring`, `mysqli`, `json`, `openssl`, `fileinfo`, dan `zip` aktif; pastikan folder `writable/` dapat ditulis.
6. Login dengan Google OAuth setelah memasang kredensial, lalu beri akun Anda role admin sesuai panduan versi awal.
7. Buka admin **Paket Member**. Terbitkan tier Silver/Gold/Platinum (bawaan berstatus draft) atau buat tier lain. Atur harga dan akses (hari).
8. Buka **Penjualan & Bundle**. Buat produk, pilih `Tanpa Member` ATAU `Dengan Member`, pilih tier yang diizinkan, lalu pilih konten di modal, simpan, terbitkan.
9. Kunjungi `Katalog → Detail Produk`, pilih tier, masukkan keranjang, checkout (Rp0 langsung aktif, selain itu setelah pembayaran terverifikasi).

## B. Upgrade dari database V14 tanpa menghapus data lama

1. Backup database, folder aplikasi, `.env` dan seluruh `writable/uploads`.
2. Jalankan hanya `database/UPGRADE_V14_KE_V15.sql` **sekali** pada DB V14. Jangan impor SQL instalasi baru di DB lama.
3. Ganti seluruh source kode dengan V15. Salin **nilai konfigurasi sebenarnya** dari `.env` lama. Pertahankan unggahan user di `writable/uploads/`.
4. Produk yang sebelumnya terhubung satu tier otomatis dipindah ke model member dan pilihan tier terkait. Jika tier tidak published, terbitkan dahulu agar dapat dipilih peserta.
5. Uji alur checkout dan masa aktif di staging sebelum dipakai untuk transaksi riil.

## C. Aturan penting pembayaran/member

- Mode `Tanpa Member`: admin memasukkan `Harga`, `Harga Coret`, dan `Masa Akses`; tidak menampilkan pilihan tier ke pembeli.
- Mode `Dengan Member`: admin mencentang beberapa tier yang **sudah published**. Harga, lama aktif, dan deskripsi tier diambil dari menu Paket Member. Pemilihan dilakukan di halaman detail produk.
- Tier berlaku **untuk konten dalam produk yang dibeli**. Membeli tier Silver pada satu produk **tidak otomatis** membuka seluruh produk lain di website.
- Ubah harga tier melalui admin agar harga baru berlaku pada checkout berikutnya. Pesanan lama menyimpan harga dan masa akses sebagai **snapshot**, bukan mengikuti perubahan harga.
- Saat masa akses berakhir, pengecekan server memblokir konten, bukan hanya menyembunyikan tombol.
- Untuk Tryout Akbar dengan kuota dan jadwal WAR: meskipun akses diperoleh lewat kelas/bundle, peserta tetap perlu checkout **ujian satuan** untuk mengambil kursi. Jika sudah memiliki akses aktif, biaya ujian satuan dapat di-waive menjadi Rp0, tetapi kuota tetap dicek pada checkout.
- Satu bank soal dapat dipakai banyak quiz/tryout dan penjualannya independen.

## D. File penting V15

- `app/Controllers/Admin/ProductController.php`: simpan produk dan tier yang diizinkan.
- `app/Views/admin/_product_form.php`: form mode harga serta pemilihan konten.
- `public/assets/v15/admin.js`: modal pencarian dan pagination konten.
- `app/Services/ProductTierService.php`: validasi tier dan penetapan harga di server.
- `app/Services/CartService.php`: penyimpanan tier ke keranjang dan snapshot order.
- `app/Services/FulfillmentService.php`: pemberian akses yang akan kadaluarsa.
- `app/Controllers/Web/PublicController.php`: katalog berhalaman dan detail produk.
- `app/Views/web/catalog.php` dan `app/Views/web/detail.php`: tampilan publik lengkap.
- `public/assets/v15/app.css` dan `public.js`: desain dan harga saat tier dipilih.
- `database/UPGRADE_V14_KE_V15.sql`: struktur tambahan untuk DB V14.

## E. Jika muncul "Whoops!"

Buka `writable/logs/log-YYYY-MM-DD.log` dan cari `CRITICAL`. Periksa koneksi `.env`, ekstensi PHP yang diperlukan, migrasi SQL, dan izin folder writable. **Jangan ubah .env menjadi development di website publik.**

## Status pengujian

Lolos pemeriksaan sintaks PHP dan JavaScript serta tes regresi offline yang tersedia. Belum dapat menjalankan transaksi MySQL nyata, migrasi pada database Anda, integrasi Google OAuth/payment gateway atau simulasi web lengkap di lingkungan ini. Lakukan uji staging dahulu.
