• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
  • Класс: CCalendarEvent
  • Вызов: CCalendarEvent::checkRecurringRuleField
static function checkRecurringRuleField(array &$arFields, int $toTs, $currentExDate): void
{
	// Check rrules
	if (
		!empty($arFields['RRULE']['FREQ'])
		&& in_array($arFields['RRULE']['FREQ'], ['HOURLY', 'DAILY', 'MONTHLY', 'YEARLY', 'WEEKLY'])
	)
	{
		// Interval
		if (isset($arFields['RRULE']['INTERVAL']) && (int)$arFields['RRULE']['INTERVAL'] > 1)
			$arFields['RRULE']['INTERVAL'] = (int)$arFields['RRULE']['INTERVAL'];

		// Until date

		$untilTs = CCalendar::Timestamp($arFields['RRULE']['UNTIL'] ?? null, false, false);
		if (!$untilTs)
		{
			$arFields['RRULE']['UNTIL'] = CCalendar::GetMaxDate();
			$untilTs = CCalendar::Timestamp($arFields['RRULE']['UNTIL'], false, false);
		}
		elseif ($untilTs + CCalendar::GetDayLen() < $toTs)
		{
			$untilTs = $toTs;
		}
		$arFields['DATE_TO_TS_UTC'] = $untilTs + CCalendar::GetDayLen();
		$arFields['RRULE']['UNTIL'] = CCalendar::Date($untilTs, false);
		unset($arFields['RRULE']['~UNTIL']);
		if (isset($arFields['RRULE']['COUNT']))
		{
			$arFields['RRULE']['COUNT'] = (int)$arFields['RRULE']['COUNT'];
		}

		if (isset($arFields['RRULE']['BYDAY']))
		{
			if (is_array($arFields['RRULE']['BYDAY']))
			{
				$BYDAY = $arFields['RRULE']['BYDAY'];
			}
			else
			{
				$BYDAY = [];
				$days = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
				$bydays = explode(',', $arFields['RRULE']['BYDAY']);
				foreach ($bydays as $day)
				{
					$day = mb_strtoupper($day);
					if (in_array($day, $days, true))
					{
						$BYDAY[] = $day;
					}
				}
			}
			$arFields['RRULE']['BYDAY'] = implode(',', $BYDAY);
		}

		if (isset($arFields["EXDATE"]))
		{
			$excludeDates = self::GetExDate($arFields["EXDATE"]);
		}
		else
		{
			$excludeDates = self::GetExDate($currentExDate);
		}

		if (!empty($excludeDates) && $untilTs)
		{
			$arFields["EXDATE"] = self::SetExDate($excludeDates, $untilTs);
		}

		$arFields['RRULE'] = self::PackRRule($arFields['RRULE']);
	}
	else
	{
		$arFields['RRULE'] = '';
		$arFields['EXDATE'] = '';
	}
}