static function getFillFormData($data = [], $params = [])
{
global $USER;
$resultData = [];
$curUserId = $USER->GetID();
if (isset($params['from']) && $params['from'] instanceof Date
&& isset($params['to']) && $params['to'] instanceof Date
)
{
$from = $params['from']->toString();
$to = $params['to']->toString();
}
else
{
$fromTs = (isset($params['from']) && $params['from']) ? CCalendar::timestamp($params['from']) : time();
$from = CCalendar::date($fromTs, false);
$to = (isset($params['to']) && $params['to'])
? CCalendar::date(CCalendar::timestamp($params['to']), false)
: CCalendar::date($fromTs + CCalendar::DAY_LENGTH * 60, false);
}
if (isset($params['timezone']))
{
$deltaOffset = CCalendar::GetTimezoneOffset($params['timezone']) - CCalendar::GetCurrentOffsetUTC($curUserId);
}
else
{
$deltaOffset = 0;
}
$resultData['timezoneOffset'] = 0;
// Fetch fetch UF properties
if ($params['fieldName'])
{
$r = CUserTypeEntity::getList(array("ID" => "ASC"), array("FIELD_NAME" => $params['fieldName']));
if ($r)
{
$fieldProperties = $r->fetch();
$resultData['fieldSettings'] = $fieldProperties['SETTINGS'];
if ($resultData['fieldSettings']['USE_USER_TIMEZONE'] === 'N')
{
$resultData['timezoneOffset'] = $resultData['fieldSettings']['TIMEZONE'] ? CCalendar::GetTimezoneOffset($resultData['fieldSettings']['TIMEZONE']) : intval(date("Z"));
$resultData['timezoneOffsetLabel'] = 'UTC'.($resultData['timezoneOffset'] <> 0 ? ' '.($resultData['timezoneOffset'] < 0? '-':'+').sprintf("%02d", ($h = floor(abs($resultData['timezoneOffset'])/3600))).':'.sprintf("%02d", abs($resultData['timezoneOffset']) / 60 - $h * 60) : '');
}
}
}
if (isset($data['users']))
{
$userIdList = is_array($data['users']['value'])
? $data['users']['value']
: explode('|', $data['users']['value']);
array_walk($userIdList, 'intval');
$resultData['usersAccessibility'] = [];
$accessibility = CCalendar::getAccessibilityForUsers(array(
'users' => $userIdList,
'from' => $from, // date or datetime in UTC
'to' => $to, // date or datetime in UTC
'getFromHR' => true,
'checkPermissions' => false
));
foreach($accessibility as $userId => $entries)
{
$resultData['usersAccessibility'][$userId] = [];
foreach($entries as $entry)
{
if (isset($entry['DT_FROM']) && !isset($entry['DATE_FROM']))
{
$resultData['usersAccessibility'][$userId][] = array(
'id' => $entry['ID'],
'dateFrom' => $entry['DT_FROM'],
'dateTo' => $entry['DT_TO'],
);
}
else
{
$fromTs = CCalendar::Timestamp($entry['DATE_FROM']);
$toTs = CCalendar::Timestamp($entry['DATE_TO']);
if ($entry['DT_SKIP_TIME'] !== "Y")
{
if ($resultData['fieldSettings']['USE_USER_TIMEZONE'] === 'N')
{
$fromTs -= CCalendar::GetTimezoneOffset($entry['TZ_FROM']) - $resultData['timezoneOffset'];
$toTs -= CCalendar::GetTimezoneOffset($entry['TZ_TO']) - $resultData['timezoneOffset'];
}
else
{
$fromTs -= $entry['~USER_OFFSET_FROM'];
$toTs -= $entry['~USER_OFFSET_TO'];
$fromTs += $deltaOffset;
$toTs += $deltaOffset;
}
}
$resultData['usersAccessibility'][$userId][] = array(
'id' => $entry['ID'],
'dateFrom' => CCalendar::Date($fromTs, $entry['DT_SKIP_TIME'] != 'Y'),
'dateTo' => CCalendar::Date($toTs, $entry['DT_SKIP_TIME'] != 'Y'),
'fullDay' => $entry['DT_SKIP_TIME'] === "Y"
);
}
}
}
// User Index
$orm = UserTable::getList(
[
'filter' => [
'=ID' => $userIdList,
'=ACTIVE' => 'Y'
],
'select' => ['ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL']
]
);
$resultData['SETTINGS']['USER_INDEX'] = [];
while($user = $orm->fetch())
{
$resultData['userIndex'][$user['ID']] = [
'id' => $user['ID'],
'displayName' => CCalendar::getUserName($user)
];
}
}
if (isset($data['resources']))
{
$resultData['resourcesAccessibility'] = [];
$resourceIdList = is_array($data['resources']['value'])
? $data['resources']['value']
: explode('|', $data['resources']['value']);
array_walk($resourceIdList, 'intval');
$resEntries = CCalendarEvent::getList(
array(
'arFilter' => array(
"FROM_LIMIT" => $from,
"TO_LIMIT" => $to,
"CAL_TYPE" => 'resource',
"ACTIVE_SECTION" => "Y",
"SECTION" => $resourceIdList
),
'parseRecursion' => true,
'setDefaultLimit' => false
)
);
foreach($resEntries as $row)
{
$fromTs = CCalendar::timestamp($row["DATE_FROM"]);
$toTs = CCalendar::timestamp($row['DATE_TO']);
if ($row['DT_SKIP_TIME'] !== "Y" && $resultData['fieldSettings']['USE_USER_TIMEZONE'] !== 'N')
{
if ($resultData['fieldSettings']['USE_USER_TIMEZONE'] === 'N')
{
$fromTs -= CCalendar::GetTimezoneOffset($entry['TZ_FROM']) - $resultData['timezoneOffset'];
$toTs -= CCalendar::GetTimezoneOffset($entry['TZ_TO']) - $resultData['timezoneOffset'];
}
else
{
$fromTs -= $row['~USER_OFFSET_FROM'];
$toTs -= $row['~USER_OFFSET_TO'];
$fromTs += $deltaOffset;
$toTs += $deltaOffset;
}
}
$resultData['resourcesAccessibility'][$row['SECT_ID']][] = array(
'id' => $row["ID"],
'dateFrom' => CCalendar::date($fromTs, $row['DT_SKIP_TIME'] !== 'Y'),
'dateTo' => CCalendar::date($toTs, $row['DT_SKIP_TIME'] !== 'Y'),
'fullDay' => $row['DT_SKIP_TIME'] === "Y"
);
}
}
$resultData['workTimeStart'] = floor(floatVal(COption::GetOptionString('calendar', 'work_time_start', 9)));
$resultData['workTimeEnd'] = ceil(floatVal(COption::GetOptionString('calendar', 'work_time_end', 19)));
return $resultData;
}