FixCrmProcesInitIdx.php 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  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 mapAction() {
  37. SE_Layout::gora();
  38. // echo '<a href="index.php?_route=FixCrmProcesInitIdx&_task=run">aktualizuj uprawnienia</a>';
  39. $idProcesInit = V::get('id_proces_init', '', $_REQUEST, 'int');
  40. ?>
  41. <div class="jumbotron">
  42. <div class="container">
  43. <form class="form-inline" method="POST">
  44. <input type="hidden" name="_route" value="FixCrmProcesInitIdx" />
  45. <input type="hidden" name="_task" value="map" />
  46. <input type="text" class="form-control" name="id_proces_init" value="<?php echo $idProcesInit; ?>" />
  47. <button type="submit" id="fldExecuteBtn" class="btn btn-primary" autocomplete="off">
  48. Pokaż mapę
  49. </button>
  50. </form>
  51. </div>
  52. </div>
  53. <script type="text/javascript">
  54. jQuery(document).ready(function () {
  55. jQuery('#fldExecuteBtn').on('click', function () {
  56. jQuery(this).text(jQuery(this).text() + '...').attr('disabled', 'disabled');
  57. jQuery(this).parent().submit();
  58. })
  59. });
  60. </script>
  61. <?php
  62. if ($idProcesInit) {
  63. $this->printProcesInitMap($idProcesInit);
  64. }
  65. SE_Layout::dol();
  66. }
  67. public function printProcesInitMap($idProcesInit) {
  68. Lib::loadClass('CrmProcesMap');
  69. $map = new CrmProcesMap($idProcesInit);
  70. }
  71. public function runAction() {
  72. SE_Layout::gora();
  73. SE_Layout::menu();
  74. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  75. $dbgExecTime = new DebugExecutionTime();
  76. if ($DBG_TIME) $dbgExecTime->activate();
  77. $dbgExecTime->log('start');
  78. try {
  79. $this->_callProcedure();
  80. } catch (Exception $e) {
  81. ?>
  82. <div class="container">
  83. <div class="alert alert-warning">
  84. <?php echo $e->getMessage(); ?>
  85. </div>
  86. </div>
  87. <?php
  88. SE_Layout::dol();
  89. exit;
  90. }
  91. $dbgExecTime->log('procedure');
  92. $procExecTime = $dbgExecTime->getLastExecTime();
  93. //$totalExecTime = $dbgExecTime->getTotalExecTime();
  94. ?>
  95. <div class="container">
  96. <div class="alert alert-success">
  97. Zaktualizowano uprawnienia
  98. <br><span style="font-style:italic; opacity:0.4;">(<?php echo number_format($procExecTime, 6); ?> s)</span>
  99. </div>
  100. </div>
  101. <?php
  102. if($DBG_TIME){
  103. $dbgExecTime->log('end');
  104. //$dbgExecTime->printDebug();
  105. }
  106. SE_Layout::dol();
  107. }
  108. public function runApiAction() {
  109. $this->_callProcedure();
  110. die('Zaktualizowano uprawnienia');
  111. }
  112. private function _callProcedure() {
  113. $sql = "call `update_proces_init_idx_rec`();";
  114. $db = DB::getDB();
  115. if ($db->has_errors()) {
  116. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  117. }
  118. $res = $db->query($sql);
  119. if ($db->has_errors()) {
  120. $dbErrors = array();
  121. if ($db->has_errors()) {
  122. $dbErrorsSql = $db->get_errors();
  123. foreach ($dbErrorsSql as $vErr) {
  124. if ('SQL QUERY FAILED: ' == substr($vErr, 0, 18)) {
  125. $vErr = substr($vErr, 18);
  126. }
  127. //$dbErrors[] = StorageException::parseMessage($vErr);
  128. $dbErrors[] = $vErr;
  129. }
  130. }
  131. throw new StorageException($dbErrors);
  132. }
  133. }
  134. public function test1Action() {
  135. $sql = <<<SQL
  136. select count(*) as cnt, p.`ID`, group_concat(i.`idx_PROCES_INIT_ID`), group_concat(i.`idx_PROCES_WITH_GROUPS_ID`)
  137. from `CRM_PROCES` p
  138. left join `CRM_PROCES_idx` i on(i.`ID_PROCES`=p.`ID`)
  139. where i.`ID_PROCES`=p.`ID`
  140. group by p.`ID`
  141. order by cnt desc
  142. SQL;
  143. $db = DB::getDB();
  144. if ($db->has_errors()) {
  145. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  146. }
  147. $res = $db->query($sql);
  148. if ($db->has_errors()) {
  149. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  150. }
  151. while ($r = $db->fetch($res)) {
  152. echo'<pre>';print_r($r);echo'</pre>';
  153. }
  154. }
  155. public function test2Action() {
  156. $sqlList = array();
  157. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  158. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUP_to_PROCES`";
  159. $sqlList['InstallTableGroupToInit'] = <<<SQL
  160. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUP_to_PROCES` (
  161. `ID_PROCES` int(11) NOT NULL
  162. , `ID_GROUP` int(11) NOT NULL
  163. , KEY `ID_PROCES` (`ID_PROCES`)
  164. , KEY `ID_GROUP` (`ID_GROUP`)
  165. , UNIQUE KEY `uniq__GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  166. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  167. SQL;
  168. $sqlList['UpdateTableGroupToInit'] = <<<SQL
  169. insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  170. select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
  171. from `CRM_PROCES_idx` i
  172. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  173. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  174. )
  175. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  176. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  177. and z.`A_STATUS` in('NORMAL', 'WAITING')
  178. )
  179. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  180. and przyp.`FORM_TREAT` & 8 -- has perm X
  181. )
  182. -- where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  183. SQL;
  184. $db = DB::getDB();
  185. if ($db->has_errors()) {
  186. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  187. }
  188. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  189. $dbgExecTime = new DebugExecutionTime();
  190. if ($DBG_TIME) $dbgExecTime->activate();
  191. $dbgExecTime->log('start');
  192. foreach ($sqlList as $sqlName => $sql) {
  193. $res = $db->query($sql);
  194. if ($db->has_errors()) {
  195. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  196. }
  197. if($DBG_TIME) $dbgExecTime->log("end-{$sqlName}");
  198. }
  199. if($DBG_TIME) $dbgExecTime->printDebug();
  200. }
  201. public function runDebugAction() {
  202. $sqlList = array();
  203. // SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  204. // SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  205. $sqlList['0-prepare-while-1-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while1`";
  206. $sqlList['0-prepare-while-1-create'] = <<<SQL
  207. CREATE PROCEDURE `update_proces_init_idx_rec__while1`()
  208. BEGIN
  209. update `CRM_PROCES_idx` as i set i.`idx_PROCES_INIT_ID`=IF(i.`TYPE`='PROCES_INIT', i.`ID_PROCES`, 0);
  210. SET @i = 0;
  211. SET @loopLomit = 100;
  212. SET @pinitCnt = 1;
  213. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  214. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  215. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  216. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  217. SET @pinitCnt = ROW_COUNT();
  218. SET @i = @i + 1;
  219. END WHILE;
  220. END
  221. SQL;
  222. $sqlList['0-prepare-while-2-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while2`";
  223. $sqlList['0-prepare-while-2-create'] = <<<SQL
  224. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  225. BEGIN
  226. SET @i = 0;
  227. SET @loopLomit = 100;
  228. SET @groupCnt = 1;
  229. WHILE @i < @loopLomit and @groupCnt > 0 DO
  230. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  231. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  232. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  233. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  234. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  235. SET @groupCnt = ROW_COUNT();
  236. SET @i = @i + 1;
  237. END WHILE;
  238. END
  239. SQL;
  240. $sqlList__TEST_PERF_NO_DIFF['0-prepare-while-2-create'] = <<<SQL
  241. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  242. BEGIN
  243. SET @i = 0;
  244. SET @loopLomit = 100;
  245. SET @groupCnt = 1;
  246. WHILE @i < @loopLomit and @groupCnt > 0 DO
  247. update `CRM_PROCES_idx` as p
  248. join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`
  249. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  250. and pp.`idx_PROCES_WITH_GROUPS_ID`>0
  251. )
  252. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  253. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  254. ;
  255. SET @groupCnt = ROW_COUNT();
  256. SET @i = @i + 1;
  257. END WHILE;
  258. END
  259. SQL;
  260. $sqlList['1-set-start-time-in-config'] = <<<SQL
  261. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_start', NOW());
  262. SQL;
  263. $sqlList['2-truncate-table'] = <<<SQL
  264. truncate table `CRM_PROCES_idx`;
  265. -- delete from `CRM_PROCES_idx`;
  266. SQL;
  267. $sqlList['3-fill-CRM_PROCES_idx'] = <<<SQL
  268. -- select 'insert into `CRM_PROCES_idx`...';
  269. insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  270. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  271. from `CRM_PROCES` p
  272. where p.`A_STATUS` in('NORMAL','WAITING')
  273. ;
  274. SQL;
  275. $sqlList['4-while-1'] = <<<SQL
  276. call `update_proces_init_idx_rec__while1`();
  277. SQL;
  278. $sqlList['5-before-while-2'] = <<<SQL
  279. update `CRM_PROCES_idx` i
  280. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  281. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  282. )
  283. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  284. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  285. and z.`A_STATUS` in('NORMAL', 'WAITING')
  286. )
  287. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  288. and przyp.`FORM_TREAT` & 8 -- has perm X
  289. )
  290. set
  291. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  292. where i.`idx_PROCES_INIT_ID`>0;
  293. SQL;
  294. $sqlList['6-while-2'] = <<<SQL
  295. call `update_proces_init_idx_rec__while2`();
  296. SQL;
  297. $sqlList['7-goto_and_return'] = <<<SQL
  298. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  299. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  300. , pi.`idx_PROCES_WITH_GROUPS_ID`
  301. from `CRM_PROCES` p
  302. join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
  303. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  304. and g.`TYPE`='PROCES_INIT'
  305. and g.`A_STATUS` in('NORMAL','WAITING')
  306. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  307. and p.`IF_TRUE_GOTO`>0
  308. )
  309. where p.`A_STATUS` in('NORMAL','WAITING')
  310. 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`)
  311. ;
  312. -- SET @groupCnt = ROW_COUNT();
  313. SQL;
  314. $sqlList['8-update-idx_PROCES_WITH_GROUPS_ID-zero-where-null'] = <<<SQL
  315. update `CRM_PROCES_idx`
  316. set `idx_PROCES_WITH_GROUPS_ID`=0
  317. where `idx_PROCES_WITH_GROUPS_ID` is null
  318. and `TYPE`='PROCES_INIT'
  319. ;
  320. SQL;
  321. $sqlList['9-fix-goto_and_return'] = <<<SQL
  322. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  323. select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  324. from `CRM_PROCES_idx` i
  325. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  326. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  327. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  328. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  329. and i.`TYPE`!='GOTO_AND_RETURN'
  330. ;
  331. SQL;
  332. $sqlList['10-delete-where-!idx_PROCES_WITH_GROUPS_ID'] = <<<SQL
  333. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  334. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  335. SQL;
  336. $sqlList['11-update-CRM_PROCES-idx_PROCES_INIT_ID'] = <<<SQL
  337. -- select 'update `CRM_PROCES`...';
  338. update `CRM_PROCES` p
  339. 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)
  340. ;
  341. SQL;
  342. $sqlList['11-clear-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
  343. -- select 'update `CRM_PROCES_idx_GROUP_to_PROCES`...';
  344. truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
  345. SQL;
  346. $sqlList['11-fill-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
  347. insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  348. select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
  349. from `CRM_PROCES_idx` i
  350. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  351. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  352. )
  353. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  354. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  355. and z.`A_STATUS` in('NORMAL', 'WAITING')
  356. )
  357. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  358. and przyp.`FORM_TREAT` & 8 -- has perm X
  359. )
  360. -- where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  361. ;
  362. SQL;
  363. $sqlList['12-set-end-time-in-config'] = <<<SQL
  364. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
  365. SQL;
  366. $db = DB::getDB();
  367. if ($db->has_errors()) {
  368. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  369. }
  370. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  371. $dbgExecTime = new DebugExecutionTime();
  372. if ($DBG_TIME) $dbgExecTime->activate();
  373. $dbgExecTime->log('start');
  374. foreach ($sqlList as $sqlName => $sql) {
  375. $res = $db->query($sql);
  376. if ($db->has_errors()) {
  377. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  378. }
  379. if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
  380. }
  381. if($DBG_TIME) $dbgExecTime->printDebug();
  382. }
  383. public function reinstallAction() {
  384. $this->reinstall();
  385. die('OK');
  386. }
  387. public function reinstall() {
  388. $sqlList = array();
  389. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx`";
  390. $sqlList['InstallTable'] = <<<SQL
  391. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx` (
  392. `ID_PROCES` int(11) NOT NULL
  393. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  394. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  395. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  396. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  397. -- , `idx_PATH` text NOT NULL
  398. , KEY `ID_PROCES` (`ID_PROCES`)
  399. , KEY `PARENT_ID` (`PARENT_ID`)
  400. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  401. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  402. , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
  403. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  404. SQL;
  405. $sqlList['RemoveOldTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  406. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUP_to_PROCES`";
  407. $sqlList['InstallTableGroupToInit'] = <<<SQL
  408. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUP_to_PROCES` (
  409. `ID_PROCES` int(11) NOT NULL
  410. , `ID_GROUP` int(11) NOT NULL
  411. , KEY `ID_PROCES` (`ID_PROCES`)
  412. , KEY `ID_GROUP` (`ID_GROUP`)
  413. , UNIQUE KEY `uniq__GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  414. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  415. SQL;
  416. $sqlList['RemoveViewUserToProces'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_USER_to_PROCES_VIEW`";
  417. $sqlList['InstallViewUserToProces'] = <<<SQL
  418. CREATE VIEW `CRM_PROCES_idx_USER_to_PROCES_VIEW` AS
  419. select concat(u.`ID`, gi.`ID_PROCES`) as ID
  420. , gi.`ID_PROCES` as `ID_PROCES`
  421. , u.`ADM_ACCOUNT` as `ADM_ACCOUNT`
  422. , u.`EMPLOYEE_TYPE` as `EMPLOYEE_TYPE`
  423. , u.`A_STATUS` as `A_STATUS`
  424. from `ADMIN_USERS` u
  425. join `CRM_AUTH_PROFILE` au on(au.`REMOTE_ID`=u.`ID` and au.`REMOTE_TABLE`='ADMIN_USERS' and au.`A_STATUS` in('NORMAL','WAITING'))
  426. join `CRM_PROCES_idx_GROUP_to_PROCES` gi on(gi.`ID_GROUP`=au.`ID_ZASOB`)
  427. SQL;
  428. $sqlList['RemoveViewUserToInit'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_USER_to_INIT_VIEW`";
  429. $sqlList['InstallViewUserToInit'] = <<<SQL
  430. CREATE VIEW `CRM_PROCES_idx_USER_to_INIT_VIEW` AS
  431. select concat(u.`ID`, p.`ID`) as ID
  432. , p.`ID` as `ID_PROCES_INIT`
  433. , p.`DESC` as `DESC`
  434. , u.`ADM_ACCOUNT` as `ADM_ACCOUNT`
  435. , u.`EMPLOYEE_TYPE` as `EMPLOYEE_TYPE`
  436. , u.`A_STATUS` as `A_STATUS`
  437. from `ADMIN_USERS` u
  438. join `CRM_AUTH_PROFILE` au on(au.`REMOTE_ID`=u.`ID` and au.`REMOTE_TABLE`='ADMIN_USERS' and au.`A_STATUS` in('NORMAL','WAITING'))
  439. join `CRM_PROCES_idx_GROUP_to_PROCES` gi on(gi.`ID_GROUP`=au.`ID_ZASOB`)
  440. join `CRM_PROCES_idx` i on(i.`ID_PROCES`=gi.`ID_PROCES`)
  441. join `CRM_PROCES` p on(p.`ID`=i.`idx_PROCES_INIT_ID`)
  442. where p.`TYPE`='PROCES_INIT'
  443. -- group by u.`ID`, p.`ID`
  444. SQL;
  445. /* Usage - find proces init for user by $userLogin:
  446. SELECT *
  447. FROM `CRM_PROCES_idx_USER_to_INIT_VIEW`
  448. WHERE `ADM_ACCOUNT` LIKE '{$userLogin}'
  449. GROUP BY ID_PROCES_INIT
  450. */
  451. $sqlList['RemoveViewTablesInfo'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLES_INFO_VIEW`";
  452. $sqlList['InstallViewTablesInfo'] = <<<SQL
  453. CREATE VIEW `CRM_PROCES_idx_TABLES_INFO_VIEW` AS
  454. select z.`ID` as `ID_CELL`
  455. , z.`DESC` as `CELL_NAME`
  456. , z.`DESC_PL` as `CELL_LABEL`
  457. , z.`OPIS` as `CELL_DESCRIPTION`
  458. , z.`SORT_PRIO` as `CELL_SORT_PRIO`
  459. , zp.`ID` as `ID_TABLE`
  460. , zp.`DESC` as `TABLE_NAME`
  461. , zp.`DESC_PL` as `TABLE_LABEL`
  462. , zp.`OPIS` as `TABLE_DESCRIPTION`
  463. , zpp.`ID` as `ID_DATABASE`
  464. from `CRM_LISTA_ZASOBOW` z
  465. join `CRM_LISTA_ZASOBOW` zp on(zp.`ID`=z.`PARENT_ID` and zp.`TYPE`='TABELA' and zp.`A_STATUS` in('WAITING','NORMAL'))
  466. join `CRM_LISTA_ZASOBOW` zpp on(zpp.`ID`=zp.`PARENT_ID`
  467. -- TODO: and zpp.`TYPE`='BAZA_DANYCH...'
  468. and zpp.`A_STATUS` in('WAITING','NORMAL')
  469. )
  470. where z.`TYPE`='KOMORKA'
  471. and z.`A_STATUS` in('WAITING','NORMAL')
  472. SQL;
  473. $sqlList['RemoveViewTableToProces'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW`";
  474. $sqlList['InstallViewTableToProces'] = <<<SQL
  475. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` AS
  476. select tv.`ID_CELL` as `ID_CELL`
  477. , tv.`CELL_NAME` as `CELL_NAME`
  478. , tv.`ID_TABLE` as `ID_TABLE`
  479. , tv.`TABLE_NAME` as `TABLE_NAME`
  480. , tv.`TABLE_LABEL` as `TABLE_LABEL`
  481. , tv.`TABLE_DESCRIPTION` as `TABLE_DESCRIPTION`
  482. , tv.`ID_DATABASE` as `ID_DATABASE`
  483. , wsk.`ID_PROCES` as `ID_PROCES`
  484. from `CRM_PROCES_idx_TABLES_INFO_VIEW` tv
  485. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=tv.`ID_CELL` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  486. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  487. SQL;
  488. $sqlList['RemoveViewUrlToProces'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_URL_TO_PROCES_VIEW`";
  489. $sqlList['InstallViewUrlToProces'] = <<<SQL
  490. CREATE VIEW `CRM_PROCES_idx_URL_TO_PROCES_VIEW` AS
  491. select z.`ID` as `ID_URL`
  492. , z.`DESC` as `URL_LINK`
  493. , z.`DESC_PL` as `URL_LABEL`
  494. , z.`OPIS` as `URL_DESC`
  495. , wsk.`ID_PROCES` as `ID_PROCES`
  496. from `CRM_LISTA_ZASOBOW` z
  497. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=z.`ID` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  498. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  499. where z.`TYPE`='URL'
  500. and z.`A_STATUS` in('WAITING','NORMAL')
  501. SQL;
  502. $sqlList['RemoveViewTableCellToProcesWithPerms'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_PROCES_PERMS_VIEW`";
  503. $sqlList['InstallViewTableCellToProcesWithPerms'] = <<<SQL
  504. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_PROCES_PERMS_VIEW` AS
  505. select tv.`ID_CELL` as `ID_CELL`
  506. , tv.`CELL_NAME` as `CELL_NAME`
  507. , tv.`ID_TABLE` as `ID_TABLE`
  508. , tv.`TABLE_NAME` as `TABLE_NAME`
  509. , tv.`TABLE_LABEL` as `TABLE_LABEL`
  510. , tv.`TABLE_DESCRIPTION` as `TABLE_DESCRIPTION`
  511. , tv.`ID_DATABASE` as `ID_DATABASE`
  512. , wsk.`ID_PROCES` as `ID_PROCES`
  513. , replace(przyp.`FORM_TREAT`, ',', '') as FORM_TREAT
  514. , IF(przyp.`FORM_TREAT` & 2, 1, 0) as PERM_R
  515. , IF(przyp.`FORM_TREAT` & 4, 1, 0) as PERM_W
  516. , IF(przyp.`FORM_TREAT` & 8, 1, 0) as PERM_X
  517. , IF(przyp.`FORM_TREAT` & 16, 1, 0) as PERM_C
  518. , IF(przyp.`FORM_TREAT` & 32, 1, 0) as PERM_S
  519. , IF(przyp.`FORM_TREAT` & 64, 1, 0) as PERM_O
  520. , IF(przyp.`FORM_TREAT` & 128, 1, 0) as PERM_V
  521. , IF(przyp.`FORM_TREAT` & 256, 1, 0) as PERM_E
  522. from `CRM_PROCES_idx_TABLES_INFO_VIEW` tv
  523. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=tv.`ID_CELL` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  524. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  525. join `CRM_PRZYPADEK` as przyp on (przyp.`ID`=wsk.`ID_PRZYPADEK`)
  526. SQL;
  527. $sqlExample_TableCellToProcesForInitTable = <<<SQL
  528. select tv.`ID_CELL` as `ID_CELL`
  529. , tv.`CELL_NAME` as `CELL_NAME`
  530. , tv.`CELL_LABEL` as `CELL_LABEL`
  531. , tv.`CELL_DESC` as `CELL_DESC`
  532. , tv.`CELL_SORT_PRIO` as `SORT_PRIO`
  533. , tv.`ID_TABLE` as `ID_TABLE`
  534. , tv.`TABLE_NAME` as `TABLE_NAME`
  535. , wsk.`ID_PROCES` as `ID_PROCES`
  536. , sum(IF(przyp.`FORM_TREAT` & 2, 1, 0)) as PERM_R
  537. , sum(IF(przyp.`FORM_TREAT` & 4, 1, 0)) as PERM_W
  538. , sum(IF(przyp.`FORM_TREAT` & 8, 1, 0)) as PERM_X
  539. , sum(IF(przyp.`FORM_TREAT` & 16, 1, 0)) as PERM_C
  540. , sum(IF(przyp.`FORM_TREAT` & 32, 1, 0)) as PERM_S
  541. , sum(IF(przyp.`FORM_TREAT` & 64, 1, 0)) as PERM_O
  542. , sum(IF(przyp.`FORM_TREAT` & 128, 1, 0)) as PERM_V
  543. , sum(IF(przyp.`FORM_TREAT` & 256, 1, 0)) as PERM_E
  544. from `CRM_PROCES_idx_TABLES_INFO_VIEW` tv
  545. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=tv.`ID_CELL` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  546. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  547. join `CRM_PRZYPADEK` as przyp on (przyp.`ID`=wsk.`ID_PRZYPADEK`)
  548. where tv.`ID_TABLE`='{$idTable}'
  549. and wsk.`ID_PROCES` in({$sqlIdProcesList})
  550. group by tv.`ID_CELL`, wsk.`ID_PROCES`
  551. order by tv.`CELL_SORT_PRIO`
  552. SQL;
  553. $sqlExample_UrlToUserProces = <<<SQL
  554. select zpv.*
  555. from `CRM_PROCES_idx_URL_TO_PROCES_VIEW` zpv
  556. where zpv.`ID_PROCES` in({$sqlIdProcesList})
  557. SQL;
  558. $sqlExample_sqlIdProcesList = <<<SQL
  559. select gi.`ID_PROCES`
  560. from `CRM_PROCES_idx_GROUP_to_PROCES` gi
  561. where gi.`ID_GROUP` in({$idUserGroupList})
  562. SQL;
  563. $sqlList_BUG = <<<SQL
  564. -- BUG #1349 - View's SELECT contains a subquery in the FROM clause
  565. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_USER_VIEW` AS
  566. select tpvg.`ID_PROCES`, tpvg.`TABLE_NAME`
  567. , upv.`ADM_ACCOUNT`
  568. , upv.`EMPLOYEE_TYPE`
  569. , upv.`A_STATUS`
  570. from
  571. (select tpv.`ID_PROCES`, tpv.`TABLE_NAME`
  572. from `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
  573. group by tpv.`TABLE_NAME`, tpv.`ID_PROCES`) as tpvg
  574. join `CRM_PROCES_idx_USER_to_PROCES_VIEW` upv on(upv.`ID_PROCES`=tpvg.`ID_PROCES`)
  575. SQL;
  576. $sqlList['RemoveViewTableToProcesGrouped'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_PROCES_GROUPED_VIEW`";
  577. $sqlList['InstallViewTableToProcesGrouped'] = <<<SQL
  578. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_PROCES_GROUPED_VIEW` AS
  579. select tpv.`ID_TABLE`
  580. , tpv.`TABLE_NAME`
  581. , tpv.`TABLE_LABEL`
  582. , tpv.`TABLE_DESCRIPTION`
  583. , tpv.`ID_DATABASE`
  584. , tpv.`ID_PROCES`
  585. from `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
  586. group by tpv.`ID_TABLE`, tpv.`ID_PROCES`
  587. SQL;
  588. $sqlList['RemoveViewTableToUser'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_USER_VIEW`";
  589. $sqlList['InstallViewTableToUser'] = <<<SQL
  590. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_USER_VIEW` AS
  591. select tpgv.`ID_TABLE`, tpgv.`TABLE_NAME`, tpgv.`ID_PROCES`
  592. , upv.`ADM_ACCOUNT`
  593. , upv.`EMPLOYEE_TYPE`
  594. , upv.`A_STATUS`
  595. from `CRM_PROCES_idx_TABLE_TO_PROCES_GROUPED_VIEW` as tpgv
  596. join `CRM_PROCES_idx_USER_to_PROCES_VIEW` upv on(upv.`ID_PROCES`=tpgv.`ID_PROCES`)
  597. SQL;
  598. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec`";
  599. // throws errors:
  600. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  601. $sqlList['CreateProcedure'] = <<<SQL
  602. CREATE PROCEDURE `update_proces_init_idx_rec`()
  603. BEGIN
  604. SET @enabled = FALSE;
  605. SET @conf_last_exec_lock_key = 'tbl_indexer_CRM_PROCES_last_exec_lock_date';
  606. SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  607. SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  608. -- if already runnig mysql will throw "Commands out of sync; you can't run this command now"
  609. IF (select count(1) from `CRM_CONFIG` where `conf_key`=@conf_last_exec_lock_key and `conf_val`!='')>0 THEN
  610. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed` SET x=1;
  611. ELSE BEGIN
  612. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, NOW()), (@conf_last_exec_start_key, NOW());
  613. -- select sleep(2); -- // DBG
  614. -- select 'truncate->delete...';
  615. truncate table `CRM_PROCES_idx`;
  616. -- delete from `CRM_PROCES_idx`;
  617. -- select 'insert into `CRM_PROCES_idx`...';
  618. insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
  619. select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
  620. from `CRM_PROCES` p
  621. where p.`A_STATUS` in('NORMAL','WAITING')
  622. ;
  623. -- select 'while 1...';
  624. update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID_PROCES`, 0);
  625. SET @i = 0;
  626. SET @loopLomit = 100;
  627. SET @pinitCnt = 1;
  628. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  629. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  630. set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
  631. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
  632. SET @pinitCnt = ROW_COUNT();
  633. SET @i = @i + 1;
  634. END WHILE;
  635. -- select 'while 2... search stanowiska';
  636. update `CRM_PROCES_idx` i
  637. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  638. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  639. )
  640. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  641. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  642. and z.`A_STATUS` in('NORMAL', 'WAITING')
  643. )
  644. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  645. and przyp.`FORM_TREAT` & 8 -- has perm X
  646. )
  647. set
  648. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  649. where i.`idx_PROCES_INIT_ID`>0;
  650. SET @i = 0;
  651. SET @loopLomit = 100;
  652. SET @groupCnt = 1;
  653. WHILE @i < @loopLomit and @groupCnt > 0 DO
  654. update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  655. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  656. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  657. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  658. and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
  659. SET @groupCnt = ROW_COUNT();
  660. SET @i = @i + 1;
  661. END WHILE;
  662. -- select 'GOTO_AND_RETURN...';
  663. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  664. select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
  665. , IF(gi.`idx_PROCES_WITH_GROUPS_ID` is null, pi.`idx_PROCES_WITH_GROUPS_ID`, gi.`idx_PROCES_WITH_GROUPS_ID`) as `idx_PROCES_WITH_GROUPS_ID`
  666. from `CRM_PROCES` p
  667. join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
  668. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  669. and g.`TYPE`='PROCES_INIT'
  670. and g.`A_STATUS` in('NORMAL','WAITING')
  671. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  672. and p.`IF_TRUE_GOTO`>0
  673. )
  674. join `CRM_PROCES_idx` gi on(gi.`ID_PROCES`=g.`ID`)
  675. where p.`A_STATUS` in('NORMAL','WAITING')
  676. -- 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`)
  677. ;
  678. update `CRM_PROCES_idx`
  679. set `idx_PROCES_WITH_GROUPS_ID`=0
  680. where `idx_PROCES_WITH_GROUPS_ID` is null
  681. and `TYPE`='PROCES_INIT'
  682. ;
  683. insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  684. select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  685. from `CRM_PROCES_idx` i
  686. join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  687. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  688. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  689. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  690. and i.`TYPE`!='GOTO_AND_RETURN'
  691. ;
  692. -- select 'delete idx_PROCES_WITH_GROUPS_ID...';
  693. delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  694. -- select 'update `CRM_PROCES`...';
  695. update `CRM_PROCES` p
  696. 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)
  697. ;
  698. -- select 'update `CRM_PROCES_idx_GROUP_to_PROCES`...';
  699. truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
  700. insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  701. select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
  702. from `CRM_PROCES_idx` i
  703. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  704. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  705. )
  706. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  707. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  708. and z.`A_STATUS` in('NORMAL', 'WAITING')
  709. )
  710. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  711. and przyp.`FORM_TREAT` & 8 -- has perm X
  712. )
  713. -- where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  714. ;
  715. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, ''), (@conf_last_exec_end_key, NOW());
  716. -- clear msg 'Update perms' from Msgs system
  717. update `CRM_UI_MSGS`
  718. set `A_STATUS`='OFF_HARD'
  719. , `actionExecutedTime`=NOW()
  720. , `A_RECORD_UPDATE_DATE`=NOW()
  721. , `A_RECORD_UPDATE_AUTHOR`='update_proces_init_idx_rec'
  722. where `A_STATUS`='WAITING'
  723. and `app_className`='FixCrmProcesInitIdx'
  724. and `msg`='Update perms'
  725. and `uiTargetType`='default_db_table'
  726. and `uiTargetName`='CRM_PROCES';
  727. END ; END IF ;
  728. END ;
  729. SQL;
  730. $sqlList['RemoveTrigger_AfterInsertProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT`";
  731. $sqlList['CreateTrigger_AfterInsertProces'] = "
  732. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT` AFTER INSERT ON `CRM_PROCES`
  733. FOR EACH ROW BEGIN
  734. -- only when PARENT_ID changes and PARENT_ID exists in `CRM_PROCES_idx`
  735. 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
  736. -- throw warning to update perms
  737. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  738. and `msg`='Update perms'
  739. and `uiTargetType`='default_db_table'
  740. and `uiTargetName`='CRM_PROCES'
  741. and `A_STATUS`='WAITING'
  742. ) = 0 THEN
  743. INSERT INTO `CRM_UI_MSGS` (`ID`
  744. , `app_className`, `msg`, `msgType`
  745. , `uiTargetType`, `uiTargetName`
  746. , `userTargetType`
  747. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  748. VALUES (NULL
  749. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  750. , 'default_db_table', 'CRM_PROCES'
  751. , 'everyone'
  752. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT')
  753. );
  754. END IF;
  755. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  756. END IF;
  757. END
  758. ";
  759. $sqlList['RemoveTrigger_AfterUpdateProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE`";
  760. $sqlList['CreateTrigger_AfterUpdateProces'] = "
  761. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE` AFTER UPDATE ON `CRM_PROCES`
  762. FOR EACH ROW BEGIN
  763. -- only when PARENT_ID changes and ID exists in `CRM_PROCES_idx`
  764. 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
  765. -- throw warning to update perms
  766. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  767. and `msg`='Update perms'
  768. and `uiTargetType`='default_db_table'
  769. and `uiTargetName`='CRM_PROCES'
  770. and `A_STATUS`='WAITING'
  771. ) = 0 THEN
  772. INSERT INTO `CRM_UI_MSGS` (`ID`
  773. , `app_className`, `msg`, `msgType`
  774. , `uiTargetType`, `uiTargetName`
  775. , `userTargetType`
  776. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  777. VALUES (NULL
  778. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  779. , 'default_db_table', 'CRM_PROCES'
  780. , 'everyone'
  781. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE')
  782. );
  783. END IF;
  784. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  785. END IF;
  786. END
  787. ";
  788. $sqlList['RemoveTrigger_AfterInsertWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT`";
  789. $sqlList['CreateTrigger_AfterInsertWskaznik'] = "
  790. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT` AFTER INSERT ON `CRM_WSKAZNIK`
  791. FOR EACH ROW BEGIN
  792. -- only when ID_PROCES exists in `CRM_PROCES_idx`
  793. -- only when ID_ZASOB is group
  794. -- only when ID_PRZYPADEK has perm 'X'
  795. IF NEW.`ID_PROCES`>0
  796. AND NEW.`ID_ZASOB`>0
  797. AND NEW.`ID_PRZYPADEK`>0
  798. AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES`=NEW.`ID_PROCES` limit 1)>0
  799. AND (select count(*) from `CRM_LISTA_ZASOBOW` z where z.`ID`=NEW.`ID_ZASOB` and z.`TYPE` in('STANOWISKO','DZIAL','PODMIOT') limit 1)>0
  800. AND (select count(*) from `CRM_PRZYPADEK` przyp where przyp.`ID`=NEW.`ID_PRZYPADEK` and przyp.`FORM_TREAT` & 8 limit 1)>0
  801. THEN
  802. -- throw warning to update perms
  803. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  804. and `msg`='Update perms'
  805. and `uiTargetType`='default_db_table'
  806. and `uiTargetName`='CRM_PROCES'
  807. and `A_STATUS`='WAITING'
  808. ) = 0 THEN
  809. INSERT INTO `CRM_UI_MSGS` (`ID`
  810. , `app_className`, `msg`, `msgType`
  811. , `uiTargetType`, `uiTargetName`
  812. , `userTargetType`
  813. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  814. VALUES (NULL
  815. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  816. , 'default_db_table', 'CRM_PROCES'
  817. , 'everyone'
  818. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT')
  819. );
  820. END IF;
  821. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  822. END IF;
  823. END
  824. ";
  825. $sqlList['RemoveTrigger_AfterUpdateWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE`";
  826. $sqlList['CreateTrigger_AfterUpdateWskaznik'] = "
  827. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE` AFTER UPDATE ON `CRM_WSKAZNIK`
  828. FOR EACH ROW BEGIN
  829. -- only when old or new ID_PROCES exists in `CRM_PROCES_idx`
  830. -- only when old or new ID_ZASOB is group
  831. -- only when old or new ID_PRZYPADEK has perm 'X'
  832. IF (NEW.`ID_PROCES`!=OLD.`ID_PROCES`
  833. or NEW.`ID_ZASOB`!=OLD.`ID_ZASOB`
  834. or NEW.`ID_PRZYPADEK`!=OLD.`ID_PRZYPADEK`
  835. or (NEW.`A_STATUS`!=OLD.`A_STATUS`
  836. and ((NEW.`A_STATUS` in('WAITING','NORMAL') and OLD.`A_STATUS` not in('WAITING','NORMAL'))
  837. or (NEW.`A_STATUS` not in('WAITING','NORMAL') and OLD.`A_STATUS` in('WAITING','NORMAL'))
  838. )
  839. )
  840. )
  841. AND (NEW.`ID_PROCES`>0 or OLD.`ID_PROCES`>0)
  842. AND (NEW.`ID_ZASOB`>0 or OLD.`ID_ZASOB`>0)
  843. AND (NEW.`ID_PRZYPADEK`>0 or OLD.`ID_PRZYPADEK`>0)
  844. -- AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES` in(NEW.`ID_PROCES`,OLD.`ID_PROCES`) limit 1)>0
  845. 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
  846. 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
  847. THEN
  848. -- throw warning to update perms
  849. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  850. and `msg`='Update perms'
  851. and `uiTargetType`='default_db_table'
  852. and `uiTargetName`='CRM_PROCES'
  853. and `A_STATUS`='WAITING'
  854. ) = 0 THEN
  855. INSERT INTO `CRM_UI_MSGS` (`ID`
  856. , `app_className`, `msg`, `msgType`
  857. , `uiTargetType`, `uiTargetName`
  858. , `userTargetType`
  859. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  860. VALUES (NULL
  861. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  862. , 'default_db_table', 'CRM_PROCES'
  863. , 'everyone'
  864. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE')
  865. );
  866. END IF;
  867. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  868. END IF;
  869. END
  870. ";
  871. $db = DB::getDB();
  872. if ($db->has_errors()) {
  873. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  874. }
  875. foreach ($sqlList as $sqlName => $sql) {
  876. $res = $db->query($sql);
  877. if ($db->has_errors()) {
  878. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  879. }
  880. }
  881. }
  882. /*
  883. #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  884. */
  885. public function parseMessageFromStorage($msg) {
  886. switch ($msg) {
  887. case 'ERROR: Already executed': {
  888. $msg = "Aktualizacja uprawnień została już uruchomiona przez inną osobę";
  889. break;
  890. }
  891. case 'ERROR: Update perms': {
  892. $msg = "Wymagana aktualizacja uprawnień";
  893. break;
  894. }
  895. }
  896. return $msg;
  897. }
  898. public function parseMessageFromMsgsSystem($msg) {
  899. switch ($msg) {
  900. case 'Update perms': {
  901. $msg = "Wymagana aktualizacja uprawnień";
  902. break;
  903. }
  904. }
  905. return $msg;
  906. }
  907. public function runByMessageFromMsgsSystem($msg, &$execNotes) {
  908. switch ($msg) {
  909. case 'Update perms': {
  910. $execNotes .= 'Wymagana aktualizacja uprawnień';
  911. $this->_callProcedure();
  912. $execNotes .= ' done';
  913. break;
  914. }
  915. }
  916. }
  917. }