Sfoglia il codice sorgente

Acl fix procedure to update perms

Piotr Labudda 10 anni fa
parent
commit
b75947776f
1 ha cambiato i file con 221 aggiunte e 101 eliminazioni
  1. 221 101
      SE/se-lib/Route/FixCrmProcesInitIdx.php

+ 221 - 101
SE/se-lib/Route/FixCrmProcesInitIdx.php

@@ -218,19 +218,42 @@ SQL;
 		$sqlList = array();
 		$sqlList = array();
 //	SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
 //	SET @conf_last_exec_start_key = 'tbl_indexer_CRM_PROCES_last_exec_start';
 //	SET @conf_last_exec_end_key   = 'tbl_indexer_CRM_PROCES_last_exec_end';
 //	SET @conf_last_exec_end_key   = 'tbl_indexer_CRM_PROCES_last_exec_end';
+		$sqlList['0-prepare-fill_idx_INIT-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx__loop__fill_idx_INIT`";
+		$sqlList['0-prepare-fill_idx_INIT-create'] = <<<SQL
+CREATE PROCEDURE `update_proces_init_idx__loop__fill_idx_INIT`()
+BEGIN
+
+		SET @i = 0;
+		SET @loopLomit = 100;
+		SET @pinitCnt = 1;
+		WHILE @i < @loopLomit and @pinitCnt > 0 DO
+			update `CRM_PROCES_idx_TEMP` p
+				join `CRM_PROCES_idx_TEMP` pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
+				set p.`idx_PROCES_INIT_ID`=IF(p.`idx_PROCES_INIT_ID`>0, p.`idx_PROCES_INIT_ID`, pp.`idx_PROCES_INIT_ID`)
+					, p.`idx_MAIN_PROCES_INIT_ID`=pp.`idx_MAIN_PROCES_INIT_ID`
+				-- // TODO:?: update here `idx_MAIN_PROCES_INIT_ID`
+				where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0
+			;
+			SET @pinitCnt = ROW_COUNT();
+			SET @i = @i + 1;
+		END WHILE;
+END
+SQL;
 		$sqlList['0-prepare-while-1-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while1`";
 		$sqlList['0-prepare-while-1-rm'] = "DROP PROCEDURE if exists `update_proces_init_idx_rec__while1`";
 		$sqlList['0-prepare-while-1-create'] = <<<SQL
 		$sqlList['0-prepare-while-1-create'] = <<<SQL
 CREATE PROCEDURE `update_proces_init_idx_rec__while1`()
 CREATE PROCEDURE `update_proces_init_idx_rec__while1`()
 BEGIN
 BEGIN
 
 
-		update `CRM_PROCES_idx` as i set i.`idx_PROCES_INIT_ID`=IF(i.`TYPE`='PROCES_INIT', i.`ID_PROCES`, 0);
+		-- update `CRM_PROCES_idx_TEMP` as i set i.`idx_PROCES_INIT_ID`=IF(i.`TYPE`='PROCES_INIT', i.`ID_PROCES`, 0);
 		SET @i = 0;
 		SET @i = 0;
 		SET @loopLomit = 100;
 		SET @loopLomit = 100;
 		SET @pinitCnt = 1;
 		SET @pinitCnt = 1;
 		WHILE @i < @loopLomit and @pinitCnt > 0 DO
 		WHILE @i < @loopLomit and @pinitCnt > 0 DO
-			update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
-				set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
-				where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
+			update `CRM_PROCES_idx_TEMP` p
+				join `CRM_PROCES_idx_TEMP` pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
+				set p.`idx_MAIN_PROCES_INIT_ID`=pp.`idx_MAIN_PROCES_INIT_ID`
+				where p.`idx_MAIN_PROCES_INIT_ID`=0 and pp.`idx_MAIN_PROCES_INIT_ID`>0
+			;
 			SET @pinitCnt = ROW_COUNT();
 			SET @pinitCnt = ROW_COUNT();
 			SET @i = @i + 1;
 			SET @i = @i + 1;
 		END WHILE;
 		END WHILE;
@@ -245,11 +268,15 @@ BEGIN
 		SET @loopLomit = 100;
 		SET @loopLomit = 100;
 		SET @groupCnt = 1;
 		SET @groupCnt = 1;
 		WHILE @i < @loopLomit and @groupCnt > 0 DO
 		WHILE @i < @loopLomit and @groupCnt > 0 DO
-			update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
+			update `CRM_PROCES_idx_TEMP` as p
+				join `CRM_PROCES_idx_TEMP` as pp on(
+					pp.`ID_PROCES`=p.`PARENT_ID`
+					and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
+					and pp.`idx_PROCES_WITH_GROUPS_ID`>0
+				)
 				set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
 				set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
 				where p.`idx_PROCES_WITH_GROUPS_ID` is null
 				where p.`idx_PROCES_WITH_GROUPS_ID` is null
-					and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
-					and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
+			;
 			SET @groupCnt = ROW_COUNT();
 			SET @groupCnt = ROW_COUNT();
 			SET @i = @i + 1;
 			SET @i = @i + 1;
 		END WHILE;
 		END WHILE;
@@ -264,8 +291,8 @@ BEGIN
 		SET @loopLomit = 100;
 		SET @loopLomit = 100;
 		SET @groupCnt = 1;
 		SET @groupCnt = 1;
 		WHILE @i < @loopLomit and @groupCnt > 0 DO
 		WHILE @i < @loopLomit and @groupCnt > 0 DO
-			update `CRM_PROCES_idx` as p
-				join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`
+			update `CRM_PROCES_idx_TEMP` as p
+				join `CRM_PROCES_idx_TEMP` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`
 					and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
 					and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
 					and pp.`idx_PROCES_WITH_GROUPS_ID`>0
 					and pp.`idx_PROCES_WITH_GROUPS_ID`>0
 				)
 				)
