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;
}