FixCrmProcesInitIdx.php 27 KB

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