function GetFilterQuery($field, $val, $procent = "Y", $ex_sep = array(), $clob = "N", $div_fields = "Y", $clob_upper = "N") { global $strError; $f = new CFilterQuery("and", "yes", $procent, $ex_sep, $clob, $div_fields, $clob_upper); $query = $f->GetQueryString($field, $val); $error = $f->error; if (strlen(trim($error)) > 0) { $strError .= $error . "<br>"; $query = "0"; } return $query; }
function GetList(&$by, &$order, $arFilter = array(), &$isFiltered, $checkRights = "Y", $getUserName = "******", $getExtraNames = "Y", $siteID = false, $arParams = array()) { $err_mess = CTicket::err_mess() . "<br>Function: GetList<br>Line: "; global $DB, $USER, $USER_FIELD_MANAGER; $bAdmin = 'N'; $bSupportTeam = 'N'; $bSupportClient = 'N'; $bDemo = 'N'; $messJoin = ""; if ($checkRights == 'Y') { $bAdmin = CTicket::IsAdmin() ? 'Y' : 'N'; $bSupportTeam = CTicket::IsSupportTeam() ? 'Y' : 'N'; $bSupportClient = CTicket::IsSupportClient() ? 'Y' : 'N'; $bDemo = CTicket::IsDemo() ? 'Y' : 'N'; $uid = intval($USER->GetID()); } else { $bAdmin = 'Y'; $bSupportTeam = 'Y'; $bSupportClient = 'Y'; $bDemo = 'Y'; if (is_object($USER)) { $uid = intval($USER->GetID()); } else { $uid = -1; } } if ($bAdmin != 'Y' && $bSupportTeam != 'Y' && $bSupportClient != 'Y' && $bDemo != 'Y') { return false; } if ($bSupportTeam == 'Y' || $bAdmin == 'Y' || $bDemo == 'Y') { $lamp = "\n\t\t\t\tif(ifnull(T.DATE_CLOSE,'x')<>'x', 'grey',\n\t\t\t\t\tif(ifnull(T.LAST_MESSAGE_USER_ID,0)='{$uid}', 'green',\n\t\t\t\t\t\tif(ifnull(T.OWNER_USER_ID,0)='{$uid}', 'red',\n\t\t\t\t\t\t\tif(T.LAST_MESSAGE_BY_SUPPORT_TEAM='Y','green_s',\n\t\t\t\t\t\t\t\tif(ifnull(T.RESPONSIBLE_USER_ID,0)='{$uid}', 'red',\n\t\t\t\t\t\t\t\t\t'yellow')))))\n\t\t\t\t"; } else { $lamp = "\n\t\t\t\tif(ifnull(T.DATE_CLOSE,'x')<>'x', 'grey',\n\t\t\t\t\tif(ifnull(T.LAST_MESSAGE_USER_ID,0)='{$uid}', 'green', 'red'))\n\t\t\t\t"; } $bJoinSupportTeamTbl = $bJoinClientTbl = false; $arSqlSearch = array(); $strSqlSearch = ""; if (is_array($arFilter)) { $filterKeys = array_keys($arFilter); for ($i = 0; $i < count($filterKeys); $i++) { $key = $filterKeys[$i]; $val = $arFilter[$filterKeys[$i]]; if (is_array($val) && count($val) <= 0 || !is_array($val) && (strlen($val) <= 0 || $val === 'NOT_REF')) { continue; } $matchValueSet = in_array($key . "_EXACT_MATCH", $filterKeys) ? true : false; $key = strtoupper($key); switch ($key) { case "ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.ID", $val, $match); break; case "HOLD_ON": $arSqlSearch[] = $val == "Y" ? "T.HOLD_ON='Y'" : "T.HOLD_ON = 'N'"; break; case "LID": case "SITE": case "SITE_ID": if (is_array($val)) { $val = implode(" | ", $val); } $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.SITE_ID", $val, $match); break; case "LAMP": if (is_array($val)) { if (count($val) > 0) { foreach ($val as $value) { $str .= ", '" . $DB->ForSQL($value) . "'"; } $str = TrimEx($str, ","); $arSqlSearch[] = " " . $lamp . " in (" . $str . ")"; } } elseif (strlen($val) > 0) { $arSqlSearch[] = " " . $lamp . " = '" . $DB->ForSQL($val) . "'"; } break; case "DATE_CREATE_1": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CREATE>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_CREATE_2": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CREATE<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "DATE_TIMESTAMP_1": if (CheckDateTime($val)) { $arSqlSearch[] = "T.TIMESTAMP_X>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_TIMESTAMP_2": if (CheckDateTime($val)) { $arSqlSearch[] = "T.TIMESTAMP_X<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "DATE_CLOSE_1": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CLOSE>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_CLOSE_2": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CLOSE<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "CLOSE": $arSqlSearch[] = $val == "Y" ? "T.DATE_CLOSE is not null" : "T.DATE_CLOSE is null"; break; case "AUTO_CLOSE_DAYS1": $arSqlSearch[] = "T.AUTO_CLOSE_DAYS>='" . intval($val) . "'"; break; case "AUTO_CLOSE_DAYS2": $arSqlSearch[] = "T.AUTO_CLOSE_DAYS<='" . intval($val) . "'"; break; case "TICKET_TIME_1": $arSqlSearch[] = "UNIX_TIMESTAMP(T.DATE_CLOSE) - UNIX_TIMESTAMP(T.DATE_CREATE)>='" . intval($val) * 86400 . "'"; break; case "TICKET_TIME_2": $arSqlSearch[] = "UNIX_TIMESTAMP(T.DATE_CLOSE) - UNIX_TIMESTAMP(T.DATE_CREATE)<='" . intval($val) * 86400 . "'"; break; case "TITLE": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.TITLE", $val, $match); break; case "MESSAGES1": $arSqlSearch[] = "T.MESSAGES>='" . intval($val) . "'"; break; case "MESSAGES2": $arSqlSearch[] = "T.MESSAGES<='" . intval($val) . "'"; break; case "PROBLEM_TIME1": $arSqlSearch[] = "T.PROBLEM_TIME>='" . intval($val) . "'"; break; case "PROBLEM_TIME2": $arSqlSearch[] = "T.PROBLEM_TIME<='" . intval($val) . "'"; break; case "OVERDUE_MESSAGES1": $arSqlSearch[] = "T.OVERDUE_MESSAGES>='" . intval($val) . "'"; break; case "OVERDUE_MESSAGES2": $arSqlSearch[] = "T.OVERDUE_MESSAGES<='" . intval($val) . "'"; break; case "AUTO_CLOSE_DAYS_LEFT1": $arSqlSearch[] = "TO_DAYS(ADDDATE(T.TIMESTAMP_X, INTERVAL T.AUTO_CLOSE_DAYS DAY))-TO_DAYS(now())>='" . intval($val) . "'"; break; case "AUTO_CLOSE_DAYS_LEFT2": $arSqlSearch[] = "TO_DAYS(ADDDATE(T.TIMESTAMP_X, INTERVAL T.AUTO_CLOSE_DAYS DAY))-TO_DAYS(now())<='" . intval($val) . "'"; break; case "OWNER": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.OWNER_USER_ID, UO.LOGIN, UO.LAST_NAME, UO.NAME, T.OWNER_SID", $val, $match, array("@", ".")); break; case "OWNER_USER_ID": case "OWNER_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T." . $key, $val, $match); break; case "SLA_ID": case "SLA": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.SLA_ID", $val, $match); break; case "CREATED_BY": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.CREATED_USER_ID, UC.LOGIN, UC.LAST_NAME, UC.NAME, T.CREATED_MODULE_NAME", $val, $match); break; case "RESPONSIBLE": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.RESPONSIBLE_USER_ID, UR.LOGIN, UR.LAST_NAME, UR.NAME", $val, $match); break; case "RESPONSIBLE_ID": if (intval($val) > 0) { $arSqlSearch[] = "T.RESPONSIBLE_USER_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.RESPONSIBLE_USER_ID is null or T.RESPONSIBLE_USER_ID=0)"; } break; case "CATEGORY_ID": case "CATEGORY": if (intval($val) > 0) { $arSqlSearch[] = "T.CATEGORY_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.CATEGORY_ID is null or T.CATEGORY_ID=0)"; } break; case "CATEGORY_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DC.SID", $val, $match); break; case "CRITICALITY_ID": case "CRITICALITY": if (intval($val) > 0) { $arSqlSearch[] = "T.CRITICALITY_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.CRITICALITY_ID is null or T.CRITICALITY_ID=0)"; } break; case "CRITICALITY_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DK.SID", $val, $match); break; case "STATUS_ID": case "STATUS": if (intval($val) > 0) { $arSqlSearch[] = "T.STATUS_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.STATUS_ID is null or T.STATUS_ID=0)"; } break; case "STATUS_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DS.SID", $val, $match); break; case "MARK_ID": case "MARK": if (intval($val) > 0) { $arSqlSearch[] = "T.MARK_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.MARK_ID is null or T.MARK_ID=0)"; } break; case "MARK_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DM.SID", $val, $match); break; case "SOURCE_ID": case "SOURCE": if (intval($val) > 0) { $arSqlSearch[] = "T.SOURCE_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.SOURCE_ID is null or T.SOURCE_ID=0)"; } break; case "SOURCE_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DSR.SID", $val, $match); break; case "DIFFICULTY_ID": case "DIFFICULTY": if (intval($val) > 0) { $arSqlSearch[] = "T.DIFFICULTY_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.DIFFICULTY_ID is null or T.DIFFICULTY_ID=0)"; } break; case "DIFFICULTY_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DD.SID", $val, $match); break; case "MODIFIED_BY": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.MODIFIED_USER_ID, T.MODIFIED_MODULE_NAME, UM.LOGIN, UM.LAST_NAME, UM.NAME", $val, $match); break; case "MESSAGE": global $strError; if (strlen($val) <= 0) { break; } if ($bSupportTeam == "Y" || $bAdmin == "Y" || $bDemo == "Y") { $messJoin = "INNER JOIN b_ticket_message M ON (M.TICKET_ID=T.ID)"; } else { $messJoin = "INNER JOIN b_ticket_message M ON (M.TICKET_ID=T.ID and M.IS_HIDDEN='N' and M.IS_LOG='N')"; } if (CSupportSearch::checkModule()) { $arSqlSearch[] = CSupportSearch::GetFilterQuery($val, "M.ID", "T.TITLE", "M.MESSAGE", $strError); } else { $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $f = new CFilterQuery("OR", "yes", $match, array(), "N", "Y", "N"); $query = $f->GetQueryString("T.TITLE,M.MESSAGE_SEARCH", $val); $error = $f->error; if (strlen(trim($error)) > 0) { $strError .= $error . "<br>"; $query = "0"; } else { $arSqlSearch[] = $query; } } break; case "LAST_MESSAGE_USER_ID": case "LAST_MESSAGE_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T." . $key, $val, $match); break; case "SUPPORT_COMMENTS": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.SUPPORT_COMMENTS", $val, $match); break; case "IS_SPAM": $arSqlSearch[] = $val == "Y" ? "T.IS_SPAM ='Y'" : "(T.IS_SPAM = 'N' or T.IS_SPAM is null)"; break; case "IS_OVERDUE": $arSqlSearch[] = $val == "Y" ? "T.IS_OVERDUE ='Y'" : "(T.IS_OVERDUE = 'N' or T.IS_OVERDUE is null)"; break; case "IS_SPAM_MAYBE": $arSqlSearch[] = $val == "Y" ? "T.IS_SPAM='N'" : "(T.IS_SPAM='Y' or T.IS_SPAM is null)"; break; case 'SUPPORTTEAM_GROUP_ID': case 'CLIENT_GROUP_ID': if ($key == 'SUPPORTTEAM_GROUP_ID') { $table = 'UGS'; $bJoinSupportTeamTbl = true; } else { $table = 'UGC'; $bJoinClientTbl = true; } if (is_array($val)) { $val = array_map('intval', $val); $val = array_unique($val); $val = array_filter($val); if (count($val) > 0) { $arSqlSearch[] = '(' . $table . '.GROUP_ID IS NOT NULL AND ' . $table . '.GROUP_ID IN (' . implode(',', $val) . '))'; } } else { $val = intval($val); if ($val > 0) { $arSqlSearch[] = '(' . $table . '.GROUP_ID IS NOT NULL AND ' . $table . '.GROUP_ID=\'' . $val . '\')'; } } break; case 'COUPON': $match = $matchValueSet && $arFilter[$key . "_EXACT_MATCH"] != "Y" ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T." . $key, $val, $match); break; } } } $obUserFieldsSql = new CUserTypeSQL(); $obUserFieldsSql->SetEntity("SUPPORT", "T.ID"); $obUserFieldsSql->SetSelect($arParams["SELECT"]); $obUserFieldsSql->SetFilter($arFilter); $obUserFieldsSql->SetOrder(array($by => $order)); if ($by == "s_id") { $strSqlOrder = "ORDER BY T.ID"; } elseif ($by == "s_last_message_date") { $strSqlOrder = "ORDER BY T.LAST_MESSAGE_DATE"; } elseif ($by == "s_site_id" || $by == "s_lid") { $strSqlOrder = "ORDER BY T.SITE_ID"; } elseif ($by == "s_lamp") { $strSqlOrder = "ORDER BY LAMP"; } elseif ($by == "s_is_overdue") { $strSqlOrder = "ORDER BY T.IS_OVERDUE"; } elseif ($by == "s_is_notified") { $strSqlOrder = "ORDER BY T.IS_NOTIFIED"; } elseif ($by == "s_date_create") { $strSqlOrder = "ORDER BY T.DATE_CREATE"; } elseif ($by == "s_timestamp") { $strSqlOrder = "ORDER BY T.TIMESTAMP_X"; } elseif ($by == "s_date_close") { $strSqlOrder = "ORDER BY T.DATE_CLOSE"; } elseif ($by == "s_owner") { $strSqlOrder = "ORDER BY T.OWNER_USER_ID"; } elseif ($by == "s_modified_by") { $strSqlOrder = "ORDER BY T.MODIFIED_USER_ID"; } elseif ($by == "s_title") { $strSqlOrder = "ORDER BY T.TITLE "; } elseif ($by == "s_responsible") { $strSqlOrder = "ORDER BY T.RESPONSIBLE_USER_ID"; } elseif ($by == "s_messages") { $strSqlOrder = "ORDER BY T.MESSAGES"; } elseif ($by == "s_category") { $strSqlOrder = "ORDER BY T.CATEGORY_ID"; } elseif ($by == "s_criticality") { $strSqlOrder = "ORDER BY T.CRITICALITY_ID"; } elseif ($by == "s_sla") { $strSqlOrder = "ORDER BY T.SLA_ID"; } elseif ($by == "s_status") { $strSqlOrder = "ORDER BY T.STATUS_ID"; } elseif ($by == "s_difficulty") { $strSqlOrder = "ORDER BY T.DIFFICULTY_ID"; } elseif ($by == "s_problem_time") { $strSqlOrder = "ORDER BY T.PROBLEM_TIME"; } elseif ($by == "s_mark") { $strSqlOrder = "ORDER BY T.MARK_ID"; } elseif ($by == "s_online") { $strSqlOrder = "ORDER BY USERS_ONLINE"; } elseif ($by == "s_support_comments") { $strSqlOrder = "ORDER BY T.SUPPORT_COMMENTS"; } elseif ($by == "s_auto_close_days_left") { $strSqlOrder = "ORDER BY AUTO_CLOSE_DAYS_LEFT"; } elseif ($by == 's_coupon') { $strSqlOrder = 'ORDER BY T.COUPON'; } elseif ($by == 's_deadline') { $strSqlOrder = 'ORDER BY T.SUPPORT_DEADLINE'; } elseif ($s = $obUserFieldsSql->GetOrder($by)) { $strSqlOrder = "ORDER BY " . strtoupper($s); } else { $by = "s_default"; $strSqlOrder = "ORDER BY IS_SUPER_TICKET DESC, T.IS_OVERDUE DESC, T.IS_NOTIFIED DESC, T.LAST_MESSAGE_DATE"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $arSqlSearch[] = $obUserFieldsSql->GetFilter(); if ($getUserName == "Y") { $u_select = "\n\t\t\t\t,\n\t\t\t\tUO.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tOWNER_LOGIN,\n\t\t\t\tUO.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tOWNER_EMAIL,\n\t\t\t\tconcat(ifnull(UO.NAME,''),' ',ifnull(UO.LAST_NAME,''))\t\tOWNER_NAME,\n\t\t\t\tUR.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tRESPONSIBLE_LOGIN,\n\t\t\t\tUR.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tRESPONSIBLE_EMAIL,\n\t\t\t\tconcat(ifnull(UR.NAME,''),' ',ifnull(UR.LAST_NAME,''))\t\tRESPONSIBLE_NAME,\n\t\t\t\tUM.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_BY_LOGIN,\n\t\t\t\tUM.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_BY_EMAIL,\n\t\t\t\tconcat(ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,''))\t\tMODIFIED_BY_NAME,\n\t\t\t\tUM.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_LOGIN,\n\t\t\t\tUM.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_EMAIL,\n\t\t\t\tconcat(ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,''))\t\tMODIFIED_NAME,\n\t\t\t\tUL.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tLAST_MESSAGE_LOGIN,\n\t\t\t\tUL.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tLAST_MESSAGE_EMAIL,\n\t\t\t\tconcat(ifnull(UL.NAME,''),' ',ifnull(UL.LAST_NAME,''))\t\tLAST_MESSAGE_NAME,\n\t\t\t\tUC.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tCREATED_LOGIN,\n\t\t\t\tUC.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tCREATED_EMAIL,\n\t\t\t\tconcat(ifnull(UC.NAME,''),' ',ifnull(UC.LAST_NAME,''))\t\tCREATED_NAME\n\t\t\t"; $u_join = "\n\t\t\tLEFT JOIN b_user UO ON (UO.ID = T.OWNER_USER_ID)\n\t\t\tLEFT JOIN b_user UR ON (UR.ID = T.RESPONSIBLE_USER_ID)\n\t\t\tLEFT JOIN b_user UM ON (UM.ID = T.MODIFIED_USER_ID)\n\t\t\tLEFT JOIN b_user UL ON (UL.ID = T.LAST_MESSAGE_USER_ID)\n\t\t\tLEFT JOIN b_user UC ON (UC.ID = T.CREATED_USER_ID)\n\t\t\t"; } if ($getExtraNames == "Y") { $d_select = "\n\t\t\t\t,\n\t\t\t\tDC.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\tCATEGORY_NAME,\n\t\t\t\tDC.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tCATEGORY_DESC,\n\t\t\t\tDC.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tCATEGORY_SID,\n\t\t\t\tDK.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\tCRITICALITY_NAME,\n\t\t\t\tDK.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tCRITICALITY_DESC,\n\t\t\t\tDK.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tCRITICALITY_SID,\n\t\t\t\tDS.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\tSTATUS_NAME,\n\t\t\t\tDS.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tSTATUS_DESC,\n\t\t\t\tDS.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tSTATUS_SID,\n\t\t\t\tDM.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tMARK_NAME,\n\t\t\t\tDM.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tMARK_DESC,\n\t\t\t\tDM.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tMARK_SID,\n\t\t\t\tDSR.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tSOURCE_NAME,\n\t\t\t\tDSR.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tSOURCE_DESC,\n\t\t\t\tDSR.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tSOURCE_SID,\n\t\t\t\tDD.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tDIFFICULTY_NAME,\n\t\t\t\tDD.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tDIFFICULTY_DESC,\n\t\t\t\tDD.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tDIFFICULTY_SID,\n\t\t\t\tSLA.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tSLA_NAME\n\t\t\t"; $d_join = "\n\t\t\tLEFT JOIN b_ticket_dictionary DC ON (DC.ID = T.CATEGORY_ID and DC.C_TYPE = 'C')\n\t\t\tLEFT JOIN b_ticket_dictionary DK ON (DK.ID = T.CRITICALITY_ID and DK.C_TYPE = 'K')\n\t\t\tLEFT JOIN b_ticket_dictionary DS ON (DS.ID = T.STATUS_ID and DS.C_TYPE = 'S')\n\t\t\tLEFT JOIN b_ticket_dictionary DM ON (DM.ID = T.MARK_ID and DM.C_TYPE = 'M')\n\t\t\tLEFT JOIN b_ticket_dictionary DSR ON (DSR.ID = T.SOURCE_ID and DSR.C_TYPE = 'SR')\n\t\t\tLEFT JOIN b_ticket_dictionary DD ON (DD.ID = T.DIFFICULTY_ID and DD.C_TYPE = 'D')\n\t\t\tLEFT JOIN b_ticket_sla SLA ON (SLA.ID = T.SLA_ID)\n\t\t\t"; } if (strlen($siteID) > 0) { $dates_select = "\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "FULL", $siteID, true) . "\tDATE_CREATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "FULL", $siteID, true) . "\tTIMESTAMP_X,\n\t\t\t\t" . $DB->DateToCharFunction("T.LAST_MESSAGE_DATE", "FULL", $siteID, true) . "\tLAST_MESSAGE_DATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "FULL", $siteID, true) . "\tDATE_CLOSE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "SHORT", $siteID, true) . "\tDATE_CREATE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "SHORT", $siteID, true) . "\tTIMESTAMP_X_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "SHORT", $siteID, true) . "\tDATE_CLOSE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.SUPPORT_DEADLINE", "FULL", $siteID, true) . "\tSUPPORT_DEADLINE,\n\t\t\t\t" . $DB->DateToCharFunction("ADDDATE(T.TIMESTAMP_X, INTERVAL T.AUTO_CLOSE_DAYS DAY)", "FULL", $siteID, true) . "\tAUTO_CLOSE_DATE\n\t\t\t"; } else { $dates_select = "\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "FULL") . "\t\tDATE_CREATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "FULL") . "\t\tTIMESTAMP_X,\n\t\t\t\t" . $DB->DateToCharFunction("T.LAST_MESSAGE_DATE", "FULL") . "\tLAST_MESSAGE_DATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "FULL") . "\t\tDATE_CLOSE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "SHORT") . "\tDATE_CREATE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "SHORT") . "\tTIMESTAMP_X_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "SHORT") . "\t\tDATE_CLOSE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.SUPPORT_DEADLINE", "FULL") . "\tSUPPORT_DEADLINE,\n\t\t\t\t" . $DB->DateToCharFunction("ADDDATE(T.TIMESTAMP_X, INTERVAL T.AUTO_CLOSE_DAYS DAY)", "FULL") . "\tAUTO_CLOSE_DATE\n\t\t\t"; } $ugroupJoin = ''; $strSqlSearchUser = ''; if ($bJoinSupportTeamTbl || !($bAdmin == 'Y' || $bDemo == 'Y') && $bSupportTeam == 'Y') { $ugroupJoin .= "\n\t\t\t\tLEFT JOIN b_ticket_user_ugroup UGS ON (UGS.USER_ID = T.RESPONSIBLE_USER_ID) "; } if ($bJoinClientTbl || !($bAdmin == 'Y' || $bDemo == 'Y') && $bSupportClient == 'Y') { $ugroupJoin .= "\n\t\t\t\tLEFT JOIN b_ticket_user_ugroup UGC ON (UGC.USER_ID = T.OWNER_USER_ID) "; } if (!($bAdmin == 'Y' || $bDemo == 'Y')) { $strSqlSearchUser = "******"; if ($bSupportTeam == 'Y') { $strSqlSearchUser .= " OR (UGS2.USER_ID IS NOT NULL AND UGS2.USER_ID='{$uid}' AND UUS.IS_TEAM_GROUP IS NOT NULL AND UUS.IS_TEAM_GROUP='Y')"; $ugroupJoin .= "\n\t\t\t\t\tLEFT JOIN b_ticket_user_ugroup UGS2 ON (UGS2.GROUP_ID = UGS.GROUP_ID AND UGS2.CAN_VIEW_GROUP_MESSAGES = 'Y')\n\t\t\t\t\tLEFT JOIN b_ticket_ugroups UUS ON (UUS.ID = UGS.GROUP_ID) "; } elseif ($bSupportClient == 'Y') { $strSqlSearchUser .= " OR (UGC2.USER_ID IS NOT NULL AND UGC2.USER_ID='{$uid}' AND UUC.IS_TEAM_GROUP IS NOT NULL AND UUC.IS_TEAM_GROUP<>'Y')"; $ugroupJoin .= "\n\t\t\t\t\tLEFT JOIN b_ticket_user_ugroup UGC2 ON (UGC2.GROUP_ID = UGC.GROUP_ID AND UGC2.CAN_VIEW_GROUP_MESSAGES = 'Y')\n\t\t\t\t\tLEFT JOIN b_ticket_ugroups UUC ON (UUC.ID = UGC.GROUP_ID) "; } $strSqlSearchUser .= ')'; $arSqlSearch[] = $strSqlSearchUser; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $onlineInterval = intval(COption::GetOptionString("support", "ONLINE_INTERVAL")); $strSql = "\n\t\t\tSELECT\n\t\t\t\tT.*,\n\t\t\t\tT.SITE_ID,\n\t\t\t\tT.SITE_ID\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLID,\n\t\t\t\t{$dates_select},\n\t\t\t\tUNIX_TIMESTAMP(T.DATE_CLOSE)-UNIX_TIMESTAMP(T.DATE_CREATE)\t\t\t\t\t\t\tTICKET_TIME,\n\t\t\t\tTO_DAYS(ADDDATE(T.TIMESTAMP_X, INTERVAL T.AUTO_CLOSE_DAYS DAY))-TO_DAYS(now())\t\tAUTO_CLOSE_DAYS_LEFT,\n\t\t\t\tcount(distinct TN.USER_ID)\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSERS_ONLINE,\n\t\t\t\tif(T.COUPON IS NOT NULL, 1, 0)\t\t\t\t\t\t\t\t\t\t\t\t\t\tIS_SUPER_TICKET,\n\t\t\t\t{$lamp}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLAMP\n\t\t\t\t{$d_select}\n\t\t\t\t{$u_select}\n\t\t\t\t" . $obUserFieldsSql->GetSelect() . "\n\t\t\tFROM\n\t\t\t\tb_ticket T\n\t\t\tLEFT JOIN b_ticket_online TN ON (TN.TICKET_ID = T.ID and TN.TIMESTAMP_X >= DATE_ADD(now(), INTERVAL - {$onlineInterval} SECOND))\n\t\t\t{$u_join}\n\t\t\t{$d_join}\n\t\t\t{$messJoin}\n\t\t\t{$ugroupJoin}\n\t\t\t\t" . $obUserFieldsSql->GetJoin("T.ID") . "\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t\tGROUP BY\n\t\t\t\tT.ID\n\t\t\t{$strSqlOrder}\n\t\t\t"; $res = $DB->Query($strSql, false, $err_mess . __LINE__); $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("SUPPORT")); $isFiltered = IsFiltered($strSqlSearch); return $res; }
/** * <p>Функция предназначена для получения списка обращений в техподдержку.</p> * * * * * @param varchar &$by Идентификатор, позволяющий задать имя поля для сортировки. * Допустимы следующие значения: <ul> <li>s_id - по ID </li> <li>s_lid - по сайту, * для которого было создано обращение </li> <li>s_lamp - по индикатору </li> * <li>s_date_create - по дате создания </li> <li>s_timestamp - по дате изменения </li> * <li>s_date_close - по дате закрытия </li> <li>s_owner - по автору </li> <li>s_modified_by - по * ID пользователя - изменившего обращение </li> <li>s_title - по заголовку * </li> <li>s_responsible - по ID ответственного </li> <li>s_messages - по количеству * сообщений </li> <li>s_category - по ID категории </li> <li>s_criticality - по ID * критичности </li> <li>s_status - по ID статуса </li> <li>s_mark - по ID оценки </li> * <li>s_online - по количеству пользователей </li> </ul> * * * * @param varchar &$order Порядок сортировки. Допустимы следующие значения: <ul> <li>desc - по * убыванию (значение по умолчанию) </li> <li>asc - по возрастанию </li> </ul> * * * * @param array $arFilter = array() Массив для фильтрации значений. Необязательный параметр. В * массиве допустимы следующие индексы: <ul> <li>ID - ID обращения * (допускается сложная логика) </li> <li>ID_EXACT_MATCH - "Y" - при фильтрации по * ID обращения будет искаться точное совпадение (по умолчанию); "N" - в * противном случае будет искаться вхождение </li> <li>LID - ID сайта </li> * <li>LID_EXACT_MATCH - "Y" - при фильтрации по ID языка будет искаться точное * совпадение (по умолчанию); "N" - в противном случае будет искаться * вхождение </li> <li>LAMP - массив индикаторов: "red", "yellow", "green", "green_s", "grey" * </li> <li>DATE_CREATE_1 - левая часть интервала для даты создания обращения * </li> <li>DATE_CREATE_2 - правая часть интервала для даты создания обращения * </li> <li>DATE_TIMESTAMP_1 - левая часть интервала для даты модификации * обращения </li> <li>DATE_TIMESTAMP_2 - правая часть интервала для даты * модификации обращения </li> <li>DATE_CLOSE_1 - левая часть интервала для * даты закрытия обращения </li> <li>DATE_CLOSE_2 - правая часть интервала для * даты закрытия обращения </li> <li>AUTO_CLOSE_DAYS1 - левая часть интервала * для количества дней по истечении которых обращение будет * автоматически закрыто при отсутствии ответа от автора </li> * <li>AUTO_CLOSE_DAYS2 - правая часть интервала для количества дней по * истечении которых обращение будет автоматически закрыто при * отсутствии ответа от автора </li> <li>TICKET_TIME_1 - левая часть интервала * для количества дней прошедших с даты создания до даты закрытия * обращения </li> <li>TICKET_TIME_2 - правая часть интервала для количества * дней прошедших с даты создания до даты закрытия обращения </li> * <li>TITLE - заголовок обращения (допускается сложная логика) </li> * <li>TITLE_EXACT_MATCH - "Y" - при фильтрации по заголовку обращения будет * искаться точное совпадение (по умолчанию); "N" - в противном случае * будет искаться вхождение </li> <li>MESSAGES1 - левая часть интервала для * количества сообщений в обращении </li> <li>MESSAGES2 - правая часть * интервала для количества сообщений в обращении </li> <li>OWNER - автор * обращения, поиск осуществляется по ID пользователя, логину, имени, * фамилии, символному коду (допускается сложная логика) </li> * <li>OWNER_EXACT_MATCH - "Y" - при фильтрации по автору обращения будет * искаться точное совпадение (по умолчанию); "N" - в противном случае * будет искаться вхождение </li> <li>CREATED_BY - кем было создано обращение, * поиск осуществляется по ID пользователя, логину, имени, фамилии, * названии модуля из которого было создано обращение (допускается * сложная логика) </li> <li>CREATED_BY_EXACT_MATCH - "Y" - при фильтрации по * создателю обращения будет искаться точное совпадение (по * умолчанию); "N" - в противном случае будет искаться вхождение </li> * <li>MODIFIED_BY - изменивший обращение, поиск осуществляется по ID * пользователя, логину, имени, фамилии, названии модуля из которого * было изменено обращение (допускается сложная логика) </li> * <li>MODIFIED_BY_EXACT_MATCH - "Y" - при фильтрации по символьному коду статуса * будет искаться точное совпадение (по умолчанию); "N" - в противном * случае будет искаться вхождение </li> <li>RESPONSIBLE - ответственный за * обращение, поиск осуществляется по ID пользователя, логину, имени, * фамилии (допускается сложная логика) </li> <li>RESPONSIBLE_EXACT_MATCH - "Y" - при * фильтрации по ответственному за обращение будет искаться точное * совпадение (по умолчанию); "N" - в противном случае будет искаться * вхождение </li> <li>RESPONSIBLE_ID - ID пользователя ответственного за * обращение, при задании "0" будут выбраны только те обращения у * которых нет ответственного </li> <li>CATEGORY - ID категории обращения (0 - * без категории) </li> <li>CATEGORY_SID - символьный код категории обращения * (допускается сложная логика) </li> <li>CATEGORY_SID_EXACT_MATCH - "Y" - при * фильтрации по символьному коду категории будет искаться точное * совпадение (по умолчанию); "N" - в противном случае будет искаться * вхождение </li> <li>CRITICALITY - ID критичности обращения (0 - без * критичности) </li> <li>CRITICALITY_SID - символьный код критичности * обращения (допускается сложная логика) </li> <li>CRITICALITY_SID_EXACT_MATCH - "Y" - * при фильтрации по символьному коду критичности будет искаться * точное совпадение (по умолчанию); "N" - в противном случае будет * искаться вхождение </li> <li>STATUS - ID статуса обращения (0 - без статуса) * </li> <li>STATUS_SID - символьный код статуса обращения (допускается * сложная логика) </li> <li>STATUS_SID_EXACT_MATCH - "Y" - при фильтрации по * символьному коду статуса будет искаться точное совпадение (по * умолчанию); "N" - в противном случае будет искаться вхождение </li> * <li>STATUS_SID_EXACT_MATCH - "Y" - при фильтрации по символьному коду оценки * ответа будет искаться точное совпадение (по умолчанию); "N" - в * противном случае будет искаться вхождение </li> <li>MARK - ID оценки * ответов (0 - без оценки) </li> <li>MARK_SID - символьный код оценки ответов * (допускается сложная логика) </li> <li>SOURCE - ID источника (0 - источник * "web") </li> <li>SOURCE_SID - символьный код источника (допускается сложная * логика) </li> <li>SOURCE_SID_EXACT_MATCH - "Y" - при фильтрации по символьному коду * источника будет искаться точное совпадение (по умолчанию); "N" - в * противном случае будет искаться вхождение </li> <li>MESSAGE - текст * сообщения (допускается сложная логика) </li> <li>MESSAGE_EXACT_MATCH - "Y" - при * фильтрации по сообщению будет искаться точное совпадение (по * умолчанию); "N" - в противном случае будет искаться вхождение </li> * <li>LAST_MESSAGE_USER_ID - ID пользователя написавшего последнее сообщение в * обращении (допускается сложная логика) </li> <li>LAST_MESSAGE_USER_ID_EXACT_MATCH - "Y" * - при фильтрации по ID пользователя написавшего последнее * сообщение в обращении будет искаться точное совпадение (по * умолчанию); "N" - в противном случае будет искаться вхождение </li> * <li>LAST_MESSAGE_SID - символьный идентификатор написавшего последнее * сообщение в обращении (если источник "email", то это может быть email, * если источник "телефон", то это может быть номер телефона) * (допускается сложная логика) </li> <li>LAST_MESSAGE_SID_EXACT_MATCH - "Y" - при * фильтрации по символьному идентификатору пользователя * написавшего последнее сообщение в обращении будет искаться * точное совпадение (по умолчанию); "N" - в противном случае будет * искаться вхождение </li> <li>SUPPORT_COMMENTS - комментарий техподдержки, * видимый в стандартных формах только для пользователей входящих в * группу техподдержки </li> <li>SUPPORT_COMMENTS_EXACT_MATCH - "Y" - при фильтрации по ID * пользователя написавшего последнее сообщение в обращении будет * искаться точное совпадение (по умолчанию); "N" - в противном случае * будет искаться вхождение </li> <li>SITE_ID - идентификатор сайта</li> <li>CLOSE * - Y\N - закрыт тикет, или нет</li> <li>S_SPAM - Y\N - флаг, является ли тикет * спамом</li> <li>IS_OVERDUE - Y\N - флаг, просрочен ли тикет.</li> <li>SLA_ID - по ID * уровня техподдержки (допускается сложная логика).</li> * <li>SUPPORTTEAM_GROUP_ID - по ID группы техподдержки (число или массив * чисел).</li> <li>CLIENT_GROUP_ID - Y\N - по ID группы клиентов (число или массив * чисел).</li> </ul> * * * * @param boolean &$is_filtered Переменная возвращающая true в том случае если список результатов * отфильтрован по какому либо критерию; либо false в противном случае. * Изменен на <b>isFiltered</b> c 12.0.0 * * * * @param char(1) $CHECK_RIGHTS = "Y" Необязательный параметр. "Y" - будут выбраны только те обращения * которые текущий пользователь может просматривать (по умолчанию); * "N" - выбирать все обращения независимо от прав текущего * пользователя. Изменен на <b>checkRights</b> c 12.0.0 * * * * @param char(1) $get_user_name = "Y" Необязательный параметр. "Y" - при выборке обращений будут также * выбраны такие поля как OWNER_LOGIN, OWNER_NAME, RESPONSIBLE_LOGIN, RESPONSIBLE_NAME, MODIFIED_LOGIN, * MODIFIED_NAME, LAST_MESSAGE_LOGIN, LAST_MESSAGE_NAME, CREATED_LOGIN, CREATED_EMAIL, CREATED_NAME, описывающие * параметры пользователей имевших отношение к данному обращению * (по умолчанию); "N" - вышеперечисленные поля не будут выбраны, но * зато это ускорит работу функции. Изменен на <b>getUserName</b> c 12.0.0 * * * * @param char(1) $get_dictionary_name = "Y" Необязательный параметр. "Y" - при выборке обращений будут также * выбраны такие поля как CATEGORY_NAME, CATEGORY_SID, CRITICALITY_NAME, CRITICALITY_SID, STATUS_NAME, * STATUS_SID, MARK_NAME, MARK_SID, SOURCE_NAME, SOURCE_SID, описывающие поля из справочника * техподдержки (по умолчанию); "N" - вышеперечисленные поля не будут * выбраны, но зато это ускорит работу функции. Удален с 4.0.6 * * * * @param char(2) $lang = LANG Двухсимвольный код языка в формате которого необходимо выбрать * временные параметры обращения (время создания, изменения, * закрытия); необязательный параметр, по умолчанию - код текущего * сайта. Удален с 4.0.0 * * * * @return record * * * <h4>Example</h4> * <pre> * <?<br>$FilterArr = Array(<br> "find_id",<br> "find_lid",<br> "find_lamp",<br> "find_date_create1",<br> "find_date_create2",<br> "find_date_timestamp1",<br> "find_date_timestamp2",<br> "find_date_close1",<br> "find_date_close2",<br> "find_close",<br> "find_ticket_time_1",<br> "find_ticket_time_2",<br> "find_title",<br> "find_messages1",<br> "find_messages2",<br> "find_owner",<br> "find_created_by",<br> "find_responsible",<br> "find_responsible_id",<br> "find_category_id",<br> "find_criticality_id",<br> "find_status_id",<br> "find_mark_id",<br> "find_source_id",<br> "find_modified_by",<br> "find_message"<br> );<br>if (strlen($set_filter)>0) InitFilterEx($FilterArr,"TICKET_LIST","set",true); else InitFilterEx($FilterArr,"TICKET_LIST","get",true);<br>if (strlen($del_filter)>0) DelFilterEx($FilterArr,"TICKET_LIST",true);<br>if (CheckFilter())<br>{<br> $arFilter = Array(<br> "ID" => $find_id,<br> "LID" => $find_lid,<br> "LAMP" => $find_lamp,<br> "DATE_CREATE_1" => $find_date_create1,<br> "DATE_CREATE_2" => $find_date_create2,<br> "DATE_TIMESTAMP_1" => $find_date_timestamp1,<br> "DATE_TIMESTAMP_2" => $find_date_timestamp2,<br> "DATE_CLOSE_1" => $find_date_close1,<br> "DATE_CLOSE_2" => $find_date_close2,<br> "CLOSE" => $find_close,<br> "TICKET_TIME_1" => $find_ticket_time_1,<br> "TICKET_TIME_2" => $find_ticket_time_2,<br> "TITLE" => $find_title,<br> "MESSAGES1" => $find_messages1,<br> "MESSAGES2" => $find_messages2,<br> "OWNER" => $find_owner,<br> "CREATED_BY" => $find_created_by,<br> "RESPONSIBLE" => $find_responsible,<br> "RESPONSIBLE_ID" => $find_responsible_id,<br> "CATEGORY" => $find_category_id,<br> "CRITICALITY" => $find_criticality_id,<br> "STATUS" => $find_status_id,<br> "MARK" => $find_mark_id,<br> "SOURCE" => $find_source_id,<br> "MODIFIED_BY" => $find_modified_by,<br> "MESSAGE" => $find_message<br> );<br>}<br>$tickets = <b>CTicket::GetList</b>($by, $order, $arFilter, $is_filtered);<br>?><br> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/support/classes/cticket/getlist.php * @author Bitrix */ public static function GetList(&$by, &$order, $arFilter = array(), &$isFiltered, $checkRights = "Y", $getUserName = "******", $getExtraNames = "Y", $siteID = false, $arParams = array()) { $err_mess = CTicket::err_mess() . "<br>Function: GetList<br>Line: "; global $DB, $USER, $USER_FIELD_MANAGER; /** @var string $d_join Dictionary join */ $d_join = ""; $bAdmin = 'N'; $bSupportTeam = 'N'; $bSupportClient = 'N'; $bDemo = 'N'; /** @var string $messJoin Messages join */ $messJoin = ""; /** @var string $searchJoin Search table join */ $searchJoin = ''; $need_group = false; $arSqlHaving = array(); if ($checkRights == 'Y') { $bAdmin = CTicket::IsAdmin() ? 'Y' : 'N'; $bSupportTeam = CTicket::IsSupportTeam() ? 'Y' : 'N'; $bSupportClient = CTicket::IsSupportClient() ? 'Y' : 'N'; $bDemo = CTicket::IsDemo() ? 'Y' : 'N'; $uid = intval($USER->GetID()); } else { $bAdmin = 'Y'; $bSupportTeam = 'Y'; $bSupportClient = 'Y'; $bDemo = 'Y'; if (is_object($USER)) { $uid = intval($USER->GetID()); } else { $uid = -1; } } if ($bAdmin != 'Y' && $bSupportTeam != 'Y' && $bSupportClient != 'Y' && $bDemo != 'Y') { return false; } if ($bSupportTeam == 'Y' || $bAdmin == 'Y' || $bDemo == 'Y') { $lamp = "\n\t\t\t\tif(ifnull(T.DATE_CLOSE,'x')<>'x', 'grey',\n\t\t\t\t\tif(ifnull(T.LAST_MESSAGE_USER_ID,0)='{$uid}', 'green',\n\t\t\t\t\t\tif(ifnull(T.OWNER_USER_ID,0)='{$uid}', 'red',\n\t\t\t\t\t\t\tif(T.LAST_MESSAGE_BY_SUPPORT_TEAM='Y','green_s',\n\t\t\t\t\t\t\t\tif(ifnull(T.RESPONSIBLE_USER_ID,0)='{$uid}', 'red',\n\t\t\t\t\t\t\t\t\t'yellow')))))\n\t\t\t\t"; } else { $lamp = "\n\t\t\t\tif(ifnull(T.DATE_CLOSE,'x')<>'x', 'grey',\n\t\t\t\t\tif(T.LAST_MESSAGE_BY_SUPPORT_TEAM='Y', 'red', 'green'))\n\t\t\t\t"; } $bJoinSupportTeamTbl = $bJoinClientTbl = false; $arSqlSearch = array(); $strSqlSearch = ""; if (is_array($arFilter)) { $filterKeys = array_keys($arFilter); $filterKeysCount = count($filterKeys); for ($i = 0; $i < $filterKeysCount; $i++) { $key = $filterKeys[$i]; $val = $arFilter[$filterKeys[$i]]; if (is_array($val) && count($val) <= 0 || !is_array($val) && (strlen($val) <= 0 || $val === 'NOT_REF')) { continue; } $matchValueSet = in_array($key . "_EXACT_MATCH", $filterKeys) ? true : false; $key = strtoupper($key); switch ($key) { case "ID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.ID", $val, $match); break; case "HOLD_ON": $arSqlSearch[] = $val == "Y" ? "T.HOLD_ON='Y'" : "T.HOLD_ON = 'N'"; break; case "LID": case "SITE": case "SITE_ID": if (is_array($val)) { $val = implode(" | ", $val); } $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.SITE_ID", $val, $match); break; case "LAMP": if (is_array($val)) { if (count($val) > 0) { $str = ""; foreach ($val as $value) { $str .= ", '" . $DB->ForSQL($value) . "'"; } $str = TrimEx($str, ","); $arSqlSearch[] = " " . $lamp . " in (" . $str . ")"; } } elseif (strlen($val) > 0) { $arSqlSearch[] = " " . $lamp . " = '" . $DB->ForSQL($val) . "'"; } break; case "DATE_CREATE_1": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CREATE>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_CREATE_2": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CREATE<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "DATE_TIMESTAMP_1": if (CheckDateTime($val)) { $arSqlSearch[] = "T.TIMESTAMP_X>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_TIMESTAMP_2": if (CheckDateTime($val)) { $arSqlSearch[] = "T.TIMESTAMP_X<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "DATE_CLOSE_1": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CLOSE>=" . $DB->CharToDateFunction($val, "SHORT"); } break; case "DATE_CLOSE_2": if (CheckDateTime($val)) { $arSqlSearch[] = "T.DATE_CLOSE<" . $DB->CharToDateFunction($val, "SHORT") . " + INTERVAL 1 DAY"; } break; case "CLOSE": $arSqlSearch[] = $val == "Y" ? "T.DATE_CLOSE is not null" : "T.DATE_CLOSE is null"; break; case "AUTO_CLOSE_DAYS1": $arSqlSearch[] = "T.AUTO_CLOSE_DAYS>='" . intval($val) . "'"; break; case "AUTO_CLOSE_DAYS2": $arSqlSearch[] = "T.AUTO_CLOSE_DAYS<='" . intval($val) . "'"; break; case "TICKET_TIME_1": $arSqlSearch[] = "UNIX_TIMESTAMP(T.DATE_CLOSE) - UNIX_TIMESTAMP(T.DATE_CREATE)>='" . intval($val) * 86400 . "'"; break; case "TICKET_TIME_2": $arSqlSearch[] = "UNIX_TIMESTAMP(T.DATE_CLOSE) - UNIX_TIMESTAMP(T.DATE_CREATE)<='" . intval($val) * 86400 . "'"; break; case "TITLE": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.TITLE", $val, $match); break; case "MESSAGES1": $arSqlSearch[] = "T.MESSAGES>='" . intval($val) . "'"; break; case "MESSAGES2": $arSqlSearch[] = "T.MESSAGES<='" . intval($val) . "'"; break; case "PROBLEM_TIME1": $arSqlSearch[] = "T.PROBLEM_TIME>='" . intval($val) . "'"; break; case "PROBLEM_TIME2": $arSqlSearch[] = "T.PROBLEM_TIME<='" . intval($val) . "'"; break; case "OVERDUE_MESSAGES1": $arSqlSearch[] = "T.OVERDUE_MESSAGES>='" . intval($val) . "'"; break; case "OVERDUE_MESSAGES2": $arSqlSearch[] = "T.OVERDUE_MESSAGES<='" . intval($val) . "'"; break; case "AUTO_CLOSE_DAYS_LEFT1": $arSqlSearch[] = "CASE WHEN (UNIX_TIMESTAMP(T.DATE_CLOSE) IS NULL OR UNIX_TIMESTAMP(T.DATE_CLOSE) = 0) AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y' THEN\n\t\t\t\t\t\t\tTO_DAYS(ADDDATE(T.LAST_MESSAGE_DATE, INTERVAL T.AUTO_CLOSE_DAYS DAY)) - TO_DAYS(now()) ELSE -1 END >='" . intval($val) . "'"; break; case "AUTO_CLOSE_DAYS_LEFT2": $arSqlSearch[] = "CASE WHEN (UNIX_TIMESTAMP(T.DATE_CLOSE) IS NULL OR UNIX_TIMESTAMP(T.DATE_CLOSE) = 0) AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y' THEN\n\t\t\t\t\t\t\tTO_DAYS(ADDDATE(T.LAST_MESSAGE_DATE, INTERVAL T.AUTO_CLOSE_DAYS DAY))-TO_DAYS(now()) ELSE 999 END <='" . intval($val) . "'"; break; case "OWNER": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("UO.ID, UO.LOGIN, UO.LAST_NAME, UO.NAME", $val, $match, array("@", ".")); //T.OWNER_USER_ID, break; case "OWNER_USER_ID": case "OWNER_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T." . $key, $val, $match); break; case "SLA_ID": case "SLA": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T.SLA_ID", $val, $match); break; case "CREATED_BY": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.CREATED_USER_ID, UC.LOGIN, UC.LAST_NAME, UC.NAME, T.CREATED_MODULE_NAME", $val, $match); break; case "RESPONSIBLE": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.RESPONSIBLE_USER_ID, UR.LOGIN, UR.LAST_NAME, UR.NAME", $val, $match); break; case "RESPONSIBLE_ID": if (intval($val) > 0) { $arSqlSearch[] = "T.RESPONSIBLE_USER_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.RESPONSIBLE_USER_ID is null or T.RESPONSIBLE_USER_ID=0)"; } break; case "CATEGORY_ID": case "CATEGORY": if (intval($val) > 0) { $arSqlSearch[] = "T.CATEGORY_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.CATEGORY_ID is null or T.CATEGORY_ID=0)"; } break; case "CATEGORY_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DC.SID", $val, $match); $d_join = "\n\t\t\tLEFT JOIN b_ticket_dictionary DC ON (DC.ID = T.CATEGORY_ID and DC.C_TYPE = 'C')"; break; case "CRITICALITY_ID": case "CRITICALITY": if (intval($val) > 0) { $arSqlSearch[] = "T.CRITICALITY_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.CRITICALITY_ID is null or T.CRITICALITY_ID=0)"; } break; case "CRITICALITY_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DK.SID", $val, $match); break; case "STATUS_ID": case "STATUS": if (intval($val) > 0) { $arSqlSearch[] = "T.STATUS_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.STATUS_ID is null or T.STATUS_ID=0)"; } break; case "STATUS_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DS.SID", $val, $match); break; case "MARK_ID": case "MARK": if (intval($val) > 0) { $arSqlSearch[] = "T.MARK_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.MARK_ID is null or T.MARK_ID=0)"; } break; case "MARK_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DM.SID", $val, $match); break; case "SOURCE_ID": case "SOURCE": if (intval($val) > 0) { $arSqlSearch[] = "T.SOURCE_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.SOURCE_ID is null or T.SOURCE_ID=0)"; } break; case "SOURCE_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DSR.SID", $val, $match); break; case "DIFFICULTY_ID": case "DIFFICULTY": if (intval($val) > 0) { $arSqlSearch[] = "T.DIFFICULTY_ID = '" . intval($val) . "'"; } elseif ($val == 0) { $arSqlSearch[] = "(T.DIFFICULTY_ID is null or T.DIFFICULTY_ID=0)"; } break; case "DIFFICULTY_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("DD.SID", $val, $match); break; case "MODIFIED_BY": $getUserName = "******"; $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.MODIFIED_USER_ID, T.MODIFIED_MODULE_NAME, UM.LOGIN, UM.LAST_NAME, UM.NAME", $val, $match); break; case "MESSAGE": global $strError; if (strlen($val) <= 0) { break; } if (CSupportSearch::CheckModule() && CSupportSearch::isIndexExists()) { // new indexed search $searchSqlParams = CSupportSearch::getSql($val); $searchOn = $searchSqlParams['WHERE']; $searchHaving = $searchSqlParams['HAVING']; if ($searchOn) { $searchJoin = 'INNER JOIN b_ticket_search TS ON TS.TICKET_ID = T.ID AND ' . $searchOn; if (!empty($searchHaving)) { // 2 or more search words $arSqlHaving[] = $searchHaving; $need_group = true; } } } else { if ($bSupportTeam == "Y" || $bAdmin == "Y" || $bDemo == "Y") { $messJoin = "INNER JOIN b_ticket_message M ON (M.TICKET_ID=T.ID)"; } else { $messJoin = "INNER JOIN b_ticket_message M ON (M.TICKET_ID=T.ID and M.IS_HIDDEN='N' and M.IS_LOG='N')"; } $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $f = new CFilterQuery("OR", "yes", $match, array(), "N", "Y", "N"); $query = $f->GetQueryString("T.TITLE,M.MESSAGE_SEARCH", $val); $error = $f->error; if (strlen(trim($error)) > 0) { $strError .= $error . "<br>"; $query = "0"; } else { $arSqlSearch[] = $query; } } break; case "LAST_MESSAGE_USER_ID": case "LAST_MESSAGE_SID": $match = $arFilter[$key . "_EXACT_MATCH"] == "N" && $matchValueSet ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T." . $key, $val, $match); break; case "LAST_MESSAGE_BY_SUPPORT_TEAM": $arSqlSearch[] = "T.LAST_MESSAGE_BY_SUPPORT_TEAM= '" . ($val == 'Y' ? 'Y' : 'N') . "'"; break; case "SUPPORT_COMMENTS": $match = $arFilter[$key . "_EXACT_MATCH"] == "Y" && $matchValueSet ? "N" : "Y"; $arSqlSearch[] = GetFilterQuery("T.SUPPORT_COMMENTS", $val, $match); break; case "IS_SPAM": $arSqlSearch[] = $val == "Y" ? "T.IS_SPAM ='Y'" : "(T.IS_SPAM = 'N' or T.IS_SPAM is null)"; break; case "IS_OVERDUE": $arSqlSearch[] = $val == "Y" ? "T.IS_OVERDUE ='Y'" : "(T.IS_OVERDUE = 'N' or T.IS_OVERDUE is null)"; break; case "IS_SPAM_MAYBE": $arSqlSearch[] = $val == "Y" ? "T.IS_SPAM='N'" : "(T.IS_SPAM='Y' or T.IS_SPAM is null)"; break; case 'SUPPORTTEAM_GROUP_ID': case 'CLIENT_GROUP_ID': if ($key == 'SUPPORTTEAM_GROUP_ID') { $table = 'UGS'; $bJoinSupportTeamTbl = true; } else { $table = 'UGC'; $bJoinClientTbl = true; } if (is_array($val)) { $val = array_map('intval', $val); $val = array_unique($val); $val = array_filter($val); if (count($val) > 0) { $arSqlSearch[] = '(' . $table . '.GROUP_ID IS NOT NULL AND ' . $table . '.GROUP_ID IN (' . implode(',', $val) . '))'; } } else { $val = intval($val); if ($val > 0) { $arSqlSearch[] = '(' . $table . '.GROUP_ID IS NOT NULL AND ' . $table . '.GROUP_ID=\'' . $val . '\')'; } } break; case 'COUPON': $match = $matchValueSet && $arFilter[$key . "_EXACT_MATCH"] != "Y" ? "Y" : "N"; $arSqlSearch[] = GetFilterQuery("T." . $key, $val, $match); break; } } } $obUserFieldsSql = new CUserTypeSQL(); $obUserFieldsSql->SetEntity("SUPPORT", "T.ID"); $obUserFieldsSql->SetSelect($arParams["SELECT"]); $obUserFieldsSql->SetFilter($arFilter); $obUserFieldsSql->SetOrder(array($by => $order)); if ($by == "s_id") { $strSqlOrder = "ORDER BY T.ID"; } elseif ($by == "s_last_message_date") { $strSqlOrder = "ORDER BY T.LAST_MESSAGE_DATE"; } elseif ($by == "s_site_id" || $by == "s_lid") { $strSqlOrder = "ORDER BY T.SITE_ID"; } elseif ($by == "s_lamp") { $strSqlOrder = "ORDER BY LAMP"; } elseif ($by == "s_is_overdue") { $strSqlOrder = "ORDER BY T.IS_OVERDUE"; } elseif ($by == "s_is_notified") { $strSqlOrder = "ORDER BY T.IS_NOTIFIED"; } elseif ($by == "s_date_create") { $strSqlOrder = "ORDER BY T.DATE_CREATE"; } elseif ($by == "s_timestamp" || $by == "s_timestamp_x") { $strSqlOrder = "ORDER BY T.TIMESTAMP_X"; } elseif ($by == "s_date_close") { $strSqlOrder = "ORDER BY T.DATE_CLOSE"; } elseif ($by == "s_owner") { $strSqlOrder = "ORDER BY T.OWNER_USER_ID"; } elseif ($by == "s_modified_by") { $strSqlOrder = "ORDER BY T.MODIFIED_USER_ID"; } elseif ($by == "s_title") { $strSqlOrder = "ORDER BY T.TITLE "; } elseif ($by == "s_responsible") { $strSqlOrder = "ORDER BY T.RESPONSIBLE_USER_ID"; } elseif ($by == "s_messages") { $strSqlOrder = "ORDER BY T.MESSAGES"; } elseif ($by == "s_category") { $strSqlOrder = "ORDER BY T.CATEGORY_ID"; } elseif ($by == "s_criticality") { $strSqlOrder = "ORDER BY T.CRITICALITY_ID"; } elseif ($by == "s_sla") { $strSqlOrder = "ORDER BY T.SLA_ID"; } elseif ($by == "s_status") { $strSqlOrder = "ORDER BY T.STATUS_ID"; } elseif ($by == "s_difficulty") { $strSqlOrder = "ORDER BY T.DIFFICULTY_ID"; } elseif ($by == "s_problem_time") { $strSqlOrder = "ORDER BY T.PROBLEM_TIME"; } elseif ($by == "s_mark") { $strSqlOrder = "ORDER BY T.MARK_ID"; } elseif ($by == "s_online") { $strSqlOrder = "ORDER BY USERS_ONLINE"; } elseif ($by == "s_support_comments") { $strSqlOrder = "ORDER BY T.SUPPORT_COMMENTS"; } elseif ($by == "s_auto_close_days_left") { $strSqlOrder = "ORDER BY AUTO_CLOSE_DAYS_LEFT"; } elseif ($by == 's_coupon') { $strSqlOrder = 'ORDER BY T.COUPON'; } elseif ($by == 's_deadline') { $strSqlOrder = 'ORDER BY T.SUPPORT_DEADLINE'; } elseif ($s = $obUserFieldsSql->GetOrder($by)) { $strSqlOrder = "ORDER BY " . strtoupper($s); } else { $by = "s_default"; $strSqlOrder = "ORDER BY IS_SUPER_TICKET DESC, T.IS_OVERDUE DESC, T.IS_NOTIFIED DESC, T.LAST_MESSAGE_DATE"; } if ($order != "asc") { $strSqlOrder .= " desc "; $order = "desc"; } $arSqlSearch[] = $obUserFieldsSql->GetFilter(); if ($getUserName == "Y") { $u_select = "\n\t\t\t\t,\n\t\t\t\tUO.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tOWNER_LOGIN,\n\t\t\t\tUO.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tOWNER_EMAIL,\n\t\t\t\tconcat(ifnull(UO.NAME,''),' ',ifnull(UO.LAST_NAME,''))\t\tOWNER_NAME,\n\t\t\t\tUR.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tRESPONSIBLE_LOGIN,\n\t\t\t\tUR.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tRESPONSIBLE_EMAIL,\n\t\t\t\tconcat(ifnull(UR.NAME,''),' ',ifnull(UR.LAST_NAME,''))\t\tRESPONSIBLE_NAME,\n\t\t\t\tUM.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_BY_LOGIN,\n\t\t\t\tUM.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_BY_EMAIL,\n\t\t\t\tconcat(ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,''))\t\tMODIFIED_BY_NAME,\n\t\t\t\tUM.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_LOGIN,\n\t\t\t\tUM.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tMODIFIED_EMAIL,\n\t\t\t\tconcat(ifnull(UM.NAME,''),' ',ifnull(UM.LAST_NAME,''))\t\tMODIFIED_NAME,\n\t\t\t\tUL.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tLAST_MESSAGE_LOGIN,\n\t\t\t\tUL.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tLAST_MESSAGE_EMAIL,\n\t\t\t\tconcat(ifnull(UL.NAME,''),' ',ifnull(UL.LAST_NAME,''))\t\tLAST_MESSAGE_NAME,\n\t\t\t\tUC.LOGIN\t\t\t\t\t\t\t\t\t\t\t\t\tCREATED_LOGIN,\n\t\t\t\tUC.EMAIL\t\t\t\t\t\t\t\t\t\t\t\t\tCREATED_EMAIL,\n\t\t\t\tconcat(ifnull(UC.NAME,''),' ',ifnull(UC.LAST_NAME,''))\t\tCREATED_NAME\n\t\t\t"; $u_join = "\n\t\t\tLEFT JOIN b_user UO ON (UO.ID = T.OWNER_USER_ID)\n\t\t\tLEFT JOIN b_user UR ON (UR.ID = T.RESPONSIBLE_USER_ID)\n\t\t\tLEFT JOIN b_user UM ON (UM.ID = T.MODIFIED_USER_ID)\n\t\t\tLEFT JOIN b_user UL ON (UL.ID = T.LAST_MESSAGE_USER_ID)\n\t\t\tLEFT JOIN b_user UC ON (UC.ID = T.CREATED_USER_ID)\n\t\t\t"; } if ($getExtraNames == "Y") { $d_select = "\n\t\t\t\t,\n\t\t\t\tDC.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\tCATEGORY_NAME,\n\t\t\t\tDC.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tCATEGORY_DESC,\n\t\t\t\tDC.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tCATEGORY_SID,\n\t\t\t\tDK.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\tCRITICALITY_NAME,\n\t\t\t\tDK.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tCRITICALITY_DESC,\n\t\t\t\tDK.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tCRITICALITY_SID,\n\t\t\t\tDS.NAME\t\t\t\t\t\t\t\t\t\t\t\t\t\tSTATUS_NAME,\n\t\t\t\tDS.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tSTATUS_DESC,\n\t\t\t\tDS.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tSTATUS_SID,\n\t\t\t\tDM.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tMARK_NAME,\n\t\t\t\tDM.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tMARK_DESC,\n\t\t\t\tDM.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tMARK_SID,\n\t\t\t\tDSR.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tSOURCE_NAME,\n\t\t\t\tDSR.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tSOURCE_DESC,\n\t\t\t\tDSR.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tSOURCE_SID,\n\t\t\t\tDD.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tDIFFICULTY_NAME,\n\t\t\t\tDD.DESCR\t\t\t\t\t\t\t\t\t\t\t\t\tDIFFICULTY_DESC,\n\t\t\t\tDD.SID\t\t\t\t\t\t\t\t\t\t\t\t\t\tDIFFICULTY_SID,\n\t\t\t\tSLA.NAME\t\t\t\t\t\t\t\t\t\t\t\t\tSLA_NAME\n\t\t\t"; $d_join = "\n\t\t\tLEFT JOIN b_ticket_dictionary DC ON (DC.ID = T.CATEGORY_ID and DC.C_TYPE = 'C')\n\t\t\tLEFT JOIN b_ticket_dictionary DK ON (DK.ID = T.CRITICALITY_ID and DK.C_TYPE = 'K')\n\t\t\tLEFT JOIN b_ticket_dictionary DS ON (DS.ID = T.STATUS_ID and DS.C_TYPE = 'S')\n\t\t\tLEFT JOIN b_ticket_dictionary DM ON (DM.ID = T.MARK_ID and DM.C_TYPE = 'M')\n\t\t\tLEFT JOIN b_ticket_dictionary DSR ON (DSR.ID = T.SOURCE_ID and DSR.C_TYPE = 'SR')\n\t\t\tLEFT JOIN b_ticket_dictionary DD ON (DD.ID = T.DIFFICULTY_ID and DD.C_TYPE = 'D')\n\t\t\tLEFT JOIN b_ticket_sla SLA ON (SLA.ID = T.SLA_ID)\n\t\t\t"; } if (strlen($siteID) > 0) { $dates_select = "\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "FULL", $siteID, true) . "\tDATE_CREATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "FULL", $siteID, true) . "\tTIMESTAMP_X,\n\t\t\t\t" . $DB->DateToCharFunction("T.LAST_MESSAGE_DATE", "FULL", $siteID, true) . "\tLAST_MESSAGE_DATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "FULL", $siteID, true) . "\tDATE_CLOSE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "SHORT", $siteID, true) . "\tDATE_CREATE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "SHORT", $siteID, true) . "\tTIMESTAMP_X_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "SHORT", $siteID, true) . "\tDATE_CLOSE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.SUPPORT_DEADLINE", "FULL", $siteID, true) . "\tSUPPORT_DEADLINE,\n\t\t\t\tCASE WHEN (UNIX_TIMESTAMP(T.DATE_CLOSE) IS NULL OR UNIX_TIMESTAMP(T.DATE_CLOSE) = 0) AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y' THEN " . $DB->DateToCharFunction("ADDDATE(T.LAST_MESSAGE_DATE, INTERVAL T.AUTO_CLOSE_DAYS DAY)", "FULL", $siteID, true) . " ELSE NULL END AUTO_CLOSE_DATE\n\t\t\t"; } else { $dates_select = "\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "FULL") . "\t\tDATE_CREATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "FULL") . "\t\tTIMESTAMP_X,\n\t\t\t\t" . $DB->DateToCharFunction("T.LAST_MESSAGE_DATE", "FULL") . "\tLAST_MESSAGE_DATE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "FULL") . "\t\tDATE_CLOSE,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CREATE", "SHORT") . "\tDATE_CREATE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.TIMESTAMP_X", "SHORT") . "\tTIMESTAMP_X_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.DATE_CLOSE", "SHORT") . "\t\tDATE_CLOSE_SHORT,\n\t\t\t\t" . $DB->DateToCharFunction("T.SUPPORT_DEADLINE", "FULL") . "\tSUPPORT_DEADLINE,\n\t\t\t\tCASE WHEN (UNIX_TIMESTAMP(T.DATE_CLOSE) IS NULL OR UNIX_TIMESTAMP(T.DATE_CLOSE) = 0) AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y' THEN " . $DB->DateToCharFunction("ADDDATE(T.LAST_MESSAGE_DATE, INTERVAL T.AUTO_CLOSE_DAYS DAY)", "FULL") . " ELSE NULL END AUTO_CLOSE_DATE\n\t\t\t"; } $ugroupJoin = ''; if ($bJoinSupportTeamTbl) { $ugroupJoin .= "\n\t\t\tLEFT JOIN b_ticket_user_ugroup UGS ON (UGS.USER_ID = T.RESPONSIBLE_USER_ID) "; $need_group = true; } if ($bJoinClientTbl) { $ugroupJoin .= "\n\t\t\tLEFT JOIN b_ticket_user_ugroup UGC ON (UGC.USER_ID = T.OWNER_USER_ID) "; $need_group = true; } // add permissions check if (!($bAdmin == 'Y' || $bDemo == 'Y')) { // a list of users who own or are responsible for tickets, which we can show to our current user $ticketUsers = array($uid); // check if user has groups $result = $DB->Query('SELECT GROUP_ID FROM b_ticket_user_ugroup WHERE USER_ID = ' . $uid . ' AND CAN_VIEW_GROUP_MESSAGES = \'Y\''); if ($result) { // collect members of these groups $uGroups = array(); while ($row = $result->Fetch()) { $uGroups[] = $row['GROUP_ID']; } if (!empty($uGroups)) { $result = $DB->Query('SELECT USER_ID FROM b_ticket_user_ugroup WHERE GROUP_ID IN (' . join(',', $uGroups) . ')'); if ($result) { while ($row = $result->Fetch()) { $ticketUsers[] = $row['USER_ID']; } } } } // build sql $strSqlSearchUser = ""; if ($bSupportTeam == 'Y') { $strSqlSearchUser = '******' . join(',', $ticketUsers) . ')'; } elseif ($bSupportClient == 'Y') { $strSqlSearchUser = '******' . join(',', $ticketUsers) . ')'; } $arSqlSearch[] = $strSqlSearchUser; } $strSqlSearch = GetFilterSqlSearch($arSqlSearch); $onlineInterval = intval(COption::GetOptionString("support", "ONLINE_INTERVAL")); $strSqlSelect = "\n\t\t\tSELECT\n\t\t\t\tT.*,\n\t\t\t\tT.SITE_ID,\n\t\t\t\tT.SITE_ID\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLID,\n\t\t\t\t{$dates_select},\n\t\t\t\tUNIX_TIMESTAMP(T.DATE_CLOSE)-UNIX_TIMESTAMP(T.DATE_CREATE)\t\t\t\t\t\t\tTICKET_TIME,\n\t\t\t\tCASE WHEN (UNIX_TIMESTAMP(T.DATE_CLOSE) IS NULL OR UNIX_TIMESTAMP(T.DATE_CLOSE) = 0) AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y' THEN\n\t\t\t\t\tTO_DAYS(\n\t\t\t\t\t\tADDDATE(\n\t\t\t\t\t\t\tT.LAST_MESSAGE_DATE, INTERVAL T.AUTO_CLOSE_DAYS DAY\n\t\t\t\t\t\t)\n\t\t\t\t\t) - TO_DAYS(now())\n\t\t\t\tELSE -1 END AUTO_CLOSE_DAYS_LEFT,\n\t\t\t\t(SELECT COUNT(DISTINCT USER_ID) FROM b_ticket_online WHERE TICKET_ID = T.ID AND TIMESTAMP_X >= DATE_ADD(now(), INTERVAL - " . $onlineInterval . " SECOND)) USERS_ONLINE,\n\t\t\t\tif(T.COUPON IS NOT NULL, 1, 0)\t\t\t\t\t\t\t\t\t\t\t\t\t\tIS_SUPER_TICKET,\n\t\t\t\t{$lamp}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tLAMP\n\t\t\t\t{$d_select}\n\t\t\t\t{$u_select}\n\t\t\t\t" . $obUserFieldsSql->GetSelect(); $strSqlFrom = "\n\t\t\tFROM\n\t\t\t\tb_ticket T\n\t\t\t{$u_join}\n\t\t\t{$d_join}\n\t\t\t{$messJoin}\n\t\t\t{$searchJoin}\n\t\t\t{$ugroupJoin}\n\t\t\t\t" . $obUserFieldsSql->GetJoin("T.ID"); $strSqlWhere = "\n\t\t\tWHERE\n\t\t\t{$strSqlSearch}\n\t\t"; $strSqlGroup = $need_group ? ' GROUP BY T.ID ' : ''; $strSqlHaving = $arSqlHaving ? ' HAVING ' . join(' AND ', $arSqlHaving) . ' ' : ''; $strSql = $strSqlSelect . $strSqlFrom . $strSqlWhere . $strSqlGroup . $strSqlHaving . $strSqlOrder; if (is_array($arParams) && isset($arParams["NAV_PARAMS"]) && is_array($arParams["NAV_PARAMS"])) { $nTopCount = isset($arParams['NAV_PARAMS']['nTopCount']) ? intval($arParams['NAV_PARAMS']['nTopCount']) : 0; if ($nTopCount > 0) { $strSql = $DB->TopSql($strSql, $nTopCount); $res = $DB->Query($strSql, false, $err_mess . __LINE__); $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("SUPPORT")); } else { $cntSql = "SELECT COUNT(T.ID) as C " . $strSqlFrom . $strSqlWhere . $strSqlGroup . $strSqlHaving; if (!empty($strSqlGroup)) { $cntSql = 'SELECT COUNT(1) AS C FROM (' . $cntSql . ') tt'; } $res_cnt = $DB->Query($cntSql); $res_cnt = $res_cnt->Fetch(); $res = new CDBResult(); $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("SUPPORT")); $res->NavQuery($strSql, $res_cnt["C"], $arParams["NAV_PARAMS"]); } } else { $res = $DB->Query($strSql, false, $err_mess . __LINE__); $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("SUPPORT")); } $isFiltered = IsFiltered($strSqlSearch); return $res; }