- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/processor/task/scheduler/relationmanager/project.php
- Класс: BitrixTasksProcessorTaskSchedulerRelationManagerProject
- Вызов: Project::processTask
public function processTask($rootImpact, $result, array $settings = array())
{
if(!$rootImpact)
{
return;
}
$rootImpact->setAsHead();
$id = $rootImpact->getId();
if($id <= 0)
{
return;
}
//_print_r('============== Process project on '.$id);
// get task sub-tree
// do not attach sql rights checking, because it is quite heavy still
// instead, use php checking below
// todo: getSubTree() should became deprecated
$res = ProjectDependenceTable::getSubTree($id, Runtime::apply(array(
'runtime' => array(
new ReferenceField(
'PARENT',
ProjectDependenceTable::getEntity(),
array(
'=this.TASK_ID' => 'ref.TASK_ID',
'=ref.DIRECT' => array('?', '1'),
)
)
),
'select' => array(
// relation data
'TASK_ID',
'EFFECTIVE_PARENT_ID' => 'PARENT.DEPENDS_ON_ID',
'TYPE',
// task data
// todo: use Impact::getBaseMixin() here
'TITLE' => 'TASK.TITLE', // tmp
'START_DATE_PLAN' => 'TASK.START_DATE_PLAN',
'END_DATE_PLAN' => 'TASK.END_DATE_PLAN',
'CREATED_DATE' => 'TASK.CREATED_DATE',
'MATCH_WORK_TIME' => 'TASK.MATCH_WORK_TIME',
'ALLOW_CHANGE_DEADLINE' => 'TASK.ALLOW_CHANGE_DEADLINE',
'DURATION_TYPE' => 'TASK.DURATION_TYPE',
'DURATION_PLAN' => 'TASK.DURATION_PLAN',
// task fields for php rights checking
'RESPONSIBLE_ID' => 'TASK.RESPONSIBLE_ID',
'CREATED_BY' => 'TASK.CREATED_BY',
'GROUP_ID' => 'TASK.GROUP_ID',
'STATUS' => 'TASK.STATUS',
),
), array(
RunTimeTask::getTask(array('REF_FIELD' => 'TASK_ID', 'JOIN_TYPE' => 'inner')),
)), array('INCLUDE_SELF' => true));
$tasks = array();
$parentId = 0;
while($item = $res->fetch())
{
$taskId = $item['TASK_ID'];
unset($item['TASK_ID']);
$item['ID'] = $taskId;
$tasks[$item['EFFECTIVE_PARENT_ID']][$item['ID']] = $item;
if($taskId == $id)
{
$parentId = $item['EFFECTIVE_PARENT_ID'];
}
//_print_r('----------------- subtask is: '.$item['PARENT_TASK_ID'].' -> '.$item['TASK_ID'].' '.$item['TITLE']);
}
// here we need to skip task which we can not move (and subtrees of such tasks)
$tasks = $this->checkCoherence($parentId, $tasks, $result);
$relations = array();
$relationsFlat = array();
if($result->isSuccess())
{
$scheduler = $this->getScheduler();
foreach($tasks as $task)
{
// root task was already rescheduled ($rootImpact)
if($task['ID'] == $id)
{
continue;
}
// todo: Impact class is TEMPORAL, it should be replaced with (or at least inherited from) BitrixTasksItemTask when ready
$taskImpact = new Impact($task, $this->getUserId());
$relation = new Relation($task);
$relation->setTask($taskImpact);
$relation->setParentTask($scheduler->getImpactById($task['EFFECTIVE_PARENT_ID'])); // update lag here will happen
$relationsFlat[] = $relation;
$relations[$relation->getParentTaskId()][$relation->getTaskId()] = $relation;
$scheduler->pushQueue($taskImpact->getId(), $scheduler->getRelationProcessor('S'));
$scheduler->addImpact($taskImpact);
}
$this->updateRelatedTasks($id, $relations);
$this->dumpRelations($relationsFlat);
}
}