FixCrmProcesInitIdx.php 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085
  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-fill_idx_INIT-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx__loop__fill_idx_INIT`";
  206. $sqlList['0-prepare-fill_idx_INIT-create'] = <<<SQL
  207. CREATE PROCEDURE `update_proces_init_idx__loop__fill_idx_INIT`()
  208. BEGIN
  209. SET @i = 0;
  210. SET @loopLomit = 100;
  211. SET @pinitCnt = 1;
  212. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  213. update `CRM_PROCES_idx_TEMP` p
  214. join `CRM_PROCES_idx_TEMP` pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  215. set p.`idx_PROCES_INIT_ID`=IF(p.`idx_PROCES_INIT_ID`>0, p.`idx_PROCES_INIT_ID`, pp.`idx_PROCES_INIT_ID`)
  216. , p.`idx_MAIN_PROCES_INIT_ID`=pp.`idx_MAIN_PROCES_INIT_ID`
  217. -- // TODO:?: update here `idx_MAIN_PROCES_INIT_ID`
  218. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0
  219. ;
  220. SET @pinitCnt = ROW_COUNT();
  221. SET @i = @i + 1;
  222. END WHILE;
  223. END
  224. SQL;
  225. $sqlList['0-prepare-while-1-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while1`";
  226. $sqlList['0-prepare-while-1-create'] = <<<SQL
  227. CREATE PROCEDURE `update_proces_init_idx_rec__while1`()
  228. BEGIN
  229. -- update `CRM_PROCES_idx_TEMP` as i set i.`idx_PROCES_INIT_ID`=IF(i.`TYPE`='PROCES_INIT', i.`ID_PROCES`, 0);
  230. SET @i = 0;
  231. SET @loopLomit = 100;
  232. SET @pinitCnt = 1;
  233. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  234. update `CRM_PROCES_idx_TEMP` p
  235. join `CRM_PROCES_idx_TEMP` pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  236. set p.`idx_MAIN_PROCES_INIT_ID`=pp.`idx_MAIN_PROCES_INIT_ID`
  237. where p.`idx_MAIN_PROCES_INIT_ID`=0 and pp.`idx_MAIN_PROCES_INIT_ID`>0
  238. ;
  239. SET @pinitCnt = ROW_COUNT();
  240. SET @i = @i + 1;
  241. END WHILE;
  242. END
  243. SQL;
  244. $sqlList['0-prepare-while-2-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while2`";
  245. $sqlList['0-prepare-while-2-create'] = <<<SQL
  246. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  247. BEGIN
  248. SET @i = 0;
  249. SET @loopLomit = 100;
  250. SET @groupCnt = 1;
  251. WHILE @i < @loopLomit and @groupCnt > 0 DO
  252. update `CRM_PROCES_idx_TEMP` as p
  253. join `CRM_PROCES_idx_TEMP` as pp on(
  254. pp.`ID_PROCES`=p.`PARENT_ID`
  255. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  256. and pp.`idx_PROCES_WITH_GROUPS_ID`>0
  257. )
  258. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  259. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  260. ;
  261. SET @groupCnt = ROW_COUNT();
  262. SET @i = @i + 1;
  263. END WHILE;
  264. END
  265. SQL;
  266. $sqlList__TEST_PERF_NO_DIFF['0-prepare-while-2-create'] = <<<SQL
  267. CREATE PROCEDURE `update_proces_init_idx_rec__while2`()
  268. BEGIN
  269. SET @i = 0;
  270. SET @loopLomit = 100;
  271. SET @groupCnt = 1;
  272. WHILE @i < @loopLomit and @groupCnt > 0 DO
  273. update `CRM_PROCES_idx_TEMP` as p
  274. join `CRM_PROCES_idx_TEMP` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`
  275. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  276. and pp.`idx_PROCES_WITH_GROUPS_ID`>0
  277. )
  278. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  279. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  280. ;
  281. SET @groupCnt = ROW_COUNT();
  282. SET @i = @i + 1;
  283. END WHILE;
  284. END
  285. SQL;
  286. $sqlList['CONF.1--set-start-time-in-config'] = <<<SQL
  287. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_start', NOW());
  288. SQL;
  289. $sqlList['I.1--truncate-table'] = <<<SQL
  290. -- // TODO: mv to the procedure end, and add insert into `CRM_PROCES_idx` select * from `CRM_PROCES_idx_TEMP`;
  291. -- truncate table `CRM_PROCES_idx`;
  292. DROP TABLE IF EXISTS `CRM_PROCES_idx_TEMP`;
  293. SQL;
  294. $sqlList['I.2--fill-CRM_PROCES_idx_TEMP'] = <<<SQL
  295. -- Mysql BUG: "Can't reopen table" -- CREATE TEMPORARY TABLE `CRM_PROCES_idx_TEMP` (
  296. -- You cannot refer to a TEMPORARY table more than once in the same query.
  297. CREATE TABLE `CRM_PROCES_idx_TEMP` (
  298. `ID_PROCES` int(11) NOT NULL
  299. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  300. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  301. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  302. , `idx_MAIN_PROCES_INIT_ID` int(11) NULL DEFAULT '0'
  303. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  304. -- , `idx_PATH` text NOT NULL
  305. , KEY `ID_PROCES` (`ID_PROCES`)
  306. , KEY `PARENT_ID` (`PARENT_ID`)
  307. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  308. , KEY `idx_MAIN_PROCES_INIT_ID` (`idx_MAIN_PROCES_INIT_ID`)
  309. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  310. , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
  311. )
  312. select p.`ID` as `ID_PROCES`
  313. , p.`TYPE` as `TYPE`
  314. , p.`PARENT_ID` as `PARENT_ID`
  315. , IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_PROCES_INIT_ID`
  316. , IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_MAIN_PROCES_INIT_ID`
  317. from `CRM_PROCES` p
  318. where p.`A_STATUS` in('NORMAL','WAITING')
  319. ;
  320. SQL;
  321. $sqlList['G.1--before-while-2-set-initial-proc_with_groups_id'] = <<<SQL
  322. update `CRM_PROCES_idx_TEMP` i
  323. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  324. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  325. )
  326. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  327. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  328. and z.`A_STATUS` in('NORMAL', 'WAITING')
  329. )
  330. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  331. and przyp.`FORM_TREAT` & 8 -- has perm X
  332. )
  333. set
  334. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  335. -- TODO: main procedure (this rows was removed step before):
  336. where i.`idx_PROCES_INIT_ID`>0
  337. ;
  338. SQL;
  339. $sqlList['G.2--while-2-loop-update-proc_with_groups_id-from-parent'] = <<<SQL
  340. call `update_proces_init_idx_rec__while2`();
  341. SQL;
  342. $sqlList['P_INIT_ID.1--fill_idx_INIT'] = <<<SQL
  343. call `update_proces_init_idx__loop__fill_idx_INIT`();
  344. SQL;
  345. $sqlList['GOTO_AND_RET.1--from-7-fill-goto_and_return'] = <<<SQL
  346. insert ignore into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  347. select g.`ID`
  348. , 'GOTO_AND_RETURN' as `TYPE`
  349. , p.`ID` as `PARENT_ID`
  350. , g.`ID` as `idx_PROCES_INIT_ID`
  351. , i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
  352. , IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, gi.`idx_PROCES_WITH_GROUPS_ID`, i.`idx_PROCES_WITH_GROUPS_ID`) as `idx_PROCES_WITH_GROUPS_ID`
  353. from `CRM_PROCES` p
  354. join `CRM_PROCES_idx_TEMP` i on(i.`ID_PROCES`=p.`ID`)
  355. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  356. and g.`TYPE`='PROCES_INIT'
  357. and g.`A_STATUS` in('NORMAL','WAITING')
  358. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  359. and p.`IF_TRUE_GOTO`>0
  360. )
  361. join `CRM_PROCES_idx_TEMP` gi on(gi.`ID_PROCES`=g.`ID`)
  362. where p.`A_STATUS` in('NORMAL','WAITING')
  363. ;
  364. SQL;
  365. $sqlList['GOTO_AND_RET.2--fill-childrens-of-goto_and_return'] = <<<SQL
  366. insert ignore into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  367. select ic.`ID_PROCES`
  368. , 'GOTO_AND_RETURN_CHILD' as `TYPE`
  369. , ic.`PARENT_ID` as `PARENT_ID`
  370. , ic.`idx_PROCES_INIT_ID` as `idx_PROCES_INIT_ID`
  371. , i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
  372. , IF(ic.`idx_PROCES_WITH_GROUPS_ID` is null, i.`idx_PROCES_WITH_GROUPS_ID`, ic.`idx_PROCES_WITH_GROUPS_ID`) as `idx_PROCES_WITH_GROUPS_ID`
  373. from `CRM_PROCES_idx_TEMP` i
  374. join `CRM_PROCES_idx_TEMP` ic on(
  375. ic.`idx_PROCES_INIT_ID`=i.`ID_PROCES`
  376. and ic.`ID_PROCES`!=i.`ID_PROCES`
  377. )
  378. where i.`TYPE`='GOTO_AND_RETURN'
  379. ;
  380. SQL;
  381. $sqlList__TODO_IS_NEEDED__['4.2-NEW-while-1'] = <<<SQL
  382. call `update_proces_init_idx_rec__while1`();
  383. SQL;
  384. // TODO: mv here loop insert goto_and_return
  385. // TODO: add idx_MAIN_PROCES_INIT_ID - which proces has goto_end_return for this step
  386. $sqlList__TODO_SEE_IDX_2__['CLEANUP.1--remove-not-needed-rows'] = <<<SQL
  387. -- // TODO: add to main procedure
  388. delete from `CRM_PROCES_idx_TEMP` where `idx_PROCES_INIT_ID`=0;
  389. SQL;
  390. $sqlList__TODO_SEE_IDX_2__['CLEANUP.2--update-idx_PROCES_WITH_GROUPS_ID-zero-where-null'] = <<<SQL
  391. update `CRM_PROCES_idx_TEMP`
  392. set `idx_PROCES_WITH_GROUPS_ID`=0
  393. where `idx_PROCES_WITH_GROUPS_ID` is null
  394. and `TYPE`='PROCES_INIT'
  395. ;
  396. SQL;
  397. $sqlList__TODO_IS_NEEDED__['9-fix-goto_and_return'] = <<<SQL
  398. insert ignore into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  399. select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
  400. from `CRM_PROCES_idx_TEMP` i
  401. join `CRM_PROCES_idx_TEMP` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
  402. where i.`idx_PROCES_WITH_GROUPS_ID` is null
  403. and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
  404. and pi.`idx_PROCES_WITH_GROUPS_ID`>0
  405. and i.`TYPE`!='GOTO_AND_RETURN'
  406. ;
  407. SQL;
  408. $sqlList__TODO_IS_NEEDED__['10-delete-where-!idx_PROCES_WITH_GROUPS_ID'] = <<<SQL
  409. delete from `CRM_PROCES_idx_TEMP` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
  410. SQL;
  411. $sqlList['IDX.1--clear-CRM_PROCES_idx'] = <<<SQL
  412. truncate table `CRM_PROCES_idx`;
  413. SQL;
  414. $sqlList['IDX.2--update-CRM_PROCES_idx-from-temp'] = <<<SQL
  415. insert into `CRM_PROCES_idx`
  416. select i.* from `CRM_PROCES_idx_TEMP` i
  417. where i.`idx_PROCES_INIT_ID`>0 and i.`idx_PROCES_WITH_GROUPS_ID` is not null
  418. ;
  419. SQL;
  420. $sqlList__TODO_OFF_time_0_1__['P.1--update-CRM_PROCES-idx_PROCES_INIT_ID'] = <<<SQL
  421. update `CRM_PROCES` p
  422. 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)
  423. ;
  424. SQL;
  425. $sqlList['GP.1--clear-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
  426. truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
  427. SQL;
  428. $sqlList['GP.2--fill-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
  429. insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  430. select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
  431. from `CRM_PROCES_idx` i
  432. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  433. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  434. )
  435. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  436. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  437. and z.`A_STATUS` in('NORMAL', 'WAITING')
  438. )
  439. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  440. and przyp.`FORM_TREAT` & 8 -- has perm X
  441. )
  442. -- where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  443. ;
  444. SQL;
  445. $sqlList['CONF.2--set-end-time-in-config'] = <<<SQL
  446. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
  447. SQL;
  448. $db = DB::getDB();
  449. if ($db->has_errors()) {
  450. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  451. }
  452. $DBG_TIME = true;//('1' == V::get('DBG_TIME', '', $_GET));
  453. $dbgExecTime = new DebugExecutionTime();
  454. if ($DBG_TIME) $dbgExecTime->activate();
  455. $dbgExecTime->log('start');
  456. $sqlExecuteLimit = V::get('DBG_LIMIT', 0, $_GET);
  457. $sqlExecuteCounter = 0;
  458. foreach ($sqlList as $sqlName => $sql) {
  459. $sqlExecuteCounter++;
  460. echo'<p>['.$sqlExecuteCounter.'] Executing sql "'.$sqlName.'" ... </p>';
  461. $res = $db->query($sql);
  462. if ($db->has_errors()) {
  463. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  464. }
  465. if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
  466. echo'<p>['.$sqlExecuteCounter.'] DONE sql "'.$sqlName.'"</p>';
  467. if ($sqlExecuteLimit > 0 && $sqlExecuteCounter >= $sqlExecuteLimit) break;
  468. }
  469. if($DBG_TIME) $dbgExecTime->printDebug();
  470. }
  471. public function reinstallAction() {
  472. $this->reinstall();
  473. die('OK');
  474. }
  475. public function reinstall() {
  476. $sqlList = array();
  477. $sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx`";
  478. $sqlList['InstallTable'] = <<<SQL
  479. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx` (
  480. `ID_PROCES` int(11) NOT NULL
  481. , `PARENT_ID` int(11) NOT NULL DEFAULT '0'
  482. , `TYPE` varchar(32) NOT NULL DEFAULT ''
  483. , `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  484. , `idx_MAIN_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
  485. , `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
  486. -- , `idx_PATH` text NOT NULL
  487. , KEY `ID_PROCES` (`ID_PROCES`)
  488. , KEY `PARENT_ID` (`PARENT_ID`)
  489. , KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
  490. , KEY `idx_MAIN_PROCES_INIT_ID` (`idx_MAIN_PROCES_INIT_ID`)
  491. , KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
  492. -- , UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
  493. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  494. SQL;
  495. $sqlList['RemoveOldTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
  496. $sqlList['RemoveTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUP_to_PROCES`";
  497. $sqlList['InstallTableGroupToInit'] = <<<SQL
  498. CREATE TABLE IF NOT EXISTS `CRM_PROCES_idx_GROUP_to_PROCES` (
  499. `ID_PROCES` int(11) NOT NULL
  500. , `ID_GROUP` int(11) NOT NULL
  501. , KEY `ID_PROCES` (`ID_PROCES`)
  502. , KEY `ID_GROUP` (`ID_GROUP`)
  503. , UNIQUE KEY `uniq__GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  504. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  505. SQL;
  506. $sqlList['RemoveViewUserToProces'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_USER_to_PROCES_VIEW`";
  507. $sqlList['InstallViewUserToProces'] = <<<SQL
  508. CREATE VIEW `CRM_PROCES_idx_USER_to_PROCES_VIEW` AS
  509. select concat(u.`ID`, gi.`ID_PROCES`) as ID
  510. , gi.`ID_PROCES` as `ID_PROCES`
  511. , u.`ADM_ACCOUNT` as `ADM_ACCOUNT`
  512. , u.`EMPLOYEE_TYPE` as `EMPLOYEE_TYPE`
  513. , u.`A_STATUS` as `A_STATUS`
  514. from `ADMIN_USERS` u
  515. join `CRM_AUTH_PROFILE` au on(au.`REMOTE_ID`=u.`ID` and au.`REMOTE_TABLE`='ADMIN_USERS' and au.`A_STATUS` in('NORMAL','WAITING'))
  516. join `CRM_PROCES_idx_GROUP_to_PROCES` gi on(gi.`ID_GROUP`=au.`ID_ZASOB`)
  517. SQL;
  518. $sqlList['RemoveViewUserToInit'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_USER_to_INIT_VIEW`";
  519. $sqlList['InstallViewUserToInit'] = <<<SQL
  520. CREATE VIEW `CRM_PROCES_idx_USER_to_INIT_VIEW` AS
  521. select concat(u.`ID`, p.`ID`) as ID
  522. , p.`ID` as `ID_PROCES_INIT`
  523. , p.`DESC` as `DESC`
  524. , u.`ADM_ACCOUNT` as `ADM_ACCOUNT`
  525. , u.`EMPLOYEE_TYPE` as `EMPLOYEE_TYPE`
  526. , u.`A_STATUS` as `A_STATUS`
  527. from `ADMIN_USERS` u
  528. join `CRM_AUTH_PROFILE` au on(au.`REMOTE_ID`=u.`ID` and au.`REMOTE_TABLE`='ADMIN_USERS' and au.`A_STATUS` in('NORMAL','WAITING'))
  529. join `CRM_PROCES_idx_GROUP_to_PROCES` gi on(gi.`ID_GROUP`=au.`ID_ZASOB`)
  530. join `CRM_PROCES_idx` i on(i.`ID_PROCES`=gi.`ID_PROCES`)
  531. join `CRM_PROCES` p on(p.`ID`=i.`idx_PROCES_INIT_ID`)
  532. where p.`TYPE`='PROCES_INIT'
  533. -- group by u.`ID`, p.`ID`
  534. SQL;
  535. /* Usage - find proces init for user by $userLogin:
  536. SELECT *
  537. FROM `CRM_PROCES_idx_USER_to_INIT_VIEW`
  538. WHERE `ADM_ACCOUNT` LIKE '{$userLogin}'
  539. GROUP BY ID_PROCES_INIT
  540. */
  541. $sqlList['RemoveViewTablesInfo'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLES_INFO_VIEW`";
  542. $sqlList['InstallViewTablesInfo'] = <<<SQL
  543. CREATE VIEW `CRM_PROCES_idx_TABLES_INFO_VIEW` AS
  544. select z.`ID` as `ID_CELL`
  545. , z.`DESC` as `CELL_NAME`
  546. , z.`DESC_PL` as `CELL_LABEL`
  547. , z.`OPIS` as `CELL_DESCRIPTION`
  548. , z.`SORT_PRIO` as `CELL_SORT_PRIO`
  549. , zp.`ID` as `ID_TABLE`
  550. , zp.`DESC` as `TABLE_NAME`
  551. , zp.`DESC_PL` as `TABLE_LABEL`
  552. , zp.`OPIS` as `TABLE_DESCRIPTION`
  553. , zpp.`ID` as `ID_DATABASE`
  554. from `CRM_LISTA_ZASOBOW` z
  555. join `CRM_LISTA_ZASOBOW` zp on(zp.`ID`=z.`PARENT_ID` and zp.`TYPE`='TABELA' and zp.`A_STATUS` in('WAITING','NORMAL'))
  556. join `CRM_LISTA_ZASOBOW` zpp on(zpp.`ID`=zp.`PARENT_ID`
  557. -- TODO: and zpp.`TYPE`='BAZA_DANYCH...'
  558. and zpp.`A_STATUS` in('WAITING','NORMAL')
  559. )
  560. where z.`TYPE`='KOMORKA'
  561. and z.`A_STATUS` in('WAITING','NORMAL')
  562. SQL;
  563. $sqlList['RemoveViewTableToProces'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW`";
  564. $sqlList['InstallViewTableToProces'] = <<<SQL
  565. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` AS
  566. select tv.`ID_CELL` as `ID_CELL`
  567. , tv.`CELL_NAME` as `CELL_NAME`
  568. , tv.`ID_TABLE` as `ID_TABLE`
  569. , tv.`TABLE_NAME` as `TABLE_NAME`
  570. , tv.`TABLE_LABEL` as `TABLE_LABEL`
  571. , tv.`TABLE_DESCRIPTION` as `TABLE_DESCRIPTION`
  572. , tv.`ID_DATABASE` as `ID_DATABASE`
  573. , wsk.`ID_PROCES` as `ID_PROCES`
  574. from `CRM_PROCES_idx_TABLES_INFO_VIEW` tv
  575. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=tv.`ID_CELL` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  576. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  577. SQL;
  578. $sqlList['RemoveViewUrlToProces'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_URL_TO_PROCES_VIEW`";
  579. $sqlList['InstallViewUrlToProces'] = <<<SQL
  580. CREATE VIEW `CRM_PROCES_idx_URL_TO_PROCES_VIEW` AS
  581. select z.`ID` as `ID_URL`
  582. , z.`DESC` as `URL_LINK`
  583. , z.`DESC_PL` as `URL_LABEL`
  584. , z.`OPIS` as `URL_DESC`
  585. , wsk.`ID_PROCES` as `ID_PROCES`
  586. from `CRM_LISTA_ZASOBOW` z
  587. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=z.`ID` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  588. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  589. where z.`TYPE`='URL'
  590. and z.`A_STATUS` in('WAITING','NORMAL')
  591. SQL;
  592. $sqlList['RemoveViewTableCellToProcesWithPerms'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_PROCES_PERMS_VIEW`";
  593. $sqlList['InstallViewTableCellToProcesWithPerms'] = <<<SQL
  594. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_PROCES_PERMS_VIEW` AS
  595. select tv.`ID_CELL` as `ID_CELL`
  596. , tv.`CELL_NAME` as `CELL_NAME`
  597. , tv.`ID_TABLE` as `ID_TABLE`
  598. , tv.`TABLE_NAME` as `TABLE_NAME`
  599. , tv.`TABLE_LABEL` as `TABLE_LABEL`
  600. , tv.`TABLE_DESCRIPTION` as `TABLE_DESCRIPTION`
  601. , tv.`ID_DATABASE` as `ID_DATABASE`
  602. , wsk.`ID_PROCES` as `ID_PROCES`
  603. , replace(przyp.`FORM_TREAT`, ',', '') as FORM_TREAT
  604. , IF(przyp.`FORM_TREAT` & 2, 1, 0) as PERM_R
  605. , IF(przyp.`FORM_TREAT` & 4, 1, 0) as PERM_W
  606. , IF(przyp.`FORM_TREAT` & 8, 1, 0) as PERM_X
  607. , IF(przyp.`FORM_TREAT` & 16, 1, 0) as PERM_C
  608. , IF(przyp.`FORM_TREAT` & 32, 1, 0) as PERM_S
  609. , IF(przyp.`FORM_TREAT` & 64, 1, 0) as PERM_O
  610. , IF(przyp.`FORM_TREAT` & 128, 1, 0) as PERM_V
  611. , IF(przyp.`FORM_TREAT` & 256, 1, 0) as PERM_E
  612. from `CRM_PROCES_idx_TABLES_INFO_VIEW` tv
  613. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=tv.`ID_CELL` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  614. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  615. join `CRM_PRZYPADEK` as przyp on (przyp.`ID`=wsk.`ID_PRZYPADEK`)
  616. SQL;
  617. $sqlExample_TableCellToProcesForInitTable = <<<SQL
  618. select tv.`ID_CELL` as `ID_CELL`
  619. , tv.`CELL_NAME` as `CELL_NAME`
  620. , tv.`CELL_LABEL` as `CELL_LABEL`
  621. , tv.`CELL_DESC` as `CELL_DESC`
  622. , tv.`CELL_SORT_PRIO` as `SORT_PRIO`
  623. , tv.`ID_TABLE` as `ID_TABLE`
  624. , tv.`TABLE_NAME` as `TABLE_NAME`
  625. , wsk.`ID_PROCES` as `ID_PROCES`
  626. , sum(IF(przyp.`FORM_TREAT` & 2, 1, 0)) as PERM_R
  627. , sum(IF(przyp.`FORM_TREAT` & 4, 1, 0)) as PERM_W
  628. , sum(IF(przyp.`FORM_TREAT` & 8, 1, 0)) as PERM_X
  629. , sum(IF(przyp.`FORM_TREAT` & 16, 1, 0)) as PERM_C
  630. , sum(IF(przyp.`FORM_TREAT` & 32, 1, 0)) as PERM_S
  631. , sum(IF(przyp.`FORM_TREAT` & 64, 1, 0)) as PERM_O
  632. , sum(IF(przyp.`FORM_TREAT` & 128, 1, 0)) as PERM_V
  633. , sum(IF(przyp.`FORM_TREAT` & 256, 1, 0)) as PERM_E
  634. from `CRM_PROCES_idx_TABLES_INFO_VIEW` tv
  635. join `CRM_WSKAZNIK` wsk on(wsk.`ID_ZASOB`=tv.`ID_CELL` and wsk.`A_STATUS` in('WAITING','NORMAL'))
  636. join `CRM_PROCES` p on(p.`ID`=wsk.`ID_PROCES` and p.`A_STATUS` in('WAITING','NORMAL'))
  637. join `CRM_PRZYPADEK` as przyp on (przyp.`ID`=wsk.`ID_PRZYPADEK`)
  638. where tv.`ID_TABLE`='{$idTable}'
  639. and wsk.`ID_PROCES` in({$sqlIdProcesList})
  640. group by tv.`ID_CELL`, wsk.`ID_PROCES`
  641. order by tv.`CELL_SORT_PRIO`
  642. SQL;
  643. $sqlExample_UrlToUserProces = <<<SQL
  644. select zpv.*
  645. from `CRM_PROCES_idx_URL_TO_PROCES_VIEW` zpv
  646. where zpv.`ID_PROCES` in({$sqlIdProcesList})
  647. SQL;
  648. $sqlExample_sqlIdProcesList = <<<SQL
  649. select gi.`ID_PROCES`
  650. from `CRM_PROCES_idx_GROUP_to_PROCES` gi
  651. where gi.`ID_GROUP` in({$idUserGroupList})
  652. SQL;
  653. $sqlList_BUG = <<<SQL
  654. -- BUG #1349 - View's SELECT contains a subquery in the FROM clause
  655. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_USER_VIEW` AS
  656. select tpvg.`ID_PROCES`, tpvg.`TABLE_NAME`
  657. , upv.`ADM_ACCOUNT`
  658. , upv.`EMPLOYEE_TYPE`
  659. , upv.`A_STATUS`
  660. from
  661. (select tpv.`ID_PROCES`, tpv.`TABLE_NAME`
  662. from `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
  663. group by tpv.`TABLE_NAME`, tpv.`ID_PROCES`) as tpvg
  664. join `CRM_PROCES_idx_USER_to_PROCES_VIEW` upv on(upv.`ID_PROCES`=tpvg.`ID_PROCES`)
  665. SQL;
  666. $sqlList['RemoveViewTableToProcesGrouped'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_PROCES_GROUPED_VIEW`";
  667. $sqlList['InstallViewTableToProcesGrouped'] = <<<SQL
  668. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_PROCES_GROUPED_VIEW` AS
  669. select tpv.`ID_TABLE`
  670. , tpv.`TABLE_NAME`
  671. , tpv.`TABLE_LABEL`
  672. , tpv.`TABLE_DESCRIPTION`
  673. , tpv.`ID_DATABASE`
  674. , tpv.`ID_PROCES`
  675. from `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
  676. group by tpv.`ID_TABLE`, tpv.`ID_PROCES`
  677. SQL;
  678. $sqlList['RemoveViewTableToUser'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLE_TO_USER_VIEW`";
  679. $sqlList['InstallViewTableToUser'] = <<<SQL
  680. CREATE VIEW `CRM_PROCES_idx_TABLE_TO_USER_VIEW` AS
  681. select tpgv.`ID_TABLE`, tpgv.`TABLE_NAME`, tpgv.`ID_PROCES`
  682. , upv.`ADM_ACCOUNT`
  683. , upv.`EMPLOYEE_TYPE`
  684. , upv.`A_STATUS`
  685. from `CRM_PROCES_idx_TABLE_TO_PROCES_GROUPED_VIEW` as tpgv
  686. join `CRM_PROCES_idx_USER_to_PROCES_VIEW` upv on(upv.`ID_PROCES`=tpgv.`ID_PROCES`)
  687. SQL;
  688. $sqlList['RemoveProcedure'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec`";
  689. // throws errors:
  690. // #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  691. $sqlList['CreateProcedure'] = <<<SQL
  692. CREATE PROCEDURE `update_proces_init_idx_rec`()
  693. BEGIN
  694. SET @enabled = FALSE;
  695. SET @conf_last_exec_lock_key = 'tbl_indexer_CRM_PROCES_last_exec_lock_date';
  696. SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
  697. SET @conf_last_exec_end_key = 'tbl_indexer_CRM_PROCES_last_exec_end';
  698. -- if already runnig mysql will throw "Commands out of sync; you can't run this command now"
  699. IF (select count(1) from `CRM_CONFIG` where `conf_key`=@conf_last_exec_lock_key and `conf_val`!='')>0 THEN
  700. UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed` SET x=1;
  701. ELSE BEGIN
  702. -- CONF.1--set-start-time-in-config
  703. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, NOW()), (@conf_last_exec_start_key, NOW());
  704. -- I.1--truncate-table
  705. truncate table `CRM_PROCES_idx_TEMP`;
  706. -- I.2--fill-CRM_PROCES_idx_TEMP
  707. insert into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`)
  708. select p.`ID` as `ID_PROCES`
  709. , p.`TYPE` as `TYPE`
  710. , p.`PARENT_ID` as `PARENT_ID`
  711. , IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_PROCES_INIT_ID`
  712. , IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_MAIN_PROCES_INIT_ID`
  713. from `CRM_PROCES` p
  714. where p.`A_STATUS` in('NORMAL','WAITING')
  715. ;
  716. -- G.1--before-while-2-set-initial-proc_with_groups_id
  717. update `CRM_PROCES_idx_TEMP` i
  718. join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
  719. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  720. )
  721. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  722. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  723. and z.`A_STATUS` in('NORMAL', 'WAITING')
  724. )
  725. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  726. and przyp.`FORM_TREAT` & 8 -- has perm X
  727. )
  728. set
  729. i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
  730. where i.`idx_PROCES_INIT_ID`>0
  731. ;
  732. -- G.2--while-2-loop-update-proc_with_groups_id-from-parent
  733. SET @i = 0;
  734. SET @loopLomit = 100;
  735. SET @groupCnt = 1;
  736. WHILE @i < @loopLomit and @groupCnt > 0 DO
  737. update `CRM_PROCES_idx_TEMP` as p
  738. join `CRM_PROCES_idx_TEMP` as pp on(
  739. pp.`ID_PROCES`=p.`PARENT_ID`
  740. and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
  741. and pp.`idx_PROCES_WITH_GROUPS_ID`>0
  742. )
  743. set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
  744. where p.`idx_PROCES_WITH_GROUPS_ID` is null
  745. ;
  746. SET @groupCnt = ROW_COUNT();
  747. SET @i = @i + 1;
  748. END WHILE;
  749. -- 'P_INIT_ID.1--fill_idx_INIT
  750. SET @i = 0;
  751. SET @loopLomit = 100;
  752. SET @pinitCnt = 1;
  753. WHILE @i < @loopLomit and @pinitCnt > 0 DO
  754. update `CRM_PROCES_idx_TEMP` p
  755. join `CRM_PROCES_idx_TEMP` pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
  756. set p.`idx_PROCES_INIT_ID`=IF(p.`idx_PROCES_INIT_ID`>0, p.`idx_PROCES_INIT_ID`, pp.`idx_PROCES_INIT_ID`)
  757. , p.`idx_MAIN_PROCES_INIT_ID`=pp.`idx_MAIN_PROCES_INIT_ID`
  758. -- // TODO:?: update here `idx_MAIN_PROCES_INIT_ID`
  759. where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0
  760. ;
  761. SET @pinitCnt = ROW_COUNT();
  762. SET @i = @i + 1;
  763. END WHILE;
  764. -- GOTO_AND_RET.1--from-7-fill-goto_and_return
  765. insert ignore into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  766. select g.`ID`
  767. , 'GOTO_AND_RETURN' as `TYPE`
  768. , p.`ID` as `PARENT_ID`
  769. , g.`ID` as `idx_PROCES_INIT_ID`
  770. , i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
  771. , IF(i.`idx_PROCES_WITH_GROUPS_ID` is null, gi.`idx_PROCES_WITH_GROUPS_ID`, i.`idx_PROCES_WITH_GROUPS_ID`) as `idx_PROCES_WITH_GROUPS_ID`
  772. from `CRM_PROCES` p
  773. join `CRM_PROCES_idx_TEMP` i on(i.`ID_PROCES`=p.`ID`)
  774. join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
  775. and g.`TYPE`='PROCES_INIT'
  776. and g.`A_STATUS` in('NORMAL','WAITING')
  777. and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
  778. and p.`IF_TRUE_GOTO`>0
  779. )
  780. join `CRM_PROCES_idx_TEMP` gi on(gi.`ID_PROCES`=g.`ID`)
  781. where p.`A_STATUS` in('NORMAL','WAITING')
  782. ;
  783. -- GOTO_AND_RET.2--fill-childrens-of-goto_and_return
  784. insert ignore into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  785. select ic.`ID_PROCES`
  786. , 'GOTO_AND_RETURN_CHILD' as `TYPE`
  787. , ic.`PARENT_ID` as `PARENT_ID`
  788. , ic.`idx_PROCES_INIT_ID` as `idx_PROCES_INIT_ID`
  789. , i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
  790. , IF(ic.`idx_PROCES_WITH_GROUPS_ID` is null, i.`idx_PROCES_WITH_GROUPS_ID`, ic.`idx_PROCES_WITH_GROUPS_ID`) as `idx_PROCES_WITH_GROUPS_ID`
  791. from `CRM_PROCES_idx_TEMP` i
  792. join `CRM_PROCES_idx_TEMP` ic on(
  793. ic.`idx_PROCES_INIT_ID`=i.`ID_PROCES`
  794. and ic.`ID_PROCES`!=i.`ID_PROCES`
  795. )
  796. where i.`TYPE`='GOTO_AND_RETURN'
  797. ;
  798. -- IDX.1--clear-CRM_PROCES_idx
  799. truncate table `CRM_PROCES_idx`;
  800. -- IDX.2--update-CRM_PROCES_idx-from-temp
  801. insert into `CRM_PROCES_idx` (`ID_PROCES`,`PARENT_ID`,`TYPE`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
  802. select i.`ID_PROCES`,i.`PARENT_ID`,i.`TYPE`,i.`idx_PROCES_INIT_ID`,i.`idx_MAIN_PROCES_INIT_ID`,i.`idx_PROCES_WITH_GROUPS_ID`
  803. from `CRM_PROCES_idx_TEMP` i
  804. where i.`idx_PROCES_INIT_ID`>0 and i.`idx_PROCES_WITH_GROUPS_ID` is not null
  805. ;
  806. -- TODO OFF: time ~0.1 P.1--update-CRM_PROCES-idx_PROCES_INIT_ID
  807. -- update `CRM_PROCES` p
  808. -- 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)
  809. -- ;
  810. -- GP.1--clear-CRM_PROCES_idx_GROUP_to_PROCES
  811. truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
  812. -- GP.2--fill-CRM_PROCES_idx_GROUP_to_PROCES
  813. insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
  814. select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
  815. from `CRM_PROCES_idx` i
  816. join `CRM_WSKAZNIK` wsk on(wsk.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`
  817. and wsk.`A_STATUS` in('NORMAL', 'WAITING')
  818. )
  819. join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=wsk.`ID_ZASOB`
  820. and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
  821. and z.`A_STATUS` in('NORMAL', 'WAITING')
  822. )
  823. join `CRM_PRZYPADEK` przyp on(przyp.`ID`=wsk.`ID_PRZYPADEK`
  824. and przyp.`FORM_TREAT` & 8 -- has perm X
  825. )
  826. -- where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
  827. ;
  828. -- CONF.2--set-end-time-in-config
  829. replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, ''), (@conf_last_exec_end_key, NOW());
  830. -- clear msg 'Update perms' from Msgs system
  831. update `CRM_UI_MSGS`
  832. set `A_STATUS`='OFF_HARD'
  833. , `actionExecutedTime`=NOW()
  834. , `A_RECORD_UPDATE_DATE`=NOW()
  835. , `A_RECORD_UPDATE_AUTHOR`='update_proces_init_idx_rec'
  836. where `A_STATUS`='WAITING'
  837. and `app_className`='FixCrmProcesInitIdx'
  838. and `msg`='Update perms'
  839. and `uiTargetType`='default_db_table'
  840. and `uiTargetName`='CRM_PROCES'
  841. ;
  842. END ; END IF ;
  843. END ;
  844. SQL;
  845. $sqlList['RemoveTrigger_AfterInsertProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT`";
  846. $sqlList['CreateTrigger_AfterInsertProces'] = "
  847. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT` AFTER INSERT ON `CRM_PROCES`
  848. FOR EACH ROW BEGIN
  849. -- only when PARENT_ID changes and PARENT_ID exists in `CRM_PROCES_idx`
  850. 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
  851. -- throw warning to update perms
  852. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  853. and `msg`='Update perms'
  854. and `uiTargetType`='default_db_table'
  855. and `uiTargetName`='CRM_PROCES'
  856. and `A_STATUS`='WAITING'
  857. ) = 0 THEN
  858. INSERT INTO `CRM_UI_MSGS` (`ID`
  859. , `app_className`, `msg`, `msgType`
  860. , `uiTargetType`, `uiTargetName`
  861. , `userTargetType`
  862. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  863. VALUES (NULL
  864. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  865. , 'default_db_table', 'CRM_PROCES'
  866. , 'everyone'
  867. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_INSERT')
  868. );
  869. END IF;
  870. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  871. END IF;
  872. END
  873. ";
  874. $sqlList['RemoveTrigger_AfterUpdateProces'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE`";
  875. $sqlList['CreateTrigger_AfterUpdateProces'] = "
  876. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE` AFTER UPDATE ON `CRM_PROCES`
  877. FOR EACH ROW BEGIN
  878. -- only when PARENT_ID changes and ID exists in `CRM_PROCES_idx`
  879. 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
  880. -- throw warning to update perms
  881. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  882. and `msg`='Update perms'
  883. and `uiTargetType`='default_db_table'
  884. and `uiTargetName`='CRM_PROCES'
  885. and `A_STATUS`='WAITING'
  886. ) = 0 THEN
  887. INSERT INTO `CRM_UI_MSGS` (`ID`
  888. , `app_className`, `msg`, `msgType`
  889. , `uiTargetType`, `uiTargetName`
  890. , `userTargetType`
  891. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  892. VALUES (NULL
  893. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  894. , 'default_db_table', 'CRM_PROCES'
  895. , 'everyone'
  896. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_PROCES_AFTER_UPDATE')
  897. );
  898. END IF;
  899. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  900. END IF;
  901. END
  902. ";
  903. $sqlList['RemoveTrigger_AfterInsertWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT`";
  904. $sqlList['CreateTrigger_AfterInsertWskaznik'] = "
  905. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT` AFTER INSERT ON `CRM_WSKAZNIK`
  906. FOR EACH ROW BEGIN
  907. -- only when ID_PROCES exists in `CRM_PROCES_idx`
  908. -- only when ID_ZASOB is group
  909. -- only when ID_PRZYPADEK has perm 'X'
  910. IF NEW.`ID_PROCES`>0
  911. AND NEW.`ID_ZASOB`>0
  912. AND NEW.`ID_PRZYPADEK`>0
  913. AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES`=NEW.`ID_PROCES` limit 1)>0
  914. AND (select count(*) from `CRM_LISTA_ZASOBOW` z where z.`ID`=NEW.`ID_ZASOB` and z.`TYPE` in('STANOWISKO','DZIAL','PODMIOT') limit 1)>0
  915. AND (select count(*) from `CRM_PRZYPADEK` przyp where przyp.`ID`=NEW.`ID_PRZYPADEK` and przyp.`FORM_TREAT` & 8 limit 1)>0
  916. THEN
  917. -- throw warning to update perms
  918. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  919. and `msg`='Update perms'
  920. and `uiTargetType`='default_db_table'
  921. and `uiTargetName`='CRM_PROCES'
  922. and `A_STATUS`='WAITING'
  923. ) = 0 THEN
  924. INSERT INTO `CRM_UI_MSGS` (`ID`
  925. , `app_className`, `msg`, `msgType`
  926. , `uiTargetType`, `uiTargetName`
  927. , `userTargetType`
  928. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  929. VALUES (NULL
  930. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  931. , 'default_db_table', 'CRM_PROCES'
  932. , 'everyone'
  933. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_INSERT')
  934. );
  935. END IF;
  936. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  937. END IF;
  938. END
  939. ";
  940. $sqlList['RemoveTrigger_AfterUpdateWskaznik'] = "DROP TRIGGER IF EXISTS `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE`";
  941. $sqlList['CreateTrigger_AfterUpdateWskaznik'] = "
  942. CREATE DEFINER=`root`@`localhost` TRIGGER `FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE` AFTER UPDATE ON `CRM_WSKAZNIK`
  943. FOR EACH ROW BEGIN
  944. -- only when old or new ID_PROCES exists in `CRM_PROCES_idx`
  945. -- only when old or new ID_ZASOB is group
  946. -- only when old or new ID_PRZYPADEK has perm 'X'
  947. IF (NEW.`ID_PROCES`!=OLD.`ID_PROCES`
  948. or NEW.`ID_ZASOB`!=OLD.`ID_ZASOB`
  949. or NEW.`ID_PRZYPADEK`!=OLD.`ID_PRZYPADEK`
  950. or (NEW.`A_STATUS`!=OLD.`A_STATUS`
  951. and ((NEW.`A_STATUS` in('WAITING','NORMAL') and OLD.`A_STATUS` not in('WAITING','NORMAL'))
  952. or (NEW.`A_STATUS` not in('WAITING','NORMAL') and OLD.`A_STATUS` in('WAITING','NORMAL'))
  953. )
  954. )
  955. )
  956. AND (NEW.`ID_PROCES`>0 or OLD.`ID_PROCES`>0)
  957. AND (NEW.`ID_ZASOB`>0 or OLD.`ID_ZASOB`>0)
  958. AND (NEW.`ID_PRZYPADEK`>0 or OLD.`ID_PRZYPADEK`>0)
  959. -- AND (select count(*) from `CRM_PROCES_idx` where `ID_PROCES` in(NEW.`ID_PROCES`,OLD.`ID_PROCES`) limit 1)>0
  960. 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
  961. 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
  962. THEN
  963. -- throw warning to update perms
  964. IF (select count(1) from `CRM_UI_MSGS` where `app_className`='FixCrmProcesInitIdx'
  965. and `msg`='Update perms'
  966. and `uiTargetType`='default_db_table'
  967. and `uiTargetName`='CRM_PROCES'
  968. and `A_STATUS`='WAITING'
  969. ) = 0 THEN
  970. INSERT INTO `CRM_UI_MSGS` (`ID`
  971. , `app_className`, `msg`, `msgType`
  972. , `uiTargetType`, `uiTargetName`
  973. , `userTargetType`
  974. , `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`)
  975. VALUES (NULL
  976. , 'FixCrmProcesInitIdx', 'Update perms', 'danger'
  977. , 'default_db_table', 'CRM_PROCES'
  978. , 'everyone'
  979. , NOW(), coalesce(NEW.A_RECORD_UPDATE_AUTHOR,'trigger:FixCrmProcesInitIdx_CRM_WSKAZNIK_AFTER_UPDATE')
  980. );
  981. END IF;
  982. -- UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Update perms` SET x=1;
  983. END IF;
  984. END
  985. ";
  986. $db = DB::getDB();
  987. if ($db->has_errors()) {
  988. throw new Exception("DB Errors: " . implode("\n<br>", $db->get_errors()));
  989. }
  990. foreach ($sqlList as $sqlName => $sql) {
  991. $res = $db->query($sql);
  992. if ($db->has_errors()) {
  993. throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
  994. }
  995. }
  996. }
  997. /*
  998. #1146 - Table '{DATABASE_NAME}.P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed' doesn't exist
  999. */
  1000. public function parseMessageFromStorage($msg) {
  1001. switch ($msg) {
  1002. case 'ERROR: Already executed': {
  1003. $msg = "Aktualizacja uprawnień została już uruchomiona przez inną osobę";
  1004. break;
  1005. }
  1006. case 'ERROR: Update perms': {
  1007. $msg = "Wymagana aktualizacja uprawnień";
  1008. break;
  1009. }
  1010. }
  1011. return $msg;
  1012. }
  1013. public function parseMessageFromMsgsSystem($msg) {
  1014. switch ($msg) {
  1015. case 'Update perms': {
  1016. $msg = "Wymagana aktualizacja uprawnień";
  1017. break;
  1018. }
  1019. }
  1020. return $msg;
  1021. }
  1022. public function runByMessageFromMsgsSystem($msg, &$execNotes) {
  1023. switch ($msg) {
  1024. case 'Update perms': {
  1025. $execNotes .= 'Wymagana aktualizacja uprawnień';
  1026. $this->_callProcedure();
  1027. $execNotes .= ' done';
  1028. break;
  1029. }
  1030. }
  1031. }
  1032. }