# SUPERAPP ACADEMY V19 — SOURCE LENGKAP

**Asal proyek:** source lengkap V18 SuperApp Academy. **Target:** CodeIgniter 4.7.6, PHP 8.2+, MySQL/MariaDB, deploy melalui cPanel tanpa wajib Composer. **Versi:** 19.0.0, 9 November 2026.

## Apa saja yang diperbarui?

1. **Navigasi publik lebih ringkas dan lega.** Empat menu desktop: Beranda, Katalog, Tryout, Bundel. Satu tombol keranjang, mode terang/gelap, avatar + dropdown akun. Pada tablet/HP navigasi berubah ke hamburger. Tema default tetap terang.
2. **Etalase katalog modern.** Kartu 16:9, cover dari admin, pencarian/filter, ringkasan ✓ fasilitas termasuk dan ✕ tidak termasuk, harga, durasi/limit sesuai isi, FAQ di bawah dan tautan syarat pembelian. Halaman detail turut menampilkan informasi ini.
3. **Upload gambar & fasilitas via admin.** Buka `/panel-admin/penjualan/{id}`, `/panel-admin/tryout/{id}`, `/panel-admin/materi/{id}`, atau `/panel-admin/kelas/{id}` kemudian klik **Foto & Fasilitas**. URL langsung: `/panel-admin/katalog-profil/{product|exam|material|course}/{id}`. JPG/PNG/WebP, maksimal 4 MB, resolusi minimal 320×180 piksel, disarankan 1280×720. File disimpan di `public/uploads/catalog/` (backup folder ini saat upgrade berikutnya). Admin dapat mengubah daftar ✓, ✕, dan catatan produk.
4. **Bank soal tidak dijual sendiri.** Daftar katalog tidak menampilkan `bank`. URL detail `katalog/bank/{id}` ditutup. Produk tunggal yang hanya berisi bank ditolak di keranjang/checkout, tetapi bank tetap aktif dalam studio, ujian, dan sebagai isi bundel.
5. **FAQ & kebijakan yang bisa diedit.** Menu admin **FAQ & Kebijakan** pada `/panel-admin/informasi`; halaman publik `/faq`, `/ketentuan-pembelian`, `/kebijakan-pengembalian`, `/kebijakan-privasi`. Ada teks awal untuk diadaptasi; isilah identitas badan usaha dan kontak bantuan sebelum menerima transaksi publik.
6. **Konfirmasi pembelian.** Checkout (gratis dan berbayar) mewajibkan mencentang persetujuan dan menyimpan versi serta snapshot Syarat Pembelian per order, secara atomik bersama pembuatan order. Jika ketentuan berubah ketika keranjang terbuka, pembeli diminta mengulang konfirmasi. Ketentuan tidak boleh meniadakan hak konsumen yang dilindungi hukum.
7. **Percobaan tidak dibatasi jika kolom kosong.** Admin dapat membiarkan `max_attempts` kosong, disimpan sebagai `0`, dan `0` ditafsirkan tak terbatas sepanjang peserta masih memiliki hak akses/jadwal yang berlaku.
8. **Admin/super_admin setelah Google login masuk panel admin**, peserta biasa masuk ke dashboard akun. Role ditentukan dari relasi database `user_roles`–`roles`, bukan alamat email yang belum diverifikasi.
9. AJAX dan modul sebelumnya tetap ada; V19 ditambahkan sebagai CSS/JS publik berkomentar, tidak minify.

## Upgrade dari V18 yang SUDAH memiliki data (cara aman)

