• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/exchangecalendar2.php
  • Класс: CDavExchangeCalendar
  • Вызов: CDavExchangeCalendar::ConvertCalendarToArray
private function ConvertCalendarToArray($calendarItem): array
	{
		$arResultItem = [];

		$arItemId = $calendarItem->GetPath("/CalendarItem/ItemId");
		if (!empty($arItemId))
		{
			$arResultItem["XML_ID"] = $arItemId[0]->GetAttribute("Id");
			$arResultItem["MODIFICATION_LABEL"] = $arItemId[0]->GetAttribute("ChangeKey");
		}

		$arSubject = $calendarItem->GetPath("/CalendarItem/Subject");
		if (!empty($arSubject))
		{
			$arResultItem["NAME"] = $this->Encode($arSubject[0]->GetContent());
		}

		$arBody = $calendarItem->GetPath("/CalendarItem/Body");
		if (!empty($arBody))
		{
			$arResultItem["DESCRIPTION"] = $this->Encode($arBody[0]->GetContent());
			$arResultItem["DETAIL_TEXT_TYPE"] = mb_strtolower($arBody[0]->GetAttribute("BodyType"));
			if (mb_strtolower($arResultItem["DETAIL_TEXT_TYPE"]) === "html")
			{
				$arResultItem["DESCRIPTION"] = preg_replace(
					"/[s|S]*?]*?>([s|S]*?)[s|S]*/is".BX_UTF_PCRE_MODIFIER,
					"\1",
					$arResultItem["DESCRIPTION"]
				);
			}
		}

		$arImportance = $calendarItem->GetPath("/CalendarItem/Importance");
		if (!empty($arImportance))
		{
			$arResultItem["PROPERTY_IMPORTANCE"] = $arImportance[0]->GetContent();
		}

		$arSensitivity = $calendarItem->GetPath("/CalendarItem/Sensitivity");
		if (!empty($arSensitivity))
		{
			$arResultItem["PROPERTY_SENSITIVITY"] = $arSensitivity[0]->GetContent();
		}

		$arLegacyFreeBusyStatus = $calendarItem->GetPath("/CalendarItem/LegacyFreeBusyStatus");
		if (!empty($arLegacyFreeBusyStatus))
		{
			$arResultItem["PROPERTY_FREEBUSY"] = $arLegacyFreeBusyStatus[0]->GetContent();
		}

		$arDateTimeCreated = $calendarItem->GetPath("/CalendarItem/DateTimeCreated");
		if (!empty($arDateTimeCreated))
		{
			$arResultItem["DATE_CREATE"] = CDavICalendarTimeZone::GetFormattedServerDateTime($arDateTimeCreated[0]->GetContent());
		}

		$arResultItem["SKIP_TIME"] = false;
		$arIsAllDayEvent = $calendarItem->GetPath("/CalendarItem/IsAllDayEvent");
		if (!empty($arIsAllDayEvent))
		{
			$arResultItem["SKIP_TIME"] = $arIsAllDayEvent[0]->GetContent() === 'true';
		}

		$arTimezone = $calendarItem->GetPath("/CalendarItem/TimeZone");
		if (!empty($arTimezone) && !$arResultItem["SKIP_TIME"])
		{
			$parts = explode(" ", $this->Encode($arTimezone[0]->GetContent()), 2);
			$timezone = null;
			if (isset($parts[1]))
			{
				$timezones = explode(", ", $parts[1]);
				if (!empty($timezones))
				{
					$timezone = $this->PrepareTimezone($timezones[0]);
				}
			}

			$arResultItem['TIMEZONE'] = $timezone !== null
				? $timezone->getName()
				: Util::getServerTimezoneName()
			;
		}

		$arStart = $calendarItem->GetPath("/CalendarItem/Start");
		if (!empty($arStart))
		{
			$dateFrom = $this->GetDateTimeFromExchangeTime($arStart[0]->GetContent());
			if (!$arResultItem["SKIP_TIME"])
			{
				if (is_string($arResultItem['TIMEZONE']))
				{
					$dateFrom->setTimeZone(new DateTimeZone($arResultItem['TIMEZONE']));
				}
				$arResultItem["ACTIVE_FROM"] = $dateFrom->format(Date::convertFormatToPhp(FORMAT_DATETIME));
			}
			else
			{
				$arResultItem["ACTIVE_FROM"] = $dateFrom->add('+12 hours')->format(Date::convertFormatToPhp(FORMAT_DATETIME));
			}
			$arResultItem["DT_FROM_TS"] = MakeTimeStamp(CDavICalendarTimeZone::GetFormattedServerDateTime($arStart[0]->GetContent()));
		}

		$arEnd = $calendarItem->GetPath("/CalendarItem/End");
		if (!empty($arEnd))
		{
			$dateTo = $this->GetDateTimeFromExchangeTime($arEnd[0]->GetContent());
			if (!$arResultItem["SKIP_TIME"])
			{
				if (is_string($arResultItem['TIMEZONE']))
				{
					$dateTo->setTimeZone(new DateTimeZone($arResultItem['TIMEZONE']));
				}
				$arResultItem["ACTIVE_TO"] = $dateTo->format(Date::convertFormatToPhp(FORMAT_DATETIME));
			}
			else
			{
				$arResultItem["ACTIVE_TO"] = $dateTo->add('+12 hours')->format(Date::convertFormatToPhp(FORMAT_DATETIME));
			}
			$arResultItem["DT_TO_TS"] = MakeTimeStamp(CDavICalendarTimeZone::GetFormattedServerDateTime($arEnd[0]->GetContent()));
		}

		$arLocation = $calendarItem->GetPath("/CalendarItem/Location");
		if (!empty($arLocation))
		{
			$arResultItem["PROPERTY_LOCATION"] = $this->Encode($arLocation[0]->GetContent());
		}

		$arReminderIsSet = $calendarItem->GetPath("/CalendarItem/ReminderIsSet");
		if (!empty($arReminderIsSet) && ($arReminderIsSet[0]->GetContent() === "true"))
		{
			$arReminderMinutesBeforeStart = $calendarItem->GetPath("/CalendarItem/ReminderMinutesBeforeStart");
			if (!empty($arReminderMinutesBeforeStart))
			{
				$arResultItem["PROPERTY_REMIND_SETTINGS"] = $arReminderMinutesBeforeStart[0]->GetContent()."_min";
				$arResultItem["REMINDER_MINUTES_BEFORE_START"] = $arReminderMinutesBeforeStart[0]->GetContent();
			}
		}

		$arIsRecurring = $calendarItem->GetPath("/CalendarItem/IsRecurring");
		if (!empty($arIsRecurring))
		{
			$arResultItem["IS_RECURRING"] = ($arIsRecurring[0]->GetContent() === "true");
		}

		$arCalendarItemType = $calendarItem->GetPath("/CalendarItem/CalendarItemType");
		if (!empty($arCalendarItemType))
		{
			$arResultItem["CALENDAR_ITEM_TYPE"] = $arCalendarItemType[0]->GetContent();
			$arResultItem["IS_RECURRING"] = ($arResultItem["CALENDAR_ITEM_TYPE"] !== "Single");
		}

		$arRecurrence = $calendarItem->GetPath("/CalendarItem/Recurrence");

		if (!empty($arRecurrence))
		{
			$arResultItem = array_merge($arResultItem, $this->ConvertRecurrenceToArray($arRecurrence[0]));
		}

		$arIsMeeting = $calendarItem->GetPath("/CalendarItem/IsMeeting");
		if (!empty($arIsMeeting))
		{
			$arResultItem["IS_MEETING"] = ($arIsMeeting[0]->GetContent() === "true");
		}

		$arResultItem["ATTENDEES_EMAIL_LIST"] = [];
		$arResultItem["ATTENDEES_RESPONSE"] = [];
		if (isset($arResultItem["IS_MEETING"]) && $arResultItem["IS_MEETING"])
		{
			$arRequiredAttendees = $calendarItem->GetPath("/CalendarItem/RequiredAttendees");

			if (!empty($arRequiredAttendees))
			{
				$arRequiredAttendees = $arRequiredAttendees[0]->GetContent();
				foreach ($arRequiredAttendees as $requiredAttendee)
				{
					$email = $requiredAttendee->GetPath("/Attendee/Mailbox/EmailAddress");
					if (!empty($email))
					{
						$email = $email[0]->GetContent();
						$response = $requiredAttendee->GetPath("/Attendee/ResponseType");
						$response = !empty($response) ? $response[0]->GetContent() : 'Unknown';

						$arResultItem["ATTENDEES_EMAIL_LIST"][] = $email;
						$arResultItem["ATTENDEES_RESPONSE"][$email] = $response;
					}
				}
			}

			// IsResponseRequested
			// MyResponseType > NoResponseReceived|Organizer
			$organizerEmail = $calendarItem->GetPath("/CalendarItem/Organizer/Mailbox/EmailAddress");
			if ($organizerEmail && $organizerEmail[0])
			{
				$arResultItem["ORGANIZER_EMAIL"] = $organizerEmail[0]->GetContent();
				if (
					!empty($organizerEmail)
					&& !in_array($arResultItem["ORGANIZER_EMAIL"], $arResultItem["ATTENDEES_EMAIL_LIST"], true)
				)
				{
					$arResultItem["ATTENDEES_EMAIL_LIST"] = array_merge([$arResultItem["ORGANIZER_EMAIL"]], $arResultItem["ATTENDEES_EMAIL_LIST"]);
				}
			}

			$arResultItem["IS_MEETING"] = !empty($arResultItem["ATTENDEES_EMAIL_LIST"]);
		}

		return $arResultItem;
	}