FixCrmProcesInitIdx.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  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. SQL;
  327. $sqlList['12-set-end-time-in-config'] = <<<SQL
  328. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
  329. SQL;
  330. $db = DB::getDB();
  331. if ($db->has_errors()) {
  332. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  333. }
  334. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  335. $dbgExecTime = new DebugExecutionTime();
  336. if ($DBG_TIME) $dbgExecTime->activate();
  337. $dbgExecTime->log('start');
  338. foreach ($sqlList as $sqlName => $sql) {
  339. $res = $db->query($sql);
  340. if ($db->has_errors()) {
  341. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  342. }
  343. if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
  344. }
  345. if($DBG_TIME) $dbgExecTime->printDebug();
  346. }
  347. public function reinstallAction() {
  348. $this->reinstall();
  349. die('OK');
  350. }
  351. public function reinstall() {
  352. $sqlList = array();
  353. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx`";
  354. $sqlList['InstallTable'] = <<<SQL
  355. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx` (
  356. `ID_PROCES` int(11) NOT NULL
  357. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  358. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  359. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  360. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  361. -- , `idx_PATH` text NOT NULL
  362. , KEY `ID_PROCES` (`ID_PROCES`)
  363. , KEY `PARENT_ID` (`PARENT_ID`)
  364. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  365. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  366. , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
  367. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  368. SQL;
  369. $sqlList['RemoveOldTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  370. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUP_to_PROCES`";
  371. $sqlList['InstallTableGroupToInit'] = <<<SQL
  372. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUP_to_PROCES` (
  373. `ID_PROCES` int(11) NOT NULL
  374. , `ID_GROUP` int(11) NOT NULL
  375. , KEY `ID_PROCES` (`ID_PROCES`)
  376. , KEY `ID_GROUP` (`ID_GROUP`)
  377. , UNIQUE KEY `uniq__GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  378. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  379. SQL;
  380. $sqlList['RemoveViewUserToInit'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_USER_to_INIT_VIEW`";
  381. $sqlList['InstallViewUserToInit'] = <<<SQL
  382. CREATE VIEW `CRM_PROCES_idx_USER_to_INIT_VIEW` AS
  383. select concat(u.`ID`, p.`ID`) as ID
  384. , p.`ID` as `ID_PROCES_INIT`
  385. , p.`DESC` as `DESC`
  386. , u.`ADM_ACCOUNT` as `ADM_ACCOUNT`
  387. , u.`EMPLOYEE_TYPE` as `EMPLOYEE_TYPE`
  388. , u.`A_STATUS` as `A_STATUS`
  389. from `ADMIN_USERS` u
  390. join `CRM_AUTH_PROFILE` au on(au.`REMOTE_ID`=u.`ID` and au.`REMOTE_TABLE`='ADMIN_USERS' and au.`A_STATUS` in('NORMAL','WAITING'))
  391. join `CRM_PROCES_idx_GROUP_to_PROCES` gi on(gi.`ID_GROUP`=au.`ID_ZASOB`)
  392. join `CRM_PROCES` p on(p.`ID`=gi.`ID_PROCES`)
  393. where p.`TYPE`='PROCES_INIT'
  394. SQL;
  395. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec`";
  396. // throws errors:
  397. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  398. $sqlList['CreateProcedure'] = <<<SQL
  399. CREATE PROCEDURE `update_proces_init_idx_rec`()
  400. BEGIN
  401. SET @enabled = FALSE;
  402. SET @conf_last_exec_lock_key = 'tbl_indexer_CRM_PROCES_last_exec_lock_date';
  403. SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  404. SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  405. -- if already runnig mysql will throw "Commands out of sync; you can't run this command now"
  406. IF (select count(1) from `CRM_CONFIG` where `conf_key`=@conf_last_exec_lock_key and `conf_val`!='')>0 THEN
  407. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed` SET x=1;
  408. ELSE BEGIN
  409. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, NOW()), (@conf_last_exec_start_key, NOW());
  410. -- select sleep(2); -- // DBG
  411. -- select 'truncate->delete...';
  412. truncate table `CRM_PROCES_idx`;
  413. -- delete from `CRM_PROCES_idx`;
  414. -- select 'insert into `CRM_PROCES_idx`...';
  415. insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  416. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  417. from `CRM_PROCES` p
  418. where p.`A_STATUS` in('NORMAL','WAITING')
  419. ;
  420. -- select 'while 1...';
  421. update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID_PROCES`, 0);
  422. SET @i = 0;
  423. SET @loopLomit = 100;
  424. SET @pinitCnt = 1;
  425. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  426. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  427. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  428. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  429. SET @pinitCnt = ROW_COUNT();
  430. SET @i = @i + 1;
  431. END WHILE;
  432. -- select 'while 2... search stanowiska';
  433. update `CRM_PROCES_idx` i
  434. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  435. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  436. )
  437. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  438. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  439. and z.`A_STATUS` in('NORMAL', 'WAITING')
  440. )
  441. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  442. and przyp.`FORM_TREAT` & 8 -- has perm X
  443. )
  444. set
  445. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  446. where i.`idx_PROCES_INIT_ID`>0;
  447. SET @i = 0;
  448. SET @loopLomit = 100;
  449. SET @groupCnt = 1;
  450. WHILE @i < @loopLomit and @groupCnt > 0 DO
  451. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  452. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  453. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  454. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  455. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  456. SET @groupCnt = ROW_COUNT();
  457. SET @i = @i + 1;
  458. END WHILE;
  459. -- select 'GOTO_AND_RETURN...';
  460. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  461. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  462. , pi.`idx_PROCES_WITH_GROUPS_ID`
  463. from `CRM_PROCES` p
  464. join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
  465. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  466. and g.`TYPE`='PROCES_INIT'
  467. and g.`A_STATUS` in('NORMAL','WAITING')
  468. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  469. and p.`IF_TRUE_GOTO`>0
  470. )
  471. where p.`A_STATUS` in('NORMAL','WAITING')
  472. 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`)
  473. ;
  474. update `CRM_PROCES_idx`
  475. set `idx_PROCES_WITH_GROUPS_ID`=0
  476. where `idx_PROCES_WITH_GROUPS_ID` is null
  477. and `TYPE`='PROCES_INIT'
  478. ;
  479. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  480. select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  481. from `CRM_PROCES_idx` i
  482. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  483. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  484. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  485. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  486. and i.`TYPE`!='GOTO_AND_RETURN'
  487. ;
  488. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  489. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  490. -- select 'update `CRM_PROCES`...';
  491. update `CRM_PROCES` p
  492. 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)
  493. ;
  494. -- select 'update `CRM_PROCES_idx_GROUP_to_PROCES`...';
  495. truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
  496. insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  497. select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
  498. from `CRM_PROCES_idx` i
  499. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  500. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  501. )
  502. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  503. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  504. and z.`A_STATUS` in('NORMAL', 'WAITING')
  505. )
  506. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  507. and przyp.`FORM_TREAT` & 8 -- has perm X
  508. )
  509. where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN');
  510. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, ''), (@conf_last_exec_end_key, NOW());
  511. -- clear msg 'Update perms' from Msgs system
  512. update `CRM_UI_MSGS`
  513. set `A_STATUS`='OFF_HARD'
  514. , `actionExecutedTime`=NOW()
  515. , `A_RECORD_UPDATE_DATE`=NOW()
  516. , `A_RECORD_UPDATE_AUTHOR`='update_proces_init_idx_rec'
  517. where `A_STATUS`='WAITING'
  518. and `app_className`='FixCrmProcesInitIdx'
  519. and `msg`='Update perms'
  520. and `uiTargetType`='default_db_table'
  521. and `uiTargetName`='CRM_PROCES';
  522. END ; END IF ;
  523. END ;
  524. SQL;
  525. $sqlList['RemoveTrigger_AfterInsertProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT`";
  526. $sqlList['CreateTrigger_AfterInsertProces'] = "
  527. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT` AFTER INSERT ON `CRM_PROCES`
  528. FOR EACH ROW BEGIN
  529. -- only when PARENT_ID changes and PARENT_ID exists in `CRM_PROCES_idx`
  530. 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
  531. -- throw warning to update perms
  532. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  533. and `msg`='Update perms'
  534. and `uiTargetType`='default_db_table'
  535. and `uiTargetName`='CRM_PROCES'
  536. and `A_STATUS`='WAITING'
  537. ) = 0 THEN
  538. INSERT INTO `CRM_UI_MSGS` (`ID`
  539. , `app_className`, `msg`, `msgType`
  540. , `uiTargetType`, `uiTargetName`
  541. , `userTargetType`
  542. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  543. VALUES (NULL
  544. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  545. , 'default_db_table', 'CRM_PROCES'
  546. , 'everyone'
  547. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT')
  548. );
  549. END IF;
  550. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  551. END IF;
  552. END
  553. ";
  554. $sqlList['RemoveTrigger_AfterUpdateProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE`";
  555. $sqlList['CreateTrigger_AfterUpdateProces'] = "
  556. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE` AFTER UPDATE ON `CRM_PROCES`
  557. FOR EACH ROW BEGIN
  558. -- only when PARENT_ID changes and ID exists in `CRM_PROCES_idx`
  559. 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
  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_PROCES_AFTER_UPDATE')
  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_AfterInsertWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT`";
  584. $sqlList['CreateTrigger_AfterInsertWskaznik'] = "
  585. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT` AFTER INSERT ON `CRM_WSKAZNIK`
  586. FOR EACH ROW BEGIN
  587. -- only when ID_PROCES exists in `CRM_PROCES_idx`
  588. -- only when ID_ZASOB is group
  589. -- only when ID_PRZYPADEK has perm 'X'
  590. IF NEW.`ID_PROCES`>0
  591. AND NEW.`ID_ZASOB`>0
  592. AND NEW.`ID_PRZYPADEK`>0
  593. AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES`=NEW.`ID_PROCES` limit 1)>0
  594. AND (select count(*) from `CRM_LISTA_ZASOBOW` z where z.`ID`=NEW.`ID_ZASOB` and z.`TYPE` in('STANOWISKO','DZIAL','PODMIOT') limit 1)>0
  595. AND (select count(*) from `CRM_PRZYPADEK` przyp where przyp.`ID`=NEW.`ID_PRZYPADEK` and przyp.`FORM_TREAT` & 8 limit 1)>0
  596. THEN
  597. -- throw warning to update perms
  598. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  599. and `msg`='Update perms'
  600. and `uiTargetType`='default_db_table'
  601. and `uiTargetName`='CRM_PROCES'
  602. and `A_STATUS`='WAITING'
  603. ) = 0 THEN
  604. INSERT INTO `CRM_UI_MSGS` (`ID`
  605. , `app_className`, `msg`, `msgType`
  606. , `uiTargetType`, `uiTargetName`
  607. , `userTargetType`
  608. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  609. VALUES (NULL
  610. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  611. , 'default_db_table', 'CRM_PROCES'
  612. , 'everyone'
  613. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT')
  614. );
  615. END IF;
  616. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  617. END IF;
  618. END
  619. ";
  620. $sqlList['RemoveTrigger_AfterUpdateWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE`";
  621. $sqlList['CreateTrigger_AfterUpdateWskaznik'] = "
  622. CREATE TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE` AFTER UPDATE ON `CRM_WSKAZNIK`
  623. FOR EACH ROW BEGIN
  624. -- only when old or new ID_PROCES exists in `CRM_PROCES_idx`
  625. -- only when old or new ID_ZASOB is group
  626. -- only when old or new ID_PRZYPADEK has perm 'X'
  627. IF (NEW.`ID_PROCES`!=OLD.`ID_PROCES` or NEW.`ID_ZASOB`!=OLD.`ID_ZASOB` or NEW.`ID_PRZYPADEK`!=OLD.`ID_PRZYPADEK`)
  628. AND (NEW.`ID_PROCES`>0 or OLD.`ID_PROCES`>0)
  629. AND (NEW.`ID_ZASOB`>0 or OLD.`ID_ZASOB`>0)
  630. AND (NEW.`ID_PRZYPADEK`>0 or OLD.`ID_PRZYPADEK`>0)
  631. -- AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES` in(NEW.`ID_PROCES`,OLD.`ID_PROCES`) limit 1)>0
  632. 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
  633. 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
  634. THEN
  635. -- throw warning to update perms
  636. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  637. and `msg`='Update perms'
  638. and `uiTargetType`='default_db_table'
  639. and `uiTargetName`='CRM_PROCES'
  640. and `A_STATUS`='WAITING'
  641. ) = 0 THEN
  642. INSERT INTO `CRM_UI_MSGS` (`ID`
  643. , `app_className`, `msg`, `msgType`
  644. , `uiTargetType`, `uiTargetName`
  645. , `userTargetType`
  646. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  647. VALUES (NULL
  648. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  649. , 'default_db_table', 'CRM_PROCES'
  650. , 'everyone'
  651. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE')
  652. );
  653. END IF;
  654. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  655. END IF;
  656. END
  657. ";
  658. $db = DB::getDB();
  659. if ($db->has_errors()) {
  660. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  661. }
  662. foreach ($sqlList as $sqlName => $sql) {
  663. $res = $db->query($sql);
  664. if ($db->has_errors()) {
  665. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  666. }
  667. }
  668. }
  669. /*
  670. #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  671. */
  672. public function parseMessageFromStorage($msg) {
  673. switch ($msg) {
  674. case 'ERROR: Already executed': {
  675. $msg = "Aktualizacja uprawnień została już uruchomiona przez inną osobę";
  676. break;
  677. }
  678. case 'ERROR: Update perms': {
  679. $msg = "Wymagana aktualizacja uprawnień";
  680. break;
  681. }
  682. }
  683. return $msg;
  684. }
  685. public function parseMessageFromMsgsSystem($msg) {
  686. switch ($msg) {
  687. case 'Update perms': {
  688. $msg = "Wymagana aktualizacja uprawnień";
  689. break;
  690. }
  691. }
  692. return $msg;
  693. }
  694. public function runByMessageFromMsgsSystem($msg, &$execNotes) {
  695. switch ($msg) {
  696. case 'Update perms': {
  697. $execNotes .= 'Wymagana aktualizacja uprawnień';
  698. $this->_callProcedure();
  699. $execNotes .= ' done';
  700. break;
  701. }
  702. }
  703. }
  704. }