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

	if (!$sectionLink)
	{
		// TODO: this condition must be checked before call this method
		$mainResult->addError(new Error('Section connection not found'));
		return $mainResult;
	}
	$manager = $factory->getEventManager();
	$eventLink = $context->getEventConnection();

	if ($eventLink && $eventLink->getVendorEventId() && $sectionLink->isActive())
	{
		if ((int)$eventLink->getEventVersion() !== $event->getVersion())
		{
			try
			{
				$result = $manager->update($event, $context);
				if ($result->isSuccess())
				{
					$status = Dictionary::SYNC_STATUS['success'];
					$eventLink
						->setEntityTag($result->getData()['event']['etag'])
						->setVendorVersionId($result->getData()['event']['version'] ?? null)
						->setVersion($event->getVersion());
				}
				else
				{
					$status = Dictionary::SYNC_STATUS['update'];
				}
				$eventLink->setLastSyncStatus($status);

				$this->mapperFactory->getEventConnection()->update($eventLink);
			}
			catch (NotFoundException $e)
			{
				$this->mapperFactory->getEventConnection()->delete($eventLink);

				return $this->createEvent($event, $context);
			}
		}
		else
		{
			$status = Dictionary::SYNC_STATUS['success'];
			$eventLink->setLastSyncStatus($status);
			$this->mapperFactory->getEventConnection()->update($eventLink);
		}

	}
	elseif ($eventLink && !$sectionLink->isActive())
	{
		$status = Dictionary::SYNC_STATUS['update'];
		$eventLink
			->setVersion($event->getVersion())
			->setLastSyncStatus($status)
		;
		$this->mapperFactory->getEventConnection()->update($eventLink);
	}
	elseif (!$eventLink)
	{
		$status = Dictionary::SYNC_STATUS['create'];
		$eventLink = (new EventConnection())
			->setEvent($event)
			->setConnection($sectionLink->getConnection())
			->setLastSyncStatus($status)
			->setVersion($event->getVersion())
		;
		$this->mapperFactory->getEventConnection()->create($eventLink);
	}
	else
	{
		$status = Dictionary::SYNC_STATUS['create'];
	}
	$resultData[$factory->getConnection()->getVendor()->getCode()] = [
		'status' => $status,
	];

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