• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/kanban/stages.php
  • Класс: BitrixTasksKanbanStagesTable
  • Вызов: StagesTable::getStagesCount
static function getStagesCount(array $filter = array(), $userId = false)
{
	if ($userId === false)
	{
		$userId = BitrixTasksUtilUser::getId();
	}
	$userId = intval($userId);

	// related joins
	$relatedJoins = CTasks::getRelatedJoins([], $filter, [], ['USER_ID' => $userId]);

	$filterKeys = CTasks::GetFilteredKeys($filter);
	$joinTaskMember = in_array('MEMBER', $filterKeys);

	if ($joinTaskMember)
	{
		unset($filter['::SUBFILTER-ROLEID']['MEMBER']);

		$relatedJoins['MEMBER'] = "INNER JOIN (
			SELECT TMM.TASK_ID, TMM.USER_ID
			FROM " . MemberTable::getTableName() . " TMM WHERE TMM.USER_ID = {$userId}
			GROUP BY TMM.TASK_ID
		) TM ON TM.TASK_ID = STG.TASK_ID";
	}

	// common
	$sqlSearch = CTasks::GetFilter($filter, "", array('TASK_MEMBER_JOINED' => $joinTaskMember));

	// uf fields
	$userFieldsSql = new CUserTypeSQL();
	$userFieldsSql->setEntity('TASKS_TASK', 'T.ID');
	$userFieldsSql->setFilter($filter);
	$ufFilterSql = $userFieldsSql->getFilter();

	if ($ufFilterSql != '')
	{
		$sqlSearch[] = '(' . $ufFilterSql . ')';
	}

	$sql = "
		SELECT STG.STAGE_ID, COUNT(STG.STAGE_ID) AS CNT
		FROM (";

	// if personal - search in another table
	if (
		self::getWorkMode() == self::WORK_MODE_USER ||
		self::getWorkMode() == self::WORK_MODE_ACTIVE_SPRINT
	)
	{
		$sql .= "
			SELECT STG.STAGE_ID
			FROM " . TaskStageTable::getTableName() . " STG
			LEFT JOIN " . Task::getTableName() . " T ON T.ID = STG.TASK_ID
			" . implode("n", $relatedJoins) . "
			" . $userFieldsSql->GetJoin("T.ID") . "
			" . "WHERE " . implode(' AND ', $sqlSearch) . "
			" . "GROUP BY T.ID, STG.STAGE_ID
		";
	}
	// else tasks table
	else
	{
		if (array_key_exists('MEMBER', $relatedJoins))
		{
			unset($relatedJoins['MEMBER']);
		}

		$sql .= "
			SELECT T.STAGE_ID
			FROM " . Task::getTableName() . " T
			" . implode("n", $relatedJoins) . "
			" . $userFieldsSql->GetJoin("T.ID") . "
			" . "WHERE " . implode(' AND ', $sqlSearch) . "
			" . "GROUP BY T.ID, T.STAGE_ID
		";
	}

	$sql .= ") STG
		GROUP BY STG.STAGE_ID
	";

	return BitrixMainApplication::getConnection()->query($sql);
}