33 protected function init(): void
37 $this->userId = \CCalendar::GetUserId();
43 'getUsersAccessibility' => [
45 ActionFilter\Authentication::class,
46 ActionFilter\Csrf::class,
54 ActionFilter\Authentication::class,
55 ActionFilter\Csrf::class,
63 ActionFilter\Authentication::class,
64 ActionFilter\Csrf::class,
72 ActionFilter\Authentication::class,
73 ActionFilter\Csrf::class,
81 ActionFilter\Authentication::class,
82 ActionFilter\Csrf::class,
88 'getConferenceLink' => [
90 ActionFilter\Authentication::class,
91 ActionFilter\Csrf::class,
97 'getIcsFileContent' => [
99 ActionFilter\Authentication::class,
100 ActionFilter\Csrf::class,
106 'handleTimelineNotify' => [
108 ActionFilter\Authentication::class,
109 ActionFilter\Csrf::class,
115 'enableUserSharing' => [
120 'disableUserSharing' => [
125 'disableUserLink' => [
130 'increaseFrequentUse' => [
135 'generateUserJointSharingLink' => [
140 'getAllUserLink' => [
171 return $sharing->getLinkInfo();
252 if (Loader::includeModule(
'intranet') && !\
Bitrix\Intranet\Util::isIntranetUser())
258 'userLinks' => (
new Sharing\Sharing($this->userId))->getAllUserLinkInfo(),
259 'pathToUser' => Option::get(
'intranet',
'path_user',
'/company/personal/user/#USER_ID#/',
'-'),
267 $userIds =
$request->getPost(
'userIds');
268 $fromTs =
$request->getPost(
'timestampFrom') / 1000;
269 $toTs =
$request->getPost(
'timestampTo') / 1000;
271 if (!is_array($userIds) || !$fromTs || !$toTs)
277 'userIds' => array_map(
'intval', $userIds),
278 'timestampFrom' => $fromTs,
279 'timestampTo' => $toTs
280 ]))->getUsersAccessibilitySegmentsInUtc();
290 public function saveEventAction():
array
299 $userContact = $sqlHelper->forSql(trim(
$request[
'userContact'] ??
''));
300 $parentLinkHash = $sqlHelper->forSql(trim(
$request[
'parentLinkHash'] ??
''));
301 $ownerId = (int)(
$request[
'ownerId'] ??
null);
302 $ownerCreated = (
$request[
'ownerCreated'] ??
null) ===
'true';
306 if ($contactDataError || $contactNameError)
308 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_INCORRECT_CONTACT_DATA')));
311 'contactDataError' => $contactDataError,
312 'contactNameError' => $contactNameError,
317 $link = Link\Factory::getInstance()->getLinkByHash($parentLinkHash);
321 || !$link->isActive()
323 $link->getObjectType(),
324 [
Sharing\Link\Helper::USER_SHARING_TYPE,
Sharing\Link\Helper::GROUP_SHARING_TYPE],
327 || !$this->checkLinkBelongsOwnerId($link, $ownerId)
337 'CONTACT_DATA' => $userContact,
341 $userId = SharingUser::getInstance()->getAnonymousUserForOwner($userParams);
345 $userId = SharingUser::getInstance()->login(
true, $userParams);
351 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_USER_NOT_FOUND')));
356 $eventData = Sharing\SharingEventManager::getEventDataFromRequest(
$request);
357 $eventData[
'eventName'] = Sharing\SharingEventManager::getSharingEventNameByUserName(
$userName);
359 $event = Sharing\SharingEventManager::prepareEventForSave($eventData, $userId, $link);
361 $sharingEventManager =
new Sharing\SharingEventManager(
$event, $userId, $ownerId, $link);
362 $eventCreateResult = $sharingEventManager->createEvent(
false, $userParams[
'NAME']);
364 if (
$errors = $eventCreateResult->getErrors())
372 $event = $eventCreateResult->getData()[
'event'];
374 $eventLink = $eventCreateResult->getData()[
'eventLink'];
376 Sharing\Analytics::getInstance()->sendMeetingCreated($link);
379 $this->autoAcceptSharingEvent(
$event->getId(), $ownerId);
380 foreach ($link->getMembers() as $member)
382 $this->autoAcceptSharingEvent(
$event->getId(), $member->getId());
386 $event = (
new Mappers\Factory())->getEvent()->getById(
$event->getId());
388 $notificationService =
null;
389 if (SharingEventManager::isEmailCorrect($userContact))
391 $notificationService = (
new Sharing\Notification\Mail())
392 ->setEventLink($eventLink)
397 $notificationService?->notifyAboutMeetingCreated($userContact);
400 'eventId' =>
$event->getId(),
401 'eventName' =>
$event->getName(),
402 'eventLinkId' => $eventLink->getId(),
403 'eventLinkHash' => $eventLink->getHash(),
404 'eventLinkShortUrl' => Sharing\Helper::getShortUrl($eventLink->getUrl()),
408 public function saveCrmEventAction():
array
413 if (!Loader::includeModule(
'crm'))
423 $crmDealLinkHash = $sqlHelper->forSql(trim(
$request[
'crmDealLinkHash'] ??
''));
424 $ownerId = (int)(
$request[
'ownerId'] ??
null);
425 $ownerCreated = (
$request[
'ownerCreated'] ??
null) ===
'true';
428 $crmDealLink = Link\Factory::getInstance()->getLinkByHash($crmDealLinkHash);
432 || !$crmDealLink->isActive()
433 || $crmDealLink->getObjectType() !== Sharing\Link\Helper::CRM_DEAL_SHARING_TYPE
434 || $crmDealLink->getOwnerId() !== $ownerId
442 if (!$crmDealLink->getContactId() || !$crmDealLink->getContactType())
445 $userContact = $sqlHelper->forSql(trim(
$request[
'userContact'] ??
''));
447 $contactDataError = !Sharing\SharingEventManager::validateContactData($userContact);
448 $contactNameError = !Sharing\SharingEventManager::validateContactName(
$userName);
449 if ($contactDataError || $contactNameError)
451 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_INCORRECT_CONTACT_DATA')));
454 'contactDataError' => $contactDataError,
455 'contactNameError' => $contactNameError,
461 $contactType = $crmDealLink->getContactType();
462 $contactId = $crmDealLink->getContactId();
463 $contactData = \Bitrix\Crm\Service\Container::getInstance()
464 ->getEntityBroker($contactType)
465 ->getById($contactId)
475 if ($contactType === \CCrmOwnerType::Contact)
479 elseif ($contactType === \CCrmOwnerType::Company)
488 'CONTACT_DATA' => $userContact,
492 $userId = SharingUser::getInstance()->getAnonymousUserForOwner($userParams);
496 $userId = SharingUser::getInstance()->login(
true, $userParams);
499 $eventData = Sharing\SharingEventManager::getCrmEventDataFromRequest(
$request);
500 $eventData[
'eventName'] = Sharing\SharingEventManager::getSharingEventNameByDealId($crmDealLink->getEntityId());
502 $event = Sharing\SharingEventManager::prepareEventForSave($eventData, $userId, $crmDealLink);
504 $sharingEventManager =
new Sharing\SharingEventManager(
$event, $userId, $ownerId, $crmDealLink);
505 $eventCreateResult = $sharingEventManager->createEvent(
false, $userParams[
'NAME']);
507 if (
$errors = $eventCreateResult->getErrors())
515 $event = $eventCreateResult->getData()[
'event'];
517 $eventLink = $eventCreateResult->getData()[
'eventLink'];
519 Sharing\Analytics::getInstance()->sendMeetingCreated($crmDealLink);
521 $dateFrom =
$request[
'dateFrom'] ??
null;
522 $timezone =
$request[
'timezone'] ??
null;
526 $activityName = Loc::getMessage(
'EC_SHARINGAJAX_ACTIVITY_SUBJECT');
528 $crmDealLink->setLastStatus(
null);
529 (
new Sharing\Link\CrmDealLinkMapper())->update($crmDealLink);
532 (
new Sharing\Crm\ActivityManager(
$event->getId(), $crmDealLink,
$userName, $eventLink))
534 ->createCalendarSharingActivity($activityName,
$event->getDescription(), $eventStart)
538 $this->autoAcceptSharingEvent(
$event->getId(), $ownerId);
539 foreach ($crmDealLink->getMembers() as $member)
541 $this->autoAcceptSharingEvent(
$event->getId(), $member->getId());
545 if ($crmDealLink->getContactId() > 0)
547 Crm\Integration\Calendar\Notification\Manager::getSenderInstance($crmDealLink)
548 ->setCrmDealLink($crmDealLink)
550 ->setEventLink($eventLink)
551 ->sendCrmSharingAutoAccepted()
556 (
new Sharing\Notification\Mail())
557 ->setEventLink($eventLink)
559 ->notifyAboutMeetingCreated($userContact)
564 'eventId' =>
$event->getId(),
565 'eventName' =>
$event->getName(),
566 'eventLinkId' => $eventLink->getId(),
567 'eventLinkHash' => $eventLink->getHash(),
568 'eventLinkShortUrl' => Sharing\Helper::getShortUrl($eventLink->getUrl()),
577 public function deleteEventAction():
array
581 $eventId = (int)
$request[
'eventId'];
582 $eventLinkHash = Application::getConnection()->getSqlHelper()->forSql(
$request[
'eventLinkHash']);
585 $eventLink = Link\Factory::getInstance()->getLinkByHash($eventLinkHash);
588 || !$eventLink->isActive()
589 || $eventLink->getObjectType() !== Sharing\Link\Helper::EVENT_SHARING_TYPE
598 $event = (
new Mappers\Event())->getById($eventId);
601 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_EVENT_NOT_FOUND')));
606 if (
$event->getId() !== $eventLink->getEventId())
608 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_EVENT_DELETE_ERROR')));
613 $sharingEventManager =
new Sharing\SharingEventManager(
$event, $eventLink->getHostId(), $eventLink->getOwnerId());
614 $eventDeleteResult = $sharingEventManager->deleteEvent();
616 if ($eventDeleteResult->getErrors())
618 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_EVENT_DELETE_ERROR')));
622 $sharingEventManager->deactivateEventLink($eventLink);
633 $cookieName =
'CALENDAR_SHARING_FIRST_PAGE_VISITED';
634 $cookie =
new Cookie($cookieName,
'Y',
null,
false);
635 Context::getCurrent()->getResponse()->addCookie($cookie);
642 if (Loader::includeModule(
'intranet') && !\
Bitrix\Intranet\Util::isIntranetUser())
649 $saveResult = \Bitrix\Calendar\Sharing\Link\Rule\Helper::getInstance()->saveLinkRule($linkHash, $ruleArray);
653 $this->
addError(
new Error(
'Error while trying to save rule'));
659 private function currentUserIsNotResponsible(
Sharing\
Link\
Link $link): bool
661 if (!Loader::includeModule(
'crm'))
666 if (!($link instanceof
Sharing\Link\CrmDealLink))
671 $currentUserId = (
new Crm\Service\Context())->getUserId();
673 return $this->getAssignedId($link) !== $currentUserId;
676 private function getAssignedId(Sharing\Link\CrmDealLink $link): ?int
678 $entityBroker = Crm\Service\Container::getInstance()->getEntityBroker(\CCrmOwnerType::Deal);
684 $entity = $entityBroker->getById($link->getEntityId());
690 return $entity->getAssignedById();
702 public function getConferenceLinkAction(
string $eventLinkHash):
array
705 $eventLinkHash = Application::getConnection()->getSqlHelper()->forSql($eventLinkHash);
708 $eventLink = Link\Factory::getInstance()->getLinkByHash($eventLinkHash);
709 if (!$eventLink || !$eventLink->isActive() || $eventLink->getObjectType() !== Sharing\Link\Helper::EVENT_SHARING_TYPE)
716 $conferenceLink = (
new Sharing\SharingConference($eventLink))->getConferenceLink();
718 if (!$conferenceLink)
720 $this->
addError(
new Error(
'Error while creating conference link'));
725 $result[
'conferenceLink'] = $conferenceLink;
733 public function getIcsFileContentAction(
string $eventLinkHash): string
736 $eventLinkHash = Application::getConnection()->getSqlHelper()->forSql($eventLinkHash);
739 $eventLink = Link\Factory::getInstance()->getLinkByHash($eventLinkHash);
742 || !$eventLink->isActive()
743 || $eventLink->getObjectType() !== Sharing\Link\Helper::EVENT_SHARING_TYPE
752 $event = (
new Mappers\Event())->getById($eventLink->getEventId());
756 $this->
addError(
new Error(Loc::getMessage(
'EC_SHARINGAJAX_EVENT_ACCESS_DENIED')));
761 $event->setName(SharingEventManager::getSharingEventNameByUserId($eventLink->getOwnerId()));
762 return IcsManager::getInstance()->getIcsFileContent(
$event, [
763 'eventUrl' => Sharing\Helper::getShortUrl($eventLink->getUrl()),
764 'conferenceUrl' => Sharing\Helper::getShortUrl($eventLink->getUrl() . Sharing\Helper::ACTION_CONFERENCE),
768 public function getDeletedSharedEventAction(
int $entryId):
array
770 if (Loader::includeModule(
'intranet') && !\Bitrix\Intranet\Util::isIntranetUser())
775 $event = \CCalendar::getDeletedSharedEvent($entryId);
780 $eventId = $entryId ===
$event[
'ID'] ? $entryId :
$event[
'PARENT_ID'];
781 $link = (
new Sharing\Link\Factory())->getDeletedEventLinkByEventId($eventId);
785 'canceledTimestamp' => $link->getCanceledTimestamp(),
786 'externalUserName' => $link->getExternalUserName(),
787 'externalUserId' => $link->getHostId(),
794 'link' => $linkArray,
795 'userTimezone' => $this->getUserTimezoneName(),
799 public function handleTimelineNotifyAction():
array
803 if (!Loader::includeModule(
'crm'))
813 $linkHash = $sqlHelper->forSql(trim(
$request[
'linkHash'] ??
''));
814 $entityType = $sqlHelper->forSql(trim(
$request[
'entityType'] ??
''));
815 $notifyType = $sqlHelper->forSql(trim(
$request[
'notifyType']) ??
'');
817 $dateFrom =
$request[
'dateFrom'] ??
null;
818 $timezone =
$request[
'timezone'] ??
null;
822 $link = Link\Factory::getInstance()->getLinkByHash($linkHash);
825 || !$link->isActive()
827 || $link->getObjectType() !== $entityType
835 if (in_array($notifyType, Sharing\Crm\NotifyManager::NOTIFY_TYPES,
true))
837 (
new Sharing\Crm\NotifyManager($link, $notifyType))
840 $link->setLastStatus($notifyType);
841 (
new Sharing\Link\CrmDealLinkMapper())->update($link);
850 $sharing->setSharingSettingsCollapsed($collapsed ===
'Y');
856 $sharing->setSortJointLinksByFrequentUse($sortByFrequentUse ===
'Y');
859 private function getUserTimezoneName(): string
861 return \CCalendar::getUserTimezoneName($this->userId);
864 private function autoAcceptSharingEvent(
int $eventId,
int $userId)
866 \CCalendarEvent::SetMeetingStatus([
867 'eventId' => $eventId,
870 'sharingAutoAccept' =>
true,
874 private function checkLinkBelongsOwnerId(Link\Link $link,
int $ownerId): bool
876 return match ($link->getObjectType())
878 Sharing\Link\Helper::GROUP_SHARING_TYPE => $link->getHostId() === $ownerId,
879 default => $link->getOwnerId() === $ownerId,