• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/internals/counter/collector/projectcollector.php
  • Класс: BitrixTasksInternalsCounterCollectorProjectCollector
  • Вызов: ProjectCollector::recountExpired
private function recountExpired(array $groupIds = [], array $taskIds = [], array $userIds = []): array
{
	$expiredTime = Deadline::getExpiredTime()->format('Y-m-d H:i:s');

	$joinFilter[] = "SU.GROUP_ID = T.GROUP_ID";

	if (count($userIds) === 1)
	{
		$joinFilter[] = 'SU.USER_ID = '. (int) array_shift($userIds);
	}
	elseif (count($userIds) > 1)
	{
		$joinFilter[] = 'SU.USER_ID IN ('. implode(',', $userIds) .')';
	}

	$filter = [];
	if (!empty($taskIds))
	{
		$filter[] = 'T.ID IN ('. implode(',', $taskIds) .')';
	}

	if (count($groupIds) === 1)
	{
		$groupId = (int) array_shift($groupIds);
		$filter[] = 'T.GROUP_ID = '. $groupId;
		$joinFilter[] = 'SU.GROUP_ID = '. $groupId;
	}
	elseif (count($groupIds) > 1)
	{
		$filter[] = 'T.GROUP_ID IN ('. implode(',', $groupIds) .')';
		$joinFilter[] = 'SU.GROUP_ID IN ('. implode(',', $groupIds) .')';
	}

	$filter[] = "T.DEADLINE < '". $expiredTime ."'";
	$filter[] = 'T.STATUS IN ('. implode(',', [Status::PENDING, Status::IN_PROGRESS]) .')';

	$filter = implode(' AND ', $filter);
	$joinFilter = implode(' AND ', $joinFilter);

	$sql = "
		SELECT
			T.ID,
		    T.GROUP_ID,
		    SU.USER_ID
		FROM b_tasks T
		INNER JOIN b_sonet_user2group SU
			ON {$joinFilter}
		WHERE
			{$filter}
	";

	$res = Application::getConnection()->query($sql);
	$rows = $res->fetchAll();

	$counters = [];
	foreach ($rows as $row)
	{
		$counters[] = [
			'USER_ID'	=> (int) $row['USER_ID'],
			'TASK_ID' 	=> (int) $row['ID'],
			'GROUP_ID' 	=> (int) $row['GROUP_ID'],
			'TYPE' 		=> CounterDictionary::COUNTER_GROUP_EXPIRED,
			'VALUE' 	=> 1
		];
	}

	return $counters;
}