FixCrmProcesInitIdx.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713
  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. try {
  24. $this->_callProcedure();
  25. } catch (Exception $e) {
  26. ?>
  27. <div class="container">
  28. <div class="alert alert-warning">
  29. <?php echo $e->getMessage(); ?>
  30. </div>
  31. </div>
  32. <?php
  33. SE_Layout::dol();
  34. exit;
  35. }
  36. $dbgExecTime->log('procedure');
  37. $procExecTime = $dbgExecTime->getLastExecTime();
  38. //$totalExecTime = $dbgExecTime->getTotalExecTime();
  39. ?>
  40. <div class="container">
  41. <div class="alert alert-success">
  42. Zaktualizowano uprawnienia
  43. <br><span style="font-style:italic; opacity:0.4;">(<?php echo number_format($procExecTime, 6); ?> s)</span>
  44. </div>
  45. </div>
  46. <?php
  47. if($DBG_TIME){
  48. $dbgExecTime->log('end');
  49. //$dbgExecTime->printDebug();
  50. }
  51. SE_Layout::dol();
  52. }
  53. public function runApiAction() {
  54. $this->_callProcedure();
  55. die('Zaktualizowano uprawnienia');
  56. }
  57. private function _callProcedure() {
  58. $sql = "call `update_proces_init_idx_rec`();";
  59. $db = DB::getDB();
  60. if ($db->has_errors()) {
  61. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  62. }
  63. $res = $db->query($sql);
  64. if ($db->has_errors()) {
  65. $dbErrors = array();
  66. if ($db->has_errors()) {
  67. $dbErrorsSql = $db->get_errors();
  68. foreach ($dbErrorsSql as $vErr) {
  69. if ('SQL QUERY FAILED: ' == substr($vErr, 0, 18)) {
  70. $vErr = substr($vErr, 18);
  71. }
  72. //$dbErrors[] = StorageException::parseMessage($vErr);
  73. $dbErrors[] = $vErr;
  74. }
  75. }
  76. throw new StorageException($dbErrors);
  77. }
  78. }
  79. public function test1Action() {
  80. $sql = <<<SQL
  81. select count(*) as cnt, p.`ID`, group_concat(i.`idx_PROCES_INIT_ID`), group_concat(i.`idx_PROCES_WITH_GROUPS_ID`)
  82. from `CRM_PROCES` p
  83. left join `CRM_PROCES_idx` i on(i.`ID_PROCES`=p.`ID`)
  84. where i.`ID_PROCES`=p.`ID`
  85. group by p.`ID`
  86. order by cnt desc
  87. SQL;
  88. $db = DB::getDB();
  89. if ($db->has_errors()) {
  90. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  91. }
  92. $res = $db->query($sql);
  93. if ($db->has_errors()) {
  94. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  95. }
  96. while ($r = $db->fetch($res)) {
  97. echo'<pre>';print_r($r);echo'</pre>';
  98. }
  99. }
  100. public function test2Action() {
  101. $sqlList = array();
  102. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  103. $sqlList['InstallTableGroupToInit'] = <<<SQL
  104. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUPS_to_INIT` (
  105. `PROCES_INIT_ID` int(11) NOT NULL
  106. , `GROUP_ID` int(11) NOT NULL
  107. , KEY `PROCES_INIT_ID` (`PROCES_INIT_ID`)
  108. , KEY `GROUP_ID` (`GROUP_ID`)
  109. , UNIQUE KEY `uniq__GROUP_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  110. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  111. SQL;
  112. $sqlList['UpdateTableGroupToInit'] = <<<SQL
  113. insert ignore into `CRM_PROCES_idx_GROUPS_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  114. select i.`ID_PROCES` as PROCES_INIT_ID, z.`ID` as GROUP_ID
  115. from `CRM_PROCES_idx` i
  116. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  117. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  118. )
  119. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  120. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  121. and z.`A_STATUS` in('NORMAL', 'WAITING')
  122. )
  123. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  124. and przyp.`FORM_TREAT` & 8 -- has perm X
  125. )
  126. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  127. SQL;
  128. $db = DB::getDB();
  129. if ($db->has_errors()) {
  130. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  131. }
  132. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  133. $dbgExecTime = new DebugExecutionTime();
  134. if ($DBG_TIME) $dbgExecTime->activate();
  135. $dbgExecTime->log('start');
  136. foreach ($sqlList as $sqlName => $sql) {
  137. $res = $db->query($sql);
  138. if ($db->has_errors()) {
  139. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  140. }
  141. if($DBG_TIME) $dbgExecTime->log("end-{$sqlName}");
  142. }
  143. if($DBG_TIME) $dbgExecTime->printDebug();
  144. }
  145. public function runDebugAction() {
  146. $sqlList = array();
  147. // SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  148. // SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  149. $sqlList['0-prepare-while-1-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while1`";
  150. $sqlList['0-prepare-while-1-create'] = <<<SQL
  151. CREATE PROCEDURE `update_proces_init_idx_rec__while1`()
  152. BEGIN
  153. update `CRM_PROCES_idx` as i set i.`idx_PROCES_INIT_ID`=IF(i.`TYPE`='PROCES_INIT', i.`ID_PROCES`, 0);
  154. SET @i = 0;
  155. SET @loopLomit = 100;
  156. SET @pinitCnt = 1;
  157. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  158. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  159. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  160. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  161. SET @pinitCnt = ROW_COUNT();
  162. SET @i = @i + 1;
  163. END WHILE;
  164. END
  165. SQL;
  166. $sqlList['0-prepare-while-2-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while2`";
  167. $sqlList['0-prepare-while-2-create'] = <<<SQL
  168. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  169. BEGIN
  170. SET @i = 0;
  171. SET @loopLomit = 100;
  172. SET @groupCnt = 1;
  173. WHILE @i < @loopLomit and @groupCnt > 0 DO
  174. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  175. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  176. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  177. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  178. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  179. SET @groupCnt = ROW_COUNT();
  180. SET @i = @i + 1;
  181. END WHILE;
  182. END
  183. SQL;
  184. $sqlList__TEST_PERF_NO_DIFF['0-prepare-while-2-create'] = <<<SQL
  185. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  186. BEGIN
  187. SET @i = 0;
  188. SET @loopLomit = 100;
  189. SET @groupCnt = 1;
  190. WHILE @i < @loopLomit and @groupCnt > 0 DO
  191. update `CRM_PROCES_idx` as p
  192. join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`
  193. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  194. and pp.`idx_PROCES_WITH_GROUPS_ID`>0
  195. )
  196. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  197. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  198. ;
  199. SET @groupCnt = ROW_COUNT();
  200. SET @i = @i + 1;
  201. END WHILE;
  202. END
  203. SQL;
  204. $sqlList['1-set-start-time-in-config'] = <<<SQL
  205. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_start', NOW());
  206. SQL;
  207. $sqlList['2-truncate-table'] = <<<SQL
  208. truncate table `CRM_PROCES_idx`;
  209. -- delete from `CRM_PROCES_idx`;
  210. SQL;
  211. $sqlList['3-fill-CRM_PROCES_idx'] = <<<SQL
  212. -- select 'insert into `CRM_PROCES_idx`...';
  213. insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  214. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  215. from `CRM_PROCES` p
  216. where p.`A_STATUS` in('NORMAL','WAITING')
  217. ;
  218. SQL;
  219. $sqlList['4-while-1'] = <<<SQL
  220. call `update_proces_init_idx_rec__while1`();
  221. SQL;
  222. $sqlList['5-before-while-2'] = <<<SQL
  223. update `CRM_PROCES_idx` i
  224. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  225. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  226. )
  227. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  228. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  229. and z.`A_STATUS` in('NORMAL', 'WAITING')
  230. )
  231. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  232. and przyp.`FORM_TREAT` & 8 -- has perm X
  233. )
  234. set
  235. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  236. where i.`idx_PROCES_INIT_ID`>0;
  237. SQL;
  238. $sqlList['6-while-2'] = <<<SQL
  239. call `update_proces_init_idx_rec__while2`();
  240. SQL;
  241. $sqlList['7-goto_and_return'] = <<<SQL
  242. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  243. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  244. , pi.`idx_PROCES_WITH_GROUPS_ID`
  245. from `CRM_PROCES` p
  246. join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
  247. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  248. and g.`TYPE`='PROCES_INIT'
  249. and g.`A_STATUS` in('NORMAL','WAITING')
  250. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  251. and p.`IF_TRUE_GOTO`>0
  252. )
  253. where p.`A_STATUS` in('NORMAL','WAITING')
  254. and 0=(select IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, 0, -1) from `CRM_PROCES_idx` i where i.`ID_PROCES`=g.`ID`)
  255. ;
  256. -- SET @groupCnt = ROW_COUNT();
  257. SQL;
  258. $sqlList['8-update-idx_PROCES_WITH_GROUPS_ID-zero-where-null'] = <<<SQL
  259. update `CRM_PROCES_idx`
  260. set `idx_PROCES_WITH_GROUPS_ID`=0
  261. where `idx_PROCES_WITH_GROUPS_ID` is null
  262. and `TYPE`='PROCES_INIT'
  263. ;
  264. SQL;
  265. $sqlList['9-fix-goto_and_return'] = <<<SQL
  266. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  267. select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  268. from `CRM_PROCES_idx` i
  269. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  270. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  271. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  272. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  273. and i.`TYPE`!='GOTO_AND_RETURN'
  274. ;
  275. SQL;
  276. $sqlList['10-delete-where-!idx_PROCES_WITH_GROUPS_ID'] = <<<SQL
  277. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  278. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  279. SQL;
  280. $sqlList['11-update-CRM_PROCES-idx_PROCES_INIT_ID'] = <<<SQL
  281. -- select 'update `CRM_PROCES`...';
  282. update `CRM_PROCES` p
  283. set p.`idx_PROCES_INIT_ID`=coalesce((select i.`idx_PROCES_INIT_ID` from `CRM_PROCES_idx` i where i.`ID_PROCES`=p.`ID` limit 1), 0)
  284. ;
  285. SQL;
  286. $sqlList['11-clear-CRM_PROCES_idx_GROUPS_to_INIT'] = <<<SQL
  287. -- select 'update `CRM_PROCES_idx_GROUPS_to_INIT`...';
  288. truncate table `CRM_PROCES_idx_GROUPS_to_INIT`;
  289. SQL;
  290. $sqlList['11-fill-CRM_PROCES_idx_GROUPS_to_INIT'] = <<<SQL
  291. insert ignore into `CRM_PROCES_idx_GROUPS_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  292. select i.`ID_PROCES` as PROCES_INIT_ID, z.`ID` as GROUP_ID
  293. from `CRM_PROCES_idx` i
  294. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  295. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  296. )
  297. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  298. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  299. and z.`A_STATUS` in('NORMAL', 'WAITING')
  300. )
  301. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  302. and przyp.`FORM_TREAT` & 8 -- has perm X
  303. )
  304. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN');
  305. SQL;
  306. $sqlList['12-set-end-time-in-config'] = <<<SQL
  307. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
  308. SQL;
  309. $db = DB::getDB();
  310. if ($db->has_errors()) {
  311. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  312. }
  313. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  314. $dbgExecTime = new DebugExecutionTime();
  315. if ($DBG_TIME) $dbgExecTime->activate();
  316. $dbgExecTime->log('start');
  317. foreach ($sqlList as $sqlName => $sql) {
  318. $res = $db->query($sql);
  319. if ($db->has_errors()) {
  320. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  321. }
  322. if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
  323. }
  324. if($DBG_TIME) $dbgExecTime->printDebug();
  325. }
  326. public function reinstallAction() {
  327. $this->reinstall();
  328. die('OK');
  329. }
  330. public function reinstall() {
  331. $sqlList = array();
  332. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx`";
  333. $sqlList['InstallTable'] = <<<SQL
  334. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx` (
  335. `ID_PROCES` int(11) NOT NULL
  336. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  337. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  338. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  339. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  340. -- , `idx_PATH` text NOT NULL
  341. , KEY `ID_PROCES` (`ID_PROCES`)
  342. , KEY `PARENT_ID` (`PARENT_ID`)
  343. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  344. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  345. , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
  346. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  347. SQL;
  348. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  349. $sqlList['InstallTableGroupToInit'] = <<<SQL
  350. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUPS_to_INIT` (
  351. `PROCES_INIT_ID` int(11) NOT NULL
  352. , `GROUP_ID` int(11) NOT NULL
  353. , KEY `PROCES_INIT_ID` (`PROCES_INIT_ID`)
  354. , KEY `GROUP_ID` (`GROUP_ID`)
  355. , UNIQUE KEY `uniq__GROUP_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  356. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  357. SQL;
  358. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec`";
  359. // throws errors:
  360. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  361. $sqlList['CreateProcedure'] = <<<SQL
  362. CREATE PROCEDURE `update_proces_init_idx_rec`()
  363. BEGIN
  364. SET @enabled = FALSE;
  365. SET @conf_last_exec_lock_key = 'tbl_indexer_CRM_PROCES_last_exec_lock_date';
  366. SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  367. SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  368. -- if already runnig mysql will throw "Commands out of sync; you can't run this command now"
  369. IF (select count(1) from `CRM_CONFIG` where `conf_key`=@conf_last_exec_lock_key and `conf_val`!='')>0 THEN
  370. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed` SET x=1;
  371. ELSE BEGIN
  372. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, NOW()), (@conf_last_exec_start_key, NOW());
  373. -- select sleep(2); -- // DBG
  374. -- select 'truncate->delete...';
  375. truncate table `CRM_PROCES_idx`;
  376. -- delete from `CRM_PROCES_idx`;
  377. -- select 'insert into `CRM_PROCES_idx`...';
  378. insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  379. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  380. from `CRM_PROCES` p
  381. where p.`A_STATUS` in('NORMAL','WAITING')
  382. ;
  383. -- select 'while 1...';
  384. update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID_PROCES`, 0);
  385. SET @i = 0;
  386. SET @loopLomit = 100;
  387. SET @pinitCnt = 1;
  388. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  389. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  390. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  391. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  392. SET @pinitCnt = ROW_COUNT();
  393. SET @i = @i + 1;
  394. END WHILE;
  395. -- select 'while 2... search stanowiska';
  396. update `CRM_PROCES_idx` i
  397. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  398. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  399. )
  400. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  401. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  402. and z.`A_STATUS` in('NORMAL', 'WAITING')
  403. )
  404. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  405. and przyp.`FORM_TREAT` & 8 -- has perm X
  406. )
  407. set
  408. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  409. where i.`idx_PROCES_INIT_ID`>0;
  410. SET @i = 0;
  411. SET @loopLomit = 100;
  412. SET @groupCnt = 1;
  413. WHILE @i < @loopLomit and @groupCnt > 0 DO
  414. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  415. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  416. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  417. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  418. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  419. SET @groupCnt = ROW_COUNT();
  420. SET @i = @i + 1;
  421. END WHILE;
  422. -- select 'GOTO_AND_RETURN...';
  423. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  424. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  425. , pi.`idx_PROCES_WITH_GROUPS_ID`
  426. from `CRM_PROCES` p
  427. join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
  428. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  429. and g.`TYPE`='PROCES_INIT'
  430. and g.`A_STATUS` in('NORMAL','WAITING')
  431. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  432. and p.`IF_TRUE_GOTO`>0
  433. )
  434. where p.`A_STATUS` in('NORMAL','WAITING')
  435. and 0=(select IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, 0, -1) from `CRM_PROCES_idx` i where i.`ID_PROCES`=g.`ID`)
  436. ;
  437. update `CRM_PROCES_idx`
  438. set `idx_PROCES_WITH_GROUPS_ID`=0
  439. where `idx_PROCES_WITH_GROUPS_ID` is null
  440. and `TYPE`='PROCES_INIT'
  441. ;
  442. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  443. select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  444. from `CRM_PROCES_idx` i
  445. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  446. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  447. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  448. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  449. and i.`TYPE`!='GOTO_AND_RETURN'
  450. ;
  451. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  452. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  453. -- select 'update `CRM_PROCES`...';
  454. update `CRM_PROCES` p
  455. set p.`idx_PROCES_INIT_ID`=coalesce((select i.`idx_PROCES_INIT_ID` from `CRM_PROCES_idx` i where i.`ID_PROCES`=p.`ID` limit 1), 0)
  456. ;
  457. -- select 'update `CRM_PROCES_idx_GROUPS_to_INIT`...';
  458. truncate table `CRM_PROCES_idx_GROUPS_to_INIT`;
  459. insert ignore into `CRM_PROCES_idx_GROUPS_to_INIT` (`PROCES_INIT_ID`,`GROUP_ID`)
  460. select i.`ID_PROCES` as PROCES_INIT_ID, z.`ID` as GROUP_ID
  461. from `CRM_PROCES_idx` i
  462. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  463. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  464. )
  465. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  466. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  467. and z.`A_STATUS` in('NORMAL', 'WAITING')
  468. )
  469. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  470. and przyp.`FORM_TREAT` & 8 -- has perm X
  471. )
  472. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN');
  473. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, ''), (@conf_last_exec_end_key, NOW());
  474. -- clear msg 'Update perms' from Msgs system
  475. update `CRM_UI_MSGS`
  476. set `A_STATUS`='OFF_HARD'
  477. , `actionExecutedTime`=NOW()
  478. , `A_RECORD_UPDATE_DATE`=NOW()
  479. , `A_RECORD_UPDATE_AUTHOR`='update_proces_init_idx_rec'
  480. where `A_STATUS`='WAITING'
  481. and `app_className`='FixCrmProcesInitIdx'
  482. and `msg`='Update perms'
  483. and `uiTargetType`='default_db_table'
  484. and `uiTargetName`='CRM_PROCES';
  485. END ; END IF ;
  486. END ;
  487. SQL;
  488. $sqlList['RemoveTrigger_AfterInsertProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT`";
  489. $sqlList['CreateTrigger_AfterInsertProces'] = "
  490. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT` AFTER INSERT ON `CRM_PROCES`
  491. FOR EACH ROW BEGIN
  492. -- only when PARENT_ID changes and PARENT_ID exists in `CRM_PROCES_idx`
  493. IF NEW.`PARENT_ID` IS NOT NULL AND NEW.`PARENT_ID`>0 AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES`=NEW.`PARENT_ID` limit 1)>0 THEN
  494. -- throw warning to update perms
  495. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  496. and `msg`='Update perms'
  497. and `uiTargetType`='default_db_table'
  498. and `uiTargetName`='CRM_PROCES'
  499. and `A_STATUS`='WAITING'
  500. ) = 0 THEN
  501. INSERT INTO `CRM_UI_MSGS` (`ID`
  502. , `app_className`, `msg`, `msgType`
  503. , `uiTargetType`, `uiTargetName`
  504. , `userTargetType`
  505. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  506. VALUES (NULL
  507. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  508. , 'default_db_table', 'CRM_PROCES'
  509. , 'everyone'
  510. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT')
  511. );
  512. END IF;
  513. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  514. END IF;
  515. END
  516. ";
  517. $sqlList['RemoveTrigger_AfterUpdateProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE`";
  518. $sqlList['CreateTrigger_AfterUpdateProces'] = "
  519. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE` AFTER UPDATE ON `CRM_PROCES`
  520. FOR EACH ROW BEGIN
  521. -- only when PARENT_ID changes and ID exists in `CRM_PROCES_idx`
  522. IF NEW.`PARENT_ID`!=OLD.`PARENT_ID` AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES` in(NEW.`ID`, NEW.`PARENT_ID`, OLD.`PARENT_ID`) limit 1)>0 THEN
  523. -- throw warning to update perms
  524. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  525. and `msg`='Update perms'
  526. and `uiTargetType`='default_db_table'
  527. and `uiTargetName`='CRM_PROCES'
  528. and `A_STATUS`='WAITING'
  529. ) = 0 THEN
  530. INSERT INTO `CRM_UI_MSGS` (`ID`
  531. , `app_className`, `msg`, `msgType`
  532. , `uiTargetType`, `uiTargetName`
  533. , `userTargetType`
  534. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  535. VALUES (NULL
  536. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  537. , 'default_db_table', 'CRM_PROCES'
  538. , 'everyone'
  539. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE')
  540. );
  541. END IF;
  542. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  543. END IF;
  544. END
  545. ";
  546. $sqlList['RemoveTrigger_AfterInsertWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT`";
  547. $sqlList['CreateTrigger_AfterInsertWskaznik'] = "
  548. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT` AFTER INSERT ON `CRM_WSKAZNIK`
  549. FOR EACH ROW BEGIN
  550. -- only when ID_PROCES exists in `CRM_PROCES_idx`
  551. -- only when ID_ZASOB is group
  552. -- only when ID_PRZYPADEK has perm 'X'
  553. IF NEW.`ID_PROCES`>0
  554. AND NEW.`ID_ZASOB`>0
  555. AND NEW.`ID_PRZYPADEK`>0
  556. AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES`=NEW.`ID_PROCES` limit 1)>0
  557. AND (select count(*) from `CRM_LISTA_ZASOBOW` z where z.`ID`=NEW.`ID_ZASOB` and z.`TYPE` in('STANOWISKO','DZIAL','PODMIOT') limit 1)>0
  558. AND (select count(*) from `CRM_PRZYPADEK` przyp where przyp.`ID`=NEW.`ID_PRZYPADEK` and przyp.`FORM_TREAT` & 8 limit 1)>0
  559. THEN
  560. -- throw warning to update perms
  561. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  562. and `msg`='Update perms'
  563. and `uiTargetType`='default_db_table'
  564. and `uiTargetName`='CRM_PROCES'
  565. and `A_STATUS`='WAITING'
  566. ) = 0 THEN
  567. INSERT INTO `CRM_UI_MSGS` (`ID`
  568. , `app_className`, `msg`, `msgType`
  569. , `uiTargetType`, `uiTargetName`
  570. , `userTargetType`
  571. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  572. VALUES (NULL
  573. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  574. , 'default_db_table', 'CRM_PROCES'
  575. , 'everyone'
  576. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT')
  577. );
  578. END IF;
  579. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  580. END IF;
  581. END
  582. ";
  583. $sqlList['RemoveTrigger_AfterUpdateWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE`";
  584. $sqlList['CreateTrigger_AfterUpdateWskaznik'] = "
  585. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE` AFTER UPDATE ON `CRM_WSKAZNIK`
  586. FOR EACH ROW BEGIN
  587. -- only when old or new ID_PROCES exists in `CRM_PROCES_idx`
  588. -- only when old or new ID_ZASOB is group
  589. -- only when old or new ID_PRZYPADEK has perm 'X'
  590. IF (NEW.`ID_PROCES`!=OLD.`ID_PROCES` or NEW.`ID_ZASOB`!=OLD.`ID_ZASOB` or NEW.`ID_PRZYPADEK`!=OLD.`ID_PRZYPADEK`)
  591. AND (NEW.`ID_PROCES`>0 or OLD.`ID_PROCES`>0)
  592. AND (NEW.`ID_ZASOB`>0 or OLD.`ID_ZASOB`>0)
  593. AND (NEW.`ID_PRZYPADEK`>0 or OLD.`ID_PRZYPADEK`>0)
  594. -- AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES` in(NEW.`ID_PROCES`,OLD.`ID_PROCES`) limit 1)>0
  595. AND (select count(*) from `CRM_LISTA_ZASOBOW` z where z.`ID` in(NEW.`ID_ZASOB`,OLD.`ID_ZASOB`) and z.`TYPE` in('STANOWISKO','DZIAL','PODMIOT') limit 1)>0
  596. AND (select count(*) from `CRM_PRZYPADEK` przyp where przyp.`ID` in(NEW.`ID_PRZYPADEK`,OLD.`ID_PRZYPADEK`) and przyp.`FORM_TREAT` & 8 limit 1)>0
  597. THEN
  598. -- throw warning to update perms
  599. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  600. and `msg`='Update perms'
  601. and `uiTargetType`='default_db_table'
  602. and `uiTargetName`='CRM_PROCES'
  603. and `A_STATUS`='WAITING'
  604. ) = 0 THEN
  605. INSERT INTO `CRM_UI_MSGS` (`ID`
  606. , `app_className`, `msg`, `msgType`
  607. , `uiTargetType`, `uiTargetName`
  608. , `userTargetType`
  609. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  610. VALUES (NULL
  611. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  612. , 'default_db_table', 'CRM_PROCES'
  613. , 'everyone'
  614. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE')
  615. );
  616. END IF;
  617. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  618. END IF;
  619. END
  620. ";
  621. $db = DB::getDB();
  622. if ($db->has_errors()) {
  623. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  624. }
  625. foreach ($sqlList as $sqlName => $sql) {
  626. $res = $db->query($sql);
  627. if ($db->has_errors()) {
  628. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  629. }
  630. }
  631. }
  632. /*
  633. #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  634. */
  635. public function parseMessageFromStorage($msg) {
  636. switch ($msg) {
  637. case 'ERROR: Already executed': {
  638. $msg = "Aktualizacja uprawnień została już uruchomiona przez inną osobę";
  639. break;
  640. }
  641. case 'ERROR: Update perms': {
  642. $msg = "Wymagana aktualizacja uprawnień";
  643. break;
  644. }
  645. }
  646. return $msg;
  647. }
  648. public function parseMessageFromMsgsSystem($msg) {
  649. switch ($msg) {
  650. case 'Update perms': {
  651. $msg = "Wymagana aktualizacja uprawnień";
  652. break;
  653. }
  654. }
  655. return $msg;
  656. }
  657. public function runByMessageFromMsgsSystem($msg, &$execNotes) {
  658. switch ($msg) {
  659. case 'Update perms': {
  660. $execNotes .= 'Wymagana aktualizacja uprawnień';
  661. $this->_callProcedure();
  662. $execNotes .= ' done';
  663. break;
  664. }
  665. }
  666. }
  667. }