Files
api-btekno/TEST_MANUAL_CRON.md

286 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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