PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/support/classes/general/update.php

https://gitlab.com/alexprowars/bitrix
PHP | 587 lines | 519 code | 65 blank | 3 comment | 18 complexity | ee48e7ae3c9f66674bc44aa2f60b775a MD5 | raw file
  1. <?
  2. IncludeModuleLangFile(__FILE__);
  3. class CAllSupportUpdate
  4. {
  5. function err_mess()
  6. {
  7. $module_id = "support";
  8. @include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/".$module_id."/install/version.php");
  9. return "<br>Module: ".$module_id." (".$arModuleVersion["VERSION"].")<br>Class: CAllSupportUpdate<br>File: ".__FILE__;
  10. }
  11. function GetUpdateVersion()
  12. {
  13. return 12000004;
  14. }
  15. function CurrentVersionLowerThanUpdateVersion()
  16. {
  17. $supUpdVer = intval(COption::GetOptionString("support", "SUPPORT_UPDATE_VERSION"));
  18. return ($supUpdVer < CSupportUpdate::GetUpdateVersion());
  19. }
  20. function ChangeCurrentVersion()
  21. {
  22. COption::SetOptionString("support", "SUPPORT_UPDATE_VERSION", CSupportUpdate::GetUpdateVersion());
  23. }
  24. function Update()
  25. {
  26. if(CSupportUpdate::CurrentVersionLowerThanUpdateVersion())
  27. {
  28. $dbType = CSupportUpdate::GetBD();
  29. $res = self::AlterTables($dbType);
  30. if(!$res) return false;
  31. $res = self::SeparateSLAandTimeTable($dbType);
  32. if(!$res) return false;
  33. CSupportTimetableCache::toCache();
  34. CTicketReminder::RecalculateSupportDeadline();
  35. CTicketReminder::StartAgent();
  36. CSupportUpdate::ChangeCurrentVersion();
  37. self::SetHotKeys();
  38. }
  39. }
  40. function AlterTables($dbType)
  41. {
  42. global $DB;
  43. $err_mess = (CAllSupportUpdate::err_mess())."<br>Function: AlterTables<br>Line: ";
  44. //add tables
  45. $addTables = array(
  46. "b_ticket_timetable" => array(
  47. "MySQL" => "
  48. CREATE TABLE b_ticket_timetable
  49. (
  50. ID INT(18) not null auto_increment,
  51. NAME varchar(255) not null,
  52. DESCRIPTION text,
  53. PRIMARY KEY (ID)
  54. )
  55. ",
  56. "MSSQL" => "
  57. CREATE TABLE b_ticket_timetable
  58. (
  59. ID int NOT NULL IDENTITY (1, 1),
  60. NAME varchar(255) NOT NULL,
  61. DESCRIPTION TEXT NULL
  62. )
  63. GO
  64. ALTER TABLE b_ticket_timetable ADD CONSTRAINT PK_b_ticket_timetable PRIMARY KEY (ID)
  65. GO
  66. ",
  67. "Oracle" => "
  68. CREATE TABLE b_ticket_timetable
  69. (
  70. ID NUMBER(18) NOT NULL,
  71. NAME VARCHAR2(255 CHAR) NULL,
  72. DESCRIPTION CLOB NULL,
  73. PRIMARY KEY (ID)
  74. )
  75. /
  76. CREATE SEQUENCE SQ_b_ticket_timetable START WITH 1 INCREMENT BY 1 NOMINVALUE NOMAXVALUE NOCYCLE NOCACHE NOORDER
  77. /
  78. "
  79. ),
  80. "b_ticket_holidays" => array(
  81. "MySQL" => "
  82. CREATE TABLE b_ticket_holidays
  83. (
  84. ID INT(18) not null auto_increment,
  85. NAME varchar(255) not null,
  86. DESCRIPTION text,
  87. OPEN_TIME varchar(10) not null default 'HOLIDAY',
  88. DATE_FROM datetime not null,
  89. DATE_TILL datetime not null,
  90. PRIMARY KEY (ID)
  91. )
  92. ",
  93. "MSSQL" => "
  94. CREATE TABLE b_ticket_holidays
  95. (
  96. ID int NOT NULL IDENTITY (1, 1),
  97. NAME varchar(255) NOT NULL,
  98. DESCRIPTION TEXT NULL,
  99. OPEN_TIME varchar(255) NOT NULL,
  100. DATE_FROM datetime NOT NULL,
  101. DATE_TILL datetime NOT NULL
  102. )
  103. GO
  104. ALTER TABLE b_ticket_holidays ADD CONSTRAINT PK_b_ticket_holidays PRIMARY KEY (ID)
  105. GO
  106. ALTER TABLE b_ticket_holidays ADD CONSTRAINT DF_b_ticket_holidays_OPEN_TIME DEFAULT 'HOLIDAY' FOR OPEN_TIME
  107. GO
  108. ",
  109. "Oracle" => "
  110. CREATE TABLE b_ticket_holidays
  111. (
  112. ID NUMBER(18) NOT NULL,
  113. NAME VARCHAR2(255 CHAR) NULL,
  114. DESCRIPTION CLOB NULL,
  115. OPEN_TIME VARCHAR2(10 CHAR) DEFAULT ('HOLIDAY') NOT NULL,
  116. DATE_FROM DATE NOT NULL,
  117. DATE_TILL DATE NOT NULL,
  118. PRIMARY KEY (ID)
  119. )
  120. /
  121. CREATE SEQUENCE SQ_b_ticket_holidays START WITH 1 INCREMENT BY 1 NOMINVALUE NOMAXVALUE NOCYCLE NOCACHE NOORDER
  122. /
  123. "
  124. ),
  125. "b_ticket_sla_2_holidays" => array(
  126. "MySQL" => "
  127. CREATE TABLE b_ticket_sla_2_holidays
  128. (
  129. SLA_ID INT(18) not null,
  130. HOLIDAYS_ID INT(18) not null
  131. )
  132. ",
  133. "MSSQL" => "
  134. CREATE TABLE b_ticket_sla_2_holidays
  135. (
  136. SLA_ID int NOT NULL,
  137. HOLIDAYS_ID int NOT NULL
  138. )
  139. ",
  140. "Oracle" => "
  141. CREATE TABLE b_ticket_sla_2_holidays
  142. (
  143. SLA_ID NUMBER(18) NOT NULL,
  144. HOLIDAYS_ID NUMBER(18) NOT NULL
  145. )
  146. /
  147. "
  148. ),
  149. "b_ticket_search" => array(
  150. "MySQL" => "
  151. CREATE TABLE b_ticket_search
  152. (
  153. MESSAGE_ID INT(18) not null,
  154. SEARCH_WORD varchar(70) not null
  155. );
  156. ALTER TABLE b_ticket_search ADD INDEX UX_b_ticket_search(SEARCH_WORD)
  157. ",
  158. "MSSQL" => "
  159. CREATE TABLE b_ticket_search
  160. (
  161. MESSAGE_ID int NOT NULL,
  162. SEARCH_WORD varchar(70) NOT NULL
  163. )
  164. GO
  165. CREATE INDEX UX_b_ticket_search ON b_ticket_search (SEARCH_WORD)
  166. GO
  167. ",
  168. "Oracle" => "
  169. CREATE TABLE b_ticket_search
  170. (
  171. MESSAGE_ID NUMBER(18) NOT NULL,
  172. SEARCH_WORD VARCHAR2(70 CHAR) NULL
  173. )
  174. /
  175. CREATE INDEX UX_b_ticket_search ON b_ticket_search(SEARCH_WORD)
  176. /
  177. "
  178. ),
  179. "b_ticket_timetable_cache" => array(
  180. "MySQL" => "
  181. CREATE TABLE b_ticket_timetable_cache
  182. (
  183. ID INT(18) not null auto_increment,
  184. SLA_ID INT(18) not null,
  185. DATE_FROM datetime not null,
  186. DATE_TILL datetime not null,
  187. W_TIME INT(18) not null,
  188. W_TIME_INC INT(18) not null,
  189. PRIMARY KEY (ID)
  190. )
  191. ",
  192. "MSSQL" => "
  193. CREATE TABLE b_ticket_timetable_cache
  194. (
  195. ID int NOT NULL IDENTITY (1, 1),
  196. SLA_ID int NOT NULL,
  197. DATE_FROM datetime NOT NULL,
  198. DATE_TILL datetime NOT NULL,
  199. W_TIME int NOT NULL,
  200. W_TIME_INC int NOT NULL
  201. )
  202. GO
  203. ALTER TABLE b_ticket_timetable_cache ADD CONSTRAINT PK_b_ticket_timetable_cache PRIMARY KEY (ID)
  204. GO
  205. ",
  206. "Oracle" => "
  207. CREATE TABLE b_ticket_timetable_cache
  208. (
  209. ID NUMBER(18) NOT NULL,
  210. SLA_ID NUMBER(18) NOT NULL,
  211. DATE_FROM DATE NOT NULL,
  212. DATE_TILL DATE NOT NULL,
  213. W_TIME NUMBER(18) NOT NULL,
  214. W_TIME_INC NUMBER(18) NOT NULL,
  215. PRIMARY KEY (ID)
  216. )
  217. /
  218. CREATE SEQUENCE SQ_b_ticket_timetable_cache START WITH 1 INCREMENT BY 1 NOMINVALUE NOMAXVALUE NOCYCLE NOCACHE NOORDER
  219. /
  220. "
  221. ),
  222. );
  223. //delete fields
  224. $deleteFields = array(
  225. "b_ticket" => array(
  226. "DATE_OF_FIRST_USER_MSG_AFTER_SUP_MSG",
  227. "ID_OF_FIRST_USER_MSG_AFTER_SUP_MSG",
  228. "DATE_FIRST_USER_M_AFTER_SUP_M",
  229. "ID_FIRST_USER_M_AFTER_SUP_M",
  230. ),
  231. );
  232. //add fields
  233. $addFields = array(
  234. "b_ticket" => array(
  235. array("FIELD" => "SUPPORT_DEADLINE", "MySQL" => "datetime null", "MSSQL" => "datetime NULL", "Oracle" => "DATE NULL",),
  236. array("FIELD" => "SUPPORT_DEADLINE_NOTIFY", "MySQL" => "datetime null", "MSSQL" => "datetime NULL", "Oracle" => "DATE NULL",),
  237. array("FIELD" => "D_1_USER_M_AFTER_SUP_M", "MySQL" => "datetime null", "MSSQL" => "datetime NULL", "Oracle" => "DATE NULL",),
  238. array("FIELD" => "ID_1_USER_M_AFTER_SUP_M", "MySQL" => "int(18) null", "MSSQL" => "int NULL", "Oracle" => "NUMBER(18) NULL",),
  239. ),
  240. "b_ticket_sla"=> array(
  241. array("FIELD" => "TIMETABLE_ID", "MySQL" => "int(18) null", "MSSQL" => "int NULL", "Oracle" => "NUMBER(18) NULL",),
  242. ),
  243. "b_ticket_sla_shedule" => array(
  244. array("FIELD" => "TIMETABLE_ID", "MySQL" => "int(18) null", "MSSQL" => "int NULL", "Oracle" => "NUMBER(18) NULL",),
  245. ),
  246. "b_ticket_user_ugroup" => array(
  247. array("FIELD" => "CAN_MAIL_UPDATE_GROUP_MESSAGES", "MySQL" => "char(1) NOT NULL default 'N'", "MSSQL" => "char(1) NOT NULL DEFAULT 'N'", "Oracle" => "CHAR(1 CHAR) DEFAULT 'N' NOT NULL",),
  248. ),
  249. );
  250. if($DB->TableExists("b_ticket"))
  251. {
  252. foreach($addTables as $table => $arr)
  253. {
  254. if(!$DB->TableExists($table))
  255. {
  256. $arQuery = $DB->ParseSQLBatch(str_replace("\r", "", $arr[$dbType]));
  257. foreach($arQuery as $i => $sql)
  258. {
  259. $res = $DB->Query($sql, true);
  260. if(!$res) return false;
  261. }
  262. }
  263. }
  264. }
  265. foreach($deleteFields as $table => $arr)
  266. {
  267. if($DB->TableExists($table))
  268. {
  269. foreach($arr as $n => $FN)
  270. {
  271. if($DB->Query("select $FN from $table WHERE 1=0", true))
  272. {
  273. $res = $DB->Query("ALTER TABLE $table DROP $FN", true);
  274. if(!$res) return false;
  275. }
  276. }
  277. }
  278. }
  279. foreach($addFields as $table => $arr)
  280. {
  281. if($DB->TableExists($table))
  282. {
  283. foreach($arr as $n => $arrF)
  284. {
  285. $FN = $arrF["FIELD"];
  286. $FT = $arrF[$dbType];
  287. if(!$DB->Query("select $FN from $table WHERE 1=0", true))
  288. {
  289. $res = $DB->Query("ALTER TABLE $table ADD $FN $FT", true);
  290. if(!$res) return false;
  291. }
  292. }
  293. }
  294. }
  295. return true;
  296. }
  297. function SeparateSLAandTimeTable($dbType)
  298. {
  299. global $DB;
  300. $err_mess = (CAllSupportUpdate::err_mess())."<br>Function: SeparateSLAandTimeTable<br>Line: ";
  301. $strUsers = implode(",", CTicket::GetSupportTeamAndAdminUsers());
  302. $strSql0 = "
  303. b_ticket
  304. INNER JOIN (
  305. SELECT
  306. TM.TICKET_ID ID,
  307. MIN(TM.ID) M_ID
  308. FROM
  309. b_ticket_message TM
  310. INNER JOIN (
  311. SELECT
  312. T.ID ID,
  313. MAX(" . CTicket::isnull("TM.ID", "0") . ") M_ID
  314. FROM
  315. b_ticket T
  316. LEFT JOIN b_ticket_message TM
  317. ON T.ID = TM.TICKET_ID
  318. AND (TM.IS_LOG='N' OR TM.IS_LOG IS NULL OR " . $DB->Length("TM.IS_LOG") . " <= 0)
  319. AND TM.OWNER_USER_ID IN ($strUsers)
  320. WHERE
  321. T.DATE_CLOSE IS NULL
  322. GROUP BY
  323. T.ID
  324. ) AS Q
  325. ON TM.TICKET_ID = Q.ID
  326. AND TM.ID > Q.M_ID
  327. GROUP BY
  328. TM.TICKET_ID
  329. ) AS Q
  330. ON b_ticket.ID = Q.ID
  331. INNER JOIN b_ticket_message AS M
  332. ON Q.M_ID = M.ID
  333. ";
  334. $updateQueries = array(
  335. "b_ticket_timetable,b_ticket_sla,b_ticket_sla_shedule" => array(
  336. 0 => array(
  337. "MySQL" => "
  338. INSERT INTO b_ticket_timetable (NAME, DESCRIPTION)
  339. SELECT NAME, ID
  340. FROM b_ticket_sla
  341. ",
  342. "MSSQL" => "
  343. INSERT INTO b_ticket_timetable (NAME, DESCRIPTION)
  344. SELECT NAME, CAST(CAST(ID AS varchar) AS text)
  345. FROM b_ticket_sla
  346. ",
  347. "Oracle" => "
  348. INSERT INTO b_ticket_timetable (ID, NAME, DESCRIPTION)
  349. SELECT SQ_b_ticket_timetable.nextval, NAME, ID
  350. FROM b_ticket_sla
  351. "
  352. ),
  353. 1 => array(
  354. "MySQL" => "
  355. UPDATE b_ticket_sla AS S
  356. INNER JOIN b_ticket_timetable AS T
  357. ON (S.ID = cast(T.DESCRIPTION as UNSIGNED))
  358. AND T.DESCRIPTION IS NOT NULL
  359. AND S.TIMETABLE_ID IS NULL
  360. SET S.TIMETABLE_ID = T.ID
  361. ",
  362. "MSSQL" => "
  363. UPDATE b_ticket_sla
  364. SET b_ticket_sla.TIMETABLE_ID = T.ID
  365. FROM
  366. b_ticket_sla
  367. INNER JOIN b_ticket_timetable AS T
  368. ON (b_ticket_sla.ID = CAST(CAST(T.DESCRIPTION AS varchar) AS int))
  369. AND T.DESCRIPTION IS NOT NULL
  370. AND b_ticket_sla.TIMETABLE_ID IS NULL
  371. ",
  372. "Oracle" => "
  373. UPDATE b_ticket_sla SET TIMETABLE_ID = (
  374. SELECT T.ID
  375. FROM b_ticket_timetable T
  376. WHERE
  377. b_ticket_sla.ID = CAST(CAST(T.DESCRIPTION as VARCHAR2(18 CHAR)) as int)
  378. AND T.DESCRIPTION IS NOT NULL
  379. )
  380. WHERE
  381. TIMETABLE_ID IS NULL
  382. "
  383. ),
  384. 2 => array(
  385. "MySQL" => "
  386. UPDATE b_ticket_sla_shedule AS SS
  387. INNER JOIN b_ticket_timetable AS T
  388. ON (SS.SLA_ID = cast(T.DESCRIPTION as UNSIGNED))
  389. AND T.DESCRIPTION IS NOT NULL
  390. SET SS.TIMETABLE_ID = T.ID
  391. ",
  392. "MSSQL" => "
  393. UPDATE b_ticket_sla_shedule SET TIMETABLE_ID = (
  394. SELECT T.ID
  395. FROM
  396. b_ticket_timetable AS T
  397. WHERE
  398. b_ticket_sla_shedule.SLA_ID = CAST(CAST(T.DESCRIPTION AS varchar) AS int)
  399. AND T.DESCRIPTION IS NOT NULL
  400. )
  401. ",
  402. "Oracle" => "
  403. UPDATE b_ticket_sla_shedule SET TIMETABLE_ID = (
  404. SELECT T.ID
  405. FROM
  406. b_ticket_timetable T
  407. WHERE
  408. b_ticket_sla_shedule.SLA_ID = CAST(CAST(T.DESCRIPTION as VARCHAR2(18 CHAR)) as int)
  409. AND T.DESCRIPTION IS NOT NULL
  410. )
  411. "
  412. ),
  413. 3 => array(
  414. "MySQL" => "
  415. UPDATE b_ticket_timetable
  416. SET DESCRIPTION = NULL
  417. ",
  418. "MSSQL" => "
  419. UPDATE b_ticket_timetable
  420. SET DESCRIPTION = NULL
  421. ",
  422. "Oracle" => "
  423. UPDATE b_ticket_timetable
  424. SET DESCRIPTION = NULL
  425. ",
  426. ),
  427. ),
  428. "b_ticket" => array(
  429. 0 => array(
  430. "MySQL" => "
  431. UPDATE $strSql0
  432. SET
  433. b_ticket.D_1_USER_M_AFTER_SUP_M = M.DATE_CREATE,
  434. b_ticket.ID_1_USER_M_AFTER_SUP_M = M.ID,
  435. b_ticket.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
  436. ",
  437. "MSSQL" => "
  438. UPDATE b_ticket
  439. SET
  440. b_ticket.D_1_USER_M_AFTER_SUP_M = M.DATE_CREATE,
  441. b_ticket.ID_1_USER_M_AFTER_SUP_M = M.ID,
  442. b_ticket.LAST_MESSAGE_BY_SUPPORT_TEAM = 'N'
  443. FROM $strSql0
  444. ",
  445. "Oracle" => "
  446. UPDATE b_ticket T0
  447. SET (D_1_USER_M_AFTER_SUP_M, ID_1_USER_M_AFTER_SUP_M, LAST_MESSAGE_BY_SUPPORT_TEAM) = (
  448. SELECT
  449. M.DATE_CREATE,
  450. M.ID,
  451. 'N'
  452. FROM ".str_replace(" AS ", " ", $strSql0)."
  453. WHERE b_ticket.ID = T0.ID
  454. )
  455. ",
  456. ),
  457. ),
  458. );
  459. foreach($updateQueries as $checkTables => $arT)
  460. {
  461. $arCT = explode(",", $checkTables);
  462. $skipU = false;
  463. foreach($arCT as $n => $t)
  464. {
  465. if(!$DB->TableExists($t))
  466. {
  467. $skipU = true;
  468. }
  469. }
  470. if(!$skipU)
  471. {
  472. foreach($arT as $n1 => $arQ)
  473. {
  474. $arQuery = $DB->ParseSQLBatch(str_replace("\r", "", $arQ[$dbType]));
  475. foreach($arQuery as $i => $sql)
  476. {
  477. $res = $DB->Query($sql, true);
  478. if(!$res) return false;
  479. }
  480. }
  481. }
  482. }
  483. return true;
  484. }
  485. function SetHotKeys()
  486. {
  487. $arHK = array(
  488. "B" => "Alt+66",
  489. "I" => "Alt+73",
  490. "U" => "Alt+85",
  491. "QUOTE" => "Alt+81",
  492. "CODE" => "Alt+67",
  493. "TRANSLIT" => "Alt+84",
  494. );
  495. $hkc = new CHotKeysCode;
  496. foreach($arHK as $s => $hk)
  497. {
  498. $className = "TICKET_EDIT_$s";
  499. $arHKC = array (
  500. CLASS_NAME => $className,
  501. CODE => "var d=document.getElementById('$s'); if (d) d.click();",
  502. NAME => " ($id)",
  503. TITLE_OBJ => "TICKET_EDIT_" . $s . "_T",
  504. IS_CUSTOM => "1"
  505. );
  506. $objK = $hkc->GetList(array(), Array("CLASS_NAME"=>$className));
  507. if($arK = $objK->Fetch())
  508. {
  509. $hkc->Update($arK["ID"],$arHKC);
  510. }
  511. else
  512. {
  513. $id = $hkc->Add($arHKC);
  514. if($id > 0)
  515. {
  516. $result = CHotKeys::GetInstance()->AddDefaultKeyToAll($id, $hk);
  517. }
  518. }
  519. }
  520. }
  521. }
  522. ?>