# KapokHub ERP — Panduan Deployment ke kapokhub.net

Aplikasi ERP produksi terintegrasi: Gelondong Masuk → Proses Kupas → Proses
Giling → Stok Bal FG → Stuffing/Ekspor, plus Laporan Harian Karyawan (absensi,
rekap, kendala). Backend PHP + SQLite, frontend HTML/CSS/JS ringan (tanpa
framework), gaya iOS 26 "Liquid Glass". Data historis dari 5 file Excel sudah
diimpor ke `database/kapokhub.sqlite` — tinggal upload & jalan.

## 0. Yang sudah beres

- [x] Skema database (`database/schema.sql`)
- [x] Data historis diimpor ke `database/kapokhub.sqlite` (impor otomatis dari 5 file Excel Bapak)
- [x] Backend API (PHP + PDO SQLite)
- [x] Frontend lengkap (dashboard, 5 modul produksi, upload foto/video, auth admin/staf/tamu)

## 1. Siapkan lokasi folder di cPanel

Sesuai kebiasaan Bapak (tiap app di folder terpisah dalam `public_html`), buat folder
misal `produksi` di dalam `public_html`, sehingga URL akhirnya:

```
https://kapokhub.net/produksi/
```

Struktur folder yang di-upload (JANGAN diubah nama/susunannya — kode PHP
mengandalkan struktur ini):

```
public_html/produksi/
├── .htaccess              ← mengarahkan semua request ke public/, jangan dihapus
├── database/
│   ├── kapokhub.sqlite     ← database berisi SEMUA data historis Bapak
│   ├── schema.sql
│   ├── import_excel.py     (arsip, tidak dipakai server — boleh dihapus setelah yakin data lengkap)
│   ├── seed_admin.php      ← buat akun admin lewat SSH/Terminal
│   └── .htaccess           ← blokir akses langsung folder ini
├── src/
│   ├── db.php
│   ├── auth.php
│   ├── tables_config.php
│   └── .htaccess           ← blokir akses langsung folder ini
└── public/
    ├── index.php            (aplikasi utama)
    ├── login.php
    ├── setup.php             ← WIZARD buat akun admin lewat browser (hapus setelah dipakai)
    ├── api/*.php
    ├── assets/css/app.css
    ├── assets/js/app.js
    └── uploads/               (folder foto/video, harus bisa ditulis PHP)
```

## 2. Upload lewat File Manager

1. Kompres folder ini jadi satu ZIP di komputer Bapak (sudah saya siapkan ZIP-nya).
2. Di cPanel → **File Manager** → masuk ke `public_html` → buat folder `produksi`.
3. Masuk folder `produksi` → **Upload** → unggah file ZIP → klik kanan → **Extract**.
4. Setelah ekstrak, hapus file ZIP-nya (hemat kuota, dan supaya tidak bisa diunduh orang).

## 3. Perbaiki permission (WAJIB — sesuai catatan Bapak)

cPanel Rumahweb sering set upload jadi `0600`. Perbaiki lewat File Manager:

1. Klik kanan folder `produksi` → **Permissions** → centang "Recurse into subdirectories"
   → set **Folders: 0755**, lalu jalankan.
2. Ulangi khusus untuk **file** (bukan folder) → set **0644**.
3. Khusus folder ini pastikan **bisa ditulis** oleh PHP (butuh 0755, kadang perlu 0775):
   - `database/` (karena SQLite penulisan butuh akses ke folder, bukan cuma file)
   - `database/kapokhub.sqlite` (file database, set **0664** atau **0666** jika masih gagal ditulis)
   - `public/uploads/` (untuk foto & video)

Kalau nanti muncul error "database is locked" atau "unable to open database file",
99% karena permission folder `database/` belum bisa ditulis proses PHP (www-data) —
naikkan ke 0775 atau 0777 pada folder tersebut saja (bukan filenya).

## 4. Pasang AutoSSL (HTTPS)

