Files
api-btekno/REPEATED_UPDATE_BEHAVIOR.md

232 lines
6.2 KiB
Markdown

# 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`.