• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/exchangecalendar2.php
  • Класс: CDavExchangeCalendar
  • Вызов: CDavExchangeCalendar::FormatFieldsArray
private function FormatFieldsArray($arFields)
	{
		if (array_key_exists("REMIND", $arFields) && isset($arFields["REMIND"][0]))
		{
			$type = $arFields["REMIND"][0]["type"];
			$val = (int)$arFields["REMIND"][0]["count"];

			if ($type === "hour")
			{
				$val *= 60;
			}
			elseif ($type === "day")
			{
				$val *= 60 * 24;
			}

			if ($val > 0)
			{
				$arFields["REMINDER_MINUTES_BEFORE_START"] = $val;
			}
		}

		$arFields["PROPERTY_SENSITIVITY"] = "Normal";
		if ($arFields["PRIVATE_EVENT"])
		{
			$arFields["PROPERTY_SENSITIVITY"] = "Private";
		}

		if (isset($arFields['ACCESSIBILITY']))
		{
			$arFields['ACCESSIBILITY'] = mb_strtolower($arFields['ACCESSIBILITY']);
			if ($arFields['ACCESSIBILITY'] === "absent")
			{
				$arFields["PROPERTY_FREEBUSY"] = "OOF";
			}
			else if ($arFields['ACCESSIBILITY'] === "free")
			{
				$arFields["PROPERTY_FREEBUSY"] = "Free";
			}
			else if ($arFields['ACCESSIBILITY'] === "quest")
			{
				$arFields["PROPERTY_FREEBUSY"] = "Tentative";
			}
			else
			{
				$arFields["PROPERTY_FREEBUSY"] = "Busy";
			}
		}

		if (isset($arFields['RRULE']))
		{
			$rrule = $arFields["RRULE"];
			if (is_array($rrule) && in_array($rrule["FREQ"], array("DAILY", "WEEKLY", "MONTHLY", "YEARLY")))
			{
				$arFields["RECURRING_TYPE"] = $rrule["FREQ"];
				$arFields["RECURRING_INTERVAL"] = $rrule["INTERVAL"];

				if ($rrule["FREQ"] === "WEEKLY")
				{
					$bydays = explode(',', $rrule["BYDAY"]);
					if (empty($bydays))
					{
						$bydays = ["MO"];
					}

					$weekMap = [
						'SU' => "Sunday",
						'MO' => "Monday",
						'TU' => "Tuesday",
						'WE' => "Wednesday",
						'TH' => "Thursday",
						'FR' => "Friday",
						'SA' => "Saturday"
					];
					$ar1 = [];
					foreach ($bydays as $v)
					{
						$ar1[] = $weekMap[trim($v)];
					}
					$arFields["RECURRING_DAYSOFWEEK"] = implode(" ", $ar1);
				}

				$arFields["RECURRING_STARTDATE"] = ConvertTimeStamp($arFields["DATE_FROM_TS_UTC"], "SHORT");
				if (isset($rrule["COUNT"]))
				{
					$arFields["RECURRING_NUMBEROFOCCURRENCES"] = $rrule["COUNT"];
				}
				else
				{
					$arFields["RECURRING_ENDDATE"] = ConvertTimeStamp($arFields["DATE_TO_TS_UTC"], "SHORT");
				}
			}
			else
			{
				$arFields["RECURRING_TYPE"] = null;
			}
		}
		else if (array_key_exists("PROPERTY_PERIOD_TYPE", $arFields)) // Deprecated
		{
			if (in_array($arFields["PROPERTY_PERIOD_TYPE"], ["DAILY", "WEEKLY", "MONTHLY", "YEARLY"], true))
			{
				$ar = ["DAILY" => "DAILY", "WEEKLY" => "WEEKLY", "MONTHLY" => "MONTHLY_ABSOLUTE", "YEARLY" => "YEARLY_ABSOLUTE"];
				$arFields["RECURRING_TYPE"] = $ar[$arFields["PROPERTY_PERIOD_TYPE"]];

				if (isset($arFields["PROPERTY_PERIOD_COUNT"]) && $arFields["PROPERTY_PERIOD_COUNT"] !== '')
				{
					$arFields["RECURRING_INTERVAL"] = $arFields["PROPERTY_PERIOD_COUNT"];
				}

				if ($arFields["PROPERTY_PERIOD_TYPE"] === "WEEKLY" && $arFields["PROPERTY_PERIOD_ADDITIONAL"] !== '')
				{
					static $arWeekDayMap = [
						6 => "Sunday",
						0 => "Monday",
						1 => "Tuesday",
						2 => "Wednesday",
						3 => "Thursday",
						4 => "Friday",
						5 => "Saturday"
					];

					$ar = explode(",", $arFields["PROPERTY_PERIOD_ADDITIONAL"]);
					$ar1 = [];
					foreach ($ar as $v)
					{
						$ar1[] = $arWeekDayMap[trim($v)];
					}

					$arFields["RECURRING_DAYSOFWEEK"] = implode(" ", $ar1);
				}

				$arFields["RECURRING_STARTDATE"] = ConvertTimeStamp(MakeTimeStamp($arFields["ACTIVE_FROM"]), "SHORT");
				$arFields["RECURRING_ENDDATE"] = ConvertTimeStamp(MakeTimeStamp($arFields["ACTIVE_TO"]), "SHORT");
			}
			else
			{
				$arFields["RECURRING_TYPE"] = null;
			}
		}

		$arFieldsNew = [];

		$arMap = [
			"XML_ID" => "Id",
			"NAME" => "Subject",
			"DESCRIPTION" => "Body",
			"DETAIL_TEXT_TYPE" => "BodyType",
			"PROPERTY_IMPORTANCE" => "Importance",
			"PROPERTY_SENSITIVITY" => "Sensitivity",
			"PROPERTY_FREEBUSY" => "LegacyFreeBusyStatus",
			//"DATE_CREATE" => "DateTimeCreated",
			"DATE_FROM" => "Start",
			"DATE_TO" => "End",
			"PROPERTY_LOCATION" => "Location",
			"REMINDER_MINUTES_BEFORE_START" => "ReminderMinutesBeforeStart",
			"RECURRING_TYPE" => "RecurringType",
			"RECURRING_INTERVAL" => "RecurringInterval",
			"RECURRING_DAYOFMONTH" => "RecurringDayOfMonth",
			"RECURRING_DAYSOFWEEK" => "RecurringDaysOfWeek",
			"RECURRING_DAYOFWEEKINDEX" => "RecurringDayOfWeekIndex",
			"RECURRING_MONTH" => "RecurringMonth",
			"RECURRING_STARTDATE" => "RecurringStartDate",
			"RECURRING_NUMBEROFOCCURRENCES" => "RecurringNumberOfOccurrences",
			"RECURRING_ENDDATE" => "RecurringEndDate",
		];

		$arFieldsNew["IsAllDayEvent"] = $arFields['DT_SKIP_TIME'] === 'Y';
		$arFields['DETAIL_TEXT_TYPE'] = 'HTML';

		foreach ($arFields as $key => $value)
		{
			if (!array_key_exists($key, $arMap))
			{
				continue;
			}

			$newKey = $arMap[$key];
			if (in_array($newKey, ["Start", "End"], true))
			{
				$isFullDay = $arFields['DT_SKIP_TIME'] === 'Y';
				if ($isFullDay && !isset($hours))
				{
					$hours = '0';
					$minutes = '0';
					$diff = (new DateTime())->format('P');
					$parts = explode(":", $diff);
					if (count($parts) === 2)
					{
						$hours = (int)$parts[0];
						$minutes = (int)$diff[0] . $parts[1];
					}
				}

				if ($isFullDay && $newKey === "End")
				{
					$dateTimeObject = Util::getDateObject($value, false);
					if (isset($hours, $minutes))
					{
						$dateTimeObject->add("{$hours} hours {$minutes} minutes");
					}
					$arFieldsNew[$newKey] = $dateTimeObject->format(self::MS_DATETIME_FORMAT);
				}
				elseif ($isFullDay && $newKey === "Start")
				{
					$dateTimeObject = Util::getDateObject($value, false);
					if (isset($hours, $minutes))
					{
						$dateTimeObject->add("{$hours} hours {$minutes} minutes");
					}
					$arFieldsNew[$newKey] = $dateTimeObject->format(self::MS_DATETIME_FORMAT);
				}
				else
				{
					$dateTimeObject = Util::getDateObject($value, false, $arFields['TZ_FROM']);
					if ($dateTimeObject instanceof DateTime)
					{
						$arFieldsNew[$newKey] = $dateTimeObject->setTimezone(Util::prepareTimezone())->format(self::MS_DATETIME_FORMAT);
					}
				}
			}
			elseif (
				$this->FormatStandartFieldsArray($newKey, $value, $arFieldsNew)
				|| $this->FormatRecurrenceFieldsArray($newKey, $value, $arFieldsNew)
			)
			{
				continue;
			}
			else
			{
				$arFieldsNew[$newKey] = $this->Decode($value);
			}
		}

		if (isset($arFieldsNew["ReminderMinutesBeforeStart"]) && (int)$arFieldsNew["ReminderMinutesBeforeStart"])
		{
			$arFieldsNew["ReminderMinutesBeforeStart"] = (int)$arFieldsNew["ReminderMinutesBeforeStart"];
			$arFieldsNew["ReminderIsSet"] = true;
		}

		if (array_key_exists("REQUIRED_ATTENDEES", $arFields))
		{
			$val = $arFields["REQUIRED_ATTENDEES"];
			if (!is_array($val))
			{
				$val = [$val];
			}

			$arFieldsNew["RequiredAttendees"] = $val;
		}

		return $arFieldsNew;
	}