FixCrmProcesInitIdx.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('DebugExecutionTime');
  4. class Route_FixCrmProcesInitIdx extends RouteBase {
  5. public function handleAuth() {
  6. if (!User::logged()) {
  7. throw new HttpException('Unauthorized', 401);
  8. }
  9. }
  10. public function defaultAction() {
  11. SE_Layout::gora();
  12. ?>
  13. <a href="index.php?_route=FixCrmProcesInitIdx&_task=run">aktualizuj uprawnienia</a>
  14. <?php
  15. }
  16. public function runAction() {
  17. SE_Layout::gora();
  18. SE_Layout::menu();
  19. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  20. $dbgExecTime = new DebugExecutionTime();
  21. if ($DBG_TIME) $dbgExecTime->activate();
  22. $dbgExecTime->log('start');
  23. $this->_callProcedure();
  24. $dbgExecTime->log('procedure');
  25. $procExecTime = $dbgExecTime->getLastExecTime();
  26. //$totalExecTime = $dbgExecTime->getTotalExecTime();
  27. ?>
  28. <div class="container">
  29. <div class="alert alert-success">
  30. Zaktualizowano uprawnienia
  31. <br><span style="font-style:italic; opacity:0.4;">(<?php echo number_format($procExecTime, 6); ?> s)</span>
  32. </div>
  33. </div>
  34. <?php
  35. if($DBG_TIME){
  36. $dbgExecTime->log('end');
  37. //$dbgExecTime->printDebug();
  38. }
  39. SE_Layout::dol();
  40. }
  41. public function runApiAction() {
  42. $this->_callProcedure();
  43. die('Zaktualizowano uprawnienia');
  44. }
  45. private function _callProcedure() {
  46. $sql = "call `update_proces_init_idx_rec`();";
  47. $db = DB::getDB();
  48. if ($db->has_errors()) {
  49. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  50. }
  51. $res = $db->query($sql);
  52. if ($db->has_errors()) {
  53. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  54. }
  55. }
  56. public function test1Action() {
  57. $sql = <<<SQL
  58. select count(*) as cnt, p.`ID`, group_concat(i.`idx_PROCES_INIT_ID`), group_concat(i.`idx_PROCES_WITH_GROUPS_ID`)
  59. from `CRM_PROCES` p
  60. left join `CRM_PROCES_idx` i on(i.`ID`=p.`ID`)
  61. where i.`ID`=p.`ID`
  62. group by p.`ID`
  63. order by cnt desc
  64. SQL;
  65. $db = DB::getDB();
  66. if ($db->has_errors()) {
  67. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  68. }
  69. $res = $db->query($sql);
  70. if ($db->has_errors()) {
  71. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  72. }
  73. while ($r = $db->fetch($res)) {
  74. echo'<pre>';print_r($r);echo'</pre>';
  75. }
  76. }
  77. public function test2Action() {
  78. $sqlList = array();
  79. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  80. $sqlList['InstallTableGroupToInit'] = <<<SQL
  81. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUPS_to_INIT` (
  82. `PROCES_INIT_ID` int(11) NOT NULL
  83. , `GROUP_ID` int(11) NOT NULL
  84. , KEY `PROCES_INIT_ID` (`PROCES_INIT_ID`)
  85. , KEY `GROUP_ID` (`GROUP_ID`)
  86. , UNIQUE KEY `uniq__GROUP_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  87. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  88. SQL;
  89. $sqlList['UpdateTableGroupToInit'] = <<<SQL
  90. insert ignore into `CRM_PROCES_idx_GROUPS_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  91. select i.`ID` as PROCES_INIT_ID, z.`ID` as GROUP_ID
  92. from `CRM_PROCES_idx` i
  93. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  94. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  95. )
  96. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  97. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  98. and z.`A_STATUS` in('NORMAL', 'WAITING')
  99. )
  100. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  101. and przyp.`FORM_TREAT` & 8 -- has perm X
  102. )
  103. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  104. SQL;
  105. $db = DB::getDB();
  106. if ($db->has_errors()) {
  107. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  108. }
  109. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  110. $dbgExecTime = new DebugExecutionTime();
  111. if ($DBG_TIME) $dbgExecTime->activate();
  112. $dbgExecTime->log('start');
  113. foreach ($sqlList as $sqlName => $sql) {
  114. $res = $db->query($sql);
  115. if ($db->has_errors()) {
  116. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  117. }
  118. if($DBG_TIME) $dbgExecTime->log("end-{$sqlName}");
  119. }
  120. if($DBG_TIME) $dbgExecTime->printDebug();
  121. }
  122. public function runDebugAction() {
  123. $sqlList = array();
  124. // SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  125. // SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  126. $sqlList['0-prepare-while-1-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while1`";
  127. $sqlList['0-prepare-while-1-create'] = <<<SQL
  128. CREATE PROCEDURE `update_proces_init_idx_rec__while1`()
  129. BEGIN
  130. update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0);
  131. SET @i = 0;
  132. SET @loopLomit = 100;
  133. SET @pinitCnt = 1;
  134. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  135. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`)
  136. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  137. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  138. SET @pinitCnt = ROW_COUNT();
  139. SET @i = @i + 1;
  140. END WHILE;
  141. END
  142. SQL;
  143. $sqlList['0-prepare-while-2-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while2`";
  144. $sqlList['0-prepare-while-2-create'] = <<<SQL
  145. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  146. BEGIN
  147. SET @i = 0;
  148. SET @loopLomit = 100;
  149. SET @groupCnt = 1;
  150. WHILE @i < @loopLomit and @groupCnt > 0 DO
  151. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`)
  152. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  153. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  154. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  155. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  156. SET @groupCnt = ROW_COUNT();
  157. SET @i = @i + 1;
  158. END WHILE;
  159. END
  160. SQL;
  161. $sqlList__TEST_PERF_NO_DIFF['0-prepare-while-2-create'] = <<<SQL
  162. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  163. BEGIN
  164. SET @i = 0;
  165. SET @loopLomit = 100;
  166. SET @groupCnt = 1;
  167. WHILE @i < @loopLomit and @groupCnt > 0 DO
  168. update `CRM_PROCES_idx` as p
  169. join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`
  170. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  171. and pp.`idx_PROCES_WITH_GROUPS_ID`>0
  172. )
  173. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  174. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  175. ;
  176. SET @groupCnt = ROW_COUNT();
  177. SET @i = @i + 1;
  178. END WHILE;
  179. END
  180. SQL;
  181. $sqlList['1-set-start-time-in-config'] = <<<SQL
  182. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_start', NOW());
  183. SQL;
  184. $sqlList['2-truncate-table'] = <<<SQL
  185. truncate table `CRM_PROCES_idx`;
  186. -- delete from `CRM_PROCES_idx`;
  187. SQL;
  188. $sqlList['3-fill-CRM_PROCES_idx'] = <<<SQL
  189. -- select 'insert into `CRM_PROCES_idx`...';
  190. insert into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  191. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  192. from `CRM_PROCES` p
  193. where p.`A_STATUS` in('NORMAL','WAITING')
  194. ;
  195. SQL;
  196. $sqlList['4-while-1'] = <<<SQL
  197. call `update_proces_init_idx_rec__while1`();
  198. SQL;
  199. $sqlList['5-before-while-2'] = <<<SQL
  200. update `CRM_PROCES_idx` i
  201. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID`
  202. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  203. )
  204. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  205. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  206. and z.`A_STATUS` in('NORMAL', 'WAITING')
  207. )
  208. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  209. and przyp.`FORM_TREAT` & 8 -- has perm X
  210. )
  211. set
  212. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID`
  213. where i.`idx_PROCES_INIT_ID`>0;
  214. SQL;
  215. $sqlList['6-while-2'] = <<<SQL
  216. call `update_proces_init_idx_rec__while2`();
  217. SQL;
  218. $sqlList['7-goto_and_return'] = <<<SQL
  219. insert ignore into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  220. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  221. , pi.`idx_PROCES_WITH_GROUPS_ID`
  222. from `CRM_PROCES` p
  223. join `CRM_PROCES_idx` pi on(pi.`ID`=p.`ID`)
  224. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  225. and g.`TYPE`='PROCES_INIT'
  226. and g.`A_STATUS` in('NORMAL','WAITING')
  227. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  228. and p.`IF_TRUE_GOTO`>0
  229. )
  230. where p.`A_STATUS` in('NORMAL','WAITING')
  231. and 0=(select IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, 0, -1) from `CRM_PROCES_idx` i where i.`ID`=g.`ID`)
  232. ;
  233. -- SET @groupCnt = ROW_COUNT();
  234. SQL;
  235. $sqlList['8-update-idx_PROCES_WITH_GROUPS_ID-zero-where-null'] = <<<SQL
  236. update `CRM_PROCES_idx`
  237. set `idx_PROCES_WITH_GROUPS_ID`=0
  238. where `idx_PROCES_WITH_GROUPS_ID` is null
  239. and `TYPE`='PROCES_INIT'
  240. ;
  241. SQL;
  242. $sqlList['9-fix-goto_and_return'] = <<<SQL
  243. insert ignore into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  244. select i.`ID`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  245. from `CRM_PROCES_idx` i
  246. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  247. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  248. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  249. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  250. and i.`TYPE`!='GOTO_AND_RETURN'
  251. ;
  252. SQL;
  253. $sqlList['10-delete-where-!idx_PROCES_WITH_GROUPS_ID'] = <<<SQL
  254. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  255. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  256. SQL;
  257. $sqlList['11-update-CRM_PROCES-idx_PROCES_INIT_ID'] = <<<SQL
  258. -- select 'update `CRM_PROCES`...';
  259. update `CRM_PROCES` p
  260. set p.`idx_PROCES_INIT_ID`=coalesce((select i.`idx_PROCES_INIT_ID` from `CRM_PROCES_idx` i where i.`ID`=p.`ID` limit 1), 0)
  261. ;
  262. SQL;
  263. $sqlList['11-clear-CRM_PROCES_idx_GROUPS_to_INIT'] = <<<SQL
  264. -- select 'update `CRM_PROCES_idx_GROUPS_to_INIT`...';
  265. truncate table `CRM_PROCES_idx_GROUPS_to_INIT`;
  266. SQL;
  267. $sqlList['11-fill-CRM_PROCES_idx_GROUPS_to_INIT'] = <<<SQL
  268. insert ignore into `CRM_PROCES_idx_GROUPS_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  269. select i.`ID` as PROCES_INIT_ID, z.`ID` as GROUP_ID
  270. from `CRM_PROCES_idx` i
  271. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  272. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  273. )
  274. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  275. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  276. and z.`A_STATUS` in('NORMAL', 'WAITING')
  277. )
  278. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  279. and przyp.`FORM_TREAT` & 8 -- has perm X
  280. )
  281. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN');
  282. SQL;
  283. $sqlList['12-set-end-time-in-config'] = <<<SQL
  284. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
  285. SQL;
  286. $db = DB::getDB();
  287. if ($db->has_errors()) {
  288. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  289. }
  290. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  291. $dbgExecTime = new DebugExecutionTime();
  292. if ($DBG_TIME) $dbgExecTime->activate();
  293. $dbgExecTime->log('start');
  294. foreach ($sqlList as $sqlName => $sql) {
  295. $res = $db->query($sql);
  296. if ($db->has_errors()) {
  297. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  298. }
  299. if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
  300. }
  301. if($DBG_TIME) $dbgExecTime->printDebug();
  302. }
  303. public function reinstallAction() {
  304. $this->reinstall();
  305. die('OK');
  306. }
  307. public function reinstall() {
  308. $sqlList = array();
  309. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx`";
  310. $sqlList['InstallTable'] = <<<SQL
  311. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx` (
  312. `ID` int(11) NOT NULL
  313. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  314. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  315. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  316. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  317. -- , `idx_PATH` text NOT NULL
  318. , KEY `ID` (`ID`)
  319. , KEY `PARENT_ID` (`PARENT_ID`)
  320. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  321. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  322. , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID`,`idx_PROCES_WITH_GROUPS_ID`)
  323. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  324. SQL;
  325. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  326. $sqlList['InstallTableGroupToInit'] = <<<SQL
  327. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUPS_to_INIT` (
  328. `PROCES_INIT_ID` int(11) NOT NULL
  329. , `GROUP_ID` int(11) NOT NULL
  330. , KEY `PROCES_INIT_ID` (`PROCES_INIT_ID`)
  331. , KEY `GROUP_ID` (`GROUP_ID`)
  332. , UNIQUE KEY `uniq__GROUP_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  333. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  334. SQL;
  335. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec`";
  336. $sqlList['CreateProcedure'] = <<<SQL
  337. CREATE PROCEDURE `update_proces_init_idx_rec`()
  338. BEGIN
  339. SET @enabled = FALSE;
  340. SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  341. SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  342. -- if already runnig mysql will throw "Commands out of sync; you can't run this command now"
  343. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_start_key, NOW());
  344. -- select 'truncate->delete...';
  345. truncate table `CRM_PROCES_idx`;
  346. -- delete from `CRM_PROCES_idx`;
  347. -- select 'insert into `CRM_PROCES_idx`...';
  348. insert into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  349. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  350. from `CRM_PROCES` p
  351. where p.`A_STATUS` in('NORMAL','WAITING')
  352. ;
  353. -- select 'while 1...';
  354. update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0);
  355. SET @i = 0;
  356. SET @loopLomit = 100;
  357. SET @pinitCnt = 1;
  358. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  359. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`)
  360. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  361. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  362. SET @pinitCnt = ROW_COUNT();
  363. SET @i = @i + 1;
  364. END WHILE;
  365. -- select 'while 2... search stanowiska';
  366. update `CRM_PROCES_idx` i
  367. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID`
  368. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  369. -- TODO: and wsk.`` like 'X' - IF(przyp.`FORM_TREAT` & 8, 1, 0) as PERM_X
  370. )
  371. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  372. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  373. and z.`A_STATUS` in('NORMAL', 'WAITING')
  374. )
  375. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  376. and przyp.`FORM_TREAT` & 8 -- has perm X
  377. )
  378. set
  379. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID`
  380. where i.`idx_PROCES_INIT_ID`>0;
  381. SET @i = 0;
  382. SET @loopLomit = 100;
  383. SET @groupCnt = 1;
  384. WHILE @i < @loopLomit and @groupCnt > 0 DO
  385. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID`=p.`PARENT_ID`)
  386. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  387. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  388. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  389. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  390. SET @groupCnt = ROW_COUNT();
  391. SET @i = @i + 1;
  392. END WHILE;
  393. -- select 'GOTO_AND_RETURN...';
  394. insert ignore into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  395. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  396. , pi.`idx_PROCES_WITH_GROUPS_ID`
  397. from `CRM_PROCES` p
  398. join `CRM_PROCES_idx` pi on(pi.`ID`=p.`ID`)
  399. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  400. and g.`TYPE`='PROCES_INIT'
  401. and g.`A_STATUS` in('NORMAL','WAITING')
  402. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  403. and p.`IF_TRUE_GOTO`>0
  404. )
  405. where p.`A_STATUS` in('NORMAL','WAITING')
  406. and 0=(select IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, 0, -1) from `CRM_PROCES_idx` i where i.`ID`=g.`ID`)
  407. ;
  408. update `CRM_PROCES_idx`
  409. set `idx_PROCES_WITH_GROUPS_ID`=0
  410. where `idx_PROCES_WITH_GROUPS_ID` is null
  411. and `TYPE`='PROCES_INIT'
  412. ;
  413. insert ignore into `CRM_PROCES_idx` (`ID`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  414. select i.`ID`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  415. from `CRM_PROCES_idx` i
  416. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  417. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  418. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  419. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  420. and i.`TYPE`!='GOTO_AND_RETURN'
  421. ;
  422. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  423. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  424. -- select 'update `CRM_PROCES`...';
  425. update `CRM_PROCES` p
  426. set p.`idx_PROCES_INIT_ID`=coalesce((select i.`idx_PROCES_INIT_ID` from `CRM_PROCES_idx` i where i.`ID`=p.`ID` limit 1), 0)
  427. ;
  428. -- select 'update `CRM_PROCES_idx_GROUPS_to_INIT`...';
  429. truncate table `CRM_PROCES_idx_GROUPS_to_INIT`;
  430. insert ignore into `CRM_PROCES_idx_GROUPS_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  431. select i.`ID` as PROCES_INIT_ID, z.`ID` as GROUP_ID
  432. from `CRM_PROCES_idx` i
  433. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  434. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  435. )
  436. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  437. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  438. and z.`A_STATUS` in('NORMAL', 'WAITING')
  439. )
  440. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  441. and przyp.`FORM_TREAT` & 8 -- has perm X
  442. )
  443. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN');
  444. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_end_key, NOW());
  445. END ;
  446. SQL;
  447. $db = DB::getDB();
  448. if ($db->has_errors()) {
  449. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  450. }
  451. foreach ($sqlList as $sqlName => $sql) {
  452. $res = $db->query($sql);
  453. if ($db->has_errors()) {
  454. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  455. }
  456. }
  457. }
  458. }