• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/processor/task/scheduler/relationmanager/subtask.php
  • Класс: BitrixTasksProcessorTaskSchedulerRelationManagercould
  • Вызов: could::shiftSubTree
private function shiftSubTree(Impact $rootImpact, Fragment $globalTree)
{
	// if this is a "bracket" task, it can be shifted only
	// therefore, get delta between start dates, and shift $id`s subtree for this amount

	$id = $rootImpact->getId();
	$scheduler = $this->getScheduler();

	$deltaStart = $rootImpact->getStartDateDelta();
	$deltaEnd = $rootImpact->getStartDateDelta();

	if(is_infinite($deltaStart) || is_infinite($deltaEnd))
	{
		// oops, it is an endless task (or half-endless), retreat!
		return;
	}

	if($deltaStart)
	{
		// pick sub tree from the complete tree
		$subTree = $globalTree->getSubTree($id);

		if($subTree->isCorrect() && $subTree->count())
		{
			$subTreeData = $subTree->toArray();

			foreach($subTreeData as $subNode)
			{
				$subNode['ID'] = $subNode['__ID']; // todo: getId() of node item here

				if($subNode['ID'] == $id)
				{
					continue; // already shifted outside this manager
				}
				if(!$this->isTaskFinite($subNode))
				{
					continue;
				}

				$impact = new Impact($subNode, $this->getUserId());

				$impact->shiftDates($deltaStart);

				$scheduler->addImpact($impact);
				$scheduler->pushQueue($impact->getId(), $scheduler->getRelationProcessor('P'));
			}
		}
	}
}