Your IP : 18.191.240.134
<?
use Bitrix\Timeman\Model\Schedule\ScheduleTable;
define('BX_SECURITY_SHOW_MESSAGE', 1);
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_FILE_PERMISSIONS", true);
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
global $APPLICATION, $USER, $DB;
if (!CBXFeatures::IsFeatureEnabled('timeman'))
{
die();
}
if (check_bitrix_sessid() && $USER->IsAuthorized())
{
IncludeModuleLangFile(__FILE__);
$action = $_REQUEST['action'];
if (!CModule::IncludeModule('timeman'))
{
echo "{error: 'timeman module not installed', type: 'fatal'}";
}
else
{
$device = null;
if (!empty($_REQUEST['mobile_action']) && $_REQUEST['mobile_action'] === 'timeman')
{
$device = ScheduleTable::ALLOWED_DEVICES_MOBILE;
}
if (!empty($_REQUEST['device']) && $_REQUEST['device'] === ScheduleTable::ALLOWED_DEVICES_BROWSER)
{
$device = ScheduleTable::ALLOWED_DEVICES_BROWSER;
}
if ($action == 'clock')
{
$start_time = intval($_REQUEST['start_time']);
if ($start_time > 0)
{
$start_time = CTimeMan::FormatTime($start_time, true);
}
else
{
$start_time = '';
}
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/tools/clock.php");
$clock_input_id_1 = 'tm_' . rand(0, 100000);
$clock_input_id_2 = 'tm_' . rand(0, 100000);
$clock1 = '';
$clock2 = '';
ob_start();
CClock::Show(
[
'inputId' => $clock_input_id_1,
'inputName' => $_REQUEST['clock_id'],
'view' => 'inline',
'showIcon' => false,
'initTime' => $start_time,
]
);
$clock1 = ob_get_contents();
ob_end_clean();
if ($_REQUEST['clock_id_1'])
{
$start_time_1 = intval($_REQUEST['start_time_1']);
if ($start_time_1 > 0)
{
$start_time_1 = CTimeMan::FormatTime($start_time_1, true);
}
else
{
$start_time_1 = '';
}
ob_start();
CClock::Show(
[
'inputId' => $clock_input_id_2,
'inputName' => $_REQUEST['clock_id_1'],
'view' => 'inline',
'showIcon' => false,
'initTime' => $start_time_1,
]
);
$clock2 = ob_get_contents();
ob_end_clean();
}
if (!$clock2)
{
echo $clock1;
?>
<script type="text/javascript">BX.onCustomEvent('onTMClockRegister', [{<?=CUtil::JSEscape($_REQUEST['clock_id'])?>:
'<?=$clock_input_id_1?>'
}])</script><?
}
else
{
$dateSelect = "<div class=\"bx-tm-popup-clock-wnd-custom-date-block\"><span class=\"bx-tm-popup-clock-wnd-custom-date-link bx-tm-popup-clock-wnd-custom-date-link-edit\" data-role=\"date-picker\" data-type=\"#TYPE#\">" . \Bitrix\Main\Localization\Loc::getMessage('TM_CLOCK_SELECT_DATE_LINK') . "</span></div>";
echo '<table class="tm-double-clock-table" align="center"><tr>'
. '<td class="tm-double-clock-table-row tm-double-clock-table-first">'
. $clock1 . str_replace('#TYPE#', 'start', $dateSelect)
. '</td><td class="tm-double-clock-table-row tm-double-clock-table-second">'
. $clock2 . str_replace('#TYPE#', 'end', $dateSelect)
. '</td></tr></table>';
?>
<script type="text/javascript">BX.onCustomEvent('onTMClockRegister', [{<?=CUtil::JSEscape($_REQUEST['clock_id'])?>:
'<?=$clock_input_id_1?>',<?=CUtil::JSEscape($_REQUEST['clock_id_1'])?>:
'<?=$clock_input_id_2?>'
}])</script><?
}
}
elseif ($action == 'tasks')
{
if (!CModule::IncludeModule('tasks'))
{
die;
}
$APPLICATION->ShowAjaxHead();
$APPLICATION->IncludeComponent(
"bitrix:tasks.task.selector",
".default",
[
// TODO: needs good synchronization first "MULTIPLE" => "Y",
"MULTIPLE" => "N",
"NAME" => "TIMEMAN_TASKS",
// TODO: needs good synchronization first "VALUE" => $arTasksIds,
"VALUE" => '',
"POPUP" => "N",
"ON_SELECT" => "TIMEMAN_ADD_TASK_" . $_REQUEST['suffix'],
"PATH_TO_TASKS_TASK" => str_replace('#USER_ID#', $USER->GetID(), COption::GetOptionString('intranet', 'path_task_user_entry', '/company/personal/user/#USER_ID#/tasks/task/view/#TASK_ID#/', $_REQUEST['site_id'])),
"SITE_ID" => $_REQUEST['site_id'],
"FILTER" => [
'DOER' => $USER->GetID(),
'STATUS' => [
-2,
-1,
CTasks::STATE_NEW,
CTasks::STATE_PENDING,
CTasks::STATE_IN_PROGRESS,
CTasks::STATE_DEFERRED,
],
],
"SELECT" => ['ID', 'TITLE', 'STATUS'],
'HIDE_ADD_REMOVE_CONTROLS' => 'Y',
],
null,
["HIDE_ICONS" => "Y"]
);
}
elseif ($action == "editor")
{
$APPLICATION->ShowAjaxHead();
CModule::IncludeModule("fileman");
$LHE = new CLightHTMLEditor();
$LHE->Show([
'id' => (($_REQUEST["obname"] <> '') ? $_REQUEST["obname"] : "oReportLHE"),
'content' => "",
'inputName' => "ITEM_DESCRIPTION",
'inputId' => "",
'width' => "100%",
'height' => "200px",
'bUseFileDialogs' => false,
'jsObjName' => (($_REQUEST["obname"] <> '') ? $_REQUEST["obname"] : "oReportLHE"),
'toolbarConfig' => [
'Bold', 'Italic', 'Underline', 'Strike',
'ForeColor', 'FontList', 'FontSizeList',
'RemoveFormat',
//'Quote', 'Code',
'Image',
'Table',
'InsertOrderedList',
'InsertUnorderedList',
'Source',
],
'bResizable' => false,
'bAutoResize' => false,
]);
}
elseif ($action == "upload_attachment")
{
$report = null;
$report_id = intval($_POST["report_id"]);
if ($report_id > 0)
{
$user_id = intval($_REQUEST['user_id']);
if ($user_id <= 0)
{
$user_id = $USER->GetID();
}
$bCanReadUser = $user_id == $USER->GetID();
if (!$bCanReadUser)
{
$arAccessUsers = CTimeMan::GetAccess();
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$bCanReadUser = $bCanReadAll || in_array($user_id, $arAccessUsers["READ"]);
}
if ($bCanReadUser)
{
$dbreport = CTimeManReportFull::GetList(
["ID" => "asc"],
["ID" => $report_id, "USER_ID" => $user_id]
);
$report = $dbreport->fetch();
}
}
elseif (!is_array($_SESSION['report_files']))
{
$_SESSION['report_files'] = [];
}
if ($_POST["mode"] == "upload")
{
$arResult = [];
$count = sizeof($_FILES["report-attachments"]["name"]);
for ($i = 0; $i < $count; $i++)
{
$arFile = [
"name" => $_FILES["report-attachments"]["name"][$i],
"size" => $_FILES["report-attachments"]["size"][$i],
"tmp_name" => $_FILES["report-attachments"]["tmp_name"][$i],
"type" => $_FILES["report-attachments"]["type"][$i],
"MODULE_ID" => "timeman",
];
$fileID = CFile::SaveFile($arFile, "timeman");
$tmp = [
"name" => $_FILES["report-attachments"]["name"][$i],
"fileID" => $fileID,
];
if ($fileID)
{
$arResult[] = $tmp;
}
}
if (count($arResult) > 0)
{
if ($report)
{
$arCurFiles = unserialize($report["FILES"]);
$arFiles = (is_array($arCurFiles) && count($arCurFiles) > 0) ? array_merge($arCurFiles, $arResult) : $arResult;
CTimeManReportFull::Update($report["ID"], ["FILES" => $arFiles]);
}
else
{
$_SESSION['report_files'] = array_merge($_SESSION['report_files'], $arResult);
}
}
$APPLICATION->RestartBuffer();
Header('Content-Type: text/html; charset=' . LANG_CHARSET);
?>
<script type="text/javascript">
window.parent.window.<?echo (int)$_POST["form_id"]?>.RefreshUpload(<?php echo CUtil::PhpToJsObject($arResult);?>, <?php echo intval($_POST["uniqueID"])?>);
</script>
<?
}
elseif ($_POST["mode"] == "delete")
{
if ($report)
{
$arFiles = unserialize($report["FILES"]);
}
else
{
$arFiles = $_SESSION['report_files'];
}
if (is_array($arFiles))
{
foreach ($arFiles as $key => $file)
{
if ($file["fileID"] == $_POST["fileID"])
{
CFile::Delete(intval($_POST["fileID"]));
unset($arFiles[$key]);
if (isset($_SESSION['report_files']))
{
unset($_SESSION['report_files'][$key]);
$_SESSION['report_files'] = array_values($_SESSION['report_files']);
}
if ($report)
{
CTimeManReportFull::Update($report["ID"], ["FILES" => array_values($arFiles)]);
}
break;
}
}
}
}
}
elseif ($action == "get_attachment")
{
$result['FILE'] = null;
$report_id = intval($_REQUEST["report_id"]);
$arFiles = null;
if ($report_id > 0)
{
$report = null;
$user_id = intval($_REQUEST['user_id']);
if ($user_id <= 0)
{
$user_id = $USER->GetID();
}
$bCanReadUser = $user_id == $USER->GetID();
if (!$bCanReadUser)
{
$arAccessUsers = CTimeMan::GetAccess();
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$bCanReadUser = $bCanReadAll || in_array($user_id, $arAccessUsers["READ"]);
}
if ($bCanReadUser)
{
$dbreport = CTimeManReportFull::GetList(
["ID" => "asc"],
["ID" => $report_id, "USER_ID" => $user_id]
);
$report = $dbreport->fetch();
}
if (is_array($report) && $report['FILES'] <> '')
{
$arFiles = unserialize($report['FILES']);
}
}
elseif (isset($_SESSION['report_files']))
{
$arFiles = $_SESSION['report_files'];
}
if (is_array($arFiles))
{
$fileId = intval($_REQUEST["fid"]);
if (is_array($arFiles))
{
foreach ($arFiles as $file)
{
if ($fileId == $file['fileID'])
{
$result["FILE"] = CFile::GetFileArray($fileId);
break;
}
}
}
}
if (!is_array($result["FILE"]))
{
require($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/prolog_after.php");
ShowError("File not found");
require($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/epilog.php");
die();
}
set_time_limit(0);
CFile::ViewByUser($result["FILE"]);
}
else
{
$bAdminAction = mb_substr($action, 0, 6) == 'admin_' || $action == 'calendar_show' || $action == 'add_comment_entry' || $action == 'add_comment_full_report' || $action == 'user_report_edit' || $action == 'report_full_setting';
if (
!CTimeMan::CanUse($bAdminAction)
)
{
echo "{error: 'access denied', type: 'fatal'}";
}
else
{
CUtil::JSPostUnescape();
$error = false;
$bReturnRes = false;
$bGetFullInfo = $_REQUEST['full'] == 'Y';
/** @var CTimeManUser $obUser */
$obUser = CTimeManUser::instance();
$obUser->SITE_ID = $_REQUEST['site_id'];
switch ($action)
{
case "report_full_setting":
$bReturnRes = true;
if ($_POST["id"])
{
$ID = intval($_POST["id"]);
}
if ($_POST["object"] == 'user')
{
$arAccessUsers = CTimeMan::GetAccess();
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
if ($bCanReadAll || in_array($ID, $arAccessUsers["READ"]))
{
$tmr = new CUserReportFull($ID);
$res = $tmr->GetSettings(true);
}
}
elseif ($_POST["object"] == 'dep')
{
$current_user = $USER->GetID();
$arSubordination = CIntranetUtils::GetSubordinateDepartments($current_user, true);
if (in_array($ID, $arSubordination) || CTimeMan::IsAdmin())
{
$res = CReportSettings::GetSectionSettings($ID, true);
}
}
break;
case 'user_report_edit':
$bReturnRes = true;
$ID = intval($_POST["report_id"]);
$sanitizer = new CBXSanitizer();
$sanitizer->ApplyDoubleEncode(false);
$sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_LOW);
$REPORT = $sanitizer->SanitizeHtml($_POST["report_text"]);
$PLAN = $sanitizer->SanitizeHtml($_POST["plan_text"]);
$dbReport = CTimeManReportFull::GetByID($ID);
$arReport = $dbReport->Fetch();
$USER_ID = $arReport['USER_ID'];
$arAccessUsers = CTimeMan::GetAccess();
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanEditUser = in_array($USER_ID, $arAccessUsers['WRITE']);
$res = ["success" => false];
if (
$arReport["MARK"] == "X"
&& ($bCanEditAll || $bCanEditUser || CTimeMan::IsAdmin() || $USER_ID == $USER->GetID())
)
{
if (CTimeManReportFull::Update($ID, ["REPORT" => $REPORT, "PLANS" => $PLAN]))
{
CReportNotifications::MessageUpdate($ID);
$CACHE_MANAGER->Clean(CUserReportFull::getInfoCacheId($USER_ID), 'timeman_report_info');
$res = ["success" => true];
}
}
break;
case 'admin_report_full':
$bReturnRes = true;
$ID = intval($_POST["report_id"]);
$USER_ID = intval($_POST["user_id"]);
$OBJID = intval($_POST["id"]);
$arAccessUsers = CTimeMan::GetAccess();
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$bCanReadUser = (in_array($USER_ID, $arAccessUsers["READ"]) || $bCanReadAll);
$bCanWriteUser = (in_array($USER_ID, $arAccessUsers["WRITE"]) || $bCanEditAll);
if ($USER_ID > 0 && $bCanWriteUser && ($_POST["approve"]))
{
if ($_POST["approve"] == "Y")
{
$dbrep = CTimeManReportFull::GetByID($ID);
$rep = $dbrep->Fetch();
if (is_array($rep) && $USER_ID == $rep['USER_ID'])
{
$arFields = [
"MARK" => (in_array($_POST["mark"], ["G", "B", "N"]) !== false) ? $_POST["mark"] : "X",
];
if ($arFields["MARK"] != "X")
{
$arFields["APPROVER"] = $USER->GetID();
$arFields["APPROVE"] = "Y";
$arFields["APPROVE_DATE"] = ConvertTimeStamp(time(), "FULL");
}
else
{
$arFields["APPROVE"] = "N";
$arFields["APPROVER"] = 0;
$arFields["APPROVE_DATE"] = "";
}
CTimeManReportFull::Update($ID, $arFields);
$CACHE_MANAGER->Clean(CUserReportFull::getInfoCacheId($USER_ID), 'timeman_report_info');
CReportNotifications::MessageUpdate($ID, $rep, $arFields);
}
}
}
elseif ($_POST["mode"] && $OBJID > 0)
{
$arFields = [
"UF_REPORT_PERIOD" => $_POST["mode"],
"UF_TM_TIME" => (IsAmPmMode() ? convertTimeToMilitary($_POST["time"], 'H:MI T', 'HH:MI') : $_POST["time"]),
"UF_TM_REPORT_DATE" => $_POST["date"],
"UF_TM_DAY" => $_POST["day"],
"ID" => $OBJID,
];
if ($_POST["object"] == "user")
{
$bCanEdit = ((in_array($OBJID, $arAccessUsers["WRITE"]) && $OBJID != $USER->GetID())
|| $bCanEditAll || CTimeMan::IsAdmin()
);
if ($bCanEdit)
{
$arReportUser = new CUserReportFull($OBJID);
$res = $arReportUser->SetPeriod($arFields);
$CACHE_MANAGER->Clean(CReportSettings::getSettingsCacheId($OBJID), 'timeman_report_settings');
$CACHE_MANAGER->Clean(CUserReportFull::getInfoCacheId($OBJID), 'timeman_report_info');
}
}
elseif ($_POST["object"] == "dep")
{
$arSubordination = CIntranetUtils::GetSubordinateDepartments($USER->GetID(), true);
$bCanEdit = (in_array($OBJID, $arSubordination) || CTimeMan::IsAdmin());
if ($bCanEdit)
{
$res = CTimeManReportFull::SetPeriodSection($arFields);
$CACHE_MANAGER->CleanDir('timeman_report_settings');
$CACHE_MANAGER->CleanDir('timeman_report_info');
}
}
}
if ($bCanReadUser && !$_POST["mode"])
{
$dbRes = CUser::GetList(
$by = 'ID', $order = 'ASC',
['ID' => $USER_ID],
['SELECT' => ['UF_*']]
);
$arUser = $dbRes->GetNext();
$arUser['PHOTO'] =
$arUser['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($arUser['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$arManagers = CTimeMan::GetUserManagers($USER_ID);
$arManagers[] = $USER_ID;
if (!is_array($arManagers) || count($arManagers) <= 0)
{
$arManagers = [$USER_ID];
}
$user_url = COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $_REQUEST['site_id']);
$dbManagers = CUser::GetList($by = 'ID', $order = 'ASC', ['ID' => implode('|', $arManagers)]);
$res["TO"] = [];
$res["FROM"] = [];
while ($manager = $dbManagers->Fetch())
{
$manager['PHOTO'] =
$manager['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($manager['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$arUserData = [
'ID' => $manager['ID'],
'LOGIN' => $manager['LOGIN'],
'NAME' => CUser::FormatName(CSite::GetNameFormat(false), $manager, true, true),
'URL' => str_replace(['#ID#', '#USER_ID#'], $manager['ID'], $user_url),
'WORK_POSITION' => $manager['WORK_POSITION'],
'PHOTO' => $manager['PHOTO']['CACHE']['src'],
];
if ($USER_ID == $arUserData["ID"])
{
$res["FROM"] = $arUserData;
}
else
{
$res["TO"][] = $arUserData;
}
}
if (count($res["TO"]) == 0)
{
$res["TO"][] = $res["FROM"];
}
$arFilter = ["ID" => $ID, "USER_ID" => $USER_ID];
$arReportID = [];
if ($_POST["empty_slider"])
{
$arFilter = ["ACTIVE" => "Y", "USER_ID" => $USER_ID];
}
$dbres = CTimeManReportFull::GetList(["USER_ID" => "asc", "ID" => "asc"], $arFilter);
$report = null;
while ($rep = $dbres->Fetch())
{
$arReportID[] = $rep["ID"];
if ($rep["ID"] == $ID)
{
$report = $rep;
}
}
$res["REPORT_LIST"] = $arReportID;
if (is_array($report))
{
$res["INFO"] = $report;
if ($res["INFO"]['TASKS_ENABLED'] = (CBXFeatures::IsFeatureEnabled('Tasks') && CModule::IncludeModule('tasks')))
{
$res["INFO"]['TASKS'] = unserialize($res["INFO"]['TASKS']);
}
else
{
unset($res["INFO"]['TASKS']);
}
if ($res["INFO"]['CALENDAR_ENABLED'] = CBXFeatures::IsFeatureEnabled('Calendar'))
{
$res["INFO"]['EVENTS'] = unserialize($res["INFO"]['EVENTS']);
}
else
{
unset($res["INFO"]['EVENTS']);
}
if ($res["INFO"]['FILES'])
{
$res["INFO"]['FILES'] = unserialize($res["INFO"]['FILES']);
}
$res["INFO"]['CAN_EDIT'] = ($arUser['ID'] != $USER->GetID()) && ($bCanEditAll || in_array($arUser['ID'], $arAccessUsers['WRITE']));
$res["INFO"]['CAN_EDIT_TEXT'] = ($report["APPROVE"] == "Y") ? "N" : "Y";
if ($report["DATE_FROM"] != $report["DATE_TO"])
{
$res["INFO"]["TEXT_TITLE"] = FormatDate('j F', MakeTimeStamp($report["DATE_FROM"])) . " - " . FormatDate('j F', MakeTimeStamp($report["DATE_TO"]));
}
else
{
$res["INFO"]["TEXT_TITLE"] = FormatDate('j F', MakeTimeStamp($report["DATE_TO"]));
}
$res["INFO"]["REPORT_STRIP_TAGS"] = strip_tags(nl2br($res["INFO"]["REPORT"]));
$res["INFO"]["PLAN_STRIP_TAGS"] = strip_tags(nl2br($res["INFO"]["PLANS"]));
$res["INFO"]["APPROVER_INFO"] = [];
if (intval($res["INFO"]["APPROVER"]) > 0)
{
$res["INFO"]["APPROVE_DATE"] = FormatDate($DB->DateFormatToPHP(FORMAT_DATETIME), MakeTimeStamp($res["INFO"]["APPROVE_DATE"]));
foreach ($res["TO"] as $manager)
{
if ($manager["ID"] == intval($res["INFO"]["APPROVER"]))
{
$res["INFO"]["APPROVER_INFO"] = $manager;
break;
}
}
if (!$res["INFO"]["APPROVER_INFO"])
{
$dbaprrove = CUser::GetList($by = 'ID', $order = 'ASC', ['ID' => intval($res["INFO"]["APPROVER"])]);
if ($approver = $dbaprrove->Fetch())
{
$approver['PHOTO'] =
$approver['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($approver['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$res["INFO"]["APPROVER_INFO"] = [
'ID' => $approver['ID'],
'LOGIN' => $approver['LOGIN'],
'NAME' => CUser::FormatName(CSite::GetNameFormat(false), $approver, true, true),
'URL' => str_replace(['#ID#', '#USER_ID#'], $approver['ID'], $user_url),
'WORK_POSITION' => $approver['WORK_POSITION'],
'PHOTO' => $approver['PHOTO']['CACHE']['src'],
];
}
}
}
ob_start();
$APPLICATION->IncludeComponent(
"bitrix:timeman.topic.reviews",
"",
[
"REPORT_ID" => $ID,
],
false
);
$res["COMMENTS"] = ob_get_contents();
ob_end_clean();
}
}
break;
//carter
case 'check_report':
$bReturnRes = true;
$obReportUser = new CUserReportFull;
$force = false;
if ($_REQUEST["force"] == "Y")
{
$force = true;
}
$res = $obReportUser->GetReportData($force);
break;
case 'get_task':
$bReturnRes = true;
$task_id = intval($_POST["task_id"]);
$dbTasks = CTasks::GetList([], [
'ID' => $task_id,
'DOER' => $USER->GetId(),
]);
if ($arTask = $dbTasks->Fetch())
{
$res = [
'ID' => $arTask['ID'],
'PRIORITY' => $arTask['PRIORITY'],
'STATUS' => $arTask['STATUS'],
'TITLE' => $arTask['TITLE'],
'TASK_CONTROL' => $arTask['TASK_CONTROL'],
'TIME' => $arTask['TIME'],
'URL' => str_replace(
['#USER_ID#', '#TASK_ID#'],
[$USER->GetID(), $arTask['ID']],
COption::GetOptionString('intranet', 'path_task_user_entry', '/company/personal/user/#USER_ID#/tasks/task/view/#TASK_ID#/')
),
];
}
break;
case 'save_full_report':
$bReturnRes = true;
$tm_user = new CUserReportFull;
$curUser = $USER->GetID();
$toUser = intval($_POST["TO_USER"]);
$bSameUser = ($toUser == $curUser);
if ($_POST['ACTIVE'])
{
if ($_POST['DELAY'] == "Y")
{
$res = $tm_user->Delay();
}
$sanitizer = new CBXSanitizer();
$sanitizer->ApplyDoubleEncode(false);
$sanitizer->SetLevel(CBXSanitizer::SECURE_LEVEL_LOW);
$arFields = [
"DATE_TO" => ConvertTimeStamp($_POST["DATE_TO"], "SHORT"),
"DATE_FROM" => ConvertTimeStamp($_POST["DATE_FROM"], "SHORT"),
"MARK" => "X",
"TASKS" => $_POST["TASKS"],
"EVENTS" => $_POST["EVENTS"],
"ACTIVE" => $_POST["ACTIVE"],
"REPORT" => $sanitizer->SanitizeHtml($_POST["REPORT"]),
"PLANS" => $sanitizer->SanitizeHtml($_POST["PLANS"]),
];
if ($arFields["ACTIVE"] != "Y")
{
$arFields["EVENTS"] = [];
$arFields["TASKS"] = [];
}
if ($_POST["TASKS_TIME"] && is_array($arFields["TASKS"]))
{
foreach ($arFields["TASKS"] as $key => $arTask)
{
$arFields["TASKS"][$key]["TIME"] = $_POST["TASKS_TIME"][$key];
}
}
$ID = (intval($_POST["REPORT_ID"]) > 0) ? $_POST["REPORT_ID"] : false;
if ($ID == false)
{
//we have saved report?
$dbres = CTimeManReportFull::GetList(["ID" => "desc"], ["ACTIVE" => "N", "USER_ID" => $curUser], ["ID"], ["nTopCount" => 1]);
if ($arCurrentReport = $dbres->Fetch())
{
$ID = $arCurrentReport["ID"];
}
}
if ($bSameUser && $arFields["ACTIVE"] == "Y")
{
$arFields["APPROVE"] = "Y";
$arFields["APPROVER"] = $curUser;
$arFields["APPROVE_DATE"] = ConvertTimeStamp(time(), "FULL");
$arFields["MARK"] = "N";
}
if ($ID)
{
$dbReport = CTimeManReportFull::GetByID($ID);
$arReport = $dbReport->Fetch();
if ($USER->GetID() == $arReport["USER_ID"])
{
$res = CTimeManReportFull::Update($ID, $arFields);
}
if ($arFields["ACTIVE"] == "Y" && $arReport["ACTIVE"] == "N")
{
$last_date = MakeTimeStamp($arFields["DATE_TO"]);
$last_date = ConvertTimeStampForReport($last_date, "SHORT");
$tm_user->SetLastDate($arReport["USER_ID"], $last_date);
$tm_user->CancelDelay();
if (!$bSameUser)
{
CReportNotifications::SendMessage($ID);
}
}
}
else
{
if (is_array($_SESSION['report_files']))
{
$arFields['FILES'] = $_SESSION['report_files'];
}
$arManagers = CTimeMan::GetUserManagers($curUser);
$res = CTimeManReportFull::Add($arFields);
if ($res && $arFields["ACTIVE"] != "N" && !$bSameUser)
{
CReportNotifications::SendMessage($res);
}
}
$_SESSION['report_files'] = [];
$CACHE_MANAGER->Clean(CUserReportFull::getInfoCacheId($curUser), 'timeman_report_info');
$CACHE_MANAGER->Clean(CReportSettings::getSettingsCacheId($curUser), 'timeman_report_settings');
}
break;
case "add_comment_full_report":
$bReturnRes = true;
$ID = intval($_POST["report_id"]);
$dbReport = CTimeManReportFull::GetByID($ID);
$report = $dbReport->Fetch();
if ($report && CModule::IncludeModule("forum"))
{
$OWNER = intval($report["USER_ID"]);
$CURRENT_USER = $USER->GetID();
$arAccessUsers = CTimeMan::GetAccess();
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$bCanAddComment = (in_array($OWNER, $arAccessUsers['WRITE']) || CTimeMan::IsAdmin() || $bCanEditAll || $OWNER == $CURRENT_USER);
if ($_POST["add_comment"] == "Y" && $bCanAddComment)
{
$arFields = [
"REPORT_ID" => $ID,
"COMMENT_TEXT" => $_POST["comment_text"],
"USER_ID" => $CURRENT_USER,
"REPORT_OWNER" => $OWNER,
];
$comment_id = CReportNotifications::AddCommentToLog($arFields);
ob_start();
$APPLICATION->IncludeComponent(
"bitrix:timeman.topic.reviews",
"",
[
"REPORT_ID" => $ID,
],
false
);
$res["COMMENTS"] = ob_get_contents();
ob_end_clean();
$count = CForumMessage::GetList(["ID" => "ASC"], ["TOPIC_ID" => $report['FORUM_TOPIC_ID']], true);
$res["COMMENTS_COUNT"] = $count;
}
else
{
$res = ["ERROR" => "ADD COMMENT ERROR"];
}
}
else
{
$res = ["ERROR" => "ADD COMMENT ERROR"];
}
break;
case "add_comment_entry":
$bReturnRes = true;
$ID = intval($_REQUEST["entry_id"]);
$dbEntry = CTimeManEntry::GetByID($ID);
$entry = $dbEntry->Fetch();
if ($entry && CModule::IncludeModule("forum"))
{
$OWNER = intval($entry["USER_ID"]);
$CURRENT_USER = $USER->GetID();
$arAccessUsers = CTimeMan::GetAccess();
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$bCanAddComment = (in_array($OWNER, $arAccessUsers['WRITE']) || CTimeMan::IsAdmin() || $bCanEditAll || $OWNER == $CURRENT_USER);
if ($bCanAddComment)
{
$arFields = [
"ENTRY_ID" => $ID,
"COMMENT_TEXT" => $_REQUEST["comment_text"],
"USER_ID" => $USER->GetID(),
];
$comment_id = CTimeManNotify::AddCommentToLog($arFields);
ob_start();
$APPLICATION->IncludeComponent('bitrix:timeman.topic.reviews', '', ['ENTRY_ID' => $ID], null, ['HIDE_ICONS' => 'Y']);
$res['COMMENTS'] = trim(ob_get_contents());
ob_end_clean();
$count = CForumMessage::GetList(
["ID" => "ASC"],
["TOPIC_ID" => $report['FORUM_TOPIC_ID']],
true
);
$res["COMMENTS_COUNT"] = $count;
}
else
{
$res = ["ERROR" => "ADD COMMENT ERROR"];
}
}
else
{
$res = ["ERROR" => "ADD COMMENT ERROR"];
}
break;
case 'save':
$arSettings = $obUser->GetSettings(['UF_TM_REPORT_REQ']);
$bClose = false;
if ($arSettings['UF_TM_REPORT_REQ'] != 'A' && isset($_REQUEST['timeman_edit_to']))
{
$bClose = true;
$timestamp = $_REQUEST['timeman_edit_to'];
}
$res = $obUser->editDay([
'REPORT' => trim($_REQUEST['report']),
'TIME_START' => isset($_REQUEST['timeman_edit_from']) ? intval($_REQUEST['timeman_edit_from']) % 86400 : null,
'DATE_START' => isset($_REQUEST['startUserDate']) ? $_REQUEST['startUserDate'] : null,
'TIME_FINISH' => isset($_REQUEST['timeman_edit_to']) ? intval($_REQUEST['timeman_edit_to']) % 86400 : null,
'DATE_FINISH' => isset($_REQUEST['endUserDate']) ? $_REQUEST['endUserDate'] : null,
'TIME_LEAKS' => isset($_REQUEST['TIME_LEAKS']) ? intval($_REQUEST['TIME_LEAKS']) : null,
'LAT_CLOSE' => isset($_REQUEST['lat']) ? doubleval($_REQUEST['lat']) : '',
'LON_CLOSE' => isset($_REQUEST['lon']) ? doubleval($_REQUEST['lon']) : '',
'DEVICE' => $device,
]);
if ($res !== false && $bClose)
{
$bReturnRes = true;
$res = CTimeMan::getRuntimeInfo(true);
$res['CLOSE_TIMESTAMP'] = $timestamp;
$res['CLOSE_TIMESTAMP_REPORT'] = trim($_REQUEST['report']);
}
break;
case 'close':
$bReturnRes = true;
$TMUSER = CTimeManUser::instance();
$dbRes = CUser::GetList(
$by = 'ID', $order = 'ASC',
['ID' => $USER->GetID()],
['SELECT' => ['UF_*']]
);
$arCurrentUser = $dbRes->GetNext();
$arCurrentUser['PHOTO'] =
$arCurrentUser['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($arCurrentUser['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$arManagers = CTimeMan::GetUserManagers($USER->GetID());
if (!is_array($arManagers) || count($arManagers) <= 0)
{
$arManagers = [$USER->GetID()];
}
$arCurrentUserManagers = [];
$user_url = COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $_REQUEST['site_id']);
foreach ($arManagers as $managerId)
{
$dbManager = CUser::GetByID($managerId);
if ($manager = $dbManager->Fetch())
{
$manager['PHOTO'] =
$manager['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($manager['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$arCurrentUserManagers[] = [
'ID' => $manager['ID'],
'LOGIN' => $manager['LOGIN'],
'NAME' => CUser::FormatName(CSite::GetNameFormat(false), $manager, true, false),
'URL' => str_replace(['#ID#', '#USER_ID#'], $manager['ID'], $user_url),
'WORK_POSITION' => $manager['WORK_POSITION'],
'PHOTO' => $manager['PHOTO']['CACHE']['src'],
];
}
}
$arInfo = CTimeMan::GetRuntimeInfo(true);
$arInfo['DATE_TEXT'] = FormatDate('j F Y', $arInfo['INFO']['DATE_START']);
$arInfo['INFO']['TIME_OFFSET'] = CTimeManUser::getDayStartOffset($arInfo['INFO'], true);
if ($arInfo['PLANNER'])
{
$arPlannerInfo = CIntranetPlanner::callAction('timeman_close', $_REQUEST['site_id']);
// TODO: migrate this to calendar module ASAP
if (is_array($arInfo['PLANNER']['DATA']['EVENTS']))
{
foreach ($arInfo['PLANNER']['DATA']['EVENTS'] as $key => $arEvent)
{
if ($arEvent['STATUS'] && $arEvent['STATUS'] != 'Y')
{
unset($arInfo['PLANNER']['DATA']['EVENTS'][$key]);
}
}
$arInfo['PLANNER']['DATA']['EVENTS'] = array_values($arInfo['PLANNER']['DATA']['EVENTS']);
}
// \TODO
$arInfo['PLANNER']['DATA'] = array_merge($arInfo['PLANNER']['DATA'], $arPlannerInfo);
$arInfo = array_merge($arInfo, $arInfo['PLANNER']['DATA']);
unset($arInfo['PLANNER']);
}
$arUserSettings = $TMUSER->GetSettings();
$res = [
'FROM' => [
'ID' => $arCurrentUser['ID'],
'LOGIN' => $arCurrentUser['LOGIN'],
'NAME' => CUser::FormatName(CSite::GetNameFormat(false), $arCurrentUser, true, false),
'URL' => str_replace(['#ID#', '#USER_ID#'], $arCurrentUser['ID'], $user_url),
'WORK_POSITION' => $arCurrentUser['WORK_POSITION'],
'PHOTO' => $arCurrentUser['PHOTO']['CACHE']['src'],
],
'TO' => array_values($arCurrentUserManagers),
'INFO' => $arInfo,
'REPORT' => '',
'REPORTS' => [],
'REPORT_REQ' => $arUserSettings['UF_TM_REPORT_REQ'],
'REPORT_TPL' => $arUserSettings['UF_TM_REPORT_TPL'],
];
if (count($res['TO']) <= 0)
{
$res['TO'] = [$res['FROM']];
}
$arUserIDs = [];
$dbReports = CTimeManReport::GetList(['ID' => 'ASC'], ['ENTRY_ID' => $arInfo['ID']]);
while ($arReport = $dbReports->Fetch())
{
switch ($arReport['REPORT_TYPE'])
{
case 'ERR_OPEN':
case 'ERR_CLOSE':
case 'ERR_DURATION':
$arUserIDs[] = $arReport['USER_ID'];
$key = $arReport['REPORT_TYPE'] == 'ERR_OPEN'
? 'TIME_START'
: (
$arReport['REPORT_TYPE'] == 'ERR_CLOSE'
? 'TIME_FINISH'
: 'DURATION'
);
$arReportData = explode(';', $arReport['REPORT']);
if (!$res['REPORTS'][$key])
{
$res['REPORTS'][$key] = [];
}
$report_ts = strtotime($arReportData[1]) + CTimeZone::GetOffset();
$res['REPORTS'][$key][0] = [
'TYPE' => $arReportData[0],
'TYPE_TEXT' => $arReportData[0],
'TIME' => $report_ts + date('Z'),
'DATE_TIME' => FormatDate(str_replace(':s', '', $DB->DateFormatToPHP(FORMAT_DATETIME)), MakeTimeStamp($arReport['TIMESTAMP_X'])),
'ACTIVE' => $arReport['ACTIVE'] == 'Y',
'USER_ID' => $arReport['USER_ID'],
];
break;
case 'REPORT_OPEN':
case 'REPORT_CLOSE':
case 'REPORT_DURATION':
$key = $arReport['REPORT_TYPE'] == 'REPORT_OPEN'
? 'TIME_START'
: (
$arReport['REPORT_TYPE'] == 'REPORT_CLOSE'
? 'TIME_FINISH'
: 'DURATION'
);
if (count((array)$res['REPORTS'][$key]) > 0)
{
if (mb_strlen($arReport['REPORT']) > 150)
{
$arReport['REPORT_FULL'] = $arReport['REPORT'];
$arReport['REPORT'] = mb_substr($arReport['REPORT'], 0, 150).'...';
}
$res['REPORTS'][$key][0]['REPORT'] = htmlspecialcharsbx($arReport['REPORT']);
if ($arReport['REPORT_FULL'])
{
$res['REPORTS'][$key][0]['REPORT_FULL'] = htmlspecialcharsbx($arReport['REPORT_FULL']);
}
}
break;
case 'REPORT':
$res['REPORT'] = $arReport['REPORT'];
}
}
if (count($arUserIDs) > 0)
{
$arUserIDs = array_unique($arUserIDs);
$dbUsers = CUser::GetList(
$by = 'ID', $order = 'ASC',
['ID' => implode('|', $arUserIDs), 'ACTIVE' => 'Y']
);
while ($arUser = $dbUsers->Fetch())
{
$name = CUser::FormatName(CSite::GetNameFormat(false), $arUser);
foreach ($res['REPORTS'] as &$rep)
{
foreach ($rep as &$arReport)
{
if ($arReport['USER_ID'] == $arUser['ID'])
{
$arReport['USER_NAME'] = $name;
}
}
}
}
}
// all data ready, show form
if (!$_REQUEST['ready'] && $arUserSettings['UF_TM_REPORT_REQ'] !== 'A' && !$arUserSettings['UF_TM_FREE'])
{
ob_start();
$APPLICATION->IncludeComponent('bitrix:timeman.topic.reviews', '', ['ENTRY_ID' => $arInfo['ID']], null, ['HIDE_ICONS' => 'Y']);
$res['COMMENTS'] = trim(ob_get_contents());
ob_end_clean();
break;
}
// we shouldn't show the form or form is already sent
$report_text = $res['REPORT'];
$res = true;
$bReturnRes = false;
// check required report text
if ($arUserSettings['UF_TM_REPORT_REQ'] == 'Y' && !$arUserSettings['UF_TM_FREE'])
{
$report = preg_replace('/\s/', '', $_REQUEST['REPORT']);
if ($report == '')
{
$res = false;
}
elseif (is_array($arUserSettings['UF_TM_REPORT_TPL']))
{
foreach ($arUserSettings['UF_TM_REPORT_TPL'] as $tpl)
{
if ($report == preg_replace('/\s/', '', $tpl))
{
$res = false;
break;
}
}
}
if (!$res)
{
break;
}
}
$arFields = [
'ACTIVE' => 'N',
'USER_ID' => $USER->GetID(),
'ENTRY_ID' => $arInfo['ID'],
'REPORT_DATE' => ConvertTimeStamp($arInfo['INFO']['DATE_START']),
'REPORT' => $_REQUEST['REPORT'],
'EVENTS' => $arInfo['EVENTS'],
];
// auto generated report
if ($arUserSettings['UF_TM_REPORT_REQ'] == 'A')
{
$arFields['REPORT'] = $report_text;
if ($arInfo['TASKS_ENABLED'])
{
$arFields['TASKS'] = $arInfo['TASKS'];
foreach ($arFields['TASKS'] as $key => $arTask)
{
if (!isset($arTask['TIME']) || $arTask['TIME'] <= 0)
{
unset($arFields['TASKS'][$key]);
}
}
$arFields['TASKS'] = array_values($arFields['TASKS']);
}
}
// tasks added from form
elseif (is_array($_REQUEST['TASKS']) && count($_REQUEST['TASKS']) > 0)
{
$arTaskTime = [];
foreach ($_REQUEST['TASKS'] as $i => $task_id)
{
$arTaskTime[$task_id] = $_REQUEST['TASKS_TIME'][$i];
}
$arFields['TASKS'] = $TMUSER->GetTasks($_REQUEST['TASKS']);
foreach ($arFields['TASKS'] as $key => $arTask)
{
$arFields['TASKS'][$key]['TIME'] = $arTaskTime[$arTask['ID']];
}
}
if (isset($_REQUEST['timeman_edit_from']) || isset($_REQUEST['timeman_edit_to']) || isset($_REQUEST['TIME_LEAKS']))
{
$res = $obUser->editDay([
'REPORT' => trim($_REQUEST['report']),
'TIME_START' => isset($_REQUEST['timeman_edit_from']) ? intval($_REQUEST['timeman_edit_from']) % 86400 : null,
'DATE_START' => isset($_REQUEST['startUserDate']) ? $_REQUEST['startUserDate'] : null,
'TIME_FINISH' => isset($_REQUEST['timeman_edit_to']) ? intval($_REQUEST['timeman_edit_to']) % 86400 : null,
'DATE_FINISH' => isset($_REQUEST['endUserDate']) ? $_REQUEST['endUserDate'] : null,
'TIME_LEAKS' => isset($_REQUEST['TIME_LEAKS']) ? intval($_REQUEST['TIME_LEAKS']) % 86400 : null,
'LAT_CLOSE' => isset($_REQUEST['lat']) ? doubleval($_REQUEST['lat']) : '',
'LON_CLOSE' => isset($_REQUEST['lon']) ? doubleval($_REQUEST['lon']) : '',
'DEVICE' => $device,
]);
}
else
{
$res = $obUser->closeDay(
intval($_REQUEST['timestamp']) % 86400,
$_REQUEST['report'],
false,
[
'LAT_CLOSE' => isset($_REQUEST['lat']) ? doubleval($_REQUEST['lat']) : '',
'LON_CLOSE' => isset($_REQUEST['lon']) ? doubleval($_REQUEST['lon']) : '',
'DEVICE' => $device,
'CUSTOM_DATE' => isset($_REQUEST['customUserDate']) ? $_REQUEST['customUserDate'] : null,
]
);
}
if ($res)
{
$res = CTimeManReportDaily::Add($arFields);
}
break;
case 'open':
$timestamp = 0;
$report = '';
if (\Bitrix\Main\Loader::includeModule('bitrix24'))
{
if (!\CBitrix24BusinessTools::isUserUnlimited($USER->GetID()))
{
$res = false;
ob_start();
$assetCollector = new \Bitrix\Main\UserField\AssetCollector();
$assetCollector->startAssetCollection();
$APPLICATION->IncludeComponent("bitrix:bitrix24.business.tools.info", "", ['SHOW_TITLE' => 'N']);
$asset = $assetCollector->getCollectedAssets();
$errorData = ob_get_clean() . implode('', $asset);
$error = \Bitrix\Main\Web\Json::encode([
'error_id' => 'USER_RESTRICTION',
'error' => [
'data' => $errorData,
],
]);
break;
}
}
if ($_REQUEST['timestamp'] > 0)
{
$timestamp = intval($_REQUEST['timestamp']) % 86400;
}
if ($_REQUEST['report'])
{
$report = trim($_REQUEST['report']);
}
$res = $obUser->openDay($timestamp, $report, [
'LAT_OPEN' => isset($_REQUEST['lat']) ? doubleval($_REQUEST['lat']) : '',
'LON_OPEN' => isset($_REQUEST['lon']) ? doubleval($_REQUEST['lon']) : '',
'IP_OPEN' => $_SERVER['REMOTE_ADDR'],
'DEVICE' => $device,
'CUSTOM_DATE' => isset($_REQUEST['customUserDate']) ? $_REQUEST['customUserDate'] : null,
]);
break;
case 'reopen':
$res = $obUser->reopenDay(
true,
$_REQUEST['site_id'],
[
'action' => $_REQUEST['newActionName'],
'DEVICE' => $device,
]
);
break;
case 'pause':
$res = $obUser->pauseDay([
'LAT_CLOSE' => isset($_REQUEST['lat']) ? doubleval($_REQUEST['lat']) : '',
'LON_CLOSE' => isset($_REQUEST['lon']) ? doubleval($_REQUEST['lon']) : '',
'IP_CLOSE' => $_SERVER['REMOTE_ADDR'],
'DEVICE' => $device,
]);
break;
case 'report':
$arReport = $obUser->SetReport($_REQUEST['report'], $_REQUEST['report_ts'], $_REQUEST['entry_id']);
if (is_array($arReport))
{
if ($obUser->State() == 'CLOSED')
{
$arSettings = $obUser->GetSettings(['UF_TM_REPORT_REQ']);
if ($arSettings['UF_TM_REPORT_REQ'] == 'A')
{
$dbRes = CTimeManReportDaily::GetList([], ['ENTRY_ID' => $arReport['ENTRY_ID']], false, false, ['ID']);
$reportDaily = $dbRes->Fetch();
if ($reportDaily)
{
CTimeManReportDaily::Update($reportDaily['ID'], ['REPORT' => $arReport['REPORT']]);
}
}
}
$bReturnRes = true;
$res = [
'REPORT' => $arReport['REPORT'],
'REPORT_TS' => MakeTimeStamp($arReport['TIMESTAMP_X']),
];
}
else
{
$res = false;
}
break;
case 'task':
if (!CBXFeatures::IsFeatureEnabled('Tasks'))
{
break;
}
$obUser->TaskActions([
'name' => $_REQUEST['name'],
'add' => $_REQUEST['add'],
'remove' => $_REQUEST['remove'],
], $_REQUEST['site_id']);
break;
case 'calendar_show':
if (!CBXFeatures::IsFeatureEnabled('Calendar'))
{
break;
}
$ID = intval($_REQUEST['id']);
$bReturnRes = true;
if ($event = CTimeManCalendar::Get([
'ID' => $ID, 'site_id' => $_REQUEST['site_id'],
]))
{
$now = time();
$today = CTimeMan::RemoveHoursTS($now);
$res = [
'ID' => $event['ID'],
'NAME' => $event['NAME'],
'DESCRIPTION' => $event['DETAIL_TEXT'],
'URL' => '/company/personal/user/' . $USER->GetID() . '/calendar/?EVENT_ID=' . $event['ID'],
'DATE_FROM' => MakeTimeStamp($event['DATE_FROM']),
'DATE_TO' => MakeTimeStamp($event['DATE_TO']),
'STATUS' => $event['STATUS'],
];
$res['DATE_FROM_TODAY'] = CTimeMan::RemoveHoursTS($res['DATE_FROM']) == $today;
$res['DATE_TO_TODAY'] = CTimeMan::RemoveHoursTS($res['DATE_TO']) == $today;
$res['DATE_FROM_TODAY'] = CTimeMan::RemoveHoursTS($res['DATE_FROM']) == $today;
$res['DATE_TO_TODAY'] = CTimeMan::RemoveHoursTS($res['DATE_TO']) == $today;
if ($res['DATE_FROM_TODAY'])
{
if (IsAmPmMode())
{
$res['DATE_F'] = FormatDate("today g:i a", $res['DATE_FROM']);
$res['DATE_T'] = FormatDate("g:i a", $res['DATE_TO']);
}
else
{
$res['DATE_F'] = FormatDate("today H:i", $res['DATE_FROM']);
$res['DATE_T'] = FormatDate("H:i", $res['DATE_TO']);
}
if ($res['DATE_TO_TODAY'])
{
$res['DATE_F'] .= ' - ' . $res['DATE_T'];
}
if ($res['DATE_FROM'] > $now)
{
$res['DATE_F_TO'] = GetMessage('TM_IN') . ' ' . FormatDate('Hdiff', time() * 2 - ($res['DATE_FROM'] - CTimeZone::GetOffset()));
}
}
else
{
if ($res['DATE_TO_TODAY'])
{
$res['DATE_F'] = FormatDate(str_replace(
['#today#', '#time#'],
['today', 'H:i'],
GetMessage('TM_TILL')
), $res['DATE_TO']);
}
else
{
$fmt = preg_replace('/:s$/', '', $DB->DateFormatToPHP(CSite::GetDateFormat("FULL")));
$res['DATE_F'] = FormatDate($fmt, $res['DATE_FROM']);
$res['DATE_F_TO'] = FormatDate($fmt, $res['DATE_TO']);
}
}
if ($event['IS_MEETING'] == 'Y')
{
$arGuests = ['Y' => [], 'N' => [], 'Q' => []];
foreach ($event['GUESTS'] as $key => $guest)
{
$guest['url'] = str_replace(
['#ID#', '#USER_ID#'],
$guest['id'],
COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $_REQUEST['site_id'])
);
if ($guest['bHost'])
{
$res['HOST'] = $guest;
}
else
{
$arGuests[$guest['status']][] = $guest;
}
}
$res['GUESTS'] = array_merge($arGuests['Y'], $arGuests['N'], $arGuests['Q']);
}
$res['DESCRIPTION'] = HTMLToTxt($res['DESCRIPTION']);
if (mb_strlen($res['DESCRIPTION']) > 150)
{
$res['DESCRIPTION'] = CUtil::closetags(mb_substr($res['DESCRIPTION'], 0, 150)) . '...';
}
}
else
{
$APPLICATION->ThrowException('event not found', 'event_not_found');
}
break;
case 'calendar_add':
if (!CBXFeatures::IsFeatureEnabled('Calendar'))
{
break;
}
$arParams = [
'calendar_id' => $_REQUEST['cal'],
'site_id' => $_REQUEST['site_id'],
'from' => $_REQUEST['from'],
'to' => $_REQUEST['to'],
'name' => $_REQUEST['name'],
'absence' => $_REQUEST['absence'],
'cal_set_default' => $_REQUEST['cal_set_default'],
];
$res = CTimeManCalendar::Add($arParams);
$bReturnRes = is_array($res);
break;
case 'admin_data_report_full':
$bReturnRes = true;
$amount = 30;
$res = ['DEPARTMENTS' => [], 'USERS' => [], 'NAV' => []];
$bShowAll = $_REQUEST['show_all'] == 'Y';
CUserOptions::SetOption("timeman.report.weekly", "show_all", $_REQUEST['show_all'], false, $USER->GetID());
CUserOptions::SetOption("timeman.report.weekly", "department_id", intval($_REQUEST['department']), false, $USER->GetID());
$page = intval($_REQUEST['page']);
if ($page <= 0)
{
$page = 1;
}
$arAccessUsers = CTimeMan::GetAccess();
if (count($arAccessUsers['READ']) > 0)
{
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$date_to = ConvertTimeStamp($_POST["tf"]);
$date_from = ConvertTimeStamp($_POST["ts"]);
$datefomat = CSite::GetDateFormat("SHORT", SITE_ID);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$section_id = 0;
if ($_REQUEST['department'])
{
$section_id = intval($_REQUEST['department']);
$arFilter['UF_DEPARTMENT'] = CIntranetUtils::GetIBlockSectionChildren(intval($_REQUEST['department']));
}
if (!$bShowAll)
{
$arDirectUsers = CTimeMan::GetDirectAccess();
if (!$bCanReadAll)
{
$arAccessUsers['READ'] = array_intersect($arAccessUsers['READ'], $arDirectUsers);
}
else
{
$arAccessUsers['READ'] = $arDirectUsers;
}
$bCanReadAll = false;
if (count($arAccessUsers['READ']) <= 0)
{
break;
}
}
$arFilter[] = [
"LOGIC" => "OR",
[
"LOGIC" => "AND",
"<DATE_TO" => $date_to,
">=DATE_TO" => $date_from,
],
[
"LOGIC" => "AND",
"<DATE_FROM" => $date_to,
">=DATE_FROM" => $date_from,
],
];
$arFilter[] = [
"LOGIC" => "AND",
["ACTIVE" => "Y"],
];
if ($arAccessUsers["READ"][0] != "*")
{
$arFilter[] = [
"LOGIC" => "AND",
["USER_ID" => $arAccessUsers["READ"]],
];
}
$arUserIDs = CIntranetUtils::GetEmployeesForSorting($page, $amount, $section_id, $bCanReadAll ? false : $arAccessUsers['READ']);
$arSections = array_keys($arUserIDs);
$arUsers = [];
foreach ($arUserIDs as $ar)
{
$arUsers = array_merge($arUsers, $ar);
}
$arFilterUser = [];
$arFilterUser['USER_ID'] = $arUsers;
$dbRes = CUser::GetList($by = 'ID', $order = 'ASC', ['ID' => implode('|', $arUsers), 'ACTIVE' => 'Y'], ['SELECT' => ['*', 'UF_DEPARTMENT']]);
while ($arRes = $dbRes->GetNext())
{
$res['USERS'][$arRes['ID']] = [
'ID' => $arRes['ID'],
'NAME' => CUser::FormatName(
CSite::GetNameFormat(false), [
'USER_ID' => $arRes['ID'],
'NAME' => $arRes['NAME'],
'LAST_NAME' => $arRes['LAST_NAME'],
'SECOND_NAME' => $arRes['SECOND_NAME'],
],
true, false
),
'DEPARTMENT' => $arRes['UF_DEPARTMENT'][0],
'URL' => str_replace(['#ID#', '#USER_ID#'], $arRes['ID'], COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $_REQUEST['site_id'])),
'SETTINGS' => [],
];
$arFilterReport = [];
$arFilterReport[] = [
"LOGIC" => "OR",
[
"LOGIC" => "AND",
"<DATE_TO" => $date_to,
">=DATE_TO" => $date_from,
],
[
"LOGIC" => "AND",
"<DATE_FROM" => $date_to,
">=DATE_FROM" => $date_from,
],
];
//fix this in future
$arFilterReport[] = [
"LOGIC" => "AND",
["USER_ID" => $arRes["ID"]],
];
$arFilterReport[] = [
"LOGIC" => "AND",
["ACTIVE" => "Y"],
];
$res["USERS"][$arRes['ID']]["FULL_REPORT"] = [];
$datefomat = CSite::GetDateFormat("SHORT", SITE_ID);
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["BAD"] = 0;
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["COUNT"] = 0;
$arSelect = [
"ID",
"USER_ID",
"DATE_FROM",
"DATE_TO",
"MARK",
"FORUM_TOPIC_ID",
];
$dbres = CTimeManReportFull::GetList(["ID" => "desc"], $arFilterReport, $arSelect);
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["GOOD"] = 0;
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["MARKED"] = 0;
while ($report = $dbres->Fetch())
{
if ($report["MARK"] != "X")
{
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["MARKED"]++;
}
if ($report["MARK"] == "G")
{
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["GOOD"]++;
}
$res["USERS"][$arRes['ID']]["FULL_REPORT_INFO"]["COUNT"]++;
$report["DATE_TO"] = MakeTimeStamp($report["DATE_TO"], $datefomat);
$report["DATE_FROM"] = MakeTimeStamp($report["DATE_FROM"], $datefomat);
$report["FOR_JS"] = CTimeManReportFull::__getReportJSDraw(
[
"PERIOD_DATE_FROM" => $_POST["ts"],
"REPORT_DATE_FROM" => $report['DATE_FROM'],
"REPORT_DATE_TO" => $report['DATE_TO'],
]
);
$report["COMMENTS_COUNT"] = 0;
if ($report['FORUM_TOPIC_ID'] && CModule::IncludeModule("forum"))
{
$count = CForumMessage::GetList(["ID" => "ASC"], ["TOPIC_ID" => $report['FORUM_TOPIC_ID']], true);
$report["COMMENTS_COUNT"] = $count;
}
if ($report["DATE_TO"] && $report["DATE_FROM"])
{
$key = $arRes['ID'] . $report["DATE_FROM"] . $report["DATE_TO"];
}
else
{
$key = count((array)$res["USERS"][$arRes['ID']]["FULL_REPORT"]);
}
$res["USERS"][$arRes['ID']]["FULL_REPORT"][$key] = $report;
}
$res["USERS"][$arRes['ID']]["FULL_REPORT"] = array_values((array)$res["USERS"][$arRes['ID']]["FULL_REPORT"]);
if ($arRes['ID'] == $USER->GetID() && !CTimeMan::IsAdmin())
{
$res["USERS"][$arRes['ID']]["CAN_EDIT_TIME"] = "N";
}
else
{
$res["USERS"][$arRes['ID']]["CAN_EDIT_TIME"] = "Y";
}
$tm_user = new CUserReportFull($arRes["ID"]);
$res["USERS"][$arRes['ID']]["SETTINGS"] = $tm_user->GetSettings(true);
}
if (count($arSections) > 0)
{
$arSubordination = CIntranetUtils::GetSubordinateDepartments($USER->GetID(), true);
$arChains = [];
$section_url = "/company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#";
$iblockId = COption::GetOptionInt('intranet', 'iblock_structure', 0);
$arSectionFilter = [
'IBLOCK_ID' => $iblockId,
'ID' => array_unique($arSections),
];
$dbRes = CIBlockSection::GetList(
['LEFT_MARGIN' => 'DESC'],
$arSectionFilter,
false,
['ID', 'NAME', 'IBLOCK_SECTION_ID', 'UF_HEAD']
);
$chain_root = null;
while ($arRes = $dbRes->Fetch())
{
$arRes['CHAIN'] = [];
if (isset($arChains[$arRes['ID']]))
{
$arRes['CHAIN'] = $arChains[$arRes['ID']];
}
elseif ($arRes['IBLOCK_SECTION_ID'] > 0
&& isset($arChains[$arRes['IBLOCK_SECTION_ID']]))
{
$arRes['CHAIN'] = $arChains[$arRes['IBLOCK_SECTION_ID']];
$arRes['CHAIN'][] = [
'ID' => $arRes['ID'],
'NAME' => $arRes['NAME'],
'URL' => str_replace('#ID#', $arRes['ID'], $section_url),
];
}
else
{
$db1 = CIBlockSection::GetNavChain($iblockId, $arRes['ID']);
while ($sect = $db1->Fetch())
{
$arRes['CHAIN'][] = [
'ID' => $sect['ID'],
'NAME' => $sect['NAME'],
'URL' => str_replace('#ID#', $sect['ID'], $section_url),
];
}
}
if (!isset($arChains[$sect['ID']]))
{
$arChains[$sect['ID']] = $arRes['CHAIN'];
}
if (null === $chain_root)
{
$chain_root = $arRes['CHAIN'][0]['ID'];
}
elseif (
false !== $chain_root
&& $chain_root != $arRes['CHAIN'][0]['ID']
)
{
$chain_root = false;
}
$arRes["SETTINGS"] = CReportSettings::GetSectionSettings($arRes["ID"], true);
$arRes["CAN_EDIT_TIME"] = "N";
$arRes["HAS_SETTINGS"] = "N";
if ($arRes["SETTINGS"]["UF_REPORT_PERIOD"] && !$arRes["SETTINGS"]["PARENT"])
{
$arRes["HAS_SETTINGS"] = "Y";
}
if (in_array($arRes['ID'], $arSubordination) || CTimeMan::IsAdmin())
{
$arRes["CAN_EDIT_TIME"] = "Y";
}
$res['DEPARTMENTS'][$arRes['ID']] = $arRes;
}
if ($chain_root)
{
foreach ($res['DEPARTMENTS'] as &$dpt)
{
if (count($dpt['CHAIN']) > 1)
{
array_shift($dpt['CHAIN']);
}
}
}
}
}
$old_res = $res;
$res = ['DEPARTMENTS' => [], 'USERS' => []];
foreach ($arUserIDs as $dpt_id => $arDptUsers)
{
$res['DEPARTMENTS'][] = $old_res['DEPARTMENTS'][$dpt_id];
foreach ($arDptUsers as $user_id)
{
if ($old_res['USERS'][$user_id])
{
$old_res['USERS'][$user_id]['DEPARTMENT'] = $dpt_id;
$old_res['USERS'][$user_id]['HEAD'] =
$old_res['DEPARTMENTS'][$dpt_id]['UF_HEAD'] == $user_id;
$res['USERS'][] = $old_res['USERS'][$user_id];
}
}
}
\Bitrix\Main\Type\Collection::sortByColumn(
$res['USERS'],
['HEAD' => SORT_DESC, 'NAME' => SORT_ASC]
);
$tm_user = new CUserReportFull($USER->GetID());
$res["OVERDUE"] = $tm_user->GetReportData(true);
$res['NAV'] = '';
$item_count = CIntranetUtils::GetEmployeesCountForSorting($section_id, 0, $bCanReadAll ? false : $arAccessUsers['READ']);
$page_count = intval($item_count / $amount) + ($item_count % $amount > 0 ? 1 : 0);
$navResult = new CDBResult();
$navResult->NavNum = 'STRUCTURE';
$navResult->NavPageSize = $amount;
$navResult->NavRecordCount = $item_count;
$navResult->NavPageCount = $page_count;
$navResult->NavPageNomer = $page;
ob_start();
$APPLICATION->IncludeComponent(
'bitrix:system.pagenavigation',
'js',
[
'NAV_RESULT' => $navResult,
'HANDLER' => 'window.BXTMREPORT.Page',
]
);
$res['NAV'] = ob_get_contents();
ob_end_clean();
break;
case 'admin_data_settings':
$bReturnRes = true;
$arNeededSettings = [
'UF_TIMEMAN',
'UF_TM_REPORT_REQ',
'UF_TM_MAX_START',
'UF_TM_MIN_FINISH',
'UF_TM_MIN_DURATION',
'UF_TM_FREE',
'UF_TM_ALLOWED_DELTA',
];
if (isset($_REQUEST['ID']))
{
$ID = $_REQUEST['ID'];
$source = $_REQUEST['source'];
if ($source == 'department')
{
if (!CTimeMan::IsAdmin())
{
$arSubordination = CIntranetUtils::GetSubordinateDepartments($USER->GetID(), true);
if (!in_array($ID, $arSubordination))
{
echo "{error: 'access denied', type: 'fatal'}";
die();
}
}
}
else
{
$arAccessUsers = CTimeMan::GetAccess();
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
if (!$bCanReadAll && !in_array($ID, $arAccessUsers["READ"]))
{
echo "{error: 'access denied', type: 'fatal'}";
die();
}
}
$arFields = [];
foreach ($arNeededSettings as $key)
{
if (!array_key_exists($key, $_REQUEST))
{
continue;
}
if (IsAmPmMode() && ($key == 'UF_TM_MAX_START' || $key == 'UF_TM_MIN_FINISH'))
{
$v = trim($_REQUEST[$key]);
if ($v <> '')
{
if (preg_match_all('/^(\d+):(\d+)\s*(am|pm)$/i', $v, $matches))
{
$v = (intval($matches[1][0]) + (mb_strtolower($matches[3][0]) == 'pm' ? 12 : 0)) . ':' . $matches[2][0];
}
}
$arFields[$key] = $v;
}
else
{
$arFields[$key] = $_REQUEST[$key];
}
}
if ($arFields['UF_TM_ALLOWED_DELTA'])
{
$arFields['UF_TM_ALLOWED_DELTA'] = CTimeMan::FormatTime($arFields['UF_TM_ALLOWED_DELTA'], true);
}
$arAllFields = $USER_FIELD_MANAGER->GetUserFields($source == 'department' ? 'IBLOCK_' . COption::GetOptionInt('intranet', 'iblock_structure') . '_SECTION' : 'USER');
$arEnumFields = ['UF_TIMEMAN', 'UF_TM_REPORT_REQ', 'UF_TM_FREE'];
foreach ($arEnumFields as $fld)
{
if ($arFields[$fld])
{
$dbRes = CUserFieldEnum::GetList([], [
'USER_FIELD_ID' => $arAllFields[$fld]['ID'],
'XML_ID' => $arFields[$fld],
]);
if ($arRes = $dbRes->Fetch())
{
$arFields[$fld] = $arRes['ID'];
}
}
}
if ($source == 'department')
{
$obSection = new CIBlockSection();
$obSection->Update($ID, $arFields);
$CACHE_MANAGER->CleanDir("timeman_structure_" . COption::GetOptionInt('intranet', 'iblock_structure'));
$res = [
'ID' => $ID,
'SETTINGS' => CTimeMan::GetSectionPersonalSettings($ID, true, $arNeededSettings),
'SETTINGS_ALL' => CTimeMan::GetSectionSettings($ID, $arNeededSettings),
];
}
else
{
$obUser = new CUser();
$obUser->Update($ID, $arFields);
$CACHE_MANAGER->CleanDir("timeman_structure_" . COption::GetOptionInt('intranet', 'iblock_structure'));
$TMUSER = new CTimeManUser($ID);
$res = [
'ID' => $ID,
'SETTINGS' => $TMUSER->GetPersonalSettings($arNeededSettings),
'SETTINGS_ALL' => $TMUSER->GetSettings($arNeededSettings),
];
}
}
else
{
$res = [
'DEFAULTS' => CTimeMan::GetModuleSettings($arNeededSettings),
'DEPARTMENTS' => [],
'USERS' => [],
];
foreach ((array)$_REQUEST['DEPARTMENTS'] as $dpt)
{
$res['DEPARTMENTS'][] = [
'ID' => $dpt,
'SETTINGS' => CTimeMan::GetSectionPersonalSettings($dpt, true, $arNeededSettings),
'SETTINGS_ALL' => CTimeMan::GetSectionSettings($dpt, $arNeededSettings),
];
}
foreach ((array)$_REQUEST['USERS'] as $user)
{
$TMUSER = new CTimeManUser($user);
$res['USERS'][] = [
'ID' => $user,
'SETTINGS' => $TMUSER->GetPersonalSettings($arNeededSettings),
'SETTINGS_ALL' => $TMUSER->GetSettings($arNeededSettings),
];
}
}
break;
case 'admin_data':
$obReport = new CTimeManAdminReport([
'show_all' => $_REQUEST['show_all'] == 'Y',
'ts' => $_REQUEST['ts'],
'page' => $_REQUEST['page'],
'amount' => 30,
'department' => $_REQUEST['department'],
'path_user' => COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $site_id),
'nav_handler' => 'window.BXTMREPORT.Page',
]);
$bReturnRes = true;
$res = $obReport->GetData();
\Bitrix\Main\Type\Collection::sortByColumn(
$res['USERS'],
['HEAD' => SORT_DESC, 'NAME' => SORT_ASC]
);
$res['DEPARTMENTS'] = array_values($res['DEPARTMENTS']);
break;
case 'admin_save':
$ID = intval($_REQUEST['ID']);
$arEntry = null;
if (CTimeManEntry::Approve($ID, true)) // rights check inside
{
if ($_REQUEST['INFO'])
{
$arFields = [];
if (isset($_REQUEST['INFO']['TIME_START']))
{
$arFields['TIME_START'] = intval($_REQUEST['INFO']['TIME_START']);
}
if (isset($_REQUEST['INFO']['TIME_FINISH']))
{
$arFields['TIME_FINISH'] = intval($_REQUEST['INFO']['TIME_FINISH']);
}
if (isset($_REQUEST['INFO']['TIME_LEAKS']))
{
$arFields['TIME_LEAKS'] = intval($_REQUEST['INFO']['TIME_LEAKS']);
}
$dbRes = CTimeManEntry::GetList(
[],
['ID' => $ID],
false, false, ['*', 'ACTIVATED']
);
if ($arEntry = $dbRes->Fetch())
{
if ($arFields['TIME_FINISH'] && $arEntry['PAUSED'] == 'Y')
{
$arFields['PAUSED'] = 'N';
}
$arFields['TIME_LEAKS'] = isset($arFields['TIME_LEAKS']) ? $arFields['TIME_LEAKS'] : $arEntry['TIME_LEAKS'];
$arFields['DURATION'] = $arFields['TIME_FINISH'] - $arFields['TIME_START'] - $arFields['TIME_LEAKS'];
}
CTimeManEntry::Update($ID, $arFields);
$TMUSER = new CTimeManUser($arEntry['USER_ID']);
$TMUSER->ClearCache();
}
}
case 'admin_entry':
$ID = $_REQUEST['ID'];
$arAccessUsers = CTimeMan::GetAccess();
if (count($arAccessUsers['READ']) > 0)
{
$bCanEditAll = in_array('*', $arAccessUsers['WRITE']);
$bCanReadAll = in_array('*', $arAccessUsers['READ']);
$dbRes = CTimeManEntry::GetList(
[],
['ID' => $ID],
false, false, ['*', 'ACTIVATED']
);
if ($arRes = $dbRes->Fetch())
{
if (
$arRes['USER_ID'] == $USER->GetID()
|| $bCanReadAll
|| in_array($arRes['USER_ID'], $arAccessUsers['READ'])
)
{
$arRes['TIME_OFFSET'] = CTimeManUser::getDayStartOffset($arRes);
$bCanEdit = ($bCanEditAll || in_array($arRes['USER_ID'], $arAccessUsers['WRITE']));
$user_url = COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $_REQUEST['site_id']);
$obUser = new CTimeManUser($arRes['USER_ID']);
$obUser->SITE_ID = $_REQUEST['site_id'];
$bReturnRes = true;
$dbRes = CUser::GetList(
$by = 'ID', $order = 'ASC',
['ID' => $arRes['USER_ID']],
['SELECT' => ['UF_*']]
);
$arCurrentUser = $dbRes->GetNext();
$arCurrentUser['PHOTO'] =
$arCurrentUser['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($arCurrentUser['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$arManagers = CTimeMan::GetUserManagers($arRes['USER_ID']);
if (!is_array($arManagers) || count($arManagers) <= 0)
{
$arManagers = [$arRes['USER_ID']];
}
$user_url = COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $_REQUEST['site_id']);
$dbManagers = CUser::GetList($by = 'ID', $order = 'ASC', ['ID' => implode('|', $arManagers)]);
$arCurrentUserManagers = [];
while ($manager = $dbManagers->Fetch())
{
$manager['PHOTO'] =
$manager['PERSONAL_PHOTO'] > 0
? CIntranetUtils::InitImage($manager['PERSONAL_PHOTO'], 100, 100, BX_RESIZE_IMAGE_EXACT)
: [];
$arCurrentUserManagers[] = [
'ID' => $manager['ID'],
'LOGIN' => $manager['LOGIN'],
'NAME' => CUser::FormatName(CSite::GetNameFormat(false), $manager, true, false),
'URL' => str_replace(['#ID#', '#USER_ID#'], $manager['ID'], $user_url),
'WORK_POSITION' => $manager['WORK_POSITION'],
'PHOTO' => $manager['PHOTO']['CACHE']['src'],
];
}
$arRes['DATE_START'] = MakeTimeStamp($arRes['DATE_START']) - CTimeZone::GetOffset();
$arRes['DATE_FINISH'] = MakeTimeStamp($arRes['DATE_FINISH']) - CTimeZone::GetOffset();
$arInfo = [
'INFO' => $arRes,
'DATE_TEXT' => FormatDate('j F Y', $arRes['DATE_START']),
'CALENDAR_ENABLED' => CBXFeatures::IsFeatureEnabled('Calendar'),
'TASKS_ENABLED' => CBXFeatures::IsFeatureEnabled('Tasks') && IsModuleInstalled('tasks'),
];
$cur_info = $obUser->GetCurrentInfo();
if ($cur_info['ID'] == $ID)
{
$arInfo['STATE'] = $obUser->State();
$arInfo['EXPIRED_DATE'] = $obUser->GetExpiredRecommendedDate();
}
else
{
$arInfo['STATE'] = 'CLOSED';
}
$res = [
'FROM' => [
'ID' => $arCurrentUser['ID'],
'LOGIN' => $arCurrentUser['LOGIN'],
'NAME' => CUser::FormatName(CSite::GetNameFormat(false), $arCurrentUser, true, false),
'URL' => str_replace(['#ID#', '#USER_ID#'], $arCurrentUser['ID'], $user_url),
'WORK_POSITION' => $arCurrentUser['WORK_POSITION'],
'PHOTO' => $arCurrentUser['PHOTO']['CACHE']['src'],
],
'TO' => array_values($arCurrentUserManagers),
'INFO' => $arInfo,
'REPORT' => '',
'CAN_EDIT' => $bCanEdit ? 'Y' : 'N',
'REPORTS' => [],
];
if (count($res['TO']) <= 0)
{
$res['TO'] = [$res['FROM']];
}
$arUserIDs = [];
$dbReports = CTimeManReport::GetList(
['ID' => 'ASC'],
['ENTRY_ID' => $arInfo['INFO']['ID']]
);
while ($arReport = $dbReports->Fetch())
{
switch ($arReport['REPORT_TYPE'])
{
case 'ERR_OPEN':
case 'ERR_CLOSE':
case 'ERR_DURATION':
$arUserIDs[] = $arReport['USER_ID'];
$key = $arReport['REPORT_TYPE'] == 'ERR_OPEN'
? 'TIME_START'
: (
$arReport['REPORT_TYPE'] == 'ERR_CLOSE'
? 'TIME_FINISH'
: 'DURATION'
);
$arReportData = explode(';', $arReport['REPORT']);
if (!$res['REPORTS'][$key])
{
$res['REPORTS'][$key] = [];
}
$report_ts = strtotime($arReportData[1]) + CTimeZone::GetOffset();
$res['REPORTS'][$key][0] = [
'TYPE' => $arReportData[0],
'TYPE_TEXT' => $arReportData[0],
'TIME' => $report_ts + date('Z'),
'DATE_TIME' => FormatDate(str_replace(':s', '', $DB->DateFormatToPHP(FORMAT_DATETIME)), MakeTimeStamp($arReport['TIMESTAMP_X'])),
'ACTIVE' => $arReport['ACTIVE'] == 'Y',
'USER_ID' => $arReport['USER_ID'],
];
break;
case 'REPORT_OPEN':
case 'REPORT_CLOSE':
case 'REPORT_DURATION':
$key = $arReport['REPORT_TYPE'] == 'REPORT_OPEN'
? 'TIME_START'
: (
$arReport['REPORT_TYPE'] == 'REPORT_CLOSE'
? 'TIME_FINISH'
: 'DURATION'
);
if (count($res['REPORTS'][$key]) > 0)
{
if (mb_strlen($arReport['REPORT']) > 150)
{
$arReport['REPORT_FULL'] = $arReport['REPORT'];
$arReport['REPORT'] = mb_substr($arReport['REPORT'], 0, 150).'...';
}
$res['REPORTS'][$key][0]['REPORT'] = htmlspecialcharsbx($arReport['REPORT']);
if ($arReport['REPORT_FULL'])
{
$res['REPORTS'][$key][count($res['REPORTS'][$key]) - 1]['REPORT_FULL'] = htmlspecialcharsbx($arReport['REPORT_FULL']);
}
}
break;
case 'REPORT':
$res['REPORT'] = nl2br(htmlspecialcharsbx($arReport['REPORT']));
}
}
if (count($arUserIDs) > 0)
{
$arUserIDs = array_unique($arUserIDs);
$dbUsers = CUser::GetList(
$by = 'ID', $order = 'ASC',
['ID' => implode('|', $arUserIDs), 'ACTIVE' => 'Y']
);
while ($arUser = $dbUsers->Fetch())
{
$name = CUser::FormatName(CSite::GetNameFormat(false), $arUser);
foreach ($res['REPORTS'] as &$rep)
{
foreach ($rep as &$arReport)
{
if ($arReport['USER_ID'] == $arUser['ID'])
{
$arReport['USER_NAME'] = $name;
}
}
}
}
}
$dbRes = CTimeManReportDaily::GetList(['ID' => 'DESC'], ['ENTRY_ID' => $arInfo['INFO']['ID']]);
if ($arRes = $dbRes->Fetch())
{
$res['REPORT'] = nl2br(htmlspecialcharsEx($arRes['REPORT']));
if ($res['INFO']['TASKS_ENABLED'])
{
$res['INFO']['TASKS'] = unserialize($arRes['TASKS']);
}
else
{
unset($res['INFO']['TASKS']);
}
if ($res['INFO']['CALENDAR_ENABLED'])
{
$res['INFO']['EVENTS'] = unserialize($arRes['EVENTS']);
}
else
{
unset($res['INFO']['EVENTS']);
}
}
$res['NEIGHBOURS'] = CTimeManEntry::GetNeighbours($arInfo['INFO']['ID'], $arInfo['INFO']['USER_ID'], !!$_REQUEST['slider_type']);
ob_start();
$APPLICATION->IncludeComponent('bitrix:timeman.topic.reviews', '', ['ENTRY_ID' => $arInfo['INFO']['ID']], null, ['HIDE_ICONS' => 'Y']);
$res['COMMENTS'] = trim(ob_get_contents());
ob_end_clean();
}
}
}
/**************************************************************************/
break;
}
if (!$res)
{
if ($ex = $APPLICATION->GetException())
{
$error = "{error: '" . CUtil::JSEscape($ex->GetString()) . "', error_id:'" . CUtil::JSEscape($ex->GetId()) . "'}";
}
}
$APPLICATION->RestartBuffer();
if ($error)
{
echo $error;
}
elseif ($bReturnRes)
{
echo CUtil::PhpToJsObject($res);
}
else
{
$info = CTimeMan::GetRuntimeInfo(true);
$info['PLANNER'] = $info['PLANNER']['DATA'];
$arReport = $obUser->SetReport('', 0, $info['ID']);
if (is_array($arReport))
{
$info['REPORT'] = $arReport['REPORT'];
$info['REPORT_TS'] = MakeTimeStamp($arReport['TIMESTAMP_X']);
}
echo CUtil::PhpToJsObject($info);
$info["request_id"] = $_REQUEST["request_id"];
if (CModule::IncludeModule("pull"))
{
CPullWatch::AddToStack('TIMEMANWORKINGDAY_' . $USER->GetID(),
[
'module_id' => 'timeman',
'command' => $action,
'params' => $info,
]
);
}
}
}
}
}
}
else
{
echo GetMessage('main_include_decode_pass_sess');
}
\Bitrix\Main\Application::getInstance()->end();
?>