• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/timeline/activitycontroller.php
  • Класс: Bitrix\Crm\Timeline\ActivityController
  • Вызов: ActivityController::onCreate
public function onCreate($ownerID, array $params)
{
	if(!is_int($ownerID))
	{
		$ownerID = (int)$ownerID;
	}
	if($ownerID <= 0)
	{
		throw new Main\ArgumentException('Owner ID must be greater than zero.', 'ownerID');
	}

	$fields = isset($params['FIELDS']) && is_array($params['FIELDS']) ? $params['FIELDS'] : null;
	if(!is_array($fields))
	{
		$fields = self::getEntity($ownerID);
	}
	if(!is_array($fields))
	{
		return;
	}

	$bindings = \CCrmActivity::GetBindings($ownerID);
	if(!(is_array($bindings) && !empty($bindings)))
	{
		return;
	}

	$status = isset($fields['STATUS']) ? (int)$fields['STATUS'] : \CCrmActivityStatus::Undefined;
	$typeID = isset($fields['TYPE_ID']) ? (int)$fields['TYPE_ID'] : \CCrmActivityType::Undefined;
	$direction = isset($fields['DIRECTION']) ? (int)$fields['DIRECTION'] : \CCrmActivityDirection::Undefined;
	$providerID = isset($fields['PROVIDER_ID']) ? $fields['PROVIDER_ID'] : '';
	$authorID = self::resolveAuthorID($fields);

	$created = null;
	if(isset($params['PRESERVE_CREATION_TIME'])
		&& $params['PRESERVE_CREATION_TIME'] === true
		&& isset($fields['CREATED'])
	)
	{
		if($fields['CREATED'] instanceof DateTime)
		{
			$created = $fields['CREATED'];
		}
		else
		{
			$created = new DateTime($fields['CREATED'], Date::convertFormatToPhp(FORMAT_DATETIME));
		}
	}

	$historyEntryID = 0;
	if($typeID === \CCrmActivityType::Email)
	{
		if($status === \CCrmActivityStatus::Completed)
		{
			$historyEntryID = ActivityEntry::create(
				array(
					'ACTIVITY_TYPE_ID' => $typeID,
					'ACTIVITY_PROVIDER_ID' => $providerID,
					'ENTITY_ID' => $ownerID,
					'AUTHOR_ID' => $authorID,
					'CREATED' => new DateTime(),
					'BINDINGS' => self::mapBindings($bindings)
				)
			);
		}
	}
	elseif($typeID === \CCrmActivityType::Call || $typeID === \CCrmActivityType::Meeting)
	{
		if($status === \CCrmActivityStatus::Completed)
		{
			$historyEntryID = ActivityEntry::create(
				array(
					'ACTIVITY_TYPE_ID' => $typeID,
					'ACTIVITY_PROVIDER_ID' => $providerID,
					'ENTITY_ID' => $ownerID,
					'AUTHOR_ID' => $authorID,
					'CREATED' => $created,
					'BINDINGS' => self::mapBindings($bindings)
				)
			);
		}
	}
	elseif($typeID === \CCrmActivityType::Task)
	{
		$historyEntryID = CreationEntry::create(
			array(
				'ENTITY_TYPE_ID' => \CCrmOwnerType::Activity,
				'ENTITY_CLASS_NAME' => $providerID,
				'ENTITY_ID' => $ownerID,
				'AUTHOR_ID' => $authorID,
				'CREATED' => $created,
				'BINDINGS' => self::mapBindings($bindings)
			)
		);
	}
	elseif($typeID === \CCrmActivityType::Provider
		&& $status === \CCrmActivityStatus::Completed
		&& isset($fields['PROVIDER_ID'])
		&& self::isActivityProviderSupported($fields['PROVIDER_ID'])
	)
	{
		$timelineParams = [
			'ACTIVITY_TYPE_ID' => $typeID,
			'ACTIVITY_PROVIDER_ID' => $providerID,
			'ENTITY_ID' => $ownerID,
			'AUTHOR_ID' => $authorID,
			'CREATED' => $created,
			'BINDINGS' => self::mapBindings($bindings),
		];

		$provider = \CCrmActivity::GetProviderById($providerID);
		if (!is_null($provider) && $provider::isTask())
		{
			$taskId = $fields['ASSOCIATED_ENTITY_ID'];
			$timelineParams['SOURCE_ID'] = $taskId;
		}
		$historyEntryID = ActivityEntry::create($timelineParams);
	}
	elseif($typeID === \CCrmActivityType::Provider
		&& isset($fields['PROVIDER_ID'])
		&& $fields['PROVIDER_ID'] === Activity\Provider\ToDo::getId()
	)
	{
		$logMessageController = LogMessageController::getInstance();
		foreach ($bindings as $binding)
		{
			$logMessageController->onCreate(
				[
					'ENTITY_TYPE_ID' => $binding['OWNER_TYPE_ID'],
					'ENTITY_ID' => $binding['OWNER_ID'],
					'ASSOCIATED_ENTITY_TYPE_ID' => \CCrmOwnerType::Activity,
					'ASSOCIATED_ENTITY_ID' => $ownerID,
					'SETTINGS' => [
						'ACTIVITY_DATA' => [
							'DESCRIPTION' => $fields['DESCRIPTION'],
							'ASSOCIATED_ENTITY_ID' => $fields['ASSOCIATED_ENTITY_ID'],
							'DEADLINE_TIMESTAMP' => $fields['DEADLINE'] ? (DateTime::createFromUserTime($fields['DEADLINE'])->getTimestamp()) : null,
						]
					]
				],
				LogMessageType::TODO_CREATED,
				$params['CURRENT_USER'] ?? null
			);
		}


	}

	if(isset($params['ENABLE_PUSH']) && $params['ENABLE_PUSH'] === false)
	{
		return;
	}

	$enableHistoryPush = $historyEntryID > 0;
	$enableSchedulePush = self::isActivitySupported($fields) && $status === \CCrmActivityStatus::Waiting;

	if (!isset($fields['CREATED']))
	{
		$fields['CREATED'] = (new DateTime())->toString();
	}
	$pullEventData = [$ownerID => $fields];

	if ($enableSchedulePush)
	{
		\Bitrix\Crm\Timeline\EntityController::loadCommunicationsAndMultifields(
			$pullEventData,
			Crm\Service\Container::getInstance()
				->getUserPermissions($params['CURRENT_USER'] ?? null)
				->getCrmPermissions(),
			[
				'ENABLE_PERMISSION_CHECK' => false,
			]
		);
	}

	foreach($bindings as $binding)
	{
		$entityItemIdentifier = Crm\ItemIdentifier::createFromArray($binding);
		if (!$entityItemIdentifier)
		{
			continue;
		}

		if ($enableSchedulePush)
		{
			$this->sendPullEventOnAddScheduled(
				$entityItemIdentifier,
				$pullEventData[$ownerID],
				$params['CURRENT_USER'] ?? null
			);
		}
		if ($enableHistoryPush)
		{
			$this->sendPullEventOnAdd(
				$entityItemIdentifier,
				$historyEntryID,
				$params['CURRENT_USER'] ?? null
			);
		}
	}
}