# 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