- Модуль: 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;
}