1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
timetablecache.php
См. документацию.
1<?php
3
5{
6 static $cache = array(
7 "ID" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0, "AUTO_CALCULATED" => true),
8 "SLA_ID" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0),
9 "DATE_FROM" => array("TYPE" => CSupportTableFields::VT_DATE_TIME, "DEF_VAL" => null),
10 "DATE_TILL" => array("TYPE" => CSupportTableFields::VT_DATE_TIME, "DEF_VAL" => null),
11 "W_TIME" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0),
12 "W_TIME_INC" => array("TYPE" => CSupportTableFields::VT_NUMBER, "DEF_VAL" => 0),
13 );
14
15 const TIMETABLE_CACHE = "b_ticket_timetable_cache";
16 const SLA = " b_ticket_sla";
17 const SLA_SHEDULE = "b_ticket_sla_shedule";
18 const TICKET_HOLIDAYS = "b_ticket_holidays";
19 const SLA_2_HOLIDAYS = "b_ticket_sla_2_holidays";
20
21 static $arrH = null;
22 static $arrS = null;
23 static $timeZone = null;
24 static $timeZoneOffset = null;
25 static $MaxSlaResponseTime = null;
26
27 public static function Possible($d = "")
28 {
29 if(!class_exists('DateTime'))
30 {
31 return false;
32 }
33 try
34 {
35 if($d <> '')
36 {
37 $res = new DateTime($d);
38 }
39 else
40 {
41 $res = new DateTime(null, new DateTimeZone(date_default_timezone_get()));
42 }
43 }
44 catch(Exception $e)
45 {
46 return false;
47 }
48 return true;
49 }
50
51 static function GetTimeZone()
52 {
53 if(self::$timeZone === null)
54 {
55 if(self::Possible())
56 {
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);
60 }
61 }
62 return self::$timeZone;
63 }
64
65 static function GetTimeZoneOffset()
66 {
67 if(self::$timeZoneOffset === null)
68 {
69 if(self::Possible())
70 {
71 $localTime = new DateTime();
72 $localOffset = $localTime->getOffset();
73 $serverTime = new DateTime(null, self::GetTimeZone());
74 self::$timeZoneOffset = $serverTime->getOffset() - $localOffset;
75 }
76 else
77 {
78 self::$timeZoneOffset = 0;
79 }
80 }
81 return self::$timeZoneOffset;
82 }
83
84 static function TimeStampInCurrTimeZone($d, $fromUserTZ = false)
85 {
86 return MakeTimeStamp($d) + self::GetTimeZoneOffset() - ($fromUserTZ ? CTimeZone::GetOffset() : 0);
87 }
88
89 static function GetMaxSlaResponseTime()
90 {
91 global $DB;
92
93 if(self::$MaxSlaResponseTime != null)
94 {
95 return self::$MaxSlaResponseTime;
96 }
97
98 $tabNameSLA = self::SLA;
99 $strSql = "
100 SELECT
101 RESPONSE_TIME,
102 RESPONSE_TIME_UNIT
103 FROM
104 $tabNameSLA
105 ";
106 $q = $DB->Query($strSql);
107
108 self::$MaxSlaResponseTime = 0;
109 while ($arrR = $q->Fetch())
110 {
111 $ct = CTicketReminder::ConvertResponseTimeUnit($arrR["RESPONSE_TIME"], $arrR["RESPONSE_TIME_UNIT"]);
112 if(self::$MaxSlaResponseTime < $ct)
113 {
114 self::$MaxSlaResponseTime = $ct;
115 }
116 }
117 return self::$MaxSlaResponseTime;
118 }
119
120 static function GetNumberOfDaysForward()
121 {
122 $supportCacheDaysBackward = intval(COption::GetOptionString("support", "SUPPORT_CACHE_DAYS_BACKWARD", 0));
123 $slaDays = ceil(self::GetMaxSlaResponseTime() / 1440 * 5);
124 return max($supportCacheDaysBackward, $slaDays);
125 }
126
127 static function GetNumberOfDaysBackward()
128 {
129 $supportCacheDaysForward = intval(COption::GetOptionString("support", "SUPPORT_CACHE_DAYS_FORWARD", 0));
130 $slaDays = ceil(self::GetMaxSlaResponseTime() / 1440 * 5 + 20);
131 return max($supportCacheDaysForward, $slaDays);
132 }
133
134 static function GetDayBegin($d)
135 {
136 if(self::Possible("@" . $d))
137 {
138 $localTime = new DateTime("@" . $d);
139 $localTime->setTimezone(self::GetTimeZone());
140 $localTime->setTime(0, 0, 0);
141 return intval($localTime->format('U'));
142 }
143 else
144 {
145 return mktime(0, 0, 0, date("m", $d) , date("d", $d), date("Y", $d));
146 }
147 }
148
149 static function GetDayEnd($d)
150 {
151 if(self::Possible("@" . $d))
152 {
153 $localTime = new DateTime("@" . $d);
154 $localTime->setTimezone(self::GetTimeZone());
155 $localTime->setTime(23, 59, 59);
156 return intval($localTime->format('U'));
157 }
158 else
159 {
160 return mktime(23, 59, 59, date("m", $d) , date("d", $d), date("Y", $d));
161 }
162 }
163
164 static function GetDayNom($d)
165 {
166 if(self::Possible())
167 {
168 $localTime = new DateTime(null, self::GetTimeZone());
169 $localTime->setTimestamp($d);
170 $dayNom = intval($localTime->format("w")) - 1;
171 }
172 else
173 {
174 $dayNom = date("w", $d) - 1;
175 }
176 if($dayNom < 0)
177 {
178 $dayNom = 6;
179 }
180 return $dayNom;
181 }
182
183 static function GetHolidays($dateB, $dateE, $arrS, $arFilter)
184 {
185 global $DB;
186
187 $res = array();
188 $tabNameHolidays = self::TICKET_HOLIDAYS;
189 $tabNameS2H = self::SLA_2_HOLIDAYS;
190
191 $arSqlSearch = Array();
192 foreach($arFilter as $key => $val)
193 {
194
195 if((is_array($val) && count($val) <= 0) || (!is_array($val) && (string) $val == ''))
196 {
197 continue;
198 }
199 $key = mb_strtoupper($key);
200 if(is_array($val))
201 {
202 $val = implode(" | ", $val);
203 }
204 switch($key)
205 {
206 case "SLA_ID":
207 $arSqlSearch[] = GetFilterQuery("HS.SLA_ID", $val, "N");
208 break;
209 }
210
211 }
212 $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
213
214 CTimeZone::Disable();
215 $strSql = "
216 SELECT
217 HS.SLA_ID,
218 H.OPEN_TIME,
219 " . $DB->DateToCharFunction("H.DATE_FROM", "FULL") . " DATE_FROM,
220 " . $DB->DateToCharFunction("H.DATE_TILL", "FULL") . " DATE_TILL
221
222 FROM
223 $tabNameHolidays H
224 INNER JOIN $tabNameS2H HS
225 ON H.ID = HS.HOLIDAYS_ID AND HS.HOLIDAYS_ID > 0
226 WHERE
227 H.DATE_FROM > " . $DB->CharToDateFunction(GetTime($dateB, "FULL")) . "
228 AND H.DATE_FROM < " . $DB->CharToDateFunction(GetTime($dateE, "FULL")) . "
229 AND $strSqlSearch
230 ORDER BY
231 SLA_ID,DATE_FROM
232 ";
233 $q = $DB->Query($strSql);
234 CTimeZone::Enable();
235
236 $res0 = array();
237 $oldSLA = -1;
238 $goodSLA = array_keys($arrS);
239 while ($arrR = $q->Fetch())
240 {
241 if(!CSupportTools::array_keys_exists("SLA_ID,OPEN_TIME,DATE_FROM,DATE_TILL", $arrR) || !in_array($arrR["SLA_ID"], $goodSLA))
242 {
243 continue;
244 }
245 $cSLA = $arrR["SLA_ID"];
246 if($oldSLA != $cSLA)
247 {
248 if(count($res0) > 0) $res[$oldSLA] = self::MergeIntervalsH($res0, $arrS[$oldSLA]);
249 $res0 = array();
250 $oldSLA = $cSLA;
251 }
252 $cOT = $arrR["OPEN_TIME"];
253 $dtB = MakeTimeStamp($arrR["DATE_FROM"]);
254 $dtE = MakeTimeStamp($arrR["DATE_TILL"]);
255 $dtC = self::GetDayBegin($dtB);
256 while($dtC <= $dtE && $dtC <= $dateE)
257 {
258 $dtCB = self::GetDayBegin($dtC);
259 $dtCE = self::GetDayEnd($dtC);
260
261 if(substr_count($cOT, "WORKDAY_") > 0)
262 {
263 $WN = str_replace("WORKDAY_", "" , $cOT);
264 if($WN == "H")
265 {
266 $res0[$dtC]["W"][] = array("F" => (max($dtB, $dtCB) - $dtCB), "T" => (min($dtE, $dtCE) - $dtCB));
267 }
268 elseif(isset($arrS[$cSLA][$WN]))
269 {
270 if(count($arrS[$cSLA][$WN]) > 0)
271 {
272 foreach($arrS[$cSLA][$WN] as $k => $v)
273 {
274 $res0[$dtC]["W"][] = $v;
275 }
276 }
277 else
278 {
279 $res0[$dtC]["C"] = true;
280 }
281
282 }
283 }
284 else
285 {
286 if($cOT == "HOLIDAY_H")
287 {
288 $res0[$dtC]["H"][] = array("F" => (max($dtB, $dtCB) - $dtCB), "T" => (min($dtE, $dtCE) - $dtCB));
289 }
290 elseif($cOT == "HOLIDAY")
291 {
292 $res0[$dtC]["C"] = true;
293 }
294 }
295 $dtC += 24*60*60;
296 }
297
298 }
299 if(count($res0) > 0)
300 {
301 $res[$oldSLA] = self::MergeIntervalsH($res0, $arrS[$oldSLA]);
302 }
303
304 return $res;
305 }
306
307 function SortMethodH($a, $b)
308 {
309 if($a["F"] == $b["F"])
310 {
311 return 0;
312 }
313 return ($a["F"] < $b["F"]) ? -1 : 1;
314 }
315
316 static function MergeIntervalsH($arr, $arrS)
317 {
318 $res = array();
319 $arrW = array();
320 foreach($arr as $dtC => $v)
321 {
322 if(isset($v["C"]))
323 {
324 $res[$dtC] = array();
325 continue;
326 }
327 if(isset($v["W"]) && is_array($v["W"]) && count($v["W"]) > 0)
328 {
329 $arrW0 = $v["W"];
330 uasort($arrW0, array("self", "SortMethodH"));
331 $arrW = self::MergeIntervals($arrW0);
332 }
333 else
334 {
335 $arrW = $arrS[self::GetDayNom($dtC)];
336 }
337 $arrH0 = (isset($v["H"]) && is_array($v["H"]) && count($v["H"]) > 0) ? $v["H"] : array();
338 uasort($arrH0, array("self", "SortMethodH"));
339 $arrH = self::MergeIntervals($arrH0);
340
341 $h = $w = 0;
342 $wC = count($arrW) - 1;
343 $hC = count($arrH) - 1;
344 while(true)
345 {
346 if($w > $wC)
347 {
348 break;
349 }
350 if($h > $hC)
351 {
352 // остатки $wC в результат
353 for($i = $w; $i <= $wC; $i++) $res[$dtC][] = array("F" => $arrW[$i]["F"], "T" => $arrW[$i]["T"]);
354 break;
355 }
356
357 if($arrH[$h]["T"] < $arrW[$w]["T"])
358 {
359 if($arrW[$w]["F"] < $arrH[$h]["F"])
360 {
361 //h ---
362 //w -------
363 $res[$dtC][] = array("F" => $arrW[$w]["F"], "T" => $arrH[$h]["F"]);
364 $arrW[$w]["F"] = $arrH[$h]["T"];
365 }
366 else
367 {
368 //h --- | ---
369 //w --- | ---
370 $arrW[$w]["F"] = max($arrW[$w]["F"], $arrH[$h]["T"]);
371
372 }
373 $h++;
374 }
375 else
376 {
377 //h -----
378 //w ---
379 if(!($arrH[$h]["F"] <= $arrW[$w]["F"]))
380 {
381 //h --- | ---
382 //w --- | ---
383 $res[$dtC][] = array("F" => $arrW[$w]["F"], "T" => min($arrW[$w]["T"], $arrH[$h]["F"]));
384 }
385 $w++;
386 }
387 }
388 }
389 return $res;
390 }
391
392 static function InsertDefaultValues()
393 {
394 global $DB;
395
396 $t_sla_shedule = self::SLA_SHEDULE;
397
398 $arInsStr = array(
399 "SLA_ID" => 0,
400 "WEEKDAY_NUMBER" => 0,
401 "OPEN_TIME" => "'24H'",
402 "MINUTE_FROM" => 0,
403 "MINUTE_TILL" => 0,
404 "TIMETABLE_ID" => 0,
405
406 );
407
408 $strSql = "
409 SELECT
410 R.TIMETABLE_ID
411 FROM
412 (
413 SELECT
414 T.ID TIMETABLE_ID,
415 SUM(" . CTicket::isnull( "S.ID", 0 ) .") V
416 FROM
417 b_ticket_timetable T
418 LEFT JOIN $t_sla_shedule S
419 ON T.ID = S.TIMETABLE_ID AND S.TIMETABLE_ID > 0
420 GROUP BY
421 T.ID
422 ) R
423 WHERE
424 R.V = 0
425 ";
426 $q = $DB->Query($strSql);
427
428 while ($arrR = $q->Fetch())
429 {
430 for($i=0;$i<=6;$i++)
431 {
432 $arInsStr["WEEKDAY_NUMBER"] = $i;
433 $arInsStr["TIMETABLE_ID"] = intval($arrR["TIMETABLE_ID"]);
434 $DB->Insert($t_sla_shedule, $arInsStr);
435 }
436 }
437
438 }
439
440 static function GetShedule($arFilter)
441 {
442 global $DB;
443
444 $res = array();
445 $t_sla = self::SLA;
446 $t_sla_shedule = self::SLA_SHEDULE;
447
448 $arSqlSearch = Array();
449 foreach($arFilter as $key => $val)
450 {
451
452 if((is_array($val) && count($val) <= 0) || (!is_array($val) && (string) $val == ''))
453 {
454 continue;
455 }
456 $key = mb_strtoupper($key);
457 if(is_array($val))
458 {
459 $val = implode(" | ", $val);
460 }
461 switch($key)
462 {
463 case "SLA_ID":
464 $arSqlSearch[] = GetFilterQuery("SLA.ID", $val, "N");
465 break;
466 }
467
468 }
469 $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
470
471 $strSql = "
472 SELECT
473 SLA.ID SLA_ID,
474 S.WEEKDAY_NUMBER,
475 S.OPEN_TIME,
476 S.MINUTE_FROM,
477 S.MINUTE_TILL
478 FROM
479 $t_sla SLA
480 INNER JOIN $t_sla_shedule S
481 ON SLA.TIMETABLE_ID = S.TIMETABLE_ID AND S.TIMETABLE_ID > 0
482 WHERE
483 $strSqlSearch
484 ORDER BY
485 SLA_ID, WEEKDAY_NUMBER, MINUTE_FROM
486 ";
487 $q = $DB->Query($strSql);
488
489 if(intval($q->SelectedRowsCount()) <= 0)
490 {
492 $q = $DB->Query($strSql);
493 }
494
495 $res0 = array();
496 $noAdd = array();
497 $oldSLA = -1;
498 $oldWN = -1;
499 while ($arrR = $q->Fetch())
500 {
501 if(!CSupportTools::array_keys_exists("SLA_ID,WEEKDAY_NUMBER,OPEN_TIME", $arrR))
502 {
503 continue;
504 }
505 $cSLA = $arrR["SLA_ID"];
506 $cWN = intval($arrR["WEEKDAY_NUMBER"]);
507
508 if($oldSLA != $cSLA || $oldWN != $cWN)
509 {
510 if($oldSLA != -1)$res[$oldSLA][$oldWN] = self::MergeIntervals($res0);
511 $res0 = array();
512 $oldSLA = $cSLA;
513 $oldWN = $cWN;
514 }
515
516 $cOT = $arrR["OPEN_TIME"];
517 if(isset($noAdd[$cSLA][$cWN])) continue;
518
519 switch($cOT)
520 {
521 case "24H":
522 $res0 = array(0 => array("F" => 0, "T" => (24*60*60 - 1)));
523 $noAdd[$cSLA][$cWN] = true;
524 break;
525 case "CLOSED":
526 $res0 = array();
527 $noAdd[$cSLA][$cWN] = true;
528 break;
529 case "CUSTOM":
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));
531 break;
532 }
533
534 }
535 if($oldSLA > 0) $res[$oldSLA][$oldWN] = self::MergeIntervals($res0);
536 return $res;
537 }
538
539 static function MergeIntervals($arr)
540 {
541 if(count($arr) <= 0)
542 {
543 return array();
544 }
545 $r = array(0 => $arr[0]);
546 $i = 0;
547 foreach($arr as $k => $v)
548 {
549 if($r[$i]["T"] < $v["F"])
550 {
551 $r[++$i] = $v;
552 }
553 else
554 {
555 $r[$i]["T"] = max($r[$i]["T"], $v["T"]);
556 }
557 }
558 return $r;
559 }
560
561 static function TimeToStr($t)
562 {
563 $s = intval(fmod($t, 60));
564 $m = ($t - $s) / 60;
565 $h = ($t - $m*60 - $s)/3600;
566 return date("H:i", mktime($h, $m, 0, 1, 1, 2000));
567 }
568
569 public static function ToCache($arFilter = array(), $RSD = true, $arFromGetEndDate = null)
570 {
571 /*
572 $arFilter(
573 SLA => array()
574 )
575 */
576 global $DB;
577 $currD = time();
578 $uniq = "";
579 $dbType = mb_strtolower($DB->type);
580
581 if($dbType === "mysql")
582 {
583 $DB->StartUsingMasterOnly();
584
585 $uniq = COption::GetOptionString("main", "server_uniq_id", "");
586 if($uniq == '')
587 {
588 $uniq = md5(uniqid(rand(), true));
589 COption::SetOptionString("main", "server_uniq_id", $uniq);
590 }
591
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")
595 {
596 return;
597 }
598
599 //Перед пересчетом проверить в центральной базе что данных действительно нет, на случй здержки передачм данных в дочернюю базу(только для MYSQL)
600 if(is_array($arFromGetEndDate))
601 {
602 $res = self::getEndDate($arFromGetEndDate["SLA"], $arFromGetEndDate["PERIOD_MIN"], $arFromGetEndDate["DATE_FROM"], true);
603 if($res !== null)
604 {
605 return $res;
606 }
607 }
608 }
609
610 $timetable_cache = self::TIMETABLE_CACHE;
613
614 $dateF = self::GetDayBegin($currD - $ndB*24*60*60);
615 $dateT = self::GetDayEnd($currD + $ndF*24*60*60);
616
617 self::$arrS = self::GetShedule($arFilter);
618 if(count(self::$arrS) <= 0)
619 {
620 return null;
621 }
622 self::$arrH = self::GetHolidays(($dateF - 24*60*60), ($dateT + 24*60*60), self::$arrS, $arFilter);
623
624 $arrSLA = array_keys(self::$arrS);
625
626 $arSqlSearch = Array();
627 foreach($arFilter as $key => $val)
628 {
629 if((is_array($val) && count($val) <= 0) || (!is_array($val) && (string) $val == ''))
630 {
631 continue;
632 }
633 $key = mb_strtoupper($key);
634 if(is_array($val))
635 {
636 $val = implode(" | ", $val);
637 }
638
639 switch($key)
640 {
641 case "SLA_ID":
642 $arSqlSearch[] = GetFilterQuery("SLA_ID", $val, "N");
643 break;
644 }
645
646 }
647 $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
648
649 $DB->Query("DELETE FROM $timetable_cache WHERE $strSqlSearch");
650 $f = new CSupportTableFields(self::$cache);
651 $colNames = null;
652 $strList = "";
653 $coma = "";
654 foreach($arrSLA as $k => $sla)
655 {
656 $dateC = $dateF;
657 $sum = 0;
658 while($dateC <= $dateT)
659 {
660 if(isset(self::$arrH[$sla]) && array_key_exists($dateC, self::$arrH[$sla]))
661 {
662 $a = self::$arrH[$sla][$dateC];
663 }
664 else
665 {
666 $a = self::$arrS[$sla][self::GetDayNom($dateC)];
667 }
668 foreach($a as $k2 => $v2)
669 {
670 $sum = $sum + $v2["T"] - $v2["F"];
671 $f->SLA_ID = $sla;
672 $f->DATE_FROM = ($dateC + $v2["F"]);
673 $f->DATE_TILL = ($dateC + $v2["T"]);
674 $f->W_TIME = $v2["T"] - $v2["F"];
675 $f->W_TIME_INC = $sum;
676
677 CTimeZone::Disable();
678 if($dbType === "mysql")
679 {
680 $arCurrTicketFields = $f->ToArray(CSupportTableFields::ALL, array(), true);
681 if($colNames === null)
682 {
683 $colNames = implode(", ", array_keys($arCurrTicketFields));
684 }
685 $strCurrTicketFields = "(" . implode(",", $arCurrTicketFields) . ")";
686 if(mb_strlen($strList.", ".$strCurrTicketFields) > 2000)
687 {
688 $strSql = "INSERT INTO " . $timetable_cache . " (" . $colNames. ") VALUES " . $strList;
689 $strList = $strCurrTicketFields;
690 }
691 else
692 {
693 $strList .= $coma . $strCurrTicketFields;
694 $coma = ", ";
695 continue;
696 }
697 $DB->Query($strSql);
698 }
699 else
700 {
701 $DB->Insert($timetable_cache, $f->ToArray(CSupportTableFields::ALL, array(CSupportTableFields::NOT_NULL), true));
702 }
703 CTimeZone::Enable();
704 }
705 $dateC = self::GetDayBegin($dateC + 25*60*60);
706 }
707 }
708 if($dbType === "mysql")
709 {
710 if($strList <> '')
711 {
712 $strSql = "INSERT INTO " . $timetable_cache . " (" . $colNames. ") VALUES " . $strList;
713 $DB->Query($strSql);
714 }
715
716 $DB->Query("SELECT RELEASE_LOCK('" . $uniq . "_supportToCache')");
717 $DB->StopUsingMasterOnly();
718 //CAgent::AddAgent("CSupportTimetableCache::UpdateDiscardedTickets(" . $currD . ");", "support", "N", 5*60);
719 }
720
721
722 if($RSD)
723 {
725 }
726 return null;
727 }
728
730 {
731 return "";
732 }
733
734 //$dateFrom - время сервера с часовым поясом из настроек текущего пользователя
735 static function getEndDate($sla, $periodMin0, $dateFrom, $secondTry = false)
736 {
737 global $DB;
738
739 $sla = intval($sla);
740 $periodMin = intval($periodMin0) * 60;
741 $dateFromTS = MakeTimeStamp($dateFrom) - CTimeZone::GetOffset();
742 $timetableCache = self::TIMETABLE_CACHE;
743
744 CTimeZone::Disable();
745 $strSql = "
746 SELECT
747 TC.ID,
748 TC.SLA_ID,
749 " . $DB->DateToCharFunction("TC.DATE_FROM", "FULL") . " DATE_FROM,
750 " . $DB->DateToCharFunction("TC.DATE_TILL", "FULL") . " DATE_TILL,
751 TC.W_TIME,
752 TC.W_TIME_INC
753 FROM
754 $timetableCache TC
755 INNER JOIN (
756 SELECT
757 MAX(TC.DATE_FROM) MAX_DATE_FROM
758 FROM
759 $timetableCache TC
760 WHERE
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);
764 CTimeZone::Enable();
765
766 if($arrR = $q->Fetch())
767 {
768
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 ;
771
772 //CTimeZone::Disable();
773 $strSql = "
774 SELECT
775 TC.ID,
776 TC.SLA_ID,
777 " . $DB->DateToCharFunction("TC.DATE_FROM", "FULL") . " DATE_FROM,
778 " . $DB->DateToCharFunction("TC.DATE_TILL", "FULL") . " DATE_TILL,
779 TC.W_TIME,
780 TC.W_TIME_INC
781 FROM
782 $timetableCache TC
783 INNER JOIN (
784 SELECT
785 MIN(TC.DATE_FROM) DF
786 FROM
787 $timetableCache TC
788 WHERE
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);
792 //CTimeZone::Enable();
793
794 if($arrR2 = $q2->Fetch())
795 {
796 $ts = MakeTimeStamp($arrR2["DATE_TILL"]) - (intval($arrR2["W_TIME_INC"]) - $findD);
797 $ts2010 = mktime(0, 0, 0, 1, 1, 2010);
798 if($ts > $ts2010)
799 {
800 return $ts;
801 }
802 }
803 }
804
805 if(!$secondTry)
806 {
807 $arOpt = array("SLA" => $sla, "PERIOD_MIN" => $periodMin0, "DATE_FROM" => $dateFrom);
808 $res = self::ToCache(array( "SLA_ID"=> $sla ), false, $arOpt);
809 if($res !== null)
810 {
811 return $res;
812 }
813 return self::getEndDate($sla, $periodMin0, $dateFrom, true);
814 }
815 return null;
816 }
817
818 function StartAgent()
819 {
820 CAgent::RemoveAgent("CSupportTimetableCache::toCache();", "support");
821 $NOTIFY_AGENT_ID = CAgent::AddAgent("CSupportTimetableCache::toCache();", "support", "N", 7*86400);
822 }
823
824}
825?>
$sum
Определения checkout.php:6
static ConvertResponseTimeUnit($rt, $rtu)
Определения reminder.php:7
static RecalculateSupportDeadline($arFilter=array())
Определения reminder.php:110
const NOT_NULL
Определения tablefields.php:22
const VT_NUMBER
Определения tablefields.php:5
const ALL
Определения tablefields.php:28
const VT_DATE_TIME
Определения tablefields.php:10
static Possible($d="")
Определения timetablecache.php:27
static MergeIntervalsH($arr, $arrS)
Определения timetablecache.php:316
const SLA_SHEDULE
Определения timetablecache.php:17
static GetDayEnd($d)
Определения timetablecache.php:149
static GetHolidays($dateB, $dateE, $arrS, $arFilter)
Определения timetablecache.php:183
static GetShedule($arFilter)
Определения timetablecache.php:440
static TimeStampInCurrTimeZone($d, $fromUserTZ=false)
Определения timetablecache.php:84
const SLA_2_HOLIDAYS
Определения timetablecache.php:19
static TimeToStr($t)
Определения timetablecache.php:561
static $timeZoneOffset
Определения timetablecache.php:24
const TIMETABLE_CACHE
Определения timetablecache.php:15
static GetMaxSlaResponseTime()
Определения timetablecache.php:89
static GetTimeZone()
Определения timetablecache.php:51
static GetDayNom($d)
Определения timetablecache.php:164
static InsertDefaultValues()
Определения timetablecache.php:392
static GetTimeZoneOffset()
Определения timetablecache.php:65
static getEndDate($sla, $periodMin0, $dateFrom, $secondTry=false)
Определения timetablecache.php:735
const SLA
Определения timetablecache.php:16
SortMethodH($a, $b)
Определения timetablecache.php:307
static ToCache($arFilter=array(), $RSD=true, $arFromGetEndDate=null)
Определения timetablecache.php:569
static $cache
Определения timetablecache.php:6
static $timeZone
Определения timetablecache.php:23
static GetNumberOfDaysForward()
Определения timetablecache.php:120
const TICKET_HOLIDAYS
Определения timetablecache.php:18
static MergeIntervals($arr)
Определения timetablecache.php:539
static $MaxSlaResponseTime
Определения timetablecache.php:25
UpdateDiscardedTickets()
Определения timetablecache.php:729
static GetNumberOfDaysBackward()
Определения timetablecache.php:127
static $arrH
Определения timetablecache.php:21
static GetDayBegin($d)
Определения timetablecache.php:134
static $arrS
Определения timetablecache.php:22
static array_keys_exists($key, $arr, $more0="", $andOr="&&")
Определения tools.php:19
static isnull( $field, $alternative)
Определения support.php:6
$f
Определения component_props.php:52
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
GetFilterSqlSearch($arSqlSearch=array(), $FilterLogic="FILTER_logic")
Определения filter_tools.php:397
GetFilterQuery($field, $val, $procent="Y", $ex_sep=array(), $clob="N", $div_fields="Y", $clob_upper="N")
Определения filter_tools.php:383
$dbType
Определения autoload.php:6
global $DB
Определения cron_frame.php:29
GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
Определения tools.php:1890
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
$delta
Определения prolog_main_admin.php:363
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$i
Определения factura.php:643
</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."%"
Определения waybill.php:936
else $a
Определения template.php:137
$val
Определения options.php:1793
$k
Определения template_pdf.php:567
$arFilter
Определения user_search.php:106