• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/userfield/resourcebooking.php
  • Класс: BitrixCalendarUserFieldResourceBooking
  • Вызов: ResourceBooking::saveResource
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;
}