} $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(array(), array('ID' => $ID), false, false, array('*', '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', array('ID' => $arRes['USER_ID']), array('SELECT' => array('UF_*'))); $arCurrentUser = $dbRes->GetNext(); $arCurrentUser['PHOTO'] = $arCurrentUser['PERSONAL_PHOTO'] > 0 ? CIntranetUtils::InitImage($arCurrentUser['PERSONAL_PHOTO'], 32, 0, BX_RESIZE_IMAGE_EXACT) : array(); $arManagers = CTimeMan::GetUserManagers($arRes['USER_ID']); if (!is_array($arManagers) || count($arManagers) <= 0) { $arManagers = array($arRes['USER_ID']); }
private function FixDateByHoliday($DATE_FROM = false, $DATE_TO = false) { $arResult = array("NEED_TO_RECALC" => false, "DO_NOT_SHOW_THE_FORM" => false); //$DATE_TO_INC = ConvertTimeStampForReport(strtotime('+1 day', MakeTimeStamp($DATE_TO,$this->TimeShort)),"SHORT"); // $DATE_TO_INC = ConvertTimeStampForReport(strtotime('+1 day', MakeTimeStamp($DATE_TO,TM_SHORT_FORMAT)),"SHORT"); // $DATE_FROM = ConvertTimeStampForReport(MakeTimeStamp($DATE_FROM, TM_SHORT_FORMAT),"SHORT"); $DATE_TO_INC = ConvertTimeStamp(strtotime('+1 day', MakeTimeStamp($DATE_TO, TM_SHORT_FORMAT)), "SHORT"); $DATE_FROM = ConvertTimeStamp(MakeTimeStamp($DATE_FROM, TM_SHORT_FORMAT), "SHORT"); // if($DATE_TO_INC == $DATE_FROM) // { // $DATE_TO_INC = ConvertTimeStamp(strtotime('+2 day', $ts_from),"SHORT"); // } //was the work day is open between $DATE_FROM and $DATE_TO? $dbRes = CTimeManEntry::GetList(array('ID' => 'ASC'), array('USER_ID' => $this->USER_ID, '>=DATE_START' => $DATE_FROM, '<DATE_START' => $DATE_TO_INC), false, false, array("ID")); if (!$dbRes->Fetch()) { //the work day was NOT open between $DATE_FROM and $DATE_TO...hmm, holidays? //let's try to find first open work day after holidays $dbRes = CTimeManEntry::GetList(array('ID' => 'ASC'), array('USER_ID' => $this->USER_ID, '>DATE_START' => $DATE_FROM), false, false, array("ID", "DATE_START")); if ($res = $dbRes->Fetch()) { //we've found first open work day after holidays, now we should rewrite last report date $FWorkDayDateTS = MakeTimeStamp($res['DATE_START'], $this->TimeFull); $LastDate = ConvertTimeStampForReport(strtotime('-1 day', $FWorkDayDateTS), "SHORT"); //if we set the same value we will fall into the endless recursion if ($LastDate != ConvertTimeStampForReport($this->GetLastDate(), "SHORT")) { $this->SetLastDate($this->USER_ID, $LastDate); $arResult["NEED_TO_RECALC"] = true; } } else { //we not found the first open workday after holidays, it's mean that the holidays are not over yet and we can't show the report form $arResult["DO_NOT_SHOW_THE_FORM"] = true; } } return $arResult; }
public static function AddCommentToIM($arFields) { if (CModule::IncludeModule("im") && intval($arFields["USER_ID"]) > 0 && intval($arFields["ENTRY_ID"]) > 0) { $date_text = ""; $dbEntry = CTimeManEntry::GetList(array(), array("ID" => $arFields["ENTRY_ID"])); if ($arEntry = $dbEntry->Fetch()) { $date_text = FormatDate("j F", MakeTimeStamp($arEntry["DATE_START"], CSite::GetDateFormat("FULL", SITE_ID))); $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "FROM_USER_ID" => $arFields["USER_ID"], "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "timeman", "NOTIFY_EVENT" => "entry_comment", "NOTIFY_TAG" => "TIMEMAN|ENTRY|" . $arFields["ENTRY_ID"]); $arUserIDToSend = array($arEntry["USER_ID"]); $gender_suffix = ""; $dbUser = CUser::GetByID($arFields["USER_ID"]); if ($arUser = $dbUser->Fetch()) { switch ($arUser["PERSONAL_GENDER"]) { case "M": $gender_suffix = "_M"; break; case "F": $gender_suffix = "_F"; break; default: $gender_suffix = ""; } } $arManagers = CTimeMan::GetUserManagers($arEntry["USER_ID"]); if (is_array($arManagers)) { $arUserIDToSend = array_merge($arUserIDToSend, $arManagers); } $reports_page = COption::GetOptionString("timeman", "TIMEMAN_REPORT_PATH", "/company/timeman.php"); $arUnFollowers = array(); $rsUnFollower = CSocNetLogFollow::GetList(array("USER_ID" => $arUserIDToSend, "CODE" => "L" . $arFields["LOG_ID"], "TYPE" => "N"), array("USER_ID")); while ($arUnFollower = $rsUnFollower->Fetch()) { $arUnFollowers[] = $arUnFollower["USER_ID"]; } $arUserIDToSend = array_diff($arUserIDToSend, $arUnFollowers); foreach ($arUserIDToSend as $user_id) { if ($arFields["USER_ID"] == $user_id) { continue; } $arMessageFields["TO_USER_ID"] = $user_id; $arTmp = CSocNetLogTools::ProcessPath(array("REPORTS_PAGE" => $reports_page), $user_id); $sender_type = $arEntry["USER_ID"] == $user_id ? "1" : ($arEntry["USER_ID"] == $arFields["USER_ID"] ? "2" : "3"); $arMessageFields["NOTIFY_MESSAGE"] = GetMessage("TIMEMAN_ENTRY_IM_COMMENT_" . $sender_type . $gender_suffix, array("#period#" => "<a href=\"" . $arTmp["URLS"]["REPORTS_PAGE"] . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($date_text) . "</a>")); $arMessageFields["NOTIFY_MESSAGE_OUT"] = GetMessage("TIMEMAN_ENTRY_IM_COMMENT_" . $sender_type . $gender_suffix, array("#period#" => htmlspecialcharsbx($date_text))) . " (" . $arTmp["SERVER_NAME"] . $arTmp["URLS"]["REPORTS_PAGE"] . ")#BR##BR#" . $arFields["MESSAGE"]; CIMNotify::Add($arMessageFields); } } } }
private function _getUsersData(&$arUserIDs) { $arResult = array(); $arFilter = $this->__getFilter(); if (!$this->bShowAll) { $arActiveUsers = array(); $dbRes = CTimeManEntry::GetList(array('USER_ID' => 'ASC'), $arFilter, array('USER_ID'), false, array('USER_ID')); while ($arRes = $dbRes->GetNext()) { $arActiveUsers[] = $arRes['USER_ID']; } if (!$this->bCanReadAll) { $this->arAccessUsers['READ'] = array_intersect($this->arAccessUsers['READ'], $arActiveUsers); } else { $this->arAccessUsers['READ'] = $arActiveUsers; } $this->bCanReadAll = false; if (count($this->arAccessUsers['READ']) <= 0) { return $arResult; } } $arUserIDs = CIntranetUtils::GetEmployeesForSorting($this->page, $this->amount, $this->department, $this->bCanReadAll ? false : $this->arAccessUsers['READ']); $arUsers = array(); foreach ($arUserIDs as $ar) { $arUsers = array_merge($arUsers, $ar); } $arFilter['USER_ID'] = $arUsers; if ($this->bShowAll) { $dbRes = CUser::GetList($by = 'LAST_NAME', $order = 'asc', array('ID' => implode('|', $arUsers), 'ACTIVE' => 'Y'), array('SELECT' => array('*', 'UF_DEPARTMENT'))); while ($arRes = $dbRes->GetNext()) { $arResult[$arRes['ID']] = $this->__getUserRow($arRes); } } $dbRes = CTimeManEntry::GetList(array('USER_LAST_NAME' => 'ASC', 'DATE_START' => 'ASC'), $arFilter, false, false, array('*', 'UF_DEPARTMENT', 'ACTIVATED')); $arEntriesMap = array(); while ($arRes = $dbRes->GetNext()) { if (!$arResult[$arRes['USER_ID']]) { $arResult[$arRes['USER_ID']] = $this->__getUserRow($arRes, 'USER_'); } elseif ($arEntriesMap[$arRes['ID']]) { continue; } $ts_start = MakeTimeStamp($arRes['DATE_START']); $arEntry = array('ID' => $arRes['ID'], 'USER_ID' => $arRes['USER_ID'], 'DAY' => date('j', $ts_start), 'ACTIVE' => $arRes['ACTIVE'] == 'Y', 'PAUSED' => $arRes['PAUSED'] == 'Y', 'ACTIVATED' => $arRes['ACTIVATED'] == 'Y', 'DATE_START' => MakeTimeStamp($arRes['DATE_START']) - CTimeZone::GetOffset(), 'DATE_FINISH' => $arRes['DATE_FINISH'] ? MakeTimeStamp($arRes['DATE_FINISH']) - CTimeZone::GetOffset() : '', 'TIME_START' => $arRes['TIME_START'], 'TIME_FINISH' => $arRes['TIME_FINISH'], 'DURATION' => $arRes['DURATION'], 'TIME_LEAKS' => $arRes['TIME_LEAKS'], 'CAN_EDIT' => $this->bCanEditAll || in_array($arRes['USER_ID'], $this->arAccessUsers['WRITE'])); if ($arRes['DATE_FINISH'] && $arRes['PAUSED'] !== 'Y') { if ($arRes['ACTIVE'] == 'Y') { $arResult[$arRes['USER_ID']]['TOTAL'] += $arRes['DURATION']; $arResult[$arRes['USER_ID']]['TOTAL_DAYS']++; $arSettings = $arResult[$arRes['USER_ID']]['SETTINGS']; if (!$arSettings['UF_TM_FREE'] && ($arSettings['UF_TM_MAX_START'] < $arEntry['TIME_START'] || $arSettings['UF_TM_MIN_FINISH'] > $arEntry['TIME_FINISH'] || $arSettings['UF_TM_MIN_DURATION'] > $arEntry['DURATION'])) { $arResult[$arRes['USER_ID']]['TOTAL_VIOLATIONS']++; } } else { $arResult[$arRes['USER_ID']]['TOTAL_INACTIVE']++; } } $arEntriesMap[$arRes['ID']] = true; $arResult[$arRes['USER_ID']]['ENTRIES'][] = $arEntry; } return $arResult; }
public static function GetNeighbours($ENTRY_ID, $USER_ID, $bCheckActive = false) { global $DB; $ENTRY_ID = intval($ENTRY_ID); $USER_ID = intval($USER_ID); $res = array(); if ($ENTRY_ID > 0 && $USER_ID > 0) { $arFilter = array('<ID' => $ENTRY_ID, 'USER_ID' => $USER_ID); if ($bCheckActive) { $arFilter['INACTIVE_OR_ACTIVATED'] = 'Y'; } $dbRes = CTimeManEntry::GetList(array('ID' => 'DESC'), $arFilter, false, array('nTopCount' => 1), array('ID')); if ($arRes = $dbRes->Fetch()) { $res['PREV'] = $arRes['ID']; } $arFilter['>ID'] = $arFilter['<ID']; unset($arFilter['<ID']); $dbRes = CTimeManEntry::GetList(array('ID' => 'ASC'), $arFilter, false, array('nTopCount' => 1), array('ID')); if ($arRes = $dbRes->Fetch()) { $res['NEXT'] = $arRes['ID']; } } return $res; }