public static function EventGet($arParams = array(), $nav = null, $server = null) { $userId = CCalendar::GetCurUserId(); $methodName = "calendar.event.get"; $necessaryParams = array('type'); foreach ($necessaryParams as $param) { if (!isset($arParams[$param]) || empty($arParams[$param])) { throw new Exception(GetMessage('CAL_REST_PARAM_EXCEPTION', array('#PARAM_NAME#' => $param, '#REST_METHOD#' => $methodName))); } } $type = $arParams['type']; $ownerId = intval($arParams['ownerId']); $from = false; $to = false; if (isset($arParams['from'])) { $from = CRestUtil::unConvertDate($arParams['from']); } if (isset($arParams['to'])) { $to = CRestUtil::unConvertDate($arParams['to']); } // Default values for from-to period if ($from === false && $to === false) { // Limits $ts = time(); $pastDays = 30; $futureDays = 90; $from = CCalendar::Date($ts - CCalendar::DAY_LENGTH * $pastDays, false); $to = CCalendar::Date($ts + CCalendar::DAY_LENGTH * $futureDays, false); } elseif ($from !== false && $to === false) { $to = CCalendar::Date(CCalendar::GetMaxTimestamp(), false); } $arSectionIds = array(); $sections = CCalendarSect::GetList(array('arFilter' => array('CAL_TYPE' => $type, 'OWNER_ID' => $ownerId))); foreach ($sections as $section) { if ($section['PERM']['view_full'] || $section['PERM']['view_title'] || $section['PERM']['view_time']) { $arSectionIds[] = $section['ID']; } } if (isset($arParams['section'])) { if (!is_array($arParams['section']) && $arParams['section'] > 0) { $arParams['section'] = array($arParams['section']); } $arSectionIds = array_intersect($arSectionIds, $arParams['section']); } $params = array('type' => $type, 'ownerId' => $ownerId, 'userId' => $userId, 'section' => $arSectionIds, 'fromLimit' => $from, 'toLimit' => $to); $arAttendees = array(); $arEvents = CCalendar::GetEventList($params, $arAttendees); return $arEvents; }
public static function CheckFields(&$arFields) { // Check dates // $arFields['DT_FROM'] = CCalendar::CutZeroTime($arFields['DT_FROM']); // $arFields['DT_TO'] = CCalendar::CutZeroTime($arFields['DT_TO']); $fromTs = CCalendar::Timestamp($arFields['DT_FROM']); $toTs = CCalendar::Timestamp($arFields['DT_TO']); if (!isset($arFields['DT_FROM_TS'])) { $arFields['DT_FROM_TS'] = $fromTs; } if (!isset($arFields['DT_TO_TS'])) { $arFields['DT_TO_TS'] = $toTs; } $h24 = 60 * 60 * 24; // 24 hours // Skip time if (isset($arFields['SKIP_TIME'])) { $arFields['DT_SKIP_TIME'] = $arFields['SKIP_TIME'] ? 'Y' : 'N'; unset($arFields['SKIP_TIME']); } elseif (isset($arFields['DT_SKIP_TIME']) && $arFields['DT_SKIP_TIME'] != 'Y' && $arFields['DT_SKIP_TIME'] != 'N') { unset($arFields['DT_SKIP_TIME']); } // Event length in seconds if (!isset($arFields['DT_LENGTH'])) { //if($fromTs == $toTs && date('H:i', $fromTs) == '00:00') // One day if ($fromTs == $toTs && date('H:i', $fromTs) == '00:00' && $arFields['DT_SKIP_TIME'] == 'Y') { $arFields['DT_LENGTH'] = $h24; } else { $arFields['DT_LENGTH'] = intVal($toTs - $fromTs); if ($arFields['DT_SKIP_TIME'] == "Y") { // We have dates without times $arFields['DT_LENGTH'] += $h24; } } } if (!$arFields['VERSION']) { $arFields['VERSION'] = 1; } // Accessibility $arFields['ACCESSIBILITY'] = trim(strtolower($arFields['ACCESSIBILITY'])); if (!in_array($arFields['ACCESSIBILITY'], array('busy', 'quest', 'free', 'absent'))) { $arFields['ACCESSIBILITY'] = 'busy'; } // Importance $arFields['IMPORTANCE'] = trim(strtolower($arFields['IMPORTANCE'])); if (!in_array($arFields['IMPORTANCE'], array('high', 'normal', 'low'))) { $arFields['IMPORTANCE'] = 'normal'; } // Color $arFields['COLOR'] = CCalendar::Color($arFields['COLOR'], false); // Section if (!is_array($arFields['SECTIONS']) && intVal($arFields['SECTIONS']) > 0) { $arFields['SECTIONS'] = array(intVal($arFields['SECTIONS'])); } // Check rrules if (is_array($arFields['RRULE']) && isset($arFields['RRULE']['FREQ']) && in_array($arFields['RRULE']['FREQ'], array('HOURLY', 'DAILY', 'MONTHLY', 'YEARLY', 'WEEKLY'))) { // Interval if (isset($arFields['RRULE']['INTERVAL']) && intVal($arFields['RRULE']['INTERVAL']) > 1) { $arFields['RRULE']['INTERVAL'] = intVal($arFields['RRULE']['INTERVAL']); } // Until date if ($arFields['RRULE']['UNTIL']) { if (!preg_match('/[^\\d]/', $arFields['RRULE']['UNTIL'])) { $periodTs = $arFields['RRULE']['UNTIL']; if ($periodTs > CCalendar::GetMaxTimestamp()) { $periodTs = CCalendar::GetMaxTimestamp(); } } else { $periodTs = CCalendar::Timestamp($arFields['RRULE']['UNTIL']); } } else { $periodTs = CCalendar::GetMaxTimestamp(); } $arFields['RRULE']['UNTIL'] = $periodTs; $arFields['DT_TO'] = CCalendar::Date($periodTs); $arFields['DT_TO_TS'] = $periodTs; if (isset($arFields['RRULE']['BYDAY'])) { $BYDAY = array(); $days = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); $bydays = explode(',', $arFields['RRULE']['BYDAY']); foreach ($bydays as $day) { $day = strtoupper($day); if (in_array($day, $days)) { $BYDAY[] = $day; } } $arFields['RRULE']['BYDAY'] = implode(',', $BYDAY); } $arFields['RRULE'] = self::PackRRule($arFields['RRULE']); } else { $arFields['RRULE'] = ''; } $arFields['EXRULE'] = ""; $arFields['RDATE'] = ""; $arFields['EXDATE'] = ""; // Location if (!is_array($arFields['LOCATION'])) { $arFields['LOCATION'] = array("NEW" => is_string($arFields['LOCATION']) ? $arFields['LOCATION'] : ""); } // Private $arFields['PRIVATE_EVENT'] = isset($arFields['PRIVATE_EVENT']) && $arFields['PRIVATE_EVENT']; return true; }
public static function DoSaveToDav($Params = array(), &$arFields, $oCurEvent = false) { $sectionId = $Params['sectionId']; $bExchange = $Params['bExchange']; $bCalDav = $Params['bCalDav']; if (isset($oCurEvent['DAV_XML_ID'])) { $arFields['DAV_XML_ID'] = $oCurEvent['DAV_XML_ID']; } if (isset($oCurEvent['DAV_EXCH_LABEL'])) { $arFields['DAV_EXCH_LABEL'] = $oCurEvent['DAV_EXCH_LABEL']; } if (isset($oCurEvent['CAL_DAV_LABEL'])) { $arFields['CAL_DAV_LABEL'] = $oCurEvent['CAL_DAV_LABEL']; } $oSect = CCalendarSect::GetById($sectionId); if ($oCurEvent) { if ($oCurEvent['SECT_ID'] != $sectionId) { $bCalDav = CCalendar::IsCalDAVEnabled() && $oCurEvent['CAL_TYPE'] == 'user' && strlen($oCurEvent['CAL_DAV_LABEL']) > 0; $bExchangeEnabled = CCalendar::IsExchangeEnabled() && $oCurEvent['CAL_TYPE'] == 'user'; if ($bExchangeEnabled || $bCalDav) { $res = CCalendar::DoDeleteToDav(array('bCalDav' => $bCalDav, 'bExchangeEnabled' => $bExchangeEnabled, 'sectionId' => $oCurEvent['SECT_ID']), $oCurEvent); if ($res !== true) { return CCalendar::ThrowError($res); } } } } $fromTs = CCalendar::Timestamp($arFields['DT_FROM']); $toTs = CCalendar::Timestamp($arFields['DT_TO']); if (!isset($arFields['DT_FROM_TS'])) { $arFields['DT_FROM_TS'] = $fromTs; } if (!isset($arFields['DT_TO_TS'])) { $arFields['DT_TO_TS'] = $toTs; } $arDavFields = $arFields; CCalendarEvent::CheckFields($arDavFields); if ($arDavFields['RRULE'] != '') { $arDavFields['RRULE'] = $arFields['RRULE']; } $arDavFields['DETAIL_TEXT'] = $arDavFields['DESCRIPTION']; $arDavFields['DETAIL_TEXT_TYPE'] = 'text'; $arDavFields['ACTIVE_FROM'] = $arDavFields['DT_FROM']; $arDavFields['ACTIVE_TO'] = $arDavFields['DT_TO']; $arDavFields['PROPERTY_LOCATION'] = $arDavFields['LOCATION']['NEW']; if ($arDavFields['PROPERTY_LOCATION'] !== '') { $arDavFields['PROPERTY_LOCATION'] = CCalendar::GetTextLocation($arDavFields['PROPERTY_LOCATION']); } $arDavFields['PROPERTY_IMPORTANCE'] = $arDavFields['IMPORTANCE']; $arDavFields['REMIND_SETTINGS'] = ''; if ($arFields['REMIND'] && is_array($arFields['REMIND']) && is_array($arFields['REMIND'][0])) { $arDavFields['REMIND_SETTINGS'] = floatVal($arFields['REMIND'][0]['count']) . '_' . $arFields['REMIND'][0]['type']; } // RRULE $arDavFields['PROPERTY_PERIOD_TYPE'] = 'NONE'; if (is_array($arFields['RRULE']) && isset($arFields['RRULE']['FREQ']) && in_array($arFields['RRULE']['FREQ'], array('HOURLY', 'DAILY', 'MONTHLY', 'YEARLY', 'WEEKLY'))) { $arDavFields['PROPERTY_PERIOD_TYPE'] = $arFields['RRULE']['FREQ']; // Interval $arDavFields['PROPERTY_PERIOD_COUNT'] = isset($arFields['RRULE']['INTERVAL']) && intVal($arFields['RRULE']['INTERVAL']) > 1 ? intVal($arFields['RRULE']['INTERVAL']) : 1; if ($arFields['RRULE']['FREQ'] == 'WEEKLY' && isset($arFields['RRULE']['BYDAY'])) { //PROPERTY_PERIOD_ADDITIONAL $BYDAYS = array(); $days = array('SU' => 0, 'MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6); $bydays = explode(',', $arFields['RRULE']['BYDAY']); foreach ($bydays as $day) { $BYDAYS[] = $days[$day]; } $arDavFields['PROPERTY_PERIOD_ADDITIONAL'] = implode(',', $BYDAYS); } $h24 = 60 * 60 * 24; if ($fromTs == $toTs) { $arDavFields['PROPERTY_EVENT_LENGTH'] = $h24; } else { $arDavFields['PROPERTY_EVENT_LENGTH'] = intVal($toTs - $fromTs); if ($arDavFields['PROPERTY_EVENT_LENGTH'] % $h24 == 0) { // We have dates without times $arDavFields['PROPERTY_EVENT_LENGTH'] += $h24; } } // Until date if (isset($arFields['RRULE']['UNTIL'])) { $periodTs = $arFields['RRULE']['UNTIL']; } else { $periodTs = CCalendar::GetMaxTimestamp(); } $arDavFields['ACTIVE_TO'] = CCalendar::Date($periodTs); } // **** Synchronize with CalDav **** if ($bCalDav && $oSect['CAL_DAV_CON'] > 0) { // New event or move existent event to DAV calendar if ($arFields['ID'] <= 0 || $oCurEvent && !$oCurEvent['CAL_DAV_LABEL']) { $DAVRes = CDavGroupdavClientCalendar::DoAddItem($oSect['CAL_DAV_CON'], $oSect['CAL_DAV_CAL'], $arDavFields); } else { // Edit existent event $DAVRes = CDavGroupdavClientCalendar::DoUpdateItem($oSect['CAL_DAV_CON'], $oSect['CAL_DAV_CAL'], $oCurEvent['DAV_XML_ID'], $oCurEvent['CAL_DAV_LABEL'], $arDavFields); } if (!is_array($DAVRes) || !array_key_exists("XML_ID", $DAVRes)) { return CCalendar::CollectCalDAVErros($DAVRes); } // // It's ok, we successfuly save event to caldav calendar - and save it to DB $arFields['DAV_XML_ID'] = $DAVRes['XML_ID']; $arFields['CAL_DAV_LABEL'] = $DAVRes['MODIFICATION_LABEL']; } elseif ($bExchange && $oSect['IS_EXCHANGE'] && strlen($oSect['DAV_EXCH_CAL']) > 0 && $oSect['DAV_EXCH_CAL'] !== 0) { $ownerId = $arFields['OWNER_ID']; // New event or move existent event to Exchange calendar if ($arFields['ID'] <= 0 || $oCurEvent && !$oCurEvent['DAV_EXCH_LABEL']) { $exchRes = CDavExchangeCalendar::DoAddItem($ownerId, $oSect['DAV_EXCH_CAL'], $arDavFields); } else { $exchRes = CDavExchangeCalendar::DoUpdateItem($ownerId, $oCurEvent['DAV_XML_ID'], $oCurEvent['DAV_EXCH_LABEL'], $arDavFields); } if (!is_array($exchRes) || !array_key_exists("XML_ID", $exchRes)) { return CCalendar::CollectExchangeErrors($exchRes); } // It's ok, we successfuly save event to exchange calendar - and save it to DB $arFields['DAV_XML_ID'] = $exchRes['XML_ID']; $arFields['DAV_EXCH_LABEL'] = $exchRes['MODIFICATION_LABEL']; } return true; }
public static function ReminderAgent($eventId = 0, $userId = 0, $viewPath = '', $calendarType = '', $ownerId = 0) { if ($eventId > 0 && $userId > 0 && $calendarType != '') { if (!CModule::IncludeModule("im")) { return false; } $skipReminding = false; global $USER; // Create tmp user if ($bTmpUser = !$USER || !is_object($USER)) { $USER = new CUser(); } // We have to use this to set timezone offset to local user's timezone self::SetOffset(false, self::GetOffset($userId)); $arEvents = CCalendarEvent::GetList(array('arFilter' => array("ID" => $eventId, "DELETED" => "N", "FROM_LIMIT" => CCalendar::Date(time() - 3600, false), "TO_LIMIT" => CCalendar::Date(CCalendar::GetMaxTimestamp(), false)), 'parseRecursion' => true, 'maxInstanceCount' => 3, 'preciseLimits' => true, 'fetchAttendees' => true, 'checkPermissions' => false, 'setDefaultLimit' => false)); if ($arEvents && is_array($arEvents[0])) { $event = $arEvents[0]; } if ($event && $event['IS_MEETING']) { $attendees = CCalendarEvent::GetAttendees($event['PARENT_ID']); $attendees = $attendees[$event['PARENT_ID']]; foreach ($attendees as $attendee) { // If current user is an attendee but his status is 'N' we don't take care about reminding if ($attendee['USER_ID'] == $userId && $attendee['STATUS'] == 'N') { $skipReminding = true; break; } } } if ($event && $event['DELETED'] != 'Y' && !$skipReminding) { // Get Calendar Info $Section = CCalendarSect::GetById($event['SECT_ID'], false); if ($Section) { $arNotifyFields = array('FROM_USER_ID' => $userId, 'TO_USER_ID' => $userId, 'NOTIFY_TYPE' => IM_NOTIFY_SYSTEM, 'NOTIFY_MODULE' => "calendar", 'NOTIFY_EVENT' => "reminder", 'NOTIFY_TAG' => "CALENDAR|INVITE|" . $eventId . "|" . $userId . "|REMINDER", 'NOTIFY_SUB_TAG' => "CALENDAR|INVITE|" . $eventId); $fromTs = CCalendar::Timestamp($event['DATE_FROM'], false, $event['DT_SKIP_TIME'] !== 'Y'); if ($event['DT_SKIP_TIME'] !== 'Y') { $fromTs -= $event['~USER_OFFSET_FROM']; } $arNotifyFields['MESSAGE'] = GetMessage('EC_EVENT_REMINDER', array('#EVENT_NAME#' => $event["NAME"], '#DATE_FROM#' => CCalendar::Date($fromTs, $event['DT_SKIP_TIME'] !== 'Y'))); $sectionName = $Section['NAME']; $ownerName = CCalendar::GetOwnerName($calendarType, $ownerId); if ($calendarType == 'user' && $ownerId == $userId) { $arNotifyFields['MESSAGE'] .= ' ' . GetMessage('EC_EVENT_REMINDER_IN_PERSONAL', array('#CALENDAR_NAME#' => $sectionName)); } else { if ($calendarType == 'user') { $arNotifyFields['MESSAGE'] .= ' ' . GetMessage('EC_EVENT_REMINDER_IN_USER', array('#CALENDAR_NAME#' => $sectionName, '#USER_NAME#' => $ownerName)); } else { if ($calendarType == 'group') { $arNotifyFields['MESSAGE'] .= ' ' . GetMessage('EC_EVENT_REMINDER_IN_GROUP', array('#CALENDAR_NAME#' => $sectionName, '#GROUP_NAME#' => $ownerName)); } else { $arNotifyFields['MESSAGE'] .= ' ' . GetMessage('EC_EVENT_REMINDER_IN_COMMON', array('#CALENDAR_NAME#' => $sectionName, '#IBLOCK_NAME#' => $ownerName)); } } } if ($viewPath != '') { $arNotifyFields['MESSAGE'] .= "\n" . GetMessage('EC_EVENT_REMINDER_DETAIL', array('#URL_VIEW#' => $viewPath)); } CIMNotify::Add($arNotifyFields); foreach (GetModuleEvents("calendar", "OnRemindEvent", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(array('eventId' => $eventId, 'userId' => $userId, 'viewPath' => $viewPath, 'calType' => $calendarType, 'ownerId' => $ownerId))); } if (CCalendarEvent::CheckRecurcion($event) && ($nextEvent = $arEvents[1])) { $remAgentParams = array('eventId' => $eventId, 'userId' => $userId, 'viewPath' => $viewPath, 'calendarType' => $calendarType, 'ownerId' => $ownerId); // 1. clean reminders CCalendar::RemoveAgent($remAgentParams); $startTs = CCalendar::Timestamp($nextEvent['DATE_FROM'], false, $event["DT_SKIP_TIME"] !== 'Y'); if ($nextEvent["DT_SKIP_TIME"] == 'N' && $nextEvent["TZ_FROM"]) { $startTs = $startTs - CCalendar::GetTimezoneOffset($nextEvent["TZ_FROM"], $startTs); // UTC timestamp } // 2. Set new reminders $reminder = $nextEvent['REMIND'][0]; if ($reminder) { $delta = intVal($reminder['count']) * 60; //Minute if ($reminder['type'] == 'hour') { $delta = $delta * 60; } elseif ($reminder['type'] == 'day') { $delta = $delta * 60 * 24; } //Day // $startTs - UTC timestamp; date("Z", $startTs) - offset of the server $agentTime = $startTs + date("Z", $startTs); if ($agentTime - $delta >= time() - 60 * 5) { // Inaccuracy - 5 min CCalendar::AddAgent(CCalendar::Date($agentTime - $delta), $remAgentParams); } } } } } self::$offset = null; if (isset($bTmpUser) && $bTmpUser) { unset($USER); } } }