• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/activity/entity/todo.php
  • Класс: Bitrix\Crm\Activity\Entity\ToDo
  • Вызов: ToDo::save
public function save(array $options = []): Result
{
	$result = new Result();

	if ($this->getDescription() === '')
	{
		$result->addError(new Error(Loc::getMessage('CRM_TODO_ENTITY_ACTIVITY_EMPTY_DESCRIPTION'), 'ERROR_EMPTY_DESCRIPTION'));

		return $result;
	}

	$fields = [
		'DESCRIPTION' => $this->getDescription(),
		'SUBJECT' => $this->getSubjectFromDescription($this->getDescription()),
		'CALENDAR_EVENT_ID' => $this->getCalendarEventId(),
		'RESPONSIBLE_ID' => $this->getResponsibleId(),
	];

	if ($this->getDeadline())
	{
		$fields['START_TIME'] = $this->getDeadline()->toString();
		$fields['END_TIME'] = $this->getDeadline()->toString();
	}
	if (!is_null($this->getAutocompleteRule()))
	{
		$fields['AUTOCOMPLETE_RULE'] = $this->getAutocompleteRule();
	}

	$parentActivityBindings = [];
	if ($this->getParentActivityId())
	{
		if ($this->isParentActivityCompleted($this->getParentActivityId()))
		{
			$result->addError(new Error(Loc::getMessage('CRM_TODO_ENTITY_ACTIVITY_PARENT_ACTIVITY_RESTRICT'), 'ERROR_PARENT_ACTIVITY_RESTRICT'));

			return $result;
		}

		$parentActivityBindings = CCrmActivity::GetBindings($this->getParentActivityId());
		if ($this->isParentActivityValid($parentActivityBindings))
		{
			$fields['ASSOCIATED_ENTITY_ID'] = $this->getParentActivityId();
		}
	}

	if (!is_null($this->getStorageElementIds()))
	{
		$fields['STORAGE_TYPE_ID'] = StorageType::Disk;
		$fields['STORAGE_ELEMENT_IDS'] = $this->getStorageElementIds();
	}

	$fields = array_merge($fields, $this->getAdditionalFields());

	if($this->checkPermissions && !CCrmActivity::CheckUpdatePermission($this->getOwner()->getEntityTypeId(), $this->getOwner()->getEntityId()))
	{
		$result->addError(\Bitrix\Crm\Controller\ErrorCode::getAccessDeniedError());

		return $result;
	}

	if ($this->getId())
	{
		$existedActivity = CCrmActivity::GetList(
			[],
			[
				'=ID' => $this->getId(),
				'CHECK_PERMISSIONS' => 'N',
			],
			false,
			false,
			[
				'ID',
				'COMPLETED',
				'PROVIDER_ID',
			]
		)->Fetch();

		if (!$existedActivity)
		{
			$result->addError(\Bitrix\Crm\Controller\ErrorCode::getNotFoundError());

			return $result;
		}
		if ($existedActivity['COMPLETED'] === 'Y')
		{
			$result->addError(
				new Error(Loc::getMessage("CRM_TODO_ENTITY_ACTIVITY_ALREADY_COMPLETED"), 'CAN_NOT_UPDATE_COMPLETED_TODO'),
			);

			return $result;
		}
		if ($existedActivity['PROVIDER_ID'] !== \Bitrix\Crm\Activity\Provider\ToDo::getId())
		{
			$result->addError(\Bitrix\Crm\Controller\ErrorCode::getNotFoundError());

			return $result;
		}

		$isSuccess = CCrmActivity::Update($this->getId(), $fields, $this->checkPermissions, true, $options);

		if (!$isSuccess)
		{
			foreach (CCrmActivity::GetErrorMessages() as $errorMessage)
			{
				$result->addError(new Error($errorMessage));
			}
		}
	}
	else
	{
		$fields['BINDINGS'] = empty($parentActivityBindings)
			? [
				[
					'OWNER_TYPE_ID' => $this->owner->getEntityTypeId(),
					'OWNER_ID' => $this->owner->getEntityId(),
				],
			]
			: $parentActivityBindings;
		$provider = new \Bitrix\Crm\Activity\Provider\ToDo();
		$result = $provider->createActivity(\Bitrix\Crm\Activity\Provider\ToDo::PROVIDER_TYPE_ID_DEFAULT, $fields, $options);
		if ($result->isSuccess())
		{
			$this->id = (int)$result->getData()['id'];

			if ($this->getParentActivityId())
			{
				// close parent activity
				if (!CCrmActivity::Complete($this->getParentActivityId(), true, ['REGISTER_SONET_EVENT' => true]))
				{
					$result->addError(new Error(implode(', ', CCrmActivity::GetErrorMessages()), 'CAN_NOT_COMPLETE'));
				}
			}
		}
	}

	return $result;
}