• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/ustat/ustat.php
  • Класс: BitrixIntranetUStatUStat
  • Вызов: UStat::getUsersTop
static function getUsersTop(
	$userId,
	$departmentId,
	TypeDateTime $dateFrom,
	TypeDateTime $dateTo,
	$interval,
	$section = null,
	$nonInvolvedOnly = false,
	$from = 0,
	$limit = 100
)
{
	if (!in_array($interval, array('hour', 'day', 'month'), true))
	{
		throw new MainArgumentException('Interval should be the "hour", or "day", or "month".');
	}

	$data = array();

	// rating for TOTAL activity or for an instrument
	$sumField = ($section) === null ? 'TOTAL' : $section;

	if ($interval === 'hour')
	{
		$query = new EntityQuery(UserHourTable::getEntity());

		$query->setSelect(array(
			'USER_ID',
			new EntityExpressionField('SUM_'.$sumField, 'SUM(%s)', $sumField)
		));

		$query->setFilter(array(
			'> array(
				ConvertTimeStamp($dateFrom->getTimestamp(), 'FULL'),
				ConvertTimeStamp($dateTo->getTimestamp(), 'FULL')
			)
		));
	}
	else
	{
		$query = new EntityQuery(UserDayTable::getEntity());

		$query->setSelect(array(
			'USER_ID',
			new EntityExpressionField('SUM_'.$sumField, 'SUM(%s)', $sumField)
		));

		$query->setFilter(array(
			'> array(
				ConvertTimeStamp($dateFrom->getTimestamp()),
				ConvertTimeStamp($dateTo->getTimestamp())
			)
		));
	}

	if ($sumField == 'TOTAL')
	{
		// count number of used services
		$names = UserHourTable::getSectionNames();

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

		$query->addSelect(new EntityExpressionField('SERVICES_COUNT', $serviceCountExpression, $names));

		if ($nonInvolvedOnly)
		{
			// who didn't use 4 or more instruments
			$query->addFilter('addFilter('=SUM_'.$sumField, 0);
		}
		else
		{
			// who used it
			$query->addFilter('>SUM_'.$sumField, 0);
		}
	}

	$query->addOrder('SUM_'.$sumField, 'DESC');

	if (!$nonInvolvedOnly)
	{
		// we don't need this for non-involved users
		$query->registerRuntimeField('MYSELF', array(
			'data_type' => 'integer',
			'expression' => array('CASE WHEN %s = '.(int)$userId.' THEN 1 ELSE 0 END', 'USER_ID')
		));

		$query->addOrder('MYSELF', 'DESC');
	}


	$query->setOffset($from);
	$query->setLimit($limit);

	$result = $query->exec();

	while ($row = $result->fetch())
	{
		$_data = array(
			'USER_ID' => $row['USER_ID'],
			'ACTIVITY' => $row['SUM_'.$sumField]
		);

		if ($sumField == 'TOTAL')
		{
			$_data['SERVICES_COUNT'] = $row['SERVICES_COUNT'];
			$_data['IS_INVOLVED'] = ($row['SERVICES_COUNT'] >= static::INVOLVEMENT_SERVICE_COUNT);
		}
		else
		{
			$_data['SERVICES_COUNT'] = null;
			$_data['IS_INVOLVED'] = ($row['SUM_'.$sumField] > 0);
		}

		$data[] = $_data;
	}

	return $data;
}