3namespace Bitrix\Calendar\ICal;
5use Bitrix\Calendar\Core\Base\BaseException;
6use Bitrix\Calendar\Core\Event\Event;
7use Bitrix\Calendar\Util;
8use Bitrix\Main\Localization\Loc;
10Loc::loadMessages(
$_SERVER[
'DOCUMENT_ROOT'].
BX_ROOT.
'/modules/calendar/lib/ical/incomingeventmanager.php');
11Loc::loadMessages(__FILE__);
17 private const FILE_TYPE =
'text/calendar';
18 private const FILE_NAME =
'event';
19 private const FILE_EXTENSION =
'.ics';
20 private const MODULE_ID =
'calendar';
33 return self::$instance;
42 $fileId = \CFile::SaveFile($fileData,
'calendar');
44 if (!$this->checkIcsFileExistence($fileId))
56 'name' => self::FILE_NAME . self::FILE_EXTENSION,
57 'type' => self::FILE_TYPE,
58 'MODULE_ID' => self::MODULE_ID,
63 private function checkIcsFileExistence(
int $fileId): bool
65 return is_array(\CFile::GetFileArray($fileId));
71 if (
$event->isFullDayEvent())
73 $dtEnd += \CCalendar::GetDayLen();
75 $icsBuilder = new \Bitrix\Calendar\ICal\IcsBuilder(
77 'summary' =>
$event->getName() ??
'',
78 'description' => $this->prepareEventDescription(
$event,
$params),
82 'location' => $this->prepareLocationField(
$event),
83 'uid' =>
$event->getUid() ?? uniqid(
'',
true),
84 'sequence' =>
$event->getVersion(),
85 'last-modified' =>
$event->getDateModified()->getTimestamp(),
86 'priority' =>
$event->getImportance(),
89 $icsBuilder->setFullDayMode(
$event->isFullDayEvent());
90 if (isset(
$params[
'organizer']))
92 $organizer =
$params[
'organizer'];
93 $icsBuilder->setOrganizer($organizer[
'name'], $organizer[
'email'] ??
null, $organizer[
'phone'] ??
null);
96 if (!empty(
$params[
'attendees']))
98 $icsBuilder->setAttendees(
$params[
'attendees']);
101 if (!
$event->isFullDayEvent())
103 $icsBuilder->setConfig(
105 'timezoneFrom' =>
$event->getStartTimeZone(),
106 'timezoneTo' =>
$event->getEndTimeZone() ??
$event->getStartTimeZone(),
111 if (
$event->isRecurrence() &&
$event->getRecurringRule() !==
null)
113 $icsBuilder->setRrule(
$event->getRecurringRule());
116 if (
$event->isRecurrence() &&
$event->getExcludedDateCollection()->count() > 0)
118 $icsBuilder->setExclude(
$event->getExcludedDateCollection());
121 return $icsBuilder->render();
126 $languageId = \CCalendar::getUserLanguageId(
$event->getOwner()?->getId());
127 $eventDescription =
'';
130 $event->getAttendeesCollection()
131 && ($attendeesCodes =
$event->getAttendeesCollection()->getAttendeesCodes())
132 &&
count($attendeesCodes) > 1
136 $this->formatAttendeesDescription($attendeesCodes,
$event->getParentId(), $languageId)
141 if (!empty(
$params[
'eventUrl']))
143 if (!empty($eventDescription))
145 $eventDescription .=
'\\n\\n';
148 $eventDescription .= Loc::getMessage(
'EC_EVENT_LINK') .
$params[
'eventUrl'];
151 if (!empty(
$params[
'conferenceUrl']))
153 if (!empty($eventDescription))
155 $eventDescription .=
'\\n\\n';
158 $eventDescription .= Loc::getMessage(
'EC_CONFERENCE_LINK') .
$params[
'conferenceUrl'];
161 if (!empty(
$event->getDescription()))
163 if (!empty($eventDescription))
165 $eventDescription .=
'\\n\\n';
168 $eventDescription .= Loc::getMessage(
'EC_CALENDAR_ICS_COMMENT') .
': '.
$event->getDescription();
171 return $eventDescription;
174 private function formatAttendeesDescription(
array $codes, ?
int $parentId,
string $languageId): string
176 $users = \CCalendar::GetDestinationUsers($codes,
true);
178 $names = array_map(
static function(
$user) {
179 return $user[
'FORMATTED_NAME'];
182 $result = Loc::getMessage(
'EC_ATTENDEES_LIST_TITLE') .
": ";
185 $result .= implode(
", ", $names);
191 private function prepareLocationField(Event
$event): string
193 $locationProperty =
$event->getLocation();
195 return $locationProperty ? \CCalendar::getTextLocation($locationProperty->getActualLocation()) :
'';
getIcsFileContent(Event $event, array $params)
prepareEventDescription(Event $event, array $params)
createIcsFile(Event $event, array $params)
static getTimestamp($date, $round=true, $getTime=true)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
</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']