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