@@ -278,26 +305,44 @@ BEGIN
 
 
 END
 END
 SQL;
 SQL;
-		$sqlList['1-set-start-time-in-config'] = <<<SQL
+		$sqlList['CONF.1--set-start-time-in-config'] = <<<SQL
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_start', NOW());
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_start', NOW());
 SQL;
 SQL;
-		$sqlList['2-truncate-table'] = <<<SQL
-		truncate table `CRM_PROCES_idx`;
-		-- delete from `CRM_PROCES_idx`;
+		$sqlList['I.1--truncate-table'] = <<<SQL
+		-- // TODO: mv to the procedure end, and add insert into `CRM_PROCES_idx` select * from `CRM_PROCES_idx_TEMP`;
+		-- truncate table `CRM_PROCES_idx`;
+		DROP TABLE IF EXISTS `CRM_PROCES_idx_TEMP`;
 SQL;
 SQL;
-		$sqlList['3-fill-CRM_PROCES_idx'] = <<<SQL
--- select 'insert into `CRM_PROCES_idx`...';
-		insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
-			select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
+		$sqlList['I.2--fill-CRM_PROCES_idx_TEMP'] = <<<SQL
+		-- Mysql BUG: "Can't reopen table" -- CREATE TEMPORARY TABLE `CRM_PROCES_idx_TEMP` (
+		-- You cannot refer to a TEMPORARY table more than once in the same query.
+			CREATE TABLE `CRM_PROCES_idx_TEMP` (
+				`ID_PROCES` int(11) NOT NULL
+				, `PARENT_ID` int(11) NOT NULL DEFAULT '0'
+				, `TYPE` varchar(32) NOT NULL DEFAULT ''
+				, `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
+				, `idx_MAIN_PROCES_INIT_ID` int(11) NULL DEFAULT '0'
+				, `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
+			--	, `idx_PATH` text NOT NULL
+				, KEY `ID_PROCES` (`ID_PROCES`)
+				, KEY `PARENT_ID` (`PARENT_ID`)
+				, KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
+				, KEY `idx_MAIN_PROCES_INIT_ID` (`idx_MAIN_PROCES_INIT_ID`)
+				, KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
+				, UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
+			)
+
+			select p.`ID` as `ID_PROCES`
+				, p.`TYPE` as `TYPE`
+				, p.`PARENT_ID` as `PARENT_ID`
+				, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_PROCES_INIT_ID`
+				, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_MAIN_PROCES_INIT_ID`
 			from `CRM_PROCES` p
 			from `CRM_PROCES` p
 			where p.`A_STATUS` in('NORMAL','WAITING')
 			where p.`A_STATUS` in('NORMAL','WAITING')
 		;
 		;
 SQL;
 SQL;
-		$sqlList['4-while-1'] = <<<SQL
-		call `update_proces_init_idx_rec__while1`();
-SQL;
-		$sqlList['5-before-while-2'] = <<<SQL
-		update `CRM_PROCES_idx` i
+		$sqlList['G.1--before-while-2-set-initial-proc_with_groups_id'] = <<<SQL
+		update `CRM_PROCES_idx_TEMP` i
 				join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
 				join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
 						and wsk.`A_STATUS` in('NORMAL', 'WAITING')
 						and wsk.`A_STATUS` in('NORMAL', 'WAITING')
 					)
 					)
