• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/ustat/ustat.php
  • Класс: BitrixIntranetUStatUStat
  • Вызов: UStat::getDepartmentSummaryInvolvement
static function getDepartmentSummaryInvolvement($departmentId, TypeDateTime $dateFrom, TypeDateTime $dateTo, $interval)
{
	// at this moment departmentId doesn't work, data will be counted for a whole company

	if (!in_array($interval, array('hour', 'day', 'month'), true))
	{
		throw new MainArgumentException('Interval should be the "hour", or "day", or "month".');
	}

	if ($interval === 'hour')
	{
		$entity = UserHourTable::getEntity();

		$filter = array(
			'> array(
				ConvertTimeStamp($dateFrom->getTimestamp(), 'FULL'),
				ConvertTimeStamp($dateTo->getTimestamp(), 'FULL')
			)
		);
	}
	else
	{
		$entity = UserDayTable::getEntity();

		$filter = array(
			'> array(
				ConvertTimeStamp($dateFrom->getTimestamp()),
				ConvertTimeStamp($dateTo->getTimestamp())
			)
		);
	}

	$names = UserHourTable::getSectionNames();

	$fieldExpressions = array_fill(0, count($names), 'CASE WHEN SUM(%s) > 0 THEN 1 ELSE 0 END');

	// user involved if used 4 or more services for last 24 hours
	$involvedExpression = sprintf('CASE WHEN (%s) >= %d THEN 1 ELSE 0 END',
		join (' + ', $fieldExpressions), static::INVOLVEMENT_SERVICE_COUNT
	);

	// build query
	$subQuery = new EntityQuery($entity);

	$subQuery->registerRuntimeField('INVOLVED', array(
		'data_type' => 'integer',
		'expression' => array_merge(array($involvedExpression), $names)
	));

	$subQuery->setSelect(array('USER_ID', 'INVOLVED'));

	$subQuery->setFilter($filter);
	$subQuery->setGroup('USER_ID');

	// main query
	$query = new EntityQuery($subQuery);

	$query->registerRuntimeField('INVOLVED_COUNT', array(
		'data_type' => 'integer',
		'expression' => array('SUM(CASE WHEN %s > 0 THEN 1 ELSE 0 END)', 'INVOLVED')
	));

	$query->registerRuntimeField('USERS_COUNT', array(
		'data_type' => 'integer',
		'expression' => array('COUNT(1)')
	));

	$query->setSelect(array('INVOLVED_COUNT', 'USERS_COUNT'));

	$result = $query->exec();
	$data = $result->fetch();

	$involvement = 0;

	if (!empty($data) && !empty($data['USERS_COUNT']))
	{
		$involvement = (int) round($data['INVOLVED_COUNT'] / $data['USERS_COUNT'] * 100);
	}

	return $involvement;
}