Ejemplo n.º 1
0
 function InviteGuests($ID, $arCalendarEvent, $arGuests, $arParams)
 {
     $arParams["prop"]["PARENT"] = $ID;
     $iblockId = $this->userIblockId;
     $userId = $arParams['userId'];
     $fullUrl = $arParams['fullUrl'];
     $pathToUserCalendar = $arParams['pathToUserCalendar'];
     $ownerName = $GLOBALS['USER']->GetFullName();
     $arGuestConfirm = array();
     $bExchange = CEventCalendar::IsExchangeEnabled() && $arParams['ownerType'] == 'USER';
     $loc = '';
     if (isset($arParams["prop"]["LOCATION"]) && strlen($arParams["prop"]["LOCATION"]) > 0) {
         $arLoc = CEventCalendar::ParseLocation($arParams["prop"]["LOCATION"]);
         if (!$arLoc['mrid'] || !$arLoc['mrevid']) {
             $loc = $arLoc['str'];
         } else {
             $MR = CEventCalendar::GetMeetingRoomById(array('RMiblockId' => $arParams['RMiblockId'], 'RMPath' => $arParams['RMPath'], 'id' => $arLoc['mrid'], 'VMiblockId' => $arParams['VMiblockId'], 'VMPath' => $arParams['VMPath'], 'VMPathDetail' => $arParams['VMPathDetail']));
             if ($MR) {
                 if ($arLoc['mrid'] == $arParams['VMiblockId'] && strlen($arParams['VMPath']) > 0) {
                     $url = (CMain::IsHTTPS() ? "https://" : "http://") . $_SERVER['HTTP_HOST'] . $arParams['VMPathDetail'];
                     $loc = "[url=" . str_replace(array("#id#", "#conf_id#"), array($arLoc['mrid'], $arLoc['mrevid']), $url) . "]" . $MR['NAME'] . "[/url]";
                 } elseif (strlen($arParams['RMPath']) > 0) {
                     $url = (CMain::IsHTTPS() ? "https://" : "http://") . $_SERVER['HTTP_HOST'] . $arParams['RMPath'];
                     $loc = "[url=" . str_replace("#id#", $arLoc['mrid'], $url) . "]" . $MR['NAME'] . "[/url]";
                 } else {
                     $loc = $MR['NAME'];
                 }
             }
         }
     }
     //Guests
     $arAllGuests = array();
     foreach ($arGuests as $guest_id) {
         $guest_id = intval($guest_id);
         if ($guest_id > 0) {
             $arAllGuests[$guest_id] = $guest_id;
         }
     }
     //Find old guests. For new event (or only owner) - it's empty array
     if ($arParams['bNew']) {
         $arOldGuests = array();
     } else {
         $arOldGuests = CECEvent::GetGuests($arParams['userIblockId'], $ID, array('bCheckOwner' => true, 'ownerType' => $arParams['ownerType'], 'bHostIsAbsent' => CECEvent::HostIsAbsent($arParams['iblockId'], $ID), 'DontReturnOnlyOwner' => true));
     }
     // Get guests
     $arParams["prop"]["PRIVATE"] = '';
     // Collect all new guests
     $arNewGuests = array();
     //And existing ones in order to update if event changed
     $arUpdGuests = array();
     foreach ($arAllGuests as $guest_id) {
         if (!array_key_exists($guest_id, $arOldGuests)) {
             $rsUser = CUser::GetList($o, $b, array("ID_EQUAL_EXACT" => $guest_id));
             $arUser = $rsUser->Fetch();
             if ($arUser) {
                 $arUser["FULL_NAME"] = CEventCalendar::GetFullUserName($arUser);
                 $arNewGuests[$guest_id] = $arUser;
             }
         } else {
             $arUpdGuests[$guest_id] = $arOldGuests[$guest_id];
         }
     }
     //Create child events for new guests
     foreach ($arNewGuests as $guest_id => $arGuest) {
         $guestSection = CEventCalendar::GetSectionIDByOwnerId($guest_id, 'USER', $iblockId);
         $guestCalendarId = false;
         $arGuestCalendars = array();
         $res = null;
         $bForOwner = false;
         if ($guest_id == $userId) {
             // it's owner
             if ($this->ownerType == 'USER') {
                 continue;
             }
             $bForOwner = true;
         }
         if (!$guestSection) {
             $guestSection = CEventCalendar::CreateSectionForOwner($guest_id, "USER", $iblockId);
         } else {
             //Section is out there
             //so we have chance to get guests calendar
             if ($this->bCache) {
                 $cachePath = $this->cachePath . $iblockId . "/calendars/" . $guest_id . "/4guests/";
                 $cacheId = 'g_' . $guestSection . '_' . $iblockId . '_' . $guest_id;
                 $cacheTime = 2592000;
                 // 1 month
                 $cache = new CPHPCache();
                 if ($cache->InitCache($cacheTime, $cacheId, $cachePath)) {
                     $res = $cache->GetVars();
                     $arGuestCalendars = $res['calendars'];
                 }
             }
             if (!$this->bCache || empty($res['calendars'])) {
                 $arGuestCalendars = $this->GetCalendars(array('sectionId' => $guestSection, 'iblockId' => $iblockId, 'ownerType' => 'USER', 'ownerId' => $guest_id, 'bOwner' => true, 'forExport' => true, 'bOnlyID' => true));
                 if ($this->bCache) {
                     $cache->StartDataCache($cacheTime, $cacheId, $cachePath);
                     $cache->EndDataCache(array("calendars" => $arGuestCalendars));
                 }
             }
             if (count($arGuestCalendars) > 0) {
                 $arUserSet = CEventCalendar::GetUserSettings(array('static' => true, 'userId' => $guest_id));
                 if ($arUserSet && isset($arUserSet['MeetCalId']) && in_array($arUserSet['MeetCalId'], $arGuestCalendars)) {
                     $guestCalendarId = intVal($arUserSet['MeetCalId']);
                 } else {
                     $guestCalendarId = $arGuestCalendars[0];
                 }
             }
         }
         $eventId = $this->SaveEvent(array('bOwner' => true, 'ownerType' => "USER", 'ownerId' => $guest_id, 'iblockId' => $iblockId, 'bNew' => true, 'name' => $arParams['name'], 'desc' => $arParams['desc'], 'calendarId' => $guestCalendarId, 'sectionId' => $guestSection, 'dateFrom' => $arParams["dateFrom"], 'dateTo' => $arParams["dateTo"], 'prop' => $arParams["prop"], "CONFIRMED" => $bForOwner ? 'Y' : 'Q', "notDisplayCalendar" => true, "bCheckPermissions" => false, 'isMeeting' => true));
         $arGuestConfirm[$guest_id] = $bForOwner ? 'Y' : 'Q';
         // Send message
         if (!$bForOwner) {
             CEventCalendar::SendInvitationMessage(array('type' => "invite", 'email' => $arGuest["EMAIL"], 'name' => $arParams['name'], "from" => $arParams["dateFrom"], "to" => $arParams["dateTo"], "location" => $loc, "pathToUserCalendar" => $pathToUserCalendar, "meetingText" => $arParams['meetingText'], "guestId" => $guest_id, "guestName" => $arGuest["FULL_NAME"], "userId" => $userId, "eventId" => $eventId, "ownerName" => $ownerName));
         }
     }
     //Delete child events if guest was deleted from the list
     $obElement = new CIBlockElement();
     $arDeletedUsers = array();
     foreach ($arOldGuests as $guest_id => $arOldEvent) {
         if ($guest_id == $userId) {
             continue;
         }
         if (!array_key_exists($guest_id, $arAllGuests)) {
             $res = CECEvent::Delete(array('id' => $arOldEvent["ID"], 'iblockId' => $iblockId, 'ownerType' => "USER", 'ownerId' => $guest_id, 'userId' => $userId, 'bJustDel' => true));
             if ($res !== true) {
                 return $this->ThrowError(strlen($res) > 0 ? $res : GetMessage('EC_EVENT_DEL_ERROR'));
             }
             $arDeletedUsers[] = $arOldEvent["ID"];
             if ($arOldEvent["PROPERTY_VALUES"]["CONFIRMED"] != "N") {
                 // Send message
                 CEventCalendar::SendInvitationMessage(array('type' => "cancel", 'email' => $arOldEvent["CREATED_BY"]["EMAIL"], 'name' => $arOldEvent['NAME'], "from" => $arOldEvent["ACTIVE_FROM"], "to" => $arOldEvent["ACTIVE_TO"], "desc" => $arOldEvent['DETAIL_TEXT'], "pathToUserCalendar" => $pathToUserCalendar, "guestId" => $guest_id, "guestName" => $arOldEvent["CREATED_BY"]["FULL_NAME"], "userId" => $userId, "ownerName" => $ownerName));
             }
         }
     }
     // Update info
     if (count($arUpdGuests) > 0) {
         $arCalendarEventProps = $arCalendarEvent["PROPERTY_VALUES"];
         unset($arCalendarEvent["PROPERTY_VALUES"]);
         //Check if we have to update child events
         foreach ($arUpdGuests as $guest_id => $arOldEvent) {
             if ($guest_id == $userId && $this->ownerType == 'USER') {
                 continue;
             }
             $bReinvite = false;
             $bCH_from = CEventCalendar::TrimTime($arOldEvent["ACTIVE_FROM"]) != CEventCalendar::TrimTime($arCalendarEvent["ACTIVE_FROM"]);
             $bCH_to = CEventCalendar::TrimTime($arOldEvent["ACTIVE_TO"]) != CEventCalendar::TrimTime($arCalendarEvent["ACTIVE_TO"]);
             $bTimeChanged = $bCH_from || $bCH_to;
             $bCH_name = $arOldEvent["NAME"] != $arCalendarEvent["NAME"];
             $bCH_desc = $arOldEvent["DETAIL_TEXT"] != $arCalendarEvent["DETAIL_TEXT"];
             $bFieldsChanged = $bCH_name || $bCH_desc;
             $bCH_loc = $arOldEvent["PROPERTY_VALUES"]["LOCATION"] != $arCalendarEventProps["LOCATION"];
             $bCH_repeat = $arOldEvent["PROPERTY_VALUES"]["PERIOD_TYPE"] != $arCalendarEventProps["PERIOD_TYPE"] || $arOldEvent["PROPERTY_VALUES"]["PERIOD_COUNT"] != $arCalendarEventProps["PERIOD_COUNT"] || $arOldEvent["PROPERTY_VALUES"]["EVENT_LENGTH"] != $arCalendarEventProps["EVENT_LENGTH"] || $arOldEvent["PROPERTY_VALUES"]["PERIOD_ADDITIONAL"] != $arCalendarEventProps["PERIOD_ADDITIONAL"];
             $bCH_imp = $arOldEvent["PROPERTY_VALUES"]["IMPORTANCE"] != $arCalendarEventProps["IMPORTANCE"];
             $bCH_meettxt = $arOldEvent["PROPERTY_VALUES"]["MEETING_TEXT"] != $arCalendarEventProps["MEETING_TEXT"]['VALUE']['TEXT'];
             $bPropertyChanged = $bCH_repeat || $bCH_loc || $bCH_meettxt || $bCH_imp;
             if (count($arParams['reinviteParamsList']) > 0) {
                 $bReinvite = in_array('name', $arParams['reinviteParamsList']) && $bCH_name;
                 if (!$bReinvite) {
                     $bReinvite = in_array('desc', $arParams['reinviteParamsList']) && $bCH_desc;
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('from', $arParams['reinviteParamsList']) && $bCH_from;
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('to', $arParams['reinviteParamsList']) && $bCH_to;
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('location', $arParams['reinviteParamsList']) && $bCH_loc;
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('guest_list', $arParams['reinviteParamsList']) && (count($arDeletedUsers) > 0 || count($arNewGuests) > 0);
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('repeating', $arParams['reinviteParamsList']) && $bCH_repeat;
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('importance', $arParams['reinviteParamsList']) && $bCH_imp;
                 }
                 if (!$bReinvite) {
                     $bReinvite = in_array('meet_text', $arParams['reinviteParamsList']) && $bCH_meettxt;
                 }
             }
             if ($bTimeChanged || $bFieldsChanged || $bPropertyChanged) {
                 if ($guest_id != $userId) {
                     if ($bReinvite) {
                         $arCalendarEventProps["CONFIRMED"] = CEventCalendar::GetConfirmedID($iblockId, "Q");
                         $arGuestConfirm[$guest_id] = 'Q';
                     }
                     $arFields = array("ACTIVE_FROM" => $arCalendarEvent["ACTIVE_FROM"], "ACTIVE_TO" => $arCalendarEvent["ACTIVE_TO"], "NAME" => $arCalendarEvent["NAME"], "DETAIL_TEXT" => $arCalendarEvent["DETAIL_TEXT"], "DETAIL_TEXT_TYPE" => 'html');
                     // If it's EXCHANGE - we try to save event to exchange
                     if ($bExchange) {
                         foreach ($arCalendarEventProps as $prKey => $prVal) {
                             $arFields["PROPERTY_" . $prKey] = $prVal;
                         }
                         $calendarXmlId = CECCalendar::GetExchangeXmlId($arOldEvent["IBLOCK_ID"], $arOldEvent['IBLOCK_SECTION_ID']);
                         if (strlen($calendarXmlId) > 0 && $calendarXmlId !== 0) {
                             $eventModLabel = CECEvent::GetExchModLabel($arOldEvent["IBLOCK_ID"], $arOldEvent["ID"]);
                             $eventXmlId = CECEvent::GetExchangeXmlId($arOldEvent["IBLOCK_ID"], $arOldEvent["ID"]);
                             $exchRes = CDavExchangeCalendar::DoUpdateItem($guest_id, $eventXmlId, $eventModLabel, $arFields);
                             if (!is_array($exchRes) || !array_key_exists("XML_ID", $exchRes)) {
                                 return CEventCalendar::ThrowError(CEventCalendar::CollectExchangeErros($exchRes));
                             }
                             // It's ok, we successfuly save event to exchange calendar - and save it to DB
                             $arFields['XML_ID'] = $exchRes['XML_ID'];
                             //$arFields['PROPERTY_VALUES']['BXDAVEX_LABEL'] = $exchRes['MODIFICATION_LABEL'];
                             $arCalendarEventProps['BXDAVEX_LABEL'] = $exchRes['MODIFICATION_LABEL'];
                         }
                     }
                     $obElement = new CIBlockElement();
                     $obElement->SetPropertyValuesEx($arOldEvent["ID"], $arOldEvent["IBLOCK_ID"], $arCalendarEventProps, array("DoNotValidateLists" => true));
                     if ($bTimeChanged || $bFieldsChanged) {
                         $obElement->Update($arOldEvent["ID"], $arFields, false);
                     }
                 }
                 // Send message
                 if ($guest_id != $userId) {
                     CEventCalendar::SendInvitationMessage(array('type' => "change", 'email' => $arOldEvent["CREATED_BY"]["EMAIL"], 'name' => $arOldEvent['NAME'], "from" => $arOldEvent["ACTIVE_FROM"], "to" => $arOldEvent["ACTIVE_TO"], "location" => $loc, "meetingText" => $arParams['meetingText'], "pathToUserCalendar" => $pathToUserCalendar, "guestId" => $guest_id, "guestName" => $arOldEvent["CREATED_BY"]["FULL_NAME"], "userId" => $userId, "eventId" => $arOldEvent["ID"], "ownerName" => $ownerName));
                 }
             }
         }
     }
     $this->ClearCache($this->cachePath . 'events/' . $iblockId . '/');
     return $arGuestConfirm;
 }
