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