• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
  • Класс: CCalendarEvent
  • Вызов: CCalendarEvent::CheckFields
static function CheckFields(&$arFields, $currentEvent = [], $userId = false)
{
	$arFields['ID'] = (int)($arFields['ID'] ?? null);
	$arFields['PARENT_ID'] = (int)($arFields['PARENT_ID'] ?? 0);
	$arFields['OWNER_ID'] = (int)($arFields['OWNER_ID'] ?? 0);

	if (!isset($arFields['TIMESTAMP_X']))
	{
		$arFields['TIMESTAMP_X'] = CCalendar::Date(time(), true, false);
	}

	if (!$userId)
	{
		$userId = CCalendar::GetCurUserId();
	}

	if (!isset($arFields['DT_SKIP_TIME']) && isset($currentEvent['DT_SKIP_TIME']))
	{
		$arFields['DT_SKIP_TIME'] = $currentEvent['DT_SKIP_TIME'];
	}
	if (!isset($arFields['DATE_FROM']) && isset($currentEvent['DATE_FROM']))
	{
		$arFields['DATE_FROM'] = $currentEvent['DATE_FROM'];
	}
	if (!isset($arFields['DATE_TO']) && isset($currentEvent['DATE_TO']))
	{
		$arFields['DATE_TO'] = $currentEvent['DATE_TO'];
	}

	$isNewEvent = !isset($arFields['ID']) || $arFields['ID'] <= 0;
	if (!isset($arFields['DATE_CREATE']) && $isNewEvent)
	{
		$arFields['DATE_CREATE'] = $arFields['TIMESTAMP_X'];
	}

	// Skip time
	if (isset($arFields['SKIP_TIME']))
	{
		$arFields['DT_SKIP_TIME'] = $arFields['SKIP_TIME'] ? 'Y' : 'N';
		unset($arFields['SKIP_TIME']);
	}
	elseif (isset($arFields['DT_SKIP_TIME']) && $arFields['DT_SKIP_TIME'] !== 'Y' && $arFields['DT_SKIP_TIME'] !== 'N')
	{
		unset($arFields['DT_SKIP_TIME']);
	}

	unset($arFields['DT_FROM'], $arFields['DT_TO']);

	$arFields['DT_SKIP_TIME'] = ($arFields['DT_SKIP_TIME'] ?? null) !== 'Y' ? 'N' : 'Y';
	$fromTs = CCalendar::Timestamp($arFields['DATE_FROM'], false, $arFields['DT_SKIP_TIME'] !== 'Y');
	$toTs = CCalendar::Timestamp($arFields['DATE_TO'], false, $arFields['DT_SKIP_TIME'] !== 'Y');

	$arFields['DATE_FROM'] = CCalendar::Date($fromTs);
	$arFields['DATE_TO'] = CCalendar::Date($toTs);

	if (!$fromTs)
	{
		$arFields['DATE_FROM'] = FormatDate("SHORT", time());
		$fromTs = CCalendar::Timestamp($arFields['DATE_FROM'], false, false);
		if (!$toTs)
		{
			$arFields['DATE_TO'] = $arFields['DATE_FROM'];
			$toTs = $fromTs;
			$arFields['DT_SKIP_TIME'] = 'Y';
		}
	}
	elseif (!$toTs)
	{
		$arFields['DATE_TO'] = $arFields['DATE_FROM'];
		$toTs = $fromTs;
	}

	if (($arFields['DT_SKIP_TIME'] ?? null) !== 'Y')
	{
		$arFields['DT_SKIP_TIME'] = 'N';
		if (!isset($arFields['TZ_FROM']) && isset($currentEvent['TZ_FROM']))
		{
			$arFields['TZ_FROM'] = $currentEvent['TZ_FROM'];
		}
		if (!isset($arFields['TZ_TO']) && isset($currentEvent['TZ_TO']))
		{
			$arFields['TZ_TO'] = $currentEvent['TZ_TO'];
		}

		if (!isset($arFields['TZ_FROM']) && !isset($arFields['TZ_TO']))
		{
			$userTimezoneName = CCalendar::GetUserTimezoneName($userId, true);
			$arFields['TZ_FROM'] = $userTimezoneName;
			$arFields['TZ_TO'] = $userTimezoneName;
		}

		if (!isset($arFields['TZ_OFFSET_FROM']))
		{
			$arFields['TZ_OFFSET_FROM'] = CCalendar::GetTimezoneOffset($arFields['TZ_FROM'], $fromTs);
		}
		if (!isset($arFields['TZ_OFFSET_TO']))
		{
			$arFields['TZ_OFFSET_TO'] = CCalendar::GetTimezoneOffset($arFields['TZ_TO'], $toTs);
		}
	}

	if (!isset($arFields['TZ_OFFSET_FROM']))
	{
		$arFields['TZ_OFFSET_FROM'] = 0;
	}
	if (!isset($arFields['TZ_OFFSET_TO']))
	{
		$arFields['TZ_OFFSET_TO'] = 0;
	}

	if (!isset($arFields['DATE_FROM_TS_UTC']))
	{
		$arFields['DATE_FROM_TS_UTC'] = $fromTs - $arFields['TZ_OFFSET_FROM'];
	}
	if (!isset($arFields['DATE_TO_TS_UTC']))
	{
		$arFields['DATE_TO_TS_UTC'] = $toTs - $arFields['TZ_OFFSET_TO'];
	}

	if ($arFields['DATE_FROM_TS_UTC'] > $arFields['DATE_TO_TS_UTC'])
	{
		$arFields['DATE_TO'] = $arFields['DATE_FROM'];
		$arFields['DATE_TO_TS_UTC'] = $arFields['DATE_FROM_TS_UTC'];
		$arFields['TZ_OFFSET_TO'] = $arFields['TZ_OFFSET_FROM'];
		$arFields['TZ_TO'] = $arFields['TZ_FROM'];
	}

	$h24 = 60 * 60 * 24; // 24 hours
	if (($arFields['DT_SKIP_TIME'] ?? null) === 'Y')
	{
		unset($arFields['TZ_FROM'], $arFields['TZ_TO'], $arFields['TZ_OFFSET_FROM'], $arFields['TZ_OFFSET_TO']);
	}

	// Event length in seconds
	if (!isset($arFields['DT_LENGTH']) || (int)$arFields['DT_LENGTH'] === 0)
	{
		if ((int)$fromTs === (int)$toTs && date('H:i', $fromTs) === '00:00' && $arFields['DT_SKIP_TIME'] === 'Y') // One day
		{
			$arFields['DT_LENGTH'] = $h24;
		}
		else
		{
			$arFields['DT_LENGTH'] = (int)($arFields['DATE_TO_TS_UTC'] - $arFields['DATE_FROM_TS_UTC']);
			if (($arFields['DT_SKIP_TIME'] ?? null) === "Y") // We have dates without times
			{
				$arFields['DT_LENGTH'] += $h24;
			}
		}
	}

	if (empty($arFields['VERSION']))
	{
		$arFields['VERSION'] = 1;
	}

	// Accessibility
	$arFields['ACCESSIBILITY'] = mb_strtolower(trim($arFields['ACCESSIBILITY'] ?? ''));
	if (!in_array($arFields['ACCESSIBILITY'], ['busy', 'quest', 'free', 'absent'], true))
	{
		$arFields['ACCESSIBILITY'] = 'busy';
	}

	// Importance
	$arFields['IMPORTANCE'] = mb_strtolower(trim($arFields['IMPORTANCE'] ?? ''));
	if (!in_array($arFields['IMPORTANCE'], ['high', 'normal', 'low']))
	{
		$arFields['IMPORTANCE'] = 'normal';
	}

	// Color
	$arFields['COLOR'] = CCalendar::Color($arFields['COLOR'] ?? null, false);

	// Section
	if (
            isset($arFields['SECTIONS'])
            && !is_array($arFields['SECTIONS'])
            && (int)$arFields['SECTIONS'] > 0
        )
	{
		$arFields['SECTIONS'] = (array)((int)($arFields['SECTIONS'] ?? null));
	}


	self::checkRecurringRuleField($arFields, $toTs, ($currentEvent['EXDATE'] ?? null));

	// Location
	if (!isset($arFields['LOCATION']) || !is_array($arFields['LOCATION']))
	{
		$arFields['LOCATION'] = [
                "NEW" => is_string($arFields['LOCATION'] ?? null)
                    ? $arFields['LOCATION']
                    : ""
            ];
	}

	// Private
	$arFields['PRIVATE_EVENT'] = isset($arFields['PRIVATE_EVENT']) && $arFields['PRIVATE_EVENT'];

	return true;
}