@@ -310,42 +355,76 @@ SQL;
 					)
 					)
 			set
 			set
 				i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
 				i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
-			where i.`idx_PROCES_INIT_ID`>0;
+		-- TODO: main procedure (this rows was removed step before):
+			where i.`idx_PROCES_INIT_ID`>0
+		;
 SQL;
 SQL;
-		$sqlList['6-while-2'] = <<<SQL
+		$sqlList['G.2--while-2-loop-update-proc_with_groups_id-from-parent'] = <<<SQL
 		call `update_proces_init_idx_rec__while2`();
 		call `update_proces_init_idx_rec__while2`();
 SQL;
 SQL;
-		$sqlList['7-goto_and_return'] = <<<SQL
-		insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
-			select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
-				, pi.`idx_PROCES_WITH_GROUPS_ID`
+		$sqlList['P_INIT_ID.1--fill_idx_INIT'] = <<<SQL
+		call `update_proces_init_idx__loop__fill_idx_INIT`();
+SQL;
+		$sqlList['GOTO_AND_RET.1--from-7-fill-goto_and_return'] = <<<SQL
+		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`)
+			select g.`ID`
+				, 'GOTO_AND_RETURN' as `TYPE`
+				, p.`ID` as `PARENT_ID`
+				, g.`ID` as `idx_PROCES_INIT_ID`
+				, i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
+				, 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`
 			from `CRM_PROCES` p
 			from `CRM_PROCES` p
-				join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
+				join `CRM_PROCES_idx_TEMP` i on(i.`ID_PROCES`=p.`ID`)
 				join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
 				join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
 						and g.`TYPE`='PROCES_INIT'
 						and g.`TYPE`='PROCES_INIT'
 						and g.`A_STATUS` in('NORMAL','WAITING')
 						and g.`A_STATUS` in('NORMAL','WAITING')
 						and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
 						and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
 						and p.`IF_TRUE_GOTO`>0
 						and p.`IF_TRUE_GOTO`>0
 					)
 					)
+				join `CRM_PROCES_idx_TEMP` gi on(gi.`ID_PROCES`=g.`ID`)
 			where p.`A_STATUS` in('NORMAL','WAITING')
 			where p.`A_STATUS` in('NORMAL','WAITING')
