# Deployment Produksi CAP Workforce SaaS

## Gerbang wajib sebelum go-live

- Domain HTTPS valid, `APP_ENV=production`, `APP_DEBUG=false`, password database kuat, dan `APP_KEY` unik.
- MySQL/PostgreSQL produksi terpisah dari demo; backup database dan `storage/app/public` sudah diuji restore.
- Password platform dan semua akun demo diganti; akun demo dinonaktifkan atau dihapus.
- Queue worker, scheduler, monitoring `/up`, rotasi log, alert error, firewall, dan rate limiting aktif.
- APK/AAB ditandatangani keystore perusahaan. APK debug di folder `releases` hanya untuk UAT/internal trial.
- Kebijakan privasi, persetujuan foto/lokasi, retensi data, aturan payroll, BPJS, dan PPh 21 telah disahkan HR/Finance/Legal perusahaan.

## Server Laravel

Gunakan PHP 8.2+, Composer 2, ekstensi PDO database, mbstring, openssl, fileinfo, gd, xml, zip, dan web server HTTPS. Document root wajib mengarah ke folder `public`.

```bash
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan storage:link
npm ci
npm run build
php artisan optimize
php artisan queue:restart
```

Set environment sekurang-kurangnya:

```dotenv
APP_ENV=production
APP_DEBUG=false
APP_URL=https://attendance.example.com
APP_TIMEZONE=Asia/Jakarta
CAP_PLATFORM_ADMIN_PASSWORD=<password-unik-panjang>
CAP_MOBILE_ORIGINS=https://localhost
SESSION_SECURE_COOKIE=true
LOG_LEVEL=warning
```

Jangan commit `.env`. Berikan hak tulis hanya pada `storage` dan `bootstrap/cache` untuk user web server.

## Provisioning awal SaaS

```bash
php artisan db:seed --class=PlatformAdminSeeder --force
```

Login sebagai platform admin, buat tenant pertama, lalu gunakan `/{slug}` untuk konfigurasi perusahaan. Hindari menjalankan `DatabaseSeeder` pada database produksi karena seeder utama memuat data demo.

## Scheduler dan queue

Cron server menjalankan scheduler tiap menit:

```cron
* * * * * cd /var/www/cap-workforce && php artisan schedule:run >> /dev/null 2>&1
```

Jalankan `php artisan queue:work --sleep=3 --tries=3 --max-time=3600` di bawah Supervisor/systemd dan gunakan driver queue persisten.

## Persiapan payroll

1. Tentukan tanggal cutoff, hari kerja standar, workweek, dan buffer lembur tenant.
2. Aktifkan komponen yang berlaku: gaji pokok, tunjangan, lembur, transport, makan, BPJS Kesehatan, BPJS Ketenagakerjaan, estimasi PPh 21, potongan, dan THR.
3. Lengkapi tarif, rekening bank, NPWP/status pajak, nomor BPJS, porsi iuran karyawan/perusahaan, dan penyesuaian per karyawan.
4. Selesaikan koreksi, cuti, dan lembur pada rentang cutoff; lalu generate payroll.
5. Maker mengirim draft ke review. Checker Finance/Owner yang berbeda menyetujui, kemudian finalisasi snapshot.
6. Rekonsiliasi Excel/CSV bank, export BPJS, dan payslip berlogo tenant dengan Finance sebelum pembayaran.

Freelancer/daily worker tidak masuk komponen tunjangan payroll karyawan. Catat penugasan, fee harian, dan unit kerja di modul **Freelance**, lalu ekspor ledger periode ke Finance. Histori fee tidak dihapus; freelancer yang sudah memiliki ledger akan diarsipkan saat dihapus.

Perhitungan PPh 21 pada versi ini memakai persentase konfigurasi sebagai estimasi, bukan mesin TER/DJP penuh. Finance wajib memvalidasi tarif, batas BPJS, status PTKP, pembulatan, dan aturan pajak yang berlaku sebelum payroll nyata.

## Build Android release

1. Set `VITE_API_URL=https://domain-produksi/api/mobile`.
2. Jalankan `npm.cmd ci`, `npm.cmd run build`, dan `npx.cmd cap sync android`.
3. Buka folder `android-app/android` di Android Studio.
4. Buat keystore perusahaan; simpan file, alias, dan password di password manager/backup aman dan jangan commit.
5. Buat Signed App Bundle (AAB) untuk Play Store atau Signed APK untuk distribusi internal.
6. Uji pada minimal dua perangkat fisik: kamera depan, lokasi presisi, mock-location policy, enrollment/revoke perangkat, GPS di dalam/luar radius, jaringan lambat, check-in/out, koreksi, dan logout.

Build produksi menolak trafik HTTP; endpoint harus HTTPS valid.

## Backup dan recovery

- Backup terenkripsi database dan `storage/app/public` minimal harian; pertahankan salinan off-site sesuai kebijakan retensi.
- Buat backup tambahan sebelum migrasi dan finalisasi payroll.
- Dokumentasikan RPO/RTO, lakukan restore drill berkala, dan verifikasi jumlah record serta akses foto setelah restore.
- Jangan menganggap backup berhasil hanya karena job selesai; checksum dan proses restore harus diuji.

## Verifikasi setelah deploy

- `/up`, login platform, login tenant, dan login karyawan berhasil tanpa error console/server.
- Tenant A tidak dapat membaca/mengubah data Tenant B.
- Foto tersimpan di storage publik, MIME tervalidasi, dan tidak dapat dieksekusi sebagai script.
- Check-in/out menyimpan waktu server, koordinat, akurasi, jarak, foto, IP, risiko, dan perangkat.
- Galeri tidak tersedia pada web/Android resmi; server menolak sumber capture/token tidak sah.
- Approval cuti/lembur/koreksi, kalender hari libur, serta tukar hari libur H-2 memengaruhi absensi/payroll dengan benar.
- Maker-checker payroll, finalisasi, payslip web/Android, Excel, CSV bank, dan export BPJS bekerja.
- Revoke perangkat mencabut token; token logout tidak dapat dipakai lagi.
- Backup database/storage berhasil dipulihkan pada lingkungan uji.

## Penguatan lanjutan yang disarankan

Sebelum membuka platform ke banyak klien publik, tambahkan TOTP/passkey untuk role istimewa, alur reset password melalui email terverifikasi, Play Integrity/device attestation, notifikasi email/push, sentry/APM, SAST/dependency scanning, serta penetration test independen.
