summaryrefslogblamecommitdiffstats
path: root/modules-available/statistics/hooks/locations-column.inc.php
blob: 51f280be0e0d4d5822caca287e3f97eb3705577c (plain) (tree)





















































































































































                                                                                                                                                                 
<?php

if (!User::hasPermission('.statistics.view.list')) {
	return null;
}

class ClientCountLocationColumn extends AbstractLocationColumn
{

	private $lookup;

	public function __construct()
	{
		$this->lookup = StatisticsColumnGetData([]);
	}

	public function getColumnHtml(int $locationId): string
	{
		if (!isset($this->lookup[$locationId]))
			return '';
		if ($this->lookup[$locationId]['hasChild'] ?? false) {
			$child = <<<EOF
			(<a href="?do=Statistics&amp;show=list&amp;filters=location~{$locationId}">&downarrow;{$this->lookup[$locationId]['clientCountSum']}</a>)
EOF;
		} else {
			$child = '';
		}

		return <<<EOF
			<div class="pull-right">
			<a href="?do=Statistics&amp;show=list&amp;filters=location={$locationId}">&nbsp;{$this->lookup[$locationId]['clientCount']}&nbsp;</a>
			<span class="text-right" style="display:inline-block;width:6ex">$child</span>
			</div>
EOF;
	}

	public function getEditUrl(int $locationId): string
	{
		return '';
	}

	public function header(): string
	{
		return Dictionary::translateFileModule('statistics', 'module', 'location-column-header-count');
	}

	public function priority(): int
	{
		return 800;
	}

}

class ClientLoadLocationColumn extends AbstractLocationColumn
{

	private $lookup;

	public function __construct()
	{
		$this->lookup = StatisticsColumnGetData([]);
	}

	public function getColumnHtml(int $locationId): string
	{
		if (!isset($this->lookup[$locationId]) || $this->lookup[$locationId]['clientCount'] === 0)
			return '';
		$c =& $this->lookup[$locationId];
		return <<<EOF
			<div class="load-col text-right" style="background:linear-gradient(to right, #f97, #f97 {$c['clientLoad']}%,
				#6fa {$c['clientLoad']}%, #6fa {$c['clientIdle']}%, #eee {$c['clientIdle']}%)">
				{$c['clientLoad']}&thinsp;%
			</div>
EOF;

	}

	public function getEditUrl(int $locationId): string
	{
		return '';
	}

	public function header(): string
	{
		return Dictionary::translateFileModule('statistics', 'module', 'location-column-header-load');
	}

	public function priority(): int
	{
		return 900;
	}

}

function StatisticsColumnGetData(array $allowedLocationIds): array
{
	static $data = [];
	if (!empty($data))
		return $data;
	$extra = '';
	if (in_array(0, $allowedLocationIds)) {
		$extra = ' OR locationid IS NULL';
	}
	$locs = Location::getLocationsAssoc();
	$res = Database::simpleQuery("SELECT m.locationid, Count(*) AS cnt,
       		Sum(If(m.state = 'OCCUPIED', 1, 0)) AS used, Sum(If(m.state = 'IDLE', 1, 0)) AS idle
 				 FROM machine m WHERE (locationid IN (:allowedLocationIds) $extra) GROUP BY locationid", compact('allowedLocationIds'));
	foreach ($res as $row) {
		$locId = (int)$row['locationid'];
		$data[$locId] = [
			'clientCount' => $row['cnt'],
			'clientLoad' => round(100 * $row['used'] / $row['cnt']),
			'clientIdle' => round(100 * ($row['used'] + $row['idle']) / $row['cnt']),
		];
	}
	foreach ($allowedLocationIds as $locId) {
		if (isset($data[$locId]))
			continue;
		$data[$locId] = [
			'clientCount' => 0,
			'clientLoad' => 0,
			'clientIdle' => 0,
		];
	}
	foreach ($data as $locId => &$loc) {
		if (!in_array($locId, $allowedLocationIds))
			continue;
		if (!isset($loc['clientCountSum'])) {
			$loc['clientCountSum'] = 0;
		}
		$loc['clientCountSum'] += $loc['clientCount'];
		if ($locId !== 0) {
			foreach ($locs[$locId]['parents'] as $pid) {
				if (!in_array($pid, $allowedLocationIds))
					continue;
				$data[$pid]['hasChild'] = true;
				if (!isset($data[$pid]['clientCountSum'])) {
					$data[$pid]['clientCountSum'] = 0;
				}
				$data[$pid]['clientCountSum'] += $loc['clientCount'];
			}
		}
	}
	unset($loc);
	return $data;
}

StatisticsColumnGetData($allowedLocationIds);

return [new ClientCountLocationColumn(), new ClientLoadLocationColumn()];