• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/activity/provider/task.php
  • Класс: Bitrix\Crm\Activity\Provider\Task
  • Вызов: Task::onTaskUpdate
static function onTaskUpdate($taskId, &$currentTaskFields, &$previousTaskFields)
{
	$taskId = (int)$taskId;
	if (self::isTaskLocked($taskId, self::LOCK_TYPE_UPDATE))
	{
		return false;
	}

	if ($taskId <= 0 || !Loader::includeModule('tasks'))
	{
		return false;
	}

	$itemIterator = \CTasks::getByID($taskId, false);
	$task = $itemIterator->fetch();
	if(!$task)
	{
		return false;
	}

	$isStatusChanged = (isset($currentTaskFields['STATUS']) && (string)$currentTaskFields['STATUS'] !== (string)$previousTaskFields['STATUS']);
	$listIterator = \CCrmActivity::getList(
		array(),
		array(
			'=TYPE_ID' =>  \CCrmActivityType::Task,
			'=ASSOCIATED_ENTITY_ID' => $taskId,
			'CHECK_PERMISSIONS' => 'N'
		)
	);

	if (self::isTaskLocked($taskId, self::LOCK_TYPE_COMPLETE))
	{
		if ($isStatusChanged && $activity = $listIterator->fetch())
		{
			self::setFromTask($taskId, $task, $activity);
			if (isset($activity['BINDINGS']) && count($activity['BINDINGS']) > 0)
			{
				Crm\Automation\Trigger\TaskStatusTrigger::execute($activity['BINDINGS'], ['TASK' => $task]);
			}
		}

		return false;
	}

	$isFound = false;
	$taskBindings = [];

	while($activity = $listIterator->fetch())
	{
		$isFound = true;
		self::setFromTask($taskId, $task, $activity);
		// Update activity if bindings are found otherwise delete unbound activity
		if(isset($activity['BINDINGS']) && count($activity['BINDINGS']) > 0)
		{
			$activity['COMMUNICATIONS'] = self::prepareCommunications($activity);
			\CCrmActivity::update($activity['ID'], $activity, false, true, array('SKIP_ASSOCIATED_ENTITY' => true, 'REGISTER_SONET_EVENT' => true));
			\CCrmLiveFeed::syncTaskEvent($activity, $task);
			$taskBindings = $activity['BINDINGS'];
		}
		else
		{
			\CCrmLiveFeed::revertTasksLogEvent(array(
				"ACTIVITY" => $activity,
				"TASK" => $task
			));

			$deletionParams = isset(self::$deletionParams[$taskId]) && is_array(self::$deletionParams[$taskId])
				? self::$deletionParams[$taskId] : array();
			unset(self::$deletionParams[$taskId]);

			\CCrmActivity::delete(
				$activity['ID'],
				false,
				true,
				array_merge($deletionParams, array('SKIP_ASSOCIATED_ENTITY' => true))
			);
		}

		/*
		\Bitrix\Crm\Timeline\TaskController::getInstance()->onModify(
			$activity['ID'],
			array(
				'CURRENT_TASK_FIELDS' => $currentTaskFields,
				'PREVIOUS_TASK_FIELDS' => $previousTaskFields,
				'BINDINGS' => isset($activity['BINDINGS']) ? $activity['BINDINGS'] : array()
			)
		);
		*/
	}

	if(!$isFound && !TimeLineManager::isNewIntegrationEnabled())
	{
		$activity = array();
		self::setFromTask($taskId, $task, $activity);
		if(isset($activity['BINDINGS']) && count($activity['BINDINGS']) > 0)
		{
			$creationParams = isset(self::$creationParams[$taskId]) && is_array(self::$creationParams[$taskId])
				? self::$creationParams[$taskId] : array();
			unset(self::$creationParams[$taskId]);

			//Stub for communication is required for activity list optimization (see \CCrmActivity::PrepareClientInfos)
			$activity['COMMUNICATIONS'] = self::prepareCommunications($activity);
			\CCrmActivity::add(
				$activity,
				false,
				true,
				array_merge($creationParams, array('SKIP_ASSOCIATED_ENTITY' => true, 'REGISTER_SONET_EVENT' => true))
			);
			$taskBindings = $activity['BINDINGS'];
		}
	}

	if ($isStatusChanged && $taskBindings)
	{
		Crm\Automation\Trigger\TaskStatusTrigger::execute($taskBindings, ['TASK' => $task]);
	}

	return true;
}