Files
api-btekno/TEST_MANUAL_CRON.md

6.0 KiB
Raw Blame History

Test Manual Cron - Hourly Summary

Cara Test Manual Execute Cron

1. Test Update Hari Ini (Semua Jam)

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

# 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

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

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

# 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

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

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

# 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

# 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

# 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

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

    php bin/hourly_summary.php today 14 2>&1
    
  2. Apakah ada data di entry_events untuk jam tersebut?

    SELECT COUNT(*) FROM entry_events
    WHERE DATE(event_time) = CURDATE()
    AND HOUR(event_time) = 14;
    
  3. Apakah location/gate aktif?

    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:

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