• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/vendorsynchronization.php
  • Класс: BitrixCalendarSyncManagersVendorSynchronization
  • Вызов: VendorSynchronization::createEvent
public function createEvent(Event $event, EventContext $context): Result
{
	$mainResult = new Result();
	$data = [];
	$factory = $this->factory;
	$manager = $factory->getEventManager();

	$sectionLink = $context->getSectionConnection();

	if (!$sectionLink)
	{
		return $mainResult->setData([$factory->getConnection()->getVendor()->getCode() => [
			'status' => Dictionary::SYNC_STATUS['failed'],
			'message' => 'Section link not found', // TODO: Localize?
		]]);
	}

	$eventLink = $this->getEventConnection($event)
			?? (new EventConnection())
				->setEvent($event)
				->setConnection($sectionLink->getConnection());
	if ($sectionLink->isActive())
	{
		try
		{
			$result = $manager->create($event, $context);
			if ($result->isSuccess())
			{
				$resultData = $result->getData();
				$status = Dictionary::SYNC_STATUS['success'];
				$eventLink
					->setVendorEventId($resultData['event']['id'])
					->setEntityTag($resultData['event']['etag'])
					->setVendorVersionId($resultData['event']['version'] ?? null)
					->setVersion($event->getVersion())
					->setLastSyncStatus($status);
				if (!empty($result->getData()['data']))
				{
					$eventLink->setData($result->getData()['data']);
				}
			}
			else
			{
				$status = Dictionary::SYNC_STATUS['create'];
				$eventLink->setLastSyncStatus($status);
			}
			$syncResult = [
				'status' => $status,
				'result' => $result,
			];
		}
		catch (NotFoundException $e)
		{
			// if section was not found on service
			$sectionLink->setActive(false)->setSyncToken(null)->setPageToken(null);
			$this->mapperFactory->getSectionConnection()->update($sectionLink);
		}
	}
	// dont change to "else", because active status could change in the if section
	if (!$sectionLink->isActive())
	{
		$status = Dictionary::SYNC_STATUS['create'];
		$eventLink->setLastSyncStatus($status)->setVendorEventId('');

		$syncResult = [
			'status' => $status,
		];
	}
	/** @var EventConnection $eventLink */
	$eventLink = $eventLink->getId()
		? $this->mapperFactory->getEventConnection()->update($eventLink)
		: $this->mapperFactory->getEventConnection()->create($eventLink);

	$syncResult['eventConnectionId'] = $eventLink->getId();
	$data['result'] = $syncResult;

	return $mainResult->setData($data);
}