Ejemplo n.º 2
0
 function __getRow($arRes, $listName, &$last_change)
 {
     global $APPLICATION, $USER;
     $arStatusValues = $this->arStatusValues;
     $arPriorityValues = $this->arPriorityValues;
     $first_week_day = COption::GetOptionString('intranet', 'first_week_day', 'mo');
     $dbEditor = CUser::GetByID($arRes['MODIFIED_BY']);
     $arEditor = $dbEditor->Fetch();
     $change = MakeTimeStamp($arRes['TIMESTAMP_X']);
     if ($last_change < $change) {
         $last_change = $change;
     }
     $row_count++;
     $bRecurrent = isset($arRes['PERIOD']) && is_array($arRes['PERIOD']) ? 1 : 0;
     $ts_start = MakeTimeStamp($arRes['DATE_FROM']);
     $ts_finish = MakeTimeStamp($arRes['DATE_TO']);
     $TZBias = intval(date('Z'));
     $TZBiasStart = intval(date('Z', $ts_start));
     $duration = $bRecurrent ? $arRes['PERIOD']['LENGTH'] : $ts_finish - $ts_start;
     $bAllDay = $duration % 86400 == 0 ? 1 : 0;
     if (!$bAllDay || defined('OLD_OUTLOOK_VERSION')) {
         $ts_start -= $TZBiasStart;
         $ts_finish -= $TZBiasStart;
     }
     $obRow = new CXMLCreator('z:row');
     $obRow->setAttribute('ows_ID', $arRes['ID']);
     $version = $arRes['VERSION'] ? $arRes['VERSION'] : 1;
     $obRow->setAttribute('ows_Attachments', 0);
     $obRow->setAttribute('ows_owshiddenversion', $version);
     $obRow->setAttribute('ows_MetaInfo_vti_versionhistory', md5($arRes['ID']) . ':' . $version);
     /* 
     	ows_MetaInfo_BusyStatus='2' - Editor
     	ows_MetaInfo_IntendedBusyStatus='-1' - Creator
     	
     	values: 
     		-1 - Unspecified busy status. Protocol clients can choose to display one of the other values if BusyStatus is -1.
     		0 - Free - ACCESSIBILITY => 'free'
     		1 - Tentative - ACCESSIBILITY => 'quest'
     		2 - Busy - ACCESSIBILITY => 'busy'
     		3 - Out of Office - ACCESSIBILITY => 'absent'
     */
     $status = $arStatusValues[$arRes['ACCESSIBILITY']];
     $obRow->setAttribute('ows_MetaInfo_BusyStatus', $status === null ? -1 : $status);
     $obRow->setAttribute('ows_MetaInfo_Priority', intval($arPriorityValues[$arRes['IMPORTANCE']]));
     $obRow->setAttribute('ows_Created', $this->__makeDateTime(MakeTimeStamp($arRes['DATE_CREATE']) - $TZBias));
     $obRow->setAttribute('ows_Modified', $this->__makeDateTime($change - $TZBias));
     $obRow->setAttribute('ows_EventType', $bRecurrent ? 1 : 0);
     $obRow->setAttribute('ows_Title', htmlspecialcharsback($arRes['NAME']));
     // we have data htmlspecialchared yet
     if ($arRes['LOCATION']) {
         $arLocationInfo = CEventCalendar::ParseLocation($arRes['LOCATION']);
         if ($arLocationInfo['mrid'] === false) {
             $obRow->setAttribute('ows_Location', $arLocationInfo['str']);
         } else {
             if (!($arMRInfo = $this->arMRInfo[$arLocationInfo['mrid']])) {
                 $arMRInfo = CEventCalendar::GetMeetingRoomById(array('id' => $arLocationInfo['mrid'], 'RMiblockId' => $this->__getRMIblockID()));
             }
             if ($arMRInfo) {
                 $this->arMRInfo[$arLocationInfo['mrid']] = $arMRInfo;
                 $obRow->setAttribute('ows_Location', $arMRInfo['NAME']);
             } else {
                 $obRow->setAttribute('ows_Location', $arLocationInfo['str']);
             }
         }
     }
     $obRow->setAttribute('ows_Description', htmlspecialcharsback($arRes['DETAIL_TEXT']));
     // we have data htmlspecialchared yet
     $obRow->setAttribute('ows_EventDate', $this->__makeDateTime($ts_start));
     $obRow->setAttribute('ows_EndDate', $this->__makeDateTime((false && $bRecurrent ? $ts_start + $arRes['PERIOD']['LENGTH'] : $ts_finish) + ($bAllDay ? 86340 : 0)));
     $obRow->setAttribute('ows_fAllDayEvent', $bAllDay);
     /* Recurrence */
     $obRow->setAttribute('ows_fRecurrence', $bRecurrent);
     if ($bRecurrent) {
         $arWeekDays = $this->arWeekDays;
         $obRow->setAttribute('ows_UID', CIntranetUtils::makeGUID(md5($arRes['ID'] . '_' . $change)));
         $tz_data = '';
         $tz_data .= '<timeZoneRule>';
         $tz_data .= '<standardBias>' . -intval(($TZBias - (date('I') ? 3600 : 0)) / 60) . '</standardBias>';
         $tz_data .= '<additionalDaylightBias>-60</additionalDaylightBias>';
         $bUseTransition = COption::GetOptionString('intranet', 'tz_transition', 'Y') == 'Y';
         if ($bUseTransition) {
             $transition_standard = COption::GetOptionString('intranet', 'tz_transition_standard', '');
             $transition_daylight = COption::GetOptionString('intranet', 'tz_transition_daylight', '');
             if (!$transition_standard) {
                 $transition_standard = '<transitionRule month="10" day="su" weekdayOfMonth="last" /><transitionTime>3:0:0</transitionTime>';
             }
             if (!$transition_daylight) {
                 $transition_daylight = '<transitionRule  month="3" day="su" weekdayOfMonth="last" /><transitionTime>2:0:0</transitionTime>';
             }
             $tz_data .= '<standardDate>' . $transition_standard . '</standardDate><daylightDate>' . $transition_daylight . '</daylightDate>';
         }
         $tz_data .= '</timeZoneRule>';
         $obRow->setAttribute('ows_XMLTZone', $tz_data);
         //$obRow->setAttribute('ows_TimeZone', 7);
         $recurence_data = '';
         $recurence_data .= '<recurrence>';
         $recurence_data .= '<rule>';
         $recurence_data .= '<firstDayOfWeek>' . $first_week_day . '</firstDayOfWeek>';
         $recurence_data .= '<repeat>';
         switch ($arRes['PERIOD']['TYPE']) {
             case 'DAILY':
                 $recurence_data .= '<daily dayFrequency="' . $arRes['PERIOD']['COUNT'] . '" />';
                 break;
             case 'WEEKLY':
                 $days = '';
                 $arDays = explode(',', $arRes['PERIOD']['DAYS']);
                 foreach ($arDays as $day) {
                     $days .= $arWeekDays[$day] . '="TRUE" ';
                 }
                 $recurence_data .= '<weekly ' . $days . 'weekFrequency="' . $arRes['PERIOD']['COUNT'] . '" />';
                 break;
             case 'MONTHLY':
                 $recurence_data .= '<monthly monthFrequency="' . $arRes['PERIOD']['COUNT'] . '" day="' . date('d', $ts_start) . '" />';
                 break;
             case 'YEARLY':
                 $recurence_data .= '<yearly yearFrequency="' . $arRes['PERIOD']['COUNT'] . '" month="' . date('m', $ts_start) . '" day="' . date('d', $ts_start) . '" />';
                 break;
         }
         $recurence_data .= '</repeat>';
         if (date('Y', $ts_finish) == '2038' || date('Y', $ts_finish) == '2037') {
             $recurence_data .= '<repeatForever>FALSE</repeatForever>';
         } else {
             $recurence_data .= '<windowEnd>' . $this->__makeDateTime($ts_finish) . '</windowEnd>';
         }
         $recurence_data .= '</rule>';
         $recurence_data .= '</recurrence>';
         $obRow->setAttribute('ows_RecurrenceData', $recurence_data);
         $obRow->setAttribute('ows_Duration', $arRes['PERIOD']['LENGTH'] + ($bAllDay ? 86340 : 0));
     } else {
         $obRow->setAttribute('ows_Duration', ($duration ? $duration : 86400) - 60);
     }
     $obRow->setAttribute('ows_UniqueId', $arRes['ID'] . ';#' . $listName);
     $obRow->setAttribute('ows_FSObjType', $arRes['ID'] . ';#0');
     $name = $arEditor['NAME'];
     if ($arEditor['LAST_NAME']) {
         $name .= ' ' . $arEditor['LAST_NAME'];
     }
     if (!$name) {
         $name .= $arEditor['LOGIN'];
     }
     $obRow->setAttribute('ows_Editor', $arEditor['ID'] . ';#' . $name);
     $obRow->setAttribute('ows_PermMask', '0x7fffffffffffffff');
     $obRow->setAttribute('ows_ContentTypeId', '0x01020005CE290982A58C439E00342702139D1A');
     return $obRow;
 }