IncludeModuleLangFile(__FILE__);
global $SUPPORT_CACHE_USER_ROLES;
$SUPPORT_CACHE_USER_ROLES = Array();
class CAllTicket
{
const ADD = "ADD";
const UPDATE = "UPDATE";
const DELETE = "DELETE";
const IGNORE = "IGNORE";
const REOPEN = "REOPEN";
const NEW_SLA = "NEW_SLA";
public static function err_mess()
{
$module_id = "support";
@include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module_id."/install/version.php");
return "
Module: ".$module_id."
Class: CAllTicket
File: ".__FILE__;
}
/***************************************************************
Группа функций по работе с ролями на модуль
Идентификаторы ролей:
D - доступ закрыт
R - клиент техподдержки
T - сотрудник техподдержки
V - демо-доступ
W - администратор техподдержки
*****************************************************************/
public static function GetDeniedRoleID()
{
return "D";
}
public static function GetSupportClientRoleID()
{
return "R";
}
public static function GetSupportTeamRoleID()
{
return "T";
}
public static function GetDemoRoleID()
{
return "V";
}
public static function GetAdminRoleID()
{
return "W";
}
// возвращает true если заданный пользователь имеет заданную роль на модуль
public static function HaveRole($role, $userID=false)
{
global $DB, $USER, $APPLICATION, $SUPPORT_CACHE_USER_ROLES;
if (!is_object($USER)) $USER = new CUser;
if ($userID===false && is_object($USER))
$uid = $USER->GetID();
else
$uid = $userID;
$arRoles = Array();
if (array_key_exists($uid, $SUPPORT_CACHE_USER_ROLES) && is_array($SUPPORT_CACHE_USER_ROLES[$uid]))
{
$arRoles = $SUPPORT_CACHE_USER_ROLES[$uid];
}
else
{
$arrGroups = Array();
if ($userID===false && is_object($USER))
$arrGroups = $USER->GetUserGroupArray();
else
$arrGroups = CUser::GetUserGroup($userID);
sort($arrGroups);
$arRoles = $APPLICATION->GetUserRoles("support", $arrGroups);
$SUPPORT_CACHE_USER_ROLES[$uid] = $arRoles;
}
if (in_array($role, $arRoles))
return true;
return false;
}
// true - если пользователь имеет роль "администратор техподдержки"
// false - в противном случае
public static function IsAdmin($userID=false)
{
global $USER;
if ($userID===false && is_object($USER))
{
if ($USER->IsAdmin()) return true;
}
return CTicket::HaveRole(CTicket::GetAdminRoleID(), $userID);
}
// true - если пользователь имеет роль "демо-доступ"
// false - в противном случае
public static function IsDemo($userID=false)
{
return CTicket::HaveRole(CTicket::GetDemoRoleID(), $userID);
}
// true - если пользователь имеет роль "сотрудник техподдержки"
// false - в противном случае
public static function IsSupportTeam($userID=false)
{
return CTicket::HaveRole(CTicket::GetSupportTeamRoleID(), $userID);
}
// true - если пользователь имеет роль "сотрудник техподдержки"
// false - в противном случае
public static function IsSupportClient($userID=false)
{
return CTicket::HaveRole(CTicket::GetSupportClientRoleID(), $userID);
}
public static function IsOwner($ticketID, $userID=false)
{
$err_mess = (CAllTicket::err_mess())."
Function: IsOwner
Line: ";
global $DB, $USER;
if ($userID===false && is_object($USER)) $userID = $USER->GetID();
$userID = intval($userID);
$ticketID = intval($ticketID);
if ($userID<=0 || $ticketID<=0) return false;
$strSql = "SELECT 'x' FROM b_ticket WHERE ID=$ticketID and (OWNER_USER_ID=$userID or CREATED_USER_ID=$userID)";
$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
if ($ar = $rs->Fetch()) return true;
return false;
}
// возвращает роли заданного пользователя
public static function GetRoles(&$isDemo, &$isSupportClient, &$isSupportTeam, &$isAdmin, &$isAccess, &$userID, $checkRights=true)
{
global $DB, $USER, $APPLICATION;
static $arTicketUserRoles;
$isDemo = $isSupportClient = $isSupportTeam = $isAdmin = $isAccess = false;
if (is_object($USER)) $userID = intval($USER->GetID()); else $userID = 0;
if ($checkRights)
{
if ($userID>0)
{
if (is_array($arTicketUserRoles) && in_array($userID, array_keys($arTicketUserRoles)))
{
$isDemo = $arTicketUserRoles[$userID]["isDemo"];
$isSupportClient = $arTicketUserRoles[$userID]["isSupportClient"];
$isSupportTeam = $arTicketUserRoles[$userID]["isSupportTeam"];
$isAdmin = $arTicketUserRoles[$userID]["isAdmin"];
}
else
{
$isDemo = CTicket::IsDemo($userID);
$isSupportClient = CTicket::IsSupportClient($userID);
$isSupportTeam = CTicket::IsSupportTeam($userID);
$isAdmin = CTicket::IsAdmin($userID);
$arTicketUserRoles[$userID] = array(
"isDemo" => $isDemo,
"isSupportClient" => $isSupportClient,
"isSupportTeam" => $isSupportTeam,
"isAdmin" => $isAdmin,
);
}
}
}
else $isAdmin = true;
if ($isDemo || $isSupportClient || $isSupportTeam || $isAdmin) $isAccess = true;
}
// возвращает массив ID групп для которых задана роль
// $role - идентификатор роли
public static function GetGroupsByRole($role)
{
//Todo: определиться с доступом по умолчанию
global $APPLICATION, $USER;
if (!is_object($USER)) $USER = new CUser;
$arGroups = array(); $arBadGroups = Array();
$res = $APPLICATION->GetGroupRightList(Array("MODULE_ID" => "support"/*, "G_ACCESS" => $role*/));
while($ar = $res->Fetch())
{
if ($ar["G_ACCESS"] == $role)
$arGroups[] = $ar["GROUP_ID"];
else
$arBadGroups[] = $ar["GROUP_ID"];
}
$right = COption::GetOptionString("support", "GROUP_DEFAULT_RIGHT", "D");
if ($right == $role)
{
$res = CGroup::GetList("dropdown", "asc", array("ACTIVE" => "Y"));
while ($ar = $res->Fetch())
{
if (!in_array($ar["ID"],$arGroups) && !in_array($ar["ID"],$arBadGroups))
$arGroups[] = $ar["ID"];
}
}
return $arGroups;
/*$arGroups = array();
$z = CGroup::GetList($v1="dropdown", $v2="asc", array("ACTIVE" => "Y"));
while($zr = $z->Fetch())
{
$arRoles = $APPLICATION->GetUserRoles("support", array(intval($zr["ID"])), "Y", "N");
if (in_array($role, $arRoles)) $arGroups[] = intval($zr["ID"]);
}
return array_unique($arGroups);*/
}
// возвращает массив групп с ролью "администратор техподдержки"
public static function GetAdminGroups()
{
return CTicket::GetGroupsByRole(CTicket::GetAdminRoleID());
}
// возвращает массив групп с ролью "сотрудник техподдержки"
public static function GetSupportTeamGroups()
{
return CTicket::GetGroupsByRole(CTicket::GetSupportTeamRoleID());
}
// возвращает массив EMail адресов всех пользователей имеющих заданную роль
public static function GetEmailsByRole($role)
{
global $DB, $APPLICATION, $USER;
if (!is_object($USER)) $USER = new CUser;
$arEmail = array();
$arGroups = CTicket::GetGroupsByRole($role);
if (is_array($arGroups) && count($arGroups)>0)
{
$rsUser = CUser::GetList("id", "desc", array("ACTIVE" => "Y", "GROUPS_ID" => $arGroups));
while ($arUser = $rsUser->Fetch()) $arEmail[$arUser["EMAIL"]] = $arUser["EMAIL"];
}
return array_unique($arEmail);
}
// возвращает массив EMail'ов всех пользователей имеющих роль "администратор"
public static function GetAdminEmails()
{
return CTicket::GetEmailsByRole(CTicket::GetAdminRoleID());
}
// возвращает массив EMail'ов всех пользователей имеющих роль "сотрудник техподдержки"
public static function GetSupportTeamEmails()
{
return CTicket::GetEmailsByRole(CTicket::GetSupportTeamRoleID());
}
public static function GetSupportTeamAndAdminUsers()
{
$arUser = array();
$stg = CTicket::GetGroupsByRole(CTicket::GetSupportTeamRoleID());
$sag = CTicket::GetGroupsByRole(CTicket::GetAdminRoleID());
$sg = array();
if(is_array($stg))
{
$sg = array_merge($sg, $stg);
}
if(is_array($sag))
{
$sg = array_merge($sg, $sag);
}
if(count($sg) > 0)
{
$cU = CUser::GetList("id", "asc", array("ACTIVE" => "Y", "GROUPS_ID" => $sg));
while($arU = $cU->Fetch())
{
$arUser[] = intval($arU["ID"]);
}
}
//if(count($arUser) <= 0)
//{
$arUser[] = 1;
//}
return array_unique($arUser);
}
/*****************************************************************
Группа функций общие для всех классов
*****************************************************************/
// проверка полей фильтра
public static function CheckFilter($arFilter)
{
$err_mess = (CAllTicket::err_mess())."
Function: CheckFilter
Line: ";
global $DB, $USER, $APPLICATION;
$str = "";
$arMsg = Array();
$arDATES = array(
"DATE_MODIFY_1",
"DATE_MODIFY_2",
"DATE_CREATE_1",
"DATE_CREATE_2",
);
foreach($arDATES as $key)
{
if (is_set($arFilter, $key) && $arFilter[$key] <> '' && !CheckDateTime($arFilter[$key]))
$arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_REQUIRED_".$key));
//$str.= GetMessage("SUP_ERROR_INCORRECT_".$key)."
";
}
if(!empty($arMsg))
{
$e = new CAdminException($arMsg);
$GLOBALS["APPLICATION"]->ThrowException($e);
return false;
}
return true;
}
// проверка полей перед вставкой в базу данных
public static function CheckFields($arFields, $id, $arRequired)
{
global $DB, $USER, $APPLICATION, $MESS;
$arMsg = Array();
// проверяем указанные обязательные поля
if (is_array($arRequired) && count($arRequired)>0)
{
foreach($arRequired as $key)
{
if ($id<=0 || ($id>0 && is_set($arFields, $key)))
{
if (!is_array($arFields[$key]) && ((string)$arFields[$key] == '' || $arFields[$key]==="NOT_REF"))
{
$arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_REQUIRED_".$key));
//$str.= GetMessage("SUP_ERROR_REQUIRED_".$key)."
";
}
}
}
}
// проверяем корректность дат
$arDate = array(
"DATE_CREATE",
"DATE_MODIFY",
"LAST_MESSAGE_DATE",
);
foreach($arDate as $key)
{
if ($arFields[$key] <> '')
{
if (!CheckDateTime($arFields[$key]))
$arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_INCORRECT_".$key));
//$str.= GetMessage("SUP_ERROR_INCORRECT_".$key)."
";
}
}
$arEmail = array(
"EMAIL",
);
foreach($arEmail as $key)
{
if ($arFields[$key] <> '')
{
if (!check_email($arFields[$key]))
$arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_INCORRECT_".$key));
//$str.= GetMessage("SUP_ERROR_INCORRECT_".$key)."
";
}
}
if(!empty($arMsg))
{
$e = new CAdminException($arMsg);
$GLOBALS["APPLICATION"]->ThrowException($e);
return false;
}
return true;
}
// предварительно обрабатывает массив значений для вставки в базу данных
public static function PrepareFields($arFields, $table, $id)
{
global $DB, $USER, $APPLICATION;
$id = intval($id);
$arFields_i = array();
// числа
$arrNUMBER = array(
"SLA_ID",
"AGENT_ID",
"CATEGORY_ID",
"CRITICALITY_ID",
"STATUS_ID",
"MARK_ID",
"SOURCE_ID",
"DIFFICULTY_ID",
"DICTIONARY_ID",
"TICKET_ID",
"MESSAGE_ID",
"AUTO_CLOSE_DAYS",
"MESSAGES",
"OVERDUE_MESSAGES",
"EXTERNAL_ID",
"OWNER_USER_ID",
"OWNER_GUEST_ID",
"CREATED_USER_ID",
"CREATED_GUEST_ID",
"MODIFIED_USER_ID",
"MODIFIED_GUEST_ID",
"RESPONSIBLE_USER_ID",
"LAST_MESSAGE_USER_ID",
"LAST_MESSAGE_GUEST_ID",
"CURRENT_RESPONSIBLE_USER_ID",
"USER_ID",
"C_NUMBER",
"C_SORT",
"PRIORITY",
"RESPONSE_TIME",
"NOTICE_TIME",
"WEEKDAY_NUMBER",
"MINUTE_FROM",
"MINUTE_TILL",
"TIMETABLE_ID"
);
foreach($arrNUMBER as $key)
if (is_set($arFields, $key))
$arFields_i[$key] = ((string) $arFields[$key] <> '') ? intval($arFields[$key]) : "null";
// тип текста
$arrTYPE = array(
"PREVIEW_TYPE",
"DESCRIPTION_TYPE",
);
foreach($arrTYPE as $key)
if (is_set($arFields, $key))
$arFields_i[$key] = $arFields[$key]=="text" ? "'text'" : "'html'";
// булевые
$arrBOOLEAN = array(
"AUTO_CLOSED",
"IS_SPAM",
"LAST_MESSAGE_BY_SUPPORT_TEAM",
"IS_HIDDEN",
"IS_LOG",
"IS_OVERDUE",
"IS_SPAM",
"MESSAGE_BY_SUPPORT_TEAM",
"SET_AS_DEFAULT",
"AUTO_CLOSED",
"HOLD_ON",
"NOT_CHANGE_STATUS",
);
foreach($arrBOOLEAN as $key)
if (is_set($arFields, $key))
$arFields_i[$key] = $arFields[$key]=="Y" ? "'Y'" : "'N'";
// текст
$arrTEXT = array(
"OWNER_SID",
"LAST_MESSAGE_SID",
"SUPPORT_COMMENTS",
"MESSAGE",
"MESSAGE_SEARCH",
"EXTERNAL_FIELD_1",
"DESCR",
"DESCRIPTION",
);
foreach($arrTEXT as $key)
if (is_set($arFields, $key))
$arFields_i[$key] = ($arFields[$key] <> '') ? "'".$DB->ForSql($arFields[$key])."'" : "null";
// строка
$arrSTRING = array(
"NAME",
"TITLE",
"CREATED_MODULE_NAME",
"MODIFIED_MODULE_NAME",
"HASH",
"EXTENSION_SUFFIX",
"C_TYPE",
"SID",
"EVENT1",
"EVENT2",
"EVENT3",
"RESPONSE_TIME_UNIT",
"NOTICE_TIME_UNIT",
"OPEN_TIME",
"DEADLINE_SOURCE"
);
foreach($arrSTRING as $key)
if (is_set($arFields, $key))
$arFields_i[$key] = ($arFields[$key] <> '') ? "'".$DB->ForSql($arFields[$key], 255)."'" : "null";
// даты
$arDate = array(
"TIMESTAMP_X",
"DATE_CLOSE",
"LAST_MESSAGE_DATE",
);
foreach($arDate as $key)
if (is_set($arFields, $key))
$arFields_i[$key] = ($arFields[$key] <> '') ? $DB->CharToDateFunction($arFields[$key]) : "null";
/* изображения
$arIMAGE = array();
foreach($arIMAGE as $key)
{
if (is_set($arFields, $key))
{
if (is_array($arFields[$key]))
{
$arIMAGE = $arFields[$key];
$arIMAGE["MODULE_ID"] = "support";
$arIMAGE["del"] = $_POST[$key."_del"];
if ($id>0)
{
$rs = $DB->Query("SELECT $key FROM $table WHERE ID=$id", false, $err_mess.__LINE__);
$ar = $rs->Fetch();
$arIMAGE["old_file"] = $ar[$key];
}
if (strlen($arIMAGE["name"])>0 || strlen($arIMAGE["del"])>0)
{
$fid = CFile::SaveFile($arIMAGE, "support");
$arFields_i[$key] = (intval($fid)>0) ? intval($fid) : "null";
}
}
else
{
if ($id>0)
{
$rs = $DB->Query("SELECT $key FROM $table WHERE ID=$id", false, $err_mess.__LINE__);
$ar = $rs->Fetch();
if (intval($ar[$key])>0) CFile::Delete($ar[$key]);
}
$arFields_i[$key] = intval($arFields[$key]);
}
}
}*/
if (is_set($arFields, "CREATED_USER_ID"))
{
if (intval($arFields["CREATED_USER_ID"])>0) $arFields_i["CREATED_USER_ID"] = intval($arFields["CREATED_USER_ID"]);
}
elseif($id<=0 && $USER->IsAuthorized()) $arFields_i["CREATED_USER_ID"] = intval($USER->GetID());
if (is_set($arFields, "CREATED_GUEST_ID"))
{
if (intval($arFields["CREATED_GUEST_ID"])>0) $arFields_i["CREATED_GUEST_ID"] = intval($arFields["CREATED_GUEST_ID"]);
}
elseif($id<=0 && array_key_exists('SESS_GUEST_ID', $_SESSION)) $arFields_i["CREATED_GUEST_ID"] = intval($_SESSION["SESS_GUEST_ID"]);
if (is_set($arFields, "MODIFIED_USER_ID"))
{
if (intval($arFields["MODIFIED_USER_ID"])>0) $arFields_i["MODIFIED_USER_ID"] = intval($arFields["MODIFIED_USER_ID"]);
}
elseif ($USER->IsAuthorized()) $arFields_i["MODIFIED_USER_ID"] = intval($USER->GetID());
if (is_set($arFields, "MODIFIED_GUEST_ID"))
{
if (intval($arFields["MODIFIED_GUEST_ID"])>0) $arFields_i["MODIFIED_GUEST_ID"] = intval($arFields["MODIFIED_GUEST_ID"]);
}
elseif (array_key_exists('SESS_GUEST_ID', $_SESSION)) $arFields_i["MODIFIED_GUEST_ID"] = intval($_SESSION["SESS_GUEST_ID"]);
if (is_set($arFields, "DATE_CREATE"))
{
if ($arFields["DATE_CREATE"] <> '') $arFields_i["DATE_CREATE"] = $DB->CharToDateFunction($arFields["DATE_CREATE"]);
}
elseif ($id<=0) $arFields_i["DATE_CREATE"] = $DB->CurrentTimeFunction();
if (is_set($arFields, "LAST_MESSAGE_DATE"))
{
if ($arFields["LAST_MESSAGE_DATE"] <> '') $arFields_i["LAST_MESSAGE_DATE"] = $DB->CharToDateFunction($arFields["LAST_MESSAGE_DATE"]);
}
elseif ($id<=0) $arFields_i["LAST_MESSAGE_DATE"] = $DB->CurrentTimeFunction();
if (is_set($arFields, "DATE_MODIFY"))
{
if ($arFields["DATE_MODIFY"] <> '') $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]);
}
else $arFields_i["DATE_MODIFY"] = $DB->CurrentTimeFunction();
// убираем лишние поля для указанной таблицы
unset($arFields_i["ID"]);
$ar1 = $DB->GetTableFieldsList($table);
$ar2 = array_keys($arFields_i);
$arDiff = array_diff($ar2, $ar1);
if (is_array($arDiff) && count($arDiff)>0) foreach($arDiff as $value) unset($arFields_i[$value]);
return $arFields_i;
}
public static function SplitTicket($arParam)
{
global $DB;
$err_mess = (CAllTicket::err_mess())."
Function: SplitTicket
Line: ";
$intLastTicketID = intval($arParam['SOURCE_TICKET_ID']);
$arTicket = CTicket::GetByID($intLastTicketID, $lang = LANG, $checkRights="N", $get_user_name="N", $get_extra_names="N")->Fetch();
$arSite = CSite::GetById($arTicket['SITE_ID'])->Fetch();
$stLastTicketTitle = htmlspecialcharsEx($arParam['SOURCE_TICKET_TITLE']);
$intSplitMesageID = intval($arParam['SOURCE_MESSAGE_NUM']);
$stSplitMesageDate = MakeTimeStamp($arParam['SOURCE_MESSAGE_DATE'], "DD.MM.YYYY HH:MI:SS") ? $arParam['SOURCE_MESSAGE_DATE'] : '';
\Bitrix\Main\Localization\Loc::loadLanguageFile($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/support/admin/ticket_edit.php', $arSite['LANGUAGE_ID']);
// add to the previous post about ticket allocation of posts in a separate branch
$arFields = array(
"MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
"MESSAGE_CREATED_MODULE_NAME" => "support",
"MESSAGE_CREATED_GUEST_ID" => "null",
"MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
"MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_USER_1", array("#MESSAGE_DATE#" => $stSplitMesageDate, "#TITLE#" => '# '.$arParam['SPLIT_TICKET_ID'].' "'.$arParam['SPLIT_TICKET_TITLE'].'"'), $arSite['LANGUAGE_ID']),
"LOG" => "N",
"HIDDEN" => "N",
"NOT_CHANGE_STATUS" => "Y",
"MESSAGE_AUTHOR_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
);
CTicket::AddMessage($intLastTicketID, $arFields, $arFiles=Array(), "N");
// add to the previous post about ticket allocation of posts in a separate branch (support log)
$arFields_log = array(
"MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
"MESSAGE_CREATED_MODULE_NAME" => "support",
"MESSAGE_CREATED_GUEST_ID" => "null",
"MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
"MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_LOG_1", array("#MESSAGE_ID#" => $intSplitMesageID, "#TITLE#" => ' # '.$arParam['SPLIT_TICKET_ID'].' "'.$arParam['SPLIT_TICKET_TITLE'].'"'), $arSite['LANGUAGE_ID']),
"LOG" => "Y",
);
CTicket::AddMessage($intLastTicketID, $arFields_log, $arFiles_log=Array(), "N");
// add a new ticket allocation message posted in a separate branch
$arFields = array(
"MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
"MESSAGE_CREATED_MODULE_NAME" => "support",
"MESSAGE_CREATED_GUEST_ID" => "null",
"MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
"MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_USER_2", array("#MESSAGE_DATE#" => $stSplitMesageDate, "#TITLE#" => '# '.$intLastTicketID.' "'.$stLastTicketTitle.'"'), $arSite['LANGUAGE_ID']),
"LOG" => "N",
"HIDDEN" => "N",
"NOT_CHANGE_STATUS" => "Y",
"MESSAGE_AUTHOR_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
);
CTicket::AddMessage($arParam['SPLIT_TICKET_ID'], $arFields, $arFiles=Array(), "N");
// add a new ticket allocation message posted in a separate branch (support log)
$arFields_log = array(
"MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
"MESSAGE_CREATED_MODULE_NAME" => "support",
"MESSAGE_CREATED_GUEST_ID" => "null",
"MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
"MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_LOG_2", array("#MESSAGE_ID#" => $intSplitMesageID, "#TITLE#" => ' # '.$intLastTicketID.' "'.$stLastTicketTitle.'"'), $arSite['LANGUAGE']),
"LOG" => "Y",
);
CTicket::AddMessage($arParam['SPLIT_TICKET_ID'], $arFields_log, $arFiles_log=Array(), "N");
// If the message that we want to separate, there are attached files, copy them
if (isset($arParam['SPLIT_ATTACH_FILE']))
{
$res = CTicket::GetMessageList('ID', 'ASC', array('TICKET_ID'=>$arParam['SPLIT_TICKET_ID']));
$MESSAGE = $res->Fetch();
foreach($arParam['SPLIT_ATTACH_FILE'] as $key => $iAttachFile)
{
$fid = CFile::CopyFile(intval($iAttachFile));
if ($fid>0)
{
$arFields_fi = array(
"HASH" => "'".$DB->ForSql(md5(uniqid(mt_rand(), true).time()), 255)."'",
"MESSAGE_ID" => $MESSAGE['ID'],
"FILE_ID" => $fid,
"TICKET_ID" => $arParam['SPLIT_TICKET_ID'],
"EXTENSION_SUFFIX" => "null"
);
$DB->Insert("b_ticket_message_2_file",$arFields_fi, $err_mess.__LINE__);
}
}
}
}
/*****************************************************************
Группа функций по работе со спамом
*****************************************************************/
public static function MarkMessageAsSpam($messageID, $exactly="Y", $checkRights="Y")
{
$err_mess = (CAllTicket::err_mess())."
Function: MarkMessageAsSpam
Line: ";
global $DB, $USER;
$messageID = intval($messageID);
if ($messageID<=0) return;
$bAdmin = "N";
$bSupportTeam = "N";
if ($checkRights=="Y")
{
$bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
$bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
}
else
{
$bAdmin = "Y";
$bSupportTeam = "Y";
}
if (($bAdmin=="Y" || $bSupportTeam=="Y") && CModule::IncludeModule("mail"))
{
$exactly = ($exactly=="Y" && $bAdmin=="Y") ? "Y" : "N";
if ($rsMessage = CTicket::GetMessageByID($messageID, $checkRights))
{
if ($arMessage = $rsMessage->Fetch())
{
if ($arMessage["IS_LOG"]!="Y")
{
$email_id = intval($arMessage["EXTERNAL_ID"]);
$header = $arMessage["EXTERNAL_FIELD_1"];
$arFields = array("IS_SPAM" => "'".$exactly."'");
$DB->Update("b_ticket_message",$arFields,"WHERE ID=".$messageID,$err_mess.__LINE__);
$exactly = ($exactly=="Y") ? true : false;
$rsEmail = CMailMessage::GetByID($email_id);
if ($rsEmail->Fetch())
{
CMailMessage::MarkAsSpam($email_id, $exactly);
}
else
{
CmailFilter::MarkAsSpam($header." \n\r ".$arMessage["MESSAGE"], $exactly);
}
}
}
}
}
}
public static function UnMarkMessageAsSpam($messageID, $checkRights="Y")
{
$err_mess = (CAllTicket::err_mess())."
Function: UnMarkMessageAsSpam
Line: ";
global $DB, $USER;
$messageID = intval($messageID);
if ($messageID<=0) return;
$bAdmin = "N";
$bSupportTeam = "N";
if ($checkRights=="Y")
{
$bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
$bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
}
else
{
$bAdmin = "Y";
$bSupportTeam = "Y";
}
if (($bAdmin=="Y" || $bSupportTeam=="Y") && CModule::IncludeModule("mail"))
{
$rsMessage = CTicket::GetMessageByID($messageID, $checkRights);
if ($arMessage = $rsMessage->Fetch())
{
$arFields = array("IS_SPAM" => "null");
$DB->Update("b_ticket_message", $arFields, "WHERE ID=".$messageID, $err_mess.__LINE__);
$email_id = intval($arMessage["EXTERNAL_ID"]);
$header = $arMessage["EXTERNAL_FIELD_1"];
$rsEmail = CMailMessage::GetByID($email_id);
if ($rsEmail->Fetch())
{
CMailMessage::MarkAsSpam($email_id, false);
}
else
{
CmailFilter::DeleteFromSpamBase($header." \n\r ".$arMessage["MESSAGE"], true);
CmailFilter::MarkAsSpam($header." \n\r ".$arMessage["MESSAGE"], false);
}
}
}
}
public static function MarkAsSpam($ticketID, $exactly="Y", $checkRights="Y")
{
$err_mess = (CAllTicket::err_mess())."
Function: MarkAsSpam
Line: ";
global $DB, $USER;
$ticketID = intval($ticketID);
if ($ticketID<=0) return;
$bAdmin = "N";
$bSupportTeam = "N";
if ($checkRights=="Y")
{
$bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
$bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
}
else
{
$bAdmin = "Y";
$bSupportTeam = "Y";
}
if ($bAdmin=="Y" || $bSupportTeam=="Y")
{
$exactly = ($exactly=="Y" && $bAdmin=="Y") ? "Y" : "N";
$arFilter = array("TICKET_ID" => $ticketID, "TICKET_ID_EXACT_MATCH" => "Y", "IS_LOG" => "N");
if ($rsMessages = CTicket::GetMessageList('', '', $arFilter, null, $checkRights))
{
// помечаем исходное сообщение
if ($arMessage = $rsMessages->Fetch())
{
CTicket::MarkMessageAsSpam($arMessage["ID"], $exactly, $checkRights);
}
}
$arFields = array("IS_SPAM" => "'".$exactly."'");
$DB->Update("b_ticket",$arFields,"WHERE ID=".$ticketID,$err_mess.__LINE__);
}
}
public static function UnMarkAsSpam($ticketID, $checkRights="Y")
{
$err_mess = (CAllTicket::err_mess())."
Function: UnMarkAsSpam
Line: ";
global $DB, $USER;
$ticketID = intval($ticketID);
if ($ticketID<=0) return;
if ($checkRights=="Y")
{
$bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
$bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
}
else
{
$bAdmin = "Y";
$bSupportTeam = "Y";
}
if ($bAdmin=="Y" || $bSupportTeam=="Y")
{
$arFilter = array("TICKET_ID" => $ticketID, "TICKET_ID_EXACT_MATCH" => "Y");
if ($rsMessages = CTicket::GetMessageList('', '', $arFilter, null, $checkRights))
{
// снимаем отметку о спаме только у первого сообщения
if ($arMessage = $rsMessages->Fetch())
{
CTicket::UnMarkMessageAsSpam($arMessage["ID"], $checkRights);
}
}
$arFields = array("IS_SPAM" => "null");
$DB->Update("b_ticket",$arFields,"WHERE ID=".$ticketID,$err_mess.__LINE__);
}
}
/*****************************************************************
Группа функций по управлению обращениями
*****************************************************************/
/*function UpdateLastParams($ticketID, $resetAutoClose=false, $changeLastMessageDate = true, $setReopenDefault = true)
{
$err_mess = (CAllTicket::err_mess())."
Function: UpdateLastParams
Line: ";
global $DB, $USER;
$ticketID = intval($ticketID);
if ($ticketID<=0) return;
$arFields = array();
//if ($resetAutoClose=="Y") $arFields["AUTO_CLOSE_DAYS"] = "null";
// определим последнего автора
$strSql = "
SELECT
ID,
".$DB->DateToCharFunction("DATE_CREATE","FULL")." DATE_CREATE,
OWNER_USER_ID,
OWNER_GUEST_ID,
OWNER_SID
FROM
b_ticket_message
WHERE
TICKET_ID=$ticketID
AND(NOT(NOT_CHANGE_STATUS='Y'))
AND(NOT(IS_HIDDEN='Y'))
AND(NOT(IS_LOG='Y'))
AND(NOT(IS_OVERDUE='Y'))
ORDER BY
C_NUMBER desc
";
$rs = $DB->Query($strSql,false,$err_mess.__LINE__);
if ($arLastMess = $rs->Fetch())
{
$arFields["LAST_MESSAGE_USER_ID"] = $arLastMess["OWNER_USER_ID"];
if ($changeLastMessageDate)
{
$arFields["LAST_MESSAGE_DATE"] = $DB->CharToDateFunction($arLastMess["DATE_CREATE"]);//NN
}
$arFields["LAST_MESSAGE_GUEST_ID"] = intval($arLastMess["OWNER_GUEST_ID"]);
$arFields["LAST_MESSAGE_SID"] = "'".$DB->ForSql($arLastMess["OWNER_SID"],255)."'";
}
// определим количество сообщений
$strSql = "
SELECT
SUM(CASE WHEN IS_HIDDEN='Y' THEN 0 ELSE 1 END) MESSAGES,
SUM(TASK_TIME) ALL_TIME
FROM
b_ticket_message
WHERE
TICKET_ID = $ticketID
and (IS_LOG='N' or IS_LOG is null or ".$DB->Length("IS_LOG")."<=0)
and (IS_OVERDUE='N' or IS_OVERDUE is null or ".$DB->Length("IS_OVERDUE")."<=0)
";
$z = $DB->Query($strSql, false, $err_mess.__LINE__);
$zr = $z->Fetch();
$arFields["MESSAGES"] = intval($zr["MESSAGES"]);
$arFields["PROBLEM_TIME"] = intval($zr["ALL_TIME"]);
if ($setReopenDefault)
$arFields["REOPEN"] = "'N'";
/*
AUTO_CLOSE_DAYS
LAST_MESSAGE_DATE
LAST_MESSAGE_USER_ID
LAST_MESSAGE_GUEST_ID
LAST_MESSAGE_SID
MESSAGES
REOPEN
PROBLEM_TIME
*//*
$DB->Update("b_ticket",$arFields,"WHERE ID='".$ticketID."'",$err_mess.__LINE__);
}
//$dateType = CTicket::ADD, CTicket::DELETE, CTicket::CURRENT_DATE
function UpdateLastParams2($ticketID, $dateType)
{
global $DB;
$strUsers = implode(",", CTicket::GetSupportTeamAndAdminUsers());
$err_mess = (CAllTicket::err_mess())."
Function: UpdateLastParams2
Line: ";
$arFields=array();
$arFields["D_1_USER_M_AFTER_SUP_M"] = "null";
$arFields["ID_1_USER_M_AFTER_SUP_M"] = "null";
$arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] = "'Y'";
$arFields["SUPPORT_DEADLINE_NOTIFY"] = "null";
$arFields["SUPPORT_DEADLINE"] = "null";
$arFields["IS_OVERDUE"] = "'N'";
$arFields["IS_NOTIFIED"] = "'N'";
// Get last support response
$M_ID = 0;
$strSql = "
SELECT
T.ID ID,
MAX(TM.ID) M_ID
FROM
b_ticket T
INNER JOIN b_ticket_message TM
ON T.ID = TM.TICKET_ID
AND T.ID = $ticketID
AND TM.OWNER_USER_ID IN($strUsers)
AND (NOT(TM.IS_LOG='Y'))
AND (NOT(TM.IS_HIDDEN='Y'))
AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
GROUP BY
T.ID";
$rs = $DB->Query($strSql, false, $err_mess . __LINE__);
if($arrRs = $rs->Fetch())
{
if(intval($arrRs["M_ID"]) > 0)
{
$M_ID = intval($arrRs["M_ID"]);
}
}
// Get first user request after last support response
$strSql = "
SELECT
T.SLA_ID,
T.DATE_CLOSE,
" . $DB->DateToCharFunction("T.DEADLINE_SOURCE_DATE", "FULL") . " DEADLINE_SOURCE_DATE,
" . $DB->DateToCharFunction("T.D_1_USER_M_AFTER_SUP_M", "FULL") . " DATE_OLD,
T.IS_OVERDUE,
SLA.RESPONSE_TIME_UNIT,
SLA.RESPONSE_TIME,
SLA.NOTICE_TIME_UNIT,
SLA.NOTICE_TIME,
PZ2.M_ID,
PZ2.D_1_USER_M_AFTER_SUP_M
FROM
b_ticket T
INNER JOIN b_ticket_sla SLA
ON T.SLA_ID = SLA.ID
AND T.ID = $ticketID
LEFT JOIN (SELECT
TM.ID M_ID,
TM.TICKET_ID,
" . $DB->DateToCharFunction("TM.DATE_CREATE", "FULL") . " D_1_USER_M_AFTER_SUP_M
FROM
b_ticket_message TM
INNER JOIN (SELECT
T.ID ID,
MIN(TM.ID) M_ID
FROM
b_ticket T
INNER JOIN b_ticket_message TM
ON T.ID = TM.TICKET_ID
AND T.ID = $ticketID
AND TM.ID > $M_ID
AND (NOT(TM.IS_LOG='Y'))
AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
AND (NOT(TM.IS_HIDDEN='Y'))
GROUP BY
T.ID) PZ
ON TM.ID = PZ.M_ID) PZ2
ON T.ID = PZ2.TICKET_ID
";
//AND (NOT(TM.IS_HIDDEN='Y'))
$rs = $DB->Query($strSql, false, $err_mess . __LINE__);
if(!($arrRs = $rs->Fetch()))
{
return;
}
$isOverdue = false;
if(intval($arrRs["M_ID"]) > 0)
{
$arFields["D_1_USER_M_AFTER_SUP_M"] = $DB->CharToDateFunction($arrRs["D_1_USER_M_AFTER_SUP_M"]);
$arFields["ID_1_USER_M_AFTER_SUP_M"] = intval($arrRs["M_ID"]);
$arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] = "'N'";
if($arrRs["IS_OVERDUE"] == "Y" && !(isset($dateType["EVENT"]) && in_array(CTicket::REOPEN, $dateType["EVENT"])))
{
unset($arFields["SUPPORT_DEADLINE_NOTIFY"]);
unset($arFields["SUPPORT_DEADLINE"]);
unset($arFields["IS_OVERDUE"]);
unset($arFields["IS_NOTIFIED"]);
$isOverdue = true;
}
}
if( !$isOverdue && intval($arrRs["DATE_CLOSE"]) <= 0 && $arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] == "'N'")
{
$arrRs["ID"] = $ticketID;
CTicketReminder::RecalculateSupportDeadlineForOneTicket($arrRs, $arFields, $dateType);
}
else
{
if(isset($dateType["EVENT"]) && is_array($dateType["EVENT"]) && in_array(CTicket::REOPEN, $dateType["EVENT"]))
{
$arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime(time() + CTimeZone::GetOffset(),"FULL"));
}
$DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'", $err_mess . __LINE__);
}
}*/
public static function UpdateLastParamsN($ticketID, $dateType, $recalculateSupportDeadline = true, $setReopenDefault = true)
{
$err_mess = (CAllTicket::err_mess())."
Function: UpdateLastParamsN
Line: ";
global $DB, $USER;
$ticketID = intval($ticketID);
if ($ticketID<=0) return;
$arSupportTeam = CTicket::GetSupportTeamAndAdminUsers();
$arFields = array(
"LAST_MESSAGE_DATE" => "null",
"LAST_MESSAGE_USER_ID" => "null",
"LAST_MESSAGE_GUEST_ID" => "null",
"LAST_MESSAGE_SID" => "null",
"D_1_USER_M_AFTER_SUP_M" => "null",
"ID_1_USER_M_AFTER_SUP_M" => "null",
"LAST_MESSAGE_BY_SUPPORT_TEAM" => "'Y'",
);
if ($setReopenDefault)
{
$arFields["REOPEN"] = "'N'";
}
$DB->StartUsingMasterOnly();
$strSql = "
SELECT
T.ID,
T.SLA_ID,
T.DATE_CLOSE,
" . $DB->DateToCharFunction("T.DEADLINE_SOURCE_DATE", "FULL") . " DEADLINE_SOURCE_DATE,
" . $DB->DateToCharFunction("T.D_1_USER_M_AFTER_SUP_M", "FULL") . " DATE_OLD,
T.IS_OVERDUE,
SLA.RESPONSE_TIME_UNIT,
SLA.RESPONSE_TIME,
SLA.NOTICE_TIME_UNIT,
SLA.NOTICE_TIME
FROM
b_ticket T
INNER JOIN b_ticket_sla SLA
ON T.SLA_ID = SLA.ID
AND T.ID = $ticketID
";
$rs = $DB->Query($strSql, false, $err_mess . __LINE__);
$arTicket = $rs->Fetch();
if(!$arTicket)
{
$DB->StopUsingMasterOnly();
return;
}
$arMessagesAll = array();
$arLastMess = null;
$arFirstUserMessAfterSupportMess = null;
$allTime = 0;
$messages = 0;
$messAfterSupportMess = true;
$strSql = "
SELECT
ID,
".$DB->DateToCharFunction("DATE_CREATE","FULL")." DATE_CREATE,
OWNER_USER_ID,
OWNER_GUEST_ID,
OWNER_SID,
TASK_TIME,
IS_OVERDUE,
IS_HIDDEN,
NOT_CHANGE_STATUS
FROM
b_ticket_message
WHERE
TICKET_ID=$ticketID
AND(NOT(IS_LOG='Y'))
ORDER BY
C_NUMBER
";
//NOT_CHANGE_STATUS
//IS_HIDDEN
//IS_OVERDUE
$rs = $DB->Query($strSql,false,$err_mess.__LINE__);
$DB->StopUsingMasterOnly();
while($arM = $rs->Fetch())
{
$arMessagesAll[] = $arM;
if($arM["IS_OVERDUE"] !== 'Y')
{
if($arM["IS_HIDDEN"] !== 'Y')
{
if($arM["NOT_CHANGE_STATUS"] !== 'Y')
{
$arLastMess = $arM;
}
$messages++;
}
$allTime += intval($arM["TASK_TIME"]);
}
if($arM["IS_HIDDEN"] !== 'Y' && $arM["NOT_CHANGE_STATUS"] !== 'Y')
{
if(in_array(intval($arM["OWNER_USER_ID"]), $arSupportTeam))
{
$arFirstUserMessAfterSupportMess = null;
$messAfterSupportMess = true;
}
elseif($messAfterSupportMess)
{
$arFirstUserMessAfterSupportMess = $arM;
$messAfterSupportMess = false;
}
}
}
if($arLastMess !== null)
{
$arFields["LAST_MESSAGE_USER_ID"] = $arLastMess["OWNER_USER_ID"];
//if ($changeLastMessageDate)
//{
$arFields["LAST_MESSAGE_DATE"] = $DB->CharToDateFunction($arLastMess["DATE_CREATE"]);
//}
$arFields["LAST_MESSAGE_GUEST_ID"] = intval($arLastMess["OWNER_GUEST_ID"]);
$arFields["LAST_MESSAGE_SID"] = "'" . $DB->ForSql($arLastMess["OWNER_SID"], 255) . "'";
}
$arFields["MESSAGES"] = $messages;
$arFields["PROBLEM_TIME"] = $allTime;
if($arFirstUserMessAfterSupportMess !== null)
{
$arFields["D_1_USER_M_AFTER_SUP_M"] = $DB->CharToDateFunction($arFirstUserMessAfterSupportMess["DATE_CREATE"]);
$arFields["ID_1_USER_M_AFTER_SUP_M"] = intval($arFirstUserMessAfterSupportMess["ID"]);
$arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] = "'N'";
}
if(is_array($dateType["EVENT"]) && in_array(CTicket::REOPEN, $dateType["EVENT"]))
{
$arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime(time() + CTimeZone::GetOffset(),"FULL"));
}
elseif($arTicket["IS_OVERDUE"] == "Y")
{
$recalculateSupportDeadline = false;
}
$recalculateSupportDeadline = $recalculateSupportDeadline && (intval($arTicket["DATE_CLOSE"]) <= 0) && ($arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] == "'N'");
if(!$recalculateSupportDeadline)
{
if ($arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] == "'Y'" || intval($arTicket["DATE_CLOSE"]) > 0)
{
$arFields["SUPPORT_DEADLINE_NOTIFY"] = "null";
$arFields["SUPPORT_DEADLINE"] = "null";
$arFields["IS_OVERDUE"] = "'N'";
$arFields["IS_NOTIFIED"] = "'N'";
}
}
$DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'", $err_mess . __LINE__);
if($recalculateSupportDeadline)
{
$arTicket["M_ID"] = $arFirstUserMessAfterSupportMess["ID"];
$arTicket["D_1_USER_M_AFTER_SUP_M"] = $arFirstUserMessAfterSupportMess["DATE_CREATE"];
CTicketReminder::RecalculateSupportDeadlineForOneTicket($arTicket, $arFields, $dateType);
}
/*
LAST_MESSAGE_DATE
LAST_MESSAGE_USER_ID
LAST_MESSAGE_GUEST_ID
LAST_MESSAGE_SID
MESSAGES
REOPEN
PROBLEM_TIME
D_1_USER_M_AFTER_SUP_M
ID_1_USER_M_AFTER_SUP_M
LAST_MESSAGE_BY_SUPPORT_TEAM
DEADLINE_SOURCE_DATE
SUPPORT_DEADLINE_NOTIFY
SUPPORT_DEADLINE
IS_OVERDUE
IS_NOTIFIED
*/
}
public static function UpdateMessages($ticketID)
{
$err_mess = (CAllTicket::err_mess())."
Function: UpdateMessages
Line: ";
global $DB;
$ticketID = intval($ticketID);
if ($ticketID<=0) return;
$arFields = array();
// определим количество сообщений
$strSql = "
SELECT
SUM(CASE WHEN IS_HIDDEN='Y' THEN 0 ELSE 1 END) MESSAGES,
SUM(TASK_TIME) ALL_TIME
FROM
b_ticket_message
WHERE
TICKET_ID = $ticketID
and (IS_LOG='N' or IS_LOG is null or ".$DB->Length("IS_LOG")."<=0)
and (IS_OVERDUE='N' or IS_OVERDUE is null or ".$DB->Length("IS_OVERDUE")."<=0)
";
$z = $DB->Query($strSql, false, $err_mess.__LINE__);
$zr = $z->Fetch();
$arFields["MESSAGES"] = intval($zr["MESSAGES"]);
$arFields["PROBLEM_TIME"] = intval($zr["ALL_TIME"]);
$DB->Update("b_ticket",$arFields,"WHERE ID='".$ticketID."'",$err_mess.__LINE__);
}
public static function GetFileList($by = 's_id', $order = 'asc', $arFilter = [], $checkRights = 'N')
{
$err_mess = (CAllTicket::err_mess())."
Function: GetFileList
Line: ";
global $DB, $USER;
$arSqlSearch = Array();
$strSqlSearch = "";
if (is_array($arFilter))
{
$filter_keys = array_keys($arFilter);
$filterKeysCount = count($filter_keys);
for ($i=0; $i<$filterKeysCount; $i++)
{
$key = $filter_keys[$i];
$val = $arFilter[$filter_keys[$i]];
if ((is_array($val) && count($val)<=0) || (!is_array($val) && ((string) $val == '' || $val==='NOT_REF')))
continue;
$match_value_set = (in_array($key."_EXACT_MATCH", $filter_keys)) ? true : false;
$key = strtoupper($key);
switch($key)
{
case "LINK_ID":
$match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
$arSqlSearch[] = GetFilterQuery("MF.ID",$val,$match);
break;
case "MESSAGE":
case "TICKET_ID":
case "FILE_ID":
case "HASH":
case "MESSAGE_ID":
$match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
$arSqlSearch[] = GetFilterQuery("MF.".$key,$val,$match);
break;
}
}
}
if ($by == "s_id") $strSqlOrder = "ORDER BY MF.ID";
elseif ($by == "s_file_id") $strSqlOrder = "ORDER BY F.ID";
elseif ($by == "s_message_id") $strSqlOrder = "ORDER BY MF.MESSAGE_ID";
else
{
$strSqlOrder = "ORDER BY MF.ID";
}
if ($order=="desc")
{
$strSqlOrder .= " desc ";
}
else
{
$strSqlOrder .= " asc ";
}
$messageJoin = '';
$ticketJoin = '';
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());
if ($bAdmin!='Y' && $bSupportTeam!='Y' && $bSupportClient!='Y' && $bDemo!='Y') return false;
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 = 'T.RESPONSIBLE_USER_ID IN ('.join(',', $ticketUsers).')';
}
elseif ($bSupportClient == 'Y')
{
$strSqlSearchUser = 'T.OWNER_USER_ID IN ('.join(',', $ticketUsers).')';
}
if ($strSqlSearchUser)
{
$ticketJoin = 'INNER JOIN b_ticket T ON (T.ID = MF.TICKET_ID)';
$arSqlSearch[] = $strSqlSearchUser;
}
}
if ($bSupportTeam!="Y" && $bAdmin!="Y" && $bDemo!='Y')
{
$messageJoin = 'INNER JOIN b_ticket_message M ON (M.ID = MF.MESSAGE_ID)';
$arSqlSearch[] = "M.IS_HIDDEN='N'";
$arSqlSearch[] = "M.IS_LOG='N'";
}
}
$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
$strSql = "
SELECT
F.*, ".$DB->DateToCharFunction("F.TIMESTAMP_X")." as TIMESTAMP_X,
MF.ID as LINK_ID,
MF.HASH,
MF.MESSAGE_ID,
MF.TICKET_ID,
MF.EXTENSION_SUFFIX
FROM
b_ticket_message_2_file MF
INNER JOIN b_file F ON (MF.FILE_ID = F.ID)
$ticketJoin
$messageJoin
WHERE
$strSqlSearch
$strSqlOrder
";
$res = $DB->Query($strSql, false, $err_mess.__LINE__);
return $res;
}
public static function GetMessageByID($id, $checkRights="Y", $get_user_name="Y")
{
return CTicket::GetMessageList('', '', array("ID" => $id, "ID_EXACT_MATCH" => "Y"), null, $checkRights, $get_user_name);
}
public static function GetByID($id, $lang=LANG, $checkRights="Y", $get_user_name="Y", $get_extra_names="Y", $arParams = Array())
{
return CTicket::GetList('', '', array("ID" => $id, "ID_EXACT_MATCH" => "Y"), null, $checkRights, $get_user_name, $get_extra_names, $lang, $arParams);
}
public static function getMaxId()
{
global $DB;
$id = null;
$result = $DB->Query("SELECT MAX(ID) as MAX_ID FROM b_ticket");
if ($result)
{
$row = $result->Fetch();
$id = $row['MAX_ID'];
}
return $id;
}
public static function Delete($ticketID, $checkRights="Y")
{
$err_mess = (CAllTicket::err_mess())."
Function: Delete
Line: ";
global $DB, $USER;
$ticketID = intval($ticketID);
if ($ticketID<=0) return;
$bAdmin = "N";
if ($checkRights=="Y")
{
$bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
}
else
{
$bAdmin = "Y";
}
if ($bAdmin=="Y")
{
if (CTicket::ExecuteEvents('OnBeforeTicketDelete', $ticketID, false) === false)
return false;
CTicket::ExecuteEvents('OnTicketDelete', $ticketID, false);
$strSql = "
SELECT
F.ID
FROM
b_ticket_message_2_file MF,
b_file F
WHERE
MF.TICKET_ID = '$ticketID'
and F.ID=MF.FILE_ID
";
$z = $DB->Query($strSql, false, $err_mess.__LINE__);
while ($zr = $z->Fetch()) CFile::Delete($zr["ID"]);
//CTicketReminder::Delete($ticketID);
$DB->Query("DELETE FROM b_ticket_message_2_file WHERE TICKET_ID='$ticketID'", false, $err_mess.__LINE__);
$DB->Query("DELETE FROM b_ticket_message WHERE TICKET_ID='$ticketID'", false, $err_mess.__LINE__);
$GLOBALS["USER_FIELD_MANAGER"]->Delete("SUPPORT", $ticketID);
$DB->Query("DELETE FROM b_ticket WHERE ID='$ticketID'", false, $err_mess.__LINE__);
if (CSupportSearch::isIndexExists())
{
CSupportSearch::reindexTicket($ticketID);
}
}
}
public static function UpdateOnline($ticketID, $userID=false, $currentMode="")
{
$err_mess = (CAllTicket::err_mess())."
Function: UpdateOnline
Line: ";
global $DB, $USER;
if ($userID===false && is_object($USER)) $userID = $USER->GetID();
$ticketID = intval($ticketID);
$userID = intval($userID);
if ($ticketID<=0 || $userID<=0) return;
$arFields = array(
"TIMESTAMP_X" => $DB->GetNowFunction(),
"TICKET_ID" => $ticketID,
"USER_ID" => $userID,
);
if ($currentMode!==false)
{
$arFields["CURRENT_MODE"] = $currentMode <> '' ? "'".$DB->ForSQL($currentMode, 20)."'" : "null";
}
$rows = $DB->Update("b_ticket_online", $arFields, "WHERE TICKET_ID=$ticketID and USER_ID=$userID", $err_mess.__LINE__);
if (intval($rows)<=0)
{
$DB->Insert("b_ticket_online",$arFields, $err_mess.__LINE__);
}
}
public static function SetTicket($arFields, $ticketID="", $checkRights="Y", $sendEmailToAuthor="Y", $sendEmailToTechsupport="Y")
{
//global $DB;
//$DB->DebugToFile = true;
$messageID = null;
$x = CTicket::Set($arFields, $messageID, $ticketID, $checkRights, $sendEmailToAuthor, $sendEmailToTechsupport);
//$DB->DebugToFile = false;
return $x;
}
/*****************************************************************
SET
*****************************************************************/
public static function addSupportText($cn)
{
if($cn > 0 && (CTicket::IsSupportTeam($cn) || CTicket::IsAdmin($cn))) return " " . GetMessage("SUP_TECHSUPPORT_HINT");
return "";
}
public static function EmailsFromStringToArray($emails, $res = null)
{
if(!is_array($res)) $res = array();
$arEmails = explode(",", $emails);
if(is_array($arEmails) && count($arEmails) > 0)
{
foreach($arEmails as $email)
{
$email = trim($email);
if($email <> '')
{
preg_match_all("#[<\[\(](.*?)[>\]\)]#i".BX_UTF_PCRE_MODIFIER, $email, $arr);
if(is_array($arr[1]) && count($arr[1]) > 0)
{
foreach($arr[1] as $email)
{
$email = trim($email);
if($email <> '' && !in_array($email, $res) && check_email($email))
{
$res[] = $email;
}
}
}
elseif(!in_array($email, $res) && check_email($email))
{
$res[] = $email;
}
}
}
}
TrimArr($res);
return $res;
}
public static function GetCSupportTableFields($name, $arrOrTable = CSupportTableFields::C_Array)
{
$n = CSupportTableFields::VT_NUMBER;
$s = CSupportTableFields::VT_STRING;
$yn = CSupportTableFields::VT_Y_N;
$ynn = CSupportTableFields::VT_Y_N_NULL;
$d = CSupportTableFields::VT_DATE;
$dt = CSupportTableFields::VT_DATE_TIME;
$tables = array(
"b_ticket" => array(
"ID" => array("TYPE" => $n, "DEF_VAL" => 0, "AUTO_CALCULATED" => true),
"SITE_ID" => array("TYPE" => $s, "DEF_VAL" => "", "MAX_STR_LEN" => 2),
"DATE_CREATE" => array("TYPE" => $dt, "DEF_VAL" => null ),
"DAY_CREATE" => array("TYPE" => $d, "DEF_VAL" => null ),
"TIMESTAMP_X" => array("TYPE" => $dt, "DEF_VAL" => null ),
"DATE_CLOSE" => array("TYPE" => $dt, "DEF_VAL" => null ),
"AUTO_CLOSED" => array("TYPE" => $yn, "DEF_VAL" => null ),
"AUTO_CLOSE_DAYS" => array("TYPE" => $n, "DEF_VAL" => null ),
"SLA_ID" => array("TYPE" => $n, "DEF_VAL" => 1 ),
"NOTIFY_AGENT_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"EXPIRE_AGENT_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"OVERDUE_MESSAGES" => array("TYPE" => $n, "DEF_VAL" => 0 ),
"IS_NOTIFIED" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
"IS_OVERDUE" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
"CATEGORY_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"CRITICALITY_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"STATUS_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"MARK_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"SOURCE_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"DIFFICULTY_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"TITLE" => array("TYPE" => $s, "DEF_VAL" => "", "MAX_STR_LEN" => 255),
"MESSAGES" => array("TYPE" => $n, "DEF_VAL" => 0 ),
"IS_SPAM" => array("TYPE" => $ynn, "DEF_VAL" => null ),
"OWNER_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"OWNER_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"OWNER_SID" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
"CREATED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"CREATED_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"CREATED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => "support", "MAX_STR_LEN" => 255),
"RESPONSIBLE_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"MODIFIED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"MODIFIED_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"MODIFIED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
"LAST_MESSAGE_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"LAST_MESSAGE_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"LAST_MESSAGE_SID" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
"LAST_MESSAGE_BY_SUPPORT_TEAM" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
"LAST_MESSAGE_DATE" => array("TYPE" => $dt, "DEF_VAL" => null ),
"SUPPORT_COMMENTS" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
"PROBLEM_TIME" => array("TYPE" => $n, "DEF_VAL" => null ),
"HOLD_ON" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
"REOPEN" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
"COUPON" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
"DEADLINE_SOURCE_DATE" => array("TYPE" => $dt, "DEF_VAL" => null ),
),
"EventFields" => array(
"ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"LANGUAGE" => array("TYPE" => $s, "DEF_VAL" => null ),
"LANGUAGE_ID" => array("TYPE" => $s, "DEF_VAL" => null ),
"WHAT_CHANGE" => array("TYPE" => $s, "DEF_VAL" => null ),
"DATE_CREATE" => array("TYPE" => $s, "DEF_VAL" => null ),
"TIMESTAMP" => array("TYPE" => $s, "DEF_VAL" => null ),
"DATE_CLOSE" => array("TYPE" => $s, "DEF_VAL" => null ),
"TITLE" => array("TYPE" => $s, "DEF_VAL" => null ),
"STATUS" => array("TYPE" => $s, "DEF_VAL" => null ),
"DIFFICULTY" => array("TYPE" => $s, "DEF_VAL" => null ),
"CATEGORY" => array("TYPE" => $s, "DEF_VAL" => null ),
"CRITICALITY" => array("TYPE" => $s, "DEF_VAL" => null ),
"RATE" => array("TYPE" => $s, "DEF_VAL" => null ),
"SLA" => array("TYPE" => $s, "DEF_VAL" => null ),
"SOURCE" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGES_AMOUNT" => array("TYPE" => $s, "DEF_VAL" => null ),
"SPAM_MARK" => array("TYPE" => $s, "DEF_VAL" => null ),
"ADMIN_EDIT_URL" => array("TYPE" => $s, "DEF_VAL" => null ),
"PUBLIC_EDIT_URL" => array("TYPE" => $s, "DEF_VAL" => null ),
"OWNER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"OWNER_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"OWNER_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"OWNER_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
"OWNER_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"OWNER_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
"OWNER_SID" => array("TYPE" => $s, "DEF_VAL" => null ),
"SUPPORT_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"RESPONSIBLE_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"RESPONSIBLE_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"RESPONSIBLE_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
"RESPONSIBLE_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"RESPONSIBLE_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
"SUPPORT_ADMIN_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"CREATED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"CREATED_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
"CREATED_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"CREATED_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"CREATED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"CREATED_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
"MODIFIED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"MODIFIED_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
"MODIFIED_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"MODIFIED_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"MODIFIED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"MODIFIED_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_AUTHOR_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
"MESSAGE_AUTHOR_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_AUTHOR_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_AUTHOR_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_AUTHOR_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_AUTHOR_SID" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_SOURCE" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_HEADER" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_BODY" => array("TYPE" => $s, "DEF_VAL" => null ),
"MESSAGE_FOOTER" => array("TYPE" => $s, "DEF_VAL" => null ),
"FILES" => array("TYPE" => $s, "DEF_VAL" => null ),
"FILES_LINKS" => array("TYPE" => $s, "DEF_VAL" => null ),
"IMAGE_LINK" => array("TYPE" => $s, "DEF_VAL" => null ),
"SUPPORT_COMMENTS" => array("TYPE" => $s, "DEF_VAL" => null ),
),
);
if(!array_key_exists($name, $tables)) return null;
return new CSupportTableFields($tables[$name], $arrOrTable);
}
public static function Set_getFilesLinks($arFiles, $lID)
{
// сформируем ссылки на прикрепленые файлы
$fl = null;
if(is_array($arFiles) && count($arFiles) > 0)
{
$fl = GetMessage("SUP_ATTACHED_FILES")."\n";
foreach($arFiles as $arFile)
{
$fl .= (CMain::IsHTTPS()? "https" : "http")."://" . $_SERVER["HTTP_HOST"] . "/bitrix/tools/ticket_show_file.php?hash=" . $arFile["HASH"] . "&action=download&lang=" . $lID . "\n";
}
if ($fl <> '') $fl .= "\n";
}
return $fl;
}
public static function Set_WriteLog($nf, $v, $mf)
{
$change_log = "";
$v->change = "";
$v->change_hidden = "";
if($v->isNew) // NEW
{
$v->arChange = array();
if($nf->SLA_NAME <> '') $v->arChange["SLA_ID"] = "Y";
if($nf->CATEGORY_NAME <> '') $v->arChange["CATEGORY_ID"] = "Y";
if($nf->CRITICALITY_NAME <> '') $v->arChange["CRITICALITY_ID"] = "Y";
if($nf->STATUS_NAME <> '') $v->arChange["STATUS_ID"] = "Y";
if($nf->DIFFICULTY_NAME <> '') $v->arChange["DIFFICULTY_ID"] = "Y";
if($mf->RESPONSIBLE_TEXT <> '') $v->arChange["RESPONSIBLE_USER_ID"] = "Y";
if($v->bActiveCoupon) $change_log .= "