diff --git a/includes/utilities.php b/includes/utilities.php index 61f273d..e44b2e8 100644 --- a/includes/utilities.php +++ b/includes/utilities.php @@ -205,32 +205,39 @@ function fetchVaultRecords($user = null) { * @return int The total balance of the given user (or all users if no user is given). */ function vaultLoop ($name=null) { - $liveBalance = $name === null - ? null - : fetchLiveVaultBalance($name); + if ($name !== null) { + // Per-user path: prefer live /money balance, fall back to MAX(running_balance). + $liveBalance = fetchLiveVaultBalance($name); + if ($liveBalance !== null) { + return $liveBalance; + } - if ($liveBalance !== null) { - return $liveBalance; - } - - // Fallback: derive from stored entries. Used when the live /money call - // fails or is not configured for the user. - $pdo = getDatabaseConnection(); - - if ($name === null) { - $stmt = $pdo->query( - 'SELECT COALESCE(SUM(max_balance), 0) FROM ' - . '(SELECT MAX(running_balance) AS max_balance FROM vault GROUP BY user)' - ); + $pdo = getDatabaseConnection(); + $stmt = $pdo->prepare('SELECT MAX(running_balance) FROM vault WHERE user = :user'); + $stmt->bindValue(':user', $name); + $stmt->execute(); return (int)$stmt->fetchColumn(); } - $stmt = $pdo->prepare('SELECT MAX(running_balance) FROM vault WHERE user = :user'); - $stmt->bindValue(':user', $name); - $stmt->execute(); + // All-users path: sum the live /money value for each user. For any user + // whose /money call failed, fall back to MAX(running_balance) for that user. + $pdo = getDatabaseConnection(); + $sum = 0; + foreach (USER_KEYS as $user => $apiKey) { + $live = fetchLiveVaultBalance($user); + if ($live !== null) { + $sum += $live; + continue; + } - return (int)$stmt->fetchColumn(); + $stmt = $pdo->prepare('SELECT MAX(running_balance) FROM vault WHERE user = :user'); + $stmt->bindValue(':user', $user); + $stmt->execute(); + $sum += (int)$stmt->fetchColumn(); + } + + return $sum; } /**