1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
eventconverter.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\Sync\Google;
4
5use Bitrix\Calendar\Core\Base\BaseException;
6use Bitrix\Calendar\Core\Base\Date;
7use Bitrix\Calendar\Core\Event\Event;
8use Bitrix\Calendar\Core\Event\Properties\RecurringEventRules;
9use Bitrix\Calendar\Core\Event\Properties\Remind;
10use Bitrix\Calendar\Sync\Connection\EventConnection;
11use Bitrix\Calendar\Sync\Entities\InstanceMap;
12use Bitrix\Calendar\Sync\Entities\SyncEvent;
13use Bitrix\Calendar\Sync\Util\EventDescription;
14
16{
17 protected const MAX_COUNT_REMINDERS_FOR_SYNC = 5;
18
26 private Event $originalEvent;
30 private ?EventConnection $eventConnection;
31
37 public function __construct(
39 ?EventConnection $eventConnection = null,
41 )
42 {
43 $this->originalEvent = $event;
44 $this->eventConnection = $eventConnection;
45 $this->instanceCollection = $instanceCollection;
46 }
47
52 public function convertForCreate(): array
53 {
54 $event = [];
55
56 $event['summary'] = $this->originalEvent->getName();
57 $event['description'] = $this->prepareDescription($this->originalEvent);
58 $event['transparency'] = $this->prepareAccessibility();
59 $event = array_merge($event, $this->prepareDate());
60 $event['reminders'] = $this->prepareReminders();
61 $event['location'] = $this->prepareLocation();
62 $event['visibility'] = $this->prepareVisibility();
63 // $event['sequence'] = $this->originalEvent->getVersion() - Helper::VERSION_DIFFERENCE;
64
65 if ($this->originalEvent->getUid() !== null)
66 {
67 $event['iCalUID'] = $this->originalEvent->getUid();
68 }
69
70 if ($this->originalEvent->isRecurrence())
71 {
72 $event['recurrence'] = $this->prepareRecurrenceRule();
73 }
74
75 return $event;
76 }
77
85 private function prepareDescription(Event $event): string
86 {
87 $description = \CCalendarEvent::ParseText((new EventDescription())->prepareForExport($event));
88
89 return preg_replace("/<br>/i", "\r\n", $description);
90 }
91
96 public function convertForUpdate(): array
97 {
98 if ($this->eventConnection === null)
99 {
100 throw new BaseException('you should initialize eventConnection before update event');
101 }
102
103 $event = $this->convertForCreate();
104 if ($this->eventConnection && $this->eventConnection->getVendorEventId() !== null)
105 {
106 $event['id'] = $this->eventConnection->getVendorEventId();
107
108 if ($this->originalEvent->isInstance())
109 {
110 $event['recurringEventId'] = $this->eventConnection->getRecurrenceId();
111 }
112 }
113
114 $this->eventConnection->setData($this->eventConnection->fetchData());
115
116 if (($eventConnectionData = $this->eventConnection->getData()) && !empty($eventConnectionData['attendees']))
117 {
118 $event['attendees'] = $eventConnectionData['attendees'];
119 }
120
121 return $event;
122 }
123
130 {
131 $event = $this->convertForUpdate();
132 $event['status'] = 'cancelled';
133
134 return $event;
135 }
136
140 public function prepareAccessibility(): string
141 {
142 return $this->originalEvent->getAccessibility() === 'busy'
143 ? 'opaque'
144 : 'transparent'
145 ;
146 }
147
151 public function prepareDate(): array
152 {
153 $date = [];
154
155 if ($this->originalEvent->isFullDayEvent())
156 {
157 $date['start']['date'] = $this->originalEvent->getStart()->format('Y-m-d');
158 $date['end']['date'] = $this->originalEvent->getEnd()->add(('+1 day'))->format('Y-m-d');
159 }
160 else
161 {
162 $date['start']['dateTime'] = $this->originalEvent->getStart()->format(Helper::DATE_TIME_FORMAT);
163 $date['start']['timeZone'] = $this->originalEvent->getStartTimeZone()
164 ? $this->originalEvent->getStartTimeZone()->getTimeZone()->getName()
165 : (new \DateTime())->getTimezone()->getName()
166 ;
167 $date['end']['dateTime'] = $this->originalEvent->getEnd()->format(Helper::DATE_TIME_FORMAT);
168 $date['end']['timeZone'] = $this->originalEvent->getEndTimeZone()
169 ? $this->originalEvent->getEndTimeZone()->getTimeZone()->getName()
170 : (new \DateTime())->getTimezone()->getName()
171 ;
172 }
173
174 if ($this->originalEvent->getOriginalDateFrom() !== null)
175 {
176 if ($this->originalEvent->isFullDayEvent())
177 {
178 $event['originalStartTime']['date'] = $this->originalEvent->getOriginalDateFrom()->format(Helper::DATE_FORMAT);
179 }
180 else
181 {
182 $event['originalStartTime']['dateTime'] = $this->originalEvent->getOriginalDateFrom()->format(Helper::DATE_TIME_FORMAT);
183 }
184 }
185
186 return $date;
187 }
188
192 private function prepareReminders(): array
193 {
194 $reminders = [];
195 $reminders['useDefault'] = false;
196
197 $remindCollection = $this->originalEvent->getRemindCollection();
198 if ($remindCollection && $remindCollection->count() > self::MAX_COUNT_REMINDERS_FOR_SYNC)
199 {
200 $remindCollection->sortFromStartEvent();
201 }
202
204 foreach ($remindCollection as $remind)
205 {
206 if (!$remind->isBeforeEventStart())
207 {
208 continue;
209 }
210
211 $reminders['overrides'][] = [
212 Remind::UNIT_MINUTES => $remind->getTimeBeforeStartInMinutes(),
213 'method' => 'popup',
214 ];
215
216 if (count($reminders['overrides']) >= self::MAX_COUNT_REMINDERS_FOR_SYNC)
217 {
218 break;
219 }
220 }
221
222 return $reminders;
223 }
224
231 private function prepareLocation(): string
232 {
233 if ($this->originalEvent->getLocation())
234 {
235 return \Bitrix\Calendar\Rooms\Util::getTextLocation((string)$this->originalEvent->getLocation());
236 }
237
238 return '';
239 }
240
244 private function prepareVisibility(): string
245 {
246 return $this->originalEvent->isPrivate()
247 ? 'private'
248 : 'public'
249 ;
250 }
251
255 private function prepareRecurrenceRule(): array
256 {
257 $rule = [];
258
259 if (!$this->originalEvent->isRecurrence())
260 {
261 return [];
262 }
263
264 $rule[] = $this->prepareDescriptionRecurrenceRule();
265
266 if ($this->originalEvent->getExcludedDateCollection() !== null)
267 {
268 array_push($rule, ...$this->prepareExcludedDates());
269 }
270
271 return $rule;
272 }
273
277 public function prepareDescriptionRecurrenceRule(): string
278 {
280 $eventRule = $this->originalEvent->getRecurringRule();
281 $descriptionRule = 'RRULE:';
282 $descriptionRule .= 'FREQ=' . $eventRule->getFrequency();
283 $descriptionRule .= ';INTERVAL=' . $eventRule->getInterval();
284
285 if ($eventRule->hasDay())
286 {
287 $descriptionRule .= ';BYDAY=' . implode(",", $eventRule->getByday());
288 }
289
290 if ($eventRule->hasCount())
291 {
292 $descriptionRule .= ';COUNT=' . $eventRule->getCount();
293 }
294 elseif ($eventRule->hasUntil())
295 {
296 $until = clone $eventRule->getUntil();
297 if (!$this->originalEvent->isFullDayEvent() && !$eventRule->isUntilEndOfTime())
298 {
299 $until = $until->add('1 day')->sub('1 second');
300 }
301 $descriptionRule .= ';UNTIL=' . $until->format(Helper::DATE_TIME_FORMAT_WITH_UTC_TIMEZONE);
302 }
303
304 return $descriptionRule;
305 }
306
310 public function prepareExcludedDates(): array
311 {
312 $rule = [];
313
314 if (
315 $this->originalEvent->getExcludedDateCollection()
316 && ($exdateCollection = $this->originalEvent->getExcludedDateCollection()->getDateCollectionNewerThanInterval())
317 )
318 {
319 $originalDateList = [];
320 if ($this->instanceCollection !== null)
321 {
323 foreach ($this->instanceCollection as $instance)
324 {
325 if ($originalDateFrom = $instance->getEvent()->getOriginalDateFrom())
326 {
327 $originalDateList[] = $originalDateFrom->format('Ymd');
328 }
329 }
330 }
331
332 if ($this->originalEvent->isFullDayEvent())
333 {
334 foreach ($exdateCollection as $exDate)
335 {
336 $date = $exDate->format('Ymd');
337 if (!in_array($date, $originalDateList, true))
338 {
339 $rule[] = 'EXDATE;VALUE=DATE:' . $date;
340 }
341 }
342 }
343 else
344 {
345 $postfix = (clone $this->originalEvent->getStart())
346 ->setTimezone(new \DateTimeZone('UTC'))
347 ->format('\\THis\\Z')
348 ;
350 foreach ($exdateCollection as $exDate)
351 {
352 $date = $exDate->format('Ymd');
353 if (!in_array($date, $originalDateList, true))
354 {
355 $rule[] = 'EXDATE;TZID=UTC:' . $date . $postfix;
356 }
357 }
358 }
359 }
360
361 return $rule;
362 }
363
367 public function convertForDelete(): array
368 {
369 return [
370 'sendUpdates' => 'all',
371 ];
372 }
373}
__construct(Event $event, ?EventConnection $eventConnection=null, ?InstanceMap $instanceCollection=null)
Определения eventconverter.php:37
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
Определения .description.php:24
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$instance
Определения ps_b24_final.php:14
</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