• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/kanban/stages.php
  • Класс: BitrixTasksKanbanStagesTable
  • Вызов: StagesTable::pinInStage
static function pinInStage($taskId, $users = [], $refreshGroup = false)
{
	if (!is_array($users))
	{
		$users = array($users);
	}
	$newTask = empty($users);

	// get additional data
	$currentUsers = array();
	$task = TaskRegistry::getInstance()->get($taskId);
	if (!$task)
	{
		return;
	}

	$currentUsers[] = $task['RESPONSIBLE_ID'];
	$currentUsers[] = $task['CREATED_BY'];

	// get current other members
	$res = CTaskMembers::GetList(
		array(),
		array('TASK_ID' => $taskId)
	);
	while ($row = $res->fetch())
	{
		$currentUsers[] = $row['USER_ID'];
	}

	if ($newTask)
	{
		$users = $currentUsers;
		$currentUsers = array();
	}

	$users = array_unique($users);

	// pin in personal default stage (if already Kanban exist)
	$personaleDefStages = array();
	self::setWorkMode(self::WORK_MODE_USER);
	foreach ($users as $userId)
	{
		$checkStages = self::getStages($userId, true);
		if (!empty($checkStages))
		{
			$personaleDefStages[$userId] = self::getDefaultStageId($userId);
			if (!in_array($userId, self::$disableLink))
			{
				$resStg = TaskStageTable::getList(array(
					'filter' => array(
						'TASK_ID' => $taskId,
						'STAGE_ID' => array_keys($checkStages)
					)
				));
				if (!$resStg->fetch())
				{
					$fields = array(
						'TASK_ID' => $taskId,
						'STAGE_ID' => self::getDefaultStageId($userId)
					);
					if (!TaskStageTable::getList(array(
							'filter' => $fields
						)
					)->fetch())
					{
						try
						{
							TaskStageTable::add($fields);
						}
						catch (Exception $e){}
					}
				}
			}
		}
	}

	// work mode
	self::setWorkMode(
		$task['GROUP_ID'] > 0
		? self::WORK_MODE_GROUP
		: self::WORK_MODE_USER
	);

	if ($task['GROUP_ID'] > 0 && ($newTask || $refreshGroup))
	{
		$checkStages = self::getStages($task['GROUP_ID'], true);
	}
	else
	{
		$checkStages = array();
	}

	// one sort for project
	if ($task['GROUP_ID'] > 0 && !empty($checkStages) && ($newTask || $refreshGroup))
	{
		// get order
		if (($project = ProjectsTable::getById($task['GROUP_ID'])->fetch()))
		{
			$order = $project['ORDER_NEW_TASK'] ? $project['ORDER_NEW_TASK'] : 'desc';
		}
		else
		{
			$order = 'desc';
		}

		// set sorting
		$targetId = (new Sort())->getPositionForGroup((int) $taskId, $order, (int) $task['GROUP_ID']);
		if ($targetId)
		{
			SortingTable::setSorting(
				BitrixTasksUtilUser::getId() > 0 ? BitrixTasksUtilUser::getId() : $task['CREATED_BY'],
				$task['GROUP_ID'],
				$taskId,
				$targetId,
				$order == 'asc' ? false : true
			);
		}
	}

	// and for each user
	foreach ($users as $userId)
	{
		if (
			$userId
			&& !in_array($userId, self::$disablePin)
			&& !in_array($userId, $currentUsers)
			&& isset($personaleDefStages[$userId])
		)
		{
			// get order
			$order = CUserOptions::getOption(
				'tasks',
				'order_new_task',
				'desc',
				$userId
			);

			$targetId = (new Sort())->getPositionForUser((int)$taskId, $order, (int)$userId);
			if ($targetId)
			{
				SortingTable::setSorting(
					$userId,
					0,
					$taskId,
					$targetId,
					($order == 'asc' ? false : true)
				);
			}
		}
	}
}