- Модуль: support
- Путь к файлу: ~/bitrix/modules/support/classes/general/timetablecache.php
- Класс: CSupportTimetableCache
- Вызов: CSupportTimetableCache::GetHolidays
static function GetHolidays($dateB, $dateE, $arrS, $arFilter)
{
global $DB;
$err_mess = (self::err_mess())."
Function: getHolidays
Line: ";
$res = array();
$tabNameHolidays = self::TICKET_HOLIDAYS;
$tabNameS2H = self::SLA_2_HOLIDAYS;
$arSqlSearch = Array();
foreach($arFilter as $key => $val)
{
if((is_array($val) && count($val) <= 0) || (!is_array($val) && (string) $val == ''))
{
continue;
}
$key = mb_strtoupper($key);
if(is_array($val))
{
$val = implode(" | ", $val);
}
switch($key)
{
case "SLA_ID":
$arSqlSearch[] = GetFilterQuery("HS.SLA_ID", $val, "N");
break;
}
}
$strSqlSearch = GetFilterSqlSearch($arSqlSearch);
CTimeZone::Disable();
$strSql = "
SELECT
HS.SLA_ID,
H.OPEN_TIME,
" . $DB->DateToCharFunction("H.DATE_FROM", "FULL") . " DATE_FROM,
" . $DB->DateToCharFunction("H.DATE_TILL", "FULL") . " DATE_TILL
FROM
$tabNameHolidays H
INNER JOIN $tabNameS2H HS
ON H.ID = HS.HOLIDAYS_ID AND HS.HOLIDAYS_ID > 0
WHERE
H.DATE_FROM > " . $DB->CharToDateFunction(GetTime($dateB, "FULL")) . "
AND H.DATE_FROM < " . $DB->CharToDateFunction(GetTime($dateE, "FULL")) . "
AND $strSqlSearch
ORDER BY
SLA_ID,DATE_FROM
";
$q = $DB->Query($strSql, false, $err_mess.__LINE__);
CTimeZone::Enable();
$res0 = array();
$oldSLA = -1;
$goodSLA = array_keys($arrS);
while ($arrR = $q->Fetch())
{
if(!CSupportTools::array_keys_exists("SLA_ID,OPEN_TIME,DATE_FROM,DATE_TILL", $arrR) || !in_array($arrR["SLA_ID"], $goodSLA))
{
continue;
}
$cSLA = $arrR["SLA_ID"];
if($oldSLA != $cSLA)
{
if(count($res0) > 0) $res[$oldSLA] = self::MergeIntervalsH($res0, $arrS[$oldSLA]);
$res0 = array();
$oldSLA = $cSLA;
}
$cOT = $arrR["OPEN_TIME"];
$dtB = MakeTimeStamp($arrR["DATE_FROM"]);
$dtE = MakeTimeStamp($arrR["DATE_TILL"]);
$dtC = self::GetDayBegin($dtB);
while($dtC <= $dtE && $dtC <= $dateE)
{
$dtCB = self::GetDayBegin($dtC);
$dtCE = self::GetDayEnd($dtC);
if(substr_count($cOT, "WORKDAY_") > 0)
{
$WN = str_replace("WORKDAY_", "" , $cOT);
if($WN == "H")
{
$res0[$dtC]["W"][] = array("F" => (max($dtB, $dtCB) - $dtCB), "T" => (min($dtE, $dtCE) - $dtCB));
}
elseif(isset($arrS[$cSLA][$WN]))
{
if(count($arrS[$cSLA][$WN]) > 0)
{
foreach($arrS[$cSLA][$WN] as $k => $v)
{
$res0[$dtC]["W"][] = $v;
}
}
else
{
$res0[$dtC]["C"] = true;
}
}
}
else
{
if($cOT == "HOLIDAY_H")
{
$res0[$dtC]["H"][] = array("F" => (max($dtB, $dtCB) - $dtCB), "T" => (min($dtE, $dtCE) - $dtCB));
}
elseif($cOT == "HOLIDAY")
{
$res0[$dtC]["C"] = true;
}
}
$dtC += 24*60*60;
}
}
if(count($res0) > 0)
{
$res[$oldSLA] = self::MergeIntervalsH($res0, $arrS[$oldSLA]);
}
return $res;
}