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