static function saveResource($id, $resourceType, $resourceId, $eventFields = [], $params = [])
{
$valueToSave = null;
$currentUserId = CCalendar::getCurUserId();
$eventFields["EVENT_TYPE"] = '#resourcebooking#';
if ($resourceType === 'user')
{
$eventFields["CAL_TYPE"] = $resourceType;
$eventFields["OWNER_ID"] = $resourceId;
if ($params['userField']['ENTITY_ID'] === 'CRM_DEAL' || $params['userField']['ENTITY_ID'] === 'CRM_LEAD')
{
$sectionId = CCalendar::getCrmSection($resourceId, true);
}
else
{
$sectionId = CCalendar::getMeetingSection($resourceId, true);
}
if ($sectionId)
{
$eventFields['SECTIONS'] = [$sectionId];
}
// Userfields for event
$userFields = [];
if ($params['userField']['ENTITY_ID'] === 'CRM_DEAL')
{
$userFields['UF_CRM_CAL_EVENT'] = ["D_".$params['userField']['VALUE_ID']];
}
elseif ($params['userField']['ENTITY_ID'] === 'CRM_LEAD')
{
$userFields['UF_CRM_CAL_EVENT'] = ["L_".$params['userField']['VALUE_ID']];
}
$entryId = CCalendar::saveEvent([
'arFields' => $eventFields,
'UF' => $userFields,
'silentErrorMode' => false,
'autoDetectSection' => true,
'autoCreateSection' => true,
'checkPermission' => false
]);
}
else
{
$eventFields["CAL_TYPE"] = $resourceType;
$eventFields["SECTIONS"] = $resourceId;
$entryId = CCalendarEvent::edit([
'arFields' => $eventFields
]);
}
if ($entryId)
{
if ($eventFields['TZ_FROM'] ?? null)
{
$from = new TypeDateTime($eventFields["DATE_FROM"]);
$to = new TypeDateTime($eventFields["DATE_TO"]);
$fromUtc = new TypeDateTime($eventFields["DATE_FROM"], null, new DateTimeZone('UTC'));
$toUtc = new TypeDateTime($eventFields["DATE_TO"], null, new DateTimeZone('UTC'));
}
else
{
$from = new TypeDateTime($eventFields["DATE_FROM"]);
$to = new TypeDateTime($eventFields["DATE_TO"]);
$fromUtc = $from;
$toUtc = $to;
}
CTimeZone::Disable();
$resourceTableFields = [
'EVENT_ID' => $entryId,
'CAL_TYPE' => $eventFields["CAL_TYPE"],
'RESOURCE_ID' => $resourceId,
'PARENT_TYPE' => $params['bindingEntityType'] ?? $params['userField']['ENTITY_ID'],
'PARENT_ID' => $params['bindingEntityId'] ?? $params['userField']['VALUE_ID'],
'UF_ID' => $params['bindingUserfieldId'] ?? $params['userField']['ID'],
'DATE_FROM' => $from,
'DATE_TO' => $to,
'SKIP_TIME' => $eventFields['SKIP_TIME'] ?? null,
'DATE_FROM_UTC' => $fromUtc,
'DATE_TO_UTC' => $toUtc,
'TZ_FROM' => $eventFields['TZ_FROM'] ?? null,
'TZ_TO' => $eventFields['TZ_TO'] ?? null,
'TZ_OFFSET_FROM' => CCalendar::getTimezoneOffset(
$eventFields['TZ_FROM'] ?? null,
CCalendar::timestamp($eventFields["DATE_FROM"])
),
'TZ_OFFSET_TO' => CCalendar::getTimezoneOffset(
$eventFields['TZ_TO'] ?? null,
CCalendar::timestamp($eventFields["DATE_TO"])
),
'CREATED_BY' => $currentUserId,
'SERVICE_NAME' => $params['serviceName'] ?? null
];
if ($id)
{
$result = InternalsResourceTable::update($id, $resourceTableFields);
}
else
{
$result = InternalsResourceTable::add($resourceTableFields);
}
if ($result->isSuccess())
{
$valueToSave = $result->getId();
}
else
{
CCalendar::deleteEvent((int)$entryId, false);
}
foreach(BitrixMainEventManager::getInstance()->findEventHandlers("calendar", "onAfterResourceBookingAdd") as $event)
{
ExecuteModuleEventEx($event, [[
'userFieldValueId' => $valueToSave,
'bookingEventId' => $entryId,
'resourceType' => $resourceType,
'resourceId' => $resourceId,
'serviceName' => $params['serviceName'] ?? null,
'dateFrom' => $from,
'dateTo' => $to,
'skipTime' => $eventFields['SKIP_TIME'],
'timezoneFrom' => $eventFields['TZ_FROM'] ?? null,
'timezoneTo' => $eventFields['TZ_TO'] ?? null,
]]);
}
CTimeZone::Enable();
}
return $valueToSave;
}