Example #1
0
 public static function onAfterCommentTopicAdd($entityType, $entityId, $topicId)
 {
     // 'TK' is our entity type
     if ($entityType !== 'TK') {
         return;
     }
     if (!(CTaskAssert::isLaxIntegers($entityId) && (int) $entityId >= 1)) {
         CTaskAssert::logError('[0xb6324222] Expected integer $entityId >= 1');
         return;
     }
     $taskId = (int) $entityId;
     if ($entityType === 'TK') {
         $oTask = new CTasks();
         $oTask->Update($entityId, array('FORUM_TOPIC_ID' => $topicId));
     }
 }
 /**
  * Checks for broken counters.
  * Expirity counter is broken if it is < 0, or if it is more than tasks count in list of expired tasks
  * Other counters is broken if it is < 0, or if it is != tasks count in list of respective tasks
  *
  * Method is called inside CTask::GetList() to perform recounting of broken counters.
  * 
  * @param $arFilter Filter was used in GetList() call
  * @param $tasksCountInList Number of records returned by GetList() call
  */
 public static function onTaskGetList($arFilter, $tasksCountInList)
 {
     if (!CTaskCountersProcessorInstaller::isInstallComplete()) {
         return;
     }
     // Is there our marker?
     if (!(array_key_exists('::MARKERS', $arFilter) && array_key_exists(self::MARKER_ID, $arFilter['::MARKERS']) && $tasksCountInList !== null)) {
         return;
     }
     $tasksCountInList = (int) $tasksCountInList;
     $counterOwnerUserId = $arFilter['::MARKERS'][self::MARKER_ID]['userId'];
     $counterId = $arFilter['::MARKERS'][self::MARKER_ID]['counterId'];
     $counterValue = (int) CUserCounter::GetValue($counterOwnerUserId, $counterId, $site_id = '**');
     if (in_array($counterId, array(CTaskCountersProcessor::COUNTER_TASKS_MY_EXPIRED, CTaskCountersProcessor::COUNTER_TASKS_ACCOMPLICE_EXPIRED, CTaskCountersProcessor::COUNTER_TASKS_AUDITOR_EXPIRED, CTaskCountersProcessor::COUNTER_TASKS_ORIGINATOR_EXPIRED, CTaskCountersProcessor::COUNTER_TASKS_MY_EXPIRED_CANDIDATES, CTaskCountersProcessor::COUNTER_TASKS_ACCOMPLICE_EXPIRED_CANDIDATES), true)) {
         $isExpirityCounter = true;
     } else {
         $isExpirityCounter = false;
     }
     $isCounterBrokeDetected = false;
     $realTasksCount = null;
     // Is checksum correct?
     $filterCheksum = $arFilter['::MARKERS'][self::MARKER_ID]['filterCheksum'];
     $realCheksum = self::calcFilterChecksum($arFilter);
     // break detection part
     if ($filterCheksum === $realCheksum) {
         $realTasksCount = $tasksCountInList;
         if ($counterValue < 0 || $tasksCountInList != $counterValue) {
             $isCounterBrokeDetected = true;
         }
     } else {
         if (isset($arFilter['SAME_GROUP_PARENT'], $arFilter['ONLY_ROOT_TASKS']) && $arFilter['SAME_GROUP_PARENT'] === 'Y' && $arFilter['ONLY_ROOT_TASKS'] === 'Y') {
             // unset the corresponding fields and try to compare checksums again
             unset($arFilter['SAME_GROUP_PARENT']);
             unset($arFilter['ONLY_ROOT_TASKS']);
             $realCheksum = self::calcFilterChecksum($arFilter);
             if ($filterCheksum === $realCheksum) {
                 // tasks count in list shouldn't be more than registered in counter
                 // and counter shouldn't be less than zero
                 if ($counterValue < 0 || $tasksCountInList > $counterValue) {
                     $isCounterBrokeDetected = true;
                 } else {
                     if (static::getCountersRecheckForSubTasksNeed()) {
                         $rsTasksCount = CTasks::getCount($arFilter, array('bIgnoreDbErrors' => true, 'bSkipUserFields' => true, 'bSkipExtraTables' => true));
                         if ($rsTasksCount && ($arTasksCount = $rsTasksCount->fetch()) && isset($arTasksCount['CNT'])) {
                             $realTasksCount = (int) $arTasksCount['CNT'];
                             if ($realTasksCount != $counterValue) {
                                 // and finally check
                                 $isCounterBrokeDetected = true;
                             }
                         }
                     }
                 }
             }
         }
     }
     /*
     if ( ! $isCounterBrokeDetected )
     {
     	if ($counterValue < 0)
     	{
     		$isCounterBrokeDetected = true;
     	}
     	else if ($realTasksCount !== null)
     	{
     		if ($isExpirityCounter)
     		{
     			if ($realTasksCount < $counterValue)
     				$isCounterBrokeDetected = true;
     		}
     		else
     		{
     			if ($realTasksCount !== $counterValue)
     				$isCounterBrokeDetected = true;
     		}
     	}
     }
     */
     if ($isCounterBrokeDetected) {
         ob_start();
         // a special way for correction of 'deadline expired' counters
         if ($isExpirityCounter) {
             // pend counters reinstalling (agent is used)
             self::pendCountersRecalculation();
         } else {
             if ($realTasksCount !== null) {
                 $delta = $realTasksCount - $counterValue;
                 CTaskCountersQueue::push($counterId, CTaskCountersQueue::OP_INCREMENT, array($counterOwnerUserId), $delta);
                 CTaskCountersQueue::execute();
             } else {
                 CTaskAssert::logError('[0x97e63b37] counter "' . $counterId . '" was mistimed for user ' . $counterOwnerUserId . '. But no correct data available for recount.');
             }
         }
         ob_end_clean();
     }
 }
