- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/datasyncmanager.php
- Класс: BitrixCalendarSyncManagersDataSyncManager
- Вызов: DataSyncManager::syncCalendarEvents
private function syncCalendarEvents(
Connection $connection,
int $sectionId,
array $events
): array
{
$linksMap = [];
$result = [];
$eventsLink = EventConnectionTable::query()
->setSelect([
'EVENT_CONNECTION_ID' => 'ID',
'VENDOR_EVENT_ID',
'VERSION',
'ENTITY_TAG',
'EVENT_ID',
'IS_MEETING' => 'EVENT.IS_MEETING',
'MEETING' => 'EVENT.MEETING',
'EXDATE' => 'EVENT.EXDATE',
'EVENT_PARENT_ID' => 'EVENT.PARENT_ID',
'EVENT_TYPE' => 'EVENT.EVENT_TYPE',
'EVENT_NAME' => 'EVENT.NAME',
'EVENT_OWNER_ID' => 'EVENT.OWNER_ID',
'EVENT_DATE_FROM' => 'EVENT.DATE_FROM',
'EVENT_DATE_TO' => 'EVENT.DATE_TO',
'EVENT_TZ_FROM' => 'EVENT.TZ_FROM',
'EVENT_TZ_TO' => 'EVENT.TZ_TO',
'EVENT_VERSION' => 'EVENT.VERSION',
'ATTENDEES_CODES' => 'EVENT.ATTENDEES_CODES',
'ACCESSIBILITY' => 'EVENT.ACCESSIBILITY',
])
->where('EVENT.CAL_TYPE', self::ENTITY_TYPE)
->where('EVENT.OWNER_ID', $connection->getOwner()->getId())
->where('EVENT.SECTION_ID', $sectionId)
->where('EVENT.DELETED', 'N')
->where(Query::filter()
->logic('or')
->whereNot('EVENT.MEETING_STATUS', 'N')
->whereNull('EVENT.MEETING_STATUS')
)
->whereNotNull('ENTITY_TAG')
->exec()
;
while ($event = $eventsLink->fetch())
{
$linksMap[$event['VENDOR_EVENT_ID']] = $event;
}
foreach ($events as $index => $event)
{
if (!empty($linksMap[$event['XML_ID']]))
{
$existEvent = $linksMap[$event['XML_ID']];
if (($existEvent['ENTITY_TAG'] ?? null) === ($event['SYNC_TOKEN'] ?? null))
{
continue;
}
if ($this->isBlockedChange($existEvent, $event))
{
continue;
}
if ((int)$event['STATUS'] === 200)
{
if (($linksMap[$event['XML_ID']]['ENTITY_TAG'] ?? null) !== ($event['SYNC_TOKEN'] ?? null))
{
$result[] = $this->prepareExistedEventParams($event['XML_ID'], $linksMap[$event['XML_ID']]);
}
else
{
unset($events[$index]);
}
}
else if ((int)$event['STATUS'] === 404)
{
CCalendar::DeleteEvent(
$linksMap[$event['XML_ID']]['EVENT_ID'],
false,
[
'markDeleted' => true,
'originalFrom' => $connection->getVendor()->getCode(),
'checkPermissions' => false,
]
);
EventConnectionTable::delete($linksMap[$event['XML_ID']]['EVENT_CONNECTION_ID']);
}
}
else if (!empty($event['SYNC_TOKEN']) && (int)$event['STATUS'] === 200)
{
$result[] = $this->prepareExistedEventParams($event['XML_ID']);
}
}
return $result;
}