FixCrmProcesInitIdx.php 28 KB

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