Esempio n. 1
0
     }
     ####################################################
     ### counter break detection
     ####################################################
     /*
     The purpose of this section is to handle a situation when we cannot perform on-the-fly re-checking of some additional counters appeared on the page.
     Normally, we check and recount just one counter per page (request) using CTaskCountersProcessorHomeostasis::onTaskGetList when calling CTask::GetList. 
     But in some cases we have more then one counter on the page, so we unable to check them since CTaskListCtrl::resolveCounterIdByRoleAndCategory wont return ther ids.
     */
     if (CTaskCountersProcessorInstaller::isInstallComplete() && isset($arResult['VIEW_STATE'])) {
         $selectedRoleCodename = $arResult['VIEW_STATE']['ROLE_SELECTED']['CODENAME'];
         if (CTaskListState::VIEW_SECTION_ROLES === $arResult['VIEW_STATE']['SECTION_SELECTED']['ID']) {
             $role = $arResult['VIEW_COUNTERS']['ROLES'][$selectedRoleCodename];
             $countersSumValues = (isset($role['VIEW_TASK_CATEGORY_NEW']['COUNTER']) ? intval($role['VIEW_TASK_CATEGORY_NEW']['COUNTER']) : 0) + (isset($role['VIEW_TASK_CATEGORY_EXPIRED']['COUNTER']) ? intval($role['VIEW_TASK_CATEGORY_EXPIRED']['COUNTER']) : 0) + (isset($role['VIEW_TASK_CATEGORY_EXPIRED_CANDIDATES']['COUNTER']) ? intval($role['VIEW_TASK_CATEGORY_EXPIRED_CANDIDATES']['COUNTER']) : 0) + (isset($role['VIEW_TASK_CATEGORY_WAIT_CTRL']['COUNTER']) ? intval($role['VIEW_TASK_CATEGORY_WAIT_CTRL']['COUNTER']) : 0) + (isset($role['VIEW_TASK_CATEGORY_WO_DEADLINE']['COUNTER']) ? intval($role['VIEW_TASK_CATEGORY_WO_DEADLINE']['COUNTER']) : 0);
             if ($role['VIEW_TASK_CATEGORY_EXPIRED']['COUNTER'] < 0 || $role['VIEW_TASK_CATEGORY_EXPIRED_CANDIDATES']['COUNTER'] < 0 || $countersSumValues !== $role['TOTAL']['COUNTER']) {
                 CTaskCountersProcessorHomeostasis::pendCountersRecalculation();
             }
         }
     }
     ####################################################
     ### counter break detection END
     ####################################################
     // Set plural forms
     $arResult['VIEW_COUNTERS']['TOTAL']['PLURAL'] = CTasksTools::getPluralForm($arResult['VIEW_COUNTERS']['TOTAL']['COUNTER']);
     foreach ($arResult['VIEW_COUNTERS']['ROLES'] as $roleId => $arData) {
         foreach ($arData as $counterId => $arCounter) {
             $arResult['VIEW_COUNTERS']['ROLES'][$roleId][$counterId]['PLURAL'] = CTasksTools::getPluralForm($arCounter['COUNTER']);
         }
     }
 }
 $arResult['VIEW_SECTION_ADVANCED_FILTER_HREF'] = '?F_CANCEL=Y&F_SECTION=ADVANCED';
