public static function onAfterTimeManagerDayStart($arData) { if (!(isset($arData['USER_ID'], $arData['MODIFIED_BY']) && $arData['USER_ID'] > 0 && $arData['MODIFIED_BY'] > 0 && $arData['MODIFIED_BY'] == $arData['USER_ID'] && IsModuleInstalled("im") && CModule::IncludeModule("im"))) { return; } $recipientId = (int) $arData['USER_ID']; try { $tasksCounter = CTaskListCtrl::getMainCounterForUser($recipientId); if ($tasksCounter <= 0) { return; } /** @noinspection PhpDeprecationInspection */ CIMNotify::Add(array('FROM_USER_ID' => 0, 'TO_USER_ID' => $recipientId, 'NOTIFY_MODULE' => 'tasks', 'NOTIFY_EVENT' => 'notice', 'NOTIFY_TYPE' => IM_NOTIFY_SYSTEM, 'NOTIFY_TAG' => 'TASKS|COUNTERS_NOTICE|' . $recipientId, 'MESSAGE' => CTasksTools::getMessagePlural($tasksCounter, 'TASKS_COUNTERS_NOTICE_CONTENT_V2', array('#TASKS_COUNT#' => $tasksCounter, '#HREF#' => self::getTasksListLink($recipientId))), 'TITLE' => GetMessage('TASKS_COUNTERS_NOTICE_TITLE'))); } catch (Exception $e) { CTaskAssert::logWarning('[0xb83d6845] unexpected exception in CTaskCountersNotifier::onAfterTimeManagerDayStart()' . ', file: ' . $e->getFile() . ', line: ' . $e->getLine() . ', code: ' . $e->getCode() . ', message: ' . $e->getMessage()); } }
/** * @deprecated */ private static function getTaskMembersByTaskId($taskId, $excludeUser = 0) { $oTask = CTaskItem::getInstance((int) $taskId, CTasksTools::GetCommanderInChief()); $arTask = $oTask->getData(false); $arUsersIds = CTaskNotifications::getRecipientsIDs($arTask, $bExcludeLoggedUser = false); $excludeUser = (int) $excludeUser; if ($excludeUser >= 1) { $currentUserPos = array_search($excludeUser, $arUsersIds); if ($currentUserPos !== false) { unset($arUsersIds[$currentUserPos]); } } else { if ($excludeUser < 0) { CTaskAssert::logWarning('[0x3c2a31fe] invalid user id (' . $excludeUser . ')'); } } return $arUsersIds; }
} } $arResult = array('td1' => '<span class="task-log-date">' . FormatDateFromDB($arData['CREATED_DATE']) . '</span>', 'td2' => '<a class="task-log-author" target="_top" href="' . CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_USER_PROFILE'], array('user_id' => $authorUserId)) . '">' . htmlspecialcharsbx(tasksFormatNameShort($arCurUserData["NAME"], $arCurUserData["LAST_NAME"], $arCurUserData["LOGIN"], $arCurUserData["SECOND_NAME"], $arParams["NAME_TEMPLATE"])) . '</a>', 'td3' => '<span class="task-log-where">' . GetMessage("TASKS_LOG_DEADLINE") . '</span>', 'td4' => '<span class="task-log-what">' . $strDateFrom . '<span class="task-log-arrow">→</span>' . $strDateTo . '</span>'); header('Content-Type: application/x-javascript; charset=' . LANG_CHARSET); echo CUtil::PhpToJsObject($arResult); } } elseif ($action === 'remove_file') { try { CTaskAssert::log('remove_file: fileId=' . $_POST['fileId'] . ', taskId=' . $_POST['taskId'] . ', userId=' . $loggedInUserId, CTaskAssert::ELL_INFO); CTaskAssert::assert(isset($_POST['fileId'], $_POST['taskId'])); $oTaskItem = new CTaskItem($_POST['taskId'], $loggedInUserId); $oTaskItem->removeAttachedFile($_POST['fileId']); echo 'Success'; } catch (Exception $e) { echo 'Error occured'; CTaskAssert::logWarning('Unable to remove_file: fileId=' . $_POST['fileId'] . ', taskId=' . $_POST['taskId'] . ', userId=' . $loggedInUserId); } } elseif ($action === 'render_task_detail_part') { if (isset($_POST['BLOCK'])) { switch ($_POST['BLOCK']) { case 'buttons': case 'right_sidebar': if ($_POST['IS_IFRAME'] === 'true' || $_POST['IS_IFRAME'] === true || $_POST['IS_IFRAME'] === 'Y') { $isIframe = true; } else { $isIframe = 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']);
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; }