11 case 'day':
return intval($rt) * 1440;
12 case 'hour':
return intval($rt) * 60;
13 case 'minute':
return intval($rt);
22 $DB->StartUsingMasterOnly();
24 $strSql =
"SELECT count(*) C FROM b_ticket";
32 if(!isset($resC[
"C"]) || $resC[
"C"] == 0)
43 M.DATE_CREATE DATE_CREATE,
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)
72 ON TM.TICKET_ID = Q.ID
74 AND (NOT(TM.IS_LOG='Y'))
75 AND (NOT(TM.IS_HIDDEN='Y'))
76 AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
81 LEFT JOIN b_ticket_message AS M
86 ON b_ticket.ID = M.TID
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
99 $res =
$DB->Query(
"UPDATE b_ticket SET SUPPORT_DEADLINE = null, SUPPORT_DEADLINE_NOTIFY = null WHERE LAST_MESSAGE_BY_SUPPORT_TEAM = 'Y'",
true);
106 $DB->StopUsingMasterOnly();
114 $arSqlSearch = Array();
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,
140 SLA.RESPONSE_TIME_UNIT,
142 SLA.NOTICE_TIME_UNIT,
146 INNER JOIN b_ticket_sla SLA
148 AND T.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
149 AND (T.DATE_CLOSE IS NULL)
153 $rsTicket =
$DB->Query($strSql);
154 while($arTicket = $rsTicket->Fetch())
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"]);
173 if($ticketID <= 0 || $slaID <= 0 || $periodMin <= 0 || intval($arTicket[
"D_1_USER_M_AFTER_SUP_M"]) <= 0)
177 $DB->Update(
"b_ticket",
$arFields,
"WHERE ID='" . $ticketID .
"'");
183 if($periodNMinMinus > 0 && $periodNMinMinus < $periodMin)
185 $periodNMin = $periodMin - $periodNMinMinus;
188 $newDate1UserMessAfterSupMessTS =
MakeTimeStamp($arTicket[
"D_1_USER_M_AFTER_SUP_M"]);
189 $deadlineSourceDate =
MakeTimeStamp($arTicket[
"DEADLINE_SOURCE_DATE"]);
190 if($deadlineSourceDate <= $ts2010)
192 if($newDate1UserMessAfterSupMessTS <= $ts2010)
194 $deadlineSourceDate = $currDateTS;
198 $deadlineSourceDate = $newDate1UserMessAfterSupMessTS;
200 $arFields[
"DEADLINE_SOURCE_DATE"] =
$DB->CharToDateFunction(
GetTime($deadlineSourceDate,
"FULL"));
202 $oldPeriodMin =
null;
203 if(isset($dateType[
"EVENT"]) && in_array(
CTicket::UPDATE, $dateType[
"EVENT"]))
205 if(isset($dateType[
"OLD_SLA_RESPONSE_TIME"]) && isset($dateType[
"OLD_SLA_RESPONSE_TIME_UNIT"]))
214 ($arTicket[
"IS_OVERDUE"] !=
"Y") &&
215 ($oldPeriodMin !=
null) &&
216 ($oldPeriodMin > $periodMin)
220 $deadlineSourceDate = $currDateTS;
221 $arFields[
"DEADLINE_SOURCE_DATE"] =
$DB->CharToDateFunction(
GetTime($deadlineSourceDate,
"FULL"));
223 elseif(($arTicket[
"IS_OVERDUE"] !=
"Y") && ($newDate1UserMessAfterSupMessTS > $deadlineSourceDate))
225 $sla = CTicketSLA::getById($slaID)->Fetch();
227 if (empty($sla[
'DEADLINE_SOURCE']))
231 $deadlineSourceDate = $newDate1UserMessAfterSupMessTS;
238 $arFields[
"SUPPORT_DEADLINE"] =
$DB->CharToDateFunction(
GetTime($supportDeadlineTS,
"FULL"));
239 $arFields[
"IS_OVERDUE"] = (($supportDeadlineTS <= $currDateTS) ?
"'Y'" :
"'N'");
242 if ($arTicket[
'IS_OVERDUE'] ==
"N" &&
$arFields[
'IS_OVERDUE'] ==
"'Y'")
260 $arFields[
"SUPPORT_DEADLINE_NOTIFY"] =
$DB->CharToDateFunction(
GetTime($supportDeadlineNotifyTS,
"FULL"));
261 $arFields[
"IS_NOTIFIED"] = (($supportDeadlineNotifyTS <= $currDateTS) ?
"'Y'" :
"'N'");
264 if ($arTicket[
'IS_NOTIFIED'] ==
"N" &&
$arFields[
'IS_NOTIFIED'] ==
"'Y'")
279 $DB->Update(
"b_ticket",
$arFields,
"WHERE ID='" . $ticketID .
"'");
286 $rsSite = CSite::GetByID($arrTicket[
"SITE_ID"]);
287 $arSite = $rsSite->Fetch();
295 "EXPIRE_AGENT_ID" =>
"null",
296 "IS_OVERDUE" =>
"'Y'",
297 "OVERDUE_MESSAGES" =>
"OVERDUE_MESSAGES + 1",
312 $DB->Update(
"b_ticket",
$arFields,
"WHERE ID='" . $arrTicket[
"ID"] .
"'");
315 $message = str_replace(
"#ID#", $arrTicket[
"TM_ID"],
GetMessage(
"SUP_MESSAGE_OVERDUE_LOG"));
319 if(intval($arrTicket[
"RESPONSIBLE_USER_ID"]) > 0)
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")));
330 "MESSAGE_CREATED_USER_ID" =>
"null",
331 "MESSAGE_CREATED_MODULE_NAME" =>
"auto expiration",
332 "MESSAGE_CREATED_GUEST_ID" =>
"null",
333 "MESSAGE_SOURCE_ID" =>
"null",
350 if(!($arTicket =
$rs->Fetch()))
return false;
353 if(!($arMessage = $rsMessage->Fetch()))
358 $arMessage[
"EXPIRATION_DATE"] = $arrTicket0[
"SUPPORT_DEADLINE"];
359 $arMessage[
"EXPIRATION_DATE_STMP"] =
MakeTimeStamp($arMessage[
"EXPIRATION_DATE"]);
363 $rsSite = CSite::GetByID($arTicket[
"SITE_ID"]);
364 $arSite = $rsSite->Fetch();
370 $sourceName = $arTicket[
"SOURCE_NAME"] ==
'' ?
"" :
"[" . $arTicket[
"SOURCE_NAME"] .
"] ";
371 if(intval($arTicket[
"OWNER_USER_ID"]) > 0 || trim($arTicket[
"OWNER_LOGIN"]) <>
'')
373 $ownerText =
"[" . $arTicket[
"OWNER_USER_ID"] .
"] (" . $arTicket[
"OWNER_LOGIN"] .
") " . $arTicket[
"OWNER_NAME"];
377 if(intval($arTicket[
"RESPONSIBLE_USER_ID"]) > 0)
379 $responsibleText =
"[" . $arTicket[
"RESPONSIBLE_USER_ID"] .
"] (" . $arTicket[
"RESPONSIBLE_LOGIN"] .
") " . $arTicket[
"RESPONSIBLE_NAME"];
382 $responsibleText .=
" " .
GetMessage(
"SUP_TECHSUPPORT_HINT");
387 if(
count($arAdminEMails) > 0) $support_admin_email = implode(
",", $arAdminEMails);
390 $arrOwnerEMail =
array($arTicket[
"OWNER_EMAIL"]);
391 $arrEmails = explode(
",", $arTicket[
"OWNER_SID"]);
392 if(is_array($arrEmails) &&
count($arrEmails) > 0)
394 foreach($arrEmails as
$email)
399 preg_match_all(
"#[<\[\(](.*?)[>\]\)]#iu",
$email,
$arr);
407 $arrOwnerEMail[] =
$email;
416 $ownerEmail = implode(
", ", $arrOwnerEMail);
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",
"");
425 $arr = explode(
",", $support_email);
427 $support_email = implode(
",",
$arr);
432 $support_admin_email = implode(
",", $arAdminEMails);
434 $createdModuleName =
"";
435 if($arTicket[
"CREATED_MODULE_NAME"] ==
"support" || !mb_strlen($arTicket[
"CREATED_MODULE_NAME"]))
437 if(intval($arTicket[
"CREATED_USER_ID"]) > 0)
439 $createdText =
"[" . $arTicket[
"CREATED_USER_ID"] .
"] (" . $arTicket[
"CREATED_LOGIN"] .
") " . $arTicket[
"CREATED_NAME"];
442 $createdText .=
" " .
GetMessage(
"SUP_TECHSUPPORT_HINT");
446 else $createdModuleName =
"[".$arTicket[
"CREATED_MODULE_NAME"].
"]";
448 $MESSAGE =
PrepareTxtForEmail($arMessage[
"MESSAGE"], $arSite[
"LANGUAGE_ID"],
false,
false);
449 $remainedTime = $arMessage[
"EXPIRATION_DATE_STMP"] - time();
450 if($remainedTime > 0)
452 $strRemainedTime =
"";
453 $hours = intval($remainedTime / 3600);
457 $remainedTime = $remainedTime -
$hours*3600;
459 $strRemainedTime .= intval($remainedTime / 60) .
" " .
GetMessage(
"SUP_MIN") .
" ";
460 $strRemainedTime .= ($remainedTime % 60) .
" " .
GetMessage(
"SUP_SEC");
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,
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"],
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),
","),
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,
502 "MESSAGE_BODY" => $MESSAGE
507 $arFields =
array(
"NOTIFY_AGENT_ID" =>
"null",
"IS_NOTIFIED" =>
"'Y'");
524 CEvent::Send(
"TICKET_OVERDUE_REMINDER", $arTicket[
"SITE_ID"], $arFields_notify);
529 $DB->Update(
"b_ticket",
$arFields,
"WHERE ID='" . $arTicket[
"ID"] .
"'");
532 $DB->Update(
"b_ticket_message",
$arFields,
"WHERE ID='" . $arMessage[
"ID"] .
"'");
543 CTimeZone::Disable();
544 $cyrrDateTime =
$DB->CharToDateFunction(
GetTime(time(),
"FULL"));
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
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
565 $rsTicket =
$DB->Query($strSql);
566 while($arrTicket = $rsTicket->Fetch())
575 TM.C_NUMBER TM_C_NUMBER,
579 LEFT JOIN b_ticket_sla S
581 LEFT JOIN b_ticket_message TM
582 ON T.ID_1_USER_M_AFTER_SUP_M = TM.ID
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
589 $rsTicket =
$DB->Query($strSql);
591 while($arrTicket = $rsTicket->Fetch())
595 return "CTicketReminder::AgentFunction();";
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');
static GetMessageByID($id, $checkRights="Y", $get_user_name="Y")
static IsSupportTeam($userID=false)
static IsAdmin($userID=false)
static GetSupportTeamAndAdminUsers()
static GetByID($id, $lang=LANG, $checkRights="Y", $get_user_name="Y", $get_extra_names="Y", $arParams=Array())
static RecalculateSupportDeadlineForOneTicket($arTicket, $arFields=array(), $dateType=array("EVENT"=>array(CTicket::IGNORE)))
static SupportDeadlineNotify($arrTicket0)
static ConvertResponseTimeUnit($rt, $rtu)
static RecalculateSupportDeadline($arFilter=array())
static RecalculateLastMessageDeadline($RSD=true)
static SupportDeadline($arrTicket)
static AddMessage($ticketID, $arFields, &$arrFILES, $checkRights="Y")
static isnull( $field, $alternative)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
$_SERVER["DOCUMENT_ROOT"]
ExecuteModuleEventEx($arEvent, $arParams=[])
TrimArr(&$arr, $trim_value=false)
PrepareTxtForEmail($text, $lang=false, $convert_url_tag=true, $convert_image_tag=true)
GetTime($timestamp, $type="SHORT", $site=false, $bSearchInSitesOnly=false)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
check_email($email, $strict=false, $domainCheck=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."%"