-				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`)
 		;
 		;
---		SET @groupCnt = ROW_COUNT();
 
 
 SQL;
 SQL;
-		$sqlList['8-update-idx_PROCES_WITH_GROUPS_ID-zero-where-null'] = <<<SQL
-		update `CRM_PROCES_idx`
+		$sqlList['GOTO_AND_RET.2--fill-childrens-of-goto_and_return'] = <<<SQL
+		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`)
+			select ic.`ID_PROCES`
+				, 'GOTO_AND_RETURN_CHILD' as `TYPE`
+				, ic.`PARENT_ID` as `PARENT_ID`
+				, ic.`idx_PROCES_INIT_ID` as `idx_PROCES_INIT_ID`
+				, i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
+				, 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`
+			from `CRM_PROCES_idx_TEMP` i
+				join `CRM_PROCES_idx_TEMP` ic on(
+					ic.`idx_PROCES_INIT_ID`=i.`ID_PROCES`
+					and ic.`ID_PROCES`!=i.`ID_PROCES`
+				)
+			where i.`TYPE`='GOTO_AND_RETURN'
+		;
+
+SQL;
+		$sqlList__TODO_IS_NEEDED__['4.2-NEW-while-1'] = <<<SQL
+		call `update_proces_init_idx_rec__while1`();
+SQL;
+		// TODO: mv here loop insert goto_and_return
+		// TODO: add idx_MAIN_PROCES_INIT_ID - which proces has goto_end_return for this step
+		$sqlList__TODO_SEE_IDX_2__['CLEANUP.1--remove-not-needed-rows'] = <<<SQL
+		-- // TODO: add to main procedure
+		delete from `CRM_PROCES_idx_TEMP` where `idx_PROCES_INIT_ID`=0;
+SQL;
+		$sqlList__TODO_SEE_IDX_2__['CLEANUP.2--update-idx_PROCES_WITH_GROUPS_ID-zero-where-null'] = <<<SQL
+		update `CRM_PROCES_idx_TEMP`
 			set `idx_PROCES_WITH_GROUPS_ID`=0
 			set `idx_PROCES_WITH_GROUPS_ID`=0
 			where `idx_PROCES_WITH_GROUPS_ID` is null
 			where `idx_PROCES_WITH_GROUPS_ID` is null
 				and `TYPE`='PROCES_INIT'
 				and `TYPE`='PROCES_INIT'
 		;
 		;
 
 
 SQL;
 SQL;
-		$sqlList['9-fix-goto_and_return'] = <<<SQL
-		insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
+		$sqlList__TODO_IS_NEEDED__['9-fix-goto_and_return'] = <<<SQL
+		insert ignore into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
 			select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
 			select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
-			from `CRM_PROCES_idx` i
-				join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
+			from `CRM_PROCES_idx_TEMP` i
+				join `CRM_PROCES_idx_TEMP` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
 			where i.`idx_PROCES_WITH_GROUPS_ID` is null
 			where i.`idx_PROCES_WITH_GROUPS_ID` is null
 				and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
 				and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
 				and pi.`idx_PROCES_WITH_GROUPS_ID`>0
 				and pi.`idx_PROCES_WITH_GROUPS_ID`>0
@@ -353,22 +432,28 @@ SQL;
 		;
 		;
 
 
 SQL;
 SQL;
-		$sqlList['10-delete-where-!idx_PROCES_WITH_GROUPS_ID'] = <<<SQL
--- select 'delete idx_PROCES_WITH_GROUPS_ID...';
-		delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
+		$sqlList__TODO_IS_NEEDED__['10-delete-where-!idx_PROCES_WITH_GROUPS_ID'] = <<<SQL
+		delete from `CRM_PROCES_idx_TEMP` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
 SQL;
 SQL;
-		$sqlList['11-update-CRM_PROCES-idx_PROCES_INIT_ID'] = <<<SQL
--- select 'update `CRM_PROCES`...';
+		$sqlList['IDX.1--clear-CRM_PROCES_idx'] = <<<SQL
+		truncate table `CRM_PROCES_idx`;
+SQL;
+		$sqlList['IDX.2--update-CRM_PROCES_idx-from-temp'] = <<<SQL
+		insert into `CRM_PROCES_idx`
+			select i.* from `CRM_PROCES_idx_TEMP` i
+			where i.`idx_PROCES_INIT_ID`>0 and i.`idx_PROCES_WITH_GROUPS_ID` is not null
+		;
+SQL;
+		$sqlList__TODO_OFF_time_0_1__['P.1--update-CRM_PROCES-idx_PROCES_INIT_ID'] = <<<SQL
 		update `CRM_PROCES` p
 		update `CRM_PROCES` p
 			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)
 			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)
 		;
 		;
 
 
 SQL;
 SQL;
-		$sqlList['11-clear-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
--- select 'update `CRM_PROCES_idx_GROUP_to_PROCES`...';
+		$sqlList['GP.1--clear-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
 		truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
 		truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
 SQL;
 SQL;
-		$sqlList['11-fill-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
+		$sqlList['GP.2--fill-CRM_PROCES_idx_GROUP_to_PROCES'] = <<<SQL
 		insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
 		insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
 			select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
 			select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
 			from `CRM_PROCES_idx` i
 			from `CRM_PROCES_idx` i
@@ -386,7 +471,7 @@ SQL;
 		;
 		;
 
 
 SQL;
 SQL;
-		$sqlList['12-set-end-time-in-config'] = <<<SQL
+		$sqlList['CONF.2--set-end-time-in-config'] = <<<SQL
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values ('tbl_indexer_CRM_PROCES_last_exec_end', NOW());
 SQL;
 SQL;
 		$db = DB::getDB();
 		$db = DB::getDB();
@@ -397,12 +482,18 @@ SQL;
 		$dbgExecTime = new DebugExecutionTime();
 		$dbgExecTime = new DebugExecutionTime();
 		if ($DBG_TIME) $dbgExecTime->activate();
 		if ($DBG_TIME) $dbgExecTime->activate();
 		$dbgExecTime->log('start');
 		$dbgExecTime->log('start');
+		$sqlExecuteLimit = V::get('DBG_LIMIT', 0, $_GET);
+		$sqlExecuteCounter = 0;
 		foreach ($sqlList as $sqlName => $sql) {
 		foreach ($sqlList as $sqlName => $sql) {
+			$sqlExecuteCounter++;
+			echo'<p>['.$sqlExecuteCounter.'] Executing sql "'.$sqlName.'" ... </p>';
 			$res = $db->query($sql);
 			$res = $db->query($sql);
 			if ($db->has_errors()) {
 			if ($db->has_errors()) {
 				throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
 				throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n<br>", $db->get_errors()));
 			}
 			}
 			if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
 			if($DBG_TIME) $dbgExecTime->log("execute sql {$sqlName}");
+			echo'<p>['.$sqlExecuteCounter.'] DONE sql "'.$sqlName.'"</p>';
+			if ($sqlExecuteLimit > 0 && $sqlExecuteCounter >= $sqlExecuteLimit) break;
 		}
 		}
 		if($DBG_TIME) $dbgExecTime->printDebug();
 		if($DBG_TIME) $dbgExecTime->printDebug();
 	}
 	}
@@ -421,13 +512,15 @@ SQL;
 				, `PARENT_ID` int(11) NOT NULL DEFAULT '0'
 				, `PARENT_ID` int(11) NOT NULL DEFAULT '0'
 				, `TYPE` varchar(32) NOT NULL DEFAULT ''
 				, `TYPE` varchar(32) NOT NULL DEFAULT ''
 				, `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
 				, `idx_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
+				, `idx_MAIN_PROCES_INIT_ID` int(11) NOT NULL DEFAULT '0'
 				, `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
 				, `idx_PROCES_WITH_GROUPS_ID` int(11) NULL DEFAULT NULL
 			--	, `idx_PATH` text NOT NULL
 			--	, `idx_PATH` text NOT NULL
 				, KEY `ID_PROCES` (`ID_PROCES`)
 				, KEY `ID_PROCES` (`ID_PROCES`)
 				, KEY `PARENT_ID` (`PARENT_ID`)
 				, KEY `PARENT_ID` (`PARENT_ID`)
 				, KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
 				, KEY `idx_PROCES_INIT_ID` (`idx_PROCES_INIT_ID`)
