예제 #1
0
                 }
                 $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']);
                 }
예제 #2
0
 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;
 }
예제 #3
0
 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);
             }
         }
     }
 }
예제 #4
0
 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;
 }
예제 #5
0
 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;
 }