1. **Backup** seluruh database dari phpMyAdmin, file `.env` lama, direktori `writable/uploads/`, dan seluruh `public/uploads/` jika ada. Buat backup source saat ini juga.
2. Siapkan **staging/subdomain pengujian** dengan salinan database sebelum memodifikasi produksi.
3. Di phpMyAdmin, **jalankan hanya** `database/UPGRADE_V18_KE_V19.sql` ke database V18 yang sudah digunakan. Skrip menambah `catalog_profiles`, `site_faqs`, `site_policies`, `purchase_consents` serta data contoh FAQ/kebijakan. **Jangan jalankan `IMPORT_SEKALI.sql` pada database berisi data!**.
4. Ekstrak isi ZIP ke root proyek CI4 (folder yang memiliki `app/`, `system/`, `public/`, `writable/`) dan gabungkan/timpa source. **Jangan timpa `.env` yang sudah benar, jangan hapus `writable/uploads/` atau `public/uploads/`.** File `.env` dalam ZIP adalah template, bukan pengaturan server Anda.
5. Pastikan folder `public/uploads/catalog/` dapat ditulis PHP (`0755` atau permission sesuai cPanel); DocumentRoot tetap menuju `public/`.
6. Pada admin **FAQ & Kebijakan**, periksa teks dan isi identitas penyelenggara, alamat, kontak pengaduan, waktu penanganan, dan aturan refund yang relevan. Draf bersifat contoh, bukan nasihat hukum dan tidak otomatis meniadakan hak konsumen berdasarkan UU Perlindungan Konsumen.
7. Masuk admin, buka salah satu produk/ujian/materi/kelas, klik **Foto & Fasilitas**, unggah sampul dan isi daftar yang termasuk/tidak termasuk. Tinjau harga, masa akses, jadwal, syarat pemakaian dan kebijakan sebelum menerbitkan produk.
8. Uji di staging: admin login Google → panel admin, member login → akun, katalog tidak menampilkan bank, foto tampil di mobile, rincian ✓/✕, limit 0 dan positif, checkout gratis, checkout berbayar/gateway sandbox, persetujuan versi, riwayat pembelian dan unggah/hapus gambar.
9. Jika ada error 500/Whoops, cek `writable/logs/log-YYYY-MM-DD.log`, PHP extensions, dan cPanel Error Log. Pulihkan backup jika perlu.

## Instalasi baru dengan database kosong

Impor **hanya** `database/IMPORT_SEKALI.sql` (sudah mencakup tabel V19). Atur `.env` dari template sesuai kredensial nyata, OAuth redirect, gateway, `baseURL`, SMTP/WA bila digunakan; arahkan root subdomain ke `public/`. Jangan mengimpor SQL upgrade lagi pada instalasi baru.

## Peta file utama

- `app/Views/layouts/web.php`, `public/assets/v19/site.css`, `site.js` — navigasi dan tema V19
- `app/Views/web/catalog.php`, `detail.php`, `home.php`, `cart.php` — etalase, detail, FAQ dan persetujuan
- `app/Controllers/Web/PublicController.php` — filter katalog, produk dan profil visual
- `app/Controllers/Admin/CatalogMediaController.php` + `app/Views/admin/catalog_profile.php` — upload dan edit fitur
- `app/Services/CatalogPresentationService.php` — penyajian sampul, ✓, ✕
- `app/Controllers/Admin/InformationController.php`, `app/Views/admin/information.php` — CRUD FAQ/kebijakan
- `app/Services/PurchasePolicyService.php`, `app/Controllers/Web/InformationController.php`, `app/Views/web/faq.php`, `policy.php` — ketentuan publik
- `app/Controllers/Web/PurchaseController.php`, `app/Services/CartService.php` — cek persetujuan, snapshot transaksi, blok penjualan bank tunggal
- `app/Controllers/Web/AuthController.php` — redirect sesuai role setelah login Google
- `app/Controllers/Admin/ExamController.php`, `app/Services/AttemptService.php` — percobaan kosong = tidak terbatas
- `database/UPGRADE_V18_KE_V19.sql` — migrasi dari V18
- `database/IMPORT_SEKALI.sql` — khusus instalasi baru
- `tests/smoke_v19.php` — tes konsistensi statis tanpa akses database

## Catatan pengujian

Sintaks PHP dan JavaScript telah diperiksa serta tes logika V17/V18/V19 dijalankan dalam lingkungan pembuatan. **Belum terhubung ke database, login OAuth, API gateway, dan transaksi nyata pada hosting Anda.** Uji di staging terlebih dahulu. PHP `intl`, `mbstring`, `mysqli`, `curl`, `openssl`, `zip` perlu tersedia di server.
