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(); } }
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); }
/** * @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); }
/** * @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; } }
} $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
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; }
// 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";
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; }
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']))) {
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 '???'; } }
/** * @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 }
} } } } 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;
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); } }
$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