- Модуль: support
- Путь к файлу: ~/bitrix/modules/support/classes/general/reminder.php
- Класс: CAllTicketReminder
- Вызов: CAllTicketReminder::RecalculateSupportDeadlineForOneTicket
static function RecalculateSupportDeadlineForOneTicket($arTicket, $arFields = array(), $dateType = array("EVENT"=>array(CTicket::IGNORE)))
{
global $DB;
$err_mess = (CAllTicketReminder::err_mess())."
Function: RecalculateSupportDeadlineForOneTicket
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__);
}