- Модуль: 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()),
];
}