• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/internals/task/sorting.php
  • Класс: BitrixTasksInternalsTaskSortingTable
  • Вызов: SortingTable::moveTaskToTarget
static function moveTaskToTarget($userId, $groupId, $sourceId, $targetTask, $before)
{
	if (!$targetTask)
	{
		return false;
	}

	if (($before && $targetTask["PREV_TASK_ID"] == $sourceId) ||
		(!$before && $targetTask["NEXT_TASK_ID"] == $sourceId))
	{
		return true;
	}

	$prevTask = null;
	$prevTaskId = 0;
	$prevTaskSort = 0;

	$nextTask = null;
	$nextTaskId = 0;
	$nextTaskSort = 0;
	if ($before)
	{
		$prevTaskId = intval($targetTask["PREV_TASK_ID"]);
		if ($prevTaskId)
		{
			$prevTask = static::getTask($prevTaskId, $userId, $groupId);
			if (!$prevTask || $prevTask["SORT"] > $targetTask["SORT"])
			{
				//try to correct wrong prev_task_id
				$filter = $groupId ? array("=GROUP_ID" => $groupId) : array("=USER_ID" => $userId);
				$filter[" $filter,
					"order" => array("SORT" => "DESC")
				));
			}

			$prevTaskId = $prevTask ? $prevTask["TASK_ID"] : 0;
			$prevTaskSort = $prevTask ? $prevTask["SORT"] : 0;
		}

		$nextTask = $targetTask;
		$nextTaskId = $targetTask["TASK_ID"];
		$nextTaskSort = $targetTask["SORT"];
	}
	else
	{
		$nextTaskId = intval($targetTask["NEXT_TASK_ID"]);
		if ($nextTaskId)
		{
			$nextTask = static::getTask($nextTaskId, $userId, $groupId);
			if (!$nextTask || $nextTask["SORT"] < $targetTask["SORT"])
			{
				//try to correct wrong next_task_id
				$filter = $groupId ? array("=GROUP_ID" => $groupId) : array("=USER_ID" => $userId);
				$filter[">SORT"] = $targetTask["SORT"];
				$nextTask = static::getRow(array(
					"filter" => $filter,
					"order" => array("SORT" => "ASC")
				));
			}

			$nextTaskId = $nextTask ? $nextTask["TASK_ID"] : 0;
			$nextTaskSort = $nextTask ? $nextTask["SORT"] : 0;
		}

		$prevTask = $targetTask;
		$prevTaskId = $targetTask["TASK_ID"];
		$prevTaskSort = $targetTask["SORT"];
	}

	if ($nextTask !== null  && $prevTask !== null && ($nextTaskSort - $prevTaskSort) < static::MIN_SORT_DELTA)
	{
		$connection = Application::getConnection();
		$filter = $groupId > 0 ? "GROUP_ID = {$groupId}" : "USER_ID = {$userId}";
		$increment = static::SORT_INDEX_INCREMENT;
		$connection->queryExecute(
			"UPDATE b_tasks_sorting SET SORT = SORT + {$increment} WHERE SORT >= {$nextTaskSort} AND {$filter}"
		);

		$nextTask = static::getTask($nextTaskId, $userId, $groupId);
		$nextTaskSort = $nextTask["SORT"];
	}

	$sourceTaskSort = 0;
	if ($prevTaskId === 0)
	{
		$sourceTaskSort = $nextTaskSort - static::SORT_INDEX_INCREMENT;
	}
	else if ($nextTaskId === 0)
	{
		$sourceTaskSort = $prevTaskSort + static::SORT_INDEX_INCREMENT;
	}
	else
	{
		$sourceTaskSort = ($nextTaskSort + $prevTaskSort) / 2;
	}

//		$sourceTaskSort =
//			$nextTaskSort > $prevTaskSort
//				? ($nextTaskSort + $prevTaskSort) / 2
//				: $prevTaskSort + static::SORT_INDEX_INCREMENT
//		;

	$sourceTask = static::getTask($sourceId, $userId, $groupId);
	if ($sourceTask)
	{
		$result = static::update($sourceTask["ID"], array(
			"PREV_TASK_ID" => $prevTaskId,
			"NEXT_TASK_ID" => $nextTaskId,
			"SORT" => $sourceTaskSort
		));

		static::fixSiblings($sourceTask);
	}
	else
	{
		$fields = array(
			"TASK_ID" => $sourceId,
			"PREV_TASK_ID" => $prevTaskId,
			"NEXT_TASK_ID" => $nextTaskId,
			"SORT" => $sourceTaskSort
		);

		if ($groupId)
		{
			$fields["GROUP_ID"] = $groupId;
		}
		else
		{
			$fields["USER_ID"] = $userId;
		}

		$result = static::add($fields);
	}

	if ($prevTask)
	{
		static::update($prevTask["ID"], array("NEXT_TASK_ID" => $sourceId));
	}

	if ($nextTask)
	{
		static::update($nextTask["ID"], array("PREV_TASK_ID" => $sourceId));
	}

	return true;
}