• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/userfield/resourcebooking.php
  • Класс: BitrixCalendarUserFieldResourceBooking
  • Вызов: ResourceBooking::onBeforeSaveAll
static function onBeforeSaveAll($userField, $values, $userId = false)
{
	$valuesToSave = [];
	$currentUserId = CCalendar::getCurUserId();
	$dateFrom = false;
	$dateTo = false;
	$serviceName = '';
	$entityTitle = '';
	$fields = [];

	$resourseList = InternalsResourceTable::getList([
		"filter" => [
			"PARENT_TYPE" => $userField['ENTITY_ID'],
			"PARENT_ID" => $userField['VALUE_ID'],
			"UF_ID" => $userField['ID']
		]
	]);

	$currentEntriesIndex = [];
	while ($resourse = $resourseList->fetch())
	{
		$currentEntriesIndex[$resourse['CAL_TYPE'].$resourse['RESOURCE_ID']] = $resourse;
	}

	if (self::isCrmEntity($userField['ENTITY_ID']) && Loader::includeModule('crm'))
	{
		if ($userField['ENTITY_ID'] === self::CRM_DEAL_ENTITY_ID)
		{
			$entity = CCrmDeal::GetByID($userField['VALUE_ID'], false);
			if (!empty($entity) && $entity['TITLE'])
			{
				$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE").': '.$entity['TITLE'];
			}
		}
		elseif ($userField['ENTITY_ID'] === self::CRM_LEAD_ENTITY_ID)
		{
			$entity = CCrmLead::GetByID($userField['VALUE_ID'], false);
			if (!empty($entity) && $entity['TITLE'])
			{
				$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE").': '.$entity['TITLE'];
			}
		}

		if (
			$userField['ENTITY_ID'] === self::CRM_SUSPENDED_DEAL_ENTITY_ID
			|| $userField['ENTITY_ID'] === self::CRM_SUSPENDED_LEAD_ENTITY_ID
		)
		{
			$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE")." (Deleted)";
		}
	}

	if (!$entityTitle)
	{
		$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE");
	}

	$valuesToMerge = [];
	foreach ($values as $value)
	{
		if ((string)$value === (string)((int)$value))
		{
			$currentValue = static::fetchFieldValue($value);
			$skipTime = is_array($userField['SETTINGS']) && $userField['SETTINGS']['FULL_DAY'] === 'Y';
			$fromTs = CCalendar::timestamp($currentValue['DATE_FROM'], true, !$skipTime);
			$toTs = CCalendar::timestamp($currentValue['DATE_TO'], true, !$skipTime);

			foreach ($currentValue['ENTRIES'] as $entry)
			{
				$entryExist = false;

				foreach ($values as $iValue)
				{
					$str = $entry['TYPE'].'|'.$entry['RESOURCE_ID'];
					if (str_starts_with($iValue, $str))
					{
						$entryExist = true;
						break;
					}
				}

				if (!$entryExist)
				{
					$valuesToMerge[] = self::prepareValue(
						$entry['TYPE'],
						$entry['RESOURCE_ID'],
						$currentValue['DATE_FROM'],
						$toTs - $fromTs,
						$currentValue['SERVICE_NAME']
					);
				}
			}
		}
	}

	$values = array_merge($values, $valuesToMerge);

	foreach ($values as $value)
	{
		$value = self::parseValue($value);

		if (!is_array($value))
		{
			continue;
		}

		if (!$dateFrom || !$dateTo)
		{
			$dateFromTimestamp = CCalendar::timestamp($value['from']);
			$skipTime = isset($userField['SETTINGS']) && $userField['SETTINGS']['FULL_DAY'] === 'Y';
			$dateFrom = CCalendar::date($dateFromTimestamp, !$skipTime);
			$duration = (int)$value['duration'];
			$dateTo = CCalendar::date($dateFromTimestamp + ($skipTime ? $duration - CCalendar::DAY_LENGTH : $duration), !$skipTime);
			$serviceName = trim($value['serviceName']);

			$fields = [
				"DATE_FROM" => $dateFrom,
				"DATE_TO" => $dateTo,
				"SKIP_TIME" => $skipTime,
				"NAME" => $entityTitle
			];

			if (
				$userField['ENTITY_ID'] === self::CRM_SUSPENDED_DEAL_ENTITY_ID
				|| $userField['ENTITY_ID'] === self::CRM_SUSPENDED_LEAD_ENTITY_ID
			)
			{
				$fields["DELETED"] = 'Y';
			}

			if ($serviceName !== '')
			{
				$fields["DESCRIPTION"] = Loc::getMessage("USER_TYPE_RESOURCE_SERVICE_LABEL").': '.$serviceName;
			}

			if (!$skipTime)
			{
				if ($userField['SETTINGS']['USE_USER_TIMEZONE'] === 'Y')
				{
					$timezoneName = CCalendar::getUserTimezoneName($currentUserId, true);
				}
				else if($userField['SETTINGS']['TIMEZONE'])
				{
					$timezoneName = $userField['SETTINGS']['TIMEZONE'];
				}
				else
				{
					$timezoneName = CCalendar::GetGoodTimezoneForOffset((int)date("Z"));
				}

				if($timezoneName)
				{
					$fields['TZ_FROM'] = $timezoneName;
					$fields['TZ_TO'] = $timezoneName;
				}
			}
		}

		$entryId = false;
		if (isset($currentEntriesIndex[$value['type'] . $value['id']]))
		{
			$fields['ID'] = $currentEntriesIndex[$value['type'].$value['id']]['EVENT_ID'];
			$entryId = $currentEntriesIndex[$value['type'].$value['id']]['ID'];
		}
		else
		{
			unset($fields['ID']);
		}

		$resourceBookingId = self::saveResource(
			$entryId,
			$value['type'],
			$value['id'],
			$fields,
			[
				'userField' => $userField,
				'serviceName' => $serviceName
			]
		);

		if ($resourceBookingId)
		{
			$valuesToSave[] = $resourceBookingId;
		}
	}

	foreach ($currentEntriesIndex as $resourceEntry)
	{
		if (!in_array($resourceEntry['ID'], $valuesToSave))
		{
			self::releaseResource($resourceEntry);
		}
	}

	return  $valuesToSave;
}