Example #3
0
 public static function fetchListArray($userId, $arOrder, $arFilter, $arParams = array(), $arSelect = array())
 {
     $arItemsData = array();
     $rsData = null;
     try {
         $arParamsOut = array('USER_ID' => $userId, 'bIgnoreErrors' => true);
         if (isset($arParams['nPageTop'])) {
             $arParamsOut['nPageTop'] = $arParams['nPageTop'];
         } elseif (isset($arParams['NAV_PARAMS'])) {
             $arParamsOut['NAV_PARAMS'] = $arParams['NAV_PARAMS'];
         }
         $arFilter['CHECK_PERMISSIONS'] = 'Y';
         // Always check permissions
         if (!empty($arSelect)) {
             $arSelect = array_merge($arSelect, static::getMinimalSelectLegacy());
         }
         $arTasksIDs = array();
         $rsData = CTasks::getList($arOrder, $arFilter, $arSelect, $arParamsOut);
         if (!is_object($rsData)) {
             throw new TasksException();
         }
         while ($arData = $rsData->fetch()) {
             $taskId = (int) $arData['ID'];
             $arTasksIDs[] = $taskId;
             $arData['AUDITORS'] = array();
             $arData['ACCOMPLICES'] = array();
             $arItemsData[$taskId] = $arData;
         }
         if (is_array($arTasksIDs) && !empty($arTasksIDs)) {
             // fill ACCOMPLICES and AUDITORS
             $rsMembers = CTaskMembers::GetList(array(), array('TASK_ID' => $arTasksIDs));
             if (!is_object($rsMembers)) {
                 throw new TasksException();
             }
             while ($arMember = $rsMembers->fetch()) {
                 $taskId = (int) $arMember['TASK_ID'];
                 if (in_array($taskId, $arTasksIDs, true)) {
                     if ($arMember['TYPE'] === 'A') {
                         $arItemsData[$taskId]['ACCOMPLICES'][] = $arMember['USER_ID'];
                     } elseif ($arMember['TYPE'] === 'U') {
                         $arItemsData[$taskId]['AUDITORS'][] = $arMember['USER_ID'];
                     }
                 }
             }
             // fill tags
             if (isset($arParams['LOAD_TAGS']) && $arParams['LOAD_TAGS']) {
                 foreach ($arTasksIDs as $taskId) {
                     $arItemsData[$taskId]['TAGS'] = array();
                 }
                 $rsTags = CTaskTags::getList(array(), array('TASK_ID' => $arTasksIDs));
                 if (!is_object($rsTags)) {
                     throw new TasksException();
                 }
                 while ($arTag = $rsTags->fetch()) {
                     $taskId = (int) $arTag['TASK_ID'];
                     if (in_array($taskId, $arTasksIDs, true)) {
                         $arItemsData[$taskId]['TAGS'][] = $arTag['NAME'];
                     }
                 }
             }
         }
     } catch (Exception $e) {
         CTaskAssert::logError('[0xa819f6f1] probably SQL error at ' . $e->getFile() . ':' . $e->getLine());
         throw new TasksException('', TasksException::TE_SQL_ERROR | TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED);
     }
     return array($arItemsData, $rsData);
 }