Esempio n. 2
0
 public function getFilter()
 {
     $curSection = $this->oListState->getSection();
     if ($curSection === CTaskListState::VIEW_SECTION_ADVANCED_FILTER) {
         // we are in "advanced-mode" (section "all" and user-defined filters)
         $bGroupMode = false;
         if ($this->filterByGroupId !== null) {
             $bGroupMode = true;
         }
         if ($this->oFilter) {
             $oFilter = $this->oFilter;
         } else {
             $oFilter = CTaskFilterCtrl::GetInstance($this->userId, $bGroupMode);
         }
         $arFilter = $oFilter->GetSelectedFilterPresetCondition();
     } elseif ($curSection === CTaskListState::VIEW_SECTION_ROLES) {
         // we are in "role-mode" (four pre-defined filters at the top of the list)
         $arFilter = $this->__getFilterFor($this->oListState->getUserRole(), $this->oListState->getTaskCategory());
     }
     $counterId = self::resolveCounterIdByRoleAndCategory($this->oListState->getUserRole(), $this->oListState->getTaskCategory());
     $arFilter['CHECK_PERMISSIONS'] = 'Y';
     // Mark filter. So when it will be used by CTasks::GetList(),
     // CTaskCountersProcessorHomeostasis will check if counter is right
     // or not.
     // This will work out only when resolved counter is not null and we are in "role-mode"
     $arFilter = CTaskCountersProcessorHomeostasis::injectMarker($arFilter, $curSection, $counterId, $this->userId);
     return $arFilter;
 }
 /**
  * This function resets all counters for all users and recounts them.
  * 
  * This function do work which IS NOT multi-thread safe.
  */
 public static function setup($step = self::STEP_BEGIN, $extraParam = null)
 {
     $nextStep = $nextStepDelay = $nextStepExtraParam = null;
     //$s = 'CTaskCountersProcessorInstaller::setup()';
     //soundex($s);
     $timeLimit = microtime(true) + 5;
     // give at least 5 seconds for work
     while (microtime(true) <= $timeLimit) {
         /** @noinspection PhpUnusedLocalVariableInspection */
         $nextStep = $nextStepDelay = $nextStepExtraParam = null;
         //soundex($step);
         if ($step === self::STEP_BEGIN) {
             self::setStage(self::STAGE_INSTALL_IN_PROGRESS);
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessor::agent();', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup();', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_DROP_COUNTERS . '");', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_NEW_FOR_RESPONSIBLES . '");', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_NEW_FOR_ACCOMPLICES . '");', 'tasks');
             //CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_NEW_FOR_AUDITORS . '");', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_WAIT_CTRL_FOR_ORIGINATORS . '");', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_EXPIRED . '");', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_WITHOUT_DEADLINES_MY . '");', 'tasks');
             /** @noinspection PhpDynamicAsStaticMethodCallInspection */
             CAgent::RemoveAgent('CTaskCountersProcessorInstaller::setup("' . self::STEP_COUNT_WITHOUT_DEADLINES_FOR_ORIGINATORS . '");', 'tasks');
             // defer for at min 130 seconds the next step,
             // because we must give time for CTaskCountersProcessor::agent()
             // to complete its work, if it was already started
             $nextStep = self::STEP_DROP_COUNTERS;
             $nextStepDelay = 130;
         } else {
             switch ($step) {
                 case self::STEP_DROP_COUNTERS:
                     // reset DEADLINE_COUNTED flags and all tasks counters for all users
                     self::reset();
                     $nextStep = self::STEP_COUNT_NEW_FOR_RESPONSIBLES;
                     break;
                 case self::STEP_COUNT_NEW_FOR_RESPONSIBLES:
                     self::recountCounters_MY_NEW($userId = '*');
                     // recount for all users
                     $nextStep = self::STEP_COUNT_NEW_FOR_ACCOMPLICES;
                     break;
                 case self::STEP_COUNT_NEW_FOR_ACCOMPLICES:
                     self::recountCounters_ACCOMPLICE_NEW($userId = '*');
                     // recount for all users
                     //$nextStep = self::STEP_COUNT_NEW_FOR_AUDITORS;
                     $nextStep = self::STEP_COUNT_WAIT_CTRL_FOR_ORIGINATORS;
                     break;
                 case self::STEP_COUNT_WAIT_CTRL_FOR_ORIGINATORS:
                     self::recountCounters_ORIGINATORS_WAIT_CTRL($userId = '*');
                     // recount for all users
                     $nextStep = self::STEP_COUNT_WITHOUT_DEADLINES_MY;
                     break;
                 case self::STEP_COUNT_WITHOUT_DEADLINES_MY:
                     self::recountCounters_MY_WITHOUT_DEADLINES($userId = '*');
                     // recount for all users
                     $nextStep = self::STEP_COUNT_WITHOUT_DEADLINES_FOR_ORIGINATORS;
                     break;
                 case self::STEP_COUNT_WITHOUT_DEADLINES_FOR_ORIGINATORS:
                     self::recountCounters_ORIGINATORS_WITHOUT_DEADLINES($userId = '*');
                     // recount for all users
                     $nextStep = self::STEP_COUNT_EXPIRED;
                     break;
                 case self::STEP_COUNT_EXPIRED:
                     $executionTimeLimit = mt_rand(1, 6);
                     // time limit in seconds
                     $itemsProcessed = CTaskCountersProcessor::countExpiredAndExpiredSoonTasks($executionTimeLimit);
                     // Some items processed?
                     if ($itemsProcessed > 0) {
                         // try again
                         $nextStep = self::STEP_COUNT_EXPIRED;
                         $nextStepDelay = 5;
                     } else {
                         /** @noinspection PhpDynamicAsStaticMethodCallInspection */
                         CAgent::AddAgent('CTaskCountersProcessor::agent();', 'tasks', 'N', 900);
                         // every 15 minutes
                         self::setStage(self::STAGE_INSTALL_COMPLETE);
                         CTaskCountersProcessorHomeostasis::onCalculationComplete();
                         $nextStep = null;
                         // the end
                     }
                     break;
                 default:
                     CTaskAssert::logError('[0xd7b90d6d] ');
                     $nextStep = null;
                     // the end
                     break;
             }
         }
         if ($nextStep === null) {
             break;
         }
         if ($nextStepDelay > 0) {
             break;
         }
         $step = $nextStep;
     }
     if ($nextStep !== null) {
         /** @noinspection PhpDeprecationInspection */
         $nextExecTimestamp = time() + CTasksTools::getTimeZoneOffset();
         if ($nextStepDelay !== null) {
             $nextExecTimestamp += $nextStepDelay;
         } else {
             $nextExecTimestamp += 5;
         }
         // delay for ~5 seconds due to probably DB and PHP server time desynchronization
         $delayedTime = ConvertTimeStamp($nextExecTimestamp, 'FULL');
         /** @noinspection PhpDynamicAsStaticMethodCallInspection */
         CAgent::AddAgent('CTaskCountersProcessorInstaller::setup("' . $nextStep . '");', 'tasks', 'N', 86400000, $delayedTime, "Y", $delayedTime, 13);
     }
     return "";
     // remove self from agents table
 }