+				, KEY `idx_MAIN_PROCES_INIT_ID` (`idx_MAIN_PROCES_INIT_ID`)
 				, KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
 				, KEY `idx_PROCES_WITH_GROUPS_ID` (`idx_PROCES_WITH_GROUPS_ID`)
-				, UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
+			--	, UNIQUE KEY `uniq__idx_PROCES_WITH_GROUPS_ID` (`ID_PROCES`,`idx_PROCES_WITH_GROUPS_ID`)
 			) ENGINE=MyISAM DEFAULT CHARSET=latin2;
 			) ENGINE=MyISAM DEFAULT CHARSET=latin2;
 SQL;
 SQL;
 		$sqlList['RemoveOldTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
 		$sqlList['RemoveOldTableGroupToInit'] = "DROP TABLE IF EXISTS `CRM_PROCES_idx_GROUPS_to_INIT`";
@@ -638,36 +731,25 @@ BEGIN
 		UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed` SET x=1;
 		UPDATE `P5-MSG:Route_FixCrmProcesInitIdx:ERROR: Already executed` SET x=1;
 	ELSE BEGIN
 	ELSE BEGIN
 
 
+		-- CONF.1--set-start-time-in-config
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, NOW()), (@conf_last_exec_start_key, NOW());
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, NOW()), (@conf_last_exec_start_key, NOW());
 
 
--- select sleep(2); -- // DBG
-
--- select 'truncate->delete...';
-		truncate table `CRM_PROCES_idx`;
-		-- delete from `CRM_PROCES_idx`;
+		-- I.1--truncate-table
+		truncate table `CRM_PROCES_idx_TEMP`;
 
 
--- select 'insert into `CRM_PROCES_idx`...';
-		insert into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`)
-			select p.`ID`, p.`TYPE`, p.`PARENT_ID`, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as idx_PROCES_INIT_ID
+		-- I.2--fill-CRM_PROCES_idx_TEMP
+		insert into `CRM_PROCES_idx_TEMP` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`)
+			select p.`ID` as `ID_PROCES`
+				, p.`TYPE` as `TYPE`
+				, p.`PARENT_ID` as `PARENT_ID`
+				, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_PROCES_INIT_ID`
+				, IF(p.`TYPE`='PROCES_INIT', p.`ID`, 0) as `idx_MAIN_PROCES_INIT_ID`
 			from `CRM_PROCES` p
 			from `CRM_PROCES` p
 			where p.`A_STATUS` in('NORMAL','WAITING')
 			where p.`A_STATUS` in('NORMAL','WAITING')
 		;
 		;
 
 
