• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/timeline/activitycontroller.php
  • Класс: Bitrix\Crm\Timeline\ActivityController
  • Вызов: ActivityController::onModify
public function onModify($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');
	}

	$currentFields = isset($params['CURRENT_FIELDS']) && is_array($params['CURRENT_FIELDS'])
		? $params['CURRENT_FIELDS'] : array();
	$currentBindings = isset($params['CURRENT_BINDINGS']) && is_array($params['CURRENT_BINDINGS'])
		? $params['CURRENT_BINDINGS'] : array();
	$previousFields = isset($params['PREVIOUS_FIELDS']) && is_array($params['PREVIOUS_FIELDS'])
		? $params['PREVIOUS_FIELDS'] : array();
	$additionalParams = isset($params['ADDITIONAL_PARAMS']) && is_array($params['ADDITIONAL_PARAMS'])
		? $params['ADDITIONAL_PARAMS'] : [];

	$typeID = isset($currentFields['TYPE_ID']) ? (int)$currentFields['TYPE_ID'] : \CCrmActivityType::Undefined;
	$providerID = isset($currentFields['PROVIDER_ID']) ? $currentFields['PROVIDER_ID'] : '';
	$prevCompleted = isset($previousFields['COMPLETED']) && $previousFields['COMPLETED'] === 'Y';
	$curCompleted = isset($currentFields['COMPLETED']) && $currentFields['COMPLETED'] === 'Y';

	$authorID = self::resolveAuthorID($currentFields);

	$historyEntryID = 0;
	if(!$prevCompleted && $curCompleted)
	{
		if (
			$typeID === \CCrmActivityType::Provider && $providerID === Activity\Provider\Tasks\Comment::getId()
		)
		{
			// do nothing...
		}
		elseif ($typeID == \CCrmActivityType::Task)
		{
			$historyEntryID = MarkEntry::create(
				array(
					'MARK_TYPE_ID' => TimelineMarkType::SUCCESS,
					'ENTITY_TYPE_ID' => \CCrmOwnerType::Activity,
					'ENTITY_CLASS_NAME' => $providerID,
					'ENTITY_ID' => $ownerID,
					'AUTHOR_ID' => $authorID,
					'BINDINGS' => self::mapBindings($currentBindings)
				)
			);
		}
		else
		{
			$historyData = [
				'ACTIVITY_TYPE_ID' => $typeID,
				'ACTIVITY_PROVIDER_ID' => $providerID,
				'ENTITY_ID' => $ownerID,
				'AUTHOR_ID' => $authorID,
				'BINDINGS' => self::mapBindings($currentBindings),
			];
			$provider = \CCrmActivity::GetProviderById($providerID);
			if (!is_null($provider) && $provider::isTask())
			{
				$taskId = $currentFields['ASSOCIATED_ENTITY_ID'];
				$historyData['SOURCE_ID'] = $taskId;
			}

			// workaround to correct sort timeline history of completed calls
			// when it automatically close
			if (
				isset($additionalParams['CUSTOM_CREATION_TIME'])
				&& Crm\Settings\Crm::isUniversalActivityScenarioEnabled()
			)
			{
				$historyData['CREATED'] = DateTime::createFromUserTime($additionalParams['CUSTOM_CREATION_TIME'])->add('-1 second');
			}

			if (
				isset($params['CURRENT_FIELDS']['SETTINGS']['MISSED_CALL'])
				&& $params['CURRENT_FIELDS']['SETTINGS']['MISSED_CALL'] === true
				&& !Crm\Settings\Crm::isUniversalActivityScenarioEnabled()
			)
			{
				$historyData['CREATED'] = DateTime::createFromUserTime($params['CURRENT_FIELDS']['CREATED']);
			}

			$historyEntryID = ActivityEntry::create($historyData);
		}
	}
	elseif($prevCompleted && !$curCompleted)
	{
		if(
			$typeID == \CCrmActivityType::Provider
			&& in_array(
				$providerID,
				[
					Activity\Provider\ToDo::getId(),
					Activity\Provider\ConfigurableRestApp::getId(),
					Activity\Provider\Zoom::getId(),
					Activity\Provider\Tasks\Task::getId(),
					Activity\Provider\Tasks\Comment::getId(),
					Activity\Provider\OpenLine::getId(),
				]
			)
		)
		{
			// do nothing
		}
		else
		{
			//Add Renew event
			$historyEntryID = MarkEntry::create(
				array(
					'MARK_TYPE_ID' => TimelineMarkType::RENEW,
					'ENTITY_TYPE_ID' => \CCrmOwnerType::Activity,
					'ENTITY_CLASS_NAME' => $providerID,
					'ENTITY_ID' => $ownerID,
					'AUTHOR_ID' => $authorID,
					'BINDINGS' => self::mapBindings($currentBindings)
				)
			);
		}
	}

	$enableHistoryPush = $historyEntryID > 0;
	$enableActivityPush = self::isActivitySupported($currentFields);

	$pullEventData = [$ownerID => $currentFields];

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

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

		if (!$prevCompleted && $curCompleted && $enableHistoryPush && $enableActivityPush)
		// if activity has been completed and timeline history item has been produced,
		// need actually move one to another on the timeline instead of separate remove and add events:
		{
			$this->sendPullEventOnMove(
				$entityItemIdentifier,
				$ownerID,
				$historyEntryID,
				$params['CURRENT_USER'] ?? null
			);
		}
		elseif (!$prevCompleted && $curCompleted && $enableActivityPush)
			// if activity has been completed and timeline history item has not been produced,
			// need remove completed activity from timeline:
		{
			$this->sendPullEventOnDeleteScheduled($entityItemIdentifier, $ownerID);
		}
		else
		{
			if ($enableActivityPush)
			{
				if ($prevCompleted && !$curCompleted)
					// if activity has been marked as not completed
					// need to create new scheduled activity instead of update existed:
				{
					$this->sendPullEventOnAddScheduled(
						$entityItemIdentifier,
						$pullEventData[$ownerID],
						$params['CURRENT_USER'] ?? null
					);
				}
				else
				{
					// just send pull update event with new data
					$this->notifyTimelinesAboutActivityUpdateForBindings(
						$pullEventData[$ownerID],
						[
							$binding,
						],
						$params['CURRENT_USER'] ?? null
					);
				}
			}
			if ($enableHistoryPush)
			{
				$this->sendPullEventOnAdd(
					$entityItemIdentifier,
					$historyEntryID,
					$params['CURRENT_USER'] ?? null
				);
			}
		}
	}
}