# 🕐 Panduan Setup Cron Job - Auto Reset Kehadiran

Sistem ini akan mereset status kehadiran secara otomatis setiap hari jam 00:00 (tengah malam).

## 📋 Dua Metode Reset

### 1. **Cron Job (Recommended)** ⭐
Reset otomatis via server cron job setiap jam 00:00

### 2. **Auto-Reset on Access (Backup)**
Reset otomatis saat aplikasi pertama kali dibuka di hari baru

---

## 🔧 Setup Metode 1: Cron Job (Server-side)

### A. Setup via cPanel

1. **Login ke cPanel**
   - Buka cPanel hosting Anda
   - Cari menu "Cron Jobs" atau "Penjadwalan Tugas"

2. **Tambah Cron Job Baru**
   - Klik "Add New Cron Job"
   - Atur jadwal:
     ```
     Minute: 0
     Hour: 0
     Day: *
     Month: *
     Weekday: *
     ```
   - Atau gunakan shortcut: `@daily` atau `0 0 * * *`

3. **Pilih Command Type**

   **Opsi A: Via PHP CLI (Recommended)**
   ```bash
   /usr/bin/php /home/username/public_html/cron/reset_attendance.php
   ```
   
   **Opsi B: Via wget (jika PHP CLI tidak tersedia)**
   ```bash
   wget -q -O - https://yourdomain.com/cron/reset_attendance.php
   ```
   
   **Opsi C: Via curl**
   ```bash
   curl -s https://yourdomain.com/cron/reset_attendance.php
   ```

4. **Simpan Cron Job**

### B. Setup via SSH (untuk VPS/Dedicated Server)

1. **Login via SSH**
   ```bash
   ssh username@your-server.com
   ```

2. **Edit Crontab**
   ```bash
   crontab -e
   ```

3. **Tambahkan Baris Berikut**
   ```bash
   # Reset attendance setiap hari jam 00:00
   0 0 * * * /usr/bin/php /path/to/your/project/cron/reset_attendance.php >> /path/to/your/project/cron/reset_attendance.log 2>&1
   ```

4. **Simpan dan Keluar**
   - Tekan `Ctrl + X`
   - Tekan `Y` untuk konfirmasi
   - Tekan `Enter`

5. **Verifikasi Crontab**
   ```bash
   crontab -l
   ```

### C. Penjelasan Jadwal Cron

```
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday=0)
│ │ │ │ │
│ │ │ │ │
0 0 * * *  → Setiap hari jam 00:00
```

**Contoh Jadwal Lain:**
- `0 6 * * *` → Setiap hari jam 06:00
- `0 0 * * 1` → Setiap Senin jam 00:00
- `0 */6 * * *` → Setiap 6 jam
- `30 23 * * *` → Setiap hari jam 23:30

---

## ✅ Metode 2: Auto-Reset on Access (Sudah Aktif)

Metode ini **sudah otomatis aktif** tanpa perlu setup tambahan!

### Cara Kerja:
1. Setiap kali halaman dashboard atau display dibuka
2. Sistem otomatis cek apakah sudah ada data untuk hari ini
3. Jika belum ada, otomatis create data baru dengan status "TIDAK ADA"
4. Proses ini sangat cepat (< 1 detik)

### Keuntungan:
- ✅ Tidak perlu setup cron job
- ✅ Bekerja di semua hosting (shared/VPS)
- ✅ Otomatis aktif saat aplikasi dibuka
- ✅ Tidak perlu akses SSH atau cPanel

### Kekurangan:
- ⚠️ Reset hanya terjadi saat ada yang buka aplikasi
- ⚠️ Jika tidak ada yang buka aplikasi, data tidak ter-reset

---

## 🔍 Monitoring & Troubleshooting

### Cek Log Cron Job

**File Log:** `cron/reset_attendance.log`