--- select 'while 1...';
-		update `CRM_PROCES_idx` as p set p.`idx_PROCES_INIT_ID`=IF(p.`TYPE`='PROCES_INIT', p.`ID_PROCES`, 0);
-		SET @i = 0;
-		SET @loopLomit = 100;
-		SET @pinitCnt = 1;
-		WHILE @i < @loopLomit and @pinitCnt > 0 DO
-			update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
-				set p.`idx_PROCES_INIT_ID`=pp.`idx_PROCES_INIT_ID`
-				where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0;
-			SET @pinitCnt = ROW_COUNT();
-			SET @i = @i + 1;
-		END WHILE;
-
--- select 'while 2... search stanowiska';
-		update `CRM_PROCES_idx` i
+		-- G.1--before-while-2-set-initial-proc_with_groups_id
+		update `CRM_PROCES_idx_TEMP` i
 				join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
 				join `CRM_WSKAZNIK` as wsk on(wsk.`ID_PROCES`=i.`ID_PROCES`
 						and wsk.`A_STATUS` in('NORMAL', 'WAITING')
 						and wsk.`A_STATUS` in('NORMAL', 'WAITING')
 					)
 					)
@@ -680,63 +762,99 @@ BEGIN
 					)
 					)
 			set
 			set
 				i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
 				i.`idx_PROCES_WITH_GROUPS_ID`=i.`ID_PROCES`
-			where i.`idx_PROCES_INIT_ID`>0;
+			where i.`idx_PROCES_INIT_ID`>0
+		;
+
+		-- G.2--while-2-loop-update-proc_with_groups_id-from-parent
 		SET @i = 0;
 		SET @i = 0;
 		SET @loopLomit = 100;
 		SET @loopLomit = 100;
 		SET @groupCnt = 1;
 		SET @groupCnt = 1;
 		WHILE @i < @loopLomit and @groupCnt > 0 DO
 		WHILE @i < @loopLomit and @groupCnt > 0 DO
-			update `CRM_PROCES_idx` as p join `CRM_PROCES_idx` as pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
+			update `CRM_PROCES_idx_TEMP` as p
+				join `CRM_PROCES_idx_TEMP` as pp on(
+					pp.`ID_PROCES`=p.`PARENT_ID`
+					and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
+					and pp.`idx_PROCES_WITH_GROUPS_ID`>0
+				)
 				set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
 				set p.`idx_PROCES_WITH_GROUPS_ID`=pp.`idx_PROCES_WITH_GROUPS_ID`
 				where p.`idx_PROCES_WITH_GROUPS_ID` is null
 				where p.`idx_PROCES_WITH_GROUPS_ID` is null