cPanel → **SSL/TLS Status** → centang domain `kapokhub.net` → **Run AutoSSL**.
Tunggu beberapa menit, lalu cek `https://kapokhub.net/produksi/` sudah muncul gembok.

## 5. Buat akun admin pertama

**Cara A — lewat browser (kalau tidak ada akses SSH/Terminal):**

1. Buka `https://kapokhub.net/produksi/setup.php`
2. Isi nama, username, kata sandi untuk Bapak sendiri → pilih peran **Admin**.
3. Ulangi untuk tiap staf kantor yang perlu akun — pada percobaan kedua dst,
   akan diminta **Kunci Setup**: ketik `kapokhub-setup` (kunci bawaan; boleh
   diganti langsung di kode `public/setup.php` kalau mau lebih aman).
4. **Setelah semua akun dibuat, HAPUS `public/setup.php`** dari File Manager.

**Cara B — lewat SSH/Terminal cPanel (kalau paket Rumahweb M ada aksesnya):**

```bash
cd public_html/produksi/database
php seed_admin.php roni "kata-sandi-kuat-anda" "Roni" admin
php seed_admin.php sinta "kata-sandi-lain" "Sinta (Admin Gudang)" staff
```

## 6. Login & mulai pakai

Buka `https://kapokhub.net/produksi/` → masuk dengan akun yang dibuat di
langkah 5. Ada juga tombol **"Masuk sebagai Tamu"** untuk siapa pun yang cuma
perlu melihat data (mis. Bapak ingin tunjukkan progres ke rekan tanpa kasih
akses edit).

## 7. Cek data historis sudah masuk

Setelah login, buka **Beranda** — kartu ringkasan (Stok Gelondong, Stok
Odolan, Stok Bal FG, dst.) seharusnya sudah menampilkan angka dari data lama
Bapak, bukan nol. Cek juga:

- **Stok Bal (FG)** → harus ada ±1.474 baris (dari `02_INPUT_BALL_MASUK`)
- **Data Karyawan** → 15 nama karyawan
- **Rekap Harian** → data Juli–Agustus 2026

Kalau ada angka yang terasa aneh/kurang, kabari saya — data mentahnya kadang
punya baris tidak standar (baris kosong, gabungan sel) yang butuh penyesuaian
skrip impor.

## 8. Siapa yang bisa apa (role)

| Peran | Bisa lihat | Bisa tambah/ubah/hapus | Kelola akun lain |
|---|---|---|---|
| **admin** | ✅ | ✅ | (lewat `seed_admin.php`/`setup.php`, belum ada UI kelola user di app) |
| **staff** | ✅ | ✅ | ❌ |
| **guest (tamu)** | ✅ | ❌ (tombol tambah/ubah/hapus disembunyikan & diblokir di server) | ❌ |

## 9. Backup data

`database/kapokhub.sqlite` adalah **satu file** yang menyimpan semua data.
Cukup download file ini lewat File Manager secara berkala (mis. tiap minggu)
dan simpan sebagai backup — jauh lebih sederhana dibanding backup database
server biasa.

## 10. Catatan teknis untuk pengembangan lanjutan

- Tambah tabel/modul baru → tambahkan ke `database/schema.sql` +
  `src/tables_config.php` (whitelist kolom) + entri baru di `MODULES` pada
  `public/assets/js/app.js`. Modul baru otomatis dapat form, tabel, filter,
  pencarian, dan upload foto/video tanpa nulis ulang UI dari nol.
- Semua endpoint API ada di `public/api/` — satu file generik `crud.php`
  melayani hampir semua tabel; file khusus (`mutasi.php`, `reports.php`,
  `dashboard.php`) menangani logika yang butuh perhitungan tambahan.
- Log aktivitas (siapa mengubah apa, kapan) tersimpan di tabel
  `activity_log` — belum ada halaman UI-nya, tapi datanya sudah lengkap dan
  bisa ditambahkan kapan saja.
