# SUPERAPP ACADEMY V10 — PANDUAN PEMASANGAN

Versi: V10.0.0 • CodeIgniter 4.7.6 • PHP 8.2+ • MySQL/MariaDB • Tanpa Composer.

## 1. Apa yang berubah?

- **Beranda publik baru**: pencarian, kategori program, statistik data *published*, kurikulum, katalog dan cara belajar. Tidak memakai angka/testimoni fiktif.
- **Materi / kelas per Bab**: `Program → Bab → Artikel/Video/PDF/Latihan Bank Soal/Tryout` (pelatihan juga dapat Live atau Materi Terkait).
- **Video & PDF dalam halaman**: YouTube, Vimeo, MP4 langsung, URL `.pdf` HTTPS, atau Google Drive `/file/d/ID/view`; tombol sumber ditampilkan sebagai alternatif bila provider menolak iframe.
- **Latihan dalam silabus**: hasil dan nilai terakhir, tautan pembahasan, serta ujian ulang mengikuti `max_attempts` / durasi akses.
- **Laporan penjualan**: tanggal (tanggal pesanan), status, metode, pencarian, ringkasan omzet **lunas**, dan ekspor CSV. CSV difilter dan dilindungi terhadap CSV formula injection.
- **Kredit & pembayaran**: modul pembayaran V9 dipertahankan. Tidak perlu mengisi ulang kredensial gateway; kredensial tetap di `.env`.

## 2. Penting: pilih SATU jalur database

### Jika website sudah memakai V9 dan ada data

1. Backup database melalui phpMyAdmin → Export SQL.
2. Backup semua file aplikasi, `.env`, serta folder `writable` yang berisi unggahan.
3. Pada **database V9 yang sudah di-backup**, impor file **`database/UPGRADE_V9_KE_V10.sql` satu kali**.
4. Jangan mengimpor `IMPORT_SEKALI.sql` ke database V9. Jangan menjalankan skrip upgrade berulang kali (ALTER TABLE akan gagal jika kolom sudah ada).
5. Data materi lama tetap ada; isi lama tampil di kelompok **Materi dari versi sebelumnya**. Admin dapat mengedit setiap isi dan memindahkannya ke Bab.

### Jika membuat instalasi baru dari nol

1. Buat database **kosong** (bukan bekas impor gagal).
2. Impor **`database/IMPORT_SEKALI.sql`** saja. Ini membuat 28 tabel termasuk Bab.
3. Jangan menjalankan skrip upgrade dari V9 pada database baru.

## 3. Upload dan pasang di cPanel

1. Ekstrak ZIP **ke folder baru**, misalnya `/home2/akun/superapp_v10/` (bukan menimpa folder V9 langsung).
2. Pindahkan pengaturan `.env` V9 ke `.env` baru **secara hati-hati**. Pastikan `app.baseURL` dan koneksi database benar. Jangan menaruh API Secret di controller.
3. Pastikan `intl`, `mbstring`, `mysqli`, `json`, `openssl`, dan ekstensi PHP yang diperlukan aplikasi aktif di hosting.
4. Arahkan **Document Root** subdomain ke folder `superapp_v10/public`, bukan folder root aplikasi. Folder `.env`, `app`, dan `writable` tidak boleh terekspos web.
5. Jika media/unggahan lama diperlukan, pindahkan hanya berkas yang benar-benar dibutuhkan; periksa izin file `writable`.
6. Buka `https://domain-anda/V10-STATUS.txt`. Seharusnya tampil penanda V10.
7. Lakukan `Ctrl + Shift + R` bila browser masih menyimpan CSS lama.

## 4. Cara membuat silabus yang benar

**Admin → Materi Pembelajaran** atau **Admin → Kursus & Kelas** → pilih program → **Detail**.

1. Pada **Bab & Isi Silabus**, isi **Judul Bab Baru**, klik **Tambah Bab**.
2. Buka kartu Bab, lalu klik **Tambah Isi pada Bab Ini**.
3. Pilih jenis: Artikel, Video, PDF, Latihan Bank Soal, Tryout. Untuk kelas juga tersedia sesi Live dan materi terkait.
4. Isikan data yang diminta, lalu **Simpan Bagian**.
5. Urutkan Bab atau isi memakai tombol naik/turun. Bab yang masih memiliki isi tidak boleh dihapus tanpa memindahkan isinya.
6. Pindahkan isi V9 (yang belum punya `chapter_id`) dengan **Edit → Masuk ke Bab → Simpan**.
7. Terbitkan program saat isi sudah siap.

**Contoh**:
- BAB I: Konsep Dasar TIU → Artikel, Video, PDF, Latihan Bank TIU
- BAB II: Penalaran Numerik → Artikel, Video, Tryout CAT

## 5. Format sumber media

