• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/controller/sharingajax.php
  • Класс: BitrixCalendarControllerSharingAjax
  • Вызов: SharingAjax::saveCrmEventAction
public function saveCrmEventAction(): array
{
	$result = [];
	$request = $this->getRequest();

	if (!Loader::includeModule('crm'))
	{
		$this->addError(new Error('Module crm not found'));

		return $result;
	}

	$connection = Application::getConnection();
	$sqlHelper = $connection->getSqlHelper();


	$crmDealLinkHash = $sqlHelper->forSql(trim($request['crmDealLinkHash'] ?? ''));
	$ownerId = (int)($request['ownerId'] ?? null);
	$ownerCreated = ($request['ownerCreated'] ?? null) === 'true';

	/** @var SharingLinkCrmDealLink $crmDealLink */
	$crmDealLink = $this->getSharingLinkFactory()->getLinkByHash($crmDealLinkHash);

	if (
		!$crmDealLink
		|| !$crmDealLink->isActive()
		|| $crmDealLink->getObjectType() !== SharingLinkHelper::CRM_DEAL_SHARING_TYPE
		|| $crmDealLink->getOwnerId() !== $ownerId
	)
	{
		$this->addError(new Error('Link not found'));

		return $result;
	}

	if (!$crmDealLink->getContactId()|| !$crmDealLink->getContactType())
	{
		$userName = $sqlHelper->forSql(trim($request['userName'] ?? ''));
		$userContact = $sqlHelper->forSql(trim($request['userContact'] ?? ''));

		$contactDataError = !SharingSharingEventManager::validateContactData($userContact);
		$contactNameError = !SharingSharingEventManager::validateContactName($userName);
		if ($contactDataError || $contactNameError)
		{
			$this->addError(new Error(Loc::getMessage('EC_SHARINGAJAX_INCORRECT_CONTACT_DATA')));

			return [
				'contactDataError' => $contactDataError,
				'contactNameError' => $contactNameError,
			];
		}
	}
	else
	{
		$contactType = $crmDealLink->getContactType();
		$contactId = $crmDealLink->getContactId();
		$contactData = BitrixCrmServiceContainer::getInstance()
			->getEntityBroker($contactType)
			->getById($contactId)
		;
		if (!$contactData)
		{
			$this->addError(new Error('Contact not found'));

			return $result;
		}

		$userName = '';
		if ($contactType === CCrmOwnerType::Contact)
		{
			$userName = $contactData->getFullName();
		}
		elseif ($contactType === CCrmOwnerType::Company)
		{
			$userName = $contactData->getTitle();
		}
		$userContact = '';
	}

	$userParams = [
		'NAME' => $userName,
		'CONTACT_DATA' => $userContact,
	];
	if ($ownerCreated)
	{
		$userId = SharingUser::getInstance()->getAnonymousUserForOwner($userParams);
	}
	else
	{
		$userId = SharingUser::getInstance()->login(true, $userParams);
	}

	$eventData = SharingSharingEventManager::getCrmEventDataFromRequest($request);
	$eventData['eventName'] = SharingSharingEventManager::getSharingEventNameByUserName($userName);

	$event = SharingSharingEventManager::prepareEventForSave($eventData, $userId);

	$sharingEventManager = new SharingSharingEventManager($event, $userId, $ownerId, $crmDealLinkHash);
	$eventCreateResult = $sharingEventManager->createEvent(false, $userParams['NAME']);

	if ($errors = $eventCreateResult->getErrors())
	{
		$this->addError($errors[0]);

		return $result;
	}

	/** @var Event $event */
	$event = $eventCreateResult->getData()['event'];
	/** @var SharingLinkEventLink $eventLink */
	$eventLink = $eventCreateResult->getData()['eventLink'];

	$dateFrom = $request['dateFrom'] ?? null;
	$timezone = $request['timezone'] ?? null;

	/** @var DateTime $eventStart */
	$eventStart = Util::getDateObject($dateFrom, false, $timezone);
	$activityName = Loc::getMessage('EC_SHARINGAJAX_ACTIVITY_SUBJECT');

	$crmDealLink->setLastStatus(null);
	(new SharingLinkCrmDealLinkMapper())->update($crmDealLink);

	// Create calendar sharing activity in deal
	(new SharingCrmActivityManager($event->getId(), $crmDealLink, $userName))
		->createCalendarSharingActivity($activityName, $event->getDescription(), $eventStart)
	;

	// Auto-accepting meeting for manager
	CCalendarEvent::SetMeetingStatus([
		'eventId' => $event->getId(),
		'userId' => $ownerId,
		'status' => 'Y',
		'hostNotification' => false,
		'sharingAutoAccept' => true,
	]);

	//notify client about meeting is auto-accepted
	if ($crmDealLink->getContactId() > 0)
	{
		CrmIntegrationCalendarNotificationManager::getSenderInstance($crmDealLink)
			->setCrmDealLink($crmDealLink)
			->setEvent($event)
			->setEventLink($eventLink)
			->sendCrmSharingAutoAccepted()
		;
	}
	else
	{
		(new SharingNotificationMail())
			->setEventLink($eventLink)
			->setEvent($event)
			->notifyAboutMeetingCreated($userContact)
		;
	}

	return [
		'eventId' => $event->getId(),
		'eventName' => $event->getName(),
		'eventLinkId' => $eventLink->getId(),
		'eventLinkHash' => $eventLink->getHash(),
		'eventLinkShortUrl' => SharingHelper::getShortUrl($eventLink->getUrl()),
	];
}