Example #4
0
 /**
  * @param CTaskItemInterface $oTaskItem (of class CTaskItem,checklist item will be added to this task)
  * @param array $arFields with mandatory element TITLE (string).
  * 
  * @throws TasksException with code TasksException::TE_WRONG_ARGUMENTS
  * 
  * @return CTaskCheckListItem
  */
 public static function add(CTaskItemInterface $oTaskItem, $arFields)
 {
     global $DB;
     if (!self::checkFieldsForAdd($arFields)) {
         throw new TasksException('Bad arguments for ' . __CLASS__ . '::add()', TasksException::TE_WRONG_ARGUMENTS);
     }
     $arFields = self::normalizeFieldsDataForAdd($arFields);
     CTaskAssert::assert(isset($arFields['TITLE']) && is_string($arFields['TITLE']) && $arFields['TITLE'] !== '' && $oTaskItem instanceof CTaskItemInterface);
     if (!$oTaskItem->isActionAllowed(CTaskItem::ACTION_CHECKLIST_ADD_ITEMS)) {
         throw new TasksException(__CLASS__ . '::add() is not allowed to call', TasksException::TE_ACTION_NOT_ALLOWED);
     }
     $taskId = (int) $oTaskItem->getId();
     $executiveUserId = (int) $oTaskItem->getExecutiveUserId();
     /** @noinspection PhpDynamicAsStaticMethodCallInspection */
     $curDatetime = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time() + CTimeZone::GetOffset());
     $arFieldsToDb = array('TITLE' => $arFields['TITLE'], 'TASK_ID' => $taskId, 'CREATED_BY' => $executiveUserId, 'IS_COMPLETE' => 'N');
     if (isset($arFields['SORT_INDEX'])) {
         $arFieldsToDb['SORT_INDEX'] = (int) $arFields['SORT_INDEX'];
     } else {
         $rc = $DB->Query("SELECT MAX(SORT_INDEX) AS MAX_SORT_INDEX\n\t\t\t\tFROM b_tasks_checklist_items \n\t\t\t\tWHERE TASK_ID = " . (int) $taskId, $bIgnoreErrors = true);
         if (!$rc) {
             throw new TasksException('SQL error', TasksException::TE_SQL_ERROR);
         }
         if (($arSortIndex = $rc->fetch()) && isset($arSortIndex['MAX_SORT_INDEX'])) {
             $arFieldsToDb['SORT_INDEX'] = (int) $arSortIndex['MAX_SORT_INDEX'] + 1;
         } else {
             $arFieldsToDb['SORT_INDEX'] = 0;
         }
     }
     if (isset($arFields['IS_COMPLETE'])) {
         $arFieldsToDb['IS_COMPLETE'] = $arFields['IS_COMPLETE'];
     }
     $id = $DB->add('b_tasks_checklist_items', $arFieldsToDb, $arCLOBFields = array(), 'tasks', $ignore_errors = true);
     $occurAsUserId = CTasksTools::getOccurAsUserId();
     if (!$occurAsUserId) {
         $occurAsUserId = $executiveUserId;
     }
     // changes log
     $arLogFields = array('TASK_ID' => $taskId, 'USER_ID' => $occurAsUserId, 'CREATED_DATE' => $curDatetime, 'FIELD' => 'CHECKLIST_ITEM_CREATE', 'FROM_VALUE' => '', 'TO_VALUE' => $arFields['TITLE']);
     if (!($id > 0)) {
         CTaskAssert::logError('[0xbb7986ff] ');
         throw new TasksException('Action failed', TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED);
     }
     $log = new CTaskLog();
     $log->Add($arLogFields);
     if ($arFieldsToDb['IS_COMPLETE'] === 'Y') {
         // changes log
         $arLogFields = array('TASK_ID' => (int) $taskId, 'USER_ID' => $occurAsUserId, 'CREATED_DATE' => $curDatetime, 'FIELD' => 'CHECKLIST_ITEM_CHECK', 'FROM_VALUE' => $arFields['TITLE'], 'TO_VALUE' => $arFields['TITLE']);
         $log->Add($arLogFields);
     }
     return new self($oTaskItem, (int) $id);
 }
Example #5
0
 /**
  * @param $userId
  * @return array|bool array with keys TASK_ID, USER_ID, TIMER_STARTED_AT, TIMER_ACCUMULATOR,
  * or false on error
  */
 public static function stop($userId)
 {
     global $DB;
     $ts = time();
     if ($ts < 1) {
         CTaskAssert::logError('[0x03ad8b00] current unix timestamp is in past, check system time');
         CTaskAssert::assert(false);
     }
     $arData = self::get($userId);
     if ($arData !== false && ($arData['TIMER_STARTED_AT'] != 0 || $arData['TIMER_ACCUMULATOR'] != 0)) {
         $DB->query("UPDATE b_tasks_timer \n\t\t\t\tSET TIMER_ACCUMULATOR = 0, TIMER_STARTED_AT = 0\n\t\t\t\tWHERE\n\t\t\t\t\tUSER_ID = " . (int) $userId . "\n\t\t\t\t\tAND TASK_ID = " . (int) $arData['TASK_ID']);
         if ($arData['TIMER_STARTED_AT'] > 0 && $ts > $arData['TIMER_STARTED_AT']) {
             $arData['TIMER_ACCUMULATOR'] += $ts - $arData['TIMER_STARTED_AT'];
         }
         return $arData;
     } else {
         return false;
     }
 }
