• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/vendorsynchronization.php
  • Класс: BitrixCalendarSyncManagersVendorSynchronization
  • Вызов: VendorSynchronization::updateInstance
public function updateInstance(Event $event, EventContext $context): Result
{
	$result = new Result();
	$resultData = [];
	$factory = $this->factory;
	$sectionLink = $context->getSectionConnection();
	$eventLink = $context->getEventConnection();
	if (!$sectionLink)
	{
		$result->addError(new Error('Section connection not found'));

		return $result;
	}
	if (!$eventLink)
	{
		$result->addError(new Error('Instance connection not found'));

		return $result;
	}

	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)
			->add('sync', 'instanceLink', $eventLink)
		;

		$result = $manager->updateInstance($event, $context);
		if ($result->isSuccess())
		{
			$status = Dictionary::SYNC_STATUS['success'];
			$eventLink
				->setLastSyncStatus($status)
				->setVersion($event->getVersion())
				->setVendorVersionId($result->getData()['event']['version'] ?? null)
			;
			if (!empty($result->getData()['event']['id']))
			{
				$eventLink->setVendorEventId($result->getData()['event']['id']);
			}
			if ($factory->getCode() !== IcloudHelper::ACCOUNT_TYPE)
			{
				$eventLink->setEntityTag($result->getData()['event']['etag'] ?? null);
			}
			$this->mapperFactory->getEventConnection()->update($eventLink);

			if ($factory->getCode() === IcloudHelper::ACCOUNT_TYPE)
			{
				$masterLink
					->setEntityTag($result->getData()['event']['etag'])
					->setLastSyncStatus($status)
					->setVersion($masterEvent->getVersion())
				;
				$this->mapperFactory->getEventConnection()->update($masterLink);
			}
		}
		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);
}