File manager - Edit - /home/web/vm-3fadc827.na4u.ru/www/bitrix/modules/calendar/lib/ical/mailinvitation/incominginvitationrequesthandler.php
Back
<?php namespace Bitrix\Calendar\ICal\MailInvitation; use Bitrix\Calendar\ICal\Parser\Calendar; use Bitrix\Calendar\ICal\Parser\Dictionary; use Bitrix\Calendar\ICal\Parser\Event; use Bitrix\Calendar\ICal\Parser\ParserPropertyType; use Bitrix\Calendar\Util; use Bitrix\Main\ArgumentException; use Bitrix\Main\Localization\Loc; use Bitrix\Main\ObjectException; use Bitrix\Main\ObjectPropertyException; use Bitrix\Main\SystemException; use Bitrix\Main\Type\Date; use CCalendar; IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/calendar/classes/general/calendar.php"); /** * Class IncomingInvitationRequestHandler * @package Bitrix\Calendar\ICal\MailInvitation */ class IncomingInvitationRequestHandler extends IncomingInvitationHandler { public const MEETING_STATUS_HOST = 'H'; public const MEETING_STATUS_ACCEPTED = 'Y'; public const MEETING_STATUS_DECLINED = 'N'; public const SAFE_DELETED_YES = 'Y'; /** * @var string */ protected $decision; /** * @var Calendar */ protected $icalComponent; /** * @var int */ protected $userId; /** * @var string */ protected $emailTo; /** * @var array */ protected $organizer; /** * @return IncomingInvitationRequestHandler */ public static function createInstance(): IncomingInvitationRequestHandler { return new self(); } /** * @param int $userId * @param Calendar $icalCalendar * @param string $decision * @return IncomingInvitationRequestHandler */ public static function createWithDecision(int $userId, Calendar $icalCalendar, string $decision): IncomingInvitationRequestHandler { $handler = new self(); $handler->decision = $decision; $handler->userId = $userId; $handler->icalComponent = $icalCalendar; return $handler; } /** * @return bool * @throws ArgumentException * @throws ObjectException * @throws ObjectPropertyException * @throws SystemException */ public function handle(): bool { $icalEvent = $this->icalComponent->getEvent(); $localEvent = Helper::getEventByUId($icalEvent->getUid()); if ($localEvent === null) { $preparedEvent = $this->prepareEventToSave($icalEvent); $preparedEvent['PARENT_ID'] = $this->saveParentEvent($preparedEvent); $childEventId = $this->saveChildEvent($preparedEvent); if ($childEventId > 0) { return true; } } else { $preparedEvent = $this->prepareToUpdateEvent($icalEvent, $localEvent); $this->updateParentEvent($preparedEvent); if ($this->updateChildEvent($preparedEvent)) { return true; } } return false; } /** * @param string $decision * @return $this */ public function setDecision(string $decision): IncomingInvitationRequestHandler { $this->decision = $decision; return $this; } /** * @param Calendar $component * @return $this */ public function setIcalComponent(Calendar $component): IncomingInvitationRequestHandler { $this->icalComponent = $component; return $this; } /** * @param string $emailTo * @return IncomingInvitationRequestHandler */ public function setEmailTo(string $emailTo): IncomingInvitationRequestHandler { $this->emailTo = $emailTo; return $this; } /** * @param int $userId * @return $this */ public function setUserId(int $userId): IncomingInvitationRequestHandler { $this->userId = $userId; return $this; } /** * @param Event $icalEvent * @return array * @throws ArgumentException * @throws ObjectException * @throws ObjectPropertyException * @throws SystemException */ protected function prepareEventToSave(Event $icalEvent): array { $event = []; if ($icalEvent->getStart() !== null) { if ($icalEvent->getStart()->getParameterValueByName('tzid') !== null) { $event['DATE_FROM'] = Helper::getIcalDateTime( $icalEvent->getStart()->getValue(), $icalEvent->getStart()->getParameterValueByName('tzid') )->format(Date::convertFormatToPhp(FORMAT_DATETIME)); $event['TZ_FROM'] = $icalEvent->getStart()->getParameterValueByName('tzid'); } else { $event['DATE_FROM'] = Helper::getIcalDate($icalEvent->getStart()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATE)); $event['TZ_FROM'] = null; } } if ($icalEvent->getEnd() !== null) { if ($icalEvent->getEnd()->getParameterValueByName('tzid') !== null) { $event['DATE_TO'] = Helper::getIcalDateTime( $icalEvent->getEnd()->getValue(), $icalEvent->getEnd()->getParameterValueByName('tzid') )->format(Date::convertFormatToPhp(FORMAT_DATETIME)); $event['TZ_TO'] = $icalEvent->getEnd()->getParameterValueByName('tzid'); } else { $event['DATE_TO'] = Helper::getIcalDate($icalEvent->getEnd()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATE)); $event['TZ_TO'] = null; } } if ($icalEvent->getName() !== null) { $event['NAME'] = $icalEvent->getName()->getValue(); } if ($icalEvent->getUid() !== null) { $event['DAV_XML_ID'] = $icalEvent->getUid(); } if ($icalEvent->getModified() !== null) { $event['TIMESTAMP_X'] = Helper::getIcalDateTime($icalEvent->getModified()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATETIME)); } if ($icalEvent->getCreated() !== null) { $event['DATE_CREATE'] = Helper::getIcalDateTime($icalEvent->getCreated()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATETIME)); } if ($icalEvent->getDtStamp() !== null) { $event['DT_STAMP'] = Helper::getIcalDateTime($icalEvent->getDtStamp()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATETIME)); } if ($icalEvent->getSequence() !== null) { $event['VERSION'] = $icalEvent->getSequence()->getValue(); } if ($icalEvent->getRRule() !== null) { $rrule = $this->parseRRule($icalEvent->getRRule()); if (isset($rrule['FREQ']) && in_array($rrule['FREQ'], Dictionary::RRULE_FREQUENCY, true)) { $event['RRULE']['FREQ'] = $rrule['FREQ']; if (isset($rrule['COUNT']) && (int)$rrule['COUNT'] > 0) { $event['RRULE']['COUNT'] = $rrule['COUNT']; } elseif (isset($rrule['UNTIL'])) { $now = Util::getDateObject(null, false)->getTimestamp(); $until = Helper::getIcalDateTime($rrule['UNTIL']); if ($now < $until->getTimestamp()) { $event['RRULE']['UNTIL'] = $until->format(Date::convertFormatToPhp(FORMAT_DATE)); } } if ($rrule['FREQ'] === Dictionary::RRULE_FREQUENCY['weekly'] && isset($rrule['BYDAY'])) { $event['RRULE']['BYDAY'] = $rrule['BYDAY']; } if (isset($rrule['INTERVAL'])) { $event['RRULE']['INTERVAL'] = $rrule['INTERVAL']; } else { $event['RRULE']['INTERVAL'] = 1; } } } $event['DESCRIPTION'] = $icalEvent->getDescription() !== null ? $icalEvent->getDescription()->getValue() : '' ; $this->organizer = $this->parseOrganizer($icalEvent->getOrganizer()); $event['MEETING_HOST'] = Helper::getUserIdByEmail($this->organizer); $event['OWNER_ID'] = $this->userId; $event['IS_MEETING'] = 1; $event['SECTION_CAL_TYPE'] = 'user'; $event['ATTENDEES_CODES'] = ['U'.$event['OWNER_ID'], 'U'.$event['MEETING_HOST']]; $event['MEETING_STATUS'] = $this->decision === 'accepted' ? self::MEETING_STATUS_ACCEPTED : self::MEETING_STATUS_DECLINED ; $event['ACCESSIBILITY'] = 'free'; $event['IMPORTANCE'] = 'normal'; $event['REMIND'][] = [ 'type' => 'min', 'count' => '15' ]; $event['MEETING'] = [ 'HOST_NAME' => $icalEvent->getOrganizer() !== null ? $icalEvent->getOrganizer()->getParameterValueByName('cn') : $this->organizer['EMAIL'], 'NOTIFY' => 1, 'REINVITE' => 0, 'ALLOW_INVITE' => 0, 'MEETING_CREATOR' => $event['MEETING_HOST'], 'EXTERNAL_TYPE' => 'mail', ]; if ($this->decision === 'declined') { $event['DELETED'] = self::SAFE_DELETED_YES; } return $event; } /** * @param array $preparedEvent * @return int */ protected function saveParentEvent(array $preparedEvent): int { $preparedEvent['MEETING_STATUS'] = self::MEETING_STATUS_HOST; $preparedEvent['OWNER_ID'] = $preparedEvent['MEETING_HOST']; unset($preparedEvent['DAV_XML_ID']); return (int)CCalendar::SaveEvent([ 'arFields' => $preparedEvent, ]); } /** * @param array $preparedEvent * @return int */ protected function saveChildEvent(array $preparedEvent): int { $preparedEvent['MEETING']['MAILTO'] = $this->organizer['EMAIL'] ?? $this->emailTo; if ($this->icalComponent->getEvent()->getAttendees()) { $preparedEvent['DESCRIPTION'] .= "\r\n" . Loc::getMessage('EC_EDEV_GUESTS') . ": " . $this->parseAttendeesForDescription($this->icalComponent->getEvent()->getAttendees()); } if ($this->icalComponent->getEvent()->getAttachments()) { $preparedEvent['DESCRIPTION'] .= "\r\n" . Loc::getMessage('EC_FILES_TITLE') . ': ' . $this->parseAttachmentsForDescription($this->icalComponent->getEvent()->getAttachments()); } return (int)CCalendar::SaveEvent([ 'arFields' => $preparedEvent, ]); } /** * @param array|null $attendeesCollection * @return string */ protected function parseAttendeesForDescription(?array $attendeesCollection): string { if (!$attendeesCollection) { return ''; } $attendees = []; foreach ($attendeesCollection as $attendee) { /** * @var ParserPropertyType $attendee */ $email = $this->getMailTo($attendee->getValue()); if (!$attendee->getParameterValueByName('cn') || $attendee->getParameterValueByName('cn') === $email) { $attendees[] = $email; } else { $attendees[] = $attendee->getParameterValueByName('cn') . " (" . $email . ")"; } } return implode(", ", $attendees); } /** * @param ParserPropertyType|null $organizer * @return array */ protected function parseOrganizer(?ParserPropertyType $organizer): array { if (!$organizer) { return []; } $result = []; $result['EMAIL'] = $this->getMailTo($organizer->getValue()); $parts = explode(" ", $organizer->getParameterValueByName('cn'), 2); if (isset($parts[0])) { $result['NAME'] = $parts[0]; } if (isset($parts[1])) { $result['LAST_NAME'] = $parts[1]; } return $result; } /** * @param Event $icalEvent * @param array $localEvent * @return array * @throws ArgumentException * @throws ObjectException * @throws ObjectPropertyException * @throws SystemException */ protected function prepareToUpdateEvent(Event $icalEvent, array $localEvent): array { $event = []; if ($icalEvent->getStart() !== null) { if ($icalEvent->getStart()->getParameterValueByName('tzid') !== null) { $event['DATE_FROM'] = Helper::getIcalDateTime( $icalEvent->getStart()->getValue(), $icalEvent->getStart()->getParameterValueByName('tzid') )->format(Date::convertFormatToPhp(FORMAT_DATETIME)); $event['TZ_FROM'] = $icalEvent->getStart()->getParameterValueByName('tzid'); } else { $event['DATE_FROM'] = Helper::getIcalDate($icalEvent->getStart()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATE)); $event['TZ_FROM'] = null; } } else { $event['DATE_FROM'] = $localEvent['DATE_FROM']; $event['TZ_FROM'] = $localEvent['TZ_FROM']; } if ($icalEvent->getEnd() !== null) { if ($icalEvent->getEnd()->getParameterValueByName('tzid') !== null) { $event['DATE_TO'] = Helper::getIcalDateTime( $icalEvent->getEnd()->getValue(), $icalEvent->getEnd()->getParameterValueByName('tzid') )->format(Date::convertFormatToPhp(FORMAT_DATETIME)); $event['TZ_TO'] = $icalEvent->getEnd()->getParameterValueByName('tzid'); } else { $event['DATE_TO'] = Helper::getIcalDate($icalEvent->getEnd()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATE)); $event['TZ_TO'] = null; } } else { $event['DATE_TO'] = $localEvent['DATE_TO']; $event['TZ_TO'] = $localEvent['TZ_TO']; } if ($icalEvent->getName() !== null) { $event['NAME'] = $icalEvent->getName()->getValue(); } if ($icalEvent->getModified() !== null) { $event['TIMESTAMP_X'] = Helper::getIcalDateTime($icalEvent->getModified()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATETIME)); } if ($icalEvent->getCreated() !== null) { $invitationDateCreate = Helper::getIcalDateTime($icalEvent->getCreated()->getValue())->getTimestamp(); $localDateCreate = Util::getDateObject($localEvent['DATE_CREATE'])->getTimestamp(); if ($invitationDateCreate === $localDateCreate) { $event['DATE_CREATE'] = Helper::getIcalDateTime($icalEvent->getCreated()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATETIME)) ; } } if ($icalEvent->getDtStamp() !== null) { $event['DT_STAMP'] = Helper::getIcalDateTime($icalEvent->getDtStamp()->getValue()) ->format(Date::convertFormatToPhp(FORMAT_DATETIME)); } if ($icalEvent->getSequence() !== null && $icalEvent->getSequence()->getValue() > $localEvent['VERSION']) { $event['VERSION'] = $icalEvent->getSequence()->getValue(); } if ($icalEvent->getDescription() !== null) { $event['DESCRIPTION'] = $icalEvent->getDescription()->getValue(); } else { $event['DESCRIPTION'] = null; } $organizer = []; if ($icalEvent->getOrganizer() !== null) { $organizer = $this->parseOrganizer($icalEvent->getOrganizer()); } $event['OWNER_ID'] = $this->userId; $event['MEETING_HOST'] = count($organizer) ? Helper::getUserIdByEmail($organizer) : $localEvent['MEETING_HOST'] ; $event['IS_MEETING'] = 1; $event['SECTION_CAL_TYPE'] = 'user'; $event['ATTENDEES_CODES'] = ['U'.$event['OWNER_ID'], 'U'.$event['MEETING_HOST']]; $event['MEETING_STATUS'] = $this->decision === 'accepted' ? self::MEETING_STATUS_ACCEPTED : self::MEETING_STATUS_DECLINED ; $event['ACCESSIBILITY'] = 'free'; $event['IMPORTANCE'] = 'normal'; $event['REMIND'] = [ 'type' => 'min', 'count' => '15' ]; $event['MEETING'] = [ 'HOST_NAME' => $icalEvent->getOrganizer()->getParameterValueByName('cn') ?? $organizer['EMAIL'] ?? $localEvent['MEETING']['HOST_NAME'], 'NOTIFY' => 1, 'REINVITE' => 0, 'ALLOW_INVITE' => 0, 'MEETING_CREATOR' => $event['MEETING_HOST'], 'EXTERNAL_TYPE' => 'mail', ]; if ($this->decision === 'declined') { $event['DELETED'] = self::SAFE_DELETED_YES; } return $event; } /** * @param array $updatedEvent * @param array $localEvent * @return bool */ protected function updateParentEvent(array $updatedEvent): bool { $updatedEvent['ID'] = $updatedEvent['PARENT_ID']; $updatedEvent['OWNER_ID'] = $updatedEvent['MEETING_HOST']; unset($updatedEvent['DAV_XML_ID']); \CCalendar::SaveEvent([ 'arFields' => $updatedEvent, ]); return true; } /** * @param array $updatedEvent * @param array $localEvent * @return bool */ protected function updateChildEvent(array $updatedEvent): bool { $preparedEvent['MEETING']['MAILTO'] = $this->organizer['EMAIL'] ?? $this->emailTo; if ($this->icalComponent->getEvent()->getAttendees()) { $preparedEvent['DESCRIPTION'] .= "\r\n" . Loc::getMessage('EC_EDEV_GUESTS') . ": " . $this->parseAttendeesForDescription($this->icalComponent->getEvent()->getAttendees()); } if ($this->icalComponent->getEvent()->getAttachments()) { $preparedEvent['DESCRIPTION'] .= "\r\n" . Loc::getMessage('EC_FILES_TITLE') . ': ' . $this->parseAttachmentsForDescription($this->icalComponent->getEvent()->getAttachments()); } \CCalendar::SaveEvent([ 'arFields' => $updatedEvent, ]); return true; } protected function parseAttachmentsForDescription(array $icalAttachments): string { $res = []; foreach ($icalAttachments as $attachment) { $res[] = $attachment['filename'] . ' (' . $attachment['link'] . ')'; } return implode(', ', $res); } private function parseRRule(ParserPropertyType $icalRRule): array { $result = []; $parts = explode(";", $icalRRule->getValue()); foreach ($parts as $part) { $property = explode("=", $part); $result[$property[0]] = $property[1]; } return $result; } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.26 |
proxy
|
phpinfo
|
Settings