• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/internals/counter/collector/projectcollector.php
  • Класс: BitrixTasksInternalsCounterCollectorProjectCollector
  • Вызов: ProjectCollector::recountComments
private function recountComments(array $groupIds = [], array $taskIds = [], array $userIds = []): array
{
	$statement = [
		'join' => [
			Counter::getJoinForRecountCommentsByType(Enum::PROJECT_NAME, [])
		],
		'filter' => [
			Counter::getConditionForRecountComments()
		],
	];

	$filter = [];
	$joinFilter = [];

	$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) .')';
	}

	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) .')';
	}

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

	$filter[] = "(
		FM.POST_DATE >= SU.DATE_CREATE
		OR TM.USER_ID IS NOT NULL
	)";
	$filter[] = "(
		(
			FM.AUTHOR_ID <> SU.USER_ID
			AND (
			   BUF.UF_TASK_COMMENT_TYPE IS NULL OR BUF.UF_TASK_COMMENT_TYPE <> ". Comment::TYPE_EXPIRED ."
			)
		)
		OR
		(
			BUF.UF_TASK_COMMENT_TYPE = ". Comment::TYPE_EXPIRED_SOON ."
		)
	)";
	$filter[] = "FM.NEW_TOPIC = 'N'";

	$startCounterDate = COption::GetOptionString("tasks", "tasksDropCommentCounters", null);
	if ($startCounterDate)
	{
		$filter[] = "FM.POST_DATE > '". $startCounterDate ."'";
	}

	$join = implode('nr', $statement['join']);
	$filter = array_merge($filter, $statement['filter']);

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

	$sql = "
		SELECT 
			T.ID as ID,
		   	T.GROUP_ID as GROUP_ID,
			SU.USER_ID as USER_ID,
			COUNT(DISTINCT FM.ID) AS COUNT
		FROM b_tasks T				
			INNER JOIN b_sonet_user2group SU
				ON {$joinFilter}
			LEFT JOIN b_tasks_viewed TV
				ON TV.TASK_ID = T.ID AND TV.USER_ID = SU.USER_ID
			INNER JOIN b_forum_message FM
				ON FM.TOPIC_ID = T.FORUM_TOPIC_ID
			LEFT JOIN b_uts_forum_message BUF
				ON BUF.VALUE_ID = FM.ID
			LEFT JOIN b_tasks_member TM
				ON TM.TASK_ID = T.ID AND TM.USER_ID = SU.USER_ID
			{$join}
		WHERE
			{$filter}
		GROUP BY T.ID, SU.USER_ID
	";

	$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_COMMENTS,
			'VALUE' 	=> (int) $row['COUNT']
		];
	}

	return $counters;
}