Add guide for manual cron execution testing
This commit is contained in:
285
TEST_MANUAL_CRON.md
Normal file
285
TEST_MANUAL_CRON.md
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user