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']);
}