1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
support.php
См. документацию.
1<?
3
6
8{
9
10 const ADD = "ADD";
11 const UPDATE = "UPDATE";
12 const DELETE = "DELETE";
13 const IGNORE = "IGNORE";
14 const REOPEN = "REOPEN";
15 const NEW_SLA = "NEW_SLA";
16
17 /***************************************************************
18
19 Группа функций по работе с ролями на модуль
20
21 Идентификаторы ролей:
22
23 D - доступ закрыт
24 R - клиент техподдержки
25 T - сотрудник техподдержки
26 V - демо-доступ
27 W - администратор техподдержки
28
29 *****************************************************************/
30
31 public static function GetDeniedRoleID()
32 {
33 return "D";
34 }
35
36 public static function GetSupportClientRoleID()
37 {
38 return "R";
39 }
40
41 public static function GetSupportTeamRoleID()
42 {
43 return "T";
44 }
45
46 public static function GetDemoRoleID()
47 {
48 return "V";
49 }
50
51 public static function GetAdminRoleID()
52 {
53 return "W";
54 }
55
56 // возвращает true если заданный пользователь имеет заданную роль на модуль
57 public static function HaveRole($role, $userID=false)
58 {
60 if (!is_object($USER)) $USER = new CUser;
61
62 if ($userID===false && is_object($USER))
63 $uid = $USER->GetID();
64 else
65 $uid = $userID;
66
67 $arRoles = Array();
68 if (array_key_exists($uid, $SUPPORT_CACHE_USER_ROLES) && is_array($SUPPORT_CACHE_USER_ROLES[$uid]))
69 {
71 }
72 else
73 {
74 $arrGroups = Array();
75 if ($userID===false && is_object($USER))
76 $arrGroups = $USER->GetUserGroupArray();
77 else
78 $arrGroups = CUser::GetUserGroup($userID);
79
80 sort($arrGroups);
81 $arRoles = $APPLICATION->GetUserRoles("support", $arrGroups);
83 }
84
85 if (in_array($role, $arRoles))
86 return true;
87
88 return false;
89
90 }
91
92 // true - если пользователь имеет роль "администратор техподдержки"
93 // false - в противном случае
94 public static function IsAdmin($userID=false)
95 {
96 global $USER;
97
98 if ($userID===false && is_object($USER))
99 {
100 if ($USER->IsAdmin()) return true;
101 }
103 }
104
105 // true - если пользователь имеет роль "демо-доступ"
106 // false - в противном случае
107 public static function IsDemo($userID=false)
108 {
109 return CTicket::HaveRole(CTicket::GetDemoRoleID(), $userID);
110 }
111
112 // true - если пользователь имеет роль "сотрудник техподдержки"
113 // false - в противном случае
114 public static function IsSupportTeam($userID=false)
115 {
117 }
118
119 // true - если пользователь имеет роль "сотрудник техподдержки"
120 // false - в противном случае
121 public static function IsSupportClient($userID=false)
122 {
124 }
125
126 public static function IsOwner($ticketID, $userID=false)
127 {
128 global $DB, $USER;
129 if ($userID===false && is_object($USER)) $userID = $USER->GetID();
130 $userID = intval($userID);
131 $ticketID = intval($ticketID);
132 if ($userID<=0 || $ticketID<=0) return false;
133
134 $strSql = "SELECT 'x' FROM b_ticket WHERE ID=$ticketID and (OWNER_USER_ID=$userID or CREATED_USER_ID=$userID)";
135 $rs = $DB->Query($strSql);
136 if ($ar = $rs->Fetch()) return true;
137
138 return false;
139 }
140
141 // возвращает роли заданного пользователя
142 public static function GetRoles(&$isDemo, &$isSupportClient, &$isSupportTeam, &$isAdmin, &$isAccess, &$userID, $checkRights=true)
143 {
144 global $DB, $USER, $APPLICATION;
145 static $arTicketUserRoles;
146 $isDemo = $isSupportClient = $isSupportTeam = $isAdmin = $isAccess = false;
147 if (is_object($USER)) $userID = intval($USER->GetID()); else $userID = 0;
148 if ($checkRights)
149 {
150 if ($userID>0)
151 {
152 if (is_array($arTicketUserRoles) && in_array($userID, array_keys($arTicketUserRoles)))
153 {
154 $isDemo = $arTicketUserRoles[$userID]["isDemo"];
155 $isSupportClient = $arTicketUserRoles[$userID]["isSupportClient"];
156 $isSupportTeam = $arTicketUserRoles[$userID]["isSupportTeam"];
157 $isAdmin = $arTicketUserRoles[$userID]["isAdmin"];
158 }
159 else
160 {
161 $isDemo = CTicket::IsDemo($userID);
162 $isSupportClient = CTicket::IsSupportClient($userID);
163 $isSupportTeam = CTicket::IsSupportTeam($userID);
164 $isAdmin = CTicket::IsAdmin($userID);
165 $arTicketUserRoles[$userID] = array(
166 "isDemo" => $isDemo,
167 "isSupportClient" => $isSupportClient,
168 "isSupportTeam" => $isSupportTeam,
169 "isAdmin" => $isAdmin,
170 );
171 }
172 }
173 }
174 else $isAdmin = true;
175
176 if ($isDemo || $isSupportClient || $isSupportTeam || $isAdmin) $isAccess = true;
177 }
178
179 // возвращает массив ID групп для которых задана роль
180 // $role - идентификатор роли
181 public static function GetGroupsByRole($role)
182 {
183 //Todo: определиться с доступом по умолчанию
184
185 global $APPLICATION, $USER;
186 if (!is_object($USER)) $USER = new CUser;
187
188 $arGroups = array(); $arBadGroups = Array();
189 $res = $APPLICATION->GetGroupRightList(Array("MODULE_ID" => "support"/*, "G_ACCESS" => $role*/));
190 while($ar = $res->Fetch())
191 {
192 if ($ar["G_ACCESS"] == $role)
193 $arGroups[] = $ar["GROUP_ID"];
194 else
195 $arBadGroups[] = $ar["GROUP_ID"];
196 }
197
198 $right = COption::GetOptionString("support", "GROUP_DEFAULT_RIGHT", "D");
199 if ($right == $role)
200 {
201 $res = CGroup::GetList("dropdown", "asc", array("ACTIVE" => "Y"));
202 while ($ar = $res->Fetch())
203 {
204 if (!in_array($ar["ID"],$arGroups) && !in_array($ar["ID"],$arBadGroups))
205 $arGroups[] = $ar["ID"];
206 }
207 }
208
209 return $arGroups;
210
211 /*$arGroups = array();
212
213 $z = CGroup::GetList($v1="dropdown", $v2="asc", array("ACTIVE" => "Y"));
214 while($zr = $z->Fetch())
215 {
216 $arRoles = $APPLICATION->GetUserRoles("support", array(intval($zr["ID"])), "Y", "N");
217 if (in_array($role, $arRoles)) $arGroups[] = intval($zr["ID"]);
218 }
219
220 return array_unique($arGroups);*/
221 }
222
223 // возвращает массив групп с ролью "администратор техподдержки"
224 public static function GetAdminGroups()
225 {
227 }
228
229 // возвращает массив групп с ролью "сотрудник техподдержки"
230 public static function GetSupportTeamGroups()
231 {
233 }
234
235 // возвращает массив EMail адресов всех пользователей имеющих заданную роль
236 public static function GetEmailsByRole($role)
237 {
238 global $DB, $APPLICATION, $USER;
239 if (!is_object($USER)) $USER = new CUser;
240 $arEmail = array();
242 if (is_array($arGroups) && count($arGroups)>0)
243 {
244 $rsUser = CUser::GetList("id", "desc", array("ACTIVE" => "Y", "GROUPS_ID" => $arGroups));
245 while ($arUser = $rsUser->Fetch()) $arEmail[$arUser["EMAIL"]] = $arUser["EMAIL"];
246 }
247 return array_unique($arEmail);
248 }
249
250 // возвращает массив EMail'ов всех пользователей имеющих роль "администратор"
251 public static function GetAdminEmails()
252 {
254 }
255
256 // возвращает массив EMail'ов всех пользователей имеющих роль "сотрудник техподдержки"
257 public static function GetSupportTeamEmails()
258 {
260 }
261
262 public static function GetSupportTeamAndAdminUsers()
263 {
264 $arUser = array();
267 $sg = array();
268 if(is_array($stg))
269 {
270 $sg = array_merge($sg, $stg);
271 }
272 if(is_array($sag))
273 {
274 $sg = array_merge($sg, $sag);
275 }
276 if(count($sg) > 0)
277 {
278 $cU = CUser::GetList("id", "asc", array("ACTIVE" => "Y", "GROUPS_ID" => $sg));
279 while($arU = $cU->Fetch())
280 {
281 $arUser[] = intval($arU["ID"]);
282 }
283 }
284 //if(count($arUser) <= 0)
285 //{
286 $arUser[] = 1;
287 //}
288 return array_unique($arUser);
289 }
290
291 /*****************************************************************
292 Группа функций общие для всех классов
293 *****************************************************************/
294
295 // проверка полей фильтра
296 public static function CheckFilter($arFilter)
297 {
298 global $DB, $USER, $APPLICATION;
299 $str = "";
300 $arMsg = Array();
301
302 $arDATES = array(
303 "DATE_MODIFY_1",
304 "DATE_MODIFY_2",
305 "DATE_CREATE_1",
306 "DATE_CREATE_2",
307 );
308 foreach($arDATES as $key)
309 {
311 $arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_REQUIRED_".$key));
312 //$str.= GetMessage("SUP_ERROR_INCORRECT_".$key)."<br>";
313 }
314
315 if(!empty($arMsg))
316 {
317 $e = new CAdminException($arMsg);
318 $GLOBALS["APPLICATION"]->ThrowException($e);
319 return false;
320 }
321
322 return true;
323 }
324
325 // проверка полей перед вставкой в базу данных
326 public static function CheckFields($arFields, $id, $arRequired)
327 {
328 global $DB, $USER, $APPLICATION, $MESS;
329
330 $arMsg = Array();
331
332 // проверяем указанные обязательные поля
333 if (is_array($arRequired) && count($arRequired)>0)
334 {
335 foreach($arRequired as $key)
336 {
337 if ($id<=0 || ($id>0 && is_set($arFields, $key)))
338 {
339 if (!is_array($arFields[$key]) && ((string)$arFields[$key] == '' || $arFields[$key]==="NOT_REF"))
340 {
341 $arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_REQUIRED_".$key));
342 //$str.= GetMessage("SUP_ERROR_REQUIRED_".$key)."<br>";
343 }
344 }
345 }
346 }
347
348 // проверяем корректность дат
349 $arDate = array(
350 "DATE_CREATE",
351 "DATE_MODIFY",
352 "LAST_MESSAGE_DATE",
353 );
354 foreach($arDate as $key)
355 {
356 if ($arFields[$key] <> '')
357 {
359 $arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_INCORRECT_".$key));
360 //$str.= GetMessage("SUP_ERROR_INCORRECT_".$key)."<br>";
361 }
362 }
363
364 $arEmail = array(
365 "EMAIL",
366 );
367 foreach($arEmail as $key)
368 {
369 if ($arFields[$key] <> '')
370 {
372 $arMsg[] = array("id"=>$key, "text"=> GetMessage("SUP_ERROR_INCORRECT_".$key));
373 //$str.= GetMessage("SUP_ERROR_INCORRECT_".$key)."<br>";
374 }
375 }
376
377 if(!empty($arMsg))
378 {
379 $e = new CAdminException($arMsg);
380 $GLOBALS["APPLICATION"]->ThrowException($e);
381 return false;
382 }
383
384 return true;
385 }
386
387 // предварительно обрабатывает массив значений для вставки в базу данных
388 public static function PrepareFields($arFields, $table, $id)
389 {
390 global $DB, $USER, $APPLICATION;
391
392 $id = intval($id);
393 $arFields_i = array();
394
395 // числа
396 $arrNUMBER = array(
397 "SLA_ID",
398 "AGENT_ID",
399 "CATEGORY_ID",
400 "CRITICALITY_ID",
401 "STATUS_ID",
402 "MARK_ID",
403 "SOURCE_ID",
404 "DIFFICULTY_ID",
405 "DICTIONARY_ID",
406 "TICKET_ID",
407 "MESSAGE_ID",
408 "AUTO_CLOSE_DAYS",
409 "MESSAGES",
410 "OVERDUE_MESSAGES",
411 "EXTERNAL_ID",
412 "OWNER_USER_ID",
413 "OWNER_GUEST_ID",
414 "CREATED_USER_ID",
415 "CREATED_GUEST_ID",
416 "MODIFIED_USER_ID",
417 "MODIFIED_GUEST_ID",
418 "RESPONSIBLE_USER_ID",
419 "LAST_MESSAGE_USER_ID",
420 "LAST_MESSAGE_GUEST_ID",
421 "CURRENT_RESPONSIBLE_USER_ID",
422 "USER_ID",
423 "C_NUMBER",
424 "C_SORT",
425 "PRIORITY",
426 "RESPONSE_TIME",
427 "NOTICE_TIME",
428 "WEEKDAY_NUMBER",
429 "MINUTE_FROM",
430 "MINUTE_TILL",
431 "TIMETABLE_ID"
432 );
433 foreach($arrNUMBER as $key)
434 if (is_set($arFields, $key))
435 $arFields_i[$key] = ((string) $arFields[$key] <> '') ? intval($arFields[$key]) : "null";
436
437 // тип текста
438 $arrTYPE = array(
439 "PREVIEW_TYPE",
440 "DESCRIPTION_TYPE",
441 );
442 foreach($arrTYPE as $key)
443 if (is_set($arFields, $key))
444 $arFields_i[$key] = $arFields[$key]=="text" ? "'text'" : "'html'";
445
446 // булевые
447 $arrBOOLEAN = array(
448 "AUTO_CLOSED",
449 "IS_SPAM",
450 "LAST_MESSAGE_BY_SUPPORT_TEAM",
451 "IS_HIDDEN",
452 "IS_LOG",
453 "IS_OVERDUE",
454 "IS_SPAM",
455 "MESSAGE_BY_SUPPORT_TEAM",
456 "SET_AS_DEFAULT",
457 "AUTO_CLOSED",
458 "HOLD_ON",
459 "NOT_CHANGE_STATUS",
460 );
461 foreach($arrBOOLEAN as $key)
462 if (is_set($arFields, $key))
463 $arFields_i[$key] = $arFields[$key]=="Y" ? "'Y'" : "'N'";
464
465 // текст
466 $arrTEXT = array(
467 "OWNER_SID",
468 "LAST_MESSAGE_SID",
469 "SUPPORT_COMMENTS",
470 "MESSAGE",
471 "MESSAGE_SEARCH",
472 "EXTERNAL_FIELD_1",
473 "DESCR",
474 "DESCRIPTION",
475 );
476 foreach($arrTEXT as $key)
477 if (is_set($arFields, $key))
478 $arFields_i[$key] = ($arFields[$key] <> '') ? "'".$DB->ForSql($arFields[$key])."'" : "null";
479
480 // строка
481 $arrSTRING = array(
482 "NAME",
483 "TITLE",
484 "CREATED_MODULE_NAME",
485 "MODIFIED_MODULE_NAME",
486 "HASH",
487 "EXTENSION_SUFFIX",
488 "C_TYPE",
489 "SID",
490 "EVENT1",
491 "EVENT2",
492 "EVENT3",
493 "RESPONSE_TIME_UNIT",
494 "NOTICE_TIME_UNIT",
495 "OPEN_TIME",
496 "DEADLINE_SOURCE"
497 );
498 foreach($arrSTRING as $key)
499 if (is_set($arFields, $key))
500 $arFields_i[$key] = ($arFields[$key] <> '') ? "'".$DB->ForSql($arFields[$key], 255)."'" : "null";
501
502 // даты
503 $arDate = array(
504 "TIMESTAMP_X",
505 "DATE_CLOSE",
506 "LAST_MESSAGE_DATE",
507 );
508 foreach($arDate as $key)
509 if (is_set($arFields, $key))
510 $arFields_i[$key] = ($arFields[$key] <> '') ? $DB->CharToDateFunction($arFields[$key]) : "null";
511
512 /* изображения
513 $arIMAGE = array();
514 foreach($arIMAGE as $key)
515 {
516 if (is_set($arFields, $key))
517 {
518 if (is_array($arFields[$key]))
519 {
520 $arIMAGE = $arFields[$key];
521 $arIMAGE["MODULE_ID"] = "support";
522 $arIMAGE["del"] = $_POST[$key."_del"];
523 if ($id>0)
524 {
525 $rs = $DB->Query("SELECT $key FROM $table WHERE ID=$id");
526 $ar = $rs->Fetch();
527 $arIMAGE["old_file"] = $ar[$key];
528 }
529 if (strlen($arIMAGE["name"])>0 || strlen($arIMAGE["del"])>0)
530 {
531 $fid = CFile::SaveFile($arIMAGE, "support");
532 $arFields_i[$key] = (intval($fid)>0) ? intval($fid) : "null";
533 }
534 }
535 else
536 {
537 if ($id>0)
538 {
539 $rs = $DB->Query("SELECT $key FROM $table WHERE ID=$id");
540 $ar = $rs->Fetch();
541 if (intval($ar[$key])>0) CFile::Delete($ar[$key]);
542 }
543 $arFields_i[$key] = intval($arFields[$key]);
544 }
545 }
546 }*/
547
548 if (is_set($arFields, "CREATED_USER_ID"))
549 {
550 if (intval($arFields["CREATED_USER_ID"])>0) $arFields_i["CREATED_USER_ID"] = intval($arFields["CREATED_USER_ID"]);
551 }
552 elseif($id<=0 && $USER->IsAuthorized()) $arFields_i["CREATED_USER_ID"] = intval($USER->GetID());
553
554 if (is_set($arFields, "CREATED_GUEST_ID"))
555 {
556 if (intval($arFields["CREATED_GUEST_ID"])>0) $arFields_i["CREATED_GUEST_ID"] = intval($arFields["CREATED_GUEST_ID"]);
557 }
558 elseif($id<=0 && array_key_exists('SESS_GUEST_ID', $_SESSION)) $arFields_i["CREATED_GUEST_ID"] = intval($_SESSION["SESS_GUEST_ID"]);
559
560 if (is_set($arFields, "MODIFIED_USER_ID"))
561 {
562 if (intval($arFields["MODIFIED_USER_ID"])>0) $arFields_i["MODIFIED_USER_ID"] = intval($arFields["MODIFIED_USER_ID"]);
563 }
564 elseif ($USER->IsAuthorized()) $arFields_i["MODIFIED_USER_ID"] = intval($USER->GetID());
565
566 if (is_set($arFields, "MODIFIED_GUEST_ID"))
567 {
568 if (intval($arFields["MODIFIED_GUEST_ID"])>0) $arFields_i["MODIFIED_GUEST_ID"] = intval($arFields["MODIFIED_GUEST_ID"]);
569 }
570 elseif (array_key_exists('SESS_GUEST_ID', $_SESSION)) $arFields_i["MODIFIED_GUEST_ID"] = intval($_SESSION["SESS_GUEST_ID"]);
571
572 if (is_set($arFields, "DATE_CREATE"))
573 {
574 if ($arFields["DATE_CREATE"] <> '') $arFields_i["DATE_CREATE"] = $DB->CharToDateFunction($arFields["DATE_CREATE"]);
575 }
576 elseif ($id<=0) $arFields_i["DATE_CREATE"] = $DB->CurrentTimeFunction();
577
578
579 if (is_set($arFields, "LAST_MESSAGE_DATE"))
580 {
581 if ($arFields["LAST_MESSAGE_DATE"] <> '') $arFields_i["LAST_MESSAGE_DATE"] = $DB->CharToDateFunction($arFields["LAST_MESSAGE_DATE"]);
582 }
583 elseif ($id<=0) $arFields_i["LAST_MESSAGE_DATE"] = $DB->CurrentTimeFunction();
584
585
586
587 if (is_set($arFields, "DATE_MODIFY"))
588 {
589 if ($arFields["DATE_MODIFY"] <> '') $arFields_i["DATE_MODIFY"] = $DB->CharToDateFunction($arFields["DATE_MODIFY"]);
590 }
591 else $arFields_i["DATE_MODIFY"] = $DB->CurrentTimeFunction();
592
593 // убираем лишние поля для указанной таблицы
594 unset($arFields_i["ID"]);
595 $ar1 = $DB->GetTableFieldsList($table);
596 $ar2 = array_keys($arFields_i);
597 $arDiff = array_diff($ar2, $ar1);
598 if (is_array($arDiff) && count($arDiff)>0) foreach($arDiff as $value) unset($arFields_i[$value]);
599
600 return $arFields_i;
601 }
602
603 public static function SplitTicket($arParam)
604 {
605 global $DB;
606
607 $intLastTicketID = intval($arParam['SOURCE_TICKET_ID']);
608 $arTicket = CTicket::GetByID($intLastTicketID, $lang = LANG, $checkRights="N", $get_user_name="N", $get_extra_names="N")->Fetch();
609 $arSite = CSite::GetById($arTicket['SITE_ID'])->Fetch();
610 $stLastTicketTitle = htmlspecialcharsEx($arParam['SOURCE_TICKET_TITLE']);
611 $intSplitMesageID = intval($arParam['SOURCE_MESSAGE_NUM']);
612 $stSplitMesageDate = MakeTimeStamp($arParam['SOURCE_MESSAGE_DATE'], "DD.MM.YYYY HH:MI:SS") ? $arParam['SOURCE_MESSAGE_DATE'] : '';
613
614 \Bitrix\Main\Localization\Loc::loadLanguageFile($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/support/admin/ticket_edit.php', $arSite['LANGUAGE_ID']);
615
616 // add to the previous post about ticket allocation of posts in a separate branch
618 "MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
619 "MESSAGE_CREATED_MODULE_NAME" => "support",
620 "MESSAGE_CREATED_GUEST_ID" => "null",
621 "MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
622 "MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_USER_1", array("#MESSAGE_DATE#" => $stSplitMesageDate, "#TITLE#" => '# '.$arParam['SPLIT_TICKET_ID'].' "'.$arParam['SPLIT_TICKET_TITLE'].'"'), $arSite['LANGUAGE_ID']),
623 "LOG" => "N",
624 "HIDDEN" => "N",
625 "NOT_CHANGE_STATUS" => "Y",
626 "MESSAGE_AUTHOR_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
627 );
628 $arFiles = [];
629 CTicket::AddMessage($intLastTicketID, $arFields, $arFiles, "N");
630
631 // add to the previous post about ticket allocation of posts in a separate branch (support log)
632 $arFields_log = array(
633 "MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
634 "MESSAGE_CREATED_MODULE_NAME" => "support",
635 "MESSAGE_CREATED_GUEST_ID" => "null",
636 "MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
637 "MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_LOG_1", array("#MESSAGE_ID#" => $intSplitMesageID, "#TITLE#" => '<a href="ticket_edit.php?ID='.$arParam['SPLIT_TICKET_ID'].'&lang='.LANGUAGE_ID.'"> # '.$arParam['SPLIT_TICKET_ID'].' "'.$arParam['SPLIT_TICKET_TITLE'].'"</a>'), $arSite['LANGUAGE_ID']),
638 "LOG" => "Y",
639 );
640 $arFiles = [];
641 CTicket::AddMessage($intLastTicketID, $arFields_log, $arFiles, "N");
642
643 // add a new ticket allocation message posted in a separate branch
645 "MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
646 "MESSAGE_CREATED_MODULE_NAME" => "support",
647 "MESSAGE_CREATED_GUEST_ID" => "null",
648 "MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
649 "MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_USER_2", array("#MESSAGE_DATE#" => $stSplitMesageDate, "#TITLE#" => '# '.$intLastTicketID.' "'.$stLastTicketTitle.'"'), $arSite['LANGUAGE_ID']),
650 "LOG" => "N",
651 "HIDDEN" => "N",
652 "NOT_CHANGE_STATUS" => "Y",
653 "MESSAGE_AUTHOR_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
654 );
655 $arFiles = [];
656 CTicket::AddMessage($arParam['SPLIT_TICKET_ID'], $arFields, $arFiles, "N");
657
658 // add a new ticket allocation message posted in a separate branch (support log)
659 $arFields_log = array(
660 "MESSAGE_CREATED_USER_ID" => $arParam['SPLIT_MESSAGE_USER_ID'],
661 "MESSAGE_CREATED_MODULE_NAME" => "support",
662 "MESSAGE_CREATED_GUEST_ID" => "null",
663 "MESSAGE_SOURCE_ID" => $arParam['SOURCE_MESSAGE_ID'],
664 "MESSAGE" => \Bitrix\Main\Localization\Loc::getMessage("SUP_SPLIT_MESSAGE_LOG_2", array("#MESSAGE_ID#" => $intSplitMesageID, "#TITLE#" => '<a href="ticket_edit.php?ID='.$intLastTicketID.'&lang='.LANGUAGE_ID.'"> # '.$intLastTicketID.' "'.$stLastTicketTitle.'"</a>'), $arSite['LANGUAGE']),
665 "LOG" => "Y",
666 );
667 $arFiles = [];
668 CTicket::AddMessage($arParam['SPLIT_TICKET_ID'], $arFields_log, $arFiles, "N");
669
670 // If the message that we want to separate, there are attached files, copy them
671 if (isset($arParam['SPLIT_ATTACH_FILE']))
672 {
673 $res = CTicket::GetMessageList('ID', 'ASC', array('TICKET_ID'=>$arParam['SPLIT_TICKET_ID']));
674 $MESSAGE = $res->Fetch();
675 foreach($arParam['SPLIT_ATTACH_FILE'] as $key => $iAttachFile)
676 {
677 $fid = CFile::CopyFile(intval($iAttachFile));
678 if ($fid>0)
679 {
680 $arFields_fi = array(
681 "HASH" => "'".$DB->ForSql(md5(uniqid(mt_rand(), true).time()), 255)."'",
682 "MESSAGE_ID" => $MESSAGE['ID'],
683 "FILE_ID" => $fid,
684 "TICKET_ID" => $arParam['SPLIT_TICKET_ID'],
685 "EXTENSION_SUFFIX" => "null"
686 );
687 $DB->Insert("b_ticket_message_2_file",$arFields_fi);
688 }
689 }
690 }
691 }
692
693 /*****************************************************************
694 Группа функций по работе со спамом
695 *****************************************************************/
696
697 public static function MarkMessageAsSpam($messageID, $exactly="Y", $checkRights="Y")
698 {
699 global $DB, $USER;
700 $messageID = intval($messageID);
701 if ($messageID<=0) return;
702
703 $bAdmin = "N";
704 $bSupportTeam = "N";
705 if ($checkRights=="Y")
706 {
707 $bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
708 $bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
709 }
710 else
711 {
712 $bAdmin = "Y";
713 $bSupportTeam = "Y";
714 }
715
716 if (($bAdmin=="Y" || $bSupportTeam=="Y") && CModule::IncludeModule("mail"))
717 {
718 $exactly = ($exactly=="Y" && $bAdmin=="Y") ? "Y" : "N";
719 if ($rsMessage = CTicket::GetMessageByID($messageID, $checkRights))
720 {
721 if ($arMessage = $rsMessage->Fetch())
722 {
723 if ($arMessage["IS_LOG"]!="Y")
724 {
725 $email_id = intval($arMessage["EXTERNAL_ID"]);
726 $header = $arMessage["EXTERNAL_FIELD_1"];
727 $arFields = array("IS_SPAM" => "'".$exactly."'");
728 $DB->Update("b_ticket_message",$arFields,"WHERE ID=".$messageID);
729
730 $exactly = ($exactly=="Y") ? true : false;
731 $rsEmail = CMailMessage::GetByID($email_id);
732 if ($rsEmail->Fetch())
733 {
734 CMailMessage::MarkAsSpam($email_id, $exactly);
735 }
736 else
737 {
738 CmailFilter::MarkAsSpam($header." \n\r ".$arMessage["MESSAGE"], $exactly);
739 }
740 }
741 }
742 }
743 }
744 }
745
746 public static function UnMarkMessageAsSpam($messageID, $checkRights="Y")
747 {
748 global $DB, $USER;
749 $messageID = intval($messageID);
750 if ($messageID<=0) return;
751
752 $bAdmin = "N";
753 $bSupportTeam = "N";
754 if ($checkRights=="Y")
755 {
756 $bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
757 $bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
758 }
759 else
760 {
761 $bAdmin = "Y";
762 $bSupportTeam = "Y";
763 }
764
765 if (($bAdmin=="Y" || $bSupportTeam=="Y") && CModule::IncludeModule("mail"))
766 {
767 $rsMessage = CTicket::GetMessageByID($messageID, $checkRights);
768 if ($arMessage = $rsMessage->Fetch())
769 {
770 $arFields = array("IS_SPAM" => "null");
771 $DB->Update("b_ticket_message", $arFields, "WHERE ID=".$messageID);
772
773 $email_id = intval($arMessage["EXTERNAL_ID"]);
774 $header = $arMessage["EXTERNAL_FIELD_1"];
775 $rsEmail = CMailMessage::GetByID($email_id);
776 if ($rsEmail->Fetch())
777 {
778 CMailMessage::MarkAsSpam($email_id, false);
779 }
780 else
781 {
782 CmailFilter::DeleteFromSpamBase($header." \n\r ".$arMessage["MESSAGE"], true);
783 CmailFilter::MarkAsSpam($header." \n\r ".$arMessage["MESSAGE"], false);
784 }
785 }
786 }
787 }
788
789 public static function MarkAsSpam($ticketID, $exactly="Y", $checkRights="Y")
790 {
791 global $DB, $USER;
792 $ticketID = intval($ticketID);
793 if ($ticketID<=0) return;
794
795 $bAdmin = "N";
796 $bSupportTeam = "N";
797 if ($checkRights=="Y")
798 {
799 $bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
800 $bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
801 }
802 else
803 {
804 $bAdmin = "Y";
805 $bSupportTeam = "Y";
806 }
807
808 if ($bAdmin=="Y" || $bSupportTeam=="Y")
809 {
810 $exactly = ($exactly=="Y" && $bAdmin=="Y") ? "Y" : "N";
811
812 $arFilter = array("TICKET_ID" => $ticketID, "TICKET_ID_EXACT_MATCH" => "Y", "IS_LOG" => "N");
813 if ($rsMessages = CTicket::GetMessageList('', '', $arFilter, null, $checkRights))
814 {
815 // помечаем исходное сообщение
816 if ($arMessage = $rsMessages->Fetch())
817 {
818 CTicket::MarkMessageAsSpam($arMessage["ID"], $exactly, $checkRights);
819 }
820 }
821 $arFields = array("IS_SPAM" => "'".$exactly."'");
822 $DB->Update("b_ticket",$arFields,"WHERE ID=".$ticketID);
823 }
824 }
825
826 public static function UnMarkAsSpam($ticketID, $checkRights="Y")
827 {
828 global $DB, $USER;
829 $ticketID = intval($ticketID);
830 if ($ticketID<=0) return;
831
832 if ($checkRights=="Y")
833 {
834 $bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
835 $bSupportTeam = (CTicket::IsSupportTeam()) ? "Y" : "N";
836 }
837 else
838 {
839 $bAdmin = "Y";
840 $bSupportTeam = "Y";
841 }
842
843 if ($bAdmin=="Y" || $bSupportTeam=="Y")
844 {
845 $arFilter = array("TICKET_ID" => $ticketID, "TICKET_ID_EXACT_MATCH" => "Y");
846 if ($rsMessages = CTicket::GetMessageList('', '', $arFilter, null, $checkRights))
847 {
848 // снимаем отметку о спаме только у первого сообщения
849 if ($arMessage = $rsMessages->Fetch())
850 {
851 CTicket::UnMarkMessageAsSpam($arMessage["ID"], $checkRights);
852 }
853 }
854 $arFields = array("IS_SPAM" => "null");
855 $DB->Update("b_ticket",$arFields,"WHERE ID=".$ticketID);
856 }
857 }
858
859
860 /*****************************************************************
861 Группа функций по управлению обращениями
862 *****************************************************************/
863
864 /*function UpdateLastParams($ticketID, $resetAutoClose=false, $changeLastMessageDate = true, $setReopenDefault = true)
865 {
866 global $DB, $USER;
867 $ticketID = intval($ticketID);
868 if ($ticketID<=0) return;
869
870 $arFields = array();
871 //if ($resetAutoClose=="Y") $arFields["AUTO_CLOSE_DAYS"] = "null";
872
873
874 // определим последнего автора
875 $strSql = "
876 SELECT
877 ID,
878 ".$DB->DateToCharFunction("DATE_CREATE","FULL")." DATE_CREATE,
879 OWNER_USER_ID,
880 OWNER_GUEST_ID,
881 OWNER_SID
882 FROM
883 b_ticket_message
884 WHERE
885 TICKET_ID=$ticketID
886 AND(NOT(NOT_CHANGE_STATUS='Y'))
887 AND(NOT(IS_HIDDEN='Y'))
888 AND(NOT(IS_LOG='Y'))
889 AND(NOT(IS_OVERDUE='Y'))
890 ORDER BY
891 C_NUMBER desc
892 ";
893 $rs = $DB->Query($strSql);
894 if ($arLastMess = $rs->Fetch())
895 {
896 $arFields["LAST_MESSAGE_USER_ID"] = $arLastMess["OWNER_USER_ID"];
897 if ($changeLastMessageDate)
898 {
899 $arFields["LAST_MESSAGE_DATE"] = $DB->CharToDateFunction($arLastMess["DATE_CREATE"]);//NN
900 }
901 $arFields["LAST_MESSAGE_GUEST_ID"] = intval($arLastMess["OWNER_GUEST_ID"]);
902 $arFields["LAST_MESSAGE_SID"] = "'".$DB->ForSql($arLastMess["OWNER_SID"],255)."'";
903 }
904
905 // определим количество сообщений
906 $strSql = "
907 SELECT
908 SUM(CASE WHEN IS_HIDDEN='Y' THEN 0 ELSE 1 END) MESSAGES,
909 SUM(TASK_TIME) ALL_TIME
910 FROM
911 b_ticket_message
912 WHERE
913 TICKET_ID = $ticketID
914 and (IS_LOG='N' or IS_LOG is null or ".$DB->Length("IS_LOG")."<=0)
915 and (IS_OVERDUE='N' or IS_OVERDUE is null or ".$DB->Length("IS_OVERDUE")."<=0)
916 ";
917 $z = $DB->Query($strSql);
918 $zr = $z->Fetch();
919 $arFields["MESSAGES"] = intval($zr["MESSAGES"]);
920 $arFields["PROBLEM_TIME"] = intval($zr["ALL_TIME"]);
921
922
923 if ($setReopenDefault)
924 $arFields["REOPEN"] = "'N'";
925
926 /*
927 AUTO_CLOSE_DAYS
928 LAST_MESSAGE_DATE
929 LAST_MESSAGE_USER_ID
930 LAST_MESSAGE_GUEST_ID
931 LAST_MESSAGE_SID
932 MESSAGES
933 REOPEN
934 PROBLEM_TIME
935 *//*
936
937 $DB->Update("b_ticket",$arFields,"WHERE ID='".$ticketID."'");
938 }
939
940 //$dateType = CTicket::ADD, CTicket::DELETE, CTicket::CURRENT_DATE
941 function UpdateLastParams2($ticketID, $dateType)
942 {
943 global $DB;
944 $strUsers = implode(",", CTicket::GetSupportTeamAndAdminUsers());
945 $arFields=array();
946 $arFields["D_1_USER_M_AFTER_SUP_M"] = "null";
947 $arFields["ID_1_USER_M_AFTER_SUP_M"] = "null";
948 $arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] = "'Y'";
949 $arFields["SUPPORT_DEADLINE_NOTIFY"] = "null";
950 $arFields["SUPPORT_DEADLINE"] = "null";
951 $arFields["IS_OVERDUE"] = "'N'";
952 $arFields["IS_NOTIFIED"] = "'N'";
953
954 // Get last support response
955 $M_ID = 0;
956 $strSql = "
957 SELECT
958 T.ID ID,
959 MAX(TM.ID) M_ID
960 FROM
961 b_ticket T
962 INNER JOIN b_ticket_message TM
963 ON T.ID = TM.TICKET_ID
964 AND T.ID = $ticketID
965 AND TM.OWNER_USER_ID IN($strUsers)
966 AND (NOT(TM.IS_LOG='Y'))
967 AND (NOT(TM.IS_HIDDEN='Y'))
968 AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
969
970 GROUP BY
971 T.ID";
972
973 $rs = $DB->Query($strSql);
974 if($arrRs = $rs->Fetch())
975 {
976 if(intval($arrRs["M_ID"]) > 0)
977 {
978 $M_ID = intval($arrRs["M_ID"]);
979 }
980 }
981
982 // Get first user request after last support response
983 $strSql = "
984 SELECT
985 T.SLA_ID,
986 T.DATE_CLOSE,
987 " . $DB->DateToCharFunction("T.DEADLINE_SOURCE_DATE", "FULL") . " DEADLINE_SOURCE_DATE,
988 " . $DB->DateToCharFunction("T.D_1_USER_M_AFTER_SUP_M", "FULL") . " DATE_OLD,
989 T.IS_OVERDUE,
990 SLA.RESPONSE_TIME_UNIT,
991 SLA.RESPONSE_TIME,
992 SLA.NOTICE_TIME_UNIT,
993 SLA.NOTICE_TIME,
994 PZ2.M_ID,
995 PZ2.D_1_USER_M_AFTER_SUP_M
996 FROM
997 b_ticket T
998 INNER JOIN b_ticket_sla SLA
999 ON T.SLA_ID = SLA.ID
1000 AND T.ID = $ticketID
1001 LEFT JOIN (SELECT
1002 TM.ID M_ID,
1003 TM.TICKET_ID,
1004 " . $DB->DateToCharFunction("TM.DATE_CREATE", "FULL") . " D_1_USER_M_AFTER_SUP_M
1005 FROM
1006 b_ticket_message TM
1007 INNER JOIN (SELECT
1008 T.ID ID,
1009 MIN(TM.ID) M_ID
1010 FROM
1011 b_ticket T
1012 INNER JOIN b_ticket_message TM
1013 ON T.ID = TM.TICKET_ID
1014 AND T.ID = $ticketID
1015 AND TM.ID > $M_ID
1016 AND (NOT(TM.IS_LOG='Y'))
1017 AND (NOT(TM.NOT_CHANGE_STATUS='Y'))
1018 AND (NOT(TM.IS_HIDDEN='Y'))
1019
1020 GROUP BY
1021 T.ID) PZ
1022 ON TM.ID = PZ.M_ID) PZ2
1023 ON T.ID = PZ2.TICKET_ID
1024
1025 ";
1026 //AND (NOT(TM.IS_HIDDEN='Y'))
1027 $rs = $DB->Query($strSql);
1028 if(!($arrRs = $rs->Fetch()))
1029 {
1030 return;
1031 }
1032
1033 $isOverdue = false;
1034 if(intval($arrRs["M_ID"]) > 0)
1035 {
1036 $arFields["D_1_USER_M_AFTER_SUP_M"] = $DB->CharToDateFunction($arrRs["D_1_USER_M_AFTER_SUP_M"]);
1037 $arFields["ID_1_USER_M_AFTER_SUP_M"] = intval($arrRs["M_ID"]);
1038 $arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] = "'N'";
1039
1040 if($arrRs["IS_OVERDUE"] == "Y" && !(isset($dateType["EVENT"]) && in_array(CTicket::REOPEN, $dateType["EVENT"])))
1041 {
1042 unset($arFields["SUPPORT_DEADLINE_NOTIFY"]);
1043 unset($arFields["SUPPORT_DEADLINE"]);
1044 unset($arFields["IS_OVERDUE"]);
1045 unset($arFields["IS_NOTIFIED"]);
1046 $isOverdue = true;
1047 }
1048 }
1049
1050 if( !$isOverdue && intval($arrRs["DATE_CLOSE"]) <= 0 && $arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] == "'N'")
1051 {
1052 $arrRs["ID"] = $ticketID;
1053 CTicketReminder::RecalculateSupportDeadlineForOneTicket($arrRs, $arFields, $dateType);
1054 }
1055 else
1056 {
1057 if(isset($dateType["EVENT"]) && is_array($dateType["EVENT"]) && in_array(CTicket::REOPEN, $dateType["EVENT"]))
1058 {
1059 $arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime(time() + CTimeZone::GetOffset(),"FULL"));
1060 }
1061 $DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'");
1062 }
1063
1064 }*/
1065
1066 public static function UpdateLastParamsN($ticketID, $dateType, $recalculateSupportDeadline = true, $setReopenDefault = true)
1067 {
1068 global $DB, $USER;
1069 $ticketID = intval($ticketID);
1070 if ($ticketID<=0) return;
1071
1072 $arSupportTeam = CTicket::GetSupportTeamAndAdminUsers();
1073
1074 $arFields = array(
1075 "LAST_MESSAGE_DATE" => "null",
1076 "LAST_MESSAGE_USER_ID" => "null",
1077 "LAST_MESSAGE_GUEST_ID" => "null",
1078 "LAST_MESSAGE_SID" => "null",
1079 "D_1_USER_M_AFTER_SUP_M" => "null",
1080 "ID_1_USER_M_AFTER_SUP_M" => "null",
1081 "LAST_MESSAGE_BY_SUPPORT_TEAM" => "'Y'",
1082 );
1083 if ($setReopenDefault)
1084 {
1085 $arFields["REOPEN"] = "'N'";
1086 }
1087
1088 $DB->StartUsingMasterOnly();
1089
1090 $strSql = "
1091 SELECT
1092 T.ID,
1093 T.SLA_ID,
1094 T.DATE_CLOSE,
1095 " . $DB->DateToCharFunction("T.DEADLINE_SOURCE_DATE", "FULL") . " DEADLINE_SOURCE_DATE,
1096 " . $DB->DateToCharFunction("T.D_1_USER_M_AFTER_SUP_M", "FULL") . " DATE_OLD,
1097 T.IS_OVERDUE,
1098 SLA.RESPONSE_TIME_UNIT,
1099 SLA.RESPONSE_TIME,
1100 SLA.NOTICE_TIME_UNIT,
1101 SLA.NOTICE_TIME
1102 FROM
1103 b_ticket T
1104 INNER JOIN b_ticket_sla SLA
1105 ON T.SLA_ID = SLA.ID
1106 AND T.ID = $ticketID
1107 ";
1108 $rs = $DB->Query($strSql);
1109 $arTicket = $rs->Fetch();
1110 if(!$arTicket)
1111 {
1112 $DB->StopUsingMasterOnly();
1113 return;
1114 }
1115
1116 $arMessagesAll = array();
1117 $arLastMess = null;
1118 $arFirstUserMessAfterSupportMess = null;
1119 $allTime = 0;
1120 $messages = 0;
1121 $messAfterSupportMess = true;
1122
1123 $strSql = "
1124 SELECT
1125 ID,
1126 ".$DB->DateToCharFunction("DATE_CREATE","FULL")." DATE_CREATE,
1127 OWNER_USER_ID,
1128 OWNER_GUEST_ID,
1129 OWNER_SID,
1130 TASK_TIME,
1131 IS_OVERDUE,
1132 IS_HIDDEN,
1133 NOT_CHANGE_STATUS
1134 FROM
1135 b_ticket_message
1136 WHERE
1137 TICKET_ID=$ticketID
1138 AND(NOT(IS_LOG='Y'))
1139 ORDER BY
1140 C_NUMBER
1141 ";
1142 //NOT_CHANGE_STATUS
1143 //IS_HIDDEN
1144 //IS_OVERDUE
1145
1146 $rs = $DB->Query($strSql);
1147 $DB->StopUsingMasterOnly();
1148
1149 while($arM = $rs->Fetch())
1150 {
1151 $arMessagesAll[] = $arM;
1152 if($arM["IS_OVERDUE"] !== 'Y')
1153 {
1154 if($arM["IS_HIDDEN"] !== 'Y')
1155 {
1156 if($arM["NOT_CHANGE_STATUS"] !== 'Y')
1157 {
1158 $arLastMess = $arM;
1159 }
1160 $messages++;
1161 }
1162 $allTime += intval($arM["TASK_TIME"]);
1163 }
1164 if($arM["IS_HIDDEN"] !== 'Y' && $arM["NOT_CHANGE_STATUS"] !== 'Y')
1165 {
1166 if(in_array(intval($arM["OWNER_USER_ID"]), $arSupportTeam))
1167 {
1168 $arFirstUserMessAfterSupportMess = null;
1169 $messAfterSupportMess = true;
1170 }
1171 elseif($messAfterSupportMess)
1172 {
1173 $arFirstUserMessAfterSupportMess = $arM;
1174 $messAfterSupportMess = false;
1175 }
1176 }
1177 }
1178
1179 if($arLastMess !== null)
1180 {
1181 $arFields["LAST_MESSAGE_USER_ID"] = $arLastMess["OWNER_USER_ID"];
1182 //if ($changeLastMessageDate)
1183 //{
1184 $arFields["LAST_MESSAGE_DATE"] = $DB->CharToDateFunction($arLastMess["DATE_CREATE"]);
1185 //}
1186 $arFields["LAST_MESSAGE_GUEST_ID"] = intval($arLastMess["OWNER_GUEST_ID"]);
1187 $arFields["LAST_MESSAGE_SID"] = "'" . $DB->ForSql($arLastMess["OWNER_SID"], 255) . "'";
1188 }
1189 $arFields["MESSAGES"] = $messages;
1190 $arFields["PROBLEM_TIME"] = $allTime;
1191
1192 if($arFirstUserMessAfterSupportMess !== null)
1193 {
1194 $arFields["D_1_USER_M_AFTER_SUP_M"] = $DB->CharToDateFunction($arFirstUserMessAfterSupportMess["DATE_CREATE"]);
1195 $arFields["ID_1_USER_M_AFTER_SUP_M"] = intval($arFirstUserMessAfterSupportMess["ID"]);
1196 $arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] = "'N'";
1197 }
1198
1199 if(is_array($dateType["EVENT"]) && in_array(CTicket::REOPEN, $dateType["EVENT"]))
1200 {
1201 $arFields["DEADLINE_SOURCE_DATE"] = $DB->CharToDateFunction(GetTime(time() + CTimeZone::GetOffset(),"FULL"));
1202 }
1203 elseif($arTicket["IS_OVERDUE"] == "Y")
1204 {
1205 $recalculateSupportDeadline = false;
1206 }
1207
1208 $recalculateSupportDeadline = $recalculateSupportDeadline && (intval($arTicket["DATE_CLOSE"]) <= 0) && ($arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] == "'N'");
1209
1210 if(!$recalculateSupportDeadline)
1211 {
1212 if ($arFields["LAST_MESSAGE_BY_SUPPORT_TEAM"] == "'Y'" || intval($arTicket["DATE_CLOSE"]) > 0)
1213 {
1214 $arFields["SUPPORT_DEADLINE_NOTIFY"] = "null";
1215 $arFields["SUPPORT_DEADLINE"] = "null";
1216 $arFields["IS_OVERDUE"] = "'N'";
1217 $arFields["IS_NOTIFIED"] = "'N'";
1218 }
1219 }
1220
1221 $DB->Update("b_ticket", $arFields, "WHERE ID='" . $ticketID . "'");
1222
1223 if($recalculateSupportDeadline)
1224 {
1225 $arTicket["M_ID"] = $arFirstUserMessAfterSupportMess["ID"];
1226 $arTicket["D_1_USER_M_AFTER_SUP_M"] = $arFirstUserMessAfterSupportMess["DATE_CREATE"];
1228 }
1229
1230 /*
1231 LAST_MESSAGE_DATE
1232 LAST_MESSAGE_USER_ID
1233 LAST_MESSAGE_GUEST_ID
1234 LAST_MESSAGE_SID
1235 MESSAGES
1236 REOPEN
1237 PROBLEM_TIME
1238 D_1_USER_M_AFTER_SUP_M
1239 ID_1_USER_M_AFTER_SUP_M
1240 LAST_MESSAGE_BY_SUPPORT_TEAM
1241
1242 DEADLINE_SOURCE_DATE
1243 SUPPORT_DEADLINE_NOTIFY
1244 SUPPORT_DEADLINE
1245 IS_OVERDUE
1246 IS_NOTIFIED
1247 */
1248
1249 }
1250
1251 public static function UpdateMessages($ticketID)
1252 {
1253 global $DB;
1254 $ticketID = intval($ticketID);
1255 if ($ticketID<=0) return;
1256
1257 $arFields = array();
1258
1259 // определим количество сообщений
1260 $strSql = "
1261 SELECT
1262 SUM(CASE WHEN IS_HIDDEN='Y' THEN 0 ELSE 1 END) MESSAGES,
1263 SUM(TASK_TIME) ALL_TIME
1264 FROM
1265 b_ticket_message
1266 WHERE
1267 TICKET_ID = $ticketID
1268 and (IS_LOG='N' or IS_LOG is null or ".$DB->Length("IS_LOG")."<=0)
1269 and (IS_OVERDUE='N' or IS_OVERDUE is null or ".$DB->Length("IS_OVERDUE")."<=0)
1270 ";
1271 $z = $DB->Query($strSql);
1272 $zr = $z->Fetch();
1273 $arFields["MESSAGES"] = intval($zr["MESSAGES"]);
1274 $arFields["PROBLEM_TIME"] = intval($zr["ALL_TIME"]);
1275
1276 $DB->Update("b_ticket",$arFields,"WHERE ID='".$ticketID."'");
1277 }
1278
1279 public static function GetFileList($by = 's_id', $order = 'asc', $arFilter = [], $checkRights = 'N')
1280 {
1281 global $DB, $USER;
1282 $arSqlSearch = Array();
1283 $strSqlSearch = "";
1284 if (is_array($arFilter))
1285 {
1286 $filter_keys = array_keys($arFilter);
1287 $filterKeysCount = count($filter_keys);
1288 for ($i=0; $i<$filterKeysCount; $i++)
1289 {
1290 $key = $filter_keys[$i];
1291 $val = $arFilter[$filter_keys[$i]];
1292 if ((is_array($val) && count($val)<=0) || (!is_array($val) && ((string) $val == '' || $val==='NOT_REF')))
1293 continue;
1294 $match_value_set = (in_array($key."_EXACT_MATCH", $filter_keys)) ? true : false;
1295 $key = strtoupper($key);
1296 switch($key)
1297 {
1298 case "LINK_ID":
1299 $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
1300 $arSqlSearch[] = GetFilterQuery("MF.ID",$val,$match);
1301 break;
1302 case "MESSAGE":
1303 case "TICKET_ID":
1304 case "FILE_ID":
1305 case "HASH":
1306 case "MESSAGE_ID":
1307 $match = ($arFilter[$key."_EXACT_MATCH"]=="N" && $match_value_set) ? "Y" : "N";
1308 $arSqlSearch[] = GetFilterQuery("MF.".$key,$val,$match);
1309 break;
1310 }
1311 }
1312 }
1313 if ($by == "s_id") $strSqlOrder = "ORDER BY MF.ID";
1314 elseif ($by == "s_file_id") $strSqlOrder = "ORDER BY F.ID";
1315 elseif ($by == "s_message_id") $strSqlOrder = "ORDER BY MF.MESSAGE_ID";
1316 else
1317 {
1318 $strSqlOrder = "ORDER BY MF.ID";
1319 }
1320
1321 if ($order=="desc")
1322 {
1323 $strSqlOrder .= " desc ";
1324 }
1325 else
1326 {
1327 $strSqlOrder .= " asc ";
1328 }
1329
1330 $messageJoin = '';
1331 $ticketJoin = '';
1332
1333 if ($checkRights == 'Y')
1334 {
1335 $bAdmin = (CTicket::IsAdmin()) ? 'Y' : 'N';
1336 $bSupportTeam = (CTicket::IsSupportTeam()) ? 'Y' : 'N';
1337 $bSupportClient = (CTicket::IsSupportClient()) ? 'Y' : 'N';
1338 $bDemo = (CTicket::IsDemo()) ? 'Y' : 'N';
1339 $uid = intval($USER->GetID());
1340
1341 if ($bAdmin!='Y' && $bSupportTeam!='Y' && $bSupportClient!='Y' && $bDemo!='Y') return false;
1342
1343 if (!($bAdmin == 'Y' || $bDemo == 'Y'))
1344 {
1345 // a list of users who own or are responsible for tickets, which we can show to our current user
1346 $ticketUsers = array($uid);
1347
1348 // check if user has groups
1349 $result = $DB->Query('SELECT GROUP_ID FROM b_ticket_user_ugroup WHERE USER_ID = '.$uid.' AND CAN_VIEW_GROUP_MESSAGES = \'Y\'');
1350 if ($result)
1351 {
1352 // collect members of these groups
1353 $uGroups = array();
1354
1355 while ($row = $result->Fetch())
1356 {
1357 $uGroups[] = $row['GROUP_ID'];
1358 }
1359
1360 if (!empty($uGroups))
1361 {
1362 $result = $DB->Query('SELECT USER_ID FROM b_ticket_user_ugroup WHERE GROUP_ID IN ('.join(',', $uGroups).')');
1363 if ($result)
1364 {
1365 while ($row = $result->Fetch())
1366 {
1367 $ticketUsers[] = $row['USER_ID'];
1368 }
1369 }
1370 }
1371 }
1372
1373 // build sql
1374 $strSqlSearchUser = "";
1375
1376 if($bSupportTeam == 'Y')
1377 {
1378 $strSqlSearchUser = 'T.RESPONSIBLE_USER_ID IN ('.join(',', $ticketUsers).')';
1379 }
1380 elseif ($bSupportClient == 'Y')
1381 {
1382 $strSqlSearchUser = 'T.OWNER_USER_ID IN ('.join(',', $ticketUsers).')';
1383 }
1384
1385 if ($strSqlSearchUser)
1386 {
1387 $ticketJoin = 'INNER JOIN b_ticket T ON (T.ID = MF.TICKET_ID)';
1388 $arSqlSearch[] = $strSqlSearchUser;
1389 }
1390 }
1391
1392 if ($bSupportTeam!="Y" && $bAdmin!="Y" && $bDemo!='Y')
1393 {
1394 $messageJoin = 'INNER JOIN b_ticket_message M ON (M.ID = MF.MESSAGE_ID)';
1395
1396 $arSqlSearch[] = "M.IS_HIDDEN='N'";
1397 $arSqlSearch[] = "M.IS_LOG='N'";
1398 }
1399 }
1400
1401 $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
1402 $strSql = "
1403 SELECT
1404 F.*, ".$DB->DateToCharFunction("F.TIMESTAMP_X")." as TIMESTAMP_X,
1405 MF.ID as LINK_ID,
1406 MF.HASH,
1407 MF.MESSAGE_ID,
1408 MF.TICKET_ID,
1409 MF.EXTENSION_SUFFIX
1410 FROM
1411 b_ticket_message_2_file MF
1412 INNER JOIN b_file F ON (MF.FILE_ID = F.ID)
1413 $ticketJoin
1414 $messageJoin
1415 WHERE
1416 $strSqlSearch
1417 $strSqlOrder
1418 ";
1419 $res = $DB->Query($strSql);
1420 return $res;
1421 }
1422
1423 public static function GetMessageByID($id, $checkRights="Y", $get_user_name="Y")
1424 {
1425 return CTicket::GetMessageList('', '', array("ID" => $id, "ID_EXACT_MATCH" => "Y"), null, $checkRights, $get_user_name);
1426 }
1427
1428 public static function GetByID($id, $lang=LANG, $checkRights="Y", $get_user_name="Y", $get_extra_names="Y", $arParams = Array())
1429 {
1430 return CTicket::GetList('', '', array("ID" => $id, "ID_EXACT_MATCH" => "Y"), null, $checkRights, $get_user_name, $get_extra_names, $lang, $arParams);
1431 }
1432
1433 public static function getMaxId()
1434 {
1435 global $DB;
1436
1437 $id = null;
1438
1439 $result = $DB->Query("SELECT MAX(ID) as MAX_ID FROM b_ticket");
1440 if ($result)
1441 {
1442 $row = $result->Fetch();
1443 $id = $row['MAX_ID'];
1444 }
1445
1446 return $id;
1447 }
1448
1449 public static function Delete($ticketID, $checkRights="Y")
1450 {
1451 global $DB, $USER;
1452 $ticketID = intval($ticketID);
1453 if ($ticketID<=0) return;
1454 $bAdmin = "N";
1455 if ($checkRights=="Y")
1456 {
1457 $bAdmin = (CTicket::IsAdmin()) ? "Y" : "N";
1458 }
1459 else
1460 {
1461 $bAdmin = "Y";
1462 }
1463 if ($bAdmin=="Y")
1464 {
1465 if (CTicket::ExecuteEvents('OnBeforeTicketDelete', $ticketID, false) === false)
1466 return false;
1467 CTicket::ExecuteEvents('OnTicketDelete', $ticketID, false);
1468
1469 $strSql = "
1470 SELECT
1471 F.ID
1472 FROM
1473 b_ticket_message_2_file MF,
1474 b_file F
1475 WHERE
1476 MF.TICKET_ID = '$ticketID'
1477 and F.ID=MF.FILE_ID
1478 ";
1479 $z = $DB->Query($strSql);
1480 while ($zr = $z->Fetch()) CFile::Delete($zr["ID"]);
1481
1482 //CTicketReminder::Delete($ticketID);
1483 $DB->Query("DELETE FROM b_ticket_message_2_file WHERE TICKET_ID='$ticketID'");
1484 $DB->Query("DELETE FROM b_ticket_message WHERE TICKET_ID='$ticketID'");
1485 $GLOBALS["USER_FIELD_MANAGER"]->Delete("SUPPORT", $ticketID);
1486 $DB->Query("DELETE FROM b_ticket WHERE ID='$ticketID'");
1487
1489 {
1491 }
1492 }
1493 }
1494
1495 public static function UpdateOnline($ticketID, $userID=false, $currentMode="")
1496 {
1497 global $DB, $USER;
1498 if ($userID===false && is_object($USER)) $userID = $USER->GetID();
1499 $ticketID = intval($ticketID);
1500 $userID = intval($userID);
1501 if ($ticketID<=0 || $userID<=0) return;
1502 $arFields = array(
1503 "TIMESTAMP_X" => $DB->GetNowFunction(),
1504 "TICKET_ID" => $ticketID,
1505 "USER_ID" => $userID,
1506 );
1507 if ($currentMode!==false)
1508 {
1509 $arFields["CURRENT_MODE"] = $currentMode <> '' ? "'".$DB->ForSQL($currentMode, 20)."'" : "null";
1510 }
1511 $rows = $DB->Update("b_ticket_online", $arFields, "WHERE TICKET_ID=$ticketID and USER_ID=$userID");
1512 if (intval($rows)<=0)
1513 {
1514 $DB->Insert("b_ticket_online",$arFields);
1515 }
1516 }
1517
1518 public static function SetTicket($arFields, $ticketID="", $checkRights="Y", $sendEmailToAuthor="Y", $sendEmailToTechsupport="Y")
1519 {
1520 //global $DB;
1521 //$DB->DebugToFile = true;
1522 $messageID = null;
1523 $x = CTicket::Set($arFields, $messageID, $ticketID, $checkRights, $sendEmailToAuthor, $sendEmailToTechsupport);
1524 //$DB->DebugToFile = false;
1525 return $x;
1526 }
1527
1528 /*****************************************************************
1529 SET
1530 *****************************************************************/
1531
1532 public static function addSupportText($cn)
1533 {
1534 if($cn > 0 && (CTicket::IsSupportTeam($cn) || CTicket::IsAdmin($cn))) return " " . GetMessage("SUP_TECHSUPPORT_HINT");
1535 return "";
1536 }
1537
1538 public static function EmailsFromStringToArray($emails, $res = null)
1539 {
1540 if(!is_array($res)) $res = array();
1541 $arEmails = explode(",", $emails);
1542 if(is_array($arEmails) && count($arEmails) > 0)
1543 {
1544 foreach($arEmails as $email)
1545 {
1546 $email = trim($email);
1547 if($email <> '')
1548 {
1549 preg_match_all("#[<\[\‍(](.*?)[>\]\‍)]#iu", $email, $arr);
1550 if(is_array($arr[1]) && count($arr[1]) > 0)
1551 {
1552 foreach($arr[1] as $email)
1553 {
1554 $email = trim($email);
1555 if($email <> '' && !in_array($email, $res) && check_email($email))
1556 {
1557 $res[] = $email;
1558 }
1559 }
1560 }
1561 elseif(!in_array($email, $res) && check_email($email))
1562 {
1563 $res[] = $email;
1564 }
1565 }
1566 }
1567 }
1568 TrimArr($res);
1569 return $res;
1570 }
1571
1572 public static function GetCSupportTableFields($name, $arrOrTable = CSupportTableFields::C_Array)
1573 {
1580 $tables = array(
1581 "b_ticket" => array(
1582 "ID" => array("TYPE" => $n, "DEF_VAL" => 0, "AUTO_CALCULATED" => true),
1583 "SITE_ID" => array("TYPE" => $s, "DEF_VAL" => "", "MAX_STR_LEN" => 2),
1584 "DATE_CREATE" => array("TYPE" => $dt, "DEF_VAL" => null ),
1585 "DAY_CREATE" => array("TYPE" => $d, "DEF_VAL" => null ),
1586 "TIMESTAMP_X" => array("TYPE" => $dt, "DEF_VAL" => null ),
1587 "DATE_CLOSE" => array("TYPE" => $dt, "DEF_VAL" => null ),
1588 "AUTO_CLOSED" => array("TYPE" => $yn, "DEF_VAL" => null ),
1589 "AUTO_CLOSE_DAYS" => array("TYPE" => $n, "DEF_VAL" => null ),
1590 "SLA_ID" => array("TYPE" => $n, "DEF_VAL" => 1 ),
1591 "NOTIFY_AGENT_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1592 "EXPIRE_AGENT_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1593 "OVERDUE_MESSAGES" => array("TYPE" => $n, "DEF_VAL" => 0 ),
1594 "IS_NOTIFIED" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
1595 "IS_OVERDUE" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
1596 "CATEGORY_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1597 "CRITICALITY_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1598 "STATUS_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1599 "MARK_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1600 "SOURCE_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1601 "DIFFICULTY_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1602 "TITLE" => array("TYPE" => $s, "DEF_VAL" => "", "MAX_STR_LEN" => 255),
1603 "MESSAGES" => array("TYPE" => $n, "DEF_VAL" => 0 ),
1604 "IS_SPAM" => array("TYPE" => $ynn, "DEF_VAL" => null ),
1605 "OWNER_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1606 "OWNER_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1607 "OWNER_SID" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
1608 "CREATED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1609 "CREATED_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1610 "CREATED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => "support", "MAX_STR_LEN" => 255),
1611 "RESPONSIBLE_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1612 "MODIFIED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1613 "MODIFIED_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1614 "MODIFIED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
1615 "LAST_MESSAGE_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1616 "LAST_MESSAGE_GUEST_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1617 "LAST_MESSAGE_SID" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
1618 "LAST_MESSAGE_BY_SUPPORT_TEAM" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
1619 "LAST_MESSAGE_DATE" => array("TYPE" => $dt, "DEF_VAL" => null ),
1620 "SUPPORT_COMMENTS" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
1621 "PROBLEM_TIME" => array("TYPE" => $n, "DEF_VAL" => null ),
1622 "HOLD_ON" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
1623 "REOPEN" => array("TYPE" => $yn, "DEF_VAL" => "N" ),
1624 "COUPON" => array("TYPE" => $s, "DEF_VAL" => null, "MAX_STR_LEN" => 255),
1625 "DEADLINE_SOURCE_DATE" => array("TYPE" => $dt, "DEF_VAL" => null ),
1626 ),
1627
1628 "EventFields" => array(
1629 "ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1630 "LANGUAGE" => array("TYPE" => $s, "DEF_VAL" => null ),
1631 "LANGUAGE_ID" => array("TYPE" => $s, "DEF_VAL" => null ),
1632 "WHAT_CHANGE" => array("TYPE" => $s, "DEF_VAL" => null ),
1633 "DATE_CREATE" => array("TYPE" => $s, "DEF_VAL" => null ),
1634 "TIMESTAMP" => array("TYPE" => $s, "DEF_VAL" => null ),
1635 "DATE_CLOSE" => array("TYPE" => $s, "DEF_VAL" => null ),
1636 "TITLE" => array("TYPE" => $s, "DEF_VAL" => null ),
1637 "STATUS" => array("TYPE" => $s, "DEF_VAL" => null ),
1638 "DIFFICULTY" => array("TYPE" => $s, "DEF_VAL" => null ),
1639 "CATEGORY" => array("TYPE" => $s, "DEF_VAL" => null ),
1640 "CRITICALITY" => array("TYPE" => $s, "DEF_VAL" => null ),
1641 "RATE" => array("TYPE" => $s, "DEF_VAL" => null ),
1642 "SLA" => array("TYPE" => $s, "DEF_VAL" => null ),
1643 "SOURCE" => array("TYPE" => $s, "DEF_VAL" => null ),
1644 "MESSAGES_AMOUNT" => array("TYPE" => $s, "DEF_VAL" => null ),
1645 "SPAM_MARK" => array("TYPE" => $s, "DEF_VAL" => null ),
1646 "ADMIN_EDIT_URL" => array("TYPE" => $s, "DEF_VAL" => null ),
1647 "PUBLIC_EDIT_URL" => array("TYPE" => $s, "DEF_VAL" => null ),
1648 "OWNER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1649 "OWNER_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1650 "OWNER_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1651 "OWNER_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
1652 "OWNER_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1653 "OWNER_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
1654 "OWNER_SID" => array("TYPE" => $s, "DEF_VAL" => null ),
1655 "SUPPORT_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1656 "RESPONSIBLE_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1657 "RESPONSIBLE_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1658 "RESPONSIBLE_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
1659 "RESPONSIBLE_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1660 "RESPONSIBLE_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
1661 "SUPPORT_ADMIN_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1662 "CREATED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1663 "CREATED_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
1664 "CREATED_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1665 "CREATED_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1666 "CREATED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1667 "CREATED_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
1668 "MODIFIED_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1669 "MODIFIED_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
1670 "MODIFIED_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1671 "MODIFIED_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1672 "MODIFIED_MODULE_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1673 "MODIFIED_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
1674 "MESSAGE_AUTHOR_USER_ID" => array("TYPE" => $n, "DEF_VAL" => null ),
1675 "MESSAGE_AUTHOR_USER_NAME" => array("TYPE" => $s, "DEF_VAL" => null ),
1676 "MESSAGE_AUTHOR_USER_LOGIN" => array("TYPE" => $s, "DEF_VAL" => null ),
1677 "MESSAGE_AUTHOR_USER_EMAIL" => array("TYPE" => $s, "DEF_VAL" => null ),
1678 "MESSAGE_AUTHOR_TEXT" => array("TYPE" => $s, "DEF_VAL" => null ),
1679 "MESSAGE_AUTHOR_SID" => array("TYPE" => $s, "DEF_VAL" => null ),
1680 "MESSAGE_SOURCE" => array("TYPE" => $s, "DEF_VAL" => null ),
1681 "MESSAGE_HEADER" => array("TYPE" => $s, "DEF_VAL" => null ),
1682 "MESSAGE_BODY" => array("TYPE" => $s, "DEF_VAL" => null ),
1683 "MESSAGE_FOOTER" => array("TYPE" => $s, "DEF_VAL" => null ),
1684 "FILES" => array("TYPE" => $s, "DEF_VAL" => null ),
1685 "FILES_LINKS" => array("TYPE" => $s, "DEF_VAL" => null ),
1686 "IMAGE_LINK" => array("TYPE" => $s, "DEF_VAL" => null ),
1687 "SUPPORT_COMMENTS" => array("TYPE" => $s, "DEF_VAL" => null ),
1688 ),
1689
1690 );
1691
1692 if(!array_key_exists($name, $tables)) return null;
1693
1694 return new CSupportTableFields($tables[$name], $arrOrTable);
1695 }
1696
1697 public static function Set_getFilesLinks($arFiles, $lID)
1698 {
1699 // сформируем ссылки на прикрепленые файлы
1700 $fl = null;
1701 if(is_array($arFiles) && count($arFiles) > 0)
1702 {
1703 $fl = GetMessage("SUP_ATTACHED_FILES")."\n";
1704 foreach($arFiles as $arFile)
1705 {
1706 $fl .= (CMain::IsHTTPS()? "https" : "http")."://" . $_SERVER["HTTP_HOST"] . "/bitrix/tools/ticket_show_file.php?hash=" . $arFile["HASH"] . "&action=download&lang=" . $lID . "\n";
1707 }
1708 if ($fl <> '') $fl .= "\n";
1709 }
1710 return $fl;
1711 }
1712
1713 public static function Set_WriteLog($nf, $v, $mf)
1714 {
1715
1716 $change_log = "";
1717 $v->change = "";
1718 $v->change_hidden = "";
1719
1720 if($v->isNew) // NEW
1721 {
1722 $v->arChange = array();
1723 if($nf->SLA_NAME <> '') $v->arChange["SLA_ID"] = "Y";
1724 if($nf->CATEGORY_NAME <> '') $v->arChange["CATEGORY_ID"] = "Y";
1725 if($nf->CRITICALITY_NAME <> '') $v->arChange["CRITICALITY_ID"] = "Y";
1726 if($nf->STATUS_NAME <> '') $v->arChange["STATUS_ID"] = "Y";
1727 if($nf->DIFFICULTY_NAME <> '') $v->arChange["DIFFICULTY_ID"] = "Y";
1728 if($mf->RESPONSIBLE_TEXT <> '') $v->arChange["RESPONSIBLE_USER_ID"] = "Y";
1729 if($v->bActiveCoupon) $change_log .= "<li>" . htmlspecialcharsEx(GetMessage('SUP_IS_SUPER_COUPON', array('#COUPON#' => $v->V_COUPON)));
1730 }
1731
1732 if(!is_array($v->arChange) || count($v->arChange) <= 0) return;
1733
1734 foreach($v->arChange as $key => $value)
1735 {
1736 if ($value != "Y") continue;
1737
1738 switch ($key)
1739 {
1740 case "CLOSE":
1741 $v->change .= GetMessage("SUP_REQUEST_CLOSED")."\n";
1742 $change_log .= "<li>".GetMessage("SUP_REQUEST_CLOSED_LOG");
1743 break;
1744 case "OPEN":
1745 $v->change .= GetMessage("SUP_REQUEST_OPENED")."\n";
1746 $change_log .= "<li>".GetMessage("SUP_REQUEST_OPENED_LOG");
1747 break;
1748
1749 case "HOLD_ON_ON":
1750 $v->change .= GetMessage("SUP_HOLD_ON_ON") . "\n";
1751 $change_log .= "<li>" . GetMessage("SUP_HOLD_ON_ON_LOG");
1752 break;
1753 case "HOLD_ON_OFF":
1754 $v->change .= GetMessage("SUP_HOLD_ON_OFF") . "\n";
1755 $change_log .= "<li>" . GetMessage("SUP_HOLD_ON_OFF_LOG");
1756 break;
1757
1758 case "RESPONSIBLE_USER_ID":
1759 $v->change .= GetMessage("SUP_RESPONSIBLE_CHANGED") . "\n";
1760 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_RESPONSIBLE_CHANGED_LOG", array("#VALUE#" => $mf->RESPONSIBLE_TEXT)));
1761 break;
1762 case "CATEGORY_ID":
1763 $v->change .= GetMessage("SUP_CATEGORY_CHANGED") . "\n";
1764 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_CATEGORY_CHANGED_LOG", array("#VALUE#" => $nf->CATEGORY_NAME)));
1765 break;
1766 case "CRITICALITY_ID":
1767 $v->change .= GetMessage("SUP_CRITICALITY_CHANGED") . "\n";
1768 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_CRITICALITY_CHANGED_LOG", array("#VALUE#" => $nf->CRITICALITY_NAME)));
1769 break;
1770 case "STATUS_ID":
1771 $v->change .= GetMessage("SUP_STATUS_CHANGED") . "\n";
1772 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_STATUS_CHANGED_LOG", array("#VALUE#" => $nf->STATUS_NAME)));
1773 break;
1774 case "DIFFICULTY_ID":
1775 $v->change_hidden .= GetMessage("SUP_DIFFICULTY_CHANGED") . "\n";
1776 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_DIFFICULTY_CHANGED_LOG", array("#VALUE#" => $nf->DIFFICULTY_NAME)));
1777 break;
1778 case "MARK_ID":
1779 $v->change .= GetMessage("SUP_MARK_CHANGED") . "\n";
1780 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_MARK_CHANGED_LOG", array("#VALUE#" => $nf->MARK_NAME)));
1781 break;
1782 case "SLA_ID":
1783 $v->change .= GetMessage("SUP_SLA_CHANGED") . "\n";
1784 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_SLA_CHANGED_LOG", array("#VALUE#" => $nf->SLA_NAME)));
1785 break;
1786 case "TITLE":
1787 $v->change .= GetMessage("SUP_TITLE_CHANGED") . "\n";
1788 $change_log .= "<li>" . htmlspecialcharsEx(GetMessage("SUP_TITLE_CHANGED_LOG", array("#VALUE#" => $nf->TITLE)));
1789 break;
1790 case "MESSAGE":
1791 $v->change .= GetMessage("SUP_NEW_MESSAGE") . "\n";
1792 break;
1793 case "HIDDEN_MESSAGE":
1794 $v->change_hidden .= GetMessage("SUP_NEW_HIDDEN_MESSAGE")."\n";
1795 $line1 = str_repeat("=", 20);
1796 $line2 = str_repeat("=", 30);
1797 $mf->MESSAGE_HEADER = $line1 . " " . GetMessage("SUP_MAIL_HIDDEN_MESSAGE") . " " . $line2;
1798 break;
1799 }
1800 }
1801
1802 if(!$v->isNew) $mf->WHAT_CHANGE = $v->change; // UPDATE
1803
1804 // запишем изменения в лог
1805 if($change_log <> '')
1806 {
1807 $arFields_log = $v->arFields_log;
1808 $arFields_log["MESSAGE"] = $change_log;
1809 $q = null;
1810 $arFields_log["IS_LOG"] = "Y";
1811 CTicket::AddMessage($nf->ID, $arFields_log, $q, "N", $v->newSLA);
1812 }
1813
1814 }
1815
1816 public static function Set_sendMails($nf, $v, $arFields)
1817 {
1818 $I_Email = null;
1819 $U_Email = null;
1820 if(!$v->isNew) $U_Email = "Y"; // UPDATE
1821 else $I_Email = "Y";
1822
1823 IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/support/classes/general/messages.php", $v->arrSite["LANGUAGE_ID"]);
1824
1825 $mf = self::GetCSupportTableFields("EventFields");
1826
1827 $mf->ADMIN_EDIT_URL = "/bitrix/admin/ticket_edit.php";
1828 $mf->LANGUAGE = $v->arrSite["LANGUAGE_ID"];
1829 $mf->LANGUAGE_ID = $v->arrSite["LANGUAGE_ID"];
1830
1831 $arrSet = array(
1832 "ID" => "ID",
1833 "DATE_CREATE" => "DATE_CREATE",
1834 "TIMESTAMP" => "TIMESTAMP_X",
1835 "DATE_CLOSE" => "DATE_CLOSE",
1836 "TITLE" => "TITLE",
1837 "CATEGORY" => "CATEGORY_NAME",
1838 "CRITICALITY" => "CRITICALITY_NAME",
1839 "DIFFICULTY" => "DIFFICULTY_NAME",
1840 "STATUS" => "STATUS_NAME",
1841 "SLA" => "SLA_NAME",
1842 "OWNER_USER_ID" => "OWNER_USER_ID",
1843 "OWNER_GUEST_ID" => "OWNER_GUEST_ID",
1844 "OWNER_SID" => "OWNER_SID",
1845 "OWNER_USER_NAME" => "OWNER_NAME",
1846 "OWNER_USER_LOGIN" => "OWNER_LOGIN",
1847 "OWNER_USER_EMAIL" => "OWNER_EMAIL",
1848 "RESPONSIBLE_USER_ID" => "RESPONSIBLE_USER_ID",
1849 "RESPONSIBLE_USER_NAME" => "RESPONSIBLE_NAME",
1850 "RESPONSIBLE_USER_LOGIN" => "RESPONSIBLE_LOGIN",
1851 "RESPONSIBLE_USER_EMAIL" => "RESPONSIBLE_EMAIL",
1852 "CREATED_USER_ID" => "CREATED_USER_ID",
1853 "CREATED_GUEST_ID" => "CREATED_GUEST_ID",
1854 "CREATED_USER_LOGIN" => "CREATED_LOGIN",
1855 "CREATED_USER_EMAIL" => "CREATED_EMAIL",
1856 "CREATED_USER_NAME" => "CREATED_NAME"
1857 );
1858
1859 if(!$v->isNew) // UPDATE
1860 {
1861 $arrSet["MODIFIED_USER_ID"] = "MODIFIED_USER_ID";
1862 $arrSet["MODIFIED_GUEST_ID"] = "MODIFIED_GUEST_ID";
1863 $arrSet["MODIFIED_USER_LOGIN"] = "MODIFIED_LOGIN";
1864 $arrSet["MODIFIED_USER_EMAIL"] = "MODIFIED_EMAIL";
1865 $arrSet["MODIFIED_USER_NAME"] = "MODIFIED_NAME";
1866 $arrSet["RATE"] = "MARK_NAME";
1867 $arrSet["MESSAGES_AMOUNT"] = "MESSAGES";
1868 }
1869
1870
1871 $mf->FromArray((array)$nf, $arrSet);
1872
1873 $arUserIDs = array($mf->OWNER_USER_ID, $mf->CREATED_USER_ID, $mf->MODIFIED_USER_ID, $mf->RESPONSIBLE_USER_ID);
1874 $arGuestIDs = array($mf->OWNER_GUEST_ID, $mf->CREATED_GUEST_ID, $mf->MODIFIED_GUEST_ID);
1875 $arStrUsers =CTicket::GetUsersPropertiesArray($arUserIDs, $arGuestIDs);
1876
1877 // set name, login, email
1878 $userCategories = array('OWNER', 'RESPONSIBLE', 'CREATED');
1879
1880 if (!$v->isNew)
1881 {
1882 $userCategories[] = 'MODIFIED';
1883 }
1884
1885 foreach ($userCategories as $userCategory)
1886 {
1887 $propertyId = $userCategory.'_USER_ID';
1888
1889 if ($mf->$propertyId > 0 && isset($arStrUsers['arUsers'][$mf->$propertyId]))
1890 {
1891 $name = CUser::FormatName(CSite::GetNameFormat(), $arStrUsers['arUsers'][$mf->$propertyId], true, true);
1892 $propertyName = $userCategory.'_USER_NAME';
1893 $mf->$propertyName = $name;
1894
1895 $propertyLogin = $userCategory.'_USER_LOGIN';
1896 $mf->$propertyLogin = $arStrUsers['arUsers'][$mf->$propertyId]['LOGIN'];
1897
1898 $propertyEmail = $userCategory.'_USER_EMAIL';
1899 $mf->$propertyEmail = $arStrUsers['arUsers'][$mf->$propertyId]['EMAIL'];
1900 }
1901 }
1902
1903 $mf->FILES = $v->arrFILES;
1904 $mf->FILES_LINKS = self::Set_getFilesLinks($v->arrFILES, $v->arrSite["LANGUAGE_ID"]);
1905 $mf->IMAGE_LINK = $mf->FILES_LINKS;
1906
1907 $mf->MESSAGE_BODY = PrepareTxtForEmail($arFields["MESSAGE"], $v->arrSite["LANGUAGE_ID"], false, false);
1908
1909 // сформируем email автора
1910 // Событие: "TICKET_CHANGE_BY_AUTHOR_FOR_AUTHOR" - #DEFAULT_EMAIL_FROM# -> #OWNER_EMAIL# (Обращение изменено автором (для автора))
1911 // Событие: "TICKET_CHANGE_BY_SUPPORT_FOR_AUTHOR" - #DEFAULT_EMAIL_FROM# -> #OWNER_EMAIL# (Обращение изменено сотрудником техподдержки (для автора))
1912 // Событие: "TICKET_NEW_FOR_AUTHOR" - #DEFAULT_EMAIL_FROM# -> #OWNER_EMAIL# (Новое обращение (для автора))
1913
1914 $ownerEmail = "";
1915 if($mf->OWNER_USER_ID > 0 && isset($arStrUsers["arUsers"][$mf->OWNER_USER_ID]))
1916 {
1917 $ownerEmail = $arStrUsers["arUsers"][$mf->OWNER_USER_ID]["EMAIL"];
1918 }
1919 elseif($mf->OWNER_GUEST_ID > 0 && isset($arStrUsers["arGuests"][$mf->OWNER_GUEST_ID]))
1920 {
1921 $ownerEmail = $arStrUsers["arGuests"][$mf->OWNER_GUEST_ID]["EMAIL"];
1922 }
1923 $arrOwnerEmails = self::EmailsFromStringToArray($mf->OWNER_SID, array($ownerEmail));
1924 if(intval($mf->OWNER_USER_ID) > 0)
1925 {
1926 $rs = CTicket::GetResponsibleList($mf->OWNER_USER_ID, $I_Email, $U_Email);
1927 while($arr0 = $rs->Fetch())
1928 {
1929 if($arr0['EMAIL'] <> '')
1930 {
1931 $arrOwnerEmails[] = $arr0['EMAIL'];
1932 }
1933 }
1934 }
1935
1936 $mf->OWNER_EMAIL = implode(", ", array_unique($arrOwnerEmails));
1937
1938 // выбираем административные email'ы
1939 $arrAdminEMails = CTicket::GetAdminEmails();
1940 if(!is_array($arrAdminEMails))
1941 {
1942 $arrAdminEMails = array();
1943 }
1944 TrimArr($arrAdminEMails);
1945
1946 // сформируем email техподдержки
1947 // Событие: "TICKET_OVERDUE_REMINDER" - #DEFAULT_EMAIL_FROM# -> #SUPPORT_EMAIL# (Напоминание о необходимости ответа (для техподдержки))
1948 // Событие: "TICKET_CHANGE_FOR_TECHSUPPORT" - #DEFAULT_EMAIL_FROM# -> #SUPPORT_EMAIL# (Изменения в обращении (для техподдержки))
1949 // Событие: "TICKET_NEW_FOR_TECHSUPPORT" - #DEFAULT_EMAIL_FROM# -> #SUPPORT_EMAIL# (Новое обращение (для техподдержки))
1950
1951 $arrSupportEmails = array();
1952 if($mf->RESPONSIBLE_USER_ID > 0 && isset($arStrUsers["arUsers"][$mf->RESPONSIBLE_USER_ID]))
1953 {
1954 $arrSupportEmails[] = $arStrUsers["arUsers"][$mf->RESPONSIBLE_USER_ID]["EMAIL"];
1955
1956 // из группы ответсвенного, выбираем всех пользователей кто имеет доступ к рассылке
1957 $rs = CTicket::GetResponsibleList($mf->RESPONSIBLE_USER_ID, $I_Email, $U_Email, "Y");
1958 while($arr0 = $rs->Fetch()) if($arr0['EMAIL'] <> '')
1959 {
1960 $arrSupportEmails[] = $arr0['EMAIL'];
1961 }
1962 }
1963 if(count($arrSupportEmails) <= 0)
1964 {
1965 $arrSupportEmails = $arrAdminEMails;
1966 }
1967 if(count($arrSupportEmails) <= 0)
1968 {
1969 $se = COption::GetOptionString("main", "email_from", "");
1970 if($se <> '') $arrSupportEmails[] = $se;
1971 }
1972
1973 TrimArr($arrSupportEmails);
1974 $mf->SUPPORT_EMAIL = count($arrSupportEmails) > 0 ? trim(implode(",", array_unique($arrSupportEmails)), ",") : "";
1975
1976
1977 // удалим продублированные адреса из макроса #SUPPORT_ADMIN_EMAIL#
1978 if(count($arrSupportEmails) > 0)
1979 {
1980 foreach($arrSupportEmails as $e)
1981 {
1982 unset($arrAdminEMails[$e]);
1983 }
1984 }
1985 $mf->SUPPORT_ADMIN_EMAIL = count($arrAdminEMails) > 0 ? trim(implode(",", $arrAdminEMails), ",") : "";
1986
1987 if(array_key_exists('PUBLIC_EDIT_URL', $arFields) && $arFields['PUBLIC_EDIT_URL'] <> '')
1988 {
1989 $mf->PUBLIC_EDIT_URL = $arFields['PUBLIC_EDIT_URL'];
1990 }
1991 else
1992 {
1993 $peurl = COption::GetOptionString("support", "SUPPORT_DIR");
1994 $peurl = str_replace("#LANG_DIR#", $v->arrSite["DIR"], $peurl); // совместимость
1995 $peurl = str_replace("#SITE_DIR#", $v->arrSite["DIR"], $peurl);
1996 $peurl = str_replace("\\", "/", $peurl);
1997 $peurl = str_replace("//", "/", $peurl);
1998 $peurl = trim($peurl, "/");
1999 $mf->PUBLIC_EDIT_URL = "/".$peurl."/".COption::GetOptionString("support", "SUPPORT_EDIT");
2000 }
2001
2002 $mf->SUPPORT_COMMENTS = PrepareTxtForEmail($arFields["SUPPORT_COMMENTS"], $v->arrSite["LANGUAGE_ID"]);
2003 if($mf->SUPPORT_COMMENTS <> '') $mf->SUPPORT_COMMENTS = "\n\n" . $mf->SUPPORT_COMMENTS . "\n";
2004
2005 $mf->SOURCE = $nf->SOURCE_NAME == '' ? "" : "[" . $nf->SOURCE_NAME . "] ";
2006
2007 $oUID = intval($mf->OWNER_USER_ID);
2008 $oGID = intval($mf->OWNER_GUEST_ID);
2009 if($oGID > 0)
2010 {
2011 $mf->OWNER_TEXT = $arStrUsers["arGuests"][$oGID]["HTML_NAME_S"];
2012 if($oUID > 0)
2013 {
2014 $mf->OWNER_TEXT .= self::addSupportText($oUID);
2015 }
2016 }
2017 elseif($oUID > 0)
2018 {
2019 $mf->OWNER_TEXT = $arStrUsers["arUsers"][$oUID]["HTML_NAME_S"];
2020 $mf->OWNER_TEXT .= self::addSupportText($oUID);
2021 }
2022 if(trim($mf->OWNER_SID) <> '' && $mf->OWNER_SID != null)
2023 {
2024 $mf->OWNER_TEXT = " / " . $mf->OWNER_TEXT;
2025 }
2026
2027
2028 if($nf->CREATED_MODULE_NAME == "support" || $nf->CREATED_MODULE_NAME == '')
2029 {
2030 $cUID = intval($mf->CREATED_USER_ID);
2031 $cGID = intval($mf->CREATED_GUEST_ID);
2032 if($cGID > 0)
2033 {
2034 $mf->CREATED_TEXT = $arStrUsers["arGuests"][$cGID]["HTML_NAME_S"];
2035 }
2036 elseif($cUID > 0)
2037 {
2038 $mf->CREATED_TEXT = $arStrUsers["arUsers"][$cUID]["HTML_NAME_S"];
2039 }
2040 }
2041 else
2042 {
2043 $mf->CREATED_MODULE_NAME = "[" . $nf->CREATED_MODULE_NAME . "]";
2044 }
2045
2046 $rUID = intval($mf->RESPONSIBLE_USER_ID);
2047 if($rUID > 0)
2048 {
2049 $mf->RESPONSIBLE_TEXT = $arStrUsers["arUsers"][$rUID]["HTML_NAME_S"];
2050 $mf->RESPONSIBLE_TEXT .= self::addSupportText($rUID);
2051 }
2052
2053
2054 /*
2055 if($mf->OWNER_USER_ID > 0 || strlen(trim($mf->OWNER_USER_LOGIN)) > 0)
2056 {
2057 $mf->OWNER_TEXT = "[" . $mf->OWNER_USER_ID . "] (" . $mf->OWNER_USER_LOGIN . ") " . $mf->OWNER_USER_NAME;
2058 if(strlen(trim($mf->OWNER_SID)) > 0 && $mf->OWNER_SID != null) $mf->OWNER_TEXT = " / " . $mf->OWNER_TEXT;
2059 $mf->OWNER_TEXT .= self::addSupportText($mf->OWNER_USER_ID);
2060 }
2061
2062 if($nf->CREATED_MODULE_NAME == "support")
2063 {
2064 $mf->CREATED_MODULE_NAME = "";
2065 if($mf->CREATED_USER_ID > 0)
2066 {
2067 $mf->CREATED_TEXT = "[" . $mf->CREATED_USER_ID . "] (" . $mf->CREATED_USER_LOGIN . ") " . $mf->CREATED_USER_NAME . self::addSupportText($mf->CREATED_USER_ID);
2068 }
2069 }
2070 else
2071 {
2072 $mf->CREATED_MODULE_NAME = "[" . $nf->CREATED_MODULE_NAME . "]";
2073 }
2074
2075 if($mf->RESPONSIBLE_USER_ID > 0)
2076 {
2077 $mf->RESPONSIBLE_TEXT = "[" . $mf->RESPONSIBLE_USER_ID . "] (" . $nf->RESPONSIBLE_LOGIN . ") " . $nf->RESPONSIBLE_NAME;
2078 $mf->RESPONSIBLE_TEXT .= self::addSupportText($mf->RESPONSIBLE_USER_ID);
2079 }
2080 */
2081
2082 if(!$v->isNew) // UPDATE
2083 {
2084 /*
2085 if($nf->MODIFIED_MODULE_NAME == "support" && strlen($nf->MODIFIED_MODULE_NAME) > 0)
2086 {
2087 $mf->MODIFIED_MODULE_NAME = "";
2088 if($mf->MODIFIED_USER_ID > 0)
2089 {
2090 $mf->MODIFIED_TEXT = "[" . $mf->MODIFIED_USER_ID . "] (" . $mf->MODIFIED_USER_LOGIN . ") " . $mf->MODIFIED_USER_NAME;
2091 $mf->MODIFIED_TEXT .= self::addSupportText($mf->MODIFIED_USER_ID);
2092 }
2093 }
2094 else $mf->MODIFIED_MODULE_NAME = "[" . $nf->MODIFIED_MODULE_NAME . "]";
2095 */
2096
2097 if($nf->MODIFIED_MODULE_NAME == "support" || $nf->MODIFIED_MODULE_NAME == '')
2098 {
2099 $rUID = intval($mf->MODIFIED_USER_ID);
2100 $rGID = intval($mf->MODIFIED_GUEST_ID);
2101 if($rGID > 0)
2102 {
2103 $mf->MODIFIED_TEXT = $arStrUsers["arGuests"][$rGID]["HTML_NAME_S"];
2104 if($rUID > 0)
2105 {
2106 $mf->MODIFIED_TEXT .= self::addSupportText($rUID);
2107 }
2108 }
2109 elseif($rUID > 0)
2110 {
2111 $mf->MODIFIED_TEXT = $arStrUsers["arUsers"][$rUID]["HTML_NAME_S"];
2112 $mf->MODIFIED_TEXT .= self::addSupportText($rUID);
2113 }
2114 }
2115 else
2116 {
2117 $mf->MODIFIED_MODULE_NAME = "[" . $nf->MODIFIED_MODULE_NAME . "]";
2118 }
2119
2120 $mf->MESSAGE_SOURCE = "";
2121 if($rsSource = CTicketDictionary::GetByID($arFields["MESSAGE_SOURCE_ID"]))
2122 {
2123 $arSource = $rsSource->Fetch();
2124 $mf->MESSAGE_SOURCE = (array_key_exists("NAME", $arSource) && $arSource["NAME"] <> '') ? "[" . $arSource["NAME"] . "] " : "";
2125 }
2126
2127 if((trim($arFields["MESSAGE_AUTHOR_SID"]) <> '' || intval($arFields["MESSAGE_AUTHOR_USER_ID"]) > 0) && $v->bSupportTeam)
2128 {
2129 $mf->MESSAGE_AUTHOR_USER_ID = $arFields["MESSAGE_AUTHOR_USER_ID"];
2130 $mf->MESSAGE_AUTHOR_SID = $arFields["MESSAGE_AUTHOR_SID"];
2131 }
2132 else $mf->MESSAGE_AUTHOR_USER_ID = $v->uid;
2133
2134 $arMA = array();
2135 if($rsMA = CUser::GetByID($mf->MESSAGE_AUTHOR_USER_ID)) $arMA = $rsMA->Fetch();
2136
2137 if($mf->MESSAGE_AUTHOR_USER_ID > 0 || trim($arMA["LOGIN"]) <> '')
2138 {
2139 $mf->MESSAGE_AUTHOR_TEXT = "[" . $mf->MESSAGE_AUTHOR_USER_ID . "] (" . $arMA["LOGIN"] . ") " . $arMA["NAME"] . " " . $arMA["LAST_NAME"];
2140 if(trim($arFields["MESSAGE_AUTHOR_SID"]) <> '') $mf->MESSAGE_AUTHOR_TEXT = " / " . $mf->MESSAGE_AUTHOR_TEXT;
2141 if($mf->MESSAGE_AUTHOR_USER_ID > 0) $mf->MESSAGE_AUTHOR_TEXT .= self::addSupportText($mf->MESSAGE_AUTHOR_USER_ID);
2142 }
2143
2144 if(trim($arMA["NAME"]) <> '' || trim($arMA["LAST_NAME"]) <> '') $mf->MESSAGE_AUTHOR_USER_NAME = trim($arMA["NAME"]) . " ". trim($arMA["LAST_NAME"]);
2145 if(trim($arMA["LOGIN"]) <> '') $mf->MESSAGE_AUTHOR_USER_LOGIN = $arMA["LOGIN"];
2146 if(trim($arMA["EMAIL"]) <> '') $mf->MESSAGE_AUTHOR_USER_EMAIL = $arMA["EMAIL"];
2147
2148 $mf->MESSAGE_HEADER = str_repeat("=", 23) . " " . GetMessage("SUP_MAIL_MESSAGE") . " " . str_repeat("=", 34);
2149
2150
2151 }
2152
2153 $mf->SPAM_MARK = "";
2154 if($nf->IS_SPAM <> '')
2155 {
2156 if($nf->IS_SPAM == "Y") $mf->SPAM_MARK = "\n" . GetMessage("SUP_EXACTLY_SPAM") . "\n";
2157 else $mf->SPAM_MARK = "\n" . GetMessage("SUP_POSSIBLE_SPAM") . "\n";
2158 }
2159
2160 self::Set_WriteLog($nf, $v, $mf);
2161 //$v +change, +change_hidden
2162
2163 if(!$v->isNew) // UPDATE
2164 {
2165 $mf->MESSAGE_FOOTER = str_repeat("=", mb_strlen($mf->MESSAGE_HEADER));
2166 }
2167
2168 if ($v->isNew && $v->bActiveCoupon) $mf->COUPON = $v->V_COUPON;
2169
2170 $arEventFields_author = $mf->ToArray(CSupportTableFields::ALL); //, array(CSupportTableFields::NOT_NULL)
2171 $arEventFields_support = $arEventFields_author;
2172
2173 // отсылаем письмо автору
2174 if($v->SEND_EMAIL_TO_AUTHOR == "Y" && ($v->isNew || $v->change <> ''))
2175 {
2176 $EventType = "TICKET_NEW_FOR_AUTHOR";
2177 if(!$v->isNew) // UPDATE
2178 {
2179 // HIDDEN
2180 if($arFields["HIDDEN"] == "Y")
2181 {
2182 $arrUnsetHidden = array("MESSAGE_BODY", "IMAGE_LINK");
2183 foreach($arrUnsetHidden as $value) $arEventFields_author[$value] = "";
2184 }
2185 $EventType = "TICKET_CHANGE_BY_AUTHOR_FOR_AUTHOR";
2186 if(CTicket::IsSupportTeam($mf->MESSAGE_AUTHOR_USER_ID) || CTicket::IsAdmin($mf->MESSAGE_AUTHOR_USER_ID))
2187 $EventType = "TICKET_CHANGE_BY_SUPPORT_FOR_AUTHOR";
2188 }
2189 $arEventFields_author = CTicket::ExecuteEvents('OnBeforeSendMailToAuthor' , $arEventFields_author, $v->isNew, $EventType);
2190 if ($arEventFields_author) CEvent::Send($EventType, $v->arrSite["ID"], $arEventFields_author);
2191 }
2192
2193 // отсылаем письмо техподдержке
2194 if($v->SEND_EMAIL_TO_TECHSUPPORT == "Y" && ($v->isNew || $v->change <> '' || $v->change_hidden <> ''))
2195 {
2196 $EventType = "TICKET_NEW_FOR_TECHSUPPORT";
2197 if(!$v->isNew) // UPDATE
2198 {
2199 $arEventFields_support["WHAT_CHANGE"] .= $v->change_hidden;
2200 $EventType = "TICKET_CHANGE_FOR_TECHSUPPORT";
2201 }
2202 $arEventFields_support = CTicket::ExecuteEvents('OnBeforeSendMailToSupport', $arEventFields_support, $v->isNew);
2203 if ($arEventFields_support) CEvent::Send($EventType, $v->arrSite["ID"], $arEventFields_support);
2204 }
2205
2206
2207 }
2208
2209 public static function Set_getResponsibleUser($v, $f, &$arFields)
2210 {
2211 global $DB;
2212
2213 // если обращение создается сотрудником техподдержки, администратором или демо пользователем
2214 $f->RESPONSIBLE_USER_ID = null;
2215 if($v->bSupportTeam || $v->bAdmin || $v->Demo) $f->FromArray($arFields, "RESPONSIBLE_USER_ID", array(CSupportTableFields::MORE0));
2216 if($f->RESPONSIBLE_USER_ID == null) unset($arFields["RESPONSIBLE_USER_ID"]);
2217
2218 /*
2219 получим идентификаторы события и ответственного в зависимости от
2220 1) Категории
2221 2) Критичности
2222 3) Источника
2223 */
2224 $strSql = "
2225 SELECT ID, C_TYPE, RESPONSIBLE_USER_ID, EVENT1, EVENT2, EVENT3
2226 FROM b_ticket_dictionary
2227 WHERE
2228 (ID=" . $f->CATEGORY_ID . " AND C_TYPE='C') OR
2229 (ID=" . $f->CRITICALITY_ID . " AND C_TYPE='K') OR
2230 (ID=" . $f->SOURCE_ID . " AND C_TYPE='SR')
2231 ORDER BY
2232 C_TYPE
2233 ";
2234 $z = $DB->Query($strSql);
2235 $v->category_set = false;
2236 while($zr = $z->Fetch())
2237 {
2238 // если
2239 // 1) ответственный определен в справочнике
2240 // 2) до сих пор он не был определен
2241 // 3) не был задан явно пользователем имеющим на это права
2242 if ($zr["C_TYPE"]=="C")
2243 {
2244 $v->T_EVENT1 = trim($zr["EVENT1"]);
2245 $v->T_EVENT2 = trim($zr["EVENT2"]);
2246 $v->T_EVENT3 = trim($zr["EVENT3"]);
2247 $v->category_set = true;
2248 }
2249 if($f->RESPONSIBLE_USER_ID == null && intval($zr["RESPONSIBLE_USER_ID"]) > 0)
2250 {
2251 $RU_ID = intval($zr["RESPONSIBLE_USER_ID"]);
2252 if(CTicket::IsSupportTeam($RU_ID) || CTicket::IsAdmin($RU_ID)) $f->RESPONSIBLE_USER_ID = $RU_ID;
2253 break;
2254 }
2255 }
2256
2257
2258 // если ответственный явно не определен то
2259 if($f->RESPONSIBLE_USER_ID == null)
2260 {
2261 // ответственный из настроек SLA
2262 $rsSLA = CTicketSLA::GetByID($f->SLA_ID);
2263
2264 if($rsSLA !== false && $arSLA = $rsSLA->Fetch())
2265 {
2266 if(intval($arSLA["RESPONSIBLE_USER_ID"]) > 0)
2267 {
2268 $f->RESPONSIBLE_USER_ID = $arSLA["RESPONSIBLE_USER_ID"];
2269 }
2270 }
2271 }
2272
2273 // ответственный из настроек модуля
2274 if ($f->RESPONSIBLE_USER_ID == null)
2275 {
2276 // берем из настроек модуля ответственного по умолчанию
2277 $RU_ID = intval(COption::GetOptionString("support", "DEFAULT_RESPONSIBLE_ID"));
2278 $f->RESPONSIBLE_USER_ID = $RU_ID;
2279 }
2280 }
2281
2282 public static function Set_getCOUPONandSLA($v, $f, $arFields)
2283 {
2284 global $APPLICATION;
2285 $slaID = 0;
2286 if(isset($arFields['SLA_ID']) && (intval($arFields['SLA_ID']) > 0))
2287 {
2288 $slaID = $arFields['SLA_ID'];
2289 }
2290 // получение купона
2291 if(array_key_exists('COUPON', $arFields) && $arFields['COUPON'] <> '')
2292 {
2293 $v->bActiveCoupon = CSupportSuperCoupon::UseCoupon($arFields['COUPON']);
2294 if($v->bActiveCoupon)
2295 {
2296 $v->V_COUPON = $arFields['COUPON'];
2297 $rsCoupon = CSupportSuperCoupon::GetList(false, array('COUPON' => $arFields['COUPON']));
2298 //if($arCoupon = $rsCoupon->Fetch() && intval($arCoupon['SLA_ID']) > 0) $arFields['SLA_ID'] = intval($arCoupon['SLA_ID']);
2299 if($arCoupon = $rsCoupon->Fetch())
2300 {
2301 if(intval($arCoupon['SLA_ID']) > 0)
2302 {
2303 $slaID= intval($arCoupon['SLA_ID']);
2304 }
2305 }
2306 }
2307 else
2308 {
2309 $APPLICATION->ThrowException(GetMessage('SUP_ERROR_INVALID_COUPON'));
2310 return false;
2311 }
2312 }
2313 // получаем SLA
2314 if($slaID > 0)
2315 {
2316 //$f->FromArray($arFields, "SLA_ID", array(CSupportTableFields::MORE0));
2317 $f->SLA_ID = $slaID;
2318 }
2319 else
2320 {
2321 $f->SLA_ID = CTicketSLA::GetSLA($f->SITE_ID, $f->OWNER_USER_ID, $f->CATEGORY_ID, ($v->bActiveCoupon ? $v->V_COUPON : "") );
2322 }
2323 //elseif(intval($arFields["SLA_ID"]) <= 0) $f->SLA_ID = CTicketSLA::GetForUser($f->SITE_ID, $f->OWNER_USER_ID);
2324
2325 return true;
2326 }
2327
2328 public static function Set_InitVar(&$arFields, $id, $checkRights, $sendEmailToAuthor, $sendEmailToTechsupport)
2329 {
2330 global $APPLICATION, $USER, $DB;
2331
2332 $f = self::GetCSupportTableFields("b_ticket");
2333 $v = (object)array();
2334
2335 if(!is_object($USER))
2336 {
2337 $USER = new CUser;
2338 }
2339 $uid = $USER->GetID();
2340 if(isset($arFields["CURRENT_USER_ID"]) && intval($arFields["CURRENT_USER_ID"]) > 0)
2341 {
2342 $uid = intval($arFields["CURRENT_USER_ID"]);
2343 }
2344
2345 $f->ID = intval($id);
2346 $v->isNew = ($f->ID <= 0);
2347
2348 $v->CHECK_RIGHTS = ($checkRights == "Y") ? "Y" : "N";
2349 $v->SEND_EMAIL_TO_AUTHOR = ($sendEmailToAuthor == "Y") ? "Y" : "N";
2350 $v->SEND_EMAIL_TO_TECHSUPPORT = ($sendEmailToTechsupport == "Y") ? "Y" : "N";
2351
2352 $v->newSLA = false;
2353
2354 // заголовок и сообщение - обязательные поля для нового обращения
2355 if($v->isNew)
2356 {
2357 if($arFields["TITLE"] == '')
2358 {
2359 $APPLICATION->ThrowException(GetMessage('SUP_ERROR_EMPTY_TITLE'));
2360 return false;
2361 }
2362
2363 if($arFields["MESSAGE"] == '')
2364 {
2365 $APPLICATION->ThrowException(GetMessage('SUP_ERROR_EMPTY_MESSAGE'));
2366 return false;
2367 }
2368 }
2369
2370 if(is_object($APPLICATION))
2371 {
2372 $APPLICATION->ResetException();
2373 }
2374 if(!$GLOBALS["USER_FIELD_MANAGER"]->CheckFields("SUPPORT", $f->ID, $arFields))
2375 {
2376 if(is_object($APPLICATION) && $APPLICATION->GetException())
2377 {
2378 return false;
2379 }
2380 else
2381 {
2382 $APPLICATION->ThrowException("Unknown error. ");
2383 return false;
2384 }
2385 }
2386
2387 // установка прав
2388 $v->bAdmin = $v->bSupportTeam = $v->bSupportClient = $v->bDemo = $v->bOwner = false;
2389 if($v->CHECK_RIGHTS == "Y")
2390 {
2391 $v->uid = $uid;
2392 $v->bAdmin = CTicket::IsAdmin($uid);
2393 $v->bSupportTeam = CTicket::IsSupportTeam($uid);
2394 $v->bSupportClient = CTicket::IsSupportClient($uid);
2395 $v->bDemo = CTicket::IsDemo($uid);
2396 if($v->isNew) $v->bOwner = true;
2397 else $v->bOwner = CTicket::IsOwner($f->ID, $v->uid);
2398 }
2399 else
2400 {
2401 $v->bAdmin = $v->bSupportTeam = $v->bSupportClient = $v->bDemo = $v->bOwner = true;
2402 $v->uid = 0;
2403 }
2404 if(!$v->bAdmin && !$v->bSupportTeam && !$v->bSupportClient) return false;
2405 if (!$v->bAdmin && !$v->bSupportTeam && ($v->bDemo && !$v->bOwner)) return false;
2406
2407 // Это спам?
2408 $f->FromArray($arFields, "IS_SPAM");
2409
2410 $v->bActiveCoupon = false;
2411
2412 $f->FromArray($_SESSION, array("MODIFIED_GUEST_ID" => "SESS_GUEST_ID"), array(CSupportTableFields::MORE0));
2413 $f->FromArray($arFields, "OWNER_USER_ID,OWNER_SID,HOLD_ON", array(CSupportTableFields::MORE0, CSupportTableFields::NOT_EMTY_STR));
2414
2415 // получим SITE_ID
2416 if($arFields["SITE_ID"] <> '') $f->SITE_ID = $arFields["SITE_ID"];
2417 elseif($arFields["SITE"] <> '') $f->SITE_ID = $arFields["SITE"];
2418 elseif($arFields["LANG"] <> '') $f->SITE_ID = $arFields["LANG"]; // совместимость со старой версией
2419 else $f->SITE_ID = SITE_ID;
2420
2421 // получаем ID записей справочника по SID
2422 $arr = array(
2423 "CATEGORY" => "C",
2424 "CRITICALITY" => "K",
2425 "STATUS" => "S",
2426 "MARK" => "M",
2427 "SOURCE" => "SR",
2428 "MESSAGE_SOURCE" => "SR",
2429 "DIFFICULTY" => "D"
2430 );
2431 foreach($arr as $key => $value)
2432 {
2433 if ((array_key_exists($key . "_ID", $arFields) || intval($arFields[ $key . "_ID" ]) <= 0) && array_key_exists($key . "_SID", $arFields) && $arFields[ $key . "_SID" ] <> '')
2434 {
2435 $z = CTicketDictionary::GetBySID($arFields[ $key . "_SID" ], $value, $f->SITE_ID);
2436 $zr = $z->Fetch();
2437 $arFields[$key."_ID"] = $zr["ID"];
2438 }
2439 }
2440 return array("v" => $v, "f" => $f);
2441 }
2442
2443 public static function Set($arFields, &$MID, $id="", $checkRights="Y", $sendEmailToAuthor="Y", $sendEmailToTechsupport="Y")
2444 {
2445 global $DB, $APPLICATION, $USER;
2446
2447 $v0 = self::Set_InitVar($arFields, $id, $checkRights, $sendEmailToAuthor, $sendEmailToTechsupport);
2448 if(!is_array($v0)) return $v0;
2449 $v = $v0["v"]; /* isNew, CHECK_RIGHTS, SEND_EMAIL_TO_AUTHOR, SEND_EMAIL_TO_TECHSUPPORT, bAdmin, bSupportTeam, bSupportClient, bDemo, bOwner, uid, bActiveCoupon, IsSpam */
2451 $f = $v0["f"]; /* ID, SITE_ID, MODIFIED_GUEST_ID, OWNER_USER_ID, OWNER_SID, HOLD_ON, IS_SPAM */
2452
2453 // если модифицируем обращение то
2454 if(!$v->isNew)
2455 {
2456 unset($arFields['COUPON']);
2457 $arFields['ID'] = $f->ID;
2458 $arFields = CTicket::ExecuteEvents('OnBeforeTicketUpdate', $arFields, false);
2459 if(!$arFields) return false;
2460 $v->closeDate = (isset($arFields["CLOSE"]) && $arFields["CLOSE"] == "Y"); //$close
2461
2462 // запоминаем предыдущие важные значения
2463 $v->arrOldFields = array();
2464 $arr = array(
2465 "TITLE" => "T.TITLE",
2466 "RESPONSIBLE_USER_ID" => "T.RESPONSIBLE_USER_ID",
2467 "SLA_ID" => "T.SLA_ID",
2468 "CATEGORY_ID" => "T.CATEGORY_ID",
2469 "CRITICALITY_ID" => "T.CRITICALITY_ID",
2470 "STATUS_ID" => "T.STATUS_ID",
2471 "MARK_ID" => "T.MARK_ID",
2472 "DIFFICULTY_ID" => "T.DIFFICULTY_ID",
2473 "DATE_CLOSE" => "T.DATE_CLOSE",
2474 "HOLD_ON" => "T.HOLD_ON",
2475 "RESPONSE_TIME" => "S.RESPONSE_TIME",
2476 "RESPONSE_TIME_UNIT" => "S.RESPONSE_TIME_UNIT"
2477 );
2478 $str = "T.ID";
2479 foreach ($arr as $s) $str .= "," . $s;
2480 $strSql = "SELECT " . $str . ", SITE_ID FROM b_ticket T LEFT JOIN b_ticket_sla S ON T.SLA_ID = S.ID WHERE T.ID='" . $f->ID . "'";
2481 $z = $DB->Query($strSql);
2482 if($zr=$z->Fetch())
2483 {
2484 $f->SITE_ID = $zr["SITE_ID"];
2485 if(intval($v->uid) == $zr["RESPONSIBLE_USER_ID"]) $v->bSupportTeam = "Y";
2486 foreach ($arr as $key=>$s) $v->arrOldFields[$key] = $zr[$key];
2487 }
2488
2489 $f->FromArray(
2490 $arFields,
2491 "SITE_ID,MODIFIED_MODULE_NAME,SLA_ID,SOURCE_ID",
2493 );
2494
2495 if (!$f->MODIFIED_MODULE_NAME)
2496 {
2497 $f->MODIFIED_MODULE_NAME = '';
2498 }
2499
2500 $f->FromArray(
2501 $arFields,
2502 "CATEGORY_ID,RESPONSIBLE_USER_ID,STATUS_ID,DIFFICULTY_ID,CRITICALITY_ID,SUPPORT_COMMENTS"
2503 );
2504 if (isset($arFields['CHANGE_TITLE']))
2505 {
2506 $f->set('TITLE', $arFields['CHANGE_TITLE']);
2507 }
2508 $f->set("MODIFIED_USER_ID", $v->uid, array(CSupportTableFields::MORE0));
2509 $f->setCurrentTime("TIMESTAMP_X");
2510 if($v->closeDate)
2511 {
2512 $f->setCurrentTime("DATE_CLOSE");
2513 }
2514
2515 // ?remake? {
2516 $v->IS_GROUP_USER = 'N';
2517 if($v->bAdmin) $IS_GROUP_USER = 'Y';
2518 elseif($v->CHECK_RIGHTS == 'Y' && ($v->bSupportClient || $v->bSupportTeam))
2519 {
2520 if($v->bSupportTeam) $join_query = '(T.RESPONSIBLE_USER_ID IS NOT NULL AND T.RESPONSIBLE_USER_ID=O.USER_ID)';
2521 else $join_query = '(T.OWNER_USER_ID IS NOT NULL AND T.OWNER_USER_ID=O.USER_ID)';
2522
2523 $strSql = "SELECT 'x'
2524 FROM b_ticket T
2525 INNER JOIN b_ticket_user_ugroup O ON $join_query
2526 INNER JOIN b_ticket_user_ugroup C ON (O.GROUP_ID=C.GROUP_ID)
2527 INNER JOIN b_ticket_ugroups G ON (O.GROUP_ID=G.ID)
2528 WHERE T.ID='" . $f->ID . "' AND C.USER_ID='" . $v->uid . "' AND C.CAN_VIEW_GROUP_MESSAGES='Y' AND G.IS_TEAM_GROUP='" . ($v->bSupportTeam ? "Y" : "N") . "'";
2529 $z = $DB->Query($strSql);
2530 if($zr = $z->Fetch()) $v->IS_GROUP_USER = 'Y';
2531 }
2532 // }
2533
2534 if(isset($arFields["AUTO_CLOSE_DAYS"]) && intval($arFields["AUTO_CLOSE_DAYS"]) >= 0)
2535 {
2536 if (intval($arFields["AUTO_CLOSE_DAYS"]) == 0)
2537 {
2538 // get from module settings
2539 $f->AUTO_CLOSE_DAYS = COption::GetOptionString('support', "DEFAULT_AUTO_CLOSE_DAYS");
2540 }
2541 else
2542 {
2543 $f->AUTO_CLOSE_DAYS = $arFields["AUTO_CLOSE_DAYS"];
2544 }
2545 }
2546
2547 if(is_array($v->arrOldFields) && is_array($arFields) && $arFields["CLOSE"] == "N" && $v->arrOldFields["DATE_CLOSE"] <> '')
2548 {
2549 $f->DATE_CLOSE = null;
2550 $f->REOPEN = "Y";
2551 }
2552
2553 // Если есть что и мы Аднины или из группы ТП, запишем в базу
2554 $v->FirstUpdateRes = false;
2555
2556 if($v->bSupportTeam || $v->bAdmin)
2557 {
2559 if($v->CHECK_RIGHTS == "N" && isset($arFields["MARK_ID"]) && intval($arFields["MARK_ID"]) > 0)
2560 {
2561 $arFields_i["MARK_ID"] = intval($arFields["MARK_ID"]);
2562 }
2563 if(count($arFields_i) > 0)
2564 {
2565 $v->SupportTeamUpdateRes = $DB->Update("b_ticket", $arFields_i, "WHERE ID='" . $f->ID . "'"); //$rows1
2566 $GLOBALS["USER_FIELD_MANAGER"]->Update("SUPPORT", $f->ID, $arFields);
2567
2568 // если указана отметка о спаме то установим отметку о спаме
2569 if ($f->IS_SPAM <> '') CTicket::MarkAsSpam($f->ID, $f->IS_SPAM, $v->CHECK_RIGHTS);
2570
2571 $v->newSLA = (isset($arFields_i["SLA_ID"]) && $v->arrOldFields["SLA_ID"] != $arFields_i["SLA_ID"]);
2572 }
2573 }
2574 elseif($v->bOwner || $v->bSupportClient)
2575 {
2576 $arFields_i = $f->ToArray("TIMESTAMP_X,DATE_CLOSE,CRITICALITY_ID,MODIFIED_USER_ID,MODIFIED_GUEST_ID,MODIFIED_MODULE_NAME,REOPEN", array(CSupportTableFields::ONLY_CHANGED), true);
2577 if (isset($arFields['MARK_ID']))
2578 $arFields_i["MARK_ID"] = intval($arFields["MARK_ID"]);
2579 if(count($arFields_i) > 0)
2580 {
2581 $v->SupportClientUpdateRes = $DB->Update("b_ticket",
2582 $arFields_i,
2583 "WHERE ID='" . $f->ID . "' AND (OWNER_USER_ID='" . $v->uid . "' OR CREATED_USER_ID='" . $v->uid . "' OR '" . $v->CHECK_RIGHTS . "'='N' OR '" . $v->IS_GROUP_USER . "'='Y')"
2584 );
2585 $GLOBALS["USER_FIELD_MANAGER"]->Update("SUPPORT", $f->ID, $arFields);
2586 }
2587 }
2588
2589 // поля для записи лога
2590 /*$arFields_log = array(
2591 "LOG" => "Y",
2592 "MESSAGE_CREATED_USER_ID" => $MODIFIED_USER_ID,
2593 "MESSAGE_CREATED_MODULE_NAME" => $MODIFIED_MODULE_NAME,
2594 "MESSAGE_CREATED_GUEST_ID" => $MODIFIED_GUEST_ID,
2595 "MESSAGE_SOURCE_ID" => intval($arFields["SOURCE_ID"])
2596 );*/
2597
2598 $v->arFields_log = array(
2599 "LOG" => "Y",
2600 "MESSAGE_CREATED_USER_ID" => $f->MODIFIED_USER_ID,
2601 "MESSAGE_CREATED_MODULE_NAME" => $f->MODIFIED_MODULE_NAME,
2602 "MESSAGE_CREATED_GUEST_ID" => $f->MODIFIED_GUEST_ID,
2603 "MESSAGE_SOURCE_ID" => $f->SOURCE_ID
2604 );
2605
2606 // если необходимо соблюдать права то
2607 if($v->CHECK_RIGHTS == "Y")
2608 {
2609 // если update техподдержки не прошел то
2610 if(intval($v->SupportTeamUpdateRes) <= 0)
2611 {
2612 // убираем из массива исходных значений то что может менять только техподдержка
2613 unset($v->arrOldFields["RESPONSIBLE_USER_ID"]);
2614 unset($v->arrOldFields["SLA_ID"]);
2615 unset($v->arrOldFields["CATEGORY_ID"]);
2616 unset($v->arrOldFields["DIFFICULTY_ID"]);
2617 unset($v->arrOldFields["STATUS_ID"]);
2618 }
2619 // если update автора не прошел то
2620 if (intval($v->SupportClientUpdateRes) <=0)
2621 {
2622 // убираем из массива исходных значений то что может менять только автор
2623 unset($v->arrOldFields["MARK_ID"]);
2624 }
2625 }
2626
2627 // если состоялся один из updat'ов то
2628 if(intval($v->SupportTeamUpdateRes) > 0 || intval($v->SupportClientUpdateRes) > 0)
2629 {
2630
2631 // добавляем сообщение
2632 $arFields["MESSAGE_CREATED_MODULE_NAME"] = $arFields["MODIFIED_MODULE_NAME"];
2633 if(is_set($arFields, "IMAGE")) $arFields["FILES"][] = $arFields["IMAGE"];
2634 $arFiles = null;
2635 $MID = CTicket::AddMessage($f->ID, $arFields, $arFiles, $v->CHECK_RIGHTS);
2636 $v->arrFILES = $arFiles;
2637 $MID = intval($MID);
2638
2639 $dateType = array();
2640 $dateType["EVENT"] = array(CTicket::UPDATE);
2641 if($v->newSLA)
2642 {
2643 $dateType["EVENT"][] = CTicket::NEW_SLA;
2644 $dateType["OLD_SLA_RESPONSE_TIME"] = $v->arrOldFields["RESPONSE_TIME"];
2645 $dateType["OLD_SLA_RESPONSE_TIME_UNIT"] = $v->arrOldFields["RESPONSE_TIME_UNIT"];
2646 }
2647 if($f->REOPEN == "Y")
2648 {
2649 $dateType["EVENT"][] = CTicket::REOPEN;
2650 }
2651 //CTicket::UpdateLastParams2($f->ID, $dateType);
2652 CTicket::UpdateLastParamsN($f->ID, $dateType, true, true);
2653
2654 /*// если обращение закрывали то
2655 if($v->closeDate)
2656 {
2657 // удалим агентов-напоминальщиков и обновим параметры обращения
2658 CTicketReminder::Remove($f->ID);
2659 }*/
2660
2661 if(is_array($v->arrOldFields) && is_array($arFields))
2662 {
2663 // определяем что изменилось
2664 $v->arChange = array();
2665 if ($MID > 0)
2666 {
2667 if($arFields["HIDDEN"] != "Y") $v->arChange["MESSAGE"] = "Y";
2668 else $v->arChange["HIDDEN_MESSAGE"] = "Y";
2669 }
2670 if($arFields["CLOSE"] == "Y" && $v->arrOldFields["DATE_CLOSE"] == '')
2671 {
2672 $v->arChange["CLOSE"] = "Y";
2673 }
2674 elseif($arFields["CLOSE"] == "N" && $v->arrOldFields["DATE_CLOSE"] <> '')
2675 {
2676 $v->arChange["OPEN"] = "Y";
2677 }
2678
2679 if(array_key_exists("HOLD_ON", $arFields))
2680 {
2681 if($v->arrOldFields["HOLD_ON"] == null)
2682 {
2683 $v->arrOldFields["HOLD_ON"] = 'N';
2684 }
2685 if($arFields["HOLD_ON"] == null)
2686 {
2687 $arFields["HOLD_ON"] = 'N';
2688 }
2689 if($v->arrOldFields["HOLD_ON"] != $arFields["HOLD_ON"])
2690 {
2691 if($arFields["HOLD_ON"] == "Y")
2692 {
2693 $v->arChange["HOLD_ON_ON"] = "Y";
2694 }
2695 else
2696 {
2697 $v->arChange["HOLD_ON_OFF"] = "Y";
2698 }
2699
2700 }
2701 unset($v->arrOldFields["HOLD_ON"]);
2702 }
2703
2704 foreach($v->arrOldFields as $key => $value)
2705 {
2706 if(isset($arFields[$key]))
2707 {
2708 if ($key === 'TITLE' && $value !== $arFields[$key])
2709 {
2710 $v->arChange[$key] = "Y";
2711 }
2712 elseif (intval($value) != intval($arFields[$key]))
2713 {
2714 $v->arChange[$key] = "Y";
2715 }
2716 }
2717 }
2718
2719 // получим текущие значения обращения
2721 $z = CTicket::GetByID($f->ID, $f->SITE_ID, "N");
2723
2724 if($zr = $z->Fetch())
2725 {
2726 $nf = (object)$zr;
2727
2728 $rsSite = CSite::GetByID($nf->SITE_ID);
2729 $v->arrSite = $rsSite->Fetch();
2730
2732
2733 //if ($v->arChange['SLA_ID'] == 'Y' || $v->arChange['OPEN'] == 'Y') CTicketReminder::Update($nf->ID, true);
2734 }
2735 }
2736 $arFields['MID'] = $MID;
2737 CTicket::ExecuteEvents('OnAfterTicketUpdate', $arFields, false);
2738 }
2739 }
2740 else
2741 {
2742 // restrict to set SLA_ID directly, allow through events or automatically
2743 if (isset($arFields['SLA_ID']) && !($v->bSupportTeam || $v->bAdmin || $v->bDemo || $v->bActiveCoupon))
2744 {
2745 unset($arFields['SLA_ID']);
2746 }
2747
2748 $arFields = CTicket::ExecuteEvents('OnBeforeTicketAdd', $arFields, false);
2749 if(!$arFields) return false;
2750
2751
2752 if(!((trim($arFields["OWNER_SID"]) <> '' || intval($arFields["OWNER_USER_ID"]) > 0) && ($v->bSupportTeam || $v->bAdmin)))
2753 {
2754 $f->OWNER_USER_ID = ($v->uid > 0) ? $v->uid : null;
2755 $f->OWNER_SID = null;
2756 $f->OWNER_GUEST_ID = intval($_SESSION["SESS_GUEST_ID"]) > 0 ? intval($_SESSION["SESS_GUEST_ID"]) : null;
2757 }
2758
2759 $f->FromArray($arFields, "CREATED_USER_ID,CREATED_MODULE_NAME,CATEGORY_ID,STATUS_ID,DIFFICULTY_ID,CRITICALITY_ID,SOURCE_ID,TITLE", array(CSupportTableFields::MORE0,CSupportTableFields::NOT_EMTY_STR));
2760
2761 if (!$f->CREATED_USER_ID)
2762 {
2763 $f->set("CREATED_USER_ID", $v->uid, array(CSupportTableFields::MORE0));
2764 }
2765
2766 $f->setCurrentTime("LAST_MESSAGE_DATE,DAY_CREATE,TIMESTAMP_X,DEADLINE_SOURCE_DATE");
2767
2768 $f->DATE_CREATE = time() + CTimeZone::GetOffset();
2769
2770 // если обращение создается сотрудником техподдержки, администратором или демо пользователем
2771 if($v->bSupportTeam || $v->bAdmin || $v->Demo)
2772 {
2773 $f->FromArray($arFields, "SUPPORT_COMMENTS", array(CSupportTableFields::NOT_EMTY_STR));
2774 }
2775
2776 if(!self::Set_getCOUPONandSLA($v, $f, $arFields)) return false;
2777 // $f +SLA_ID $v +V_COUPON +bActiveCoupon
2778
2779 if ($v->bActiveCoupon) $f->COUPON = $v->V_COUPON;
2780
2782 // $f +RESPONSIBLE_USER_ID $v +T_EVENT1 +T_EVENT2 +T_EVENT3
2783
2784 // поля для записи лога
2785 $v->arFields_log = array(
2786 "LOG" => "Y",
2787 "MESSAGE_CREATED_USER_ID" => $f->CREATED_USER_ID,
2788 "MESSAGE_CREATED_MODULE_NAME" => $f->CREATED_MODULE_NAME,
2789 "MESSAGE_CREATED_GUEST_ID" => $f->MODIFIED_GUEST_ID,
2790 "MESSAGE_SOURCE_ID" => $f->SOURCE_ID
2791 );
2792
2793
2794 $acd0 = intval(COption::GetOptionString("support", "DEFAULT_AUTO_CLOSE_DAYS"));
2795 $f->AUTO_CLOSE_DAYS = (($acd0 <= 0) ? 7 : $acd0);
2796 $arFields["AUTO_CLOSE_DAYS"] = $f->AUTO_CLOSE_DAYS;
2797
2799 $id = $DB->Insert("b_ticket", $arFields_i);
2800 if(!($id > 0)) return $id;
2801 $f->ID = $id;
2802 $GLOBALS["USER_FIELD_MANAGER"]->Update("SUPPORT", $f->ID, $arFields);
2803
2804 $arFields["MESSAGE_AUTHOR_SID"] = $f->OWNER_SID;
2805 $arFields["MESSAGE_AUTHOR_USER_ID"] = $f->OWNER_USER_ID;
2806 $arFields["MESSAGE_CREATED_MODULE_NAME"] = $f->CREATED_MODULE_NAME;
2807 $arFields["MESSAGE_SOURCE_ID"] = $f->SOURCE_ID;
2808 $arFields["HIDDEN"] = "N";
2809 $arFields["LOG"] = "N";
2810 $arFields["IS_LOG"] = "N";
2811
2812 if (is_set($arFields, "IMAGE")) $arFields["FILES"][] = $arFields["IMAGE"];
2813 $arFiles = null;
2814 $MID = CTicket::AddMessage($f->ID, $arFields, $arFiles, $v->CHECK_RIGHTS);
2815 $v->arrFILES = $arFiles;
2816 $MID = intval($MID);
2817
2818 if(intval($MID) > 0)
2819 {
2820 //CTicket::UpdateLastParams2($f->ID, array("EVENT"=>array(CTicket::ADD)));
2821 CTicket::UpdateLastParamsN($f->ID, array("EVENT"=>array(CTicket::ADD)), true, true);
2822
2823 // если указана отметка о спаме то установим отметку о спаме
2824 if ($f->IS_SPAM <> '') CTicket::MarkAsSpam($f->ID, $f->IS_SPAM, $v->CHECK_RIGHTS);
2825
2826 /********************************************
2827 $nf - Заново прочитанные из базы поля
2828 ********************************************/
2829
2831 $z = CTicket::GetByID($f->ID, $f->SITE_ID, "N", "N");
2833
2834 if($zr = $z->Fetch())
2835 {
2836 $nf = (object)$zr;
2837
2838 $rsSite = CSite::GetByID($nf->SITE_ID);
2839 $v->arrSite = $rsSite->Fetch();
2840
2842
2843 // создаем событие в модуле статистики
2844 if(CModule::IncludeModule("statistic"))
2845 {
2846 if(!$v->category_set)
2847 {
2848 $v->T_EVENT1 = "ticket";
2849 $v->T_EVENT2 = "";
2850 $v->T_EVENT3 = "";
2851 }
2852 if($v->T_EVENT3 == '') $v->T_EVENT3 = "http://" . $_SERVER["HTTP_HOST"] . "/bitrix/admin/ticket_edit.php?ID=" . $f->ID . "&lang=" . $v->arrSite["LANGUAGE_ID"];
2853 CStatEvent::AddCurrent($v->T_EVENT1, $v->T_EVENT2, $v->T_EVENT3);
2854 }
2855
2856 }
2857 }
2858 // !!! ПРОВЕРИТЬ $arFields ТОЧНО ЛИ ВСЕ $arFields[..] = .. ТАКИЕ ЖЕ КАК В ОРИГИНАЛЕ !!!
2859 $arFields['ID'] = $f->ID;
2860 $arFields['MID'] = $MID;
2861 CTicket::ExecuteEvents('OnAfterTicketAdd', $arFields, true);
2862
2863 }
2864 return $f->ID;
2865 }
2866
2867 /***********************************************
2868 Старые функции для совместимости
2869 ***********************************************/
2870
2871 public static function GetFUA($site_id)
2872 {
2873 if ($site_id=="all") $site_id = "";
2874 $arFilter = array("TYPE" => "F", "SITE" => $site_id);
2875 $rs = CTicketDictionary::GetList("s_dropdown", '', $arFilter);
2876 return $rs;
2877 }
2878
2879 public static function GetRefBookValues($type, $site_id=false)
2880 {
2881 if ($site_id=="all") $site_id = "";
2882 $arFilter = array("TYPE" => $type, "SITE" => $site_id);
2883 $rs = CTicketDictionary::GetList("s_dropdown", '', $arFilter);
2884 return $rs;
2885 }
2886
2887 public static function GetMessages($ticketID, $arFilter=array(), $checkRights="Y")
2888 {
2889 $arFilter["TICKET_ID"] = $ticketID;
2890 $arFilter["TICKET_ID_EXACT_MATCH"] = "Y";
2891 return CTicket::GetMessageList('', '', $arFilter, null, $checkRights, "Y");
2892 }
2893
2894 public static function GetResponsible()
2895 {
2897 }
2898
2899 public static function IsResponsible($userID=false)
2900 {
2901 return CTicket::IsSupportTeam($userID);
2902 }
2903
2904 public static function ExecuteEvents($message, $arFields, $isNew, &$eventType = false)
2905 {
2906 foreach(GetModuleEvents('support', $message, true) as $arr)
2907 {
2908 $arFields = ExecuteModuleEventEx($arr, array($arFields, $isNew, &$eventType));
2909 }
2910
2911 return $arFields;
2912 }
2913
2914 public static function GetResponsibleList($userID, $CMGM = null, $CMUGM = null, $SG = null)
2915 {
2916
2917 $condition = "";
2918 if($CMGM != null) $condition .= "
2919 AND TUG2.CAN_MAIL_GROUP_MESSAGES = '" . ($CMGM == "Y" ? "Y" : "N") . "'";
2920 if($CMUGM != null) $condition .= "
2921 AND TUG2.CAN_MAIL_UPDATE_GROUP_MESSAGES = '" . ($CMUGM == "Y" ? "Y" : "N") . "'";
2922
2923 $condition2 = "";
2924 if($SG != null) $condition2 .= "
2925 AND TG.IS_TEAM_GROUP = '" . ($SG == "Y" ? "Y" : "N") . "'";
2926
2927
2928 global $DB;
2929 $strSql = "
2930 SELECT
2931 U.ID as ID,
2932 U.LOGIN as LOGIN,
2933 ". $DB->Concat(CTicket::isnull("U.LAST_NAME", "''"), CTicket::isnull("U.NAME", "''"), 'U.LOGIN')." as NAME,
2934 U.EMAIL as EMAIL
2935 FROM
2936 (
2937 SELECT
2938 TUG2.USER_ID AS USER_ID
2939 FROM
2940 b_ticket_ugroups TG
2941 INNER JOIN b_ticket_user_ugroup TUG
2942 ON TG.ID = TUG.GROUP_ID" . $condition2 . "
2943 INNER JOIN b_ticket_user_ugroup TUG2
2944 ON TUG.USER_ID = '" . intval($userID) . "'
2945 AND TUG.GROUP_ID = TUG2.GROUP_ID" . $condition . "
2946 GROUP BY
2947 TUG2.USER_ID
2948 ) TU
2949 INNER JOIN b_user U
2950 ON TU.USER_ID = U.ID
2951 ORDER BY
2952 U.ID
2953
2954 ";
2955 $res = $DB->Query($strSql);
2956 return $res;
2957 }
2958
2959 public static function GetUsersPropertiesArray($arUserIDs = array(), $arGuestIDs = array())
2960 {
2961 $arGuestUserIDs = array();
2962 $arResUsers = array();
2963 $arResGuests = array();
2964 $siteNameFormat = CSite::GetNameFormat();
2965 $isActive = CModule::IncludeModule("statistic");
2966 $arUserIDs = array_map('intval', $arUserIDs);
2967
2968 if(count($arGuestIDs) > 0)
2969 {
2970 $arGuestIDsU = array_unique($arGuestIDs);
2971 $arGuestIDsU = array_map('intval', $arGuestIDsU);
2972 $arGuestIDs = array();
2973 if($isActive)
2974 {
2975 $strGuests = implode("|", $arGuestIDsU);
2976 $rs = CGuest::GetList("ID", "asc", array( "ID" => $strGuests));
2977 while($ar = $rs->Fetch())
2978 {
2979 $arGuestUserIDs[] = intval($ar["LAST_USER_ID"]);
2980 $arGuestIDs[intval($ar["ID"])] = intval($ar["LAST_USER_ID"]);
2981 }
2982 }
2983 else
2984 {
2985 foreach($arGuestIDs as $k => $v)
2986 {
2987 $arGuestIDs[$v] = 0;
2988 }
2989 }
2990 }
2991
2992 if(count($arUserIDs) > 0)
2993 {
2994 $arRespUserIDs = array_unique(array_merge($arUserIDs, $arGuestUserIDs));
2995 $strUsers = implode("|", $arRespUserIDs);
2996 $rs = CUser::GetList('id', 'asc', array( "ID" => $strUsers), array("FIELDS"=>array("NAME", "SECOND_NAME","LAST_NAME","LOGIN","ID","EMAIL")));
2997 while($ar = $rs->Fetch())
2998 {
2999 $arResUsers[intval($ar["ID"])] = $ar;
3000 }
3001 }
3002
3003 foreach($arUserIDs as $k => $v)
3004 {
3005 if(!isset($arResUsers[$v]))
3006 {
3007 $arResUsers[$v] = array("NAME" => GetMessage("SUP_UNKNOWN_USER"), "SECOND_NAME" => "","LAST_NAME" => "","LOGIN" => GetMessage("SUP_UNKNOWN_USER"),"ID" => $v, "EMAIL" => "");
3008 }
3009 $name = CUser::FormatName($siteNameFormat, $arResUsers[$v], true, true);
3010 $arResUsers[$v]["HTML_NAME"] = "[<a title=\"" . GetMessage("SUP_USER_PROFILE") . "\" href=\"/bitrix/admin/user_edit.php?lang=" . LANGUAGE_ID . "&ID=" . $v . "\">" . $v."</a>] (" . htmlspecialcharsbx($arResUsers[$v]['LOGIN']) . ") " . $name;
3011 //" (".$str_OWNER_LOGIN.") ".$str_OWNER_NAME;
3012 $arResUsers[$v]["HTML_NAME_S"] = "[" . $v . "] " . $name;
3013 }
3014
3015 foreach($arGuestIDs as $k => $v)
3016 {
3017 if(isset($arResUsers[$v]))
3018 {
3019 $arResGuests[$k] = $arResUsers[$v];
3020 $arResGuests[$k]["UNKNOWN"] = false;
3021 }
3022 else
3023 {
3024 $arResGuests[$k] = array("NAME" => GetMessage("SUP_UNKNOWN_GUEST"), "SECOND_NAME" => "","LAST_NAME" => "","LOGIN" => GetMessage("SUP_UNKNOWN_GUEST"),"ID" => $v,"UNKNOWN" => true, "EMAIL" => "");
3025 }
3026 $name = CUser::FormatName($siteNameFormat, $arResGuests[$k], true, true);
3027 $arResGuests[$k]["HTML_NAME"] = "[<a title=\"" . GetMessage("SUP_USER_PROFILE") . "\" href=\"/bitrix/admin/user_edit.php?lang=" . LANGUAGE_ID . "&ID=" . $v . "\">" . $v."</a>] " . $name .
3028 " [<a title='" . GetMessage("SUP_GUEST_ID") . "' href='/bitrix/admin/guest_list.php?lang=" . LANG . "&find_id=" . $k . "&find_id_exact_match=Y&set_filter=Y'>" . $k . "</a>]";
3029 $arResUsers[$v]["HTML_NAME_S"] = "[" . $v . "] " . $name . " [" . $k . "]";
3030 }
3031
3032 return array("arUsers" => $arResUsers, "arGuests" => $arResGuests);
3033 }
3034}
$arParams
Определения access_dialog.php:21
$type
Определения options.php:106
global $APPLICATION
Определения include.php:80
static loadLanguageFile($file, $language=null, $normalize=true)
Определения loc.php:225
static GetList($by='c_sort', $order='asc', $arFilter=[], $SHOW_USERS_AMOUNT="N")
Определения group.php:136
static GetList($by='s_last_date', $order='desc', $arFilter=[])
Определения guest.php:4
static MarkAsSpam($ID, $bIsSPAM=true, $arRow=false)
Определения mail.php:2253
static GetByID($ID)
Определения mail.php:1492
static GetOptionString($module_id, $name, $def="", $site=false, $bExactSite=false)
Определения option.php:8
static GetByID($ID)
Определения site.php:749
static AddCurrent($event1, $event2="", $event3="", $money="", $currency="", $goto="", $chargeback="N", $site_id=false)
Определения statevent.php:38
static GetByID($id)
Определения dictionary.php:195
static GetBySID($sid, $type, $siteID=SITE_ID)
Определения dictionary.php:207
Определения support.php:8
static GetAdminRoleID()
Определения support.php:51
static UnMarkAsSpam($ticketID, $checkRights="Y")
Определения support.php:826
static UpdateOnline($ticketID, $userID=false, $currentMode="")
Определения support.php:1495
static GetSupportClientRoleID()
Определения support.php:36
static GetMessages($ticketID, $arFilter=array(), $checkRights="Y")
Определения support.php:2887
static GetMessageByID($id, $checkRights="Y", $get_user_name="Y")
Определения support.php:1423
static GetGroupsByRole($role)
Определения support.php:181
static Set_sendMails($nf, $v, $arFields)
Определения support.php:1816
static IsSupportTeam($userID=false)
Определения support.php:114
const ADD
Определения support.php:10
static GetCSupportTableFields($name, $arrOrTable=CSupportTableFields::C_Array)
Определения support.php:1572
const IGNORE
Определения support.php:13
static IsAdmin($userID=false)
Определения support.php:94
static GetRefBookValues($type, $site_id=false)
Определения support.php:2879
static IsSupportClient($userID=false)
Определения support.php:121
const REOPEN
Определения support.php:14
static GetRoles(&$isDemo, &$isSupportClient, &$isSupportTeam, &$isAdmin, &$isAccess, &$userID, $checkRights=true)
Определения support.php:142
static PrepareFields($arFields, $table, $id)
Определения support.php:388
static MarkMessageAsSpam($messageID, $exactly="Y", $checkRights="Y")
Определения support.php:697
static Set_WriteLog($nf, $v, $mf)
Определения support.php:1713
static ExecuteEvents($message, $arFields, $isNew, &$eventType=false)
Определения support.php:2904
static Set_getFilesLinks($arFiles, $lID)
Определения support.php:1697
const DELETE
Определения support.php:12
static GetFUA($site_id)
Определения support.php:2871
static CheckFields($arFields, $id, $arRequired)
Определения support.php:326
static IsDemo($userID=false)
Определения support.php:107
static GetResponsibleList($userID, $CMGM=null, $CMUGM=null, $SG=null)
Определения support.php:2914
static EmailsFromStringToArray($emails, $res=null)
Определения support.php:1538
static getMaxId()
Определения support.php:1433
static GetAdminGroups()
Определения support.php:224
static Set_InitVar(&$arFields, $id, $checkRights, $sendEmailToAuthor, $sendEmailToTechsupport)
Определения support.php:2328
static MarkAsSpam($ticketID, $exactly="Y", $checkRights="Y")
Определения support.php:789
static IsOwner($ticketID, $userID=false)
Определения support.php:126
static SplitTicket($arParam)
Определения support.php:603
static GetSupportTeamGroups()
Определения support.php:230
static GetResponsible()
Определения support.php:2894
static GetFileList($by='s_id', $order='asc', $arFilter=[], $checkRights='N')
Определения support.php:1279
static UpdateMessages($ticketID)
Определения support.php:1251
static GetSupportTeamAndAdminUsers()
Определения support.php:262
static GetEmailsByRole($role)
Определения support.php:236
const UPDATE
Определения support.php:11
static Delete($ticketID, $checkRights="Y")
Определения support.php:1449
static UnMarkMessageAsSpam($messageID, $checkRights="Y")
Определения support.php:746
static GetSupportTeamEmails()
Определения support.php:257
static addSupportText($cn)
Определения support.php:1532
static IsResponsible($userID=false)
Определения support.php:2899
static UpdateLastParamsN($ticketID, $dateType, $recalculateSupportDeadline=true, $setReopenDefault=true)
Определения support.php:1066
static Set_getResponsibleUser($v, $f, &$arFields)
Определения support.php:2209
static GetDeniedRoleID()
Определения support.php:31
static SetTicket($arFields, $ticketID="", $checkRights="Y", $sendEmailToAuthor="Y", $sendEmailToTechsupport="Y")
Определения support.php:1518
static Set_getCOUPONandSLA($v, $f, $arFields)
Определения support.php:2282
static HaveRole($role, $userID=false)
Определения support.php:57
static GetDemoRoleID()
Определения support.php:46
static GetByID($id, $lang=LANG, $checkRights="Y", $get_user_name="Y", $get_extra_names="Y", $arParams=Array())
Определения support.php:1428
static CheckFilter($arFilter)
Определения support.php:296
const NEW_SLA
Определения support.php:15
static GetUsersPropertiesArray($arUserIDs=array(), $arGuestIDs=array())
Определения support.php:2959
static GetSupportTeamRoleID()
Определения support.php:41
static GetAdminEmails()
Определения support.php:251
static RecalculateSupportDeadlineForOneTicket($arTicket, $arFields=array(), $dateType=array("EVENT"=>array(CTicket::IGNORE)))
Определения reminder.php:162
static GetByID($id)
Определения sla.php:214
static GetSLA( $siteID, $userID, $categoryID=null, $coupon="")
Определения sla.php:438
static reindexTicket($ticket, $messages=null)
Определения search.php:387
static isIndexExists()
Определения search.php:258
static UseCoupon($coupon)
Определения coupons.php:143
static GetList($arOrder=array(), $arFilter=array())
Определения coupons.php:249
const MORE0
Определения tablefields.php:25
const C_Array
Определения tablefields.php:30
const NOT_NULL
Определения tablefields.php:22
const NOT_EMTY_STR
Определения tablefields.php:26
const NOT_DEFAULT
Определения tablefields.php:23
const VT_Y_N
Определения tablefields.php:7
const VT_Y_N_NULL
Определения tablefields.php:8
const ONLY_CHANGED
Определения tablefields.php:24
const VT_DATE
Определения tablefields.php:9
const VT_NUMBER
Определения tablefields.php:5
const ALL
Определения tablefields.php:28
const VT_STRING
Определения tablefields.php:6
const VT_DATE_TIME
Определения tablefields.php:10
static GetList($by='s_c_sort', $order='asc', $arFilter=[])
Определения dictionary.php:7
static GetSupportTeamList()
Определения support.php:1370
static AddMessage($ticketID, $arFields, &$arrFILES, $checkRights="Y")
Определения support.php:301
static GetMessageList($by='s_number', $order='asc', $arFilter=[], $isFiltered=null, $checkRights="Y", $getUserName="Y")
Определения support.php:1435
static isnull( $field, $alternative)
Определения support.php:6
static Disable()
Определения time.php:31
static GetOffset($USER_ID=null, $forced=false)
Определения time.php:193
static Enable()
Определения time.php:36
$right
Определения options.php:8
$str
Определения commerceml2.php:63
$f
Определения component_props.php:52
$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
while($group=$gr->Fetch()) $bAdmin
Определения file_new.php:154
$arGroups
Определения options.php:1766
$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
$zr
Определения options.php:5
global $SUPPORT_CACHE_USER_ROLES
Определения support.php:4
$result
Определения get_property_values.php:14
$uid
Определения hot_keys_act.php:8
global $MESS
Определения bill.php:2
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
$emails
Определения mail_entry.php:72
if(!defined('SITE_ID')) $lang
Определения include.php:91
$z
Определения options.php:31
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
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
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
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
check_email($email, $strict=false, $domainCheck=false)
Определения tools.php:4571
CheckDateTime($datetime, $format=false)
Определения tools.php:398
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
$name
Определения menu_edit.php:35
$order
Определения payment.php:8
$email
Определения payment.php:49
$message
Определения payment.php:8
$arFiles
Определения options.php:60
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
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
$messages
Определения template.php:8
$val
Определения options.php:1793
$site_id
Определения sonet_set_content_view.php:9
const SITE_ID
Определения sonet_set_content_view.php:12
$rows
Определения options.php:264
$rs
Определения action.php:82
$k
Определения template_pdf.php:567
$GLOBALS['_____370096793']
Определения update_client.php:1
$n
Определения update_log.php:107
$arFilter
Определения user_search.php:106