1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
incominginvitationrequesthandler.php
См. документацию.
1<?php
2
3
4namespace Bitrix\Calendar\ICal\MailInvitation;
5
6
7use Bitrix\Calendar\Core\Event\Tools;
8use Bitrix\Calendar\ICal\Parser\Calendar;
9use Bitrix\Calendar\ICal\Parser\Dictionary;
10use Bitrix\Calendar\ICal\Parser\Event;
11use Bitrix\Calendar\ICal\Parser\ParserPropertyType;
12use Bitrix\Calendar\Internals\EventTable;
13use Bitrix\Calendar\Util;
14use Bitrix\Main\ArgumentException;
15use Bitrix\Main\Localization\Loc;
16use Bitrix\Main\ObjectException;
17use Bitrix\Main\ObjectPropertyException;
18use Bitrix\Main\SystemException;
19use Bitrix\Main\Type\Date;
20use Bitrix\Main\Type\DateTime;
21use CCalendar;
22
23IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/calendar/classes/general/calendar.php");
24IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/calendar/lib/ical/incomingeventmanager.php");
25
31{
32 public const MEETING_STATUS_ACCEPTED_CODE = 'accepted';
33 public const MEETING_STATUS_QUESTION_CODE = 'question';
34 public const MEETING_STATUS_DECLINED_CODE = 'declined';
35 public const SAFE_DELETED_YES = 'Y';
36
37 protected string $decision;
39 protected int $userId;
40 protected ?string $emailTo;
41 protected ?string $emailFrom;
42 protected ?array $organizer;
43
48 {
49 return new self();
50 }
51
58 public static function createWithDecision(int $userId, Calendar $icalCalendar, string $decision): IncomingInvitationRequestHandler
59 {
60 $handler = new self();
61 $handler->decision = $decision;
62 $handler->userId = $userId;
63 $handler->icalComponent = $icalCalendar;
64
65 return $handler;
66 }
67
75 public function handle(): bool
76 {
77 $icalEvent = $this->icalComponent->getEvent();
78 $localEvent = Helper::getEventByUId($icalEvent->getUid());
79 if ($localEvent === null)
80 {
81 $preparedEvent = $this->prepareEventToSave($icalEvent);
82 $parentId = $this->saveEvent($preparedEvent);
83 $childEvent = EventTable::query()
84 ->setSelect(['ID','PARENT_ID','OWNER_ID'])
85 ->where('PARENT_ID', $parentId)
86 ->where('OWNER_ID', $this->userId)
87 ->exec()->fetch()
88 ;
89
90 if ((int)$childEvent['ID'] > 0)
91 {
92 $this->eventId = (int)$childEvent['ID'];
93 return true;
94 }
95 }
96 else
97 {
98 $preparedEvent = $this->prepareToUpdateEvent($icalEvent, $localEvent);
99 if ($this->updateEvent($preparedEvent, $localEvent))
100 {
101 $this->eventId = $localEvent['ID'];
102 return true;
103 }
104 }
105
106 return false;
107 }
108
114 {
115 $this->decision = $decision;
116
117 return $this;
118 }
119
125 {
126 $this->icalComponent = $component;
127
128 return $this;
129 }
130
136 {
137 $this->emailTo = $emailTo;
138
139 return $this;
140 }
141
143 {
144 $this->emailFrom = $emailFrom;
145
146 return $this;
147 }
148
154 {
155 $this->userId = $userId;
156
157 return $this;
158 }
159
168 protected function prepareEventToSave(Event $icalEvent): array
169 {
170 $event = [];
171
172 if ($icalEvent->getStart() !== null)
173 {
174 if ($icalEvent->getStart()->getParameterValueByName('tzid') !== null)
175 {
176 $event['DATE_FROM'] = Helper::getIcalDateTime(
177 $icalEvent->getStart()->getValue(),
178 $icalEvent->getStart()->getParameterValueByName('tzid')
179 )->format(Date::convertFormatToPhp(FORMAT_DATETIME));
180 $event['TZ_FROM'] =
182 $icalEvent->getStart()->getParameterValueByName('tzid')
183 )->getName();
184 }
185 else
186 {
187 $event['DATE_FROM'] = Helper::getIcalDate($icalEvent->getStart()->getValue())
188 ->format(Date::convertFormatToPhp(FORMAT_DATE))
189 ;
190 $event['TZ_FROM'] = null;
191 $event['SKIP_TIME'] = 'Y';
192 }
193 }
194
195 if ($icalEvent->getEnd() !== null)
196 {
197 if ($icalEvent->getEnd()->getParameterValueByName('tzid') !== null)
198 {
199 $event['DATE_TO'] = Helper::getIcalDateTime(
200 $icalEvent->getEnd()->getValue(),
201 $icalEvent->getEnd()->getParameterValueByName('tzid')
202 )->format(Date::convertFormatToPhp(FORMAT_DATETIME));
203 $event['TZ_TO'] = Util::prepareTimezone(
204 $icalEvent->getEnd()->getParameterValueByName('tzid')
205 )->getName();
206 }
207 else
208 {
209 $event['DATE_TO'] = Helper::getIcalDate($icalEvent->getEnd()->getValue())
210 ->add('-1 days')
211 ->format(Date::convertFormatToPhp(FORMAT_DATE));
212 $event['TZ_TO'] = null;
213 }
214 }
215
216 if ($icalEvent->getName() !== null)
217 {
218 $event['NAME'] = !empty($icalEvent->getName()->getValue())
219 ? $icalEvent->getName()->getValue()
220 : Loc::getMessage('EC_DEFAULT_EVENT_NAME_V2')
221 ;
222 }
223
224 if ($icalEvent->getUid() !== null)
225 {
226 $event['DAV_XML_ID'] = $icalEvent->getUid();
227 }
228
229 if ($icalEvent->getModified() !== null)
230 {
231 $event['TIMESTAMP_X'] = Helper::getIcalDateTime($icalEvent->getModified()->getValue())
232 ->format(Date::convertFormatToPhp(FORMAT_DATETIME));
233 }
234
235 if ($icalEvent->getCreated() !== null)
236 {
237 $event['DATE_CREATE'] = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())
238 ->format(Date::convertFormatToPhp(FORMAT_DATETIME));
239 }
240
241 if ($icalEvent->getDtStamp() !== null)
242 {
243 $event['DT_STAMP'] = Helper::getIcalDateTime($icalEvent->getDtStamp()->getValue())
244 ->format(Date::convertFormatToPhp(FORMAT_DATETIME));
245 }
246
247 if ($icalEvent->getSequence() !== null)
248 {
249 $event['VERSION'] = $icalEvent->getSequence()->getValue();
250 }
251
252 if ($icalEvent->getRRule() !== null)
253 {
254 $rrule = $this->parseRRule($icalEvent->getRRule());
255 if (isset($rrule['FREQ']) && in_array($rrule['FREQ'], Dictionary::RRULE_FREQUENCY, true))
256 {
257 $event['RRULE']['FREQ'] = $rrule['FREQ'];
258
259 if (isset($rrule['COUNT']) && (int)$rrule['COUNT'] > 0)
260 {
261 $event['RRULE']['COUNT'] = $rrule['COUNT'];
262 }
263 elseif (isset($rrule['UNTIL']))
264 {
265 $now = Util::getDateObject(null, false)->getTimestamp();
266 try
267 {
268 $until = Helper::getIcalDateTime($rrule['UNTIL']);
269 }
270 catch (ObjectException $exception)
271 {
272 // 0181908
273 try
274 {
275 $until = new DateTime($rrule['UNTIL']);
276 }
277 catch (ObjectException $exception)
278 {
279 $until = new DateTime(CCalendar::GetMaxDate());
280 }
281 }
282
283 if ($now < $until->getTimestamp())
284 {
285 $event['RRULE']['UNTIL'] = $until->format(Date::convertFormatToPhp(FORMAT_DATE));
286 }
287 }
288
289 if ($rrule['FREQ'] === Dictionary::RRULE_FREQUENCY['weekly'] && isset($rrule['BYDAY']))
290 {
291 $event['RRULE']['BYDAY'] = $rrule['BYDAY'];
292 }
293
294 if (isset($rrule['INTERVAL']))
295 {
296 $event['RRULE']['INTERVAL'] = $rrule['INTERVAL'];
297 }
298 else
299 {
300 $event['RRULE']['INTERVAL'] = 1;
301 }
302 }
303 }
304
305 $event['DESCRIPTION'] = $icalEvent->getDescription() !== null
306 ? $icalEvent->getDescription()->getValue()
307 : ''
308 ;
309
310
311 $this->organizer = $this->parseOrganizer($icalEvent->getOrganizer());
312 $event['MEETING_HOST'] = Helper::getUserIdByEmail($this->organizer);
313
314 $event['OWNER_ID'] = $this->userId;
315 $event['IS_MEETING'] = 1;
316 $event['SECTION_CAL_TYPE'] = 'user';
317 $event['ATTENDEES_CODES'] = ['U'.$event['OWNER_ID'], 'U'.$event['MEETING_HOST']];
318
319 $event['MEETING_STATUS'] = Tools\Dictionary::MEETING_STATUS['Host'];
320
321 $event['ACCESSIBILITY'] = 'free';
322 $event['IMPORTANCE'] = 'normal';
323 $event['REMIND'][] = [
324 'type' => 'min',
325 'count' => '15',
326 ];
327 $event['MEETING'] = [
328 'HOST_NAME' => $icalEvent->getOrganizer() !== null
329 ? $icalEvent->getOrganizer()->getParameterValueByName('cn')
330 : $this->organizer['EMAIL'],
331 'NOTIFY' => 1,
332 'REINVITE' => 0,
333 'ALLOW_INVITE' => 0,
334 'MEETING_CREATOR' => $event['MEETING_HOST'],
335 'EXTERNAL_TYPE' => 'mail',
336 ];
337
338 if ($this->decision === 'declined')
339 {
340 $event['DELETED'] = self::SAFE_DELETED_YES;
341 }
342
343 if ($icalEvent->getLocation() !== null)
344 {
345 $event['LOCATION'] = CCalendar::GetTextLocation($icalEvent->getLocation()->getValue() ?? null);
346 }
347
348 return $event;
349 }
350
355 protected function saveEvent(array $preparedEvent): int
356 {
357 $preparedEvent['OWNER_ID'] = $preparedEvent['MEETING_HOST'];
358 $preparedEvent['MEETING']['MAILTO'] = $this->organizer['EMAIL'] ?? $this->emailTo;
359 $preparedEvent['MEETING']['MAIL_FROM'] = $this->emailFrom;
360
361 if ($this->icalComponent->getEvent()->getAttendees())
362 {
363 $preparedEvent['DESCRIPTION'] .= "\r\n"
364 . Loc::getMessage('EC_EDEV_GUESTS') . ": "
365 . $this->parseAttendeesForDescription($this->icalComponent->getEvent()->getAttendees());
366 }
367
368 if ($this->icalComponent->getEvent()->getAttachments())
369 {
370 $preparedEvent['DESCRIPTION'] .= "\r\n"
371 . Loc::getMessage('EC_FILES_TITLE') . ': '
372 . $this->parseAttachmentsForDescription($this->icalComponent->getEvent()->getAttachments());
373 }
374
375 $id = (int)CCalendar::SaveEvent([
376 'arFields' => $preparedEvent,
377 'autoDetectSection' => true,
378 ]);
379
380 \CCalendarNotify::Send([
381 "mode" => 'invite',
382 "name" => $preparedEvent['NAME'] ?? null,
383 "from" => $preparedEvent['DATE_FROM'] ?? null,
384 "to" => $preparedEvent['DATE_TO'] ?? null,
385 "location" => CCalendar::GetTextLocation($preparedEvent["LOCATION"] ?? null),
386 "guestId" => $this->userId ?? null,
387 "eventId" => $id,
388 "userId" => $preparedEvent['MEETING_HOST'],
389 "fields" => $preparedEvent,
390 ]);
391 \CCalendar::UpdateCounter([$this->userId], [$id]);
392
393 return $id;
394 }
395
400 protected function parseAttendeesForDescription(?array $attendeesCollection): string
401 {
402 if (!$attendeesCollection)
403 {
404 return '';
405 }
406
407 $attendees = [];
408 foreach ($attendeesCollection as $attendee)
409 {
413 $email = $this->getMailTo($attendee->getValue());
414 if (
415 !$attendee->getParameterValueByName('cn')
416 || $attendee->getParameterValueByName('cn') === $email
417 )
418 {
419 $attendees[] = $email;
420 }
421 else
422 {
423 $attendees[] = $attendee->getParameterValueByName('cn') . " (" . $email . ")";
424 }
425 }
426
427 return implode(", ", $attendees);
428 }
429
435 {
436 if (!$organizer)
437 {
438 return [];
439 }
440
441 $result = [];
442 $result['EMAIL'] = $this->getMailTo($organizer->getValue());
443 $parts = [];
444 if (!empty($organizer->getParameterValueByName('cn')))
445 {
446 $parts = explode(" ", $organizer->getParameterValueByName('cn'), 2);
447 }
448
449 if (isset($parts[0]))
450 {
451 $result['NAME'] = $parts[0];
452 }
453 if (isset($parts[1]))
454 {
455 $result['LAST_NAME'] = $parts[1];
456 }
457 return $result;
458 }
459
469 protected function prepareToUpdateEvent(Event $icalEvent, array $localEvent): array
470 {
471 $event = [];
472
473 if ($icalEvent->getStart() !== null)
474 {
475 if ($icalEvent->getStart()->getParameterValueByName('tzid') !== null)
476 {
477 $event['DATE_FROM'] = Helper::getIcalDateTime(
478 $icalEvent->getStart()->getValue(),
479 $icalEvent->getStart()->getParameterValueByName('tzid')
480 )->format(Date::convertFormatToPhp(FORMAT_DATETIME));
481 $event['TZ_FROM'] = Util::prepareTimezone(
482 $icalEvent->getStart()->getParameterValueByName('tzid')
483 )->getName();
484 $event['DT_SKIP_TIME'] = 'N';
485 $event['SKIP_TIME'] = false;
486 }
487 else
488 {
489 $event['DATE_FROM'] = Helper::getIcalDate($icalEvent->getStart()->getValue())
490 ->format(Date::convertFormatToPhp(FORMAT_DATE));
491 $event['TZ_FROM'] = null;
492 $event['DT_SKIP_TIME'] = 'Y';
493 $event['SKIP_TIME'] = true;
494 }
495 }
496 else
497 {
498 $event['DATE_FROM'] = $localEvent['DATE_FROM'];
499 $event['TZ_FROM'] = $localEvent['TZ_FROM'];
500 }
501
502 if ($icalEvent->getEnd() !== null)
503 {
504 if ($icalEvent->getEnd()->getParameterValueByName('tzid') !== null)
505 {
506 $event['DATE_TO'] = Helper::getIcalDateTime(
507 $icalEvent->getEnd()->getValue(),
508 $icalEvent->getEnd()->getParameterValueByName('tzid')
509 )->format(Date::convertFormatToPhp(FORMAT_DATETIME));
510 $event['TZ_TO'] = Util::prepareTimezone(
511 $icalEvent->getEnd()->getParameterValueByName('tzid')
512 )->getName();
513 }
514 else
515 {
516 $event['DATE_TO'] = Helper::getIcalDate($icalEvent->getEnd()->getValue())
517 ->add('-1 days')
518 ->format(Date::convertFormatToPhp(FORMAT_DATE));
519 $event['TZ_TO'] = null;
520 }
521 }
522 else
523 {
524 $event['DATE_TO'] = $localEvent['DATE_TO'];
525 $event['TZ_TO'] = $localEvent['TZ_TO'];
526 }
527
528 if ($icalEvent->getName() !== null)
529 {
530 $event['NAME'] = $icalEvent->getName()->getValue();
531 }
532
533 if ($icalEvent->getModified() !== null)
534 {
535 $event['TIMESTAMP_X'] = Helper::getIcalDateTime($icalEvent->getModified()->getValue())
536 ->format(Date::convertFormatToPhp(FORMAT_DATETIME));
537 }
538
539
540 if ($icalEvent->getCreated() !== null)
541 {
542 $invitationDateCreate = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())->getTimestamp();
543 $localDateCreate = Util::getDateObject($localEvent['DATE_CREATE'])->getTimestamp();
544 if ($invitationDateCreate === $localDateCreate)
545 {
546 $event['DATE_CREATE'] = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())
547 ->format(Date::convertFormatToPhp(FORMAT_DATETIME))
548 ;
549 }
550 }
551
552 if ($icalEvent->getDtStamp() !== null)
553 {
554 $event['DT_STAMP'] = Helper::getIcalDateTime($icalEvent->getDtStamp()->getValue())
555 ->format(Date::convertFormatToPhp(FORMAT_DATETIME));
556 }
557
558 if ($icalEvent->getSequence() !== null && $icalEvent->getSequence()->getValue() > $localEvent['VERSION'])
559 {
560 $event['VERSION'] = $icalEvent->getSequence()->getValue();
561 }
562
563 if ($icalEvent->getDescription() !== null)
564 {
565 $event['DESCRIPTION'] = $icalEvent->getDescription()->getValue();
566 }
567 else
568 {
569 $event['DESCRIPTION'] = null;
570 }
571
572 if ($icalEvent->getRRule() !== null)
573 {
574 $rrule = $this->parseRRule($icalEvent->getRRule());
575 if (isset($rrule['FREQ']) && in_array($rrule['FREQ'], Dictionary::RRULE_FREQUENCY, true))
576 {
577 $event['RRULE']['FREQ'] = $rrule['FREQ'];
578
579 if (isset($rrule['COUNT']) && (int)$rrule['COUNT'] > 0)
580 {
581 $event['RRULE']['COUNT'] = $rrule['COUNT'];
582 }
583 elseif (isset($rrule['UNTIL']))
584 {
585 $now = Util::getDateObject(null, false)->getTimestamp();
586 try
587 {
588 $until = Helper::getIcalDateTime($rrule['UNTIL']);
589 }
590 catch (ObjectException $exception)
591 {
592 // 0181908
593 try
594 {
595 $until = new DateTime($rrule['UNTIL']);
596 }
597 catch (ObjectException $exception)
598 {
599 $until = new DateTime(CCalendar::GetMaxDate());
600 }
601 }
602
603 if ($now < $until->getTimestamp())
604 {
605 $event['RRULE']['UNTIL'] = $until->format(Date::convertFormatToPhp(FORMAT_DATE));
606 }
607 }
608
609 if ($rrule['FREQ'] === Dictionary::RRULE_FREQUENCY['weekly'] && isset($rrule['BYDAY']))
610 {
611 $event['RRULE']['BYDAY'] = $rrule['BYDAY'];
612 }
613
614 if (isset($rrule['INTERVAL']))
615 {
616 $event['RRULE']['INTERVAL'] = $rrule['INTERVAL'];
617 }
618 else
619 {
620 $event['RRULE']['INTERVAL'] = 1;
621 }
622 }
623 }
624
625 $organizer = [];
626 if ($icalEvent->getOrganizer() !== null)
627 {
628 $organizer = $this->parseOrganizer($icalEvent->getOrganizer());
629 }
630
631 $event['OWNER_ID'] = $this->userId;
632 $event['MEETING_HOST'] = count($organizer)
633 ? Helper::getUserIdByEmail($organizer)
634 : $localEvent['MEETING_HOST']
635 ;
636 $event['IS_MEETING'] = 1;
637 $event['SECTION_CAL_TYPE'] = 'user';
638 $event['ATTENDEES_CODES'] = ['U'.$event['OWNER_ID'], 'U'.$event['MEETING_HOST']];
639 $event['MEETING_STATUS'] = match ($this->decision) {
640 self::MEETING_STATUS_ACCEPTED_CODE => Tools\Dictionary::MEETING_STATUS['Yes'],
641 self::MEETING_STATUS_DECLINED_CODE => Tools\Dictionary::MEETING_STATUS['No'],
642 default => Tools\Dictionary::MEETING_STATUS['Question'],
643 };
644 $event['ACCESSIBILITY'] = 'free';
645 $event['IMPORTANCE'] = 'normal';
646 $event['REMIND'] = [
647 'type' => 'min',
648 'count' => '15',
649 ];
650 $organizerCn = $icalEvent->getOrganizer()?->getParameterValueByName('cn');
651 $meeting = unserialize($localEvent['MEETING'], ['allowed_classes' => false]);
652 $event['MEETING'] = [
653 'HOST_NAME' => $organizerCn ?? $organizer['EMAIL'] ?? $meeting['HOST_NAME'] ?? null,
654 'NOTIFY' => $meeting['NOTIFY'] ?? 1,
655 'REINVITE' => $meeting['REINVITE'] ?? 0,
656 'ALLOW_INVITE' => $meeting['ALLOW_INVITE'] ?? 0,
657 'MEETING_CREATOR' => $meeting['MEETING_CREATOR'] ?? $event['MEETING_HOST'],
658 'EXTERNAL_TYPE' => 'mail',
659 ];
660 $event['PARENT_ID'] = $localEvent['PARENT_ID'] ?? null;
661 $event['ID'] = $localEvent['ID'] ?? null;
662 $event['CAL_TYPE'] = $localEvent['CAL_TYPE'] ?? null;
663
664 if ($this->decision === 'declined')
665 {
666 $event['DELETED'] = self::SAFE_DELETED_YES;
667 }
668
669 if ($icalEvent->getLocation() !== null)
670 {
671 $event['LOCATION'] = CCalendar::GetTextLocation($icalEvent->getLocation()->getValue() ?? null);
672 }
673
674 return $event;
675 }
676
682 protected function updateEvent(array $updatedEvent, array $localEvent): bool
683 {
684 $updatedEvent['ID'] = $updatedEvent['PARENT_ID'];
685 $updatedEvent['OWNER_ID'] = $updatedEvent['MEETING_HOST'];
686 $updatedEvent['MEETING']['MAILTO'] = $this->organizer['EMAIL'] ?? $this->emailTo;
687 $updatedEvent['MEETING']['MAIL_FROM'] = $this->emailFrom;
688
689 if ($this->icalComponent->getEvent()->getAttendees())
690 {
691 $updatedEvent['DESCRIPTION'] .= "\r\n"
692 . Loc::getMessage('EC_EDEV_GUESTS') . ": "
693 . $this->parseAttendeesForDescription($this->icalComponent->getEvent()->getAttendees());
694 }
695
696 if ($this->icalComponent->getEvent()->getAttachments())
697 {
698 $updatedEvent['DESCRIPTION'] .= "\r\n"
699 . Loc::getMessage('EC_FILES_TITLE') . ': '
700 . $this->parseAttachmentsForDescription($this->icalComponent->getEvent()->getAttachments());
701 }
702
703 \CCalendar::SaveEvent([
704 'arFields' => $updatedEvent,
705 ]);
706
707 $entryChanges = \CCalendarEvent::CheckEntryChanges($updatedEvent, $localEvent);
708
709 \CCalendarNotify::Send([
710 'mode' => 'change_notify',
711 'name' => $updatedEvent['NAME'] ?? null,
712 "from" => $updatedEvent['DATE_FROM'] ?? null,
713 "to" => $updatedEvent['DATE_TO'] ?? null,
714 "location" => CCalendar::GetTextLocation($updatedEvent["LOCATION"] ?? null),
715 "guestId" => $this->userId ?? null,
716 "eventId" => $updatedEvent['PARENT_ID'] ?? null,
717 "userId" => $updatedEvent['MEETING_HOST'],
718 "fields" => $updatedEvent,
719 "entryChanges" => $entryChanges,
720 ]);
721 \CCalendar::UpdateCounter([$this->userId], [$updatedEvent['ID']]);
722
723 return true;
724 }
725
726 protected function parseAttachmentsForDescription(array $icalAttachments): string
727 {
728 $res = [];
730 foreach ($icalAttachments as $attachment)
731 {
732 $link = $attachment->getValue();
733 if ($name = $attachment->getParameterValueByName('filename'))
734 {
735 $res[] = $name . ' (' . $link . ')';
736 }
737 else
738 {
739 $res[] = $link;
740 }
741 }
742
743 return implode(', ', $res);
744 }
745
746 private function parseRRule(ParserPropertyType $icalRRule): array
747 {
748 $result = [];
749 $parts = explode(";", $icalRRule->getValue());
750 foreach ($parts as $part)
751 {
752 [$name, $value] = explode("=", $part);
753 if ($name === 'BYDAY')
754 {
755 $value = explode(',', $value);
756 }
758 }
759
760 return $result;
761 }
762}
const BX_ROOT
Определения bx_root.php:3
static createWithDecision(int $userId, Calendar $icalCalendar, string $decision)
static prepareTimezone(?string $tz=null)
Определения util.php:80
static getDateObject(string $date=null, ?bool $fullDay=true, ?string $tz='UTC')
Определения util.php:107
</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
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
const FORMAT_DATETIME
Определения include.php:64
const FORMAT_DATE
Определения include.php:63
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
$name
Определения menu_edit.php:35
$value
Определения Param.php:39
$email
Определения payment.php:49
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
</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