# Behavior Update Berulang di Hourly Summary ## Jawaban Singkat **YA, ketika cron hourly jalan lagi, data akan di-UPDATE lagi.** Ini adalah **behavior yang benar dan diinginkan** untuk memastikan data selalu akurat. ## Timeline Update Berulang ### Skenario: Manual Execute + Cron Otomatis **Jam 14:00 - Manual execute:** ```bash php bin/hourly_summary.php today 13 ``` - ✅ Update data jam 13:00 - ✅ Data jam 13:00 sekarang sesuai dengan entry_events **Jam 15:00 - Cron otomatis jalan:** ```bash # Cron command: php bin/hourly_summary.php today 14 ``` - ✅ Update data jam 14:00 (jam yang baru selesai) - ✅ Data jam 13:00 **TIDAK diubah** (karena tidak di-rekap) **Jam 16:00 - Cron otomatis jalan lagi:** ```bash # Cron command: php bin/hourly_summary.php today 15 ``` - ✅ Update data jam 15:00 (jam yang baru selesai) - ✅ Data jam 13:00 dan 14:00 **TIDAK diubah** ### Skenario: Cron Update Jam yang Sama Berulang **Jam 15:00 - Cron pertama kali:** ```bash php bin/hourly_summary.php today 14 ``` - ✅ Update data jam 14:00 - ✅ total_count: 10, total_amount: 20000 **Jam 15:30 - Ada event baru masuk (terlambat):** - Event jam 14:00 masuk di jam 15:30 (terlambat) - entry_events sekarang punya 11 events untuk jam 14:00 **Jam 16:00 - Cron jalan lagi (jika rekap ulang jam 14):** ```bash # Jika manual execute lagi: php bin/hourly_summary.php today 14 ``` - ✅ **UPDATE LAGI** data jam 14:00 - ✅ total_count: 10 → 11 (DIGANTI dengan nilai baru) - ✅ total_amount: 20000 → 22000 (DIGANTI dengan nilai baru) - ✅ Event terlambat sekarang terhitung ## Mengapa Update Berulang Itu Baik? ### 1. **Akurasi Data** - Data summary selalu mencerminkan data aktual di `entry_events` - Jika ada event terlambat, akan otomatis terhitung saat rekap ulang ### 2. **Idempotent** - Bisa dijalankan berulang tanpa merusak data - Hasil selalu sama, tidak peduli berapa kali dijalankan - Tidak akan double count karena menggunakan `ON DUPLICATE KEY UPDATE` ### 3. **Self-Healing** - Jika ada masalah di cron sebelumnya, bisa di-rekap ulang - Tidak perlu manual correction ## Contoh Timeline Lengkap ### Hari: 2025-12-17 **Jam 14:00 - Manual execute:** ```bash php bin/hourly_summary.php today 13 ``` - ✅ Update jam 13:00 - ✅ total_count: 5, total_amount: 10000 **Jam 15:00 - Cron otomatis:** ```bash # Cron command otomatis: php bin/hourly_summary.php today 14 ``` - ✅ Update jam 14:00 (jam yang baru selesai) - ✅ Jam 13:00 **TIDAK diubah** (karena tidak di-rekap) **Jam 15:30 - Event terlambat masuk:** - Event jam 13:00 masuk di jam 15:30 (terlambat) - entry_events sekarang punya 6 events untuk jam 13:00 **Jam 16:00 - Cron otomatis:** ```bash # Cron command otomatis: php bin/hourly_summary.php today 15 ``` - ✅ Update jam 15:00 (jam yang baru selesai) - ✅ Jam 13:00 **MASIH** total_count: 5 (belum ter-update) **Jam 16:30 - Manual execute lagi untuk jam 13:** ```bash php bin/hourly_summary.php today 13 ``` - ✅ **UPDATE LAGI** jam 13:00 - ✅ total_count: 5 → 6 (DIGANTI dengan nilai baru) - ✅ total_amount: 10000 → 12000 (DIGANTI dengan nilai baru) - ✅ Event terlambat sekarang terhitung ## Apakah Data Akan Hilang? **TIDAK**, data tidak akan hilang karena: 1. **ON DUPLICATE KEY UPDATE** hanya mengganti nilai, bukan menghapus row 2. **Primary key** tetap sama, row tetap ada 3. **Hanya nilai** (total_count, total_amount) yang diganti ### Contoh: **Sebelum update:** ``` summary_date: 2025-12-17 summary_hour: 13 location_code: kerkof_01 gate_code: gate01 category: motor total_count: 5 total_amount: 10000 ``` **Setelah update:** ``` summary_date: 2025-12-17 ← SAMA summary_hour: 13 ← SAMA location_code: kerkof_01 ← SAMA gate_code: gate01 ← SAMA category: motor ← SAMA total_count: 6 ← DIGANTI (5 → 6) total_amount: 12000 ← DIGANTI (10000 → 12000) ``` **Row tetap ada**, hanya nilainya yang berubah. ## Apakah Akan Double Count? **TIDAK**, tidak akan double count karena: 1. **ON DUPLICATE KEY UPDATE** mengganti nilai, bukan menambah 2. Query selalu hitung ulang dari `entry_events`, bukan menambah ke nilai lama 3. Setiap kali rekap, hasilnya selalu sama (idempotent) ### Contoh: **Skenario salah (jika ditambah):** ``` total_count lama: 5 total_count baru: 6 total_count hasil: 5 + 6 = 11 ❌ SALAH ``` **Skenario benar (diganti):** ``` total_count lama: 5 total_count baru: 6 total_count hasil: 6 ✅ BENAR (diganti, bukan ditambah) ``` ## Kapan Data Akan Di-Update Lagi? ### 1. **Cron Otomatis Setiap Jam** - Update jam yang baru saja selesai - Contoh: jam 15:00 update jam 14:00 - Jam sebelumnya **TIDAK diubah** ### 2. **Manual Execute** - Update jam yang ditentukan - Bisa update jam berapa saja, kapan saja - Berguna untuk rekap ulang atau fix data ### 3. **Rekap Final Kemarin** - Setiap hari jam 1 pagi - Rekap semua jam kemarin - Memastikan data kemarin lengkap ## Best Practice ### ✅ **Yang Benar:** 1. **Biarkan cron otomatis jalan setiap jam** - Update jam yang baru selesai - Tidak perlu manual intervention 2. **Manual execute hanya jika perlu:** - Ada event terlambat yang perlu di-rekap - Ada masalah di cron sebelumnya - Testing atau debugging 3. **Rekap final kemarin (opsional):** - Setiap hari jam 1 pagi - Memastikan data kemarin lengkap ### ❌ **Yang Salah:** 1. **Jangan khawatir data hilang** - Data tidak akan hilang, hanya nilai yang diganti - Row tetap ada dengan primary key yang sama 2. **Jangan takut double count** - Tidak akan double count karena menggunakan UPDATE, bukan ADD - Query selalu hitung ulang dari source data 3. **Jangan manual execute terlalu sering** - Biarkan cron otomatis bekerja - Manual execute hanya jika benar-benar perlu ## Kesimpulan | Aspek | Behavior | |-------|----------| | **Apakah akan di-update lagi?** | ✅ YA, setiap kali cron jalan atau manual execute | | **Apakah data akan hilang?** | ❌ TIDAK, row tetap ada, hanya nilai yang diganti | | **Apakah akan double count?** | ❌ TIDAK, menggunakan UPDATE bukan ADD | | **Apakah ini normal?** | ✅ YA, ini behavior yang benar dan diinginkan | | **Kapan akan di-update?** | Setiap jam (cron otomatis) atau manual execute | **Intinya:** Update berulang adalah **normal dan benar**. Ini memastikan data summary selalu akurat dan sesuai dengan `entry_events`.