Add guide for manual cron execution testing

This commit is contained in:
mwpn
2025-12-17 17:46:00 +07:00
parent 4e7878d417
commit 828fae33e9

285
TEST_MANUAL_CRON.md Normal file
View File

@@ -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