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

	$sectionLink = $context->getSectionConnection();

	if (!$sectionLink)
	{
		$result->addError(new Error('Section connection not found'));

		return $result;
	}

	/** @var Event $masterEvent */
	if ($masterEvent = $this->getMasterEvent($event))
	{
		$manager = $factory->getEventManager();
		$masterLink = $this->getEventConnection($masterEvent);
		if ($masterLink === null)
		{
			// error of Transition period. This situation is impossible in regular mode.
			$result->addError(new Error('Series master event does not have connection with vendor'));

			return $result;
		}
		$context->setEventConnection($masterLink);

		$result = $manager->createInstance($event, $context);

		if ($result->isSuccess())
		{
			$resultData = $result->getData();
			$status = Dictionary::SYNC_STATUS['success'];
			if ($factory->getCode() === IcloudHelper::ACCOUNT_TYPE)
			{
				$masterLink
					->setVendorEventId($result->getData()['event']['id'])
					->setEntityTag($resultData['event']['etag'])
					->setLastSyncStatus($status)
					->setVersion($masterEvent->getVersion())
				;
				$this->mapperFactory->getEventConnection()->update($masterLink);
			}

			$eventLink = (new EventConnection())
				->setEvent($event)
				->setConnection($sectionLink->getConnection())
				->setVendorEventId($result->getData()['event']['id'])
				->setVendorVersionId($result->getData()['event']['version'] ?? null)
				->setRecurrenceId($result->getData()['event']['recurrence'] ?? null)
				->setData($result->getData()['event']['data'] ?? null)
				->setLastSyncStatus($status)
				->setVersion($event->getVersion())
			;
			if ($factory->getCode() !== IcloudHelper::ACCOUNT_TYPE)
			{
				$eventLink->setEntityTag($result->getData()['event']['etag'] ?? null);
			}

			$this->mapperFactory->getEventConnection()->create($eventLink);
		}
		else
		{
			$status = Dictionary::SYNC_STATUS['failed'];
			$masterLink->setLastSyncStatus(Dictionary::SYNC_STATUS['update']);
			$this->mapperFactory->getEventConnection()->update($masterLink);
		}
	}
	else
	{
		$status = Dictionary::SYNC_STATUS['failed'];
		$result->addError(new Error('Master event not found'));
	}

	$resultData[$factory->getConnection()->getVendor()->getCode()] = [
		'result' => $result,
		'status' => $status,
	];

	return (new Result())->setData($resultData);
}