• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/lib/ustat/ustat.php
  • Класс: BitrixIntranetUStatUStat
  • Вызов: UStat::recountDailyInvolvement
static function recountDailyInvolvement(TypeDate $day = null)
{
	// should be called only after recount*ActiveUsers
	// because we need ACTIVE_USERS already set up

	$departments = array();

	if ($day === null)
	{
		$day = new TypeDate();
	}

	// users' departments
	$usersDepartments = static::getUsersDepartments();

	// add "company" for each user
	foreach ($usersDepartments as &$_usersDepartments)
	{
		$_usersDepartments[] = 0;
	}

	// count
	$result = UserDayTable::getList(array('filter' => array(
		'=DAY' => ConvertTimeStamp($day->getTimestamp(), 'SHORT')
	)));

	while ($row = $result->fetch())
	{
		$invCount = 0;

		if (!isset($usersDepartments[$row['USER_ID']]))
		{
			// skip deleted users
			continue;
		}

		foreach ($row as $k => $v)
		{
			// skip non-activity fields
			if ($k == 'USER_ID' || $k == 'DAY')
			{
				continue;
			}

			// initialize
			foreach ($usersDepartments[$row['USER_ID']] as $deptId)
			{
				if (!isset($departments[$deptId][$k]))
				{
					$departments[$deptId][$k] = 0;
				}
			}

			// summarize
			foreach ($usersDepartments[$row['USER_ID']] as $deptId)
			{
				$departments[$deptId][$k] += $v;
			}

			// increment involvement count
			if ($k != 'TOTAL' && $v > 0)
			{
				++$invCount;
			}
		}

		// check involvement
		if ($invCount >= static::INVOLVEMENT_SERVICE_COUNT)
		{
			foreach ($usersDepartments[$row['USER_ID']] as $deptId)
			{
				if (!isset($departments[$deptId]['INVOLVED']))
				{
					$departments[$deptId]['INVOLVED'] = 0;
				}

				++$departments[$deptId]['INVOLVED'];
			}
		}

	}

	// normalize involved count
	foreach ($departments as &$_department)
	{
		if (!isset($_department['INVOLVED']))
		{
			$_department['INVOLVED'] = 0;
		}
	}

	// update db
	foreach ($departments as $deptId => $activity)
	{
		$activity['INVOLVEMENT'] = new SqlExpression(
			'CASE WHEN ?# > 0 THEN ROUND((?i / ?# * 100), 0) ELSE 0 END',
			'ACTIVE_USERS', $activity['INVOLVED'], 'ACTIVE_USERS'
		);

		unset($activity['INVOLVED']);

		DepartmentDayTable::update(array('DEPT_ID' => $deptId, 'DAY' => $day), $activity);
	}
}