- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
- Класс: CCalendarEvent
- Вызов: CCalendarEvent::GetAbsent
static function GetAbsent($users = false, $params = [])
{
// Can be called from agent... So we have to create $USER if it is not exists
$tempUser = CCalendar::TempUser(false, true);
$checkPermissions = $params['checkPermissions'] !== false;
$curUserId = isset($params['userId']) ? (int)$params['userId'] : CCalendar::GetCurUserId();
$arUsers = [];
if ($users !== false && is_array($users))
{
foreach($users as $id)
{
if ($id > 0)
{
$arUsers[] = (int)$id;
}
}
if (empty($arUsers))
{
$users = false;
}
}
$arFilter = array(
'DELETED' => 'N',
'ACCESSIBILITY' => 'absent',
);
if ($users)
{
$arFilter['CREATED_BY'] = $users;
}
if (isset($params['fromLimit']))
{
$arFilter['FROM_LIMIT'] = CCalendar::Date(CCalendar::Timestamp($params['fromLimit'], false), true, false);
}
if (isset($params['toLimit']))
{
$arFilter['TO_LIMIT'] = CCalendar::Date(CCalendar::Timestamp($params['toLimit'], false), true, false);
}
$eventList = self::GetList(
array(
'arFilter' => $arFilter,
'parseRecursion' => true,
'getUserfields' => false,
'fetchAttendees' => false,
'userId' => $curUserId,
'preciseLimits' => true,
'checkPermissions' => false,
'parseDescription' => false,
'skipDeclined' => true
)
);
//$bSocNet = Loader::includeModule("socialnetwork");
$result = [];
$settings = false;
foreach($eventList as $event)
{
$userId = $event['CREATED_BY'];
if ($users !== false && !in_array($userId, $arUsers))
{
continue;
}
//if ($bSocNet && !CSocNetFeatures::IsActiveFeature(SONET_ENTITY_USER, $userId, "calendar"))
// continue;
if ($event['IS_MEETING'] && $event["MEETING_STATUS"] === 'N')
{
continue;
}
if (
$checkPermissions
&& ($event['CAL_TYPE'] !== 'user' || $curUserId !== (int)$event['OWNER_ID'])
&& $curUserId !== (int)$event['CREATED_BY'])
{
$sectId = $event['SECT_ID'];
if (empty($event['ACCESSIBILITY']))
{
$event['ACCESSIBILITY'] = 'busy';
}
if ($settings === false)
{
$settings = CCalendar::GetSettings(array('request' => false));
}
$private = $event['PRIVATE_EVENT'] && $event['CAL_TYPE'] === 'user';
$accessController = new EventAccessController($userId);
$eventModel = EventModel::createFromArray($event);
$eventModel->setSectionId((int)$sectId);
if ($private || !$accessController->check(ActionDictionary::ACTION_EVENT_VIEW_FULL, $eventModel))
{
$event = self::ApplyAccessRestrictions($event, $userId);
}
}
$skipTime = $event['DT_SKIP_TIME'] === 'Y';
$fromTs = CCalendar::Timestamp($event['DATE_FROM'], false, !$skipTime);
$toTs = CCalendar::Timestamp($event['DATE_TO'], false, !$skipTime);
if ($event['DT_SKIP_TIME'] !== 'Y')
{
$fromTs -= $event['~USER_OFFSET_FROM'];
$toTs -= $event['~USER_OFFSET_TO'];
}
$result[] = array(
'ID' => $event['ID'],
'NAME' => $event['NAME'],
'DATE_FROM' => CCalendar::Date($fromTs, !$skipTime, false),
'DATE_TO' => CCalendar::Date($toTs, !$skipTime, false),
'DT_FROM_TS' => $fromTs,
'DT_TO_TS' => $toTs,
'CREATED_BY' => $userId,
'DETAIL_TEXT' => '',
'USER_ID' => $userId
);
}
// Sort by DATE_FROM_TS_UTC
usort($result, static function($a, $b){
if ($a['DT_FROM_TS'] === $b['DT_FROM_TS'])
{
return 0;
}
return $a['DT_FROM_TS'] < $b['DT_FROM_TS'] ? -1 : 1;
});
CCalendar::TempUser($tempUser, false);
return $result;
}