1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
calendar_notify.php
См. документацию.
1<?
4
8
10{
12
13 public static function Send($params)
14 {
15 if (!Loader::includeModule("im"))
16 {
17 return false;
18 }
19
20 $params["eventId"] = (int)($params["eventId"] ?? null);
21 $mode = $params['mode'];
22 $fromUser = (int)$params["userId"];
23 $toUser = (int)$params["guestId"];
24 if (
25 !$fromUser
26 || !$toUser
27 || (
28 $toUser === $fromUser
29 && !in_array($mode, ['status_accept', 'status_decline', 'fail_ical_invite', 'ics_link'])
30 )
31 )
32 {
33 return false;
34 }
35
36 $params['from_timestamp'] = CCalendar::Timestamp($params["from"] ?? null);
37 if (($params['fields']['DT_SKIP_TIME'] ?? null) === 'Y')
38 {
39 $params["from"] = CCalendar::Date($params['from_timestamp'], false);
40 }
41 else
42 {
43 $params["from"] = CCalendar::Date($params['from_timestamp'], true, true, true);
44 }
45
46 $notifyFields = [
47 'EMAIL_TEMPLATE' => "CALENDAR_INVITATION",
48 'NOTIFY_MODULE' => "calendar",
49 ];
50
51 if ($mode === 'accept' || $mode === 'decline')
52 {
53 $notifyFields['FROM_USER_ID'] = $toUser;
54 $notifyFields['TO_USER_ID'] = $fromUser;
55 }
56 else
57 {
58 $notifyFields['FROM_USER_ID'] = $fromUser;
59 $notifyFields['TO_USER_ID'] = $toUser;
60 }
61
63 'filter' => ['=ID' => $toUser, '=ACTIVE' => 'Y'],
64 'select' => ['ID']
65 ]);
66 if (!$userOrm->fetch())
67 {
68 return false;
69 }
70
71 $eventId = $params["eventId"] ?? null;
72 if (($params['isSharing'] ?? false) && $params['mode'] === 'status_accept')
73 {
74 $params["pathToCalendar"] = CCalendar::GetPathForCalendarEx($notifyFields['FROM_USER_ID'] ?? null);
75 }
76 else
77 {
78 $params["pathToCalendar"] = CCalendar::GetPathForCalendarEx($notifyFields['TO_USER_ID'] ?? null);
79 }
80
81 if (!empty($params["pathToCalendar"]) && $eventId)
82 {
83 $params["pathToCalendar"] = CHTTP::urlDeleteParams($params["pathToCalendar"], ["action", "sessid", "bx_event_calendar_request", "EVENT_ID"]);
84
85 if (($params['isSharing'] ?? false) && $mode === 'cancel_sharing')
86 {
87 $params["pathToEvent"] = CHTTP::urlAddParams($params["pathToCalendar"], ['EVENT_ID' => $eventId, 'IS_SHARING' => 1]);
88 }
89 else
90 {
91 $params["pathToEvent"] = CHTTP::urlAddParams($params["pathToCalendar"], ['EVENT_ID' => $eventId]);
92 }
93 }
94
95 $notifyFields = [
96 'FROM_USER_ID' => $fromUser,
97 'TO_USER_ID' => $toUser,
98 'EMAIL_TEMPLATE' => "CALENDAR_INVITATION",
99 'NOTIFY_MODULE' => "calendar",
100 ];
101
102 switch($mode)
103 {
104 case 'invite':
105 $notifyFields = self::Invite($notifyFields, $params);
106 break;
107 case 'change_notify':
108 $notifyFields = self::ChangeNotify($notifyFields, $params);
109 break;
110 case 'cancel':
111 $notifyFields = self::Cancel($notifyFields, $params);
112 break;
113 case 'cancel_this':
114 $notifyFields = self::CancelInstance($notifyFields, $params);
115 break;
116 case 'cancel_all':
117 $notifyFields = self::CancelAllReccurent($notifyFields, $params);
118 break;
119 case 'cancel_sharing':
120 $notifyFields = self::CancelSharing($notifyFields, $params);
121 break;
122 case 'accept':
123 case 'decline':
124 $notifyFields = self::MeetingStatus($notifyFields, $params);
125 break;
126 case 'status_accept':
127 case 'status_decline':
128 $notifyFields = self::MeetingStatusInfo($notifyFields, $params);
129 break;
130 case 'fail_ical_invite':
131 $notifyFields = self::NotifyFailIcalInvite($notifyFields, $params);
132 break;
133 case 'delete_location':
134 $notifyFields = self::DeleteLocation($notifyFields, $params);
135 break;
136 case 'cancel_booking':
137 $notifyFields = self::CancelBooking($notifyFields, $params);
138 break;
139 case 'ics_link':
140 $notifyFields = self::IcsLink($notifyFields, $params);
141 break;
142 }
143
144 $messageId = CIMNotify::Add($notifyFields);
145 if (!empty($params['markRead']) && $messageId > 0)
146 {
147 $CIMNotify = new CIMNotify((int)($params["userId"] ?? null));
148 $CIMNotify->MarkNotifyRead($messageId);
149 }
150
151 foreach(GetModuleEvents("calendar", "OnSendInvitationMessage", true) as $arEvent)
152 {
153 ExecuteModuleEventEx($arEvent, [$params]);
154 }
155
156 return true;
157 }
158
159 public static function Invite($fields = [], $params = [])
160 {
161 $fields['NOTIFY_EVENT'] = "invite";
162 $fields['NOTIFY_TYPE'] = IM_NOTIFY_CONFIRM;
163 $fields['NOTIFY_TAG'] = "CALENDAR|INVITE|".$params['eventId']."|".$fields['TO_USER_ID'];
164 $fields['NOTIFY_SUB_TAG'] = "CALENDAR|INVITE|" . $params['eventId'] ?? null;
165
166 if (!empty($params['fields']['RRULE']))
167 {
168 $fromTs = CCalendar::Timestamp($params['fields']['DATE_FROM'] ?? null);
169 $toTs = CCalendar::Timestamp($params['fields']['DATE_TO'] ?? null);
170
171 if (($params['fields']['DT_SKIP_TIME'] ?? null) === "Y")
172 {
173 $toTs += CCalendar::DAY_LENGTH;
174 }
175 else
176 {
177 $fromTs = $fromTs
178 - CCalendar::GetTimezoneOffset($params['fields']['TZ_FROM'] ?? null)
179 + CCalendar::GetCurrentOffsetUTC($fields['TO_USER_ID'] ?? null);
180 $toTs = $toTs
181 - CCalendar::GetTimezoneOffset($params['fields']['TZ_TO'] ?? null)
182 + CCalendar::GetCurrentOffsetUTC($fields['TO_USER_ID'] ?? null);
183 }
184
185 $params['from_to_html'] = fn (?string $languageId = null) => CCalendar::GetFromToHtml(
186 $fromTs,
187 $toTs,
188 ($params['fields']['DT_SKIP_TIME'] ?? null) === 'Y',
189 $params['fields']['DT_LENGTH'] ?? null,
190 true,
191 $languageId
192 );
193 }
194
195 $inviteMessage = static function (?string $languageId = null) use ($params)
196 {
197 if (!empty($params['fields']['RRULE']))
198 {
199 $result = Loc::getMessage(
200 'EC_MESS_REC_INVITE_SITE',
201 [
202 '#TITLE#' => $params["name"] ?? null,
203 '#ACTIVE_FROM#' => $params['from_to_html']($languageId),
204 '#RRULE#' => CCalendarEvent::GetRRULEDescription($params['fields'], false, false, $languageId)
205 ],
206 $languageId
207 );
208 }
209 else
210 {
211 $result = Loc::getMessage(
212 'EC_MESS_INVITE_SITE',
213 [
214 '#TITLE#' => $params["name"],
215 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
216 ],
217 $languageId
218 );
219 }
220
221 if ($params['location'])
222 {
223 $result .= "\n\n" . Loc::getMessage(
224 'EC_EVENT_REMINDER_LOCATION',
225 [
226 '#LOCATION#' => $params['location']
227 ],
228 $languageId
229 );
230 }
231
232 if ($params['isSharing'] ?? false)
233 {
234 $result = Loc::getMessage(
235 'EC_MESS_INVITE_SITE_SHARING',
236 [
237 '#TITLE#' => $params["name"],
238 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId),
239 ],
240 $languageId
241 );
242 }
243
244 $result .= "\n\n" . Loc::getMessage('EC_MESS_INVITE_DETAILS_SITE', ['#LINK#' => $params["pathToEvent"]], $languageId);
245
246 return $result;
247 };
248
249 $inviteMessageOut = static function (?string $languageId, ?string $ownerName) use ($params)
250 {
251 if (!empty($params['fields']['RRULE']))
252 {
253 $result = Loc::getMessage(
254 'EC_MESS_REC_INVITE',
255 [
256 '#OWNER_NAME#' => $ownerName,
257 '#TITLE#' => $params["name"],
258 '#ACTIVE_FROM#' => $params['from_to_html']($languageId),
259 '#RRULE#' => CCalendarEvent::GetRRULEDescription($params['fields'], false, false, $languageId)
260 ],
261 $languageId
262 );
263 }
264 else
265 {
266 $result = Loc::getMessage(
267 'EC_MESS_INVITE',
268 [
269 '#OWNER_NAME#' => $ownerName,
270 '#TITLE#' => $params["name"],
271 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
272 ],
273 $languageId
274 );
275 }
276
277 if ($params['location'])
278 {
279 $result .= "\n\n" . Loc::getMessage(
280 'EC_EVENT_REMINDER_LOCATION',
281 ['#LOCATION#' => $params['location']],
282 $languageId
283 );
284 }
285
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)
289 ;
290
291 return $result;
292 };
293
294 $fields['MESSAGE'] = fn (?string $languageId = null) => $inviteMessage($languageId);
295
296 $ownerName = CCalendar::GetUserName($params['userId']);
297 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) => $inviteMessageOut($languageId, $ownerName);
298
299 $fields['PUSH_MESSAGE'] = fn (?string $languageId = null) => str_replace(
300 ['[B]', '[/B]'],
301 ['', ''],
302 $inviteMessage($languageId)
303 );
304
305 $fields['NOTIFY_LINK'] = $params["pathToEvent"];
306
307 $fields['NOTIFY_BUTTONS'] = [
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']
310 ];
311
312 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
313 'EC_MESS_INVITE_TITLE',
314 [
315 '#OWNER_NAME#' => CCalendar::GetUserName($params['userId']),
316 '#TITLE#' => $params["name"]
317 ],
318 $languageId
319 );
320
321 return $fields;
322 }
323
324 public static function ChangeNotify($fields = [], $params = [])
325 {
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'];
329
330 $getValueWithViewEventUrl = static function ($value) use ($params)
331 {
332 return '[url=' . $params["pathToEvent"] . ']' . $value . '[/url]';
333 };
334
335 $changeMessage = static function (?string $languageId, $isOutMessage, $changedLocation) use ($params, $getValueWithViewEventUrl)
336 {
337 $result = '';
338
339 if (count($params['entryChanges']) === 1)
340 {
341 $change = $params['entryChanges'][0];
342 switch($change['fieldKey'])
343 {
344 case 'NAME':
345 $result = Loc::getMessage(
346 'EC_NOTIFY_TITLE_CHANGED',
347 [
348 '#OLD_TITLE#' => $change['oldValue'],
349 '#NEW_TITLE#' => $isOutMessage ? $change['newValue'] : $getValueWithViewEventUrl($change['newValue']),
350 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
351 ],
352 $languageId
353 );
354
355 break;
356
357 case 'DATE_FROM':
358 if ($params['fields']['DT_SKIP_TIME'] === 'N')
359 {
360 $userOffset = \CCalendar::GetTimezoneOffset($params['fields']['TZ_FROM'])
361 - \CCalendar::GetCurrentOffsetUTC($params['guestId']);
362
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);
367 }
368
369 $result = Loc::getMessage(
370 'EC_NOTIFY_DATE_FROM_CHANGED',
371 [
372 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
373 '#OLD_DATE_FROM#' => $change['oldValue'],
374 '#NEW_DATE_FROM#' => $change['newValue']
375 ],
376 $languageId
377 );
378 break;
379
380 case 'DATE_TO':
381 if ($params['fields']['DT_SKIP_TIME'] === 'N')
382 {
383 $userOffset = \CCalendar::GetTimezoneOffset($params['fields']['TZ_TO'])
384 - \CCalendar::GetCurrentOffsetUTC($params['guestId']);
385
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);
390 }
391
392 $result = Loc::getMessage(
393 'EC_NOTIFY_DATE_TO_CHANGED',
394 [
395 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
396 '#OLD_DATE_TO#' => $change['oldValue'],
397 '#NEW_DATE_TO#' => $change['newValue']
398 ],
399 $languageId
400 );
401
402 break;
403 case 'LOCATION':
404 $locationMessageCode = empty($change['newValue'])
405 ? 'EC_NOTIFY_LOCATION_CHANGED_NONE'
406 : 'EC_NOTIFY_LOCATION_CHANGED'
407 ;
408 $result = Loc::getMessage(
409 $locationMessageCode,
410 [
411 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
412 '#ACTIVE_FROM#' => $params["from"],
413 '#NEW_VALUE#' => $changedLocation
414 ],
415 $languageId
416 );
417 break;
418 case 'ATTENDEES':
419 $result = Loc::getMessage(
420 'EC_NOTIFY_ATTENDEES_CHANGED',
421 [
422 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
423 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
424 ],
425 $languageId
426 );
427
428 break;
429 case 'DESCRIPTION':
430 $result = Loc::getMessage(
431 'EC_NOTIFY_DESCRIPTION_CHANGED',
432 [
433 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
434 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
435 ],
436 $languageId
437 );
438 break;
439 case 'RRULE':
440 case 'EXDATE':
441 $result = Loc::getMessage(
442 'EC_NOTIFY_RRULE_CHANGED',
443 [
444 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"])
445 ],
446 $languageId
447 );
448 break;
449 case 'IMPORTANCE':
450 $result = Loc::getMessage(
451 'EC_NOTIFY_IMPORTANCE_CHANGED',
452 [
453 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
454 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
455 ],
456 $languageId
457 );
458 break;
459 }
460 }
461 else // Two or more changes
462 {
463 $changedFieldsList = [];
464 foreach ($params['entryChanges'] as $change)
465 {
466 $key = $change['fieldKey'];
467 $changedFieldsList[] = Loc::getMessage('EC_NOTIFY_FIELD_' . $key, null, $languageId);
468 }
469 $changedFieldsListMessage = implode(', ', array_unique($changedFieldsList));
470
471 $result = Loc::getMessage(
472 'EC_NOTIFY_ENTRY_CHANGED',
473 [
474 '#TITLE#' => $isOutMessage ? $params["name"] : $getValueWithViewEventUrl($params["name"]),
475 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId),
476 '#CHANGED_FIELDS_LIST#' => $changedFieldsListMessage
477 ],
478 $languageId
479 );
480 }
481
482 return $result;
483 };
484
485 $changedLocation = (
486 ($entryChange = current($params['entryChanges']))
487 && $entryChange['fieldKey'] === 'LOCATION'
488 && !empty($entryChange['newValue'])
489 )
490 ? CCalendar::GetTextLocation($entryChange['newValue'])
491 : ''
492 ;
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)
495 ;
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)
498 ;
499 $fields['NOTIFY_LINK'] = $params["pathToEvent"];
500 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
501 'EC_MESS_INVITE_CHANGED_TITLE',
502 ['#TITLE#' => $params["name"]],
503 $languageId
504 );
505
506 return $fields;
507 }
508
509
510 public static function Cancel($fields = [], $params = [])
511 {
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) =>
516 Loc::getMessage(
517 'EC_MESS_INVITE_CANCEL_SITE',
518 [
519 '#TITLE#' => $params["name"],
520 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
521 ],
522 $languageId
523 )
524 . "\n\n"
525 . Loc::getMessage(
526 'EC_MESS_VIEW_OWN_CALENDAR',
527 ['#LINK#' => $params["pathToCalendar"]],
528 $languageId
529 )
530 ;
531
532 $ownerName = CCalendar::GetUserName($params['userId']);
533 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) =>
534 Loc::getMessage(
535 'EC_MESS_INVITE_CANCEL',
536 [
537 '#OWNER_NAME#' => $ownerName,
538 '#TITLE#' => $params["name"],
539 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
540 ],
541 $languageId
542 )
543 . "\n\n"
544 . Loc::getMessage(
545 'EC_MESS_VIEW_OWN_CALENDAR_OUT',
546 ['#LINK#' => $params["pathToCalendar"]],
547 $languageId
548 )
549 ;
550
551 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
552 'EC_MESS_INVITE_CANCEL_TITLE',
553 ['#TITLE#' => $params["name"]],
554 $languageId
555 );
556 return $fields;
557 }
558
559 public static function CancelInstance($fields = [], $params = [])
560 {
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'];
564
565 $fields['MESSAGE'] = fn (?string $languageId = null) =>
566 Loc::getMessage(
567 'EC_MESS_REC_THIS_CANCEL_SITE',
568 [
569 '#TITLE#' => $params["name"],
570 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
571 ],
572 $languageId
573 )
574 . "\n\n"
575 . Loc::getMessage(
576 'EC_MESS_VIEW_OWN_CALENDAR',
577 ['#LINK#' => $params["pathToCalendar"]],
578 $languageId
579 )
580 ;
581
582 $ownerName = CCalendar::GetUserName($params['userId']);
583 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) =>
584 Loc::getMessage(
585 'EC_MESS_REC_THIS_CANCEL',
586 [
587 '#OWNER_NAME#' => $ownerName,
588 '#TITLE#' => $params["name"],
589 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
590 ],
591 $languageId
592 )
593 . "\n\n"
594 . Loc::getMessage('EC_MESS_VIEW_OWN_CALENDAR_OUT', ['#LINK#' => $params["pathToCalendar"]])
595 ;
596
597 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
598 'EC_MESS_INVITE_CANCEL_TITLE',
599 ['#TITLE#' => $params["name"]],
600 $languageId
601 );
602 return $fields;
603 }
604
605 public static function CancelAllReccurent($fields = [], $params = [])
606 {
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'];
610
611 $fields['MESSAGE'] = fn (?string $languageId = null) =>
612 Loc::getMessage(
613 'EC_MESS_REC_ALL_CANCEL_SITE',
614 [
615 '#TITLE#' => $params["name"],
616 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
617 ],
618 $languageId
619 )
620 . "\n\n"
621 . Loc::getMessage(
622 'EC_MESS_VIEW_OWN_CALENDAR',
623 ['#LINK#' => $params["pathToCalendar"]],
624 $languageId
625 );
626
627 $ownerName = CCalendar::GetUserName($params['userId']);
628 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) =>
629 Loc::getMessage(
630 'EC_MESS_REC_ALL_CANCEL',
631 [
632 '#OWNER_NAME#' => $ownerName,
633 '#TITLE#' => $params["name"],
634 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
635 ],
636 $languageId
637 )
638 . "\n\n"
639 . Loc::getMessage(
640 'EC_MESS_VIEW_OWN_CALENDAR_OUT',
641 ['#LINK#' => $params["pathToCalendar"]],
642 $languageId
643 )
644 ;
645
646 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
647 'EC_MESS_INVITE_CANCEL_TITLE',
648 ['#TITLE#' => $params["name"]],
649 $languageId
650 );
651
652 return $fields;
653 }
654
655 public static function CancelSharing($fields = [], $params = [])
656 {
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'];
660
661 $fields['MESSAGE'] = fn (?string $languageId = null) =>
662 Loc::getMessage(
663 'EC_MESS_INVITE_CANCEL_SHARING',
664 [
665 '#TITLE#' => $params["name"],
666 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId),
667 ],
668 $languageId
669 )
670 . "\n\n"
671 . Loc::getMessage(
672 'EC_MESS_INVITE_CANCEL_SHARING_SITE',
673 ['#LINK#' => $params["pathToEvent"]],
674 $languageId
675 )
676 ;
677
678 $fields['MESSAGE_OUT'] = $fields['MESSAGE'];
679 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
680 'EC_MESS_INVITE_CANCEL_TITLE',
681 ['#TITLE#' => $params["name"]],
682 $languageId
683 );
684
685 return $fields;
686 }
687
688 public static function MeetingStatus($fields = [], $params = [])
689 {
690 $fields['NOTIFY_EVENT'] = "info";
691 $fields['FROM_USER_ID'] = (int)$params["guestId"];
692 $fields['TO_USER_ID'] = (int)$params["userId"];
693 $fields['NOTIFY_TAG'] = "CALENDAR|INVITE|".$params['eventId']."|".$params['mode'];
694 $fields['NOTIFY_SUB_TAG'] = "CALENDAR|INVITE|".$params['eventId'];
695
696 $fields['MESSAGE'] = fn (?string $languageId = null) => Loc::getMessage(
697 $params['mode'] === 'accept'
698 ? 'EC_MESS_INVITE_ACCEPTED_SITE_1'
699 : 'EC_MESS_INVITE_DECLINED_SITE_1',
700 [
701 '#TITLE#' => "[url=".$params["pathToEvent"]."]".$params["name"]."[/url]",
702 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
703 ],
704 $languageId
705 );
706 $fields['NOTIFY_LINK'] = $params["pathToEvent"];
707
708 $ownerName = CCalendar::GetUserName($params['guestId']);
709 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) =>
710 Loc::getMessage(
711 $params['mode'] ==='accept'
712 ? 'EC_MESS_INVITE_ACCEPTED_1'
713 : 'EC_MESS_INVITE_DECLINED_1',
714 [
715 '#GUEST_NAME#' => $ownerName,
716 '#TITLE#' => $params["name"],
717 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
718 ],
719 $languageId
720 )
721 . "\n\n"
722 . Loc::getMessage('EC_MESS_INVITE_DETAILS', ['#LINK#' => $params["pathToEvent"]], $languageId)
723 ;
724
725
726 return $fields;
727 }
728 public static function MeetingStatusInfo($fields = [], $params = [])
729 {
730 $fields['NOTIFY_EVENT'] = "info";
731 $fields['FROM_USER_ID'] = (int)$params["guestId"];
732 $fields['TO_USER_ID'] = (int)$params["userId"];
733 $fields['NOTIFY_TAG'] = "CALENDAR|STATUS|" . $params['eventId'] . "|" . (int)$params["userId"];
734 $fields['NOTIFY_SUB_TAG'] = "CALENDAR|STATUS|" . $params['eventId'];
735
736 if (($params['isSharing'] ?? false) && $params['mode'] === 'status_accept')
737 {
738 $fields['MESSAGE'] = fn (?string $languageId = null) =>
739 Loc::getMessage(
740 'EC_MESS_AUTO_INVITE_ACCEPT',
741 [
742 '#TITLE#' => $params["name"],
743 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
744 ],
745 $languageId
746 )
747 . "\n\n"
748 . Loc::getMessage('EC_MESS_AUTO_INVITE_ACCEPT_DETAILS', ['#LINK#' => $params["pathToEvent"]], $languageId);
749 }
750 else
751 {
752 $fields['MESSAGE'] = static fn (?string $languageId = null) =>
753 Loc::getMessage(
754 $params['mode'] === 'status_accept'
755 ? 'EC_MESS_STATUS_NOTIFY_Y_SITE'
756 : 'EC_MESS_STATUS_NOTIFY_N_SITE',
757 [
758 '#TITLE#' => "[url=".$params["pathToEvent"]."]".$params["name"]."[/url]",
759 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
760 ],
761 $languageId
762 );
763
764 $fields['NOTIFY_LINK'] = $params["pathToEvent"];
765 }
766
767 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) =>
768 Loc::getMessage(
769 $params['mode'] === 'status_accept'
770 ? 'EC_MESS_STATUS_NOTIFY_Y'
771 : 'EC_MESS_STATUS_NOTIFY_N',
772 [
773 '#TITLE#' => "[url=".$params["pathToEvent"]."]".$params["name"]."[/url]",
774 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId)
775 ],
776 $languageId
777 )
778 . "\n\n"
779 . Loc::getMessage('EC_MESS_INVITE_DETAILS', ['#LINK#' => $params["pathToEvent"]], $languageId)
780 ;
781
782
783 return $fields;
784 }
785
792 public static function NotifyComment($eventId, $params)
793 {
794 if (!Loader::includeModule("im") || (int)$eventId <= 0)
795 {
796 return;
797 }
798
799 $userId = (int)$params["USER_ID"];
800 if ($event = CCalendarEvent::GetById($eventId))
801 {
802 $instanceDate = false;
803
804 if (
805 !isset($params['LOG'])
806 && Loader::includeModule('socialnetwork')
807 )
808 {
810 [],
811 ["ID" => $params["LOG_ID"]],
812 false,
813 false,
814 ["ID", "SOURCE_ID", "PARAMS"]
815 );
816 $arLog = $dbResult->Fetch();
817 }
818 else
819 {
820 $arLog = $params['LOG'];
821 }
822
823 if ($arLog)
824 {
825 if ($arLog['PARAMS'])
826 {
827 $arLog['PARAMS'] = unserialize($arLog['PARAMS'], ['allowed_classes' => false]);
828 if (!is_array($arLog['PARAMS']))
829 {
830 $arLog['PARAMS'] = [];
831 }
832 }
833
834 if (isset($arLog['PARAMS']['COMMENT_XML_ID']) && $arLog['PARAMS']['COMMENT_XML_ID'])
835 {
836 $instanceDate = CCalendarEvent::ExtractDateFromCommentXmlId($arLog['PARAMS']['COMMENT_XML_ID']);
837 }
838 }
839
840 $gender = null;
842 'filter' => ['=ID' => $userId],
843 'select' => ['ID', 'PERSONAL_GENDER']
844 ]);
845
846 if (($user = $res->fetch()) && in_array($user['PERSONAL_GENDER'], ['F', 'M']))
847 {
848 $gender = $user['PERSONAL_GENDER'];
849 }
850
851 $imMessageFields = [
852 "FROM_USER_ID" => $userId,
853 "NOTIFY_TYPE" => IM_NOTIFY_FROM,
854 "NOTIFY_MODULE" => "calendar",
855 "NOTIFY_EVENT" => "event_comment"
856 ];
857
858 $aId = $event['PARENT_ID'] ?? $event['ID'];
859
860 // Here we don't need info about users
861 $attendees = CCalendarEvent::GetAttendees($aId);
862 if (is_array($attendees) && is_array($attendees[$aId] ?? null))
863 {
864 if (!$instanceDate)
865 {
866 $instanceDate = CCalendar::Date(CCalendar::Timestamp($event['DATE_FROM']), false);
867 }
868
869 $attendees = $attendees[$aId];
870
871 $excludeUserIdList = [];
872
873 if (
874 $arLog
875 && Loader::includeModule('socialnetwork')
876 )
877 {
878 $res = \Bitrix\Socialnetwork\LogFollowTable::getList([
879 'filter' => [
880 "=CODE" => "L".$arLog['ID'],
881 "=TYPE" => "N"
882 ],
883 'select' => ['USER_ID']
884 ]);
885
886 while ($unFollower = $res->fetch())
887 {
888 $excludeUserIdList[] = (int)$unFollower["USER_ID"];
889 }
890 }
891
892 $commentCropped = truncateText(CTextParser::clearAllTags($params['MESSAGE']), 120);
893 foreach($attendees as $attendee)
894 {
895 $attendeeId = (int)$attendee['USER_ID'];
896 if (in_array($attendeeId, $excludeUserIdList, true))
897 {
898 continue;
899 }
900
901 $url = CCalendar::GetPathForCalendarEx($attendeeId);
902 $url = CHTTP::urlAddParams($url, ['EVENT_ID' => $eventId, 'EVENT_DATE' => $instanceDate]);
903
904 if ($attendeeId !== $userId && $attendee["STATUS"] !== 'N')
905 {
906 $imMessageFields['TO_USER_ID'] = $attendeeId;
907
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"],
910 $commentCropped,
911 $gender,
912 $languageId
913 );
914
915 $imMessageFields['NOTIFY_MESSAGE_OUT'] = fn (?string $languageId = null) => self::getCommentAddNotifyMessage(
916 $event["NAME"],
917 $commentCropped,
918 $gender,
919 $languageId
920 ) . ($url ? ' (' . $url . ')' : '');
921
922 $imMessageFields["NOTIFY_TAG"] = "CALENDAR|COMMENT|".$aId."|".$instanceDate;
923
924 CIMNotify::Add($imMessageFields);
925 }
926 }
927 }
928 }
929 }
930
931 private static function getCommentAddNotifyMessage($eventTitle, $comment, $gender = null, $languageId = null): ?string
932 {
933 $phrase = $gender ? 'EC_COMMENT_MESSAGE_ADD_' . $gender : 'EC_COMMENT_MESSAGE_ADD';
934
935 return Loc::getMessage(
936 $phrase,
937 [
938 '#EVENT_TITLE#' => $eventTitle,
939 '#COMMENT#' => $comment,
940 ],
941 $languageId
942 );
943 }
944
948 public static function ClearNotifications($eventId = false, $userId = false): void
949 {
950 if (Loader::includeModule("im"))
951 {
952 if ($eventId && $userId)
953 {
954 CIMNotify::DeleteByTag("CALENDAR|INVITE|".$eventId."|".$userId);
955 CIMNotify::DeleteByTag("CALENDAR|STATUS|".$eventId."|".$userId);
956 CIMNotify::DeleteByTag("CALENDAR|ICS|".$eventId."|".$userId);
957 }
958 elseif($eventId)
959 {
960 CIMNotify::DeleteBySubTag("CALENDAR|INVITE|".$eventId);
961 CIMNotify::DeleteBySubTag("CALENDAR|STATUS|".$eventId);
962 CIMNotify::DeleteBySubTag("CALENDAR|ICS|".$eventId);
963 }
964 }
965 }
966
967 private static function NotifyFailIcalInvite($fields = [], $params = [])
968 {
969 $fields['NOTIFY_EVENT'] = "info";
970 $fields['NOTIFY_TAG'] = "CALENDAR|INVITE|"."icalfail";
971 $fields['NOTIFY_SUB_TAG'] = "CALENDAR|INVITE|"."icalfail";
972
973 foreach ($params['items'] as $item)
974 {
975 if (is_string($item))
976 {
977 $usersList[] = $item;
978 }
979 if (isset($item['email']) && is_string($item['email']))
980 {
981 $usersList[] = $item['email'];
982 }
983 }
984
985 $userString = implode(', ', $usersList);
986
987 if ($params['icalMethod'] === 'cancel')
988 {
989 $fields['MESSAGE'] = fn (?string $languageId = null) => Loc::getMessage(
990 'EC_NOTIFY_FAIL_ICAL_CANCEL',
991 [
992 '#USERS_LIST#' => $userString,
993 '#NAME#' => $params['name'],
994 ],
995 $languageId
996 );
997
998 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) => Loc::getMessage(
999 'EC_NOTIFY_FAIL_ICAL_CANCEL_OUT',
1000 [
1001 '#USERS_LIST#' => $userString,
1002 '#NAME#' => $params['name'],
1003 ],
1004 $languageId
1005 );
1006
1007 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
1008 'EC_MESS_FAIL_ICAL_INVITE_TITLE_CANCEL',
1009 ['#TITLE#' => $params['name']],
1010 $languageId
1011 );
1012 }
1013 elseif ($params['icalMethod'] === 'edit')
1014 {
1015 $fields['MESSAGE'] = fn (?string $languageId = null) => Loc::getMessage(
1016 'EC_NOTIFY_FAIL_ICAL_EDIT',
1017 [
1018 '#USERS_LIST#' => $userString,
1019 '#NAME#' => $params['name'],
1020 ],
1021 $languageId
1022 );
1023
1024 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) => Loc::getMessage(
1025 'EC_NOTIFY_FAIL_ICAL_EDIT_OUT',
1026 [
1027 '#USERS_LIST#' => $userString,
1028 '#NAME#' => $params['name'],
1029 ],
1030 $languageId);
1031
1032 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
1033 'EC_MESS_FAIL_ICAL_INVITE_TITLE_EDIT',
1034 ['#TITLE#' => $params['name']],
1035 $languageId
1036 );
1037 }
1038 elseif ($params['icalMethod'] === 'request')
1039 {
1040 $fields['MESSAGE'] = fn (?string $languageId = null) => Loc::getMessage(
1041 'EC_NOTIFY_FAIL_ICAL_REQUEST',
1042 [
1043 '#USERS_LIST#' => $userString,
1044 '#NAME#' => $params['name'],
1045 ],
1046 $languageId
1047 );
1048
1049 $fields['MESSAGE_OUT'] = fn (?string $languageId = null) => Loc::getMessage(
1050 'EC_NOTIFY_FAIL_ICAL_REQUEST_OUT',
1051 [
1052 '#USERS_LIST#' => $userString,
1053 '#NAME#' => $params['name'],
1054 ],
1055 $languageId
1056 );
1057
1058 $fields['TITLE'] = fn (?string $languageId = null) => Loc::getMessage(
1059 'EC_MESS_FAIL_ICAL_INVITE_TITLE_REQUEST',
1060 ['#TITLE#' => $params['name']],
1061 $languageId
1062 );
1063 }
1064
1065 return $fields;
1066 }
1067
1068 public static function DeleteLocation($fields = [], $params = [])
1069 {
1070 $fields['NOTIFY_EVENT'] = "delete_location";
1071 $fields['FROM_USER_ID'] = (int)$params["userId"];
1072 $fields['TO_USER_ID'] = (int)$params["guestId"];
1073 $fields['NOTIFY_TAG'] = "CALENDAR|LOCATION|".$params['locationId']."|". (int)$params["userId"];
1074 $fields['NOTIFY_SUB_TAG'] = "CALENDAR|LOCATION|".$params['locationId'];
1075
1076 $fields['MESSAGE'] = fn (?string $languageId = null) => Loc::getMessage(
1077 'EC_NOTIFY_DELETE_LOCATION',
1078 ['#LOCATION#' => $params["location"]],
1079 $languageId
1080 );
1081
1082 return $fields;
1083 }
1084
1085 public static function CancelBooking($fields = [], $params = [])
1086 {
1087 $fields['NOTIFY_EVENT'] = 'release_location';
1088 $fields['FROM_USER_ID'] = (int)$params['userId'];
1089 $fields['TO_USER_ID'] = (int)$params['guestId'];
1090 $fields['NOTIFY_TAG'] =
1091 'CALENDAR|LOCATION|' . (int)$params['locationId']
1092 . '|' . (int)$params['userId'] . '|' . (int)$params['eventId'] . '|' . 'cancel'
1093 ;
1094 $fields['NOTIFY_SUB_TAG'] = 'CALENDAR|LOCATION|' . $params['locationId'];
1095
1096 $notificationCode = match ($params['recursionMode'])
1097 {
1098 'all' => 'EC_NOTIFY_CANCEL_BOOKING_ALL',
1099 'next' => 'EC_NOTIFY_CANCEL_BOOKING_NEXT',
1100 default => 'EC_NOTIFY_CANCEL_BOOKING_THIS',
1101 };
1102
1103 $fields['MESSAGE'] = fn (?string $languageId = null) =>
1104 Loc::getMessage(
1105 $notificationCode,
1106 [
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)
1112 : ''
1113 ,
1114 '#FROM_TIME#' => $params['fields']['DT_SKIP_TIME'] === 'N'
1115 ? Loc::getMessage(
1116 'EC_NOTIFY_CANCEL_BOOKING_TIME',
1117 [
1118 '#FROM_TIME#'=> mb_substr($params['from'], -5, 5)
1119 ],
1120 $languageId
1121 )
1122 : ''
1123 ,
1124 ],
1125 $languageId
1126 )
1127 . Loc::getMessage('EC_NOTIFY_CANCEL_BOOKING_ENDING', null, $languageId)
1128 ;
1129
1130 return $fields;
1131 }
1132
1133 private static function IcsLink(array $fields = [], array $params = []): array
1134 {
1135 $fields['NOTIFY_EVENT'] = 'info';
1136 $fields['FROM_USER_ID'] = (int)$params['guestId'];
1137 $fields['TO_USER_ID'] = (int)$params['userId'];
1138 $fields['NOTIFY_TAG'] = 'CALENDAR|ICS|' . $params['eventId'] . '|' . (int)$params['userId'];
1139 $fields['NOTIFY_SUB_TAG'] = 'CALENDAR|ICS|' . $params['eventId'];
1140 $uri = sprintf(
1141 '%s/calendar/ics/?EVENT_ID=%d',
1142 UrlManager::getInstance()->getHostUrl(),
1143 $params['eventId']
1144 );
1145
1146 $fields['MESSAGE'] = static fn (?string $languageId = null) =>
1147 Loc::getMessage(
1148 'EC_MESS_STATUS_NOTIFY_DOWNLOAD_ICS',
1149 [
1150 '#TITLE#' => '[url=' . $params['pathToEvent'] . ']' . $params['name'] . '[/url]',
1151 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId),
1152 '#LINK#' => $uri,
1153 ],
1154 $languageId
1155 );
1156
1157 $fields['MESSAGE_OUT'] = static fn (?string $languageId = null) =>
1158 Loc::getMessage(
1159 'EC_MESS_STATUS_NOTIFY_DOWNLOAD_ICS',
1160 [
1161 '#TITLE#' => '[url=' . $params['pathToEvent'] . ']' . $params['name'] . '[/url]',
1162 '#ACTIVE_FROM#' => self::getFromFormatted($params, $languageId),
1163 '#LINK#' => $uri,
1164 ],
1165 $languageId
1166 );
1167
1168 $fields['NOTIFY_LINK'] = $params['pathToEvent'];
1169
1170 return $fields;
1171 }
1172
1173 private static function getFromFormatted($params, ?string $languageId = null): string
1174 {
1175 $culture = \Bitrix\Main\Context::getCurrent()?->getCulture();
1176 $result = FormatDate($culture?->getFullDateFormat(), $params['from_timestamp'], false, $languageId);
1177
1178 if (($params['fields']['DT_SKIP_TIME'] ?? null) !== 'Y')
1179 {
1180 $result .= ' ' . FormatDate($culture?->getShortTimeFormat(), $params['from_timestamp'], false, $languageId);
1181 }
1182
1183 return $result;
1184 }
1185}
1186?>
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
Определения loader.php:13
static getList(array $parameters=array())
Определения datamanager.php:431
static CancelBooking($fields=[], $params=[])
Определения calendar_notify.php:1085
static CancelSharing($fields=[], $params=[])
Определения calendar_notify.php:655
static Cancel($fields=[], $params=[])
Определения calendar_notify.php:510
static Invite($fields=[], $params=[])
Определения calendar_notify.php:159
static Send($params)
Определения calendar_notify.php:13
static MeetingStatus($fields=[], $params=[])
Определения calendar_notify.php:688
static ClearNotifications($eventId=false, $userId=false)
Определения calendar_notify.php:948
static NotifyComment($eventId, $params)
Определения calendar_notify.php:792
static CancelInstance($fields=[], $params=[])
Определения calendar_notify.php:559
const PUSH_MESSAGE_MAX_LENGTH
Определения calendar_notify.php:11
static DeleteLocation($fields=[], $params=[])
Определения calendar_notify.php:1068
static ChangeNotify($fields=[], $params=[])
Определения calendar_notify.php:324
static MeetingStatusInfo($fields=[], $params=[])
Определения calendar_notify.php:728
static CancelAllReccurent($fields=[], $params=[])
Определения calendar_notify.php:605
static urlDeleteParams($url, $delete_params, $options=array())
Определения http.php:568
static urlAddParams($url, $add_params, $options=[])
Определения http.php:521
Определения im_notify.php:14
static GetList($arOrder=Array("ID"=> "DESC"), $arFilter=Array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array(), $arParams=array())
Определения log.php:338
static clearAllTags($text)
Определения textparser.php:2358
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
const IM_NOTIFY_CONFIRM
Определения include.php:36
const IM_NOTIFY_FROM
Определения include.php:37
if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/urlrewrite.php")) $uri
Определения urlrewrite.php:61
$culture
Определения include.php:61
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
Определения tools.php:871
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
</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."%"
Определения waybill.php:936
$comment
Определения template.php:15
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$dbResult
Определения updtr957.php:3
$url
Определения iframe.php:7
$fields
Определения yandex_run.php:501