Esempio n. 4
0
 public static function GetList($arOrder = array(), $arFilter = array(), $arSelect = array(), $arParams = array())
 {
     global $DB, $USER, $USER_FIELD_MANAGER;
     $bIgnoreErrors = false;
     $nPageTop = false;
     $bGetZombie = false;
     if (!is_array($arParams)) {
         $nPageTop = $arParams;
         $arParams = false;
     } else {
         if (isset($arParams['nPageTop'])) {
             $nPageTop = $arParams['nPageTop'];
         }
         if (isset($arParams['bIgnoreErrors'])) {
             $bIgnoreErrors = (bool) $arParams['bIgnoreErrors'];
         }
         if (isset($arParams['bGetZombie'])) {
             $bGetZombie = (bool) $arParams['bGetZombie'];
         }
     }
     $obUserFieldsSql = new CUserTypeSQL();
     $obUserFieldsSql->SetEntity("TASKS_TASK", "T.ID");
     $obUserFieldsSql->SetSelect($arSelect);
     $obUserFieldsSql->SetFilter($arFilter);
     $obUserFieldsSql->SetOrder($arOrder);
     if (is_array($arParams) && array_key_exists('USER_ID', $arParams) && $arParams['USER_ID'] > 0) {
         $userID = (int) $arParams['USER_ID'];
     } else {
         $userID = is_object($USER) ? intval($USER->GetID()) : 0;
     }
     $arFields = array("ID" => "T.ID", "TITLE" => "T.TITLE", "DESCRIPTION" => "T.DESCRIPTION", "DESCRIPTION_IN_BBCODE" => "T.DESCRIPTION_IN_BBCODE", "DECLINE_REASON" => "T.DECLINE_REASON", "PRIORITY" => "T.PRIORITY", "STATUS" => "\n\t\t\t\tCASE\n\t\t\t\t\tWHEN\n\t\t\t\t\t\tT.DEADLINE < " . $DB->CurrentTimeFunction() . " AND T.STATUS != '4' AND T.STATUS != '5' AND (T.STATUS != '7' OR T.RESPONSIBLE_ID != " . $userID . ")\n\t\t\t\t\tTHEN\n\t\t\t\t\t\t'-1'\n\t\t\t\t\tWHEN\n\t\t\t\t\t\tTV.USER_ID IS NULL\n\t\t\t\t\t\tAND\n\t\t\t\t\t\tT.CREATED_BY != " . $userID . "\n\t\t\t\t\t\tAND\n\t\t\t\t\t\t(T.STATUS = 1 OR T.STATUS = 2)\n\t\t\t\t\tTHEN\n\t\t\t\t\t\t'-2'\n\t\t\t\t\tELSE\n\t\t\t\t\t\tT.STATUS\n\t\t\t\tEND\n\t\t\t", "STATUS_COMPLETE" => "\n\t\t\t\tCASE\n\t\t\t\t\tWHEN\n\t\t\t\t\t\tT.STATUS = '5'\n\t\t\t\t\tTHEN\n\t\t\t\t\t\t'2'\n\t\t\t\t\tELSE\n\t\t\t\t\t\t'1'\n\t\t\t\t\tEND\n\t\t\t", "REAL_STATUS" => "T.STATUS", "MULTITASK" => "T.MULTITASK", "RESPONSIBLE_ID" => "T.RESPONSIBLE_ID", "RESPONSIBLE_NAME" => "RU.NAME", "RESPONSIBLE_LAST_NAME" => "RU.LAST_NAME", "RESPONSIBLE_SECOND_NAME" => "RU.SECOND_NAME", "RESPONSIBLE_LOGIN" => "RU.LOGIN", "RESPONSIBLE_WORK_POSITION" => "RU.WORK_POSITION", "RESPONSIBLE_PHOTO" => "RU.PERSONAL_PHOTO", "DATE_START" => $DB->DateToCharFunction("T.DATE_START", "FULL"), "DURATION_PLAN" => "T.DURATION_PLAN", "DURATION_TYPE" => "T.DURATION_TYPE", "DURATION_FACT" => "(SELECT SUM(TE.MINUTES) FROM b_tasks_elapsed_time TE WHERE TE.TASK_ID = T.ID GROUP BY TE.TASK_ID)", "TIME_ESTIMATE" => "T.TIME_ESTIMATE", "TIME_SPENT_IN_LOGS" => "(SELECT SUM(TE.SECONDS) FROM b_tasks_elapsed_time TE WHERE TE.TASK_ID = T.ID GROUP BY TE.TASK_ID)", "REPLICATE" => "T.REPLICATE", "DEADLINE" => $DB->DateToCharFunction("T.DEADLINE", "FULL"), "DEADLINE_ORIG" => "T.DEADLINE", "START_DATE_PLAN" => $DB->DateToCharFunction("T.START_DATE_PLAN", "FULL"), "END_DATE_PLAN" => $DB->DateToCharFunction("T.END_DATE_PLAN", "FULL"), "CREATED_BY" => "T.CREATED_BY", "CREATED_BY_NAME" => "CU.NAME", "CREATED_BY_LAST_NAME" => "CU.LAST_NAME", "CREATED_BY_SECOND_NAME" => "CU.SECOND_NAME", "CREATED_BY_LOGIN" => "CU.LOGIN", "CREATED_BY_WORK_POSITION" => "CU.WORK_POSITION", "CREATED_BY_PHOTO" => "CU.PERSONAL_PHOTO", "CREATED_DATE" => $DB->DateToCharFunction("T.CREATED_DATE", "FULL"), "CHANGED_BY" => "T.CHANGED_BY", "CHANGED_DATE" => $DB->DateToCharFunction("T.CHANGED_DATE", "FULL"), "STATUS_CHANGED_BY" => "T.CHANGED_BY", "STATUS_CHANGED_DATE" => 'CASE WHEN T.STATUS_CHANGED_DATE IS NULL THEN ' . $DB->DateToCharFunction("T.CHANGED_DATE", "FULL") . ' ELSE ' . $DB->DateToCharFunction("T.STATUS_CHANGED_DATE", "FULL") . ' END ', "CLOSED_BY" => "T.CLOSED_BY", "CLOSED_DATE" => $DB->DateToCharFunction("T.CLOSED_DATE", "FULL"), 'GUID' => 'T.GUID', "XML_ID" => "T.XML_ID", "MARK" => "T.MARK", "ALLOW_CHANGE_DEADLINE" => "T.ALLOW_CHANGE_DEADLINE", 'ALLOW_TIME_TRACKING' => 'T.ALLOW_TIME_TRACKING', "TASK_CONTROL" => "T.TASK_CONTROL", "ADD_IN_REPORT" => "T.ADD_IN_REPORT", "GROUP_ID" => "CASE WHEN T.GROUP_ID IS NULL THEN 0 ELSE T.GROUP_ID END", "FORUM_TOPIC_ID" => "T.FORUM_TOPIC_ID", "PARENT_ID" => "T.PARENT_ID", "COMMENTS_COUNT" => "FT.POSTS", "FORUM_ID" => "FT.FORUM_ID", "SITE_ID" => "T.SITE_ID", "SUBORDINATE" => ($strSql = CTasks::GetSubordinateSql('', $arParams)) ? "CASE WHEN EXISTS(" . $strSql . ") THEN 'Y' ELSE 'N' END" : "'N'", "EXCHANGE_MODIFIED" => "T.EXCHANGE_MODIFIED", "EXCHANGE_ID" => "T.EXCHANGE_ID", "OUTLOOK_VERSION" => "T.OUTLOOK_VERSION", "VIEWED_DATE" => $DB->DateToCharFunction("TV.VIEWED_DATE", "FULL"), 'DEADLINE_COUNTED' => 'T.DEADLINE_COUNTED', 'FORKED_BY_TEMPLATE_ID' => 'T.FORKED_BY_TEMPLATE_ID');
     if ($bGetZombie) {
         $arFields['ZOMBIE'] = 'T.ZOMBIE';
     }
     if (count($arSelect) <= 0 || in_array("*", $arSelect)) {
         $arSelect = array_keys($arFields);
     } elseif (!in_array("ID", $arSelect)) {
         $arSelect[] = "ID";
     }
     // If DESCRIPTION selected, than BBCODE flag must be selected too
     if (in_array('DESCRIPTION', $arSelect) && !in_array('DESCRIPTION_IN_BBCODE', $arSelect)) {
         $arSelect[] = 'DESCRIPTION_IN_BBCODE';
     }
     if (!is_array($arOrder)) {
         $arOrder = array();
     }
     $arSqlOrder = array();
     foreach ($arOrder as $by => $order) {
         $needle = null;
         $by = strtolower($by);
         $order = strtolower($order);
         if ($by === 'deadline') {
             if (!in_array($order, array('asc', 'desc', 'asc,nulls', 'desc,nulls'), true)) {
                 $order = 'asc,nulls';
             }
         } else {
             if ($order !== 'asc') {
                 $order = 'desc';
             }
         }
         switch ($by) {
             case 'id':
                 $arSqlOrder[] = " ID " . $order . " ";
                 break;
             case 'title':
                 $arSqlOrder[] = " TITLE " . $order . " ";
                 $needle = 'TITLE';
                 break;
             case 'date_start':
                 $arSqlOrder[] = " T.DATE_START " . $order . " ";
                 $needle = 'DATE_START';
                 break;
             case 'created_date':
                 $arSqlOrder[] = " T.CREATED_DATE " . $order . " ";
                 $needle = 'CREATED_DATE';
                 break;
             case 'changed_date':
                 $arSqlOrder[] = " T.CHANGED_DATE " . $order . " ";
                 $needle = 'CHANGED_DATE';
                 break;
             case 'closed_date':
                 $arSqlOrder[] = " T.CLOSED_DATE " . $order . " ";
                 $needle = 'CLOSED_DATE';
                 break;
             case 'start_date_plan':
                 $arSqlOrder[] = " T.START_DATE_PLAN " . $order . " ";
                 $needle = 'START_DATE_PLAN';
                 break;
             case 'deadline':
                 $orderClause = self::getOrderSql('T.DEADLINE', $order, $default_order = 'asc,nulls', $nullable = true);
                 $needle = 'DEADLINE_ORIG';
                 if (!is_array($orderClause)) {
                     $arSqlOrder[] = $orderClause;
                 } else {
                     //         COLUMN ALIAS      COLUMN EXPRESSION
                     $arFields[$orderClause[1]] = $orderClause[0];
                     if (!in_array($orderClause[1], $arSelect)) {
                         $arSelect[] = $orderClause[1];
                     }
                     $arSqlOrder[] = $orderClause[2];
                     // order expression
                 }
                 break;
             case 'status':
                 $arSqlOrder[] = " STATUS " . $order . " ";
                 $needle = 'STATUS';
                 break;
             case 'status_complete':
                 $arSqlOrder[] = " STATUS_COMPLETE " . $order . " ";
                 $needle = 'STATUS_COMPLETE';
                 break;
             case 'priority':
                 $arSqlOrder[] = " PRIORITY " . $order . " ";
                 $needle = 'PRIORITY';
                 break;
             case 'mark':
                 $arSqlOrder[] = " MARK " . $order . " ";
                 $needle = 'MARK';
                 break;
             case 'created_by':
                 $arSqlOrder[] = " CREATED_BY_LAST_NAME " . $order . " ";
                 $needle = 'CREATED_BY_LAST_NAME';
                 break;
             case 'responsible_id':
                 $arSqlOrder[] = " RESPONSIBLE_LAST_NAME " . $order . " ";
                 $needle = 'RESPONSIBLE_LAST_NAME';
                 break;
             case 'group_id':
                 $arSqlOrder[] = " GROUP_ID " . $order . " ";
                 $needle = 'GROUP_ID';
                 break;
             case 'time_estimate':
                 $arSqlOrder[] = " TIME_ESTIMATE " . $order . " ";
                 $needle = 'TIME_ESTIMATE';
                 break;
             case 'allow_change_deadline':
                 $arSqlOrder[] = " ALLOW_CHANGE_DEADLINE " . $order . " ";
                 $needle = 'ALLOW_CHANGE_DEADLINE';
                 break;
             case 'allow_time_tracking':
                 $arSqlOrder[] = " ALLOW_TIME_TRACKING " . $order . " ";
                 $needle = 'ALLOW_TIME_TRACKING';
                 break;
             default:
                 if (substr($by, 0, 3) === 'uf_') {
                     if ($s = $obUserFieldsSql->GetOrder($by)) {
                         $arSqlOrder[$by] = " " . $s . " " . $order . " ";
                     }
                 } else {
                     CTaskAssert::logWarning('[0x9a92cf7d] invalid sort by field requested: ' . $by);
                 }
                 break;
         }
         if ($needle !== null && !in_array($needle, $arSelect)) {
             $arSelect[] = $needle;
         }
     }
     $arSqlSelect = array();
     foreach ($arSelect as $field) {
         $field = strtoupper($field);
         if (array_key_exists($field, $arFields)) {
             $arSqlSelect[$field] = $arFields[$field] . " AS " . $field;
         }
     }
     if (!sizeof($arSqlSelect)) {
         $arSqlSelect = "T.ID AS ID";
     }
     // First level logic MUST be 'AND', because of backward compatibility
     // and some requests for checking rights, attached at first level of filter.
     // Situtation when there is OR-logic at first level cannot be resolved
     // in general case.
     // So if there is OR-logic, it is FATAL error caused by programmer.
     // But, if you want to use OR-logic at the first level of filter, you
     // can do this by putting all your filter conditions to the ::SUBFILTER-xxx,
     // except CHECK_PERMISSIONS, SUBORDINATE_TASKS (if you don't know exactly,
     // what are consequences of this fields in OR-logic of subfilters).
     if (isset($arFilter['::LOGIC'])) {
         CTaskAssert::assert($arFilter['::LOGIC'] === 'AND');
     }
     $arSqlSearch = CTasks::GetFilter($arFilter, '', $arParams);
     if (!$bGetZombie) {
         $arSqlSearch[] = " T.ZOMBIE = 'N' ";
     }
     $r = $obUserFieldsSql->GetFilter();
     if (strlen($r) > 0) {
         $arSqlSearch[] = "(" . $r . ")";
     }
     $strSql = "\n\t\t\tSELECT\n\t\t\t\t" . implode(",\n", $arSqlSelect) . "\n\t\t\t\t" . $obUserFieldsSql->GetSelect();
     if (in_array('COMMENTS_COUNT', $arSelect, true) || in_array('FORUM_ID', $arSelect, true)) {
         $bNeedJoinForumsTable = true;
     } else {
         $bNeedJoinForumsTable = false;
     }
     $strFrom = "\n\t\t\tFROM\n\t\t\t\tb_tasks T\n\t\t\tINNER JOIN b_user CU ON CU.ID = T.CREATED_BY \n\t\t\tINNER JOIN b_user RU ON RU.ID = T.RESPONSIBLE_ID \n\t\t\tLEFT JOIN b_tasks_viewed TV ON TV.TASK_ID = T.ID \n\t\t\t\tAND TV.USER_ID = " . $userID . " " . ($bNeedJoinForumsTable ? " LEFT JOIN b_forum_topic FT ON FT.ID = T.FORUM_TOPIC_ID " : "") . $obUserFieldsSql->GetJoin("T.ID") . " " . (sizeof($arSqlSearch) ? " WHERE " . implode(" AND ", $arSqlSearch) : "") . " ";
     $strSql .= $strFrom;
     $strSqlOrder = "";
     DelDuplicateSort($arSqlOrder);
     for ($i = 0, $arSqlOrderCnt = count($arSqlOrder); $i < $arSqlOrderCnt; $i++) {
         if ($i == 0) {
             $strSqlOrder = " ORDER BY ";
         } else {
             $strSqlOrder .= ",";
         }
         $strSqlOrder .= $arSqlOrder[$i];
     }
     $strSql .= $strSqlOrder;
     if ($nPageTop !== false && is_numeric($nPageTop)) {
         $strSql = $DB->TopSql($strSql, intval($nPageTop));
     }
     if (is_array($arParams) && array_key_exists("NAV_PARAMS", $arParams) && is_array($arParams["NAV_PARAMS"])) {
         $nTopCount = intval($arParams['NAV_PARAMS']['nTopCount']);
         if ($nTopCount > 0) {
             $strSql = $DB->TopSql($strSql, $nTopCount);
             $res = $DB->Query($strSql, $bIgnoreErrors, "File: " . __FILE__ . "<br>Line: " . __LINE__);
             if ($res === false) {
                 throw new TasksException('', TasksException::TE_SQL_ERROR);
             }
             $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("TASKS_TASK"));
         } else {
             $res_cnt = $DB->Query("SELECT COUNT(T.ID) as C " . $strFrom);
             $res_cnt = $res_cnt->Fetch();
             $totalTasksCount = (int) $res_cnt["C"];
             // unknown by default
             // Sync counters in case of mistiming
             CTaskCountersProcessorHomeostasis::onTaskGetList($arFilter, $totalTasksCount);
             $res = new CDBResult();
             $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("TASKS_TASK"));
             $rc = $res->NavQuery($strSql, $totalTasksCount, $arParams["NAV_PARAMS"], $bIgnoreErrors);
             if ($bIgnoreErrors && $rc === false) {
                 throw new TasksException('', TasksException::TE_SQL_ERROR);
             }
         }
     } else {
         $res = $DB->Query($strSql, $bIgnoreErrors, "File: " . __FILE__ . "<br>Line: " . __LINE__);
         if ($res === false) {
             throw new TasksException('', TasksException::TE_SQL_ERROR);
         }
         $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("TASKS_TASK"));
     }
     return $res;
 }
Esempio n. 5
0
 public static function agent()
 {
     if (intval(self::getAdminId())) {
         CTaskCountersProcessorHomeostasis::onExpirityRecountAgent();
         // here we start sub-agent for expired counters recalculation
         // this must be ambigious, kz countExpiredAndExpiredSoonTasks is called already inside CTaskCountersProcessorInstaller,
         // which initialized inside CTaskCountersProcessorHomeostasis::onExpirityRecountAgent
         $executionTimeLimit = 0.2;
         // time limit in seconds
         self::countExpiredAndExpiredSoonTasks($executionTimeLimit);
     }
     return "CTaskCountersProcessor::agent();";
 }