0, 'units' => 0]; $out = ['unit' => 'tokens', 'money' => false, 'budget' => null, 'confirmed' => $zero, 'estimated_unconfirmed' => $zero, 'administrator_entered' => $zero, 'in_progress' => $zero, 'uncertain' => $zero, 'not_dispatched' => $zero, 'released' => $zero]; $b = $this->db->selectOne('SELECT limit_units, reserved_units, spent_units FROM {budgets} WHERE site_id = ? AND bucket = ?', [$siteId, self::BUCKET]); if ($b !== null) { $limit = (int) $b['limit_units']; $out['budget'] = ['limit' => $limit, 'reserved' => (int) $b['reserved_units'], 'spent' => (int) $b['spent_units'], 'available' => $limit - (int) $b['reserved_units'] - (int) $b['spent_units']]; } $rows = $this->db->select( 'SELECT state, usage_basis, COUNT(*) AS n, SUM(reserved_units) AS reserved, SUM(COALESCE(settled_units, 0)) AS settled FROM {reservations} WHERE site_id = ? AND buckets = ? GROUP BY state, usage_basis', [$siteId, self::BUCKETS_JSON] ); foreach ($rows as $row) { $basis = (string) ($row['usage_basis'] ?? ''); [$key, $units] = match ((string) $row['state']) { Reservation::RESERVED, Reservation::DISPATCHED => ['in_progress', (int) $row['reserved']], Reservation::UNCERTAIN => ['uncertain', (int) $row['reserved']], Reservation::RELEASED => ['released', (int) $row['reserved']], default => match ($basis) { Reservation::BASIS_NOT_DISPATCHED => ['not_dispatched', 0], Reservation::BASIS_ESTIMATED => ['estimated_unconfirmed', (int) $row['settled']], Reservation::BASIS_ADMIN_ENTERED => ['administrator_entered', (int) $row['settled']], default => ['confirmed', (int) $row['settled']], }, }; $out[$key]['requests'] += (int) $row['n']; $out[$key]['units'] += $units; } return $out; } }