# Undangan Digital Tasyakuran Khitanan Premium

Website undangan digital berbasis CodeIgniter 4, PHP 8.1+, MySQL, Bootstrap 5, jQuery, Bootstrap Icons, AOS, dan GLightbox. Dirancang untuk shared hosting/CPanel tanpa Node.js, Docker, Redis, atau VPS.

## Fitur

- URL tamu personal: `/u/bapak-ahmad`
- Cover, countdown, detail acara, profil anak, galeri, Maps, QR lokasi
- RSVP AJAX, ucapan dan doa termoderasi, serta share WhatsApp
- Login dan dashboard admin
- CRUD acara, tamu, dan galeri
- Generate slug/link otomatis dan tombol WhatsApp
- Import/export tamu Excel memakai PhpSpreadsheet
- Statistik RSVP, ucapan, dan pengunjung

## Instalasi Lokal

1. Pastikan PHP 8.1+, ekstensi `intl`, `mbstring`, `mysqli`, `json`, `xml`, `zip`, `fileinfo`, `gd`, dan Composer tersedia.
2. Jalankan `composer install`.
3. Salin `.env.example` menjadi `.env`, lalu ubah koneksi database dan `app.baseURL`.
4. Buat database MySQL bernama `undangan_khitanan`.
5. Jalankan:
   - `php spark migrate`
   - `php spark db:seed DatabaseSeeder`
   - `php spark serve`
6. Buka `http://localhost:8080`.

Login awal:

- Email: `admin@khitanan.test`
- Password: `admin123`

Segera ubah password langsung di database setelah instalasi produksi.

## Instalasi Shared Hosting / CPanel

1. Upload seluruh isi proyek ke folder domain.
2. Arahkan document root domain ke folder `public` bila panel mendukungnya.
3. Jika document root tidak bisa diubah, `.htaccess` root akan meneruskan request ke `public`.
4. Buat database dan user MySQL dari CPanel.
5. Import `database/undangan_khitanan.sql` melalui phpMyAdmin, atau jalankan migration melalui Terminal CPanel.
6. Salin `.env.example` menjadi `.env`, isi URL dan kredensial database produksi.
7. Pastikan folder `writable`, `writable/uploads`, `public/uploads`, dan `public/uploads/gallery` dapat ditulis (`755` atau `775` sesuai hosting).
8. Jalankan `composer install --no-dev --optimize-autoloader` dari Terminal CPanel. Jika terminal tidak tersedia, jalankan lokal lalu upload folder `vendor`.

File `public/.user.ini` sudah menyediakan batas upload 8 MB dan direktori sementara proyek, sehingga upload foto tidak bergantung pada konfigurasi global hosting. Beberapa hosting memerlukan waktu beberapa menit sebelum perubahan `.user.ini` aktif.

## Format Import Excel

Baris pertama adalah header:

| Nama Tamu | Nomor HP |
|---|---|
| Bapak Ahmad dan Keluarga | 081234567890 |

## Keamanan

- Semua akses database aplikasi menggunakan Model/Query Builder CodeIgniter.
- CSRF aktif untuk request POST.
- Password admin disimpan dengan `password_hash`.
- Upload divalidasi server-side, memakai nama acak, dan folder upload memblokir eksekusi file PHP.
