- Модуль: 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);
}