• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
  • Класс: CCalendarEvent
  • Вызов: CCalendarEvent::SetMeetingStatus
static function SetMeetingStatus($params)
{
	CTimeZone::Disable();
	global $DB, $CACHE_MANAGER;
	$eventId = $params['eventId'] = (int)$params['eventId'];
	$userId = $params['userId'] = (int)$params['userId'];
	$status = mb_strtoupper($params['status']);
	$prevStatus = null;
	if (!in_array($status, ["Q", "Y", "N", "H", "M"], true))
	{
		$status = $params['status'] = "Q";
	}

	$event = self::GetList([
		'arFilter' => [
			"ID" => $eventId,
			"IS_MEETING" => 1,
			"DELETED" => "N"
		],
		'parseRecursion' => false,
		'fetchAttendees' => true,
		'fetchMeetings' => true,
		'checkPermissions' => false,
		'setDefaultLimit' => false
	]);

	if (!empty($event))
	{
		$event = $event[0];
		$prevStatus = $event['MEETING_STATUS'];
	}

	if ($event && $event['IS_MEETING'] && (int)$event['PARENT_ID'] > 0)
	{
		if ($event['EVENT_TYPE'] === Dictionary::EVENT_TYPE['shared_crm'])
		{
			SharingSharingEventManager::onSharingEventMeetingStatusChange(
				(int)$event['PARENT_ID'],
				$userId,
				$status
			);
		}

		if (
			$status === 'N'
			&& in_array($event['EVENT_TYPE'], [Dictionary::EVENT_TYPE['shared'], Dictionary::EVENT_TYPE['shared_crm']], true)
		)
		{
			SharingSharingEventManager::setCanceledTimeOnSharedLink((int)$event['PARENT_ID']);
		}

		if (ICalUtil::isMailUser($event['MEETING_HOST']))
		{
			IncomingEventManager::rehandleRequest([
				'event' => $event,
				'userId' => $userId,
				'answer' => $status === 'Y',
			]);
		}

		$strSql = "UPDATE b_calendar_event SET ".
			$DB->PrepareUpdate("b_calendar_event", ["MEETING_STATUS" => $status]).
			" WHERE PARENT_ID=".(int)$event['PARENT_ID']." AND OWNER_ID=".$userId;
		$DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); if ($status === 'Y') { self::ShowEventSection((int)$event['PARENT_ID'], $userId); } CCalendarSect::UpdateModificationLabel($event['SECT_ID']); // Clear invitation in messenger CCalendarNotify::ClearNotifications($event['PARENT_ID'], $userId); // Add new notification in messenger if (!empty($params['personalNotification']) && CCalendar::getCurUserId() === $userId) { $fromTo = self::GetEventFromToForUser($event, $userId); CCalendarNotify::Send([ 'mode' => $status === "Y" ? 'status_accept' : 'status_decline', 'name' => $event['NAME'], "from" => $fromTo["DATE_FROM"], "guestId" => $userId, "eventId" => $event['PARENT_ID'], "userId" => $userId, "markRead" => true, "fields" => $event ]); } if ( ( $event['EVENT_TYPE'] === Dictionary::EVENT_TYPE['shared'] || $event['EVENT_TYPE'] === Dictionary::EVENT_TYPE['shared_crm'] ) && $status === 'Y' && ($params['sharingAutoAccept'] ?? null) === true ) { $fromTo = self::GetEventFromToForUser($event, $userId); CCalendarNotify::Send([ 'mode' => 'status_accept', 'name' => $event['NAME'], "from" => $fromTo["DATE_FROM"], "guestId" => (int)($event['MEETING_HOST'] ?? null), "eventId" => $event['PARENT_ID'], "userId" => $userId, "fields" => $event, 'isSharing' => true, ]); } $addedPullUserList = []; if (isset($event['ATTENDEE_LIST']) && is_array($event['ATTENDEE_LIST'])) { foreach ($event['ATTENDEE_LIST'] as $attendee) { Util::addPullEvent( 'set_meeting_status', $attendee['id'], [ 'fields' => $event, 'requestUid' => $params['requestUid'] ?? null ] ); $addedPullUserList[] = (int)$attendee['id']; } } $pullUserId = (int)($event['CREATED_BY'] ?? $userId); if ($pullUserId && !in_array($pullUserId, $addedPullUserList, true)) { Util::addPullEvent( 'set_meeting_status', $pullUserId, [ 'fields' => $event, 'requestUid' => $params['requestUid'] ] ); } // Notify author of event if ( $event['MEETING']['NOTIFY'] && (int)$event['MEETING_HOST'] && $userId !== (int)$event['MEETING_HOST'] && ($params['hostNotification'] ?? null) !== false && self::checkAttendeeBelongsToEvent($event['PARENT_ID'], $userId) ) { // Send message to the author $fromTo = self::GetEventFromToForUser($event, $event['MEETING_HOST']); CCalendarNotify::Send([ 'mode' => $status === "Y" ? 'accept' : 'decline', 'name' => $event['NAME'], "from" => $fromTo["DATE_FROM"], "to" => $fromTo["DATE_TO"], "location" => CCalendar::GetTextLocation($event["LOCATION"] ?? null), "guestId" => $userId, "eventId" => $event['PARENT_ID'], "userId" => $event['MEETING']['MEETING_CREATOR'] ?? $event['MEETING_HOST'], "isSharing" => $event['EVENT_TYPE'] === Dictionary::EVENT_TYPE['shared'], "fields" => $event ]); } CCalendarSect::UpdateModificationLabel([$event['SECTIONS'][0] ?? null]); if ($status === "N") { $childEvent = self::GetList([ 'arFilter' => [ "PARENT_ID" => $event['PARENT_ID'], "CREATED_BY" => $userId, "IS_MEETING" => 1, "DELETED" => "N" ], 'parseRecursion' => false, 'fetchAttendees' => true, 'checkPermissions' => false, 'setDefaultLimit' => false ]); if ($childEvent && $childEvent[0]) { $childEvent = $childEvent[0]; $bCalDav = CCalendar::IsCalDAVEnabled(); $bExchange = CCalendar::IsExchangeEnabled($userId); if ($bExchange || $bCalDav) { CCalendarSync::DoDeleteToDav([ 'bCalDav' => $bCalDav, 'bExchangeEnabled' => $bExchange, 'sectionId' => $childEvent['SECT_ID'] ], $childEvent); } self::onEventDelete($childEvent); } } if ($status === "Y") { if (($params['affectRecRelatedEvents'] ?? null) !== false) { $event = self::GetList([ 'arFilter' => [ "ID" => $eventId, "IS_MEETING" => 1, "DELETED" => "N" ], 'parseRecursion' => false, 'fetchAttendees' => true, 'fetchMeetings' => true, 'checkPermissions' => false, 'setDefaultLimit' => false ]); if (!empty($event)) { $event = $event[0]; } if (!empty($event['RECURRENCE_ID'])) { $masterEvent = self::GetList([ 'arFilter' => [ 'PARENT_ID' => $event['RECURRENCE_ID'], 'DELETED' => 'N', 'OWNER_ID' => $userId, ], 'parseRecursion' => false, 'fetchAttendees' => false, 'checkPermissions' => false, 'setDefaultLimit' => false ]); if (!empty($masterEvent)) { $masterEvent = $masterEvent[0]; } if (($masterEvent['MEETING_STATUS'] ?? null) !== 'Y') { self::SetMeetingStatus([ 'userId' => $userId, 'eventId' => $masterEvent['ID'], 'status' => $status, 'personalNotification' => true, 'hostNotification' => true, 'affectRecRelatedEvents' => false, 'updateDescription' => $params['updateDescription'] ?? null, ]); self::SetMeetingStatusForRecurrenceEvents( $event['RECURRENCE_ID'], $userId, $params['eventId'], $status, $params['updateDescription'] ?? null, ); } } if (!empty($event['RRULE']) && in_array($prevStatus, ['N', 'Q', 'H'])) { self::SetMeetingStatusForRecurrenceEvents( $event['PARENT_ID'], $userId, $params['eventId'], $status, $params['updateDescription'] ?? null, ); } } if ($prevStatus === 'N') { CCalendar::syncChange( $eventId, [ "MEETING_STATUS" => $status ], [ 'userId' => $userId, 'originalFrom' => null, ], null //$event ); } } if (($params['updateDescription'] ?? null) !== false) { if (!empty($event['RECURRENCE_ID'])) { self::pushUpdateDescriptionToQueue($event['RECURRENCE_ID'], $userId, $status); } if (!empty($event['PARENT_ID']) && (int)$event['PARENT_ID'] !== (int)$event['RECURRENCE_ID']) { self::pushUpdateDescriptionToQueue($event['PARENT_ID'], $userId, $status); } } CCalendarLiveFeed::OnChangeMeetingStatusEventEntry([ 'userId' => $userId, 'eventId' => $eventId, 'status' => $status, 'event' => $event ]); CCalendar::UpdateCounter($userId); $CACHE_MANAGER->ClearByTag('calendar_user_'.$userId); $CACHE_MANAGER->ClearByTag('calendar_user_'.$event['CREATED_BY']); } else { CCalendarNotify::ClearNotifications($eventId); } CTimeZone::Enable(); CCalendar::ClearCache(['attendees_list', 'event_list']); }