1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
reminder.php
См. документацию.
1<?php
2
4
6{
7 public static function ConvertResponseTimeUnit($rt, $rtu)
8 {
9 switch($rtu)
10 {
11 case 'day': return intval($rt) * 1440;
12 case 'hour': return intval($rt) * 60;
13 case 'minute': return intval($rt);
14 }
15 return 0;
16 }
17
18 public static function RecalculateLastMessageDeadline($RSD = true)
19 {
20 global $DB;
21
22 $DB->StartUsingMasterOnly();
23
24 $strSql = "SELECT count(*) C FROM b_ticket";
25 $rs = $DB->Query($strSql);
26 $resC = $rs->Fetch();
27 if(!is_array($resC))
28 {
29 return true;
30 }
31
32 if(!isset($resC["C"]) || $resC["C"] == 0)
33 {
34 return true;
35 }
36
37 $strUsers = implode(",", CTicket::GetSupportTeamAndAdminUsers());
38 $strSql0 = "
39 b_ticket
40 INNER JOIN (
41 SELECT
42 T.ID TID,
43 M.DATE_CREATE DATE_CREATE,
44 M.ID ID,
45 " . CTicket::isnull("Q.LMBS", "'Y'") . " LMBS
46 FROM
47 b_ticket as T
48 LEFT JOIN (
49 SELECT
50 TM.TICKET_ID ID,
51 MIN(TM.ID) M_ID,
52 'N' LMBS
53 FROM
54 b_ticket_message TM
55 INNER JOIN (
56 SELECT
57 T.ID ID,
58 MAX(" . CTicket::isnull("TM.ID", "0") . ") M_ID
59 FROM
60 b_ticket T
61 LEFT JOIN b_ticket_message TM
62 ON T.ID = TM.TICKET_ID
63 AND (NOT(TM.IS_LOG='Y'))
64 AND (NOT(TM.IS_HIDDEN='Y'))
65 AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
66 AND TM.OWNER_USER_ID IN ($strUsers)
67 WHERE
68 T.DATE_CLOSE IS NULL
69 GROUP BY
70 T.ID
71 ) AS Q
72 ON TM.TICKET_ID = Q.ID
73 AND TM.ID > Q.M_ID
74 AND (NOT(TM.IS_LOG='Y'))
75 AND (NOT(TM.IS_HIDDEN='Y'))
76 AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
77 GROUP BY
78 TM.TICKET_ID
79 ) AS Q
80 ON T.ID = Q.ID
81 LEFT JOIN b_ticket_message AS M
82 ON Q.M_ID = M.ID
83 WHERE
84 T.DATE_CLOSE IS NULL
85 ) AS M
86 ON b_ticket.ID = M.TID
87 ";
88
89 $sql = "
90 UPDATE $strSql0
91 SET
92 b_ticket.D_1_USER_M_AFTER_SUP_M = M.DATE_CREATE,
93 b_ticket.ID_1_USER_M_AFTER_SUP_M = M.ID,
94 b_ticket.LAST_MESSAGE_BY_SUPPORT_TEAM = M.LMBS
95 ";
96
97 $res = $DB->Query($sql, true);
98
99 $res = $DB->Query("UPDATE b_ticket SET SUPPORT_DEADLINE = null, SUPPORT_DEADLINE_NOTIFY = null WHERE LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y'", true);
100
101 if($RSD)
102 {
104 }
105
106 $DB->StopUsingMasterOnly();
107
108 }
109
110 public static function RecalculateSupportDeadline($arFilter = array())
111 {
112 global $DB;
113
114 $arSqlSearch = Array();
115 if(!is_array($arFilter)) $arFilter = array();
116 foreach($arFilter as $key => $val)
117 {
118 if((is_array($val) && count($val) <= 0) || (!is_array($val) && (string) $val == '')) continue;
119 $key = mb_strtoupper($key);
120 if (is_array($val)) $val = implode(" | ",$val);
121 switch($key)
122 {
123 case "ID":
124 $arSqlSearch[] = GetFilterQuery("T.ID", $val, "N");
125 break;
126 case "SLA_ID":
127 $arSqlSearch[] = GetFilterQuery("T.SLA_ID", $val, "N");
128 break;
129 }
130 }
131 $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
132
133 $strSql = "
134 SELECT
135 T.ID ID,
136 T.SLA_ID,
137 " . $DB->DateToCharFunction("T.DEADLINE_SOURCE_DATE", "FULL") . " DEADLINE_SOURCE_DATE,
138 " . $DB->DateToCharFunction("T.D_1_USER_M_AFTER_SUP_M", "FULL") . " D_1_USER_M_AFTER_SUP_M,
139 T.IS_OVERDUE,
140 SLA.RESPONSE_TIME_UNIT,
141 SLA.RESPONSE_TIME,
142 SLA.NOTICE_TIME_UNIT,
143 SLA.NOTICE_TIME
144 FROM
145 b_ticket T
146 INNER JOIN b_ticket_sla SLA
147 ON T.SLA_ID = SLA.ID
148 AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
149 AND (T.DATE_CLOSE IS NULL)
150 WHERE
151 $strSqlSearch
152 ";
153 $rsTicket = $DB->Query($strSql);
154 while($arTicket = $rsTicket->Fetch())
155 {
157 }
158 }
159
160 /*$arTicket = ID,SLA_ID,RESPONSE_TIME, D_1_USER_M_AFTER_SUP_M, RESPONSE_TIME_UNIT, NOTICE_TIME, NOTICE_TIME_UNIT,DEADLINE_SOURCE_DATE
161 $dateType = CTicket::ADD, CTicket::UPDATE CTicket::DELETE, CTicket::IGNORE, CTicket::REOPEN, CTicket::NEW_SLA*/
162 public static function RecalculateSupportDeadlineForOneTicket($arTicket, $arFields = array(), $dateType = array("EVENT"=>array(CTicket::IGNORE)))
163 {
164 global $DB;
165
166 $currDateTS = time() + CTimeZone::GetOffset();
167 $ts2010 = mktime(0, 0, 0, 1, 1, 2010);
168 $supportDeadlineNotify = 0;
169 $ticketID = intval($arTicket["ID"]);
170 $slaID = intval($arTicket["SLA_ID"]);
171 $periodMin = self::ConvertResponseTimeUnit($arTicket["RESPONSE_TIME"], $arTicket["RESPONSE_TIME_UNIT"]);
172 $periodNMin = 0;
173 if($ticketID <= 0 || $slaID <= 0 || $periodMin <= 0 || intval($arTicket["D_1_USER_M_AFTER_SUP_M"]) <= 0)
174 {
175 if($ticketID > 0 && count($arFields) > 0)
176 {
177 $DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'");
178 }
179 return;
180 }
181
182 $periodNMinMinus = self::ConvertResponseTimeUnit($arTicket["NOTICE_TIME"], $arTicket["NOTICE_TIME_UNIT"]);
183 if($periodNMinMinus > 0 && $periodNMinMinus < $periodMin)
184 {
185 $periodNMin = $periodMin - $periodNMinMinus;
186 }
187
188 $newDate1UserMessAfterSupMessTS = MakeTimeStamp($arTicket["D_1_USER_M_AFTER_SUP_M"]);
189 $deadlineSourceDate = MakeTimeStamp($arTicket["DEADLINE_SOURCE_DATE"]);
190 if($deadlineSourceDate <= $ts2010)
191 {
192 if($newDate1UserMessAfterSupMessTS <= $ts2010)
193 {
194 $deadlineSourceDate = $currDateTS;
195 }
196 else
197 {
198 $deadlineSourceDate = $newDate1UserMessAfterSupMessTS;
199 }
200 $arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime($deadlineSourceDate,"FULL"));
201 }
202 $oldPeriodMin = null;
203 if(isset($dateType["EVENT"]) && in_array(CTicket::UPDATE, $dateType["EVENT"]))
204 {
205 if(isset($dateType["OLD_SLA_RESPONSE_TIME"]) && isset($dateType["OLD_SLA_RESPONSE_TIME_UNIT"]))
206 {
207 $oldPeriodMin = self::ConvertResponseTimeUnit($dateType["OLD_SLA_RESPONSE_TIME"], $dateType["OLD_SLA_RESPONSE_TIME_UNIT"]);
208 }
209
210 if(
211 in_array(CTicket::REOPEN, $dateType["EVENT"]) ||
212 (
213 in_array(CTicket::NEW_SLA, $dateType["EVENT"]) &&
214 ($arTicket["IS_OVERDUE"] != "Y") &&
215 ($oldPeriodMin != null) &&
216 ($oldPeriodMin > $periodMin)
217 )
218 )
219 {
220 $deadlineSourceDate = $currDateTS;
221 $arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime($deadlineSourceDate,"FULL"));
222 }
223 elseif(($arTicket["IS_OVERDUE"] != "Y") && ($newDate1UserMessAfterSupMessTS > $deadlineSourceDate))
224 {
225 $sla = CTicketSLA::getById($slaID)->Fetch();
226
227 if (empty($sla['DEADLINE_SOURCE']))
228 {
229 // default deadline calculation
230 // date of first client message after support message
231 $deadlineSourceDate = $newDate1UserMessAfterSupMessTS;
232 $arFields["DEADLINE_SOURCE_DATE"] = $arFields["D_1_USER_M_AFTER_SUP_M"];
233 }
234 }
235 }
236
237 $supportDeadlineTS = CSupportTimetableCache::getEndDate($slaID, $periodMin, GetTime($deadlineSourceDate,"FULL"));
238 $arFields["SUPPORT_DEADLINE"] = $DB->CharToDateFunction(GetTime($supportDeadlineTS, "FULL"));
239 $arFields["IS_OVERDUE"] = (($supportDeadlineTS <= $currDateTS) ? "'Y'" : "'N'");
240
241 // exec event and confirm if overdue
242 if ($arTicket['IS_OVERDUE'] == "N" && $arFields['IS_OVERDUE'] == "'Y'")
243 {
244 $rs = GetModuleEvents('support', 'OnBeforeTicketExpire');
245 while ($arr = $rs->Fetch())
246 {
248
249 if (!$arFields)
250 {
251 return false;
252 }
253 }
254 }
255
256
257 if($periodNMin > 0)
258 {
259 $supportDeadlineNotifyTS = CSupportTimetableCache::getEndDate($slaID, $periodNMin, GetTime($deadlineSourceDate,"FULL"));
260 $arFields["SUPPORT_DEADLINE_NOTIFY"] = $DB->CharToDateFunction(GetTime($supportDeadlineNotifyTS, "FULL"));
261 $arFields["IS_NOTIFIED"] = (($supportDeadlineNotifyTS <= $currDateTS) ? "'Y'" : "'N'");
262
263 // exec event and confirm if set notified
264 if ($arTicket['IS_NOTIFIED'] == "N" && $arFields['IS_NOTIFIED'] == "'Y'")
265 {
266 $rs = GetModuleEvents('support', 'OnBeforeTicketNotify');
267 while ($arr = $rs->Fetch())
268 {
270
271 if (!$arFields)
272 {
273 return false;
274 }
275 }
276 }
277 }
278
279 $DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'");
280 }
281
282 public static function SupportDeadline($arrTicket)
283 {
284 global $MESS, $DB;
285
286 $rsSite = CSite::GetByID($arrTicket["SITE_ID"]);
287 $arSite = $rsSite->Fetch();
288
289 //$oldMess = $MESS;
290
291 IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/support/classes/general/messages.php", $arSite["LANGUAGE_ID"]);
292
293 // update message params
295 "EXPIRE_AGENT_ID" => "null",
296 "IS_OVERDUE" => "'Y'",
297 "OVERDUE_MESSAGES" => "OVERDUE_MESSAGES + 1",
298 );
299
300 // execute event
301 $rs = GetModuleEvents('support', 'OnBeforeTicketExpire');
302 while ($arr = $rs->Fetch())
303 {
304 $arFields = ExecuteModuleEventEx($arr, array($arrTicket["ID"], $arFields));
305
306 if (!$arFields)
307 {
308 return false;
309 }
310 }
311
312 $DB->Update("b_ticket", $arFields, "WHERE ID='" . $arrTicket["ID"] . "'");
313
314 // add message log
315 $message = str_replace("#ID#", $arrTicket["TM_ID"], GetMessage("SUP_MESSAGE_OVERDUE_LOG"));
316 $message = str_replace("#NUMBER#", $arrTicket["TM_C_NUMBER"], $message);
317 $message .= "<br><li>" . htmlspecialcharsEx(str_replace("#VALUE#", $arrTicket["SLA_NAME"], GetMessage("SUP_SLA_LOG")));
318
319 if(intval($arrTicket["RESPONSIBLE_USER_ID"]) > 0)
320 {
321 $rsUser = CUser::GetByID(intval($arrTicket["RESPONSIBLE_USER_ID"]));
322 $arUser = $rsUser->Fetch();
323 $responsibleText = "[" . $arUser["ID"] . "] (" . $arUser["LOGIN"] . ") " . $arUser["NAME"] . " " . $arUser["LAST_NAME"];
324 $message .= "<li>".htmlspecialcharsEx(str_replace("#VALUE#", $responsibleText, GetMessage("SUP_RESPONSIBLE_LOG")));
325 }
326
328 "IS_LOG" => "Y",
329 "IS_OVERDUE" => "Y",
330 "MESSAGE_CREATED_USER_ID" => "null",
331 "MESSAGE_CREATED_MODULE_NAME" => "auto expiration",
332 "MESSAGE_CREATED_GUEST_ID" => "null",
333 "MESSAGE_SOURCE_ID" => "null",
334 "MESSAGE" => $message
335 );
336 $v = null;
337 $mid = CTicket::AddMessage($arrTicket['ID'], $arFields, $v, "N");
338
339 //$MESS = $oldMess;
340
341 }
342
343 public static function SupportDeadlineNotify($arrTicket0)
344 {
345 //SUPPORT_DEADLINE_NOTIFY
346 //SUPPORT_DEADLINE = EXPIRATION_DATE
347 //SUPPORT_DEADLINE_STMP = EXPIRATION_DATE_STMP
348
349 $rs = CTicket::GetByID($arrTicket0["ID"], false, "N");
350 if(!($arTicket = $rs->Fetch())) return false;
351
352 $rsMessage = CTicket::GetMessageByID(intval($arTicket["ID_1_USER_M_AFTER_SUP_M"]), "N", "N");
353 if(!($arMessage = $rsMessage->Fetch()))
354 {
355 return false;
356 }
357
358 $arMessage["EXPIRATION_DATE"] = $arrTicket0["SUPPORT_DEADLINE"];
359 $arMessage["EXPIRATION_DATE_STMP"] = MakeTimeStamp($arMessage["EXPIRATION_DATE"]);
360
361 //$SUPPORT_DEADLINE_STMP = MakeTimeStamp($arrTicket0["SUPPORT_DEADLINE"]);
362
363 $rsSite = CSite::GetByID($arTicket["SITE_ID"]);
364 $arSite = $rsSite->Fetch();
365
366 global $MESS, $DB;;
367 //$oldMess = $MESS;
368 IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/support/classes/general/messages.php", $arSite["LANGUAGE_ID"]);
369
370 $sourceName = $arTicket["SOURCE_NAME"] == '' ? "" : "[" . $arTicket["SOURCE_NAME"] . "] ";
371 if(intval($arTicket["OWNER_USER_ID"]) > 0 || trim($arTicket["OWNER_LOGIN"]) <> '')
372 {
373 $ownerText = "[" . $arTicket["OWNER_USER_ID"] . "] (" . $arTicket["OWNER_LOGIN"] . ") " . $arTicket["OWNER_NAME"];
374 //if(strlen(trim($OWNER_SID)) > 0 && $OWNER_SID != "null") $ownerText = " / " . $ownerText;
375 }
376
377 if(intval($arTicket["RESPONSIBLE_USER_ID"]) > 0)
378 {
379 $responsibleText = "[" . $arTicket["RESPONSIBLE_USER_ID"] . "] (" . $arTicket["RESPONSIBLE_LOGIN"] . ") " . $arTicket["RESPONSIBLE_NAME"];
380 if(CTicket::IsSupportTeam($arTicket["RESPONSIBLE_USER_ID"]) || CTicket::IsAdmin($arTicket["RESPONSIBLE_USER_ID"]))
381 {
382 $responsibleText .= " " . GetMessage("SUP_TECHSUPPORT_HINT");
383 }
384 }
385
386 $arAdminEMails = CTicket::GetAdminEmails();
387 if(count($arAdminEMails) > 0) $support_admin_email = implode(",", $arAdminEMails);
388
389 // prepare email to author
390 $arrOwnerEMail = array($arTicket["OWNER_EMAIL"]);
391 $arrEmails = explode(",", $arTicket["OWNER_SID"]);
392 if(is_array($arrEmails) && count($arrEmails) > 0)
393 {
394 foreach($arrEmails as $email)
395 {
396 $email = trim($email);
397 if($email <> '')
398 {
399 preg_match_all("#[<\[\‍(](.*?)[>\]\‍)]#iu", $email, $arr);
400 if(is_array($arr[1]) && count($arr[1]) > 0)
401 {
402 foreach($arr[1] as $email)
403 {
404 $email = trim($email);
405 if($email <> '' && !in_array($email, $arrOwnerEMail) && check_email($email))
406 {
407 $arrOwnerEMail[] = $email;
408 }
409 }
410 }
411 elseif(!in_array($email, $arrOwnerEMail) && check_email($email)) $arrOwnerEMail[] = $email;
412 }
413 }
414 }
415 TrimArr($arrOwnerEMail);
416 $ownerEmail = implode(", ", $arrOwnerEMail);
417
418 // prepare email to support
419 $support_email = $arTicket["RESPONSIBLE_EMAIL"];
420 if($support_email == '')
421 $support_email = $support_admin_email;
422 if($support_email == '')
423 $support_email = COption::GetOptionString("main", "email_from","");
424
425 $arr = explode(",", $support_email);
426 $arr = array_unique($arr);
427 $support_email = implode(",", $arr);
428 if(is_array($arr) && count($arr)>0)
429 {
430 foreach($arr as $email) unset($arAdminEMails[$email]);
431 }
432 $support_admin_email = implode(",", $arAdminEMails);
433
434 $createdModuleName = "";
435 if($arTicket["CREATED_MODULE_NAME"] == "support" || !mb_strlen($arTicket["CREATED_MODULE_NAME"]))
436 {
437 if(intval($arTicket["CREATED_USER_ID"]) > 0)
438 {
439 $createdText = "[" . $arTicket["CREATED_USER_ID"] . "] (" . $arTicket["CREATED_LOGIN"] . ") " . $arTicket["CREATED_NAME"];
440 if(CTicket::IsSupportTeam($arTicket["CREATED_USER_ID"]) || CTicket::IsAdmin($arTicket["CREATED_USER_ID"]))
441 {
442 $createdText .= " " . GetMessage("SUP_TECHSUPPORT_HINT");
443 }
444 }
445 }
446 else $createdModuleName = "[".$arTicket["CREATED_MODULE_NAME"]."]";
447
448 $MESSAGE = PrepareTxtForEmail($arMessage["MESSAGE"], $arSite["LANGUAGE_ID"], false, false);
449 $remainedTime = $arMessage["EXPIRATION_DATE_STMP"] - time();
450 if($remainedTime > 0)
451 {
452 $strRemainedTime = "";
453 $hours = intval($remainedTime / 3600);
454 if($hours > 0)
455 {
456 $strRemainedTime .= $hours . " " . GetMessage("SUP_HOUR") . " ";
457 $remainedTime = $remainedTime - $hours*3600;
458 }
459 $strRemainedTime .= intval($remainedTime / 60) . " " . GetMessage("SUP_MIN") . " ";
460 $strRemainedTime .= ($remainedTime % 60) . " " . GetMessage("SUP_SEC");
461 }
462
463 $arFields_notify = array(
464 "ID" => $arTicket["ID"],
465 "LANGUAGE_ID" => $arSite["LANGUAGE_ID"],
466 "DATE_CREATE" => $arTicket["DATE_CREATE"],
467 "TITLE" => $arTicket["TITLE"],
468 "STATUS" => $arTicket["STATUS_NAME"],
469 "CATEGORY" => $arTicket["CATEGORY_NAME"],
470 "CRITICALITY" => $arTicket["CRITICALITY_NAME"],
471 "DIFFICULTY" => $arTicket["DIFFICULTY_NAME"],
472 "RATE" => $arTicket["MARK_NAME"],
473 "SLA" => $arTicket["SLA_NAME"],
474 "SOURCE" => $sourceName,
475 "ADMIN_EDIT_URL" => "/bitrix/admin/ticket_edit.php",
476 "EXPIRATION_DATE" => $arMessage["EXPIRATION_DATE"],
477 "REMAINED_TIME" => $strRemainedTime,
478
479 "OWNER_EMAIL" => trim(trim($ownerEmail), ","),
480 "OWNER_USER_ID" => $arTicket["OWNER_USER_ID"],
481 "OWNER_USER_NAME" => $arTicket["OWNER_NAME"],
482 "OWNER_USER_LOGIN" => $arTicket["OWNER_LOGIN"],
483 "OWNER_USER_EMAIL" => $arTicket["OWNER_EMAIL"],
484 "OWNER_TEXT" => $ownerText,
485 "OWNER_SID" => $arTicket["OWNER_SID"],
486
487 "SUPPORT_EMAIL" => trim(trim($support_email), ","),
488 "RESPONSIBLE_USER_ID" => $arTicket["RESPONSIBLE_USER_ID"],
489 "RESPONSIBLE_USER_NAME" => $arTicket["RESPONSIBLE_NAME"],
490 "RESPONSIBLE_USER_LOGIN" => $arTicket["RESPONSIBLE_LOGIN"],
491 "RESPONSIBLE_USER_EMAIL" => $arTicket["RESPONSIBLE_EMAIL"],
492 "RESPONSIBLE_TEXT" => $responsibleText,
493 "SUPPORT_ADMIN_EMAIL" => trim(trim($support_admin_email), ","),
494
495 "CREATED_USER_ID" => $arTicket["CREATED_USER_ID"],
496 "CREATED_USER_LOGIN" => $arTicket["CREATED_LOGIN"],
497 "CREATED_USER_EMAIL" => $arTicket["CREATED_EMAIL"],
498 "CREATED_USER_NAME" => $arTicket["CREATED_NAME"],
499 "CREATED_MODULE_NAME" => $createdModuleName,
500 "CREATED_TEXT" => $createdText,
501
502 "MESSAGE_BODY" => $MESSAGE
503 );
504
505 //$MESS = $oldMess;
506
507 $arFields = array("NOTIFY_AGENT_ID" => "null", "IS_NOTIFIED" => "'Y'");
508
509 // execute event
510 $rs = GetModuleEvents('support', 'OnBeforeTicketNotify');
511 while ($arr = $rs->Fetch())
512 {
513 $arFields = ExecuteModuleEventEx($arr, array($arTicket["ID"], $arFields));
514
515 if (!$arFields)
516 {
517 return false;
518 }
519 }
520
521 // check value again and send notification
522 if (isset($arFields['IS_NOTIFIED']) && $arFields['IS_NOTIFIED'] === "'Y'")
523 {
524 CEvent::Send("TICKET_OVERDUE_REMINDER", $arTicket["SITE_ID"], $arFields_notify);
525 }
526
527 // event for notification
528
529 $DB->Update("b_ticket", $arFields, "WHERE ID='" . $arTicket["ID"] . "'");
530
531 $arFields = array("NOTIFY_AGENT_DONE" => "'Y'");
532 $DB->Update("b_ticket_message", $arFields, "WHERE ID='" . $arMessage["ID"] . "'");
533 }
534
535 public static function AgentFunction()
536 {
537 //IS_OVERDUE
538 //IS_NOTIFIED
539 //SUPPORT_DEADLINE
540 //SUPPORT_DEADLINE_NOTIFY
541 global $DB;
542
543 CTimeZone::Disable();
544 $cyrrDateTime = $DB->CharToDateFunction(GetTime(time(), "FULL"));
545 CTimeZone::Enable();
546
547 $strSql = "
548 SELECT
549 T.ID ID,
550 T.SITE_ID,
551 " . $DB->DateToCharFunction("T.SUPPORT_DEADLINE_NOTIFY", "FULL") . " SUPPORT_DEADLINE_NOTIFY,
552 " . $DB->DateToCharFunction("T.SUPPORT_DEADLINE", "FULL") . " SUPPORT_DEADLINE,
553 T.ID_1_USER_M_AFTER_SUP_M
554 FROM
555 b_ticket T
556 WHERE
557 T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
558 AND T.SUPPORT_DEADLINE_NOTIFY <= $cyrrDateTime
559 AND T.SUPPORT_DEADLINE_NOTIFY IS NOT NULL
560 AND T.ID_1_USER_M_AFTER_SUP_M > 0
561 AND T.IS_OVERDUE = 'N'
562 AND T.IS_NOTIFIED = 'N'
563 AND T.DATE_CLOSE IS NULL
564 ";
565 $rsTicket = $DB->Query($strSql);
566 while($arrTicket = $rsTicket->Fetch())
567 {
568 self::SupportDeadlineNotify($arrTicket);
569 }
570
571 $strSql = "
572 SELECT
573 T.*,
574 TM.ID TM_ID,
575 TM.C_NUMBER TM_C_NUMBER,
576 S.NAME SLA_NAME
577 FROM
578 b_ticket T
579 LEFT JOIN b_ticket_sla S
580 ON T.SLA_ID = S.ID
581 LEFT JOIN b_ticket_message TM
582 ON T.ID_1_USER_M_AFTER_SUP_M = TM.ID
583 WHERE
584 T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
585 AND T.SUPPORT_DEADLINE <= $cyrrDateTime
586 AND T.IS_OVERDUE = 'N'
587 AND T.DATE_CLOSE IS NULL
588 ";
589 $rsTicket = $DB->Query($strSql);
590
591 while($arrTicket = $rsTicket->Fetch())
592 {
593 self::SupportDeadline($arrTicket);
594 }
595 return "CTicketReminder::AgentFunction();";
596 }
597
598 public static function StartAgent()
599 {
600 CAgent::RemoveModuleAgents("support");
601 CAgent::AddAgent("CTicketReminder::AgentFunction();", "support", "N", 60);
602 CAgent::AddAgent('CTicket::CleanUpOnline();', 'support', 'N');
603 CAgent::AddAgent('CTicket::AutoClose();', 'support', 'N');
604 }
605}
static GetMessageByID($id, $checkRights="Y", $get_user_name="Y")
Определения support.php:1423
static IsSupportTeam($userID=false)
Определения support.php:114
const IGNORE
Определения support.php:13
static IsAdmin($userID=false)
Определения support.php:94
const REOPEN
Определения support.php:14
static GetSupportTeamAndAdminUsers()
Определения support.php:262
const UPDATE
Определения support.php:11
static GetByID($id, $lang=LANG, $checkRights="Y", $get_user_name="Y", $get_extra_names="Y", $arParams=Array())
Определения support.php:1428
const NEW_SLA
Определения support.php:15
static GetAdminEmails()
Определения support.php:251
Определения reminder.php:6
static RecalculateSupportDeadlineForOneTicket($arTicket, $arFields=array(), $dateType=array("EVENT"=>array(CTicket::IGNORE)))
Определения reminder.php:162
static AgentFunction()
Определения reminder.php:535
static SupportDeadlineNotify($arrTicket0)
Определения reminder.php:343
static ConvertResponseTimeUnit($rt, $rtu)
Определения reminder.php:7
static RecalculateSupportDeadline($arFilter=array())
Определения reminder.php:110
static RecalculateLastMessageDeadline($RSD=true)
Определения reminder.php:18
static StartAgent()
Определения reminder.php:598
static SupportDeadline($arrTicket)
Определения reminder.php:282
static getEndDate($sla, $periodMin0, $dateFrom, $secondTry=false)
Определения timetablecache.php:735
static AddMessage($ticketID, $arFields, &$arrFILES, $checkRights="Y")
Определения support.php:301
static isnull( $field, $alternative)
Определения support.php:6
$hours
Определения cron_html_pages.php:15
$arFields
Определения dblapprove.php:5
$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
global $MESS
Определения bill.php:2
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$mid
Определения options.php:27
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
TrimArr(&$arr, $trim_value=false)
Определения tools.php:2110
PrepareTxtForEmail($text, $lang=false, $convert_url_tag=true, $convert_image_tag=true)
Определения tools.php:2262
htmlspecialcharsEx($str)
Определения tools.php:2685
GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
Определения tools.php:1890
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
check_email($email, $strict=false, $domainCheck=false)
Определения tools.php:4571
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
$email
Определения payment.php:49
$message
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
</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
$val
Определения options.php:1793
$rs
Определения action.php:82
$arFilter
Определения user_search.php:106