16 const SLA =
" b_ticket_sla";
29 if(!class_exists(
'DateTime'))
37 $res =
new DateTime($d);
41 $res =
new DateTime(
null,
new DateTimeZone(date_default_timezone_get()));
53 if(self::$timeZone ===
null)
57 self::$timeZone =
new DateTimeZone(date_default_timezone_get());
58 $serverZone = COption::GetOptionString(
"main",
"default_time_zone",
"");
59 if($serverZone !=
"") self::$timeZone =
new DateTimeZone($serverZone);
62 return self::$timeZone;
67 if(self::$timeZoneOffset ===
null)
71 $localTime =
new DateTime();
72 $localOffset = $localTime->getOffset();
73 $serverTime =
new DateTime(
null, self::GetTimeZone());
74 self::$timeZoneOffset = $serverTime->getOffset() - $localOffset;
78 self::$timeZoneOffset = 0;
81 return self::$timeZoneOffset;
93 if(self::$MaxSlaResponseTime !=
null)
95 return self::$MaxSlaResponseTime;
98 $tabNameSLA = self::SLA;
106 $q =
$DB->Query($strSql);
108 self::$MaxSlaResponseTime = 0;
109 while ($arrR = $q->Fetch())
112 if(self::$MaxSlaResponseTime < $ct)
114 self::$MaxSlaResponseTime = $ct;
117 return self::$MaxSlaResponseTime;
122 $supportCacheDaysBackward = intval(COption::GetOptionString(
"support",
"SUPPORT_CACHE_DAYS_BACKWARD", 0));
123 $slaDays = ceil(self::GetMaxSlaResponseTime() / 1440 * 5);
124 return max($supportCacheDaysBackward, $slaDays);
129 $supportCacheDaysForward = intval(COption::GetOptionString(
"support",
"SUPPORT_CACHE_DAYS_FORWARD", 0));
130 $slaDays = ceil(self::GetMaxSlaResponseTime() / 1440 * 5 + 20);
131 return max($supportCacheDaysForward, $slaDays);
136 if(self::Possible(
"@" . $d))
138 $localTime =
new DateTime(
"@" . $d);
139 $localTime->setTimezone(self::GetTimeZone());
140 $localTime->setTime(0, 0, 0);
141 return intval($localTime->format(
'U'));
145 return mktime(0, 0, 0, date(
"m", $d) , date(
"d", $d), date(
"Y", $d));
151 if(self::Possible(
"@" . $d))
153 $localTime =
new DateTime(
"@" . $d);
154 $localTime->setTimezone(self::GetTimeZone());
155 $localTime->setTime(23, 59, 59);
156 return intval($localTime->format(
'U'));
160 return mktime(23, 59, 59, date(
"m", $d) , date(
"d", $d), date(
"Y", $d));
168 $localTime =
new DateTime(
null, self::GetTimeZone());
169 $localTime->setTimestamp($d);
170 $dayNom = intval($localTime->format(
"w")) - 1;
174 $dayNom = date(
"w", $d) - 1;
188 $tabNameHolidays = self::TICKET_HOLIDAYS;
189 $tabNameS2H = self::SLA_2_HOLIDAYS;
191 $arSqlSearch = Array();
214 CTimeZone::Disable();
219 " .
$DB->DateToCharFunction(
"H.DATE_FROM",
"FULL") .
" DATE_FROM,
220 " .
$DB->DateToCharFunction(
"H.DATE_TILL",
"FULL") .
" DATE_TILL
224 INNER JOIN $tabNameS2H HS
225 ON H.ID = HS.HOLIDAYS_ID AND HS.HOLIDAYS_ID > 0
227 H.DATE_FROM > " .
$DB->CharToDateFunction(
GetTime($dateB,
"FULL")) .
"
228 AND H.DATE_FROM < " .
$DB->CharToDateFunction(
GetTime($dateE,
"FULL")) .
"
233 $q =
$DB->Query($strSql);
238 $goodSLA = array_keys(
$arrS);
239 while ($arrR = $q->Fetch())
245 $cSLA = $arrR[
"SLA_ID"];
252 $cOT = $arrR[
"OPEN_TIME"];
256 while($dtC <= $dtE && $dtC <= $dateE)
261 if(substr_count($cOT,
"WORKDAY_") > 0)
263 $WN = str_replace(
"WORKDAY_",
"" , $cOT);
266 $res0[$dtC][
"W"][] =
array(
"F" => (max($dtB, $dtCB) - $dtCB),
"T" => (min($dtE, $dtCE) - $dtCB));
272 foreach(
$arrS[$cSLA][$WN] as
$k => $v)
274 $res0[$dtC][
"W"][] = $v;
279 $res0[$dtC][
"C"] =
true;
286 if($cOT ==
"HOLIDAY_H")
288 $res0[$dtC][
"H"][] =
array(
"F" => (max($dtB, $dtCB) - $dtCB),
"T" => (min($dtE, $dtCE) - $dtCB));
292 $res0[$dtC][
"C"] =
true;
309 if(
$a[
"F"] == $b[
"F"])
313 return (
$a[
"F"] < $b[
"F"]) ? -1 : 1;
320 foreach(
$arr as $dtC => $v)
327 if(isset($v[
"W"]) && is_array($v[
"W"]) &&
count($v[
"W"]) > 0)
330 uasort($arrW0,
array(
"self",
"SortMethodH"));
337 $arrH0 = (isset($v[
"H"]) && is_array($v[
"H"]) &&
count($v[
"H"]) > 0) ? $v[
"H"] :
array();
338 uasort($arrH0,
array(
"self",
"SortMethodH"));
342 $wC =
count($arrW) - 1;
353 for(
$i = $w;
$i <= $wC;
$i++)
$res[$dtC][] =
array(
"F" => $arrW[
$i][
"F"],
"T" => $arrW[
$i][
"T"]);
357 if(
$arrH[$h][
"T"] < $arrW[$w][
"T"])
359 if($arrW[$w][
"F"] <
$arrH[$h][
"F"])
363 $res[$dtC][] =
array(
"F" => $arrW[$w][
"F"],
"T" =>
$arrH[$h][
"F"]);
364 $arrW[$w][
"F"] =
$arrH[$h][
"T"];
370 $arrW[$w][
"F"] = max($arrW[$w][
"F"],
$arrH[$h][
"T"]);
379 if(!(
$arrH[$h][
"F"] <= $arrW[$w][
"F"]))
383 $res[$dtC][] =
array(
"F" => $arrW[$w][
"F"],
"T" => min($arrW[$w][
"T"],
$arrH[$h][
"F"]));
396 $t_sla_shedule = self::SLA_SHEDULE;
400 "WEEKDAY_NUMBER" => 0,
401 "OPEN_TIME" =>
"'24H'",
418 LEFT JOIN $t_sla_shedule S
419 ON T.ID = S.TIMETABLE_ID AND S.TIMETABLE_ID > 0
426 $q =
$DB->Query($strSql);
428 while ($arrR = $q->Fetch())
432 $arInsStr[
"WEEKDAY_NUMBER"] =
$i;
433 $arInsStr[
"TIMETABLE_ID"] = intval($arrR[
"TIMETABLE_ID"]);
434 $DB->Insert($t_sla_shedule, $arInsStr);
446 $t_sla_shedule = self::SLA_SHEDULE;
448 $arSqlSearch = Array();
480 INNER JOIN $t_sla_shedule S
481 ON SLA.TIMETABLE_ID = S.TIMETABLE_ID AND S.TIMETABLE_ID > 0
485 SLA_ID, WEEKDAY_NUMBER, MINUTE_FROM
487 $q =
$DB->Query($strSql);
489 if(intval($q->SelectedRowsCount()) <= 0)
492 $q =
$DB->Query($strSql);
499 while ($arrR = $q->Fetch())
505 $cSLA = $arrR[
"SLA_ID"];
506 $cWN = intval($arrR[
"WEEKDAY_NUMBER"]);
508 if($oldSLA != $cSLA || $oldWN != $cWN)
516 $cOT = $arrR[
"OPEN_TIME"];
517 if(isset($noAdd[$cSLA][$cWN]))
continue;
522 $res0 =
array(0 =>
array(
"F" => 0,
"T" => (24*60*60 - 1)));
523 $noAdd[$cSLA][$cWN] =
true;
527 $noAdd[$cSLA][$cWN] =
true;
530 $res0[] =
array(
"F" => min(intval($arrR[
"MINUTE_FROM"])*60, intval($arrR[
"MINUTE_TILL"])*60),
"T" => max(intval($arrR[
"MINUTE_FROM"])*60, intval($arrR[
"MINUTE_TILL"])*60));
549 if($r[
$i][
"T"] < $v[
"F"])
555 $r[
$i][
"T"] = max($r[
$i][
"T"], $v[
"T"]);
563 $s = intval(fmod($t, 60));
565 $h = ($t - $m*60 - $s)/3600;
566 return date(
"H:i", mktime($h, $m, 0, 1, 1, 2000));
583 $DB->StartUsingMasterOnly();
585 $uniq = COption::GetOptionString(
"main",
"server_uniq_id",
"");
588 $uniq = md5(uniqid(rand(),
true));
589 COption::SetOptionString(
"main",
"server_uniq_id", $uniq);
592 $db_lock =
$DB->Query(
"SELECT GET_LOCK('" . $uniq .
"_supportToCache', 0) as L");
593 $ar_lock = $db_lock->Fetch();
594 if($ar_lock[
"L"] !==
"1")
600 if(is_array($arFromGetEndDate))
602 $res =
self::getEndDate($arFromGetEndDate[
"SLA"], $arFromGetEndDate[
"PERIOD_MIN"], $arFromGetEndDate[
"DATE_FROM"],
true);
610 $timetable_cache = self::TIMETABLE_CACHE;
618 if(
count(self::$arrS) <= 0)
624 $arrSLA = array_keys(self::$arrS);
626 $arSqlSearch = Array();
649 $DB->Query(
"DELETE FROM $timetable_cache WHERE $strSqlSearch");
654 foreach($arrSLA as
$k => $sla)
658 while($dateC <= $dateT)
660 if(isset(self::$arrH[$sla]) && array_key_exists($dateC, self::$arrH[$sla]))
662 $a = self::$arrH[$sla][$dateC];
668 foreach(
$a as $k2 => $v2)
672 $f->DATE_FROM = ($dateC + $v2[
"F"]);
673 $f->DATE_TILL = ($dateC + $v2[
"T"]);
674 $f->W_TIME = $v2[
"T"] - $v2[
"F"];
677 CTimeZone::Disable();
681 if($colNames ===
null)
683 $colNames = implode(
", ", array_keys($arCurrTicketFields));
685 $strCurrTicketFields =
"(" . implode(
",", $arCurrTicketFields) .
")";
686 if(mb_strlen($strList.
", ".$strCurrTicketFields) > 2000)
688 $strSql =
"INSERT INTO " . $timetable_cache .
" (" . $colNames.
") VALUES " . $strList;
689 $strList = $strCurrTicketFields;
693 $strList .= $coma . $strCurrTicketFields;
712 $strSql =
"INSERT INTO " . $timetable_cache .
" (" . $colNames.
") VALUES " . $strList;
716 $DB->Query(
"SELECT RELEASE_LOCK('" . $uniq .
"_supportToCache')");
717 $DB->StopUsingMasterOnly();
735 static function getEndDate($sla, $periodMin0, $dateFrom, $secondTry =
false)
740 $periodMin = intval($periodMin0) * 60;
741 $dateFromTS =
MakeTimeStamp($dateFrom) - CTimeZone::GetOffset();
742 $timetableCache = self::TIMETABLE_CACHE;
744 CTimeZone::Disable();
749 " .
$DB->DateToCharFunction(
"TC.DATE_FROM",
"FULL") .
" DATE_FROM,
750 " .
$DB->DateToCharFunction(
"TC.DATE_TILL",
"FULL") .
" DATE_TILL,
757 MAX(TC.DATE_FROM) MAX_DATE_FROM
761 SLA_ID = $sla AND DATE_FROM <= " .
$DB->CharToDateFunction($dateFrom) .
") PZ
762 ON TC.DATE_FROM = PZ.MAX_DATE_FROM AND SLA_ID = $sla";
763 $q =
$DB->Query($strSql);
766 if($arrR = $q->Fetch())
769 $delta = intval($arrR[
"W_TIME_INC"]) - intval($arrR[
"W_TIME"]) + min(($dateFromTS -
MakeTimeStamp($arrR[
"DATE_FROM"])), intval($arrR[
"W_TIME"]));
770 $findD =
$delta + $periodMin ;
777 " .
$DB->DateToCharFunction(
"TC.DATE_FROM",
"FULL") .
" DATE_FROM,
778 " .
$DB->DateToCharFunction(
"TC.DATE_TILL",
"FULL") .
" DATE_TILL,
789 SLA_ID = $sla AND $findD <= W_TIME_INC AND W_TIME_INC <= ($findD + 2*24*60*60)) PZ
790 ON TC.DATE_FROM = PZ.DF AND SLA_ID = $sla";
791 $q2 =
$DB->Query($strSql);
794 if($arrR2 = $q2->Fetch())
796 $ts =
MakeTimeStamp($arrR2[
"DATE_TILL"]) - (intval($arrR2[
"W_TIME_INC"]) - $findD);
797 $ts2010 = mktime(0, 0, 0, 1, 1, 2010);
807 $arOpt =
array(
"SLA" => $sla,
"PERIOD_MIN" => $periodMin0,
"DATE_FROM" => $dateFrom);
820 CAgent::RemoveAgent(
"CSupportTimetableCache::toCache();",
"support");
821 $NOTIFY_AGENT_ID = CAgent::AddAgent(
"CSupportTimetableCache::toCache();",
"support",
"N", 7*86400);
static ConvertResponseTimeUnit($rt, $rtu)
static RecalculateSupportDeadline($arFilter=array())
static isnull( $field, $alternative)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
MakeTimeStamp($datetime, $format=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"