%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/support/classes/general/
Upload File :
Create Path :
Current File : /home/bitrix/www/bitrix/modules/support/classes/general/reminder.php

<?
IncludeModuleLangFile(__FILE__);


class CAllTicketReminder
{
		
	function err_mess()
	{
		$module_id = "support";
		@include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module_id."/install/version.php");
		return "<br>Module: ".$module_id." <br>Class: CAllTicketReminder<br>File: ".__FILE__;
	}
	

	function ConvertResponseTimeUnit($rt, $rtu)
	{
		switch($rtu)
		{
			case 'day': return intval($rt) * 1440;
			case 'hour': return intval($rt) * 60;
			case 'minute': return intval($rt);
		}
		return 0;
	}

	function RecalculateLastMessageDeadline($RSD = true)
	{
		global $DB, $DBType;
		$err_mess = (self::err_mess())."<br>Function: RecalculateLastMessage<br>Line: ";

		$DB->StartUsingMasterOnly();

		$strSql = "SELECT count(*) C FROM b_ticket";
		$rs = $DB->Query($strSql, false, $err_mess.__LINE__);
		$resC = $rs->Fetch();
		if(!is_array($resC))
		{
			return true;
		}

		if(!isset($resC["C"]) || $resC["C"] == 0)
		{
			return true;
		}

		$strUsers = implode(",", CTicket::GetSupportTeamAndAdminUsers());
		$strSql0 = "
				b_ticket
				INNER JOIN (
					SELECT
						T.ID TID,
						M.DATE_CREATE DATE_CREATE,
						M.ID ID,
						" . CTicket::isnull("Q.LMBS", "'Y'") . " LMBS
					FROM
						b_ticket as T
						LEFT JOIN (
							SELECT
								TM.TICKET_ID ID,
								MIN(TM.ID) M_ID,
								'N' LMBS
							FROM
								b_ticket_message TM
								INNER JOIN (
									SELECT
										T.ID ID,
										MAX(" . CTicket::isnull("TM.ID", "0") . ") M_ID
									FROM
										b_ticket T
										LEFT JOIN b_ticket_message TM
											ON T.ID = TM.TICKET_ID
												AND (NOT(TM.IS_LOG='Y'))
												AND (NOT(TM.IS_HIDDEN='Y'))
												AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
												AND TM.OWNER_USER_ID IN ($strUsers)
									WHERE
										T.DATE_CLOSE IS NULL
									GROUP BY
										T.ID
								) AS Q
									ON TM.TICKET_ID = Q.ID
										AND TM.ID > Q.M_ID
										AND (NOT(TM.IS_LOG='Y'))
										AND (NOT(TM.IS_HIDDEN='Y'))
										AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
							GROUP BY
								TM.TICKET_ID
						) AS Q
							ON T.ID = Q.ID
						LEFT JOIN b_ticket_message AS M
							ON Q.M_ID = M.ID
					WHERE
						T.DATE_CLOSE IS NULL
				) AS M
					ON b_ticket.ID = M.TID
		";

		$arS = array(
			"MySQL" =>	"
	UPDATE $strSql0
	SET
	b_ticket.D_1_USER_M_AFTER_SUP_M = M.DATE_CREATE,
	b_ticket.ID_1_USER_M_AFTER_SUP_M = M.ID,
	b_ticket.LAST_MESSAGE_BY_SUPPORT_TEAM = M.LMBS
					",

			"MSSQL" =>	"
	UPDATE b_ticket
	SET
	b_ticket.D_1_USER_M_AFTER_SUP_M = M.DATE_CREATE,
	b_ticket.ID_1_USER_M_AFTER_SUP_M = M.ID,
	b_ticket.LAST_MESSAGE_BY_SUPPORT_TEAM = M.LMBS
	FROM $strSql0
					",




			"Oracle" =>	"
	UPDATE b_ticket T0
	SET (D_1_USER_M_AFTER_SUP_M, ID_1_USER_M_AFTER_SUP_M, LAST_MESSAGE_BY_SUPPORT_TEAM) = (
		SELECT
			M.DATE_CREATE,
			M.ID,
			M.LMBS
		FROM ".str_replace(" AS ", " ", $strSql0)."
		WHERE b_ticket.ID = T0.ID
	)
					",
		);

		$res = $DB->Query($arS[$DBType], true);

		$res = $DB->Query("UPDATE b_ticket SET SUPPORT_DEADLINE = null, SUPPORT_DEADLINE_NOTIFY = null WHERE LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y'", true);

		if($RSD)
		{
			self::RecalculateSupportDeadline();
		}

		$DB->StopUsingMasterOnly();

	}


	function RecalculateSupportDeadline($arFilter = array())
	{
		global $DB;
		$err_mess = (CAllTicketReminder::err_mess())."<br>Function: RecalculateSupportDeadline<br>Line: ";	
		
		$arSqlSearch = Array();
		if(!is_array($arFilter)) $arFilter = array();
		foreach($arFilter as $key => $val)
		{
			if((is_array($val) && count($val) <= 0) || (!is_array($val) && strlen($val) <= 0)) continue;
			$key = strtoupper($key);
			if (is_array($val)) $val = implode(" | ",$val);
			switch($key)
			{
				case "ID":
					$arSqlSearch[] = GetFilterQuery("T.ID", $val, "N");
					break;
				case "SLA_ID":
					$arSqlSearch[] = GetFilterQuery("T.SLA_ID", $val, "N");
					break;
			}
		}
		$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
		
		$strSql = "
			SELECT
				T.ID ID,
				T.SLA_ID,
				" . $DB->DateToCharFunction("T.DEADLINE_SOURCE_DATE", "FULL") . " DEADLINE_SOURCE_DATE,
				" . $DB->DateToCharFunction("T.D_1_USER_M_AFTER_SUP_M", "FULL") . " D_1_USER_M_AFTER_SUP_M,
				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.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
						AND (T.DATE_CLOSE IS NULL)
			WHERE
				$strSqlSearch
		";
		$rsTicket = $DB->Query($strSql, false, $err_mess . __LINE__);
		while($arTicket = $rsTicket->Fetch())
		{
			self::RecalculateSupportDeadlineForOneTicket($arTicket);
		}
	}
	
	/*$arTicket = ID,SLA_ID,RESPONSE_TIME, D_1_USER_M_AFTER_SUP_M, RESPONSE_TIME_UNIT, NOTICE_TIME, NOTICE_TIME_UNIT,DEADLINE_SOURCE_DATE
	$dateType = CTicket::ADD, CTicket::UPDATE CTicket::DELETE, CTicket::IGNORE, CTicket::REOPEN, CTicket::NEW_SLA*/
	function RecalculateSupportDeadlineForOneTicket($arTicket, $arFields = array(), $dateType = array("EVENT"=>array(CTicket::IGNORE)))
	{
		global $DB;
		$err_mess = (CAllTicketReminder::err_mess())."<br>Function: RecalculateSupportDeadlineForOneTicket<br>Line: ";	
		$currDateTS = time() + CTimeZone::GetOffset();
		$ts2010 = mktime(0, 0, 0, 1, 1, 2010);
		$supportDeadlineNotify = 0;
		$ticketID = intval($arTicket["ID"]);
		$slaID = intval($arTicket["SLA_ID"]);
		$periodMin = self::ConvertResponseTimeUnit($arTicket["RESPONSE_TIME"], $arTicket["RESPONSE_TIME_UNIT"]);
		$periodNMin = 0;
		if($ticketID <= 0 || $slaID <= 0 || $periodMin <= 0 || intval($arTicket["D_1_USER_M_AFTER_SUP_M"]) <= 0)
		{
			if($ticketID > 0 && count($arFields) > 0)
			{
				$DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'", $err_mess . __LINE__);
			}
			return;
		}
		
		$periodNMinMinus = self::ConvertResponseTimeUnit($arTicket["NOTICE_TIME"], $arTicket["NOTICE_TIME_UNIT"]);
		if($periodNMinMinus > 0 && $periodNMinMinus < $periodMin) 
		{
			$periodNMin = $periodMin - $periodNMinMinus;
		}
		
		$newDate1UserMessAfterSupMessTS = MakeTimeStamp($arTicket["D_1_USER_M_AFTER_SUP_M"]);
		$deadlineSourceDate = MakeTimeStamp($arTicket["DEADLINE_SOURCE_DATE"]);
		if($deadlineSourceDate <= $ts2010)
		{
			if($newDate1UserMessAfterSupMessTS <= $ts2010)
			{
				$deadlineSourceDate = $currDateTS;
			}
			else
			{
				$deadlineSourceDate = $newDate1UserMessAfterSupMessTS;
			}
			$arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime($deadlineSourceDate,"FULL"));
		}
		$oldPeriodMin = null;
		if(isset($dateType["EVENT"]) && in_array(CTicket::UPDATE, $dateType["EVENT"]))
		{
			if(isset($dateType["OLD_SLA_RESPONSE_TIME"]) && isset($dateType["OLD_SLA_RESPONSE_TIME_UNIT"]))
			{
				$oldPeriodMin = self::ConvertResponseTimeUnit($dateType["OLD_SLA_RESPONSE_TIME"], $dateType["OLD_SLA_RESPONSE_TIME_UNIT"]);
			}

			if(
				in_array(CTicket::REOPEN, $dateType["EVENT"]) ||
				(
					in_array(CTicket::NEW_SLA, $dateType["EVENT"]) &&
					($arTicket["IS_OVERDUE"] != "Y") &&
					($oldPeriodMin != null) &&
					($oldPeriodMin > $periodMin)
				)
			)
			{
				$deadlineSourceDate = $currDateTS;
				$arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime($deadlineSourceDate,"FULL"));
			}
			elseif(($arTicket["IS_OVERDUE"] != "Y") && ($newDate1UserMessAfterSupMessTS > $deadlineSourceDate))
			{
				$sla = CTicketSLA::getById($slaID)->Fetch();

				if (empty($sla['DEADLINE_SOURCE']))
				{
					// default deadline calculation
					// date of first client message after support message
					$deadlineSourceDate = $newDate1UserMessAfterSupMessTS;
					$arFields["DEADLINE_SOURCE_DATE"] = $arFields["D_1_USER_M_AFTER_SUP_M"];
				}
			}
		}

		$supportDeadlineTS = CSupportTimetableCache::getEndDate($slaID, $periodMin, GetTime($deadlineSourceDate,"FULL"));
		$arFields["SUPPORT_DEADLINE"] = $DB->CharToDateFunction(GetTime($supportDeadlineTS, "FULL"));
		$arFields["IS_OVERDUE"] = (($supportDeadlineTS <= $currDateTS) ? "'Y'" : "'N'");

		// exec event and confirm if overdue
		if ($arTicket['IS_OVERDUE'] == "N" && $arFields['IS_OVERDUE'] == "'Y'")
		{
			$rs = GetModuleEvents('support', 'OnBeforeTicketExpire');
			while ($arr = $rs->Fetch())
			{
				$arFields = ExecuteModuleEventEx($arr, array($ticketID, $arFields));

				if (!$arFields)
				{
					return false;
				}
			}
		}


		if($periodNMin > 0)
		{
			$supportDeadlineNotifyTS = CSupportTimetableCache::getEndDate($slaID, $periodNMin, GetTime($deadlineSourceDate,"FULL"));
			$arFields["SUPPORT_DEADLINE_NOTIFY"] = $DB->CharToDateFunction(GetTime($supportDeadlineNotifyTS, "FULL"));
			$arFields["IS_NOTIFIED"] = (($supportDeadlineNotifyTS <= $currDateTS) ? "'Y'" : "'N'");

			// exec event and confirm if set notified
			if ($arTicket['IS_NOTIFIED'] == "N" && $arFields['IS_NOTIFIED'] == "'Y'")
			{
				$rs = GetModuleEvents('support', 'OnBeforeTicketNotify');
				while ($arr = $rs->Fetch())
				{
					$arFields = ExecuteModuleEventEx($arr, array($ticketID, $arFields));

					if (!$arFields)
					{
						return false;
					}
				}
			}
		}

		$DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'", $err_mess . __LINE__);
	}


	function SupportDeadline($arrTicket)
	{

		global $MESS, $DB;

		$err_mess = (CAllTicketReminder::err_mess())."<br>Function: supportDeadline<br>Line: ";
		$rsSite = CSite::GetByID($arrTicket["SITE_ID"]);
		$arSite = $rsSite->Fetch();

		//$oldMess = $MESS;
		
		IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/support/classes/general/messages.php", $arSite["LANGUAGE_ID"]);

		// update message params
		$arFields = array(
			"EXPIRE_AGENT_ID"		=> "null",
			"IS_OVERDUE"			=> "'Y'",
			"OVERDUE_MESSAGES"		=> "OVERDUE_MESSAGES + 1",
		);

		// execute event
		$rs = GetModuleEvents('support', 'OnBeforeTicketExpire');
		while ($arr = $rs->Fetch())
		{
			$arFields = ExecuteModuleEventEx($arr, array($arrTicket["ID"], $arFields));

			if (!$arFields)
			{
				return false;
			}
		}

		$DB->Update("b_ticket", $arFields, "WHERE ID='" . $arrTicket["ID"] . "'", $err_mess . __LINE__);

		// add message log
		$message = str_replace("#ID#", $arrTicket["TM_ID"], GetMessage("SUP_MESSAGE_OVERDUE_LOG"));
		$message = str_replace("#NUMBER#", $arrTicket["TM_C_NUMBER"], $message);
		$message .= "<br><li>" . htmlspecialcharsEx(str_replace("#VALUE#", $arrTicket["SLA_NAME"], GetMessage("SUP_SLA_LOG")));

		if(intval($arrTicket["RESPONSIBLE_USER_ID"]) > 0)
		{
			$rsUser = CUser::GetByID(intval($arrTicket["RESPONSIBLE_USER_ID"]));
			$arUser = $rsUser->Fetch();
			$responsibleText = "[" . $arUser["ID"] . "] (" . $arUser["LOGIN"] . ") " . $arUser["NAME"] . " " . $arUser["LAST_NAME"];
			$message .= "<li>".htmlspecialcharsEx(str_replace("#VALUE#", $responsibleText, GetMessage("SUP_RESPONSIBLE_LOG")));
		}

		$arFields = array(
			"IS_LOG"						=> "Y",
			"IS_OVERDUE"					=> "Y",
			"MESSAGE_CREATED_USER_ID"		=> "null",
			"MESSAGE_CREATED_MODULE_NAME"	=> "auto expiration",
			"MESSAGE_CREATED_GUEST_ID"		=> "null",
			"MESSAGE_SOURCE_ID"				=> "null",
			"MESSAGE"						=> $message
		);
		$v = null;
		$mid = CTicket::AddMessage($arrTicket['ID'], $arFields, $v, "N");

		//$MESS = $oldMess;

	}


	function SupportDeadlineNotify($arrTicket0)
	{
		//SUPPORT_DEADLINE_NOTIFY
		//SUPPORT_DEADLINE			= EXPIRATION_DATE
		//SUPPORT_DEADLINE_STMP		= EXPIRATION_DATE_STMP

		$err_mess = (CAllTicketReminder::err_mess())."<br>Function: SupportDeadlineNotify<br>Line: ";
		$rs = CTicket::GetByID($arrTicket0["ID"], false, "N");
		if(!($arTicket = $rs->Fetch())) return false;
		
		$rsMessage = CTicket::GetMessageByID(intval($arTicket["ID_1_USER_M_AFTER_SUP_M"]), "N", "N");
		if(!($arMessage = $rsMessage->Fetch()))
		{
			return false;
		}

		$arMessage["EXPIRATION_DATE"] = $arrTicket0["SUPPORT_DEADLINE"];
		$arMessage["EXPIRATION_DATE_STMP"] = MakeTimeStamp($arMessage["EXPIRATION_DATE"]);
		
		//$SUPPORT_DEADLINE_STMP = MakeTimeStamp($arrTicket0["SUPPORT_DEADLINE"]);
			
		$rsSite = CSite::GetByID($arTicket["SITE_ID"]);
		$arSite = $rsSite->Fetch();

		global $MESS, $DB;;
		//$oldMess = $MESS;
		IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/support/classes/general/messages.php", $arSite["LANGUAGE_ID"]);

		$sourceName = strlen($arTicket["SOURCE_NAME"]) <= 0 ? "" : "[" . $arTicket["SOURCE_NAME"] . "] ";
		if(intval($arTicket["OWNER_USER_ID"]) > 0 || strlen(trim($arTicket["OWNER_LOGIN"])) > 0)
		{
			$ownerText = "[" . $arTicket["OWNER_USER_ID"] . "] (" . $arTicket["OWNER_LOGIN"] . ") " . $arTicket["OWNER_NAME"];
			//if(strlen(trim($OWNER_SID)) > 0 && $OWNER_SID != "null") $ownerText = " / " . $ownerText;
		}

		if(intval($arTicket["RESPONSIBLE_USER_ID"]) > 0)
		{
			$responsibleText = "[" . $arTicket["RESPONSIBLE_USER_ID"] . "] (" . $arTicket["RESPONSIBLE_LOGIN"] . ") " . $arTicket["RESPONSIBLE_NAME"];
			if(CTicket::IsSupportTeam($arTicket["RESPONSIBLE_USER_ID"]) || CTicket::IsAdmin($arTicket["RESPONSIBLE_USER_ID"]))
			{
				$responsibleText .= " " . GetMessage("SUP_TECHSUPPORT_HINT");
			}
		}

		$arAdminEMails = CTicket::GetAdminEmails();
		if(count($arAdminEMails) > 0) $support_admin_email = implode(",", $arAdminEMails);

		// prepare email to author
		$arrOwnerEMail = array($arTicket["OWNER_EMAIL"]);
		$arrEmails = explode(",", $arTicket["OWNER_SID"]);
		if(is_array($arrEmails) && count($arrEmails) > 0)
		{
			foreach($arrEmails as $email)
			{
				$email = trim($email);
				if(strlen($email) > 0)
				{
					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(strlen($email)>0 && !in_array($email, $arrOwnerEMail) && check_email($email))
							{
								$arrOwnerEMail[] = $email;
							}
						}
					}
					elseif(!in_array($email, $arrOwnerEMail) && check_email($email)) $arrOwnerEMail[] = $email;
				}
			}
		}
		TrimArr($arrOwnerEMail);
		$ownerEmail = implode(", ", $arrOwnerEMail);

		// prepare email to support
		$support_email = $arTicket["RESPONSIBLE_EMAIL"];
		if(strlen($support_email) <= 0)
			$support_email = $support_admin_email;
		if(strlen($support_email) <= 0)
			$support_email = COption::GetOptionString("main", "email_from","");

		$arr = explode(",", $support_email);
		$arr = array_unique($arr);
		$support_email = implode(",", $arr);
		if(is_array($arr) && count($arr)>0)
		{
			foreach($arr as $email) unset($arAdminEMails[$email]);
		}
		$support_admin_email = implode(",", $arAdminEMails);

		$createdModuleName = "";
		if($arTicket["CREATED_MODULE_NAME"] == "support" || !strlen($arTicket["CREATED_MODULE_NAME"]))
		{
			if(intval($arTicket["CREATED_USER_ID"]) > 0)
			{
				$createdText = "[" . $arTicket["CREATED_USER_ID"] . "] (" . $arTicket["CREATED_LOGIN"] . ") " . $arTicket["CREATED_NAME"];
				if(CTicket::IsSupportTeam($arTicket["CREATED_USER_ID"]) || CTicket::IsAdmin($arTicket["CREATED_USER_ID"]))
				{
					$createdText .= " " . GetMessage("SUP_TECHSUPPORT_HINT");
				}
			}
		}
		else $createdModuleName = "[".$arTicket["CREATED_MODULE_NAME"]."]";

		$MESSAGE = PrepareTxtForEmail($arMessage["MESSAGE"], $arSite["LANGUAGE_ID"], false, false);
		$remainedTime = $arMessage["EXPIRATION_DATE_STMP"] - time();
		if($remainedTime > 0)
		{
			$strRemainedTime = "";
			$hours = intval($remainedTime / 3600);
			if($hours > 0)
			{
				$strRemainedTime .= $hours . " " . GetMessage("SUP_HOUR") . " ";
				$remainedTime = $remainedTime - $hours*3600;
			}
			$strRemainedTime .= intval($remainedTime / 60) . " " . GetMessage("SUP_MIN") . " ";
			$strRemainedTime .= ($remainedTime % 60) . " " . GetMessage("SUP_SEC");
		}

		$arFields_notify = array(
			"ID"						=> $arTicket["ID"],
			"LANGUAGE_ID"				=> $arSite["LANGUAGE_ID"],
			"DATE_CREATE"				=> $arTicket["DATE_CREATE"],
			"TITLE"						=> $arTicket["TITLE"],
			"STATUS"					=> $arTicket["STATUS_NAME"],
			"CATEGORY"					=> $arTicket["CATEGORY_NAME"],
			"CRITICALITY"				=> $arTicket["CRITICALITY_NAME"],
			"DIFFICULTY"				=> $arTicket["DIFFICULTY_NAME"],
			"RATE"						=> $arTicket["MARK_NAME"],
			"SLA"						=> $arTicket["SLA_NAME"],
			"SOURCE"					=> $sourceName,
			"ADMIN_EDIT_URL"			=> "/bitrix/admin/ticket_edit.php",
			"EXPIRATION_DATE"			=> $arMessage["EXPIRATION_DATE"],
			"REMAINED_TIME"				=> $strRemainedTime,

			"OWNER_EMAIL"				=> TrimEx($ownerEmail,","),
			"OWNER_USER_ID"				=> $arTicket["OWNER_USER_ID"],
			"OWNER_USER_NAME"			=> $arTicket["OWNER_NAME"],
			"OWNER_USER_LOGIN"			=> $arTicket["OWNER_LOGIN"],
			"OWNER_USER_EMAIL"			=> $arTicket["OWNER_EMAIL"],
			"OWNER_TEXT"				=> $ownerText,
			"OWNER_SID"					=> $arTicket["OWNER_SID"],

			"SUPPORT_EMAIL"				=> TrimEx($support_email,","),
			"RESPONSIBLE_USER_ID"		=> $arTicket["RESPONSIBLE_USER_ID"],
			"RESPONSIBLE_USER_NAME"		=> $arTicket["RESPONSIBLE_NAME"],
			"RESPONSIBLE_USER_LOGIN"	=> $arTicket["RESPONSIBLE_LOGIN"],
			"RESPONSIBLE_USER_EMAIL"	=> $arTicket["RESPONSIBLE_EMAIL"],
			"RESPONSIBLE_TEXT"			=> $responsibleText,
			"SUPPORT_ADMIN_EMAIL"		=> TrimEx($support_admin_email,","),

			"CREATED_USER_ID"			=> $arTicket["CREATED_USER_ID"],
			"CREATED_USER_LOGIN"		=> $arTicket["CREATED_LOGIN"],
			"CREATED_USER_EMAIL"		=> $arTicket["CREATED_EMAIL"],
			"CREATED_USER_NAME"			=> $arTicket["CREATED_NAME"],
			"CREATED_MODULE_NAME"		=> $createdModuleName,
			"CREATED_TEXT"				=> $createdText,

			"MESSAGE_BODY"				=> $MESSAGE
		);

		//$MESS = $oldMess;

		$arFields = array("NOTIFY_AGENT_ID" => "null", "IS_NOTIFIED" => "'Y'");

		// execute event
		$rs = GetModuleEvents('support', 'OnBeforeTicketNotify');
		while ($arr = $rs->Fetch())
		{
			$arFields = ExecuteModuleEventEx($arr, array($arTicket["ID"], $arFields));

			if (!$arFields)
			{
				return false;
			}
		}

		// check value again and send notification
		if (isset($arFields['IS_NOTIFIED']) && $arFields['IS_NOTIFIED'] === "'Y'")
		{
			CEvent::Send("TICKET_OVERDUE_REMINDER", $arTicket["SITE_ID"], $arFields_notify);
		}

		// event for notification

		$DB->Update("b_ticket", $arFields, "WHERE ID='" . $arTicket["ID"] . "'", $err_mess . __LINE__);

		$arFields = array("NOTIFY_AGENT_DONE" => "'Y'");
		$DB->Update("b_ticket_message", $arFields, "WHERE ID='" . $arMessage["ID"] . "'", $err_mess . __LINE__);
	}

	function AgentFunction()
	{
		//IS_OVERDUE
		//IS_NOTIFIED
		//SUPPORT_DEADLINE
		//SUPPORT_DEADLINE_NOTIFY
		global $DB;
		$err_mess = (CAllTicketReminder::err_mess())."<br>Function: AgentFunction<br>Line: ";

		CTimeZone::Disable();
		$cyrrDateTime = $DB->CharToDateFunction(GetTime(time(), "FULL"));
		CTimeZone::Enable();
		
		$strSql = "
			SELECT
				T.ID ID,
				T.SITE_ID,
				" . $DB->DateToCharFunction("T.SUPPORT_DEADLINE_NOTIFY", "FULL") . " SUPPORT_DEADLINE_NOTIFY,
				" . $DB->DateToCharFunction("T.SUPPORT_DEADLINE", "FULL") . " SUPPORT_DEADLINE,
				T.ID_1_USER_M_AFTER_SUP_M	
			FROM
				b_ticket T					
			WHERE
				T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
				AND T.SUPPORT_DEADLINE_NOTIFY <= $cyrrDateTime
				AND T.SUPPORT_DEADLINE_NOTIFY IS NOT NULL
				AND T.ID_1_USER_M_AFTER_SUP_M > 0
				AND T.IS_OVERDUE = 'N'
				AND T.IS_NOTIFIED = 'N'
				AND T.DATE_CLOSE IS NULL
		";
		$rsTicket = $DB->Query($strSql, false, $err_mess . __LINE__);
		while($arrTicket = $rsTicket->Fetch())
		{
			self::SupportDeadlineNotify($arrTicket);
		}
		
		$strSql = "
			SELECT
				T.*,
				TM.ID TM_ID,
				TM.C_NUMBER TM_C_NUMBER,
				S.NAME SLA_NAME
			FROM
				b_ticket T
				LEFT JOIN b_ticket_sla S
					ON T.SLA_ID = S.ID
				LEFT JOIN b_ticket_message TM
					ON T.ID_1_USER_M_AFTER_SUP_M	= TM.ID	
			WHERE
				T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
				AND T.SUPPORT_DEADLINE <= $cyrrDateTime
				AND T.IS_OVERDUE = 'N'
				AND T.DATE_CLOSE IS NULL
		";
		$rsTicket = $DB->Query($strSql, false, $err_mess . __LINE__);
		
		while($arrTicket = $rsTicket->Fetch())
		{
			self::SupportDeadline($arrTicket);
		}
		return "CTicketReminder::AgentFunction();";
	}


	function StartAgent()
	{
		CAgent::RemoveModuleAgents("support");
		CAgent::AddAgent("CTicketReminder::AgentFunction();", "support", "N", 60);
		CAgent::AddAgent('CTicket::CleanUpOnline();', 'support', 'N');
		CAgent::AddAgent('CTicket::AutoClose();', 'support', 'N');
	}

}

?>

Zerion Mini Shell 1.0