• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/internals/counter/collector/usercollector.php
  • Класс: BitrixTasksInternalsCounterCollectorUserCollector
  • Вызов: UserCollector::recountExpired
private function recountExpired(string $taskFilter, array $mutedTasks): array
{
	$connection = Application::getConnection();
	$helper = $connection->getSqlHelper();
	$expiredTime = Deadline::getExpiredTime()->format('Y-m-d H:i:s');
	$statuses = implode(',', [Status::PENDING, Status::IN_PROGRESS]);

	$sql = "
		SELECT
			T.ID,
			T.GROUP_ID,
			TM.TYPE,
			'1' as " . $helper->quote('COUNT') . "
		FROM b_tasks T
		INNER JOIN ". MemberTable::getTableName() ." TM 
			ON TM.TASK_ID = T.ID 
			AND TM.USER_ID = {$this->userId}
		WHERE
			{$taskFilter}
			AND T.DEADLINE < '{$expiredTime}'
			AND T.STATUS IN ({$statuses})
	";

	$res = $connection->query($sql);
	$rows = $res->fetchAll();

	$responsibleTasks = [];
	foreach ($rows as $row)
	{
		if ($row['TYPE'] === MemberTable::MEMBER_TYPE_RESPONSIBLE)
		{
			$responsibleTasks[] = $row['ID'];
		}
	}

	$counters = [];
	foreach ($rows as $row)
	{
		$type = $row['TYPE'];
		if (!array_key_exists($type, CounterDictionary::MAP_EXPIRED))
		{
			continue;
		}
		if (
			$type === MemberTable::MEMBER_TYPE_ORIGINATOR
			&& in_array($row['ID'], $responsibleTasks)
		)
		{
			continue;
		}

		$counters[] = [
			'USER_ID'	=> $this->userId,
			'TASK_ID' 	=> (int) $row['ID'],
			'GROUP_ID' 	=> (int) $row['GROUP_ID'],
			'TYPE' 		=> in_array($row['ID'], $mutedTasks)
				? CounterDictionary::MAP_MUTED_EXPIRED[$type]
				: CounterDictionary::MAP_EXPIRED[$type],
			'VALUE' 	=> (int) $row['COUNT']
		];
	}

	return $counters;
}