1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
incomingeventmanager.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\ICal;
4
5use Bitrix\Calendar\ICal\Builder\AttendeesCollection;
6use Bitrix\Calendar\ICal\MailInvitation\Helper;
7use Bitrix\Calendar\ICal\MailInvitation\IncomingInvitationRequestHandler;
8use Bitrix\Mail\Internals\MessageAccessTable;
9use Bitrix\Mail\MailboxTable;
10use Bitrix\Main\IO\FileNotFoundException;
11use Bitrix\Main\Localization\Loc;
12use Bitrix\Main\ORM\Fields\Relations\Reference;
13use Bitrix\Main\ORM\Query\Join;
14use Bitrix\Calendar\ICal\Basic\{Dictionary, ICalUtil};
15use Bitrix\Main\Type\Date;
16
17
19{
20 public static function handleRequest($params)
21 {
22 $event = $params['event'];
23 $userId = $params['userId'];
24 $answer = $params['answer'];
25 $userEmail = $params['emailTo'];
26 $organizerEmail = $event['ORGANIZER_MAIL']['EMAIL'];
27
28 $event = static::updateEvent($event, $userId, $answer);
29 $attendees = static::handleAttendeesFromRequest([
30 'attendees' => $event['ATTENDEES_MAIL'],
31 'answer' => $answer,
32 'userId' => $userId,
33 'userEmail' => $userEmail,
34 'organizerEmail' => $organizerEmail
35 ]);
36
37 $parentId = \CCalendar::SaveEvent([
38 'arFields' => static::updateParentEvent($event),
39 ]);
40
41 \CCalendar::SaveEvent([
42 'arFields' => static::updateChildEvent($event, $parentId),
43 ]);
44
45
47 'icalMethod' => 'reply',
48 'arFields' => $event,
49 'userIndex' => $attendees,
50 'receiver' => $event['ORGANIZER_MAIL'],
51 'sender' => $attendees[$event['OWNER_ID']],
52 ])->replyInvitation()->getStatus();
53 }
54
55 public static function handleReply(array $params): bool
56 {
57 $uid = $params['event']['DAV_XML_ID'];
58 $emailUser = $params['event']['ATTENDEES_MAIL'][0];
59 $userId = ICalUtil::getUserIdByEmail($emailUser);
60 $localEvent = ICalUtil::getEventByUId($userId, $uid);
61
62 if (!empty($localEvent))
63 {
64 $status = $params['event']['ATTENDEES_MAIL'][0]['STATUS'];
65
66 \CCalendarEvent::SetMeetingStatusEx([
67 'attendeeId' => $localEvent['OWNER_ID'],
68 'eventId' => $localEvent['ID'],
69 'status' => Dictionary::LOCAL_ATTENDEES_STATUS[$status],
70 'personalNotification' => $localEvent['MEETING_HOST'],
71 ]);
72 }
73
74 return true;
75 }
76
78 {
79 $attachments = $event->getParameter('attachments');
80
81 if (is_array($attachments))
82 {
83 foreach($attachments as $key => $file)
84 {
85 if ($file['type'] === OutcomingEventManager::CONTENT_TYPE)
86 {
87 $fileObject = new \Bitrix\Main\IO\File($file['tmp_name'], $event->getParameter('site_id'));
88 try
89 {
90 $fileContent = $fileObject->getContents();
91 }
92 catch (FileNotFoundException $e)
93 {
94 die();
95 }
96 $icalComponent = static::getDataInfo($fileContent);
97
98 if ($method === Dictionary::METHODS['reply'])
99 {
100 static::handleReply(['event' => $icalEvent]);
101 }
102 }
103 }
104 }
105 }
106
107 public static function handleCancel($params)
108 {
109 $event = $params['event'];
110 $userId = $params['userId'];
111
112 $originalValue = ICalUtil::getEventByUId($userId, $event['DAV_XML_ID']);
113 if (!empty($originalValue))
114 {
115 $deleteParams = [
116 'sendNotification' => true,
117 'checkPermissions' => false,
118 ];
119
120 \CCalendar::DeleteEvent($originalValue['ID'], true, $deleteParams);
121 }
122 }
123
124 public static function getDataInfo($data, $params = []): array
125 {
126
127 $attachmentManager = IncomingAttachmentManager::getInstance([
128 'data' => $data,
129 ]);
130 $event = $attachmentManager->prepareEventAttachment()->getEvent();
131 $method = $attachmentManager->getMethod();
132
133 return [$event, $method];
134 }
135
136 public static function rehandleRequest($params)
137 {
138 $params['event']['SKIP_TIME'] = $params['event']['DT_SKIP_TIME'] === 'Y';
139
140 $attendees = static::handleAttendeesByUser(
141 ICalUtil::getUsersByCode($params['event']['ATTENDEES_CODES']),
142 $params['answer'],
143 $params['userId']
144 );
145
146 $mailBoxQuery = MessageAccessTable::query()
147 ->setSelect(['ID' => 'MAILBOX.ID', 'EMAIL' => 'MAILBOX.EMAIL', 'ENTITY_TYPE', 'ENTITY_ID'])
148 ->registerRuntimeField(
149 'MAILBOX',
150 new Reference(
151 'MAILBOX',
152 MailboxTable::class,
153 Join::on('this.MAILBOX_ID', 'ref.ID'),
154 ['join_type' => Join::TYPE_INNER]
155 )
156 )
158 ->where('ENTITY_ID', $params['event']['ID'])
159 ;
160
161 $mailbox = $mailBoxQuery->fetch();
162 if (!$mailbox)
163 {
164 return;
165 }
166
167 $params['event']['ORGANIZER_MAIL'] = $attendees[$params['event']['MEETING_HOST']];
168 $params['event']['ORGANIZER_MAIL']['MAILTO'] = $params['event']['MEETING']['MAILTO'];
169 $params['event']['ATTENDEES_MAIL'] = $attendees[$params['event']['OWNER_ID']];
170 $params['event']['ICAL_ORGANIZER'] = (Helper::getAttendee($params['event']['MEETING_HOST'], $params['event']['PARENT_ID'], false))
171 ->setStatus(null)
172 ->setRole(null)
173 ->setRsvp(false)
174 ->setCutype(null)
175 ;
176
177 $answer = isset($params['answer']) && $params['answer']
178 ? IncomingInvitationRequestHandler::MEETING_STATUS_ACCEPTED_CODE
179 : IncomingInvitationRequestHandler::MEETING_STATUS_DECLINED_CODE
180 ;
181 $attendee = Helper::getAttendee($params['event']['OWNER_ID'], $params['event']['PARENT_ID'], false);
182 $status = Dictionary::OUT_ATTENDEES_STATUS[$answer];
183 $attendee?->setStatus($status);
184 $attendee?->setEmail($mailbox['EMAIL'])->setMailto($mailbox['EMAIL']);
185 $attendee?->setName($mailbox['EMAIL'])->setLastName($mailbox['EMAIL']);
186 $attendeesCollection = new AttendeesCollection([$attendee]);
187
189 'icalMethod' => 'reply',
190 'arFields' => $params['event'],
191 'userIndex' => $attendeesCollection,
192 'receiver' => $params['event']['ORGANIZER_MAIL'],
193 'sender' => $attendees[$params['event']['OWNER_ID']],
194 'answer' => $answer,
195 ])->replyInvitation()->getStatus();
196 }
197
198 private static function updateEvent(array $event, $userId, $answer): array
199 {
200 if (isset($event['DATE_FROM']))
201 {
202 $event['DATE_FROM_MAIL'] = $event['SKIP_TIME']
203 ? static::getDateString($event['DATE_FROM'])
204 : static::getDateTimeString($event['DATE_FROM']);
205 $event['DATE_FROM'] = static::getDateTimeString($event['DATE_FROM']);
206 }
207
208 if (isset($event['DATE_TO']))
209 {
210 $event['DATE_TO'] = static::getDateTimeString($event['DATE_TO']);
211 }
212
213 if (isset($event['DATE_CREATE']))
214 {
215 $event['DATE_CREATE'] = static::getDateTimeString($event['DATE_CREATE']);
216 }
217
218 if (isset($event['TIMESTAMP_X']))
219 {
220 $event['TIMESTAMP_X'] = static::getDateTimeString($event['TIMESTAMP_X']);
221 }
222
223 if (isset($event['DT_STAMP']))
224 {
225 $event['DT_STAMP'] = static::getDateTimeString($event['DT_STAMP']);
226 }
227
228 if (isset($event['TZ_FROM']))
229 {
230 $event['TZ_FROM'] = static::getTimezoneNameString($event['TZ_FROM']);
231 }
232
233 if (isset($event['TZ_TO']))
234 {
235 $event['TZ_TO'] = static::getTimezoneNameString($event['TZ_TO']);
236 }
237
238 $event['OWNER_ID'] = $userId;
239 $event['MEETING_HOST'] = ICalUtil::getUserIdByEmail($event['ORGANIZER_MAIL']);
240 $event['IS_MEETING'] = 1;
241 $event['SECTION_CAL_TYPE'] = 'user';
242 $event['ATTENDEES_CODES'] = ['U'.$event['OWNER_ID'], 'U'.$event['MEETING_HOST']];
243 $event['MEETING_STATUS'] = $answer === 'confirmed' ? 'Y' : 'N';
244
245 if (empty($event['ACCESSIBILITY']))
246 {
247 $event['ACCESSIBILITY'] = 'free';
248 }
249
250 if (empty($event['IMPORTANCE']))
251 {
252 $event['IMPORTANCE'] = 'normal';
253 }
254
255 if (empty($event['STATUS']))
256 {
257 $event['STATUS'] = $answer === 'ACCEPT' ? 'CONFIRMED' : 'CANCELLED';
258 }
259
260 if (empty($event['REMIND']))
261 {
262 $event['REMIND'] = [
263 'type' => 'min',
264 'count' => '15'
265 ];
266 }
267
268 if (empty($event['MEETING']))
269 {
270 $event['MEETING'] = [
271 'HOST_NAME' => $event['ORGANIZER_MAIL']['name'],
272 'NOTIFY' => 1,
273 'REINVITE' => 0,
274 'ALLOW_INVITE' => 0,
275 'MEETING_CREATOR' => $event['MEETING_HOST'],
276 'EXTERNAL_TYPE' => 'mail',
277 ];
278 }
279
280 $originalValue = ICalUtil::getEventByUId($userId, $event['DAV_XML_ID']);
281 $event['ID'] = $originalValue ? $originalValue['ID'] : 0;
282
283 return $event;
284 }
285
286 private static function getDateTimeString(Date $date): string
287 {
288 return $date->format(Date::convertFormatToPhp(FORMAT_DATETIME));
289 }
290
291 private static function getDateString(Date $date): string
292 {
293 return $date->format('d.m.Y');
294 }
295
296 private static function getTimezoneNameString(\DateTimeZone $tz)
297 {
298 return $tz->getName();
299 }
300
301 private static function handleAttendeesFromRequest(array $params): array
302 {
303 $result = [];
304
305 foreach ($params['attendees'] as $attendee)
306 {
307 if ($attendee['EMAIL'] == $params['userEmail'])
308 {
309 $usersInfo = ICalUtil::getIndexUsersById([$params['userId']]);
310 $attendee['NAME'] = $usersInfo[$params['userId']]['NAME'];
311 $attendee['LAST_NAME'] = $usersInfo[$params['userId']]['LAST_NAME'];
312 $attendee['STATUS'] = $params['answer'] === 'confirmed' ? 'accepted' : 'declined';
313 $result[$params['userId']] = $attendee;
314 }
315
316 if ($attendee['EMAIL'] == $params['organizerEmail'])
317 {
318 $id = ICalUtil::getUserIdByEmail($attendee);
319 $result[$id] = $attendee;
320 }
321 }
322
323 return $result;
324 }
325
326 private static function handleAttendeesByUser(array $attendees, $answer, $userId)
327 {
328 $result = [];
329 foreach ($attendees as $attendee)
330 {
331 if ($attendee['ID'] == $userId)
332 {
333 $attendee['STATUS'] = $answer ? 'accepted' : 'declined';
334 }
335
336 $result[$attendee['ID']] = $attendee;
337 }
338
339 return $result;
340 }
341
342 private static function updateChildEvent(array $event, $parentId)
343 {
344 $event['PARENT_ID'] = $parentId;
345 $event['MEETING']['MAILTO'] = $event['ORGANIZER_MAIL']['MAILTO'];
346 $event['DESCRIPTION'] .= "\r\n"
347 . Loc::getMessage('EC_ORGANIZER_NAME_TITLE') . ': ' . static::getOrganizerString($event['ORGANIZER_MAIL']) . "\r\n"
348 . Loc::getMessage('EC_ATTENDEES_LIST_TITLE') . ': ' . static::getAttendeesString($event['ATTENDEES_MAIL']);
349 if (!empty($event['ATTACHMENT_LINK']))
350 {
351 $event['DESCRIPTION'] .= "\r\n"
352 . Loc::getMessage('EC_FILES_TITLE') . ': ' . static::getFilesString($event['ATTACHMENT_LINK']);
353 }
354 return $event;
355 }
356
357 private static function getAttendeesString($attendees)
358 {
359 $res = [];
360 foreach ($attendees as $attendee)
361 {
362 $res[] = $attendee['NAME'] . ' ' . $attendee['LAST_NAME'] . ' ('. $attendee['EMAIL'] .')';
363 }
364
365 return implode(', ', $res);
366 }
367
368 private static function getOrganizerString($organizer)
369 {
370 return $organizer['NAME'] . ' ' . $organizer['LAST_NAME'] . ' ('. $organizer['EMAIL'] .')';
371 }
372
373 private static function updateParentEvent(array $event)
374 {
375 $event['OWNER_ID'] = $event['MEETING_HOST'];
376 unset($event['DAV_XML_ID']);
377
378 return $event;
379 }
380
381 private static function getFilesString(array $attachments)
382 {
383 $res = [];
384 foreach ($attachments as $attachment)
385 {
386 $res[] = $attachment['filename'] . ' (' . $attachment['link'] . ')';
387 }
388 return implode(', ', $res);
389 }
390}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static handleReplyReceivedICalInvent(\Bitrix\Main\Event $event)
Определения incomingeventmanager.php:77
static getDataInfo($data, $params=[])
Определения incomingeventmanager.php:124
static handleReply(array $params)
Определения incomingeventmanager.php:55
static createInstance(array $params)
Определения outcomingeventmanager.php:58
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$fileContent
Определения file_property.php:47
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
$uid
Определения hot_keys_act.php:8
const FORMAT_DATETIME
Определения include.php:64
$status
Определения session.php:10
$event
Определения prolog_after.php:141
if(empty($signedUserToken)) $key
Определения quickway.php:257
die
Определения quickway.php:367
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$method
Определения index.php:27