diff --git a/TEST_MANUAL_CRON.md b/TEST_MANUAL_CRON.md new file mode 100644 index 0000000..595eb70 --- /dev/null +++ b/TEST_MANUAL_CRON.md @@ -0,0 +1,285 @@ +# Test Manual Cron - Hourly Summary + +## Cara Test Manual Execute Cron + +### 1. Test Update Hari Ini (Semua Jam) + +```bash +cd /www/wwwroot/api.btekno.cloud/api +php bin/hourly_summary.php today +``` + +**Yang terjadi:** +- ✅ Query semua event hari ini dari `entry_events` +- ✅ Group by jam (0-23), location, gate, category +- ✅ Upsert ke `hourly_summary` (INSERT jika baru, UPDATE jika sudah ada) +- ✅ Data lama **DIGANTI** dengan hasil rekap ulang + +### 2. Test Update Jam Tertentu Hari Ini + +```bash +# Update jam 14 (2 siang) hari ini +php bin/hourly_summary.php today 14 + +# Update jam 1 pagi hari ini +php bin/hourly_summary.php today 1 +``` + +**Yang terjadi:** +- ✅ Query hanya event jam tertentu hari ini +- ✅ Lebih cepat karena hanya proses 1 jam +- ✅ Upsert ke `hourly_summary` untuk jam tersebut + +### 3. Test Rekap Kemarin + +```bash +php bin/hourly_summary.php yesterday +``` + +**Yang terjadi:** +- ✅ Query semua event kemarin dari `entry_events` +- ✅ Rekap semua jam kemarin (0-23) +- ✅ Upsert ke `hourly_summary` untuk kemarin + +## Verifikasi Data Ter-Update + +### Sebelum Execute Cron + +```sql +-- Cek data jam tertentu hari ini +SELECT + summary_date, + summary_hour, + location_code, + gate_code, + category, + total_count, + total_amount, + updated_at +FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = HOUR(NOW()) +ORDER BY summary_hour DESC, location_code, gate_code, category; + +-- Atau cek jam tertentu (misalnya jam 14) +SELECT * FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = 14; +``` + +### Execute Cron Manual + +```bash +# Contoh: update jam 14 hari ini +php bin/hourly_summary.php today 14 +``` + +**Output yang diharapkan:** +``` +Processing hourly summary for date: 2025-12-17, hour: 14 +Success! +Date: 2025-12-17 +Hour: 14 +Rows processed: 12 +``` + +### Setelah Execute Cron + +```sql +-- Cek lagi data yang sama +SELECT + summary_date, + summary_hour, + location_code, + gate_code, + category, + total_count, + total_amount, + updated_at +FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = 14; + +-- Bandingkan: +-- 1. total_count dan total_amount harus sesuai dengan entry_events +-- 2. updated_at harus ter-update (jika kolom ada) +``` + +### Verifikasi dengan Entry Events + +```sql +-- Hitung manual dari entry_events untuk jam tertentu +SELECT + DATE(event_time) as date, + HOUR(event_time) as hour, + location_code, + gate_code, + category, + COUNT(*) as count_from_events +FROM entry_events +WHERE DATE(event_time) = CURDATE() +AND HOUR(event_time) = 14 +GROUP BY DATE(event_time), HOUR(event_time), location_code, gate_code, category; + +-- Bandingkan dengan hourly_summary: +SELECT + summary_date, + summary_hour, + location_code, + gate_code, + category, + total_count as count_from_summary +FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = 14; + +-- Harusnya count_from_events = count_from_summary +``` + +## Contoh Test Lengkap + +### Step 1: Cek Data Sebelumnya + +```bash +# Masuk ke MySQL +mysql -u sql_retribusi -p sql_retribusi + +# Query data jam 14 hari ini +SELECT * FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = 14 +LIMIT 5; +``` + +**Catat nilai:** +- total_count: ? +- total_amount: ? + +### Step 2: Execute Cron Manual + +```bash +# Keluar dari MySQL (exit) +# Execute cron manual +cd /www/wwwroot/api.btekno.cloud/api +php bin/hourly_summary.php today 14 +``` + +**Output:** +``` +Processing hourly summary for date: 2025-12-17, hour: 14 +Success! +Date: 2025-12-17 +Hour: 14 +Rows processed: 12 +``` + +### Step 3: Cek Data Setelah Update + +```bash +# Masuk ke MySQL lagi +mysql -u sql_retribusi -p sql_retribusi + +# Query data yang sama +SELECT * FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = 14 +LIMIT 5; +``` + +**Bandingkan:** +- ✅ total_count harus sesuai dengan COUNT dari entry_events +- ✅ total_amount harus sesuai dengan total_count × tariff.price +- ✅ Data **DIGANTI** dengan nilai baru (bukan ditambah) + +### Step 4: Verifikasi dengan Entry Events + +```sql +-- Hitung dari source data +SELECT + location_code, + gate_code, + category, + COUNT(*) as event_count +FROM entry_events +WHERE DATE(event_time) = CURDATE() +AND HOUR(event_time) = 14 +GROUP BY location_code, gate_code, category; + +-- Bandingkan dengan summary +SELECT + location_code, + gate_code, + category, + total_count +FROM hourly_summary +WHERE summary_date = CURDATE() +AND summary_hour = 14; + +-- Harusnya event_count = total_count untuk setiap kombinasi +``` + +## Troubleshooting + +### Problem: Data Tidak Ter-Update + +**Cek:** +1. Apakah ada error saat execute? + ```bash + php bin/hourly_summary.php today 14 2>&1 + ``` + +2. Apakah ada data di entry_events untuk jam tersebut? + ```sql + SELECT COUNT(*) FROM entry_events + WHERE DATE(event_time) = CURDATE() + AND HOUR(event_time) = 14; + ``` + +3. Apakah location/gate aktif? + ```sql + SELECT * FROM locations WHERE code = 'kerkof_01' AND is_active = 1; + SELECT * FROM gates WHERE location_code = 'kerkof_01' AND is_active = 1; + ``` + +### Problem: Data Double/Triple Count + +**Ini TIDAK mungkin terjadi** karena menggunakan `ON DUPLICATE KEY UPDATE`: +- Data selalu diganti, bukan ditambah +- Jika terlihat double, kemungkinan ada masalah di query aggregation + +**Cek:** +```sql +-- Cek apakah ada duplikasi di hourly_summary +SELECT + summary_date, + summary_hour, + location_code, + gate_code, + category, + COUNT(*) as duplicate_count +FROM hourly_summary +WHERE summary_date = CURDATE() +GROUP BY summary_date, summary_hour, location_code, gate_code, category +HAVING duplicate_count > 1; + +-- Harusnya tidak ada hasil (karena ada PRIMARY KEY) +``` + +## Kesimpulan + +✅ **Manual execute cron AKAN mengupdate data** +- Data lama diganti dengan hasil rekap ulang +- Bukan ditambah, tapi diganti +- Memastikan data summary selalu sesuai dengan entry_events + +✅ **Cara test:** +1. Cek data sebelum execute +2. Execute cron manual +3. Cek data setelah execute +4. Verifikasi dengan entry_events + +✅ **Expected behavior:** +- Data ter-update sesuai dengan entry_events +- Nilai lama diganti dengan nilai baru +- Konsisten dan akurat +