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); }
private static function setTargetSorting($userId, $groupId, $sourceId, $targetId) { $filterCtrl = CTaskFilterCtrl::getInstance($userId, $groupId > 0); $filter = $filterCtrl->getFilterPresetConditionById(CTaskFilterCtrl::STD_PRESET_ALL_MY_TASKS); $filter["CHECK_PERMISSIONS"] = "Y"; $filter["SORTING"] = "N"; if ($groupId > 0) { $filter["GROUP_ID"] = $groupId; } $order = array("SORTING" => "ASC", "STATUS_COMPLETE" => "ASC", "DEADLINE" => "ASC,NULLS", "ID" => "ASC"); $params = array("USER_ID" => $userId, "bIgnoreErrors" => true, "nPageTop" => static::MAX_PAGE_TOP); $result = \CTasks::getList($order, $filter, array("ID", "SORTING"), $params); $lastSortedItem = static::getMaxSort($userId, $groupId); $prevTaskSort = $lastSortedItem ? intval($lastSortedItem["SORT"]) : 0; $prevTaskId = $lastSortedItem && $lastSortedItem["TASK_ID"] ? $lastSortedItem["TASK_ID"] : 0; list($items, $targetFound) = static::getSortedItems($result, $userId, $groupId, $prevTaskSort, $prevTaskId, $sourceId, $targetId); static::insertBatch($items); if (count($items) > 0) { if ($lastSortedItem) { static::update($lastSortedItem["ID"], array("NEXT_TASK_ID" => $items[0]["TASK_ID"])); } if (!$targetFound) { static::setTargetSorting($userId, $groupId, $sourceId, $targetId); } } }
public static function Delete($ID, $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(); } /** @noinspection PhpDeprecationInspection */ $rsRemovingLogItem = self::getByID($ID); if ($rsRemovingLogItem && ($arRemovingLogItem = $rsRemovingLogItem->fetch())) { $taskId = $arRemovingLogItem['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']; } foreach (GetModuleEvents('tasks', 'OnBeforeTaskElapsedTimeDelete', true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID, $arRemovingLogItem)) === false) { return false; } } $strSql = "DELETE FROM b_tasks_elapsed_time WHERE ID = " . $ID; $rc = $DB->Query($strSql, 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) $arRemovingLogItem['SECONDS'])); foreach (GetModuleEvents('tasks', 'OnTaskElapsedTimeDelete', true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID, &$arRemovingLogItem)); } return $rc; }
private static function iterateAgentWork($arFilterExpiredSoon, $arFilterExpired, $arSelect, $arParams) { global $DB; $arTasks = array(); $arExpiredTaskIds = array(); $arExpiredSoonTaskIds = array(); $rs = CTasks::getList(array(), $arFilterExpired, $arSelect, $arParams); while ($arTask = $rs->fetch()) { $taskId = (int) $arTask['ID']; $arExpiredTaskIds[] = $taskId; $arTasks[$taskId] = array('CREATED_BY' => $arTask['CREATED_BY'], 'RESPONSIBLE_ID' => $arTask['RESPONSIBLE_ID'], 'REAL_STATUS' => $arTask['REAL_STATUS'], 'DEADLINE' => $arTask['DEADLINE'], 'ACCOMPLICES' => array(), 'AUDITORS' => array(), 'DEADLINE_COUNTED' => $arTask['DEADLINE_COUNTED']); } $rs = CTasks::getList(array(), $arFilterExpiredSoon, $arSelect, $arParams); while ($arTask = $rs->fetch()) { $taskId = (int) $arTask['ID']; $arExpiredSoonTaskIds[] = $taskId; $arTasks[$taskId] = array('CREATED_BY' => $arTask['CREATED_BY'], 'RESPONSIBLE_ID' => $arTask['RESPONSIBLE_ID'], 'REAL_STATUS' => $arTask['REAL_STATUS'], 'DEADLINE' => $arTask['DEADLINE'], 'ACCOMPLICES' => array(), 'AUDITORS' => array(), 'DEADLINE_COUNTED' => $arTask['DEADLINE_COUNTED']); } $arAllTaskIds = array_merge($arExpiredTaskIds, $arExpiredSoonTaskIds); // mark, that this tasks are counted if (count($arExpiredTaskIds)) { $strSql = "UPDATE b_tasks \n\t\t\t\tSET DEADLINE_COUNTED = " . self::DEADLINE_COUNTED_AS_EXPIRED . " \n\t\t\t\tWHERE ID IN(" . implode(',', $arExpiredTaskIds) . ")"; $rc = $DB->query($strSql, $bIgnoreDbErrors = true); if (!$rc) { throw new Exception(); } } if (count($arExpiredSoonTaskIds)) { $strSql = "UPDATE b_tasks \n\t\t\t\tSET DEADLINE_COUNTED = " . self::DEADLINE_COUNTED_AS_EXPIRED_CANDIDATE . " \n\t\t\t\tWHERE ID IN(" . implode(',', $arExpiredSoonTaskIds) . ")"; $rc = $DB->query($strSql, $bIgnoreDbErrors = true); if (!$rc) { throw new Exception(); } } // get ACCOMPLICES and AUDITORS $allTasksCount = count($arAllTaskIds); if ($allTasksCount) { $rsMembers = CTaskMembers::GetList(array(), array('TASK_ID' => $arAllTaskIds)); if (!is_object($rsMembers)) { throw new Exception(); } while ($arMember = $rsMembers->fetch()) { $taskId = (int) $arMember['TASK_ID']; if ($arMember['TYPE'] === 'A') { $arTasks[$taskId]['ACCOMPLICES'][] = (int) $arMember['USER_ID']; } elseif ($arMember['TYPE'] === 'U') { $arTasks[$taskId]['AUDITORS'][] = (int) $arMember['USER_ID']; } } } // process counters $objSelf = self::getInstance(); foreach ($arTasks as $arTask) { $objSelf->actualizeExpirityCounters($arTask['DEADLINE'], $arTask['DEADLINE_COUNTED'], $arTask['REAL_STATUS'], $arTask['RESPONSIBLE_ID'], $arTask['CREATED_BY'], $arTask['AUDITORS'], $arTask['ACCOMPLICES']); } return $allTasksCount; }