15 if (!Loader::includeModule(
"im"))
22 $fromUser = (int)
$params[
"userId"];
23 $toUser = (int)
$params[
"guestId"];
29 && !in_array($mode, [
'status_accept',
'status_decline',
'fail_ical_invite',
'ics_link'])
36 $params[
'from_timestamp'] = CCalendar::Timestamp(
$params[
"from"] ??
null);
37 if ((
$params[
'fields'][
'DT_SKIP_TIME'] ??
null) ===
'Y')
39 $params[
"from"] = CCalendar::Date(
$params[
'from_timestamp'],
false);
43 $params[
"from"] = CCalendar::Date(
$params[
'from_timestamp'],
true,
true,
true);
47 'EMAIL_TEMPLATE' =>
"CALENDAR_INVITATION",
48 'NOTIFY_MODULE' =>
"calendar",
51 if ($mode ===
'accept' || $mode ===
'decline')
53 $notifyFields[
'FROM_USER_ID'] = $toUser;
54 $notifyFields[
'TO_USER_ID'] = $fromUser;
58 $notifyFields[
'FROM_USER_ID'] = $fromUser;
59 $notifyFields[
'TO_USER_ID'] = $toUser;
63 'filter' => [
'=ID' => $toUser,
'=ACTIVE' =>
'Y'],
66 if (!$userOrm->fetch())
71 $eventId =
$params[
"eventId"] ??
null;
72 if ((
$params[
'isSharing'] ??
false) &&
$params[
'mode'] ===
'status_accept')
74 $params[
"pathToCalendar"] = CCalendar::GetPathForCalendarEx($notifyFields[
'FROM_USER_ID'] ??
null);
78 $params[
"pathToCalendar"] = CCalendar::GetPathForCalendarEx($notifyFields[
'TO_USER_ID'] ??
null);
81 if (!empty(
$params[
"pathToCalendar"]) && $eventId)
85 if ((
$params[
'isSharing'] ??
false) && $mode ===
'cancel_sharing')
96 'FROM_USER_ID' => $fromUser,
97 'TO_USER_ID' => $toUser,
98 'EMAIL_TEMPLATE' =>
"CALENDAR_INVITATION",
99 'NOTIFY_MODULE' =>
"calendar",
105 $notifyFields = self::Invite($notifyFields,
$params);
107 case 'change_notify':
108 $notifyFields = self::ChangeNotify($notifyFields,
$params);
111 $notifyFields = self::Cancel($notifyFields,
$params);
114 $notifyFields = self::CancelInstance($notifyFields,
$params);
117 $notifyFields = self::CancelAllReccurent($notifyFields,
$params);
119 case 'cancel_sharing':
120 $notifyFields = self::CancelSharing($notifyFields,
$params);
124 $notifyFields = self::MeetingStatus($notifyFields,
$params);
126 case 'status_accept':
127 case 'status_decline':
128 $notifyFields = self::MeetingStatusInfo($notifyFields,
$params);
130 case 'fail_ical_invite':
131 $notifyFields = self::NotifyFailIcalInvite($notifyFields,
$params);
133 case 'delete_location':
134 $notifyFields = self::DeleteLocation($notifyFields,
$params);
136 case 'cancel_booking':
137 $notifyFields = self::CancelBooking($notifyFields,
$params);
140 $notifyFields = self::IcsLink($notifyFields,
$params);
151 foreach(
GetModuleEvents(
"calendar",
"OnSendInvitationMessage",
true) as $arEvent)
161 $fields[
'NOTIFY_EVENT'] =
"invite";
163 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$fields[
'TO_USER_ID'];
164 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|" .
$params[
'eventId'] ??
null;
166 if (!empty(
$params[
'fields'][
'RRULE']))
168 $fromTs = CCalendar::Timestamp(
$params[
'fields'][
'DATE_FROM'] ??
null);
169 $toTs = CCalendar::Timestamp(
$params[
'fields'][
'DATE_TO'] ??
null);
171 if ((
$params[
'fields'][
'DT_SKIP_TIME'] ??
null) ===
"Y")
173 $toTs += CCalendar::DAY_LENGTH;
178 - CCalendar::GetTimezoneOffset(
$params[
'fields'][
'TZ_FROM'] ??
null)
179 + CCalendar::GetCurrentOffsetUTC(
$fields[
'TO_USER_ID'] ??
null);
181 - CCalendar::GetTimezoneOffset(
$params[
'fields'][
'TZ_TO'] ??
null)
182 + CCalendar::GetCurrentOffsetUTC(
$fields[
'TO_USER_ID'] ??
null);
185 $params[
'from_to_html'] = fn (?
string $languageId =
null) => CCalendar::GetFromToHtml(
188 (
$params[
'fields'][
'DT_SKIP_TIME'] ??
null) ===
'Y',
189 $params[
'fields'][
'DT_LENGTH'] ??
null,
195 $inviteMessage =
static function (?
string $languageId =
null) use (
$params)
197 if (!empty(
$params[
'fields'][
'RRULE']))
200 'EC_MESS_REC_INVITE_SITE',
202 '#TITLE#' =>
$params[
"name"] ??
null,
203 '#ACTIVE_FROM#' =>
$params[
'from_to_html']($languageId),
204 '#RRULE#' => CCalendarEvent::GetRRULEDescription(
$params[
'fields'],
false,
false, $languageId)
212 'EC_MESS_INVITE_SITE',
215 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
223 $result .=
"\n\n" . Loc::getMessage(
224 'EC_EVENT_REMINDER_LOCATION',
226 '#LOCATION#' =>
$params[
'location']
232 if (
$params[
'isSharing'] ??
false)
235 'EC_MESS_INVITE_SITE_SHARING',
238 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId),
244 $result .=
"\n\n" . Loc::getMessage(
'EC_MESS_INVITE_DETAILS_SITE', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId);
249 $inviteMessageOut =
static function (?
string $languageId, ?
string $ownerName) use (
$params)
251 if (!empty(
$params[
'fields'][
'RRULE']))
254 'EC_MESS_REC_INVITE',
256 '#OWNER_NAME#' => $ownerName,
258 '#ACTIVE_FROM#' =>
$params[
'from_to_html']($languageId),
259 '#RRULE#' => CCalendarEvent::GetRRULEDescription(
$params[
'fields'],
false,
false, $languageId)
269 '#OWNER_NAME#' => $ownerName,
271 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
279 $result .=
"\n\n" . Loc::getMessage(
280 'EC_EVENT_REMINDER_LOCATION',
281 [
'#LOCATION#' =>
$params[
'location']],
286 $result .=
"\n\n" . Loc::getMessage(
'EC_MESS_INVITE_CONF_Y', [
'#LINK#' =>
$params[
"pathToEvent"] .
'&CONFIRM=Y'], $languageId)
287 .
"\n" . Loc::getMessage(
'EC_MESS_INVITE_CONF_N', [
'#LINK#' =>
$params[
"pathToEvent"] .
'&CONFIRM=N'], $languageId)
288 .
"\n\n" . Loc::getMessage(
'EC_MESS_INVITE_DETAILS', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId)
294 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => $inviteMessage($languageId);
296 $ownerName = CCalendar::GetUserName(
$params[
'userId']);
297 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) => $inviteMessageOut($languageId, $ownerName);
299 $fields[
'PUSH_MESSAGE'] = fn (?
string $languageId =
null) => str_replace(
302 $inviteMessage($languageId)
308 [
'TITLE' => Loc::getMessage(
'EC_MESS_INVITE_CONF_Y_SITE'),
'VALUE' =>
'Y',
'TYPE' =>
'accept'],
309 [
'TITLE' => Loc::getMessage(
'EC_MESS_INVITE_CONF_N_SITE'),
'VALUE' =>
'N',
'TYPE' =>
'cancel']
312 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
313 'EC_MESS_INVITE_TITLE',
315 '#OWNER_NAME#' => CCalendar::GetUserName(
$params[
'userId']),
326 $fields[
'NOTIFY_EVENT'] =
"change";
327 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$fields[
'TO_USER_ID'];
328 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'];
330 $getValueWithViewEventUrl =
static function ($value) use (
$params)
332 return '[url=' .
$params[
"pathToEvent"] .
']' . $value .
'[/url]';
335 $changeMessage =
static function (?
string $languageId, $isOutMessage, $changedLocation) use (
$params, $getValueWithViewEventUrl)
341 $change =
$params[
'entryChanges'][0];
342 switch($change[
'fieldKey'])
346 'EC_NOTIFY_TITLE_CHANGED',
348 '#OLD_TITLE#' => $change[
'oldValue'],
349 '#NEW_TITLE#' => $isOutMessage ? $change[
'newValue'] : $getValueWithViewEventUrl($change[
'newValue']),
350 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
358 if (
$params[
'fields'][
'DT_SKIP_TIME'] ===
'N')
360 $userOffset = \CCalendar::GetTimezoneOffset(
$params[
'fields'][
'TZ_FROM'])
361 - \CCalendar::GetCurrentOffsetUTC(
$params[
'guestId']);
363 $change[
'oldValue'] = \CCalendar::Date(\CCalendar::Timestamp($change[
'oldValue'])
364 - $userOffset,
true,
true,
true);
365 $change[
'newValue'] = \CCalendar::Date(\CCalendar::Timestamp($change[
'newValue'])
366 - $userOffset,
true,
true,
true);
370 'EC_NOTIFY_DATE_FROM_CHANGED',
372 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
373 '#OLD_DATE_FROM#' => $change[
'oldValue'],
374 '#NEW_DATE_FROM#' => $change[
'newValue']
381 if (
$params[
'fields'][
'DT_SKIP_TIME'] ===
'N')
383 $userOffset = \CCalendar::GetTimezoneOffset(
$params[
'fields'][
'TZ_TO'])
384 - \CCalendar::GetCurrentOffsetUTC(
$params[
'guestId']);
386 $change[
'oldValue'] = \CCalendar::Date(\CCalendar::Timestamp($change[
'oldValue'])
387 - $userOffset,
true,
true,
true);
388 $change[
'newValue'] = \CCalendar::Date(\CCalendar::Timestamp($change[
'newValue'])
389 - $userOffset,
true,
true,
true);
393 'EC_NOTIFY_DATE_TO_CHANGED',
395 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
396 '#OLD_DATE_TO#' => $change[
'oldValue'],
397 '#NEW_DATE_TO#' => $change[
'newValue']
404 $locationMessageCode = empty($change[
'newValue'])
405 ?
'EC_NOTIFY_LOCATION_CHANGED_NONE'
406 :
'EC_NOTIFY_LOCATION_CHANGED'
409 $locationMessageCode,
411 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
412 '#ACTIVE_FROM#' =>
$params[
"from"],
413 '#NEW_VALUE#' => $changedLocation
420 'EC_NOTIFY_ATTENDEES_CHANGED',
422 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
423 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
431 'EC_NOTIFY_DESCRIPTION_CHANGED',
433 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
434 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
442 'EC_NOTIFY_RRULE_CHANGED',
444 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"])
451 'EC_NOTIFY_IMPORTANCE_CHANGED',
453 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
454 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
463 $changedFieldsList = [];
464 foreach (
$params[
'entryChanges'] as $change)
466 $key = $change[
'fieldKey'];
467 $changedFieldsList[] = Loc::getMessage(
'EC_NOTIFY_FIELD_' .
$key,
null, $languageId);
469 $changedFieldsListMessage = implode(
', ', array_unique($changedFieldsList));
472 'EC_NOTIFY_ENTRY_CHANGED',
474 '#TITLE#' => $isOutMessage ?
$params[
"name"] : $getValueWithViewEventUrl(
$params[
"name"]),
475 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId),
476 '#CHANGED_FIELDS_LIST#' => $changedFieldsListMessage
486 ($entryChange = current(
$params[
'entryChanges']))
487 && $entryChange[
'fieldKey'] ===
'LOCATION'
488 && !empty($entryChange[
'newValue'])
490 ? CCalendar::GetTextLocation($entryChange[
'newValue'])
493 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => $changeMessage($languageId,
false, $changedLocation)
494 .
"\n\n" . Loc::getMessage(
'EC_MESS_INVITE_DETAILS_SITE', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId)
496 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) => $changeMessage($languageId,
true, $changedLocation)
497 .
"\n\n" . Loc::getMessage(
'EC_MESS_INVITE_DETAILS', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId)
500 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
501 'EC_MESS_INVITE_CHANGED_TITLE',
502 [
'#TITLE#' =>
$params[
"name"]],
512 $fields[
'NOTIFY_EVENT'] =
"change";
513 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$fields[
'TO_USER_ID'].
"|cancel";
514 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'];
515 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) =>
517 'EC_MESS_INVITE_CANCEL_SITE',
520 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
526 'EC_MESS_VIEW_OWN_CALENDAR',
527 [
'#LINK#' =>
$params[
"pathToCalendar"]],
532 $ownerName = CCalendar::GetUserName(
$params[
'userId']);
533 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) =>
535 'EC_MESS_INVITE_CANCEL',
537 '#OWNER_NAME#' => $ownerName,
539 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
545 'EC_MESS_VIEW_OWN_CALENDAR_OUT',
546 [
'#LINK#' =>
$params[
"pathToCalendar"]],
551 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
552 'EC_MESS_INVITE_CANCEL_TITLE',
553 [
'#TITLE#' =>
$params[
"name"]],
561 $fields[
'NOTIFY_EVENT'] =
"change";
562 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$params[
"from"].
"|".
$fields[
'TO_USER_ID'].
"|cancel";
563 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'];
565 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) =>
567 'EC_MESS_REC_THIS_CANCEL_SITE',
570 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
576 'EC_MESS_VIEW_OWN_CALENDAR',
577 [
'#LINK#' =>
$params[
"pathToCalendar"]],
582 $ownerName = CCalendar::GetUserName(
$params[
'userId']);
583 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) =>
585 'EC_MESS_REC_THIS_CANCEL',
587 '#OWNER_NAME#' => $ownerName,
589 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
594 . Loc::getMessage(
'EC_MESS_VIEW_OWN_CALENDAR_OUT', [
'#LINK#' =>
$params[
"pathToCalendar"]])
597 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
598 'EC_MESS_INVITE_CANCEL_TITLE',
599 [
'#TITLE#' =>
$params[
"name"]],
607 $fields[
'NOTIFY_EVENT'] =
"change";
608 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$fields[
'TO_USER_ID'].
"|cancel";
609 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'];
611 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) =>
613 'EC_MESS_REC_ALL_CANCEL_SITE',
616 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
622 'EC_MESS_VIEW_OWN_CALENDAR',
623 [
'#LINK#' =>
$params[
"pathToCalendar"]],
627 $ownerName = CCalendar::GetUserName(
$params[
'userId']);
628 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) =>
630 'EC_MESS_REC_ALL_CANCEL',
632 '#OWNER_NAME#' => $ownerName,
634 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
640 'EC_MESS_VIEW_OWN_CALENDAR_OUT',
641 [
'#LINK#' =>
$params[
"pathToCalendar"]],
646 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
647 'EC_MESS_INVITE_CANCEL_TITLE',
648 [
'#TITLE#' =>
$params[
"name"]],
657 $fields[
'NOTIFY_EVENT'] =
"change";
658 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$fields[
'TO_USER_ID'].
"|sharing|cancel";
659 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'];
661 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) =>
663 'EC_MESS_INVITE_CANCEL_SHARING',
666 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId),
672 'EC_MESS_INVITE_CANCEL_SHARING_SITE',
673 [
'#LINK#' =>
$params[
"pathToEvent"]],
679 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
680 'EC_MESS_INVITE_CANCEL_TITLE',
681 [
'#TITLE#' =>
$params[
"name"]],
690 $fields[
'NOTIFY_EVENT'] =
"info";
693 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'].
"|".
$params[
'mode'];
694 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".$params[
'eventId'];
696 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => Loc::getMessage(
698 ?
'EC_MESS_INVITE_ACCEPTED_SITE_1'
699 :
'EC_MESS_INVITE_DECLINED_SITE_1',
701 '#TITLE#' =>
"[url=".
$params[
"pathToEvent"].
"]".
$params[
"name"].
"[/url]",
702 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
708 $ownerName = CCalendar::GetUserName(
$params[
'guestId']);
709 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) =>
712 ?
'EC_MESS_INVITE_ACCEPTED_1'
713 :
'EC_MESS_INVITE_DECLINED_1',
715 '#GUEST_NAME#' => $ownerName,
717 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
722 . Loc::getMessage(
'EC_MESS_INVITE_DETAILS', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId)
730 $fields[
'NOTIFY_EVENT'] =
"info";
734 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|STATUS|" .
$params[
'eventId'];
736 if ((
$params[
'isSharing'] ??
false) &&
$params[
'mode'] ===
'status_accept')
738 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) =>
740 'EC_MESS_AUTO_INVITE_ACCEPT',
743 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
748 . Loc::getMessage(
'EC_MESS_AUTO_INVITE_ACCEPT_DETAILS', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId);
752 $fields[
'MESSAGE'] =
static fn (?
string $languageId =
null) =>
754 $params[
'mode'] ===
'status_accept'
755 ?
'EC_MESS_STATUS_NOTIFY_Y_SITE'
756 :
'EC_MESS_STATUS_NOTIFY_N_SITE',
758 '#TITLE#' =>
"[url=".
$params[
"pathToEvent"].
"]".
$params[
"name"].
"[/url]",
759 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
767 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) =>
769 $params[
'mode'] ===
'status_accept'
770 ?
'EC_MESS_STATUS_NOTIFY_Y'
771 :
'EC_MESS_STATUS_NOTIFY_N',
773 '#TITLE#' =>
"[url=".
$params[
"pathToEvent"].
"]".
$params[
"name"].
"[/url]",
774 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId)
779 . Loc::getMessage(
'EC_MESS_INVITE_DETAILS', [
'#LINK#' =>
$params[
"pathToEvent"]], $languageId)
794 if (!Loader::includeModule(
"im") || (
int)$eventId <= 0)
800 if (
$event = CCalendarEvent::GetById($eventId))
802 $instanceDate =
false;
806 && Loader::includeModule(
'socialnetwork')
814 [
"ID",
"SOURCE_ID",
"PARAMS"]
825 if ($arLog[
'PARAMS'])
827 $arLog[
'PARAMS'] = unserialize($arLog[
'PARAMS'], [
'allowed_classes' =>
false]);
828 if (!is_array($arLog[
'PARAMS']))
830 $arLog[
'PARAMS'] = [];
834 if (isset($arLog[
'PARAMS'][
'COMMENT_XML_ID']) && $arLog[
'PARAMS'][
'COMMENT_XML_ID'])
836 $instanceDate = CCalendarEvent::ExtractDateFromCommentXmlId($arLog[
'PARAMS'][
'COMMENT_XML_ID']);
842 'filter' => [
'=ID' =>
$userId],
843 'select' => [
'ID',
'PERSONAL_GENDER']
846 if (($user =
$res->fetch()) && in_array($user[
'PERSONAL_GENDER'], [
'F',
'M']))
848 $gender = $user[
'PERSONAL_GENDER'];
854 "NOTIFY_MODULE" =>
"calendar",
855 "NOTIFY_EVENT" =>
"event_comment"
861 $attendees = CCalendarEvent::GetAttendees($aId);
862 if (is_array($attendees) && is_array($attendees[$aId] ??
null))
866 $instanceDate = CCalendar::Date(CCalendar::Timestamp(
$event[
'DATE_FROM']),
false);
869 $attendees = $attendees[$aId];
871 $excludeUserIdList = [];
875 && Loader::includeModule(
'socialnetwork')
878 $res = \Bitrix\Socialnetwork\LogFollowTable::getList([
880 "=CODE" =>
"L".$arLog[
'ID'],
883 'select' => [
'USER_ID']
886 while ($unFollower =
$res->fetch())
888 $excludeUserIdList[] = (int)$unFollower[
"USER_ID"];
893 foreach($attendees as $attendee)
895 $attendeeId = (int)$attendee[
'USER_ID'];
896 if (in_array($attendeeId, $excludeUserIdList,
true))
901 $url = CCalendar::GetPathForCalendarEx($attendeeId);
904 if ($attendeeId !==
$userId && $attendee[
"STATUS"] !==
'N')
906 $imMessageFields[
'TO_USER_ID'] = $attendeeId;
908 $imMessageFields[
"NOTIFY_MESSAGE"] = fn (?
string $languageId =
null) => self::getCommentAddNotifyMessage(
909 $url ?
"<a href=\"".
$url.
"\" class=\"bx-notifier-item-action\">".
$event[
"NAME"].
"</a>" :
$event[
"NAME"],
915 $imMessageFields[
'NOTIFY_MESSAGE_OUT'] = fn (?
string $languageId =
null) => self::getCommentAddNotifyMessage(
920 ) . (
$url ?
' (' .
$url .
')' :
'');
922 $imMessageFields[
"NOTIFY_TAG"] =
"CALENDAR|COMMENT|".$aId.
"|".$instanceDate;
924 CIMNotify::Add($imMessageFields);
931 private static function getCommentAddNotifyMessage($eventTitle,
$comment, $gender =
null, $languageId =
null): ?string
933 $phrase = $gender ?
'EC_COMMENT_MESSAGE_ADD_' . $gender :
'EC_COMMENT_MESSAGE_ADD';
935 return Loc::getMessage(
938 '#EVENT_TITLE#' => $eventTitle,
950 if (Loader::includeModule(
"im"))
954 CIMNotify::DeleteByTag(
"CALENDAR|INVITE|".$eventId.
"|".
$userId);
955 CIMNotify::DeleteByTag(
"CALENDAR|STATUS|".$eventId.
"|".
$userId);
956 CIMNotify::DeleteByTag(
"CALENDAR|ICS|".$eventId.
"|".
$userId);
960 CIMNotify::DeleteBySubTag(
"CALENDAR|INVITE|".$eventId);
961 CIMNotify::DeleteBySubTag(
"CALENDAR|STATUS|".$eventId);
962 CIMNotify::DeleteBySubTag(
"CALENDAR|ICS|".$eventId);
967 private static function NotifyFailIcalInvite(
$fields = [],
$params = [])
969 $fields[
'NOTIFY_EVENT'] =
"info";
970 $fields[
'NOTIFY_TAG'] =
"CALENDAR|INVITE|".
"icalfail";
971 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|INVITE|".
"icalfail";
973 foreach (
$params[
'items'] as $item)
975 if (is_string($item))
977 $usersList[] = $item;
979 if (isset($item[
'email']) && is_string($item[
'email']))
981 $usersList[] = $item[
'email'];
985 $userString = implode(
', ', $usersList);
987 if (
$params[
'icalMethod'] ===
'cancel')
989 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => Loc::getMessage(
990 'EC_NOTIFY_FAIL_ICAL_CANCEL',
992 '#USERS_LIST#' => $userString,
998 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) => Loc::getMessage(
999 'EC_NOTIFY_FAIL_ICAL_CANCEL_OUT',
1001 '#USERS_LIST#' => $userString,
1007 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
1008 'EC_MESS_FAIL_ICAL_INVITE_TITLE_CANCEL',
1009 [
'#TITLE#' =>
$params[
'name']],
1015 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => Loc::getMessage(
1016 'EC_NOTIFY_FAIL_ICAL_EDIT',
1018 '#USERS_LIST#' => $userString,
1024 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) => Loc::getMessage(
1025 'EC_NOTIFY_FAIL_ICAL_EDIT_OUT',
1027 '#USERS_LIST#' => $userString,
1032 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
1033 'EC_MESS_FAIL_ICAL_INVITE_TITLE_EDIT',
1034 [
'#TITLE#' =>
$params[
'name']],
1040 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => Loc::getMessage(
1041 'EC_NOTIFY_FAIL_ICAL_REQUEST',
1043 '#USERS_LIST#' => $userString,
1049 $fields[
'MESSAGE_OUT'] = fn (?
string $languageId =
null) => Loc::getMessage(
1050 'EC_NOTIFY_FAIL_ICAL_REQUEST_OUT',
1052 '#USERS_LIST#' => $userString,
1058 $fields[
'TITLE'] = fn (?
string $languageId =
null) => Loc::getMessage(
1059 'EC_MESS_FAIL_ICAL_INVITE_TITLE_REQUEST',
1060 [
'#TITLE#' =>
$params[
'name']],
1070 $fields[
'NOTIFY_EVENT'] =
"delete_location";
1073 $fields[
'NOTIFY_TAG'] =
"CALENDAR|LOCATION|".$params[
'locationId'].
"|". (int)
$params[
"userId"];
1074 $fields[
'NOTIFY_SUB_TAG'] =
"CALENDAR|LOCATION|".$params[
'locationId'];
1076 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) => Loc::getMessage(
1077 'EC_NOTIFY_DELETE_LOCATION',
1078 [
'#LOCATION#' =>
$params[
"location"]],
1087 $fields[
'NOTIFY_EVENT'] =
'release_location';
1091 'CALENDAR|LOCATION|' . (int)
$params[
'locationId']
1092 .
'|' . (
int)
$params[
'userId'] .
'|' . (int)
$params[
'eventId'] .
'|' .
'cancel'
1094 $fields[
'NOTIFY_SUB_TAG'] =
'CALENDAR|LOCATION|' .
$params[
'locationId'];
1096 $notificationCode = match (
$params[
'recursionMode'])
1098 'all' =>
'EC_NOTIFY_CANCEL_BOOKING_ALL',
1099 'next' =>
'EC_NOTIFY_CANCEL_BOOKING_NEXT',
1100 default =>
'EC_NOTIFY_CANCEL_BOOKING_THIS',
1103 $fields[
'MESSAGE'] = fn (?
string $languageId =
null) =>
1107 '#FROM#' => self::getFromFormatted(
$params, $languageId),
1108 '#LINK#' =>
$params[
'pathToEvent'],
1109 '#EVENT#' =>
$params[
'eventName'],
1110 '#FREQUENCY#' => !empty(
$params[
'fields'][
'RRULE'])
1111 ? CCalendarEvent::GetRRULEDescription(
$params[
'fields'],
false,
false, $languageId)
1114 '#FROM_TIME#' =>
$params[
'fields'][
'DT_SKIP_TIME'] ===
'N'
1116 'EC_NOTIFY_CANCEL_BOOKING_TIME',
1118 '#FROM_TIME#'=> mb_substr(
$params[
'from'], -5, 5)
1127 . Loc::getMessage(
'EC_NOTIFY_CANCEL_BOOKING_ENDING',
null, $languageId)
1135 $fields[
'NOTIFY_EVENT'] =
'info';
1139 $fields[
'NOTIFY_SUB_TAG'] =
'CALENDAR|ICS|' .
$params[
'eventId'];
1141 '%s/calendar/ics/?EVENT_ID=%d',
1142 UrlManager::getInstance()->getHostUrl(),
1146 $fields[
'MESSAGE'] =
static fn (?
string $languageId =
null) =>
1148 'EC_MESS_STATUS_NOTIFY_DOWNLOAD_ICS',
1150 '#TITLE#' =>
'[url=' .
$params[
'pathToEvent'] .
']' .
$params[
'name'] .
'[/url]',
1151 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId),
1157 $fields[
'MESSAGE_OUT'] =
static fn (?
string $languageId =
null) =>
1159 'EC_MESS_STATUS_NOTIFY_DOWNLOAD_ICS',
1161 '#TITLE#' =>
'[url=' .
$params[
'pathToEvent'] .
']' .
$params[
'name'] .
'[/url]',
1162 '#ACTIVE_FROM#' => self::getFromFormatted(
$params, $languageId),
1173 private static function getFromFormatted(
$params, ?
string $languageId =
null): string
1175 $culture = \Bitrix\Main\Context::getCurrent()?->getCulture();
1178 if ((
$params[
'fields'][
'DT_SKIP_TIME'] ??
null) !==
'Y')
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getList(array $parameters=array())
static CancelBooking($fields=[], $params=[])
static CancelSharing($fields=[], $params=[])
static Cancel($fields=[], $params=[])
static Invite($fields=[], $params=[])
static MeetingStatus($fields=[], $params=[])
static ClearNotifications($eventId=false, $userId=false)
static NotifyComment($eventId, $params)
static CancelInstance($fields=[], $params=[])
const PUSH_MESSAGE_MAX_LENGTH
static DeleteLocation($fields=[], $params=[])
static ChangeNotify($fields=[], $params=[])
static MeetingStatusInfo($fields=[], $params=[])
static CancelAllReccurent($fields=[], $params=[])
static urlDeleteParams($url, $delete_params, $options=array())
static urlAddParams($url, $add_params, $options=[])
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
static clearAllTags($text)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/urlrewrite.php")) $uri
ExecuteModuleEventEx($arEvent, $arParams=[])
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']