- YouTube: `https://www.youtube.com/watch?v=ruWZfeV6BC0` atau `https://youtu.be/ruWZfeV6BC0`
- Vimeo: `https://vimeo.com/123456789`
- MP4 HTTPS: `https://cdn.contoh.com/video/modul.mp4`
- PDF HTTPS: `https://cdn.contoh.com/modul/materi.pdf`
- PDF Google Drive: `https://drive.google.com/file/d/FILE_ID/view` (pengaturan izin file harus benar)

Video/PDF ditampilkan di ruang belajar melalui pemutar inline. **Sebagian penyedia melarang iframe**; tombol alternatif ke sumber tetap disediakan. Tautan sumber publik bukan DRM: pengunjung yang mendapatkan URL asli dari pihak lain mungkin bisa membukanya. Gunakan penyimpanan terlindungi / streaming bertoken jika nantinya membutuhkan proteksi komersial lebih ketat.

## 6. Nilai latihan dan ujian ulang

Peserta masuk **Dashboard Saya → Belajar Saya → pilih program → Bab → Latihan/Tryout**.

- Pertama kali: **Mulai Ujian CAT**.
- Sudah mengerjakan: muncul **Nilai Terakhir**, **Lihat Hasil & Pembahasan**, dan **Ujian Ulang** bila masih diizinkan.
- Ujian yang sedang berlangsung dapat dilanjutkan sampai waktu server habis.
- Batas percobaan: bank latihan default 3; Tryout mengikuti `exams.max_attempts`. Aturan jadwal dan hak akses tetap diterapkan di server.
- Jika uraian belum dikoreksi, nilai ditandai **Menunggu koreksi**.

## 7. Laporan penjualan

Masuk ke **Panel Admin → Laporan Penjualan** (`/panel-admin/laporan-penjualan`).

- Filter: Dari tanggal, Sampai tanggal, Status, Metode, Cari nama/email/kode transaksi.
- Omzet hanya menghitung `orders.status = 'paid'` (bukan semua pesanan).
- Tombol **Ekspor CSV** memakai filter yang sama, maksimal 10.000 baris; halaman menampilkan maksimal 100 transaksi terbaru.
- Untuk pencocokan akuntansi, gunakan juga mutasi rekening/rekap dashboard merchant. Laporan ini bukan pengganti rekonsiliasi rekening.

## 8. File yang dipelajari oleh developer pemula

| Kebutuhan | File |
|---|---|
| Rute halaman | `app/Config/Routes.php` |
| Controller materi & Bab | `app/Controllers/Admin/LearningController.php` |
| Validasi Bab & isi | `app/Services/LearningStudioService.php` |
| Validasi URL video/PDF | `app/Services/LearningMediaService.php` |
| Tampilan admin materi | `app/Views/admin/learning_detail.php` |
| Data & hak akses peserta | `app/Controllers/Web/MemberController.php` |
| Ruang belajar & nilai | `app/Views/web/learn.php` |
| Laporan penjualan | `app/Services/SalesReportService.php` + `app/Views/admin/sales_report.php` |
| Beranda | `app/Controllers/Web/PublicController.php` + `app/Views/web/home.php` |
| Styling tambahan | `public/assets/v10/app.css` |
| Upgrade database | `database/UPGRADE_V9_KE_V10.sql` |

**Keamanan:** Tidak menerima nama tabel mentah dari request. Bab dan isi diverifikasi sebagai milik program yang sama. Form menggunakan CSRF CodeIgniter. Data HTML di-escape. Pembayaran serta callback gateway tetap memerlukan pengujian integrasi merchant sebelum production.

## 9. Checklist uji setelah instalasi

- [ ] `/V10-STATUS.txt` terbuka.
- [ ] Admin dapat membuat, mengedit, mengurutkan, dan menghapus Bab kosong.
- [ ] Materi V9 lama masih ada dan bisa dipindahkan ke Bab.
- [ ] Admin menyimpan artikel, video, PDF, latihan bank, dan tryout.
- [ ] Video YouTube dan dokumen yang mengizinkan embed tampil dalam ruang belajar tanpa pindah tab.
- [ ] Setelah mencoba latihan, peserta melihat hasil dan tombol ujian ulang sesuai batas percobaan.
- [ ] Filter laporan tanggal, metode, dan status menghasilkan data yang benar.
- [ ] Ekspor CSV sesuai dengan filter.
- [ ] Hak akses peserta gratis/berbayar tetap benar, termasuk akses dari bundle.
- [ ] Uji ulang checkout manual dan gateway sandbox sebelum menjual paket sungguhan.

## 10. Batasan pengujian paket

PHP dan JavaScript telah diperiksa sintaksnya; relasi SQL diperiksa secara statis; preview visual beranda, studio, ruang belajar, dan laporan diuji di Chromium ukuran desktop dan mobile. **Pengujian MySQL hosting, OAuth Google, dan transaksi merchant belum dilakukan** sehingga paket V10 belum diklaim bebas error pada semua lingkungan.
