• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_livefeed.php
  • Класс: CCalendarLiveFeed
  • Вызов: CCalendarLiveFeed::EditCalendarEventEntry
static function EditCalendarEventEntry($entryFields = [], $userFieldData = [], $accessCodes = [], $params = []): void
{
	if (!$entryFields['SKIP_TIME'])
	{
		$entryFields['DATE_FROM'] .= ' '.$entryFields['TIME_FROM'];
		$entryFields['DATE_TO'] .= ' '.$entryFields['TIME_TO'];
	}

	// Timezone
	if (!$entryFields['TZ_FROM'] && isset($entryFields['DEFAULT_TZ']))
	{
		$entryFields['TZ_FROM'] = $entryFields['DEFAULT_TZ'];
	}
	if (!$entryFields['TZ_TO'] && isset($entryFields['DEFAULT_TZ']))
	{
		$entryFields['TZ_TO'] = $entryFields['DEFAULT_TZ'];
	}

	if (isset($entryFields['DEFAULT_TZ']) && (string)$entryFields['DEFAULT_TZ'] !== '')
	{
		CCalendar::SaveUserTimezoneName($params["userId"], $entryFields['DEFAULT_TZ']);
	}

	if ($entryFields['SECTION'])
	{
		$entryFields['SECTIONS'] = array($entryFields['SECTION']);
	}

	$entryFields["OWNER_ID"] = $params["userId"];
	$entryFields["CAL_TYPE"] = $params["type"];

	// Add author for new event
	if (!$entryFields["ID"])
	{
		$accessCodes[] = 'U'.$params["userId"];
	}

	$accessCodes = array_unique($accessCodes);
	$attendeeList = CCalendar::GetDestinationUsers($accessCodes);

	if (trim($entryFields["NAME"]) === '')
	{
		$entryFields["NAME"] = GetMessage('EC_DEFAULT_EVENT_NAME_V2');
	}

	$entryFields['IS_MEETING'] = (!empty($attendeeList) && $attendeeList != array($params["userId"]));

	if (
		isset($entryFields['RRULE'])
		&& !empty($entryFields['RRULE'])
		&& is_array($entryFields['RRULE']['BYDAY'])
	)
	{
		$entryFields['RRULE']['BYDAY'] = implode(',', $entryFields['RRULE']['BYDAY']);
	}

	if ($entryFields['IS_MEETING'])
	{
		$entryFields['ATTENDEES_CODES'] = $accessCodes;
		$entryFields['ATTENDEES'] = $attendeeList;
		$entryFields['MEETING_HOST'] = $params["userId"];
		$entryFields['MEETING'] = array(
			'HOST_NAME' => CCalendar::GetUserName($params["userId"]),
			'TEXT' => '',
			'OPEN' => false,
			'NOTIFY' => true,
			'REINVITE' => false
		);
	}
	else
	{
		$entryFields['ATTENDEES'] = false;
	}

	$eventId = CCalendar::SaveEvent(
		array(
			'arFields' => $entryFields,
			'autoDetectSection' => true
		)
	);

	if ($eventId > 0)
	{
		if (count($userFieldData) > 0)
		{
			CCalendarEvent::UpdateUserFields($eventId, $userFieldData);
		}

		foreach ($accessCodes as $key => $value)
		{
			if ($value === "UA")
			{
				unset($accessCodes[$key]);
				$accessCodes[] = "G2";
				break;
			}
		}

		if ($entryFields['IS_MEETING'] && !empty($userFieldData['UF_WEBDAV_CAL_EVENT']))
		{
			$UF = $GLOBALS['USER_FIELD_MANAGER']->GetUserFields("CALENDAR_EVENT", $eventId, LANGUAGE_ID);
			CCalendar::UpdateUFRights($userFieldData['UF_WEBDAV_CAL_EVENT'], $accessCodes, $UF['UF_WEBDAV_CAL_EVENT']);
		}

		$socnetLogFields = Array(
			"ENTITY_TYPE" => SONET_SUBSCRIBE_ENTITY_USER,
			"ENTITY_ID" => $params["userId"],
			"USER_ID" => $params["userId"],
			"=LOG_DATE" => CDatabase::CurrentTimeFunction(),
			"TITLE_TEMPLATE" => "#TITLE#",
			"TITLE" => $entryFields["NAME"],
			"MESSAGE" => '',
			"TEXT_MESSAGE" => ''
		);

		$dbRes = CSocNetLog::GetList(
			array("ID" => "DESC"),
			array(
				"EVENT_ID" => "calendar",
				"SOURCE_ID" => $eventId
			),
			false,
			false,
			array("ID")
		);

		$codes = [];
		foreach ($accessCodes as $value)
		{
			if (mb_strpos($value, 'SG') === 0)
			{
				$codes[] = $value . '_K';
			}
			$codes[] = $value;
		}
		$codes = array_unique($codes);



		if ($arRes = $dbRes->Fetch())
		{
			CSocNetLog::Update($arRes["ID"], $socnetLogFields);
			CSocNetLogRights::DeleteByLogID($arRes["ID"]);
			CSocNetLogRights::Add($arRes["ID"], $codes);
		}
		else
		{
			$socnetLogFields = array_merge($socnetLogFields, array(
				"EVENT_ID" => "calendar",
				"SITE_ID" => SITE_ID,
				"SOURCE_ID" => $eventId,
				"ENABLE_COMMENTS" => "Y",
				"CALLBACK_FUNC" => false
			));

			$logId = CSocNetLog::Add($socnetLogFields, false);
			CSocNetLogRights::Add($logId, $codes);
		}
	}
}