FixCrmProcesInitIdx.php 29 KB

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