• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/ustat/ustat.php
  • Класс: BitrixIntranetUStatUStat
  • Вызов: UStat::getStatusInformation
static function getStatusInformation()
{
	// 1. activity score: emulate last 60 minutes
	$currentActivity = static::getCurrentActivity();

	// 2. involvement: last 24 hours
	// SELECT COUNT(1) AS `INVOLVED_COUNT` FROM (SELECT CASE WHEN
	//		(CASE WHEN SUM(TASKS) > 0 THEN 1 ELSE 0 END + CASE WHEN SUM(CRM) > 0 THEN 1 ELSE 0 END + ...)  >= 4
	//		THEN 1 ELSE 0 END) AS INVOLVED FROM ... GROUP BY USER_ID)
	// WHERE INVOLVED = 1

	$fromDate = TypeDateTime::createFromTimestamp(mktime(0, 0, 0));

	$toDate = TypeDateTime::createFromTimestamp(mktime(24, 0, 0));

	$currentInvolvement = static::getDepartmentSummaryInvolvement(
		0,
		$fromDate,
		$toDate,
		'hour'
	);
	/*
	$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
	);

	// subquery
	$queryByUser = new EntityQuery(UserHourTable::getEntity());

	$queryByUser->setSelect(array(
		'USER_ID',
		'INVOLVED' => array(
			'data_type' => 'integer',
			'expression' => array_merge(array($involvedExpression), $names)
		)))
		->setFilter(array(
			'> array(
				ConvertTimeStamp(mktime(date('G'), 0, 0, date('n'), date('j')-1), 'FULL'), // prev day, same hour
				ConvertTimeStamp(time(), 'FULL')
			)
		))
		->setGroup('USER_ID');

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

	$query->setSelect(array(
		'INVOLVED_COUNT' => array(
			'data_type' => 'integer',
			'expression' => array('COUNT(1)')
		)))
		->setFilter(array('=INVOLVED' => 1));

	$data = $query->exec()->fetch();
	$currentInvolvement = (int) $data['INVOLVED_COUNT'];
	*/

	/*
	// 3. total employees
	$usersDepartments = static::getUsersDepartments();
	$currentTotalUsers = count($usersDepartments);

	// 4. online employees
	$result = MainUserTable::getList(array(
		'select' => array('ONLINE_COUNT' => array(
			'data_type' => 'integer',
			'expression' => array('COUNT(1)')
		)),
		'filter' => array('=IS_ONLINE' => true)
	));

	$data = $result->fetch();
	$currentUsersOnline = (int) $data['ONLINE_COUNT'];

	// 5. absentees
	$currentUsersAbsent = 0;
	$allUsers = array_keys($usersDepartments);

	$allAbsenceData = CIntranetUtils::getAbsenceData(array(
		'DATE_START' => ConvertTimeStamp(mktime(0, 0, 0), 'FULL'), // current day start
		'DATE_FINISH' => ConvertTimeStamp(mktime(23, 59, 59), 'FULL'), // current day end
		'PER_USER' => true
	));

	foreach ($allUsers as $userId)
	{
		if (isset($allAbsenceData[$userId]) && static::checkTodayAbsence($allAbsenceData[$userId]))
		{
			++$currentUsersAbsent;
		}
	}
	*/

	// done!
	return array(
		'ACTIVITY' => $currentActivity,
		'INVOLVEMENT' => $currentInvolvement,
		//'TOTAL_USERS' => $currentTotalUsers,
		//'USERS_ONLINE' => $currentUsersOnline,
		//'USERS_ABSENT' => $currentUsersAbsent
	);
}