• Модуль: meeting
  • Путь к файлу: ~/bitrix/modules/meeting/classes/general/meeting.php
  • Класс: CAllMeeting
  • Вызов: CAllMeeting::AddEvent
static function AddEvent($MEETING_ID, $arFields, $arParams = [])
{
	global $USER;

	$EventID = false;

	if (self::IsNewCalendar())
	{
		$arEventFields = array(
			'ID' => $arFields['EVENT_ID'],
			'CAL_TYPE' => 'user',
			'OWNER_ID' => $arFields['OWNER_ID'],
			'DT_FROM' => $arFields['DATE_START'],
			'DT_TO' => ConvertTimeStamp(MakeTimeStamp($arFields['DATE_START']) + $arFields['DURATION'], 'FULL'),
			'NAME' => $arFields['TITLE'],
			'DESCRIPTION' => CCalendar::ParseHTMLToBB($arFields['DESCRIPTION']),
			'IS_MEETING' => true,
			'MEETING_HOST' => $arFields['OWNER_ID'],
			'MEETING' => array(
				'HOST_NAME' => CCalendar::GetUserName($arFields['OWNER_ID']),
				'ALLOW_INVITE' => null,
				'HIDE_GUESTS' => null,
				'MEETING_CREATOR' => null,
			),
			'ATTENDEES' => array_keys($arFields['USERS']),
			'SKIP_TIME' => null,
			'TZ_FROM' => null,
			'DT_SKIP_TIME' => 'N',
		);

		if(($arFields['CURRENT_STATE'] ?? null) == CMeeting::STATE_CLOSED)
		{
			$arEventFields['DT_TO'] = MakeTimeStamp($arFields['DATE_FINISH']) > MakeTimeStamp($arFields['DATE_START']) ? $arFields['DATE_FINISH'] : $arEventFields['DT_TO'];
		}

		$matches = [];
		if(preg_match('/^mr_([d]+)_([d]+)$/', $arFields["PLACE"], $matches))
		{
			$location = 'ECMR_'.$matches[2];
			if($arFields['EVENT_ID'] > 0)
			{
				$arCurrentEvent = CCalendarEvent::GetById($arFields['EVENT_ID']);
				if($arCurrentEvent['LOCATION'])
				{
					$res = CCalendar::ParseLocation($arCurrentEvent['LOCATION']);
					if($res['mrevid'])
					{
						$location .= '_'.$res['mrevid'];
					}
				}
			}
			$arEventFields['LOCATION'] = array('NEW' => $location);
		}
		else
		{
			$arEventFields['LOCATION'] = array('NEW' => $arFields['PLACE']);
		}

		if (isset($arFields['REINVITE']))
			$arEventFields['MEETING']['REINVITE'] = $arFields['REINVITE'];
		else
			$arEventFields['MEETING']['REINVITE'] = false;

		if (isset($arFields['NOTIFY']))
			$arEventFields['MEETING']['NOTIFY'] = $arFields['NOTIFY'];

		$EventID = CCalendar::SaveEvent(array(
			'arFields' => $arEventFields,
			'userId' => $arFields['OWNER_ID'],
			'autoDetectSection' => true,
			'autoCreateSection' => true
		));
	}
	elseif (!$arFields['EVENT_ID'])
	{

		$iblockId = $arParams['CALENDAR_IBLOCK_ID'] ? $arParams['CALENDAR_IBLOCK_ID'] : COption::GetOptionInt('intranet', 'iblock_calendar', 0, SITE_ID);

		$obCalendar = new CEventCalendar();
		$obCalendar->Init(array(
			'ownerType' => 'USER',
			'ownerId' => $USER->GetID(),
			'bOwner' => true,
			'iblockId' => $iblockId,
			'userIblockId' => $iblockId,
			'bCache' => false,
			'pathToUserCalendar' => '/company/personal/user/#user_id#/calendar/' // temporary hack until new calendars'll be ready
		));

		$guestCalendarId = false;
		$guestSection = $obCalendar->GetSectionIDByOwnerId($USER->GetID(), 'USER', $iblockId);
		$arGuestCalendars = [];

		if(!$guestSection) // Guest does not have any calendars
		{
			$guestSection = $obCalendar->CreateSectionForOwner($USER->GetID(), "USER", $iblockId);
		}

		$arGuestCalendars = $obCalendar->GetCalendars(array(
			'sectionId' => $guestSection,
			'iblockId' => $iblockId,
			'ownerType' => 'USER',
			'ownerId' => $USER->GetID(),
			'bOwner' => 1,
			'forExport' => true,
			'bOnlyID' => true
		));

		if(count($arGuestCalendars) > 0)
		{
			$arUserSet = $obCalendar->GetUserSettings(array('static' => false, 'userId' => $USER->GetID()));
			if ($arUserSet && isset($arUserSet['MeetCalId']) && in_array($arUserSet['MeetCalId'], $arGuestCalendars))
			{
				$guestCalendarId = (int)$arUserSet['MeetCalId'];
			}
			else
			{
				$guestCalendarId = $arGuestCalendars[0];
			}
		}

		//$bGroup = $arParams['GROUP_ID'] > 0;

		$arPermissions = $obCalendar->GetPermissions(
			array(
				'setProperties' => true
			)
		);

		$arEventFields = array(
			'iblockId' => $obCalendar->iblockId,
			'ownerType' => $obCalendar->ownerType,
			'ownerId' => $obCalendar->ownerId,
			'RMiblockId' => self::__getRMIblockID(),
			'allowResMeeting' => true,
			'bNew' => true,
			'fullUrl' => $obCalendar->fullUrl,
			'userId' => $obCalendar->userId,
			'pathToUserCalendar' => $obCalendar->pathToUserCalendar,
			'pathToGroupCalendar' => $obCalendar->pathToGroupCalendar,
			'userIblockId' => $obCalendar->iblockId,
			'calendarId' => $guestCalendarId,
			'sectionId' => $guestSection,
			'dateFrom' => $arFields['DATE_START'],
			'dateTo' => $arFields['DATE_FINISH'] ? $arFields['DATE_FINISH'] : ConvertTimeStamp(MakeTimeStamp($arFields['DATE_START']) + $arFields['DURATION'], 'FULL'),
			'name' => $arFields['TITLE'],
			'desc' => $arFields['DESCRIPTION'],
			'prop' => [],
			'isMeeting' => true,
			'guests' => array_keys($arFields['USERS']),
			'notDisplayCalendar' => true,
		);

		if ($EventID = $obCalendar->SaveEvent($arEventFields))
		{
			$obCalendar->ClearCache('/event_calendar/events/'.$arEventFields['iblockId'].'/');
			$obCalendar->ClearCache('/event_calendar/events/'.$arEventFields['userIblockId'].'/');
		}
	}

	if ($EventID)
	{
		self::Update($MEETING_ID, array('EVENT_ID' => $EventID));
	}

	return $EventID;
}