• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/groupdavclientcalendar.php
  • Класс: CDavGroupdavClientCalendar
  • Вызов: CDavGroupdavClientCalendar::ConvertICalToArray
private function ConvertICalToArray(CDavICalendarComponent $event, CDavICalendar $calendar)
{
	static $arWeekDayMap = array("SU" => 6, "MO" => 0, "TU" => 1, "WE" => 2, "TH" => 3, "FR" => 4, "SA" => 5);

	$arFields = array(
		"NAME" => $event->GetPropertyValue("SUMMARY"),
		"VERSION" => $event->GetPropertyValue("SEQUENCE"),
		"PROPERTY_LOCATION" => $event->GetPropertyValue("LOCATION"),
		"DETAIL_TEXT" => $event->GetPropertyValue("DESCRIPTION"),
		"DETAIL_TEXT_TYPE" => 'text',
		"DATE_FROM" => CDavICalendarTimeZone::GetFormattedServerDateTime(
			$event->GetPropertyValue("DTSTART"),
			false,
			$calendar
		),
		"TZ_FROM" => $event->GetPropertyParameter("DTSTART", "TZID"),
		"DATE_TO" => CDavICalendarTimeZone::GetFormattedServerDateTime(
			$event->GetPropertyValue("DTEND"),
			false,
			$calendar
		),
		"TZ_TO" => $event->GetPropertyParameter("DTEND", "TZID"),
		"SKIP_TIME" => $event->GetPropertyParameter("DTSTART", "VALUE") === "DATE"
			&& $event->GetPropertyParameter("DTEND", "VALUE") === "DATE",
		"XML_ID" => $event->GetPropertyValue("UID"),
		"DATE_CREATE" => CDavICalendarTimeZone::GetFormattedServerDateTime($event->GetPropertyValue("CREATED")),
		"PROPERTY_CATEGORY" => $event->GetPropertyValue("CATEGORIES"),
		"ORGANIZER" => $event->GetPropertyValue("ORGANIZER"),
		"ORGANIZER_ENTITY" => $event->GetProperties("ORGANIZER"),
		"ATTACH" => $event->GetProperties("ATTACH"),
		"ATTENDEE" => $event->GetProperties("ATTENDEE"),
		"URL" => $event->GetPropertyValue("URL"),
	);

	if ($priority = $event->GetPropertyValue("PRIORITY"))
	{
		if ($priority <= 3)
		{
			$arFields["PROPERTY_IMPORTANCE"] = "high";
		}

		elseif ($priority <= 6)
		{
			$arFields["PROPERTY_IMPORTANCE"] = "normal";
		}
		else
		{
			$arFields["PROPERTY_IMPORTANCE"] = "low";
		}

	}
	else
	{
		$arFields["PROPERTY_IMPORTANCE"] = "normal";
	}

	if (($transp = $event->GetPropertyValue("TRANSP")) && $transp === 'TRANSPARENT')
	{
		$arFields["PROPERTY_ACCESSIBILITY"] = "free";
	}
	else
	{
		$arFields["PROPERTY_ACCESSIBILITY"] = "busy";
	}

	$arVAlarm = $event->GetComponents("VALARM");
	if (count($arVAlarm) > 0 && $event->GetPropertyValue("X-MOZ-LASTACK") == null)
	{
		foreach ($arVAlarm as $alarm)
		{
			$trigger = $alarm->GetPropertyValue("TRIGGER");
			$arPeriodMapTmp = array("M" => "min", "H" => "hour", "D" => "day", "S" => "min");
			if (
				preg_match('/^-PT(d+)([HMD])$/i', $trigger, $arMatches)
				|| preg_match('/^PT(0+)(S)$/i', $trigger, $arMatches)
				|| preg_match('/^-P(d+)(D)$/i', $trigger, $arMatches)
			)
			{
				$arFields["PROPERTY_REMIND_SETTINGS"][] = $arMatches[1]."_".$arPeriodMapTmp[$arMatches[2]];
			}
			else if (preg_match('/^(d+)T(d+)Z$/i', $trigger, $arMatches))
			{
				$arFields["PROPERTY_REMIND_SETTINGS"][] = $arMatches[0] . '_' . 'date';
			}
			else if (preg_match('/^PT(d+)(H)$/i', $trigger, $arMatches))
			{
				$arFields["PROPERTY_REMIND_SETTINGS"][] = $arMatches[1]
					. '_'. $arPeriodMapTmp[$arMatches[2]] . '_' .'daybefore';
			}
			else if (preg_match('/^-P(d+)(D)T(d+)(H)$/i', $trigger, $arMatches))
			{
				$arFields["PROPERTY_REMIND_SETTINGS"][] = $arMatches[1] . '_' . $arPeriodMapTmp[$arMatches[2]]
					. '_' . $arMatches[3] . '_' . $arPeriodMapTmp[$arMatches[4]];
			}
		}
	}

	if ($rrule = $event->GetPropertyValueParsed("RRULE"))
	{
		// RRULE:FREQ=WEEKLY;COUNT=5;INTERVAL=2;BYDAY=TU,SA
		$arFields["PROPERTY_PERIOD_TYPE"] = $rrule["FREQ"];
		$arFields["PROPERTY_PERIOD_COUNT"] = $rrule["INTERVAL"] ?? 1;

		if ($arFields["PROPERTY_PERIOD_TYPE"] === "WEEKLY")
		{
			if (isset($rrule["BYDAY"]))
			{
				$byDays = explode(",", $rrule["BYDAY"]);
				$byDayResult = [];
				foreach ($byDays as $day)
				{
					$byDayResult[] = $arWeekDayMap[mb_strtoupper($day)];
				}
				$arFields["PROPERTY_PERIOD_ADDITIONAL"] = implode(",", $byDayResult);
			}
			else
			{
				$arFields["PROPERTY_PERIOD_ADDITIONAL"] = date("w", MakeTimeStamp($arFields["DATE_FROM"])) - 1;
				if ($arFields["PROPERTY_PERIOD_ADDITIONAL"] < 0)
				{
					$arFields["PROPERTY_PERIOD_ADDITIONAL"] = 6;
				}
			}
		}

		if (isset($rrule["COUNT"]))
		{
			$arFields["PROPERTY_RRULE_COUNT"] = $rrule["COUNT"];
		}
		elseif (isset($rrule["UNTIL"]))
		{
			$arFields["PROPERTY_PERIOD_UNTIL"] = CDavICalendarTimeZone::GetFormattedServerDateTime(
				$rrule["UNTIL"],
				$event->GetPropertyParameter("DTSTART", "TZID"),
				$calendar,
			);
		}
		else
		{
			$arFields["PROPERTY_PERIOD_UNTIL"] = date($GLOBALS["DB"]->DateFormatToPHP(FORMAT_DATETIME), mktime(0, 0, 0, 1, 1, 2038));
		}
	}

	if ($recurrenceId = $event->GetPropertyValue("RECURRENCE-ID"))
	{
		$arFields["RECURRENCE_ID_DATE"] = CDavICalendarTimeZone::GetFormattedServerDateTime(
			$recurrenceId,
			false,
			$calendar
		);
	}


	$exDatesVal = $event->GetProperties("EXDATE");
	if (count($exDatesVal) > 0)
	{
		$arFields["EXDATE"] = [];
		foreach ($exDatesVal as $val)
		{
			$date = CDavICalendarTimeZone::GetFormattedServerDate($val->Value());
			if ($shift = $this->getExDateShift(
				$arFields['DATE_FROM'],
				$arFields['TZ_FROM'],
				$val->Parameter('TZID')
			))
			{
				$arFields["EXDATE"][] = $this->shiftDate($date, $shift);
			}
			else
			{
				$arFields["EXDATE"][] = $date;
			}
		}
	}

	return $arFields;
}