Files
api-btekno/bin/test_hourly_api.php

190 lines
5.8 KiB
PHP

#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
* Test script untuk cek response API hourly summary
*
* Usage:
* php bin/test_hourly_api.php [date]
*
* Examples:
* php bin/test_hourly_api.php 2025-12-17
* php bin/test_hourly_api.php today
*/
// Get project root directory
$rootPath = dirname(__DIR__);
// Load autoloader
require $rootPath . '/vendor/autoload.php';
use App\Config\AppConfig;
use App\Modules\Retribusi\Summary\HourlySummaryService;
use App\Support\Database;
// Load environment variables
AppConfig::loadEnv($rootPath);
// Get date from command line
$dateInput = $argv[1] ?? 'today';
// Handle special keywords
if ($dateInput === 'today') {
$date = date('Y-m-d');
} elseif ($dateInput === 'yesterday') {
$date = date('Y-m-d', strtotime('-1 day'));
} else {
$date = $dateInput;
}
// Validate date format
$dateTime = DateTime::createFromFormat('Y-m-d', $date);
if ($dateTime === false || $dateTime->format('Y-m-d') !== $date) {
echo "Error: Invalid date format. Expected Y-m-d (e.g., 2025-01-01) or 'today'/'yesterday'\n";
exit(1);
}
try {
// Get database connection
$dbHost = AppConfig::get('DB_HOST', 'localhost');
$dbName = AppConfig::get('DB_NAME', '');
$dbUser = AppConfig::get('DB_USER', '');
$dbPass = AppConfig::get('DB_PASS', '');
if (empty($dbName) || empty($dbUser)) {
echo "Error: Database configuration not found in .env\n";
exit(1);
}
$db = Database::getConnection($dbHost, $dbName, $dbUser, $dbPass);
echo "=== Test Hourly Summary API Response ===\n\n";
echo "Date: {$date}\n\n";
// Test service method (sama seperti yang dipanggil oleh API)
$service = new HourlySummaryService($db);
$data = $service->getHourlySummary($date);
echo "1. Service Response:\n";
echo str_repeat("-", 80) . "\n";
echo "Labels count: " . count($data['labels']) . " (should be 24)\n";
echo "Total count series length: " . count($data['series']['total_count']) . " (should be 24)\n";
echo "Total amount series length: " . count($data['series']['total_amount']) . " (should be 24)\n\n";
echo "2. Data per Hour (non-zero only):\n";
echo str_repeat("-", 80) . "\n";
$hasData = false;
$totalAmountSum = 0;
$totalCountSum = 0;
for ($hour = 0; $hour < 24; $hour++) {
$count = $data['series']['total_count'][$hour];
$amount = $data['series']['total_amount'][$hour];
if ($count > 0 || $amount > 0) {
$hasData = true;
$totalAmountSum += $amount;
$totalCountSum += $count;
echo sprintf(
" Hour %02d: Count = %d, Amount = %s\n",
$hour,
$count,
number_format($amount, 0, ',', '.')
);
}
}
if (!$hasData) {
echo " ⚠️ Tidak ada data untuk tanggal tersebut\n";
}
echo "\n";
echo "3. Summary:\n";
echo str_repeat("-", 80) . "\n";
echo "Total Count (sum all hours): " . number_format($totalCountSum, 0, ',', '.') . "\n";
echo "Total Amount (sum all hours): " . number_format($totalAmountSum, 0, ',', '.') . "\n\n";
// Verify dengan query langsung ke database
echo "4. Database Verification:\n";
echo str_repeat("-", 80) . "\n";
$verifySql = "
SELECT
summary_hour,
SUM(total_count) as total_count,
SUM(total_amount) as total_amount
FROM hourly_summary
WHERE summary_date = ?
GROUP BY summary_hour
ORDER BY summary_hour ASC
";
$verifyStmt = $db->prepare($verifySql);
$verifyStmt->execute([$date]);
$verifyResults = $verifyStmt->fetchAll(PDO::FETCH_ASSOC);
$dbTotalAmount = 0;
$dbTotalCount = 0;
foreach ($verifyResults as $result) {
$hour = (int) $result['summary_hour'];
$count = (int) $result['total_count'];
$amount = (int) $result['total_amount'];
$dbTotalAmount += $amount;
$dbTotalCount += $count;
// Compare dengan service response
$serviceCount = $data['series']['total_count'][$hour];
$serviceAmount = $data['series']['total_amount'][$hour];
$countMatch = ($count == $serviceCount) ? '✅' : '❌';
$amountMatch = ($amount == $serviceAmount) ? '✅' : '❌';
if ($count > 0 || $amount > 0) {
echo sprintf(
" Hour %02d: DB Count=%d %s Service Count=%d | DB Amount=%s %s Service Amount=%s\n",
$hour,
$count,
$countMatch,
$serviceCount,
number_format($amount, 0, ',', '.'),
$amountMatch,
number_format($serviceAmount, 0, ',', '.')
);
}
}
echo "\n";
echo "Database Total Amount: " . number_format($dbTotalAmount, 0, ',', '.') . "\n";
echo "Service Total Amount: " . number_format($totalAmountSum, 0, ',', '.') . "\n";
if ($dbTotalAmount == $totalAmountSum) {
echo "✅ Total amount MATCH antara database dan service\n";
} else {
echo "❌ Total amount TIDAK MATCH!\n";
echo " Difference: " . number_format(abs($dbTotalAmount - $totalAmountSum), 0, ',', '.') . "\n";
}
echo "\n";
echo "5. JSON Response Format (first 3 hours):\n";
echo str_repeat("-", 80) . "\n";
$sampleData = [
'labels' => array_slice($data['labels'], 0, 3),
'series' => [
'total_count' => array_slice($data['series']['total_count'], 0, 3),
'total_amount' => array_slice($data['series']['total_amount'], 0, 3)
]
];
echo json_encode($sampleData, JSON_PRETTY_PRINT) . "\n";
echo "\n=== Test Complete ===\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
echo $e->getTraceAsString() . "\n";
exit(1);
}