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