-					and pp.`idx_PROCES_WITH_GROUPS_ID` is not null
-					and pp.`idx_PROCES_WITH_GROUPS_ID`>0;
+			;
 			SET @groupCnt = ROW_COUNT();
 			SET @groupCnt = ROW_COUNT();
 			SET @i = @i + 1;
 			SET @i = @i + 1;
 		END WHILE;
 		END WHILE;
 
 
--- select 'GOTO_AND_RETURN...';
-		insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
-			select g.`ID`, 'GOTO_AND_RETURN' as `TYPE`, p.`ID` as PARENT_ID, g.`ID` as idx_PROCES_INIT_ID
-				, 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`
+		-- 'P_INIT_ID.1--fill_idx_INIT
+		SET @i = 0;
+		SET @loopLomit = 100;
+		SET @pinitCnt = 1;
+		WHILE @i < @loopLomit and @pinitCnt > 0 DO
+			update `CRM_PROCES_idx_TEMP` p
+				join `CRM_PROCES_idx_TEMP` pp on(pp.`ID_PROCES`=p.`PARENT_ID`)
+				set p.`idx_PROCES_INIT_ID`=IF(p.`idx_PROCES_INIT_ID`>0, p.`idx_PROCES_INIT_ID`, pp.`idx_PROCES_INIT_ID`)
+					, p.`idx_MAIN_PROCES_INIT_ID`=pp.`idx_MAIN_PROCES_INIT_ID`
+				-- // TODO:?: update here `idx_MAIN_PROCES_INIT_ID`
+				where p.`idx_PROCES_INIT_ID`=0 and pp.`idx_PROCES_INIT_ID`>0
+			;
+			SET @pinitCnt = ROW_COUNT();
+			SET @i = @i + 1;
+		END WHILE;
+
+		-- GOTO_AND_RET.1--from-7-fill-goto_and_return
+		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`)
+			select g.`ID`
+				, 'GOTO_AND_RETURN' as `TYPE`
+				, p.`ID` as `PARENT_ID`
+				, g.`ID` as `idx_PROCES_INIT_ID`
+				, i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
+				, 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`
 			from `CRM_PROCES` p
 			from `CRM_PROCES` p
-				join `CRM_PROCES_idx` pi on(pi.`ID_PROCES`=p.`ID`)
+				join `CRM_PROCES_idx_TEMP` i on(i.`ID_PROCES`=p.`ID`)
 				join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
 				join `CRM_PROCES` g on(g.`ID`=p.`IF_TRUE_GOTO`
 						and g.`TYPE`='PROCES_INIT'
 						and g.`TYPE`='PROCES_INIT'
 						and g.`A_STATUS` in('NORMAL','WAITING')
 						and g.`A_STATUS` in('NORMAL','WAITING')
 						and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
 						and p.`IF_TRUE_GOTO_FLAG`='GOTO_AND_RETURN'
 						and p.`IF_TRUE_GOTO`>0
 						and p.`IF_TRUE_GOTO`>0
 					)
 					)
-				join `CRM_PROCES_idx` gi on(gi.`ID_PROCES`=g.`ID`)
+				join `CRM_PROCES_idx_TEMP` gi on(gi.`ID_PROCES`=g.`ID`)
 			where p.`A_STATUS` in('NORMAL','WAITING')
 			where p.`A_STATUS` in('NORMAL','WAITING')
---				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`)
 		;
 		;
 
 
-		update `CRM_PROCES_idx`
-			set `idx_PROCES_WITH_GROUPS_ID`=0
-			where `idx_PROCES_WITH_GROUPS_ID` is null
-				and `TYPE`='PROCES_INIT'
+		-- GOTO_AND_RET.2--fill-childrens-of-goto_and_return
+		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`)
+			select ic.`ID_PROCES`
+				, 'GOTO_AND_RETURN_CHILD' as `TYPE`
+				, ic.`PARENT_ID` as `PARENT_ID`
+				, ic.`idx_PROCES_INIT_ID` as `idx_PROCES_INIT_ID`
+				, i.`idx_MAIN_PROCES_INIT_ID` as `idx_MAIN_PROCES_INIT_ID`
+				, 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`
+			from `CRM_PROCES_idx_TEMP` i
+				join `CRM_PROCES_idx_TEMP` ic on(
+					ic.`idx_PROCES_INIT_ID`=i.`ID_PROCES`
+					and ic.`ID_PROCES`!=i.`ID_PROCES`
+				)
+			where i.`TYPE`='GOTO_AND_RETURN'
 		;
 		;
 
 