**Contoh Log Sukses:**
```
[2026-02-18 00:00:01] === Starting Daily Attendance Reset ===
[2026-02-18 00:00:01] Database connected successfully
[2026-02-18 00:00:01] Reset date: 2026-02-18
[2026-02-18 00:00:01] Found 9 positions
[2026-02-18 00:00:02] Successfully created 9 attendance records with 'absent' status
[2026-02-18 00:00:02] Cleaned up 45 old attendance records (older than 30 days)
[2026-02-18 00:00:02] === Daily Attendance Reset Completed Successfully ===
```

### Test Manual Cron Script

**Via Browser:**
```
https://yourdomain.com/cron/reset_attendance.php
```

**Via SSH:**
```bash
php /path/to/your/project/cron/reset_attendance.php
```

### Cek Database

```sql
-- Cek data hari ini
SELECT * FROM attendance WHERE attendance_date = CURDATE();

-- Cek jumlah record per tanggal
SELECT attendance_date, COUNT(*) as total 
FROM attendance 
GROUP BY attendance_date 
ORDER BY attendance_date DESC 
LIMIT 10;
```

---

## 🛠️ Konfigurasi Tambahan

### Ubah Jam Reset

Edit file `cron/reset_attendance.php` tidak perlu diubah.
Cukup ubah jadwal cron job:

**Contoh: Reset jam 06:00 pagi**
```bash
0 6 * * * /usr/bin/php /path/to/your/project/cron/reset_attendance.php
```

### Nonaktifkan Auto-Cleanup

Secara default, script akan menghapus data kehadiran yang lebih lama dari 30 hari.

Untuk menonaktifkan, edit `cron/reset_attendance.php`:
```php
// Comment baris ini (line ~70-80):
// $cleanupDays = 30;
// $cleanupDate = date('Y-m-d', strtotime("-{$cleanupDays} days"));
// ... dst
```

### Ubah Periode Cleanup

Edit `cron/reset_attendance.php` line ~70:
```php
$cleanupDays = 90; // Ubah dari 30 ke 90 hari
```

---

## 📊 Status Implementasi

| Fitur | Status | Keterangan |
|-------|--------|------------|
| Cron Script | ✅ Siap | `cron/reset_attendance.php` |
| Auto-Reset API | ✅ Aktif | `api/check_and_reset.php` |
| Frontend Integration | ✅ Aktif | Otomatis cek saat load |
| Logging | ✅ Aktif | `cron/reset_attendance.log` |
| Auto-Cleanup | ✅ Aktif | Hapus data > 30 hari |

---

## 🎯 Rekomendasi

### Untuk Shared Hosting:
1. ✅ Gunakan **Auto-Reset on Access** (sudah aktif)
2. ✅ Setup **Cron Job via cPanel** sebagai backup
3. ⚠️ Pastikan cron job berjalan dengan cek log

### Untuk VPS/Dedicated Server:
1. ✅ Setup **Cron Job via SSH** (lebih reliable)
2. ✅ **Auto-Reset on Access** tetap aktif sebagai backup
3. ✅ Monitor log secara berkala

---

## 📞 Support

Jika mengalami masalah:

1. **Cek log file:** `cron/reset_attendance.log`
2. **Test manual:** Buka `https://yourdomain.com/cron/reset_attendance.php`
3. **Cek database:** Pastikan tabel `attendance` ada dan accessible
4. **Cek permission:** File `cron/reset_attendance.php` harus executable

---

## 🔐 Security Notes

1. **Restrict Access (Optional)**
   
   Edit `cron/reset_attendance.php` line 15-18:
   ```php
   // Uncomment untuk restrict akses
   if (!in_array($client_ip, $allowed_ips)) {
       http_response_code(403);
       die('Access denied');
   }
   ```

2. **Tambahkan IP Server**
   ```php
   $allowed_ips = ['127.0.0.1', '::1', 'YOUR_SERVER_IP'];
   ```

3. **Gunakan .htaccess Protection**
   
   Buat file `cron/.htaccess`:
   ```apache
   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1
   Allow from YOUR_SERVER_IP
   ```

---

**Dibuat:** 18 Februari 2026  
**Versi:** 1.0  
**Status:** Production Ready ✅