Example #6
0
                    }
                    $APPLICATION->IncludeComponent("bitrix:tasks.task.detail.parts", ".default", array('INNER_HTML' => $_POST['INNER_HTML'], 'MODE' => $_POST['MODE'], 'BLOCKS' => array($_POST['BLOCK']), 'IS_IFRAME' => $isIframe, 'PATH_TO_TEMPLATES_TEMPLATE' => $_POST['PATH_TO_TEMPLATES_TEMPLATE'], 'PATH_TO_USER_PROFILE' => $_POST['PATH_TO_USER_PROFILE'], 'PATH_TO_TASKS_TASK' => $_POST['PATH_TO_TASKS_TASK'], 'FIRE_ON_CHANGED_EVENT' => $_POST['FIRE_ON_CHANGED_EVENT'], 'NAME_TEMPLATE' => $nameTemplate, 'LOAD_TASK_DATA' => 'Y', 'TASK_ID' => (int) $_POST['TASK_ID']), null, array('HIDE_ICONS' => 'Y'));
                    break;
                default:
                    CTaskAssert::logError('[0x4fae6498] Unexpected $_POST[\'BLOCK\'] value: ' . $_POST['BLOCK']);
                    break;
            }
        } else {
            CTaskAssert::logError('[0x0907bb31] $_POST[\'BLOCK\'] expected, but not given');
        }
    } elseif ($action === 'render_comments') {
        CModule::IncludeModule('tasks');
        CModule::IncludeModule('forum');
        $permission = 'A';
        $oTask = CTaskItem::getInstanceFromPool($_POST['taskId'], $loggedInUserId);
        $arTask = $oTask->getData($bEscape = false);
        $arTaskUsers = CTasks::__GetSearchPermissions($arTask);
        if ($USER->CanAccess($arTaskUsers) === true || $USER->IsAdmin() || CTasksTools::IsPortalB24Admin()) {
            $permission = 'M';
        }
        $APPLICATION->RestartBuffer();
        header('Content-Type: text/html; charset=' . LANG_CHARSET);
        $APPLICATION->IncludeComponent("bitrix:forum.comments", "bitrix24", array("FORUM_ID" => $_POST['forumId'], "ENTITY_TYPE" => "TK", "ENTITY_ID" => $_POST['taskId'], "ENTITY_XML_ID" => "TASK_" . $_POST['taskId'], "URL_TEMPLATES_PROFILE_VIEW" => $_POST['PATH_TO_USER_PROFILE'], "MESSAGES_PER_PAGE" => $_POST['ITEM_DETAIL_COUNT'], "PAGE_NAVIGATION_TEMPLATE" => "arrows", "DATE_TIME_FORMAT" => CDatabase::DateFormatToPHP(FORMAT_DATETIME), "PATH_TO_SMILE" => $_POST['PATH_TO_FORUM_SMILE'], "EDITOR_CODE_DEFAULT" => "N", "SHOW_MODERATION" => "Y", "SHOW_AVATAR" => "Y", "SHOW_RATING" => $_POST['SHOW_RATING'], "RATING_TYPE" => $_POST['RATING_TYPE'], "SHOW_MINIMIZED" => "N", "USE_CAPTCHA" => "N", 'PREORDER' => 'N', "SHOW_LINK_TO_FORUM" => "N", "SHOW_SUBSCRIBE" => "N", "FILES_COUNT" => 10, "SHOW_WYSIWYG_EDITOR" => "Y", "AUTOSAVE" => true, "PERMISSION" => $permission, "NAME_TEMPLATE" => $_POST["NAME_TEMPLATE"], "MESSAGE_COUNT" => 3), null, array('HIDE_ICONS' => 'Y'));
        require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php';
        exit;
    } else {
        CTaskAssert::logError('[0x447f7b28] Unknown action: ' . $action);
    }
}
CMain::FinalActions();
// to make events work on bitrix24
Example #7
0
 function Update($ID, $arFields, $arParams = array())
 {
     global $DB, $USER;
     $ID = intval($ID);
     if ($ID < 1) {
         return false;
     }
     $executiveUserId = null;
     if (isset($arParams['USER_ID'])) {
         $executiveUserId = (int) $arParams['USER_ID'];
     } elseif (is_object($USER) && method_exists($USER, 'getId')) {
         $executiveUserId = (int) $USER->getId();
     }
     if ($this->CheckFields($arFields, $ID)) {
         /** @noinspection PhpDeprecationInspection */
         $rsUpdatingLogItem = self::getByID($ID);
         if ($rsUpdatingLogItem && ($arUpdatingLogItem = $rsUpdatingLogItem->fetch())) {
             $taskId = $arUpdatingLogItem['TASK_ID'];
         } else {
             return false;
         }
         $curDuration = 0;
         $rsTask = CTasks::getList(array(), array('ID' => $taskId), array('ID', 'TIME_SPENT_IN_LOGS'));
         if ($rsTask && ($arTask = $rsTask->fetch())) {
             $curDuration = (int) $arTask['TIME_SPENT_IN_LOGS'];
         }
         unset($arFields["ID"]);
         $arBinds = array("COMMENT_TEXT" => $arFields["COMMENT_TEXT"]);
         // Maintance backward compatibility
         if (isset($arFields['MINUTES'], $arFields['SECONDS'])) {
             CTaskAssert::logError('[0x63038b4f] ');
             CTaskAssert::assert(false);
         }
         if (isset($arFields['SECONDS'])) {
             $arFields['MINUTES'] = (int) round($arFields['SECONDS'] / 60, 0);
         } elseif (isset($arFields['MINUTES'])) {
             $arFields['SECONDS'] = 60 * $arFields['MINUTES'];
         } else {
             CTaskAssert::logError('[0x14e5d0eb] ');
             CTaskAssert::assert(false);
         }
         foreach (GetModuleEvents('tasks', 'OnBeforeTaskElapsedTimeUpdate', true) as $arEvent) {
             if (ExecuteModuleEventEx($arEvent, array($ID, $arUpdatingLogItem, &$arFields)) === false) {
                 return false;
             }
         }
         // If time changed - set CTaskElapsedItem::SOURCE_MANUAL flag
         if ($arUpdatingLogItem['MINUTES'] != $arFields['MINUTES'] || $arUpdatingLogItem['SECONDS'] != $arFields['SECONDS']) {
             $arFields['SOURCE'] = CTaskElapsedItem::SOURCE_MANUAL;
         }
         $strUpdate = $DB->PrepareUpdate("b_tasks_elapsed_time", $arFields);
         $strSql = "UPDATE b_tasks_elapsed_time SET " . $strUpdate . " WHERE ID=" . $ID;
         $rc = $DB->QueryBind($strSql, $arBinds, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
         $occurAsUserId = CTasksTools::getOccurAsUserId();
         if (!$occurAsUserId) {
             $occurAsUserId = $executiveUserId ? $executiveUserId : 1;
         }
         $oLog = new CTaskLog();
         $oLog->Add(array('TASK_ID' => $taskId, 'USER_ID' => $occurAsUserId, '~CREATED_DATE' => $DB->currentTimeFunction(), 'FIELD' => 'TIME_SPENT_IN_LOGS', 'FROM_VALUE' => $curDuration, 'TO_VALUE' => $curDuration - (int) $arUpdatingLogItem['SECONDS'] + (int) $arFields['SECONDS']));
         foreach (GetModuleEvents('tasks', 'OnTaskElapsedTimeUpdate', true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($ID, $arFields));
         }
         return $rc;
     }
     return false;
 }
Example #8
0
                        // ka-boom!
                        $templateInstance = new CTaskTemplates();
                        if ($templateInstance->Delete($templateId)) {
                            ++$processedItems;
                        } else {
                            ++$notProcessedItems;
                        }
                    }
                    break;
                default:
                    CTaskAssert::logError('[0x8a1747a5] unknown subaction: ' . $_POST['subaction']);
                    break;
            }
            break;
        default:
            CTaskAssert::logError('[0x8b300a99] unknown action: ' . $_POST['action']);
            break;
    }
    LocalRedirect($APPLICATION->GetCurPageParam("", array("sessid")));
}
$arParams["TASK_VAR"] = trim($arParams["TASK_VAR"]);
if (strlen($arParams["TASK_VAR"]) <= 0) {
    $arParams["TASK_VAR"] = "task_id";
}
$arParams["GROUP_VAR"] = trim($arParams["GROUP_VAR"]);
if (strlen($arParams["GROUP_VAR"]) <= 0) {
    $arParams["GROUP_VAR"] = "group_id";
}
$arParams["ACTION_VAR"] = trim($arParams["ACTION_VAR"]);
if (strlen($arParams["ACTION_VAR"]) <= 0) {
    $arParams["ACTION_VAR"] = "action";
Example #9
0
 private static function getCounterForUser($userRoleId, $taskCategoryId, $userId)
 {
     $counterId = self::resolveCounterIdByRoleAndCategory($userRoleId, $taskCategoryId);
     if ($counterId !== null) {
         $rc = CUserCounter::GetValue($userId, $counterId, $site_id = '**');
     } else {
         CTaskAssert::logError('[0x0de6c535] unknown counter for $userRole: ' . $userRoleId . '; $taskCategoryId: ' . $taskCategoryId);
         $rc = false;
     }
     return $rc;
 }
Example #10
0
                    case 'sC':
                        // set category
                        $oListState->setTaskCategory($value);
                        break;
                    case 'eS':
                        // enable submode
                        $oListState->switchOnSubmode($value);
                        break;
                    case 'dS':
                        // disable submode
                        $oListState->switchOffSubmode($value);
                        break;
                }
                $oListState->saveState();
            } catch (TasksException $e) {
                CTaskAssert::logError('[0x523d4e28] : $switchStateTo = ' . $switchStateTo . ' (' . $value . ');' . ' cur user role: ' . $oListState->getUserRole() . ' serialize($arSwitchStateTo) = ' . serialize($arSwitchStateTo));
                // wrong user input, nothing to do here
            }
        }
    }
}
$arResult['VIEW_STATE'] = $oListState->getState();
$oListCtrl = CTaskListCtrl::getInstance($arParams['USER_ID']);
$oListCtrl->useState($oListState);
if ($arParams["GROUP_ID"] > 0) {
    $oListCtrl->setFilterByGroupId((int) $arParams["GROUP_ID"]);
} else {
    $oListCtrl->setFilterByGroupId(null);
}
// There is backward compatibility code:
if (!(isset($_GET['VIEW']) || isset($arParams['VIEW_MODE']))) {
Example #11
0
 private static function resolveTaskCategoryName($categoryId)
 {
     static $arMap = null;
     $categoryId = (int) $categoryId;
     if ($arMap === null) {
         $arMap = array(self::VIEW_TASK_CATEGORY_ALL => GetMessage('TASKS_LIST_CTRL_CATEGORY_ALL'), self::VIEW_TASK_CATEGORY_NEW => GetMessage('TASKS_LIST_CTRL_CATEGORY_NEW'), self::VIEW_TASK_CATEGORY_IN_PROGRESS => GetMessage('TASKS_LIST_CTRL_CATEGORY_IN_PROGRESS'), self::VIEW_TASK_CATEGORY_COMPLETED => GetMessage('TASKS_LIST_CTRL_CATEGORY_COMPLETED'), self::VIEW_TASK_CATEGORY_DEFERRED => GetMessage('TASKS_LIST_CTRL_CATEGORY_DEFERRED'), self::VIEW_TASK_CATEGORY_EXPIRED => GetMessage('TASKS_LIST_CTRL_CATEGORY_EXPIRED'), self::VIEW_TASK_CATEGORY_EXPIRED_CANDIDATES => GetMessage('TASKS_LIST_CTRL_CATEGORY_EXPIRED_CANDIDATES'), self::VIEW_TASK_CATEGORY_ATTENTION => GetMessage('TASKS_LIST_CTRL_CATEGORY_ATTENTION'), self::VIEW_TASK_CATEGORY_WAIT_CTRL => GetMessage('TASKS_LIST_CTRL_CATEGORY_WAIT_CTRL'), self::VIEW_TASK_CATEGORY_WO_DEADLINE => GetMessage('TASKS_LIST_CTRL_CATEGORY_WO_DEADLINE'));
     }
     if (isset($arMap[$categoryId])) {
         return $arMap[$categoryId];
     } else {
         CTaskAssert::logError('[0xa1bd9ec0] ');
         return '???';
     }
 }
Example #12
0
 /**
  * @param array $arFilter
  * @param array $arParams
  * @param array $arGroupBy
  * @return bool|CDBResult
  */
 public static function GetCount($arFilter = array(), $arParams = array(), $arGroupBy = array())
 {
     /**
      * @global CUser $USER
      * @global CDatabase $DB
      */
     global $DB, $USER;
     $bIgnoreDbErrors = false;
     $bSkipUserFields = false;
     $bSkipExtraTables = false;
     $bSkipJoinTblViewed = false;
     $bNeedJoinMembersTable = false;
     if (isset($arParams['bIgnoreDbErrors'])) {
         $bIgnoreDbErrors = (bool) $arParams['bIgnoreDbErrors'];
     }
     if (isset($arParams['bSkipUserFields'])) {
         $bSkipUserFields = (bool) $arParams['bSkipUserFields'];
     }
     if (isset($arParams['bSkipExtraTables'])) {
         $bSkipExtraTables = (bool) $arParams['bSkipExtraTables'];
     }
     if (isset($arParams['bSkipJoinTblViewed'])) {
         $bSkipJoinTblViewed = (bool) $arParams['bSkipJoinTblViewed'];
     }
     if (isset($arParams['bNeedJoinMembersTable'])) {
         $bNeedJoinMembersTable = (bool) $arParams['bNeedJoinMembersTable'];
     }
     if (!$bSkipUserFields) {
         $obUserFieldsSql = new CUserTypeSQL();
         $obUserFieldsSql->SetEntity("TASKS_TASK", "T.ID");
         $obUserFieldsSql->SetFilter($arFilter);
     }
     if (!is_array($arFilter)) {
         CTaskAssert::logError('[0x053f6639] expected array in $arFilter');
         $arFilter = array();
     }
     if (isset($arParams['USER_ID'])) {
         $userID = (int) $arParams['USER_ID'];
     } else {
         $userID = is_object($USER) ? intval($USER->GetID()) : 0;
     }
     static $arFields = array('GROUP_ID' => 'T.GROUP_ID', 'CREATED_BY' => 'T.CREATED_BY', 'RESPONSIBLE_ID' => 'T.RESPONSIBLE_ID', 'ACCOMPLICE' => 'TM.USER_ID', 'AUDITOR' => 'TM.USER_ID');
     $strGroupBy = ' ';
     $strSelect = ' ';
     // ignore unknown fields
     $arGroupBy = array_intersect($arGroupBy, array_keys($arFields));
     if (is_array($arGroupBy) && !empty($arGroupBy)) {
         $arGroupByFields = array();
         foreach ($arGroupBy as $fieldName) {
             $strSelect = ', ' . $arFields[$fieldName] . ' AS ' . $fieldName;
             if ($fieldName === 'ACCOMPLICE' || $fieldName === 'AUDITOR') {
                 $bNeedJoinMembersTable = true;
             }
             $arGroupByFields[] = $arFields[$fieldName];
         }
         $strGroupBy = ' GROUP BY ' . implode(', ', $arGroupByFields);
     }
     $arSqlSearch = CTasks::GetFilter($arFilter, '', array('bMembersTableJoined' => $bNeedJoinMembersTable));
     $arSqlSearch[] = " T.ZOMBIE = 'N' ";
     $ufJoin = ' ';
     if (!$bSkipUserFields) {
         $r = $obUserFieldsSql->GetFilter();
         if (strlen($r) > 0) {
             $arSqlSearch[] = "(" . $r . ")";
         }
         $ufJoin .= $obUserFieldsSql->GetJoin("T.ID");
     }
     $strSql = "\n\t\t\tSELECT\n\t\t\t\tCOUNT(T.ID) AS CNT " . $strSelect . "\n\t\t\tFROM ";
     if ($bNeedJoinMembersTable) {
         $strSql .= "b_tasks_member TM \n INNER JOIN b_tasks T ON T.ID = TM.TASK_ID";
     } else {
         $strSql .= "b_tasks T ";
     }
     if (!$bSkipExtraTables) {
         $strSql .= " INNER JOIN b_user CU ON CU.ID = T.CREATED_BY\n\t\t\t\tINNER JOIN b_user RU ON RU.ID = T.RESPONSIBLE_ID ";
     }
     if (!$bSkipJoinTblViewed) {
         $strSql .= "\n LEFT JOIN\n\t\t\t\tb_tasks_viewed TV ON TV.TASK_ID = T.ID AND TV.USER_ID = " . $userID;
     }
     $strSql .= $ufJoin . " ";
     if (!empty($arSqlSearch)) {
         $strSql .= "WHERE " . implode(" AND ", $arSqlSearch) . " ";
     }
     $strSql .= $strGroupBy;
     $res = $DB->Query($strSql, $bIgnoreDbErrors, "File: " . __FILE__ . "<br>Line: " . __LINE__);
     return $res;
 }
 /**
  * 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
 }
Example #14
0
                             }
                         }
                     }
                 }
                 if (!isset($arFileds['ID'])) {
                     $arFields['ID'] = $postId;
                 }
                 $arFields['~ID'] = $arFields['ID'];
                 $arFields['~TITLE'] = $arFields['TITLE'];
                 $arFields['~SORT_INDEX'] = $arFields['SORT_INDEX'];
                 $arFields['~IS_COMPLETE'] = $arFields['IS_COMPLETE'];
                 $arFields['TITLE'] = htmlspecialcharsbx($arFields['~TITLE']);
                 $arChecklistItems[] = $arFields;
             } catch (Exception $e) {
                 $arTaskData = $oTask->getData(false);
                 CTaskAssert::logError('[0x05b70569] Can\'t create checklist item, exception $e->getCode() = ' . $e->getCode() . ', file: ' . $e->getFile() . ', line: ' . $e->getLine() . ', data: ' . serialize(array('LOGGED_USER_ID' => $USER->getId(), 'TASK_ID' => $arTaskData['ID'], 'CREATED_BY' => $arTaskData['CREATED_BY'], 'RESPONSIBLE_ID' => $arTaskData['RESPONSIBLE_ID'], 'ACCOMPLICES' => $arTaskData['ACCOMPLICES'], 'AUDITORS' => $arTaskData['AUDITORS'], 'ALLOWED_ACTIONS' => $oTask->getAllowedActions(true))) . '___END OF DATA');
             }
         }
         if ($arParams['TASK_ID'] > 0 && $arParams['MODE'] === 'JUST AFTER TASK EDITED') {
             $arItemsToRemove = array_diff($arChecklistItemsInDbIds, $arChecklistItemsInPostIds);
             if (is_array($arItemsToRemove) && !empty($arItemsToRemove)) {
                 foreach ($arChecklistItemsInDb as $oChecklistItem) {
                     if (in_array($oChecklistItem->getId(), $arItemsToRemove)) {
                         $oChecklistItem->delete();
                     }
                 }
             }
         }
     }
 }
 return $arChecklistItems;
Example #15
0
 private static function processUsersCounters($counterId, $operation, $arUsers, $delta)
 {
     if (!is_array($arUsers)) {
         CTaskAssert::logError('[0x9418f293] ');
         return;
     }
     $arUsers = array_unique($arUsers);
     if ($operation === self::OP_DECREMENT) {
         foreach ($arUsers as $userId) {
             $userId = (int) $userId;
             if ($userId < 1) {
                 CTaskAssert::logError('[0x8886cc18] ');
                 continue;
             }
             //$x = '[USER_ID= ' . $userId . '] ' . $counterId . '--';
             //soundex($x);
             CUserCounter::Decrement($userId, $counterId, '**', false, $delta);
         }
     } elseif ($operation === self::OP_INCREMENT) {
         foreach ($arUsers as $userId) {
             $userId = (int) $userId;
             if ($userId < 1) {
                 CTaskAssert::logError('[0x01f722e7] ');
                 continue;
             }
             //$x = '[USER_ID= ' . $userId . '] ' . $counterId . '+=' . $delta;
             //soundex($x);
             CUserCounter::Increment((int) $userId, $counterId, '**', false, $delta);
         }
     } else {
         CTaskAssert::logError('[0x0a5999d4] Invalid operation: ' . $operation);
     }
 }
Example #16
0
 $arCopy['CHECKLIST_ITEMS'] = array();
 try {
     $oTask = new CTaskItem((int) $_GET["COPY"], $loggedInUserId);
     list($arChecklistItems, $arMetaData) = CTaskCheckListItem::fetchList($oTask, array('SORT_INDEX' => 'ASC'));
     unset($arMetaData);
     foreach ($arChecklistItems as $oChecklistItem) {
         $checklistItemId = -1 * $oChecklistItem->getId();
         $arCopy['CHECKLIST_ITEMS'][$checklistItemId] = $oChecklistItem->getData();
         $arCopy['CHECKLIST_ITEMS'][$checklistItemId]['ID'] = $checklistItemId;
         $arCopy['CHECKLIST_ITEMS'][$checklistItemId]['~ID'] = $checklistItemId;
         $arCopy['CHECKLIST_ITEMS'][$checklistItemId]['META:CAN_MODIFY'] = $oChecklistItem->isActionAllowed(CTaskCheckListItem::ACTION_MODIFY);
         $arCopy['CHECKLIST_ITEMS'][$checklistItemId]['META:CAN_REMOVE'] = $oChecklistItem->isActionAllowed(CTaskCheckListItem::ACTION_REMOVE);
         $arCopy['CHECKLIST_ITEMS'][$checklistItemId]['META:CAN_TOGGLE'] = $oChecklistItem->isActionAllowed(CTaskCheckListItem::ACTION_TOGGLE);
     }
 } catch (Exception $e) {
     CTaskAssert::logError('[0xb490adaa] ');
     // We can't do anything good here.
     // Warning for user is useless, so don't generate it.
     // And it is better what we can do - let's continue work without checklist data
 }
 /*
 if (
 	! isset($arCopy["PARENT_ID"]) 
 	|| ( ! $arCopy["PARENT_ID"])
 )
 {
 	$arCopy["PARENT_ID"] = intval($_GET["COPY"]);
 }
 */
 $arResult['COPY_PARAMS']['ORIGIN_TASK'] = intval($_GET["COPY"]);
 // get template.php to know task being copied