diff --git a/REPEATED_UPDATE_BEHAVIOR.md b/REPEATED_UPDATE_BEHAVIOR.md new file mode 100644 index 0000000..d318b93 --- /dev/null +++ b/REPEATED_UPDATE_BEHAVIOR.md @@ -0,0 +1,231 @@ +# 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`. +