-		insert ignore into `CRM_PROCES_idx` (`ID_PROCES`,`TYPE`,`PARENT_ID`,`idx_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
-			select i.`ID_PROCES`, 'GOTO_AND_RETURN' as `TYPE`, i.`PARENT_ID`, i.`idx_PROCES_INIT_ID`, pi.`idx_PROCES_WITH_GROUPS_ID`
-			from `CRM_PROCES_idx` i
-				join `CRM_PROCES_idx` pi on(pi.`idx_PROCES_INIT_ID`=i.`idx_PROCES_INIT_ID`)
-			where i.`idx_PROCES_WITH_GROUPS_ID` is null
-				and pi.`idx_PROCES_WITH_GROUPS_ID` is not null
-				and pi.`idx_PROCES_WITH_GROUPS_ID`>0
-				and i.`TYPE`!='GOTO_AND_RETURN'
+		-- IDX.1--clear-CRM_PROCES_idx
+		truncate table `CRM_PROCES_idx`;
+
+		-- IDX.2--update-CRM_PROCES_idx-from-temp
+		insert into `CRM_PROCES_idx` (`ID_PROCES`,`PARENT_ID`,`TYPE`,`idx_PROCES_INIT_ID`,`idx_MAIN_PROCES_INIT_ID`,`idx_PROCES_WITH_GROUPS_ID`)
+			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`
+			from `CRM_PROCES_idx_TEMP` i
+			where i.`idx_PROCES_INIT_ID`>0 and i.`idx_PROCES_WITH_GROUPS_ID` is not null
 		;
 		;
 
 
--- select 'delete idx_PROCES_WITH_GROUPS_ID...';
-		delete from `CRM_PROCES_idx` where `idx_PROCES_WITH_GROUPS_ID` is null or `idx_PROCES_WITH_GROUPS_ID`=0;
 
 
--- select 'update `CRM_PROCES`...';
-		update `CRM_PROCES` p
-			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)
-		;
+		-- TODO OFF: time ~0.1 P.1--update-CRM_PROCES-idx_PROCES_INIT_ID
+		-- update `CRM_PROCES` p
+		-- 	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)
+		-- ;
 
 
--- select 'update `CRM_PROCES_idx_GROUP_to_PROCES`...';
+		-- GP.1--clear-CRM_PROCES_idx_GROUP_to_PROCES
 		truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
 		truncate table `CRM_PROCES_idx_GROUP_to_PROCES`;
+
+		-- GP.2--fill-CRM_PROCES_idx_GROUP_to_PROCES
 		insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
 		insert ignore into `CRM_PROCES_idx_GROUP_to_PROCES` (`ID_PROCES`,`ID_GROUP`)
 			select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
 			select i.`ID_PROCES` as ID_PROCES, z.`ID` as ID_GROUP
 			from `CRM_PROCES_idx` i
 			from `CRM_PROCES_idx` i
@@ -753,6 +871,7 @@ BEGIN
 		--	where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
 		--	where i.`TYPE` in('PROCES_INIT', 'GOTO_AND_RETURN')
 		;
 		;
 
 
+		-- CONF.2--set-end-time-in-config
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, ''), (@conf_last_exec_end_key, NOW());
 		replace into `CRM_CONFIG` (`conf_key`, `conf_val`) values (@conf_last_exec_lock_key, ''), (@conf_last_exec_end_key, NOW());
 
 
 		-- clear msg 'Update perms' from Msgs system
 		-- clear msg 'Update perms' from Msgs system
@@ -765,7 +884,8 @@ BEGIN
 				and `app_className`='FixCrmProcesInitIdx'
 				and `app_className`='FixCrmProcesInitIdx'
 				and `msg`='Update perms'
 				and `msg`='Update perms'
 				and `uiTargetType`='default_db_table'
 				and `uiTargetType`='default_db_table'
-				and `uiTargetName`='CRM_PROCES';
+				and `uiTargetName`='CRM_PROCES'
+		;
 
 
 	END ; END IF ;
 	END ; END IF ;
 END ;
 END ;