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