• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/activity/provider/task.php
  • Класс: Bitrix\Crm\Activity\Provider\Task
  • Вызов: Task::updateAssociatedEntity
static function updateAssociatedEntity(
	$entityId,
	array $activity,
	array $options = array()
)
{
	// nasty, very nasty.
	$skipResponsibleChange = isset($options['SKIP_RESPONSIBLE_CHANGE']) && $options['SKIP_RESPONSIBLE_CHANGE'] === true;
	$skipDeadlineChange = isset($options['SKIP_DEADLINE_CHANGE']) && $options['SKIP_DEADLINE_CHANGE'] === true;
	$skipRenew = isset($options['SKIP_RENEW']) && $options['SKIP_RENEW'] === true;
	$skipSubject = isset($options['SKIP_SUBJECT']) && $options['SKIP_SUBJECT'] === true;
	$responsibleId = isset($activity['RESPONSIBLE_ID']) ? (int)$activity['RESPONSIBLE_ID'] : 0;
	$entityId = (int) $entityId;

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

	$itemIterator = \CTasks::getByID($entityId, false);
	$task = $itemIterator->fetch();

	$taskFields = array();
	if (!$skipSubject && isset($activity['SUBJECT']) && $activity['SUBJECT'] !== $task['TITLE'])
	{
		$taskFields['TITLE'] = $activity['SUBJECT'];
		$taskFields['DESCRIPTION'] = $task['DESCRIPTION']; //for TAGS save
	}
	if (!$skipDeadlineChange && isset($activity['END_TIME'] ))
	{
		$taskFields['DEADLINE'] = $activity['END_TIME'];
	}
	if (!$skipResponsibleChange && isset($activity['RESPONSIBLE_ID']))
	{
		$taskFields['RESPONSIBLE_ID'] = $activity['RESPONSIBLE_ID'];
	}

	$result = true;
	self::lockTask($entityId, self::LOCK_TYPE_UPDATE);
	if (!empty($taskFields))
	{
		$task = new \CTasks();
		$result = $task->update($entityId, $taskFields);
	}
	self::unlockTask($entityId);

	if (isset($activity['COMPLETED']))
	{
		self::lockTask($entityId, self::LOCK_TYPE_COMPLETE);
		try
		{
			$currentUser = isset($options['CURRENT_USER'])
				? (int)$options['CURRENT_USER']
				: \CCrmSecurityHelper::getCurrentUserID();

			$taskItem = \CTaskItem::getInstance($entityId, $currentUser > 0 ? $currentUser : 1);
			if($activity['COMPLETED'] === 'Y')
			{
				$taskItem->complete(['SKIP_ACCESS_CONTROL' => true]);
			}
			elseif (!$skipRenew)
			{
				$taskItem->renew(['SKIP_ACCESS_CONTROL' => true]);
			}
			$result = true;
		}
		catch (\TasksException $e)
		{
			$result = false;
		}
		self::unlockTask($entityId);
	}

	$updateResult = new Main\Result();

	if (!$result)
	{
		$updateResult->addError(new Main\Error('Failed.'));
	}
	elseif(isset($activity['COMPLETED'])
		&& $activity['COMPLETED'] === 'Y'
		&& Crm\Settings\ActivitySettings::getCurrent()->isDeadlineSyncEnabled()
	)
	{
		//Perform synchronization of 'DEADLINE' field
		$itemIterator = \CTasks::getByID($entityId, false);
		$taskFields = $itemIterator->fetch();
		if(is_array($taskFields) && !empty($taskFields['CLOSED_DATE']))
		{
			$activity['DEADLINE'] = $activity['END_TIME'] = $taskFields['CLOSED_DATE'];
			\CCrmActivity::update(
				$activity['ID'],
				$activity,
				false,
				true,
				array('SKIP_ASSOCIATED_ENTITY' => true, 'REGISTER_SONET_EVENT' => true)
			);
			\CCrmLiveFeed::syncTaskEvent($activity, $taskFields);
		}
	}

	return $updateResult;
}