 SET NAMES utf8;

DELIMITER $$

/* ************************************************************************************************************************************************************************
	Zbieranie informacji z `_user_accounts`
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `_user_accounts_inf`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_user_accounts_inf`(
	IN _MODE VARCHAR(150),
	IN _UserGUID VARCHAR(38),
	IN _PARAM_A VARCHAR(200),
	IN _Params MEDIUMTEXT
)
/*
	CALL _user_accounts_inf('INIT', 'UserGUID', '', @Params); 
*/
S_user_accounts_inf: BEGIN
	IF _MODE IN ('CLEAR') THEN
		DROP TEMPORARY TABLE IF EXISTS `t_ua_inf`;
		DROP TEMPORARY TABLE IF EXISTS `t_ua_inf_msg`;
		DROP TEMPORARY TABLE IF EXISTS `t_Sessions_ACTIVE`;
	END IF;
	
	IF _MODE IN ('INIT', 'END') THEN
									-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'Init', '', '', '');
									-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'Init.Create table', '', '', '');
		DROP TEMPORARY TABLE IF EXISTS `t_ua_inf`;
		CREATE TEMPORARY TABLE `t_ua_inf` (
			IN_Mode VARCHAR(250),
			UserGUID VARCHAR(250),	-- User
			Oper_Mode VARCHAR(250),	-- dawniej Actv_Mode
			Oper_Status VARCHAR(50),	-- dawniej Actv_Status
			Oper_Status_Msg MEDIUMTEXT,	-- dawniej Actv_Status_Msg
			Session_GUID VARCHAR(38) NOT NULL DEFAULT '',
			IN_ID VARCHAR(150),	-- dawniej Actv_IN_ID
			IN_EMail VARCHAR(150),	-- dawniej Actv_IN_EMail
			IN_Token VARCHAR(50),	-- dawniej Token
			IN_Datas VARCHAR(50),	-- dawniej Datas
			IN_Datas_Old VARCHAR(50),	-- dawniej Datas_Old
			IN_Access_Module VARCHAR(38),	-- dawniej Access_Module

			IN_Session_GUID VARCHAR(38) NOT NULL DEFAULT '',
			In_USER_GUID_Hash VARCHAR(250) DEFAULT NULL,
			In_LOGIN_Hash VARCHAR(250) DEFAULT NULL,
			In_Datas_Hash VARCHAR(250) DEFAULT NULL,
			In_DEV_ID_Hash VARCHAR(250) DEFAULT NULL,
			In_APP_ID_Hash VARCHAR(250) DEFAULT NULL,
			In_APP_VER VARCHAR(38) NULL COMMENT 'Wersja aplikacji',
			In_APP_verYMDN VARCHAR(38) NULL COMMENT 'Wersja aplikacji z EXE YYYY.MM.DD.numer',
			In_APP_NAME VARCHAR(100) NULL COMMENT 'Nazwa aplikacji', -- nie konieczna tu ale czas wyj. potrzebna dla staaaarych aplikacji
			In_APP_ACCESS INTEGER DEFAULT 1 COMMENT '1 - dana aplikacja spr. dostep do modułów, 0 - nie',
			In_SesjaZlecajaca_Hash VARCHAR(250) DEFAULT NULL,
			
			Status_N VARCHAR(250),	-- dawniej Account_Status_N
			Status VARCHAR(250),	-- dawniej Account_Status
			Status_N_Warn VARCHAR(250), -- dawniej Account_Status_Ext
			Msg MEDIUMTEXT,	-- dawniej Account_Status_Msg
			Msg_Warn MEDIUMTEXT,	-- dawniej Account_Status_Msg_Ext
			Msg_Log MEDIUMTEXT,	-- dawniej Account_Status_Msg_Ext
			-- `Account_Status_Msg` MEDIUMTEXT,
			-- `Account_Status_Msg_Ext` MEDIUMTEXT,
			-- `Ad_mail` VARCHAR(200) DEFAULT NULL, 
			-- `Last_Change_Pswd` DATETIME,
			actual_try_attempt INTEGER,	-- do badania czy nie przekroczona ilości prób
			User_Last_Day_to_Change_Pswd DATE DEFAULT '2150-01-01',
			User_Last_Day_Auto_Temp_Pswd DATE DEFAULT '2150-01-01',
			User_Auto_Pswd VARCHAR(50) DEFAULT FALSE,	-- dla <..Auto.Pswd> i <..Auto.TmpPswd>
			
			When_Invslid_Attempt_Msg MEDIUMTEXT, -- Msg dla ewnt. nieudanego logowania z aktualną próbą (msg na zaś w razie err
			Log_Czynnosc INTEGER,
			
			SALT VARCHAR(100) NOT NULL DEFAULT '',
			PEPPER VARCHAR(100) NOT NULL DEFAULT '',
			
			APP_ID VARCHAR(250) NULL COMMENT 'ID aplikacji <- z In_APP_ID_Hash - a zarazem głowna grupa dostępowa',
			APP_ID_GRP_Dost_Name VARCHAR(250) NULL COMMENT 'ID aplikacji <- z In_APP_ID_Hash',
			DEV_ID VARCHAR(250) NULL COMMENT 'ID urzadzenia/Msaddress etc - nie haszowy',
			SesjaZlecajaca VARCHAR(38) DEFAULT NULL,
		--	dla oczekiwania na nast. logowanie
			Wait_for_Log_Second INTEGER,	-- ile minut należy poczekac do logowania przy ua.ExtFlags LIKE '%<err_logon_count.temp>%',
			Owner VARCHAR(250) DEFAULT NULL,
			User_Is_jmam INTEGER DEFAULT 0,	-- User jest jmam-em
			Check_Modules INTEGER DEFAULT 1 COMMENT 'zmienna wyliczana na podst. User_Is_jmam, In_APP_ACCESS, itp: 1 - dana aplikacja spr. dostep do modułów, 0 - nie',
			PRIMARY KEY (`UserGUID`),
			KEY `IN_Mode`(`IN_Mode`),
			KEY `UserGUID`(`UserGUID`)
		) ENGINE=MYISAM 
		;
		
		DROP TEMPORARY TABLE IF EXISTS `t_ua_inf_msg`;
		CREATE TEMPORARY TABLE `t_ua_inf_msg` (
			`S_Status` VARCHAR(250),	-- np. 'ERR.account.inactive'
			`S_type` VARCHAR(50),	-- ERROR/WARNING
			`S_LP` INTEGER,
			`S_Yes` BOOLEAN DEFAULT NULL,
			`S_Msg` MEDIUMTEXT,
			PRIMARY KEY (`S_Status`, `S_type`)
		) ENGINE=MYISAM 
		;
									-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'Init.Create table', '', '', '');
									-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'Init.Insert into t_ua_inf_msg', '', '', '');
		TRUNCATE `t_ua_inf_msg`;
		INSERT IGNORE INTO `t_ua_inf_msg`
		(S_Status, S_type, S_LP, S_Msg)
		SELECT
			SUBSTRING_INDEX(REPLACE(r.ID, 'account_spec_msg.', ''), ';', 1) AS S_Status,
			IF(r.ID LIKE 'account_spec_msg.ERR.%', 
				'ERROR', 
				IF(r.ID LIKE 'account_spec_msg.WARN.%', 
					'WARNING', 
					'LOG'
				)
			) AS S_type,
			SUBSTRING_INDEX(r.ID, ';', -1) AS S_LP,
			r.T AS S_Msg
		FROM `_res_strings` r 
		WHERE 
			r.ID LIKE 'account_spec_msg.%'
		ORDER BY S_type, (1*S_LP)
		;
									-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'Init.Insert into t_ua_inf_msg', '', '', '');
		SET
			@.auth.Max_User_Err_logon_count = 3, 	-- dawne @_MAX_USER_err_logon_count
			@.auth.Wait.Err_logon_count = 5,		-- w min. czas odczekania na ponowne logowanie
			@.auth.EmptyDatas = 'd41d8cd98f00b204e9800998ecf8427e'	 -- dawne @_EMPTYDatas
		;
		SET
			@.Fun.Get_SFVFT.Param_A = 'Dostęp do konta #Text##Delete2##Date#',
			@.Fun.Get_SFVFT.Param_B = 'nastąpi w ',
			@.Fun.Get_SFVFT.Param_C = 'wygasł w '
		;
		
									-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'Init', '', '', '');
	END IF;
	
	IF _MODE LIKE 'INSERT.%' THEN
	/*
		_MODE składa się z 2 cz. MODE.IN_MODE  np.
		t_ua_inf.INSERT.accounts.2.0.sent.aktywacja
	*/	
									-- CALL _sys_watch_time_Tools('clear.1.Log', 'tuai.INSERT', 'INSERT.AUTH', '', '', '');
									-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT', '', '', '');
		DO _Birth_System();
									-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.Init', '', '', '');
		CALL _user_accounts_inf('INIT', '', '', '');
									-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.Init', '', '', '');
									-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.1', '', '', '');
		SET 
			@._ModeParam = '',
			@.Params = _Params
		;
		SET
			@.ua.IN_ID = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_ID', ''), ''),
			@.ua.IN_EMail = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_EMail', ''), ''),
			@.ua.IN_Token = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_Token', ''), ''),
			@.ua.IN_Datas = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_Datas', ''), ''),
			@.ua.IN_Datas_Old = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_Datas_Old', ''), ''),
			@.ua.IN_Access_Module = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_Access_Module', ''), ''),
			@.ua.X = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'X', ''), '')
		;
		
							SET @.bylem = CONCAT_WS('\n', @.bylem, 'INSERT IGNORE INTO `t_ua_inf`');
		INSERT IGNORE INTO `t_ua_inf`
		SET
			IN_Mode = REPLACE(_MODE, 'INSERT.', ''),
			UserGUID = NULLIF(_UserGUID, ''),
			Status = NULL,
			IN_ID = @.ua.IN_ID,
			IN_EMail = @.ua.IN_EMail,
			IN_Token = @.ua.IN_Token,
			IN_Datas = @.ua.IN_Datas,
			IN_Datas_Old = @.ua.IN_Datas_Old,
			IN_Access_Module = @.ua.IN_Access_Module,
			Oper_Status = (@.tuai.Oper_Status := 'OK')
		;
							SET @.bylem = CONCAT_WS('\n', @.bylem, 'UPDATE `t_ua_inf`');
		UPDATE `t_ua_inf` tuai
		SET
			tuai.Oper_Mode = (@.tuai.Oper_Mode :=
				CASE
			--	nowe od VIII 2024
			--	dla zgodności ...Token jak dawniej
				WHEN tuai.IN_Mode LIKE '%sent.aktywacja.Token%' THEN '<SetUp.New>'	--	tak jak w '%sent.aktywacja%'
				WHEN tuai.IN_Mode LIKE '%sent.zapomnialem.Token%' THEN '<SetUp.Reset>'	--	tak jak w '%sent.zapomnialem%'
			--	nowe oparte na autom. generow. hasła i wysyłce hasła bez linku
				WHEN tuai.IN_Mode LIKE '%sent.aktywacja.Auto.Pswd%' THEN '<Sent.aktywacja.Auto.Pswd>'	
				WHEN tuai.IN_Mode LIKE '%sent.aktywacja.Auto.TmpPswd%' THEN '<Sent.aktywacja.Auto.TmpPswd>'	
				WHEN tuai.IN_Mode LIKE '%sent.zapomnialem.Auto.Pswd%' THEN '<Sent.zapomnialem.Auto.Pswd>'	
				WHEN tuai.IN_Mode LIKE '%sent.zapomnialem.Auto.TmpPswd%' THEN '<Sent.zapomnialem.Auto.TmpPswd>'	
					--	WYWAL sent.2024.xxx
						WHEN tuai.IN_Mode LIKE '%sent.2024.aktywacja%' THEN '<SetUp.PSWD.Init>'
						WHEN tuai.IN_Mode LIKE '%sent.2024.zapomnialem%' THEN '<SetUp.PSWD.Reset>'
			--	sent.xxx	
				WHEN tuai.IN_Mode LIKE '%sent.aktywacja%' THEN '<SetUp.New>'
				WHEN tuai.IN_Mode LIKE '%sent.zapomnialem%' THEN '<SetUp.Reset>'
			--	confirm.xxx	
				WHEN tuai.IN_Mode LIKE '%confirm%passwd.SetUp.New%' THEN '<confirm.SetUp.New>'
				WHEN tuai.IN_Mode LIKE '%confirm%passwd.SetUp.Reset%' THEN '<confirm.SetUp.Reset>'
				WHEN tuai.IN_Mode LIKE '%confirm%passwd.SetUp.Change%' THEN '<Change>'
			--	Add Module	
				WHEN tuai.IN_Mode LIKE '%accounts.%.Access_Module%' THEN 
					IF(tuai.IN_Mode LIKE '%add%',
						'<Access_Module.ADD>',
						'<Access_Module.REMOVE>'
					)
			--	Logowania autoryzacje	
				WHEN tuai.IN_Mode LIKE 'LOG%' THEN '<LOG>'
				WHEN tuai.IN_Mode LIKE 'AUTH%' THEN '<AUTH>'
				-- WHEN tuai.IN_Mode LIKE '%ADD.BIO:%' THEN '<AUTH>'
				ELSE
					tuai.Oper_Mode
				END
			),
			/*
			tuai.Oper_Status = (@.tuai.Oper_Status := 
				IF(tuai.IN_Mode LIKE '%sent.zapomnialem%' AND NOT @session.globals.user_accounts.PrzypomnijHaslo.Acitve, 
					'ERR.DISABLED.Zapomnialem', 
					tuai.Oper_Status
				)
			),
			*/
			tuai.Log_Czynnosc = 
				CASE
				WHEN @.tuai.Oper_Mode = '<Sent.aktywacja.Auto.Pswd>' THEN 402	
				WHEN @.tuai.Oper_Mode = '<Sent.aktywacja.Auto.TmpPswd>' THEN 402	
				WHEN @.tuai.Oper_Mode = '<Sent.zapomnialem.Auto.Pswd>' THEN 404
				WHEN @.tuai.Oper_Mode = '<Sent.zapomnialem.Auto.TmpPswd>' THEN 404
				--	WYWAL sent.2024.xxx
					WHEN @.tuai.Oper_Mode = '<SetUp.PSWD.Init>' THEN 402			--	Email - aktywacja mailowa konta
					WHEN @.tuai.Oper_Mode = '<SetUp.PSWD.Reset>' THEN 404		--	Email - zapomniane hasło
				WHEN @.tuai.Oper_Mode = '<SetUp.New>' THEN 402				--	Email - aktywacja mailowa konta
				WHEN @.tuai.Oper_Mode = '<SetUp.Reset>' THEN 404				--	Email - zapomniane hasło
				WHEN @.tuai.Oper_Mode = '<confirm.SetUp.New>' THEN 403		--	Aktywacja konta i nadanie hasła
				WHEN @.tuai.Oper_Mode = '<confirm.SetUp.Reset>' THEN 405		--	Zmiana hasła z emaila
				WHEN @.tuai.Oper_Mode = '<Change>' THEN 402
				WHEN @.tuai.Oper_Mode = '<Access_Module.ADD>' THEN 415		--	Dodanie dostępu do modułu
				WHEN @.tuai.Oper_Mode = '<Access_Module.REMOVE>' THEN 416	--	Usunięcie dostępu do modułu
			--	UWAGA dodac rekord do `log_czynnosci` w Sql Zmianach	z IDN=420 Nazwa = Zmiana hasła
				ELSE 3
				END
		;
							SET @.bylem = CONCAT_WS('\n', @.bylem, 'UPDATE `t_ua_inf` 2');
	--	Dla Zmiana hasła z emaila
	--	UWAGA dla sent.zapomnialem spr. flage @session.globals.user_accounts.PrzypomnijHaslo.Acitve i ew. od razu ustaw Err
		UPDATE `t_ua_inf_msg` tsm, `t_ua_inf` tuai
		SET
			tsm.S_Yes = 
				-- (tuai.IN_Mode LIKE '%sent.zapomnialem%' AND NOT @session.globals.user_accounts.PrzypomnijHaslo.Acitve)
				(@session.globals.user_accounts.PrzypomnijHaslo.Acitve = '0')
		WHERE
			tuai.Oper_Mode IN ('<SetUp.Reset>','<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>')
			AND 
			tsm.S_Status = 'ERR.DISABLED.Zapomnialem' 
		;
									-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.1', '', '', '');
	--	Dla logowania/autoryzacji	
		IF @.tuai.Oper_Mode IN ('<LOG>', '<AUTH>') THEN
			SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
			IF @.ALL.Errors = 0 THEN
										-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.AUTH', '', '', '');
										-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.AUTH.1', '', '', '');
				SET
				--	Dla logowania !!!!
					@.auth.Max_User_Err_logon_count = 3, 	-- dawne @_MAX_USER_err_logon_count
					-- @_SESSION_GUID = _SESSION_GUID,
					@.auth.EmptyDatas = 'd41d8cd98f00b204e9800998ecf8427e',	 -- dawne @_EMPTYDatas
					@.auth.JMLogin.5 = (SELECT g.VALUE FROM `_db_globals` g WHERE g.key = '_JMLogin'),	-- dawne @_JMLogin_5
					@.auth.FDatasSU.5 = (SELECT g.VALUE FROM `_db_globals` g WHERE g.key = '_FDatasSU'), -- dawne @_FDatasSU_5
				--	Wejsciowe	
					@.auth._IN_Session_GUID = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'IN_Session_GUID', ''), ''),
					@.auth.S.ID = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'S.ID', ''), ''),		-- jawna sesja gdy jest pieprzem (Pepper) w haszowaniu
					@.auth.U.L.5 = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'U.L#', ''), ''),	-- USER_LOGIN.Hash
					@.auth.U.P.5 = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'U.P#', ''), ''),	-- USER_PSWD.Hash
					@.auth.U.G.5 = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'U.G#', ''), ''),	-- USER_GUID.Hash
					@.auth.D.ID.5 = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'D.ID#', ''), ''),	-- DEV_ID.Hash
					@.auth.D.ID = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'D.ID', ''), ''),		-- DEV_ID
					@.auth.A.ID.5 = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'A.ID#', ''), ''),	-- APP_ID.Hash
					@.auth.A.VER = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'A.VER', ''), ''),	-- APP_VER
					@.auth.A.NAME = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'A.NAME', ''), ''),	-- APP_NAME - nie konieczna 
					@.auth.A.ACCESS = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'A.ACCESS', ''), ''),	-- ACCESS - 1 - spr. dostep do modułów, 0 - nie
					
					@.auth.S.ID.Zlec.5 = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Params, 'S.ID.Zlec#', ''), '')
				;
				SET	
					@.auth.A.verYMDN = _VerFmtStr('GET.Ver<-Ver', @.auth.A.VER, '', '', '', '')	-- APP_VER YMDN
				;
			--	Mieszanie Md5(Sól, pieprz, Md5(str)) lub inaczej Md5(Sól, pieprz, str_5) lub 
			--	Sól i pieprz do mieszania	
				SET
					@.auth.Salt = @session.globals.INPUT_SALT_Hash,	 -- @_INPUT_SALT_Hash  = (SELECT g.VALUE FROM `_db_globals` g WHERE g.key = '_SLT_#' LIMIT 1),
					@.auth.Pepper = @.auth.S.ID	--	jeśli ma byc pieprz to musza przysłać w sznurku (nie haszowana sesje (S.ID=xxx&) lub 
				;
				IF @session.globals.RODO.Days IS NULL THEN
					CALL _Globals_Get('RODO.Days', @session.globals.RODO.Days, 0);
				END IF;
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.AUTH.1', '', '', '');
			
										-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.AUTH.2', '', '', '');
				UPDATE `t_ua_inf` tuai
				SET
					tuai.Session_GUID = NULL,
					IN_Session_GUID = @.auth._IN_Session_GUID,
					In_USER_GUID_Hash = IF(tuai.IN_Mode LIKE '%#UserGUID%', @.auth.U.G.5, NULL),
					In_LOGIN_Hash = IF(tuai.IN_Mode LIKE '%#Login%', @.auth.U.L.5, NULL),
					In_Datas_Hash = IF(tuai.IN_Mode LIKE '%#Login,#Pswd%', @.auth.U.P.5, NULL),
					In_DEV_ID_Hash = @.auth.D.ID.5,
					In_APP_ID_Hash = @.auth.A.ID.5,
					In_APP_VER = @.auth.A.VER,
					In_APP_verYMDN = @.auth.A.verYMDN,
					In_APP_NAME = @.auth.A.NAME,
					In_APP_ACCESS = IFNULL(@.auth.A.ACCESS, 1),
					In_SesjaZlecajaca_Hash = IF(tuai.IN_Mode LIKE '%SesjaZlecajaca%', @.auth.S.ID.Zlec.5, NULL),
				--	Sól i pieprz do mieszania	
					SALT = @.auth.Salt,
					PEPPER = @.auth.Pepper,
				--	Ust. wstepne
					Owner = _GetAppOwner()
				;
							SET @.bylem = CONCAT_WS('\n', @.bylem, 'UPDATE `t_ua_inf` 3');
				
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.AUTH.2', '', '', '');
										-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.AUTH.3', '', '', '');
				UPDATE `t_ua_inf` tuai
				SET
					tuai.SesjaZlecajaca =
						IF(tuai.IN_Mode LIKE '%SesjaZlecajaca%',
							(
								SELECT
									sdl.GUID
								FROM `_sys_db_logons` sdl
								WHERE
									_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, sdl.GUID, '', '') = tuai.In_SesjaZlecajaca_Hash
							),
							NULL
						),
					tuai.APP_ID = 
					--	UWAGA inicjalnie jest NULL i gdy nie znajdziemy żadnej aplikacji (modułu) czyli pozostanie NULL 
					--	to nie spr. dostepu czyli Verify_Access_available <- TRUE - patrz nizej sprawdzenie
						(@.tuai.APP_ID := 
						IF(tuai.IN_Mode LIKE '%AUTH.%SESSION:%',
						--	Autoryzacja do ustawień konkretnej sesji - zatem APP_ID weź stamtąd
							(
							SELECT 
								a.ID
							FROM `_sys_db_logons` sdl, `_sys_app_reg` a

							WHERE 
								sdl.GUID = tuai.IN_Session_GUID
								AND a.ID = sdl.Log_APP_ID 
							LIMIT 1
							),
							
						--	APP_ID weź z grup/modułów
							IFNULL(
								(
								SELECT 
									a.ID
								FROM `_sys_app_reg` a
								WHERE
									MD5(CONCAT(_VarStr(tuai.SALT), tuai.PEPPER, a.ID, '', '')) = _VarStr(tuai.In_APP_ID_Hash)
								LIMIT 1
								),
								(
								SELECT 
									go.GrupaGUID 
								FROM `grupy_osob` go 
								WHERE 
								--	dodałem by zawęzic - GENERALNIE moduły zawsze od M_	
									(go.GrupaGUID LIKE 'M_%' OR go.GrupaGUID LIKE '%exe%')
									AND
									MD5(CONCAT(tuai.SALT, tuai.PEPPER, go.GrupaGUID, '', '')) = _VarStr(tuai.In_APP_ID_Hash)
								LIMIT 1
								)
							)
						)
					),
					tuai.DEV_ID = @.auth.D.ID
				;
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.AUTH.3', '', '', '');
										-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'INSERT.AUTH.4', '', '', '');
				DELETE tsm FROM `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
				WHERE
					IFNULL(tuai.APP_ID, '') = ''
					AND tsm.S_Status IN ('ERR.Access.Module', 'LOG.Access.Module', 'ERR.Access.Module.Disabled')
				;
			--	komunikat o zablokowanym do użycia module pole `_sys_app_reg`.Disabled
							SET @.bylem = CONCAT_WS('\n', @.bylem, 'UPDATE `t_ua_inf` 4');
				UPDATE 
				`t_ua_inf` tuai, `t_ua_inf_msg` tsm, `_sys_app_reg` a
				SET
					tsm.S_Yes = 1
				WHERE
					tuai.Oper_Status LIKE 'OK%'
					AND a.ID = tuai.APP_ID
					AND IFNULL(a.Disabled, 0) = 1
					AND tsm.S_Status = 'ERR.Access.Module.Disabled'
				;
				/*	test watch
				SET @.tsm.RC = ROW_COUNT();
				SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
				CALL _sys_app_logtxt('LOG.User.Add', '', 'watch', 'jmam', '', '', '', '', CONCAT_WS('/', CONCAT('UPD.RC:', @.tsm.RC), CONCAT('ALL.Errors:', @.ALL.Errors)));
				*/
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.AUTH.4', '', '', '');
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT.AUTH', '', '', '');
			END IF;
		END IF;
										-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'call Summary', '', '', '');
		CALL _user_accounts_inf('Summary', '', '', @.tuai.Params); 
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'call Summary', '', '', '');
										-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'INSERT', '', '', '');
	END IF;
	
	IF _MODE IN ('<-_user_accounts') THEN
							SET @.bylem = CONCAT_WS('\n', _MODE, 'Start');
		IF (@.ALL.Errors := IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0)) = 0 THEN
										-- CALL _sys_watch_time_Tools('start', '<-_user_accounts', '->1', '', '', '');
			IF IFNULL(_UserGUID, '') <> '' THEN
				UPDATE `t_ua_inf` tuai
				SET
					tuai.UserGUID = _UserGUID
				;
			END IF;
									-- CALL _sys_watch_time_Tools('stop', '<-_user_accounts', '->1', '', '', '');
									-- CALL _sys_watch_time_Tools('start', '<-_user_accounts', '->2', '', '', '');
			--	po co?	SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
		--	Ogolne dane	
		--	Zablokuj na pocz. aby potem, odblokowac
							SET @.bylem = CONCAT_WS('\n', @.bylem, '1');
			UPDATE `t_ua_inf_msg` tsm, `t_ua_inf` tuai 
			SET 
				tsm.S_Yes = 1 
			WHERE 
				tsm.S_Status = 
					IF(NOT (tuai.IN_Mode LIKE '%LOG.BIO:#%'), -- Nie bio metryczne - bo dla nich jest ERR.USER.BIO.ID
						'ERR.NO.USER',
						'ERR.USER.BIO.ID'
					)
				--	AND @.ALL.Errors = 0	-- ale po co i tak jest wyzej IF !!!
			;
			UPDATE `t_ua_inf` tuai
			SET
				tuai.Status_N_Warn = NULL,
				tuai.Msg_Warn = NULL,
				tuai.Msg_Log = NULL,
				tuai.When_Invslid_Attempt_Msg = NULL
				
			;
							-- CALL _sys_watch_time_Tools('stop', '<-_user_accounts', '->2', '', '', '');
							-- CALL _sys_watch_time_Tools('start', '<-_user_accounts', '->3', '', '', '');
							SET @.bylem = CONCAT_WS('\n', @.bylem, '2');
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua
			SET
				tuai.User_Is_jmam = (ua.Login = 'jmam'),
				-- tuai.AD_Mail = ua.AD_Mail,
				tuai.User_Auto_Pswd = 
				--	autom. wyg. hasło dla aktywacja i zapomnialem
					--	(ua.ExtFlags LIKE '<%.Auto.Pswd%>') OR (ua.ExtFlags LIKE '<%.Auto.TmpPswd%>') ,
					IF(ua.ExtFlags LIKE '<%.Auto.Pswd%>', 'Auto.Pswd',
					IF(ua.ExtFlags LIKE '<%.Auto.TmpPswd%>', 'Auto.TmpPswd', '')),
				tuai.User_Last_Day_Auto_Temp_Pswd = 
				--	autom. wyg. hasło dla aktywacja i zapomnialem ale czsowe TmpPswd !!!
					IF(ua.ExtFlags LIKE '<%.Auto.TmpPswd%>', 
						DATE(DATE_ADD(ua.Last_Change_Pswd, INTERVAL 2 DAY)),
						'2100-01-01'
					), 
				tuai.User_Last_Day_to_Change_Pswd = 
					IF(@session.globals.RODO.Days = 0, 
						'2100-01-01', 
						DATE(DATE_ADD(ua.Last_Change_Pswd, INTERVAL @session.globals.RODO.Days - 1 DAY))
					),
				tuai.IN_Token = IF(tuai.Oper_Mode IN ('<SetUp.Reset>', '<SetUp.New>'),
				--	ustaw token do umieszczenia w linku do wysyłki mailowej ALE TYLKO dla SetUp.xxxx !!!
					_MD5_CHARSET('', tuai.UserGUID, ua.Ad_mail, '', '', ''),
					tuai.IN_Token
				),
				tuai.Wait_for_Log_Second = 
					IF(tuai.Oper_Mode IN ('<LOG>', '<AUTH>'),
						TIMESTAMPDIFF(SECOND, NOW(), (ua.LastUpdate + INTERVAL @.auth.Wait.Err_logon_count MINUTE)),
						0
					)

			WHERE
				TRUE
				AND ua.OsobaGUID = tuai.UserGUID
			;
							-- CALL _sys_watch_time_Tools('stop', '<-_user_accounts', '->3', '', '', '');
			/*
				Dla logowania/autoryzacji ustaw actual_try_attempt
				Najpierw sprawdzmy konto usera
				gdy err_logon_count >= MAX to
				spr. czy w ua.ExtFlags jest <err_logon_count.temp> LIKE '%<err_logon_count.temp>%'
					- tak - czyli czasowo zawieszone logowanie 
					  spr. czy od LastUpdate upłyneło np 10 min ?
						- tak - err_logon_count ustawiam na 0 czyli można znów sie logowa 3 razy 
						- nie - na razie zostawiam - komunikat bedzie o przekroczeniu
					- nie - nie jest to czsowe zatem albo jest tam juz <err_logon_count> albo na razie nie ma nic 
					  spr. czy jest tam <err_logon_count> LIKE '%<err_logon_count>%'
						- tak - zatem całkowita blokada
						- nie - hmmm i co wtedy??? 
			*/
							-- CALL _sys_watch_time_Tools('start', '<-_user_accounts', '->4', '', '', '');
							SET @.bylem = CONCAT_WS('\n', @.bylem, '3');
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua
			SET
				ua.err_logon_count = (@.ua.err_logon_count :=
					IF(
						ua.err_logon_count >= @.auth.Max_User_Err_logon_count
						AND ua.ExtFlags LIKE '%<err_logon_count.temp>%' 
						-- AND (ua.LastUpdate + INTERVAL @.auth.Wait.Err_logon_count MINUTE) < NOW(), -- od LastUpdate upłyneło np 10 min 
						AND tuai.Wait_for_Log_Second <= 0,	-- gdy < 0 to oznacza że juz mozna gdy > 0 to trzeba czekać
					--	czyli czasowo zawieszone logowanie ale od LastUpdate upłyneło np 10 min 
					--	UWAGA nie wstawiam tu 0 wstawiam -1 bo -1 przerabiane jest w triggerze na 0!!! (za to unikamy czyszczenia ExtFlags gdyby ustawiać 0)
						-1,	-- de facto 0 - teraz nie bedzie juz blokował ale flaga zrobi swoje przy przekroczeniu
						ua.err_logon_count
					))
			WHERE
				TRUE
				AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT (tuai.IN_Mode LIKE '%LOG.BIO:#%') -- Nie bio metryczne - bo to nie są pomyłki w hasle!!!!
				AND tuai.Oper_Status = 'OK'
				AND ua.OsobaGUID = tuai.UserGUID
			;
							-- CALL _sys_watch_time_Tools('stop', '<-_user_accounts', '->4', '', '', '');
							-- CALL _sys_watch_time_Tools('start', '<-_user_accounts', '->5', '', '', '');
		--	Ustaw tuai.actual_try_attempt dla '<LOG>', '<AUTH>'
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua
			SET
				tuai.actual_try_attempt = ua.err_logon_count + 1
			WHERE
				TRUE
				AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT (tuai.IN_Mode LIKE '%LOG.BIO:#%') -- Nie bio metryczne - bo to nie są pomyłki w hasle!!!!
				AND tuai.Oper_Status = 'OK'
				AND ua.OsobaGUID = tuai.UserGUID
			;
							-- CALL _sys_watch_time_Tools('stop', '<-_user_accounts', '->5', '', '', '');
		--	teraz możemy ustawić Statusy	
			IF IFNULL(@.Jak.tuai, 'NEW') = 'NEW' THEN
							-- CALL _sys_watch_time_Tools('start', '<-_user_accounts', '->6', '', '', '');
							SET @.bylem = CONCAT_WS('\n', @.bylem, '4.1');
				UPDATE `t_ua_inf_msg` tsm, `t_ua_inf` tuai, `_user_accounts` ua
				SET
					tsm.S_Yes = IFNULL(
						CASE 
						WHEN S_Status = 'ERR.NO.USER'
							THEN 0	--	skoro mamy złączenie z `_user_accounts` ua to ZGAŚ S_Status
						WHEN S_Status = 'ERR.USER.BIO.ID'
							THEN 0	--	skoro mamy złączenie z `_user_accounts` ua to ZGAŚ S_Status
						WHEN S_Status = 'ERR.account.inactive' 
							THEN (ua.Status <> 0)
						WHEN S_Status = 'ERR.account.expired' 
							THEN (Get_Status_For_From_To('', NULL, ua.date_from, ua.date_to, ua.Status <> 0, 0) != 'OK')
						WHEN S_Status = 'ERR.account.user_type.ZERO' 
							THEN (ua.user_type = 0)
						WHEN S_Status = 'ERR.account.No.Activate' 
							THEN (ua.user_type < 0 AND ua.ExtFlags LIKE '%<SetUp.New>%' AND tuai.Oper_Mode <> '<confirm.SetUp.New>')	-- ale nie dla confirm aktywacyjnego
						WHEN S_Status = 'ERR.account.Reset' 
						/* UWAGA czy to w ogole potrzebne - czy takie ustawienie przeszkadza w czymś????  Dlatego na razie daję FALSE */
							THEN (ua.ExtFlags LIKE '%<SetUp.Reset>%') AND (FALSE)
						WHEN S_Status = 'ERR.err_logon_count' 
							THEN (ua.err_logon_count >= @.auth.Max_User_Err_logon_count) AND NOT (ua.ExtFlags LIKE '%<err_logon_count.temp>%')
						WHEN S_Status = 'ERR.err_logon_count_temp' 
							THEN (ua.err_logon_count >= @.auth.Max_User_Err_logon_count) AND (ua.ExtFlags LIKE '%<err_logon_count.temp>%')
						WHEN S_Status = 'ERR.RODO.Need.Change.PSWD' 
							THEN (CURRENT_DATE() > tuai.User_Last_Day_to_Change_Pswd)
						--	ale tylko dla Logowania i autoryzacji	
							AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
						WHEN S_Status = 'ERR.AUTO.TEMPORARY.PSWD' 
							THEN tuai.User_Auto_Pswd = 'Auto.TmpPswd'
							AND (CURRENT_DATE() > tuai.User_Last_Day_Auto_Temp_Pswd)
						--	ale tylko dla Logowania i autoryzacji	
							AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
						WHEN S_Status = 'ERR.Empty.PSWD' 
							THEN (
							ua.DATAS = @.auth.EmptyDatas 
						--	dla CDG sty 2023 na jakiś czas pozwalamy dla aplikacji dostawca gazu	
								AND NOT (
								@session.globals.Owner IN ('CDG') AND tuai.In_APP_NAME = 'DostawcaGazu'
								)
							AND (_ExtFlags('GET', ua.ExtFlags, 'Empty.PSWD', '', '') = '<Empty.PSWD>') 
						--	ale tylko dla Logowania i autoryzacji	
							AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
						)
					--	<SetUp.New><SetUp.Reset>	
						/* patrz wyzej juz ew. ustawilem
						WHEN S_Status = 'ERR.DISABLED.Zapomnialem' 
							-- THEN (tuai.IN_Mode LIKE '%sent.zapomnialem%' AND NOT @session.globals.user_accounts.PrzypomnijHaslo.Acitve)
							THEN (tuai.Oper_Mode IN ('<SetUp.New>') AND NOT @session.globals.user_accounts.PrzypomnijHaslo.Acitve)
						*/
						WHEN S_Status = 'ERR.Empty.Email' 
							THEN (IFNULL(ua.AD_Mail, '') = '') AND tuai.Oper_Mode IN ('<SetUp.Reset>','<SetUp.New>','<Sent.aktywacja.Auto.Pswd>','<Sent.aktywacja.Auto.TmpPswd>','<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>')
						WHEN S_Status = 'ERR.Unknown.Email' 
							THEN (ua.AD_Mail <> tuai.IN_EMail) AND tuai.Oper_Mode IN ('<SetUp.Reset>','<SetUp.New>','<Sent.aktywacja.Auto.Pswd>','<Sent.aktywacja.Auto.TmpPswd>','<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>')
					-- 	<confirm.SetUp.New><confirm.SetUp.Reset><Change>
					-- 	Inne hasło (stare hasło <> hasła do konta) ???
						WHEN S_Status = 'ERR.PSWD' 
							THEN 
							IF(tuai.Oper_Mode IN ('<Change>'),
								!(tuai.IN_Datas_Old <=> ua.Datas),
								tsm.S_Status
							)
					-- zmiana hasła a NIE nowo zakladane konto
						WHEN S_Status = 'ERR.1.raz' 
							THEN NOT(ua.ExtFlags LIKE '%<SetUp.Reset>%') AND tuai.Oper_Mode = '<confirm.SetUp.Reset>'
					-- nowo zakladane konto
						WHEN S_Status = 'ERR.Bylo.Aktywowane' 
							THEN NOT(ua.user_type < 0 AND ua.ExtFlags LIKE '%<SetUp.New>%') AND tuai.Oper_Mode = '<confirm.SetUp.New>'
					-- 	Czy hasło stare hasło <> hasła nowego ???	
						WHEN S_Status = 'ERR.PSWD.MUST.BE.DIFFERENT' 
							THEN (tuai.IN_Datas_Old <=> tuai.IN_Datas) AND (tuai.Oper_Mode IN ('<Change>'))
					-- 	Czy hasło nowe nie jest juz w archiwum??
						WHEN S_Status = 'ERR.PSWD.WAS.IN.USE' 
							THEN EXISTS(SELECT a.idn FROM `_user_accounts_pswd_arch` a WHERE a.OsobaGUID = ua.OsobaGUID AND a.typ = 'SYS' AND a.datas = tuai.IN_Datas)
						
					--	warnings	
						WHEN S_Status = 'WARN.Empty.PSWD' 
							THEN (ua.DATAS = @.auth.EmptyDatas AND (_ExtFlags('GET', ua.ExtFlags, 'Empty.PSWD', '', '') != '<Empty.PSWD>'))
						WHEN S_Status = 'WARN.RODO.Need.Change.PSWD' 
							THEN (CURRENT_DATE() BETWEEN (tuai.User_Last_Day_to_Change_Pswd - INTERVAL 5 DAY) AND (tuai.User_Last_Day_to_Change_Pswd))
						WHEN S_Status = 'WARN.AUTO.PSWD' 
							THEN tuai.User_Auto_Pswd = 'Auto.Pswd'
						--	ale tylko dla Logowania i autoryzacji	
							AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
						WHEN S_Status = 'WARN.AUTO.TEMPORARY.PSWD' 
							THEN tuai.User_Auto_Pswd = 'Auto.TmpPswd'
							AND (CURRENT_DATE() BETWEEN (tuai.User_Last_Day_Auto_Temp_Pswd - INTERVAL 2 DAY) AND (tuai.User_Last_Day_Auto_Temp_Pswd))
						--	ale tylko dla Logowania i autoryzacji	
							AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
						END
						, tsm.S_Yes
					)
				WHERE
					TRUE
					AND ua.OsobaGUID = tuai.UserGUID
					AND IFNULL(tuai.UserGUID, '') <> ''  -- musze bo zdarza się że sa puste OsobaGUID w `_user_accounts`
					AND tuai.Oper_Status = 'OK'
				;
								-- select * from `t_ua_inf_msg`;
								-- CALL _sys_watch_time_Tools('stop', '<-_user_accounts', '->6', '', '', '');
			END IF;	
		END IF;
	END IF;	
	
	IF _MODE IN ('Summary') THEN
							SET @.bylem = CONCAT_WS('\n', _MODE, '1');
								-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'call Summary.1', '', '', '');
		SET @.Punkt = '- ';
		SELECT 
			GROUP_CONCAT(
				IF(tsm.S_Yes AND tsm.S_type = 'ERROR', tsm.S_Status, NULL)
				ORDER BY tsm.S_Lp SEPARATOR ';'
			) AS Status_N_Err,
			GROUP_CONCAT(
				IF(tsm.S_Yes AND tsm.S_type = 'ERROR', CONCAT(@.Punkt, tsm.S_Msg), NULL)
				ORDER BY tsm.S_Lp SEPARATOR '\n'
			) AS Status_Msg_Err,
			GROUP_CONCAT(
				IF(tsm.S_Yes AND tsm.S_type = 'WARNING', tsm.S_Status, NULL)
				ORDER BY tsm.S_Lp SEPARATOR ';'
			) AS Status_N_Warn,
			GROUP_CONCAT(
				IF(tsm.S_Yes AND tsm.S_type = 'WARNING', CONCAT(@.Punkt, tsm.S_Msg), NULL)
				ORDER BY tsm.S_Lp SEPARATOR '\n'
			) AS Msg_Warn,
			GROUP_CONCAT(
				IF(tsm.S_Yes AND tsm.S_type = 'LOG', CONCAT(@.Punkt, tsm.S_Msg), NULL)
				ORDER BY tsm.S_Lp SEPARATOR '\n'
			) AS Msg_Log,
			SUBSTRING_INDEX(
				Get_Status_For_From_To_Str('GET.Info.Konto', NULL, ua.date_from, ua.date_to, '', 0, '', '@'),
				'::', -1) AS `X.MSG.ERR.account.expired`, 
			_VarStr(tuai.actual_try_attempt - 1) AS `X.actual_try_attempt_pre`,
			_D_to_Wczoraj_Jutro(tuai.User_Last_Day_to_Change_Pswd, '%dd %D %mmm %YH', '') AS `X.ERR.RODO.Need.Change.PSWD.Kiedy`, 
			/*	było do 2 VIII 2024
			IF(CURRENT_DATE() - INTERVAL 1 DAY = tuai.User_Last_Day_to_Change_Pswd,
				'Wczoraj w ',
				CONCAT(
					IF((CURRENT_DATE() - INTERVAL 2 DAY) = tuai.User_Last_Day_to_Change_Pswd,
						'Przedwczoraj w ',
						'W '
					),
					_Format_DT(tuai.User_Last_Day_to_Change_Pswd, '%dd %D %mmm %YH'), 
					' '
				)
			) AS `X.ERR.RODO.Need.Change.PSWD.Kiedy`, 
			*/
			_D_to_Wczoraj_Jutro(tuai.User_Last_Day_to_Change_Pswd, '%dd %D %mmm %YH', '') AS `X.OK.RODO.Need.Change.PSWD.Kiedy`,
			/*	było do 2 VIII 2024
			IF(CURRENT_DATE() = tuai.User_Last_Day_to_Change_Pswd,
				'Dziś ',
				CONCAT(
					IF((CURRENT_DATE() + INTERVAL 1 DAY) = tuai.User_Last_Day_to_Change_Pswd,
						'Jutro ',
						CONCAT('Za ', DATEDIFF(tuai.User_Last_Day_to_Change_Pswd, CURRENT_DATE()), ' dni ')
					),
					'(', _Format_DT(tuai.User_Last_Day_to_Change_Pswd, '%dd %D %mmm %YH'), ') '
				)
			) AS `X.OK.RODO.Need.Change.PSWD.Kiedy`,
			*/
			_D_to_Wczoraj_Jutro(tuai.User_Last_Day_Auto_Temp_Pswd, '%dd %D %mmm %YH', '') AS `X.ERR.TEMPORARY.PSWD.Kiedy`,
			_D_to_Wczoraj_Jutro(tuai.User_Last_Day_Auto_Temp_Pswd, '%dd %D %mmm %YH', '') AS `X.OK.TEMPORARY.PSWD.Kiedy`,
		-- bylo	tuai.When_Invslid_Attempt_Msg = 	
		-- Msg dla ewnt. nieudanego logowania z aktualną próbą (msg na zaś w razie err
			CONCAT_WS('',
				'Identyfikacja nie powiodła się i była to ', tuai.actual_try_attempt, '. nieudana próba!\n',
				IF(tuai.actual_try_attempt >= @.auth.Max_User_Err_logon_count,
					IF(ua.ExtFlags LIKE '%<err_logon_count.temp>%',
						CONCAT_WS('',
							'Konto zostanie czasowo zablokowane - spróbuj ponownie',
							_DisplayDurationH('D/H/M', @.auth.Wait.Err_logon_count/60, ' za', 'po'),
							'.'
						),
						'Konto zostało zablokowane.'
					),
					CONCAT('Pozostało prób: ', _VarStr(@.auth.Max_User_Err_logon_count - tuai.actual_try_attempt), '.')
				)
			) AS `X.ERR.When_Invslid_Attempt_Msg`
		INTO
			@.Status_N_Err, @.Status_Msg_Err, @.Status_N_Warn, @.Msg_Warn, @.Msg_Log,
			@.X.MSG.ERR.account.expired, @.X.actual_try_attempt_pre, @.X.ERR.RODO.Need.Change.PSWD.Kiedy, @.X.OK.RODO.Need.Change.PSWD.Kiedy, @.X.ERR.TEMPORARY.PSWD.Kiedy, @.X.OK.TEMPORARY.PSWD.Kiedy,
			@.X.ERR.When_Invslid_Attempt_Msg
		FROM `t_ua_inf_msg` tsm
		INNER JOIN `t_ua_inf` tuai
		LEFT JOIN `_user_accounts` ua ON ua.OsobaGUID = tuai.UserGUID
		;
								-- SELECT @.Status_N_Err, @.Status_Msg_Err, @.Status_N_Warn, @.Msg_Warn, @.X.MSG.ERR.account.expired, @.X.actual_try_attempt_pre, @.X.ERR.RODO.Need.Change.PSWD.Kiedy, @.X.OK.RODO.Need.Change.PSWD.Kiedy;
								-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'call Summary.1', '', '', '');
								-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'call Summary.2', '', '', '');
							SET @.bylem = CONCAT_WS('\n', @.bylem, '2');
		UPDATE `t_ua_inf` tuai
		SET
			tuai.Status = IFNULL(NULLIF(SUBSTRING_INDEX(@.Status_N_Err, ';', 1), ''), 'OK'),
			tuai.Status_N = @.Status_N_Err,
			tuai.Msg = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@.Status_Msg_Err,
				'#MSG.ERR.account.expired#', IFNULL(NULLIF(@.X.MSG.ERR.account.expired, 'OK'), '')),
				'#actual_try_attempt_pre#', IFNULL(@.X.actual_try_attempt_pre, '')),
				'#ERR.RODO.Need.Change.PSWD.Kiedy#', IFNULL(@.X.ERR.RODO.Need.Change.PSWD.Kiedy, '')), 
				'#OK.RODO.Need.Change.PSWD.Kiedy#', IFNULL(@.X.OK.RODO.Need.Change.PSWD.Kiedy, '')), 
				'#ERR.TEMPORARY.PSWD.Kiedy#', IFNULL(@.X.ERR.TEMPORARY.PSWD.Kiedy, '')), 
				'#OK.TEMPORARY.PSWD.Kiedy#', IFNULL(@.X.OK.TEMPORARY.PSWD.Kiedy, '')), 
				'#When_Invslid_Attempt_Msg#', IFNULL(@.X.ERR.When_Invslid_Attempt_Msg, '')),
				'#Wait_for_Log#', IFNULL(_DisplayDurationH(IF(tuai.Wait_for_Log_Second > 40, 'D/H/M', 'D/H/M/S'), tuai.Wait_for_Log_Second/3600, ' za', ''), '')),
			tuai.Status_N_Warn = @.Status_N_Warn,
			tuai.Msg_Warn = REPLACE(REPLACE(@.Msg_Warn,
				'#OK.RODO.Need.Change.PSWD.Kiedy#', IFNULL(@.X.OK.RODO.Need.Change.PSWD.Kiedy, '')),
				'#OK.TEMPORARY.PSWD.Kiedy#', IFNULL(@.X.OK.TEMPORARY.PSWD.Kiedy, '')), 
			tuai.Msg_Log = @.Msg_Log
		;
		SET 
			@._ModeParam = '',
			@.Sum.Params = _Params
		;
		SET
			@.tuai.summary.Oper_Status = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Sum.Params, 'Oper_Status', ''), ''),
			@.tuai.summary.Oper_Status_Msg = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Sum.Params, 'Oper_Status_Msg', ''), ''),
			@.ua.X = NULLIF(_Params2('_FetchParams', @._ModeParam, @.Sum.Params, 'X', ''), '')
		;
								-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'call Summary.2', '', '', '');
								-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'call Summary.3', '', '', '');
							SET @.bylem = CONCAT_WS('\n', @.bylem, '3');
		UPDATE `t_ua_inf` tuai
		SET
			tuai.Oper_Status = (@.tuai.Oper_Status := 
					IF(IFNULL(@.tuai.summary.Oper_Status, '') <> '',
					--	Jeśli ze zmiennej przysłaliśmy Status i MSG-e to tutaj to możemy robić	
						@.tuai.summary.Oper_Status,
						tuai.Status
					)
				
			)
		;
								-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'call Summary.3', '', '', '');
								-- CALL _sys_watch_time_Tools('start', 'tuai.INSERT', 'call Summary.4', '', '', '');
		UPDATE `t_ua_inf` tuai
		SET
			tuai.Oper_Status_Msg = (@.tuai.Oper_Status_Msg := 
				CONCAT_WS('\n',
					IF(IFNULL(@.tuai.summary.Oper_Status_Msg, '') <> '',
					--	Jeśli ze zmiennej przysłaliśmy Status i MSG-e to tutaj to możemy robić	
						_VarStr(@.tuai.summary.Oper_Status_Msg),
						_VarStr(
						CASE 
					--	Pozostałe ustaw z case
						WHEN tuai.Oper_Mode IN ('<Sent.aktywacja.Auto.Pswd>','<Sent.aktywacja.Auto.TmpPswd>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							CONCAT_WS('\n',
								_VarStr('Aktywacja konta - wysłany został mail aktywacyjny do użytkownika który będzie zawierać dane do logowania w tym wygenerowane automatycznie hasło.'),
								NULL
							),
							_VarStr('Błąd - aktywacja zakończona niepomyślnie!')
						)
						WHEN tuai.Oper_Mode IN ('<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							CONCAT_WS('\n',
								_VarStr('Odbierz mail wysłany na podany w systemie adres w którym będzie nowe, wygenerowane automatycznie hasło.'),
								IF(tuai.Oper_Mode = '<Sent.zapomnialem.Auto.TmpPswd>',
									'UWAGA! Otrzymane hasło jest tymczasowe i w celu własnego bezpieczeństwa należy jak najszybciej zmienić ja na własne hasło!',
									NULL
								)
							),
							_VarStr('Niepowodzenie!')
						)
						WHEN tuai.Oper_Mode IN ('<SetUp.New>','<Sent.aktywacja.Auto.Pswd>','<Sent.aktywacja.Auto.TmpPswd>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							_VarStr('Aktywacja konta - wysłany został mail aktywacyjny do użytkownika w którym będzie link do okna ustawienia hasła.'),
							_VarStr('Błąd - aktywacja zakończona niepomyślnie!')
						)
						WHEN tuai.Oper_Mode IN ('<SetUp.Reset>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							_VarStr('Odbierz mail wysłany na podany w systemie adres w którym będzie link do okna ustawienia hasła.\nUWAGA! Operacja zmiany hasła z danego maila jest jednorazowa!'),
							_VarStr('Niepowodzenie!')
						)
						WHEN tuai.Oper_Mode IN ('<confirm.SetUp.New>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							_VarStr('Aktywacja konta powiodła się!'),
							_VarStr('Błąd aktywacji!')
						)
						WHEN tuai.Oper_Mode IN ('<confirm.SetUp.New>','<confirm.SetUp.Reset>', '<Change>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							_VarStr('Zmiana hasła powiodła się!'),
							_VarStr('Zmiana hasła nie powiodła się!')
						)
						WHEN tuai.Oper_Mode IN ('<LOG>', '<AUTH>') THEN IF(tuai.Oper_Status LIKE 'OK%',
							'',
							_VarStr('Błąd autoryzacji!')
						)
						ELSE
							NULL
						END
					)),
					tuai.Msg
				)
			)
		;								
									-- CALL _sys_watch_time_Tools('stop', 'tuai.INSERT', 'call Summary.4', '', '', '');
	END IF;
	
	IF _MODE IN ('Find.UserGUID') THEN
	/******************************************************************************************************************************************
		Szukanie tuai.USERGUID
	******************************************************************************************************************************************/
							SET @.bylem = CONCAT_WS('\n', _MODE, '1');
		SELECT tuai.Oper_Mode INTO @.tuai.Oper_Mode FROM `t_ua_inf` tuai;
		IF @.tuai.Oper_Mode IN ('<SetUp.Reset>','<SetUp.New>','<Sent.aktywacja.Auto.Pswd>','<Sent.aktywacja.Auto.TmpPswd>','<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>') THEN
			UPDATE `t_ua_inf` tuai
			LEFT JOIN `_user_accounts` ua ON ua.OsobaGUID = tuai.IN_ID AND ua.typ = 'SYS'
			SET
				tuai.UserGUID = ua.OsobaGUID
			WHERE
				IFNULL(tuai.UserGUID, '') = ''
				AND tuai.Oper_Status = 'OK'
			;
		--	a gdy nie znaleziono to (ale tylko dla Actv_Mode = '<SetUp.Reset>' - 'Zapomnialem')
		--	loginu
			UPDATE `t_ua_inf` tuai
			LEFT JOIN `_user_accounts` ua ON ua.login = tuai.IN_ID AND ua.typ = 'SYS'
			SET
				tuai.UserGUID = ua.OsobaGUID
			WHERE
				IFNULL(tuai.UserGUID, '') = ''
				AND tuai.Oper_Status = 'OK'
				AND tuai.Oper_Mode IN ('<SetUp.Reset>','<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>')
			;
		--	a gdy nie znaleziono to (ale tylko dla Actv_Mode = '<SetUp.Reset>' - 'Zapomnialem')
		--	emaila
			UPDATE `t_ua_inf` tuai
			LEFT JOIN `_user_accounts` ua ON ua.Ad_mail = tuai.IN_ID AND ua.typ = 'SYS'
			SET
				tuai.UserGUID = ua.OsobaGUID
			WHERE
				IFNULL(tuai.UserGUID, '') = ''
				AND tuai.Oper_Status = 'OK'
				AND tuai.Oper_Mode IN ('<SetUp.Reset>','<Sent.zapomnialem.Auto.Pswd>','<Sent.zapomnialem.Auto.TmpPswd>')
			;
			
		END IF;
		
							SET @.bylem = CONCAT_WS('\n', @.bylem, '3');
		IF @.tuai.Oper_Mode IN ('<confirm.SetUp.New>','<confirm.SetUp.Reset>', '<Change>') THEN
			IF @.tuai.Oper_Mode IN ('<confirm.SetUp.New>','<confirm.SetUp.Reset>') THEN
				UPDATE `t_ua_inf` tuai, `_user_accounts` ua
				SET
					tuai.UserGUID = ua.OsobaGUID
				WHERE
					IFNULL(tuai.UserGUID, '') = ''
					AND tuai.Oper_Status LIKE 'OK%'
					AND tuai.IN_Token = _MD5_CHARSET('', ua.OsobaGUID, ua.Ad_mail, '', '', '')
					AND ua.typ = 'SYS'
				;
			ELSEIF @.tuai.Oper_Mode IN ('<Change>') THEN
				UPDATE `t_ua_inf` tuai, `_user_accounts` ua
				SET
					tuai.UserGUID = ua.OsobaGUID
				WHERE
					IFNULL(tuai.UserGUID, '') = ''
					AND tuai.Oper_Status LIKE 'OK%'
					AND tuai.IN_Token = ua.OsobaGUID
					AND ua.typ = 'SYS'
				;
			END IF;
		END IF;
		
							SET @.bylem = CONCAT_WS('\n', @.bylem, '4');
		IF @.tuai.Oper_Mode IN ('<Access_Module.ADD>', '<Access_Module.REMOVE>') THEN
			IF IFNULL(_UserGUID, '') <> '' THEN
				UPDATE `t_ua_inf` tuai, `_user_accounts` ua
				SET
					tuai.UserGUID = _UserGUID
				;
			END IF;
		END IF;
		
		
							SET @.bylem = CONCAT_WS('\n', @.bylem, '5');
		IF @.tuai.Oper_Mode IN ('<LOG>', '<AUTH>') THEN
			SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
			IF @.ALL.Errors = 0 THEN
								-- CALL _sys_watch_time_Tools('start', 'Find.UserGUID', 'UPDATE.1', '', '', '');
				UPDATE `t_ua_inf` tuai 
				SET 
				-- todo	tuai.Verify_Access_available = (tuai.APP_ID IS NULL),	-- Ważne bo tu odrazu możemy mieć sprawę dostepu z głowy 
					tuai.UserGUID = 
					(@.WHO.YOU.ARE.USER_GUID := 
					CASE
					WHEN tuai.IN_Mode LIKE '%:#Login,#Pswd%' THEN
						(
							SELECT
								ua.OsobaGUID
							FROM `_user_accounts` ua 
							WHERE
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, MD5(ua.Login), '', '') = tuai.In_LOGIN_Hash
								AND tuai.In_Datas_Hash IS NOT NULL 	--	!!!!! ważne bo juz tu nie puszczac nullowego hasła bo zahaszowane nie może byc puste a tym bardziej null
						)
					WHEN tuai.IN_Mode LIKE '%LOG:#UserGUID%' THEN
						(
							SELECT
								ua.OsobaGUID
							FROM `_user_accounts` ua 
							WHERE
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, MD5(ua.OsobaGUID), '', '') = tuai.In_USER_GUID_Hash
						)
					WHEN tuai.IN_Mode LIKE '%LOG.BIO:#Login,#DEV_ID%' THEN
						(
							SELECT
								ua.OsobaGUID
							FROM `hr_cards` hc, `_user_accounts` ua
							WHERE
								hc.kind = 'MACADDRESS'
								AND 
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, hc.ID, '', '') = tuai.In_DEV_ID_Hash
								AND 
								ua.OsobaGUID = hc.OsobaGUID
								AND 
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, MD5(ua.Login), '', '') = tuai.In_LOGIN_Hash
						)
					WHEN tuai.IN_Mode LIKE '%LOG.BIO:#UserGUID,#DEV_ID%' THEN
						(
							SELECT
								ua.OsobaGUID
							FROM `hr_cards` hc, `_user_accounts` ua
							WHERE
								hc.kind = 'MACADDRESS'
								AND 
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, hc.ID, '', '') = tuai.In_DEV_ID_Hash
								AND 
								ua.OsobaGUID = hc.OsobaGUID
								AND 
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, MD5(ua.OsobaGUID), '', '') = tuai.In_USER_GUID_Hash
						)
					WHEN tuai.IN_Mode LIKE '%LOG.BIO:#Login.Only%' THEN
						(
							SELECT
								ua.OsobaGUID
							FROM `_user_accounts` ua
							WHERE
								_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, MD5(ua.Login), '', '') = tuai.In_LOGIN_Hash
						)
					WHEN tuai.IN_Mode LIKE '%SesjaZlecajaca%' THEN
						(
							SELECT
								sdl.log_USER_GUID
							FROM `_sys_db_logons` sdl
							WHERE
								sdl.GUID = tuai.SesjaZlecajaca
						)
						
					ELSE
						NULL
					END
							
					)
				/* todo????	
					tuai.OsobaGUID = @.WHO.YOU.ARE.USER_GUID,
					tuai.Verify_Status = 
						IF(NULLIF(@.WHO.YOU.ARE.USER_GUID, '') IS NULL,
							'ERR.NO.USER',
							'OK'
						)
				*/
				;
									-- CALL _sys_watch_time_Tools('stop', 'Find.UserGUID', 'UPDATE.1', '', '', '');
									-- CALL _sys_watch_time_Tools('start', 'Find.UserGUID', 'UPDATE.2', '', '', '');
							SET @.bylem = CONCAT_WS('\n', @.bylem, '5..');
				UPDATE `t_ua_inf` tuai 
				SET 
				--	DEV_ID może być uzupełniane ze sznurka wprost ze zmiennej DEV_ID = @.auth.D.ID ale czasem (np. BIO)
				--	uzupełniane jest z Hashowanego pola In_DEV_ID_Hash (@.auth.D.ID.5)
					tuai.DEV_ID = 
						IFNULL(
							(
								SELECT
									hc.ID
								FROM `hr_cards` hc
								WHERE
									hc.kind = 'MACADDRESS'
									AND 
									_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, hc.ID, '', '') = tuai.In_DEV_ID_Hash
									AND 
									hc.OsobaGUID = tuai.UserGUID
							),
							tuai.DEV_ID	--	gdy nie ma urzadzenia zahsszowanego to zostaw tuai.DEV_ID
						)
				;
								-- CALL _sys_watch_time_Tools('stop', 'Find.UserGUID', 'UPDATE.2', '', '', '');
			END IF;
		END IF;
							SET @.bylem = CONCAT_WS('\n', @.bylem, '6');
		CALL _user_accounts_inf('<-_user_accounts', '', '', @.tuai.Params); 	
		CALL _user_accounts_inf('Summary', '', '', @.Find.UserGUID.Params); 
	--	Jeszcze spr. czy nie ma logowania BIO							
		SELECT tuai.IN_MODE, tuai.Oper_Mode, tuai.User_Is_jmam INTO @.tuai.IN_MODE, @.tuai.Oper_Mode, @.tuai.User_Is_jmam FROM `t_ua_inf` tuai;
		SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
		IF @.tuai.IN_Mode LIKE '%LOG.BIO:#%,#DEV_ID%' AND @.ALL.Errors = 0 AND @.tuai.Oper_Mode IN ('<LOG>') THEN
		--	LOGOWANIE BIO - spr. czy jest w rej. `_sys_Id_Device` i czy był uzywany nie dawnie niż...
			UPDATE `t_ua_inf_msg` tsm, `t_ua_inf` tuai 
			SET
				tsm.S_Yes = NOT EXISTS(
					SELECT sid.ID FROM `_sys_Id_Device` sid WHERE sid.ID = tuai.DEV_ID AND sid.LAST_USED + INTERVAL 8 WEEK > NOW()
					)
			WHERE
				TRUE
				AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND tuai.IN_Mode LIKE '%LOG.BIO:#%,#DEV_ID%'
				AND tsm.S_Status = 'ERR.USER.BIO.ID.OUT.OF.DATE'
			;
		--	LOGOWANIE BIO - gdy jest OK to jeszcze ustaw czas ost. uzycia w rej. `_sys_Id_Device`
			UPDATE `t_ua_inf_msg` tsm, `t_ua_inf` tuai, `_sys_Id_Device` sid
			SET
				sid.LAST_USED = NOW()
			WHERE
				TRUE
				AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND tuai.IN_Mode LIKE '%LOG.BIO:#%,#DEV_ID%'
				AND tsm.S_Status = 'ERR.USER.BIO.ID.OUT.OF.DATE'
				AND IFNULL(tsm.S_Yes, 0) = 0 -- test przeszdł wyżej i ID jest aktualny zatem mozna ustawic na now
				AND sid.ID = tuai.DEV_ID
			;
			CALL _user_accounts_inf('Summary', '', '', @.Find.UserGUID.Params); 
		END IF;	
								
	END IF;	
	
	IF _MODE IN ('Check.Auth.PSWD') THEN
	/******************************************************************************************************************************************
		Hasło dla '<LOG>', '<AUTH>'
	******************************************************************************************************************************************/
		/* ******************************************************************************
			Sprawdz poprawnośc hasła dla trybow #Login,#Pswd
		 	oraz ewnt. ostrz. dla pustych haseł
			UWAGA ale tylko jak na razie jest OK bo jak juz gdzieś był bład to wychodzimy
		*******************************************************************************/
		SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
		IF @.ALL.Errors = 0 THEN
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua, `t_ua_inf_msg` tsm
			SET
				tsm.S_Yes = NOT(@.PSWD.OK :=
					IFNULL((_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, ua.DATAS, '', '') = tuai.In_Datas_Hash), FALSE)
				)
			WHERE
				tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT tuai.Oper_Status LIKE 'ERR%' 	-- tylko dla na razie popranego procesu - gdy był już jakiś error to nie wykonujemy tego update bo po co? 
				AND tuai.IN_Mode LIKE '%#Login,#Pswd%'
				AND ua.OsobaGUID = tuai.UserGUID
				AND tsm.S_Status = 'ERR.Pswd'
			;
			/* ******************************************************************************
				UWAGA gdy niepowodzenie dla dla trybow #Login,#Pswd
				czyli jesli tsm.S_Yes ustawiono na 1 to może 
				to sprawdz SU z `_db_globals` 
			*******************************************************************************/
			/*
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua, `_db_globals` dg, `t_ua_inf_msg` tsm 
			SET
				tsm.S_Yes = NOT(@.PSWD.OK :=
					(@.PSWD.Result := 
					IF(tsm.S_Yes = 0,
						1,	-- gdy OK (tsm.S_Yes=0) to przekaż 1 (OK) bo wszystko OK (pamietaj że tutaj mamy wszedzie Yes = NOT @.PSWD.OK
						IFNULL(IF((_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, dg.Value, '', '') = tuai.In_Datas_Hash), 2, 0), 0) 	-- gdy hasło SU to zwracaj 2
					)
					) <> 0 -- ważne bo wewn. nawiasu może być 0 (ERR) 1 OK ust. wcześniej lub 2 gdy było Err ale mamy SU (super usera)
				),		
				tuai.IN_Mode = IF(@.PSWD.Result = 2, CONCAT(tuai.IN_Mode, ':', dg.key), tuai.IN_Mode),
			--	no i wreszcie b.wazne - err_logon_count!!!!!
				ua.err_logon_count = 
					IF(@.PSWD.OK, 
						0, 
						ua.err_logon_count + 1,
					)
			WHERE
				tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				-- było do 29 III 2021 AND tuai.Verify_Status LIKE 'ERR%'
				-- AND tuai.Verify_Status = 'ERR.Pswd'
				AND tuai.IN_Mode LIKE '%#Login,#Pswd%'
				AND ua.OsobaGUID = tuai.UserGUID
				AND tsm.S_Status = 'ERR.Pswd'
				-- AND tsm.S_Yes -- Czyli dla nie poprawnego hasła z UPDATE wyżej 
				AND dg.key LIKE '_FDatasSU%' 
				AND IFNULL((_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, dg.Value, '', '') = tuai.In_Datas_Hash), FALSE)
			;
			*/
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua, `_db_globals` dg, `t_ua_inf_msg` tsm 
			SET
				tsm.S_Yes = NOT(@.PSWD.OK := TRUE),
				tuai.IN_Mode = CONCAT(tuai.IN_Mode, ':', dg.key)
			WHERE
				tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT tuai.Oper_Status LIKE 'ERR%' 	-- tylko dla na razie popranego procesu - gdy był już jakiś error to nie wykonujemy tego update bo po co? 
				-- było do 29 III 2021 AND tuai.Verify_Status LIKE 'ERR%'
				-- AND tuai.Verify_Status = 'ERR.Pswd'
				AND tuai.IN_Mode LIKE '%#Login,#Pswd%'
				AND ua.OsobaGUID = tuai.UserGUID
				AND tsm.S_Status = 'ERR.Pswd'
				AND tsm.S_Yes -- Czyli dla nie poprawnego hasła z UPDATE wyżej 
				AND dg.key LIKE '_FDatasSU%' 
				AND IFNULL((_MD5_CHARSET('', tuai.SALT, tuai.PEPPER, dg.Value, '', '') = tuai.In_Datas_Hash), FALSE)
			;
		--	Zwieksz licznik błędnego logowania
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua, `_db_globals` dg, `t_ua_inf_msg` tsm 
			SET
			--	no i wreszcie b.wazne - err_logon_count!!!!!
				ua.err_logon_count = (@.ua.err_logon_count := 
					IF(tsm.S_Yes, -- czyli gdy @.PSWD.OK = FALSE, 
					-- 	Czyli dla nie poprawnego hasła z UPDATE wyżej 
						ua.err_logon_count + 1,  -- zwiększ o 1
						0  -- wróć na zero bo poprawne logowanie
					)),
				ua.ExtFlags = 
					IF(@.ua.err_logon_count < @.auth.Max_User_Err_logon_count,
						-- na razie jest OK i nic nie zmieniaj
						ua.ExtFlags,
						-- oj juz osoiagnieto limit...
						IF(ua.ExtFlags LIKE '%<err_logon_count.temp>%',
							-- juz byla czasowa szansa - wstaw '<err_logon_count>'
							CONCAT_WS('', 
								NULLIF(REPLACE(REPLACE(ua.ExtFlags, '<err_logon_count.temp>', ''), '<err_logon_count>', ''), ''),
								'<err_logon_count>' 
							),
							-- na razie nie bylo szansy - zatem wstaw szanse czasową - wstaw '<err_logon_count.temp>'
							CONCAT_WS('', 
								NULLIF(REPLACE(REPLACE(ua.ExtFlags, '<err_logon_count.temp>', ''), '<err_logon_count>', ''), ''),
								'<err_logon_count.temp>' 
							)
						)
					)

					
			WHERE
				tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT tuai.Oper_Status LIKE 'ERR%' 	-- tylko dla na razie popranego procesu - gdy był już jakiś error to nie wykonujemy tego update bo po co? 
				AND tuai.IN_Mode LIKE '%#Login,#Pswd%'
				AND ua.OsobaGUID = tuai.UserGUID
				AND tsm.S_Status = 'ERR.Pswd'
			;
		--	Gdy logowanie OK ale z pustym hasłem - wstaw flagę <Empty.PSWD>
			UPDATE `t_ua_inf` tuai, `_user_accounts` ua, `_db_globals` dg, `t_ua_inf_msg` tsm 
			SET
			--	no i wreszcie b.wazne - err_logon_count!!!!!
				ua.ExtFlags	= 
						CONCAT_WS('', 
							NULLIF(REPLACE(ua.ExtFlags, '<Empty.PSWD>', ''), ''),
							'<Empty.PSWD>' 
						)
			WHERE
				tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT tuai.Oper_Status LIKE 'ERR%' 	-- tylko dla na razie popranego procesu - gdy był już jakiś error to nie wykonujemy tego update bo po co? 
				-- AND tuai.IN_Mode LIKE '%#Login,#Pswd%'
				AND ua.OsobaGUID = tuai.UserGUID
				AND tsm.S_Status = 'WARN.Empty.PSWD' 
				AND IFNULL(tsm.S_Yes, 0)	-- gdy wystapił warning
			;
			
			/* ***************************************************************************************************************************
				Jeśli mamy IN_Mode LIKE 'AUTH.SESSION:% czyli sama autoryzacja 
				ale gdzie konieczna jest sesja wejściowa do porównania czy w sesji siedzi weryfikowany 
				to sprawdź poprawność danych z ta sesją - (gdy null to wogóle wypad)
			****************************************************************************************************************************/
			SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
			IF @.ALL.Errors = 0 THEN
				UPDATE `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
				SET
					tsm.S_Yes = (@.Last.S_Yes := 
						NOT (
							NULLIF(tuai.IN_Session_GUID, '') IS NOT NULL
							AND
							EXISTS(
								SELECT
									sdl.GUID
								FROM `_sys_db_logons` sdl
								WHERE
									sdl.GUID = NULLIF(tuai.IN_Session_GUID, '')
									AND NOT sdl.Inactive
									AND sdl.log_USER_GUID = tuai.UserGUID	-- zgodność USERA sesji z weryfikowanym
							)
						)
					)
				WHERE
					TRUE
					AND (tuai.IN_Mode LIKE '%AUTH.SESSION:%') --	i autoryzacji z sesją
					AND tsm.S_Status = 'ERR.bad.session'
					
				;
			END IF;
		END IF;
		CALL _user_accounts_inf('Summary', '', '', @.tuai.Params); 
	END IF;
	
	IF _MODE IN ('Check.Modules') THEN
	/******************************************************************************************************************************************
		Weryfikacja dostepu do modułów
		UWAGA 
		App_ID nie jest wymagane ale gdy poda się to jest sprawdzane czy istnieje moduł. 
		Jeśli nie istnieje przepuszczamy ale gdy istnieje to sprawdzamy dostęp!!!
		UWAGA inicjalnie App_ID jest NULL i gdy nie znajdziemy żadnej aplikacji (modułu) czyli pozostanie NULL 
		to nie spr. dostepu czyli Verify_Access_available <- TRUE
		ZATEM...
		juz tutaj może byc 
			Verify_Access_available = TRUE - wtedy prawie wszystkie poniższe UPDATE sa przezroczyste
	******************************************************************************************************************************************/
	--	Najpierw nazwa grupy dostepowek	
		SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
		
		IF @session.LOGON.Check.Limit.Ver IS NULL THEN
			CALL _Globals_Get('LOGON.Check.Limit.Ver', @session.LOGON.Check.Limit.Ver, '1.0');
		END IF;
		-- 12 XII 2023 IF @session.LOGON.Ver < '2022.21' THEN	
		IF @session.LOGON.Check.Limit.Ver < '2023.12' THEN
			UPDATE `t_ua_inf` tuai
			LEFT JOIN `_sys_app_reg` c ON c.ID = tuai.APP_ID
			LEFT JOIN `osoby` o ON o.GUID = tuai.APP_ID
			SET
				tuai.APP_ID_GRP_Dost_Name = IFNULL(c.Caption, o.Nazwisko)
			WHERE
				IFNULL((@.tuai.APP_ID := tuai.APP_ID), '') <> ''		-- potrzebuje poniżej techn zmiennej @.tuai.APP_ID
			;
			SELECT tuai.IN_MODE, tuai.Oper_Mode, tuai.User_Is_jmam INTO @.tuai.IN_MODE, @.tuai.Oper_Mode, @.tuai.User_Is_jmam FROM `t_ua_inf` tuai;
			SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
			-- SET @.Check.Modules.Needs = (ROW_COUNT() > 0) AND @.tuai.APP_ID IS NOT NULL;
			SET @.Check.Modules.Needs = 
				@.tuai.APP_ID IS NOT NULL
				AND @.ALL.Errors = 0 
				AND @.tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
				AND NOT (@.tuai.IN_Mode LIKE '%ADD.BIO%')
			;
		END IF;
		-- 12 XII 2023 IF @session.LOGON.Ver >= '2022.21' THEN	
		IF @session.LOGON.Check.Limit.Ver >= '2023.12' THEN
			UPDATE `t_ua_inf` tuai -- , `grupy_osob` go 
			LEFT JOIN `_sys_app_reg` c ON c.ID = tuai.APP_ID
			LEFT JOIN `osoby` o ON o.GUID = tuai.APP_ID
			SET
				tuai.APP_ID_GRP_Dost_Name = IFNULL(c.Caption, o.Nazwisko),
				tuai.Check_Modules = (@.tuai.Check_Modules := 
				--	Dostęp do modułów sprawdzamy gdy ...
					TRUE
					AND tuai.APP_ID IS NOT NULL	-- APP_ID jest określona
				--	gdy tuai.In_APP_ACCESS ... 
				--		0/1 czyli został wstępnie ustawiony z param. wej. z aplikacji to ta wartość obowiązuje!
				--		NULL czyli nie został wstępnie ustawiony z aplikacji to bierz z `_sys_app_reg`
					AND IFNULL(tuai.In_APP_ACCESS, IFNULL(c.Check_Access, 1))
					AND NOT tuai.User_Is_jmam	-- dla jmam nie spr. dostępu do modułów
					AND tuai.Oper_Mode IN ('<LOG>', '<AUTH>')
					AND NOT (tuai.IN_Mode LIKE '%ADD.BIO%')
				)
			WHERE
				TRUE
			;
			SET @.Check.Modules.Needs = 
				@.tuai.Check_Modules
				AND @.ALL.Errors = 0 		-- nie było dotych. błędu 
			;
		END IF;
		IF @.Check.Modules.Needs THEN
		IF TRUE THEN
		/*
			Ze względu na cholerne ....
			The Can't reopen table error also occurs if you refer to a temporary table multiple times in a stored function 
			under different aliases, even if the references occur in different statements within the function. 
			It may occur for temporary tables created outside stored functions and referred to across multiple 
			calling and callee functions.
			...[]
			wolamy tu 
			CALL _sys_app('M.Dostep.Check.SET->@', @.tuai.UserGUID, @.tuai.APP_ID, '', @.tuai.In_APP_VER, '');
			a w cześci false stary algorytm
		*/
			SET
				@.tuai.UserGUID = NULL,
				@.tuai.APP_ID = NULL
			;
			SELECT
				tuai.UserGUID,
				tuai.APP_ID,
				tuai.In_APP_VER,
				In_APP_verYMDN
			INTO
				@.tuai.UserGUID,
				@.tuai.APP_ID,
				@.tuai.In_APP_VER,
				@.tuai.In_APP_verYMDN
			FROM `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
			WHERE
				tuai.Oper_Status LIKE 'OK%'
				AND tsm.S_Status = 'ERR.Access.Module'
				AND tsm.S_Yes IS NULL -- dla nie powodzenia
			;
			/*	było
			CALL _Moduly_Grupy('Moduly.Dostep.Prepare<-UserGUID+APP_ID', @.tuai.UserGUID, @.tuai.APP_ID, '', '', '');
			CALL _Moduly_Grupy('Moduly.Dostep.Prepare', '', '', '', '', ''); 
		--	Naliczenie do zmiennych @.Moduly.MODULE.OK, @.Moduly.Link_Status_Descr.Err i @.Moduly.Link_Status_Descr.OK, @.Moduly.LowVersion.Warning	
			CALL _Moduly_Grupy('Moduly.Dostep.SET->@', '', '', '', '', ''); 
			*/
			/* po nowemy 2022-06-23 */
			CALL _sys_app('M.Dostep.Check.SET->@', @.tuai.UserGUID, @.tuai.APP_ID, @.tuai.In_APP_verYMDN, @.tuai.In_APP_VER, '');
			SET @.MODULE.OK = @.Moduly.MODULE.OK;
			UPDATE `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
			SET
				tsm.S_Yes = 
					IF(tsm.S_Status = 'ERR.Access.Module',
						NOT @.MODULE.OK,	-- brak dostepu czyli Err
						@.MODULE.OK			-- jest dostep
					)
			WHERE
				tuai.Oper_Status LIKE 'OK%'
				AND tsm.S_Status IN ('ERR.Access.Module', 'LOG.Access.Module')
				AND tsm.S_Yes IS NULL -- dla nie powodzenia
			;
		-- 	dla nie powodzenia pobierz z listy dostepowej opis niepowodzeń grup ...
			UPDATE `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
			SET
				tsm.S_Msg = _VarStr(@.Moduly.Link_Status_Descr.Err)
			WHERE
				tuai.Oper_Status LIKE 'OK%'
				AND tsm.S_Status = 'ERR.Access.Module'
				AND tsm.S_Yes = 1
			;
		-- 	a dla pomyslnego także pobież bo wskażemy z jakie grupy sie dostałes ale nie pokazujemy w komunikacie tylko do sesji
			UPDATE `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
			SET
				tsm.S_Msg = _VarStr(@.Moduly.Link_Status_Descr.OK)
			WHERE
				tuai.Oper_Status LIKE 'OK%'
				AND tsm.S_Status = 'LOG.Access.Module'
				AND tsm.S_Yes = 1
			;
		--	jeszcze komunikat o starszej wersji programu @.Moduly.LowVersion.Warning	
			UPDATE `t_ua_inf` tuai, `t_ua_inf_msg` tsm 
			SET
				tsm.S_Yes = 1,
				tsm.S_Msg = REPLACE(REPLACE(tsm.S_Msg,
					'#USER.APP.VER#', @.tuai.In_APP_VER),
					'#CURR.APP.VER#', @.Moduly.Prog_Version)
			WHERE
				tuai.Oper_Status LIKE 'OK%'
				AND @.MODULE.OK
				AND @.Moduly.LowVersion.Warning
				AND tsm.S_Status = 'WARN.Access.Module.VER'
			;
				
		ELSE
						SET @.x = '4.1;';
		END IF;
						SET @.x = '4.7;';
			SET @.Access_MODULE.Params =
				CONCAT_WS('&',
						CONCAT('Oper_Status_Msg=', IF(@.MODULE.OK, NULL, 'Nie masz dostępu do tego modułu!'))
				)
			;
						SET @.x = '4.8;';
			CALL _user_accounts_inf('Summary', '', '', @.Access_MODULE.Params); 
						SET @.x = '4.9;';
		END IF;
	END IF;
	
	IF _MODE IN ('Check.Limit.Log') AND (@session.globals.Owner <> 'CDG') THEN
	/******************************************************************************************************************************************
		Weryfikacja limitu logowania
		ale tylko dla Oper_Mode IN ('<LOG>', '<AUTH>')
	******************************************************************************************************************************************/
	--	spr. czy Oper_Mode IN ('<LOG>', '<AUTH>')
		SELECT tuai.Oper_Mode, tuai.User_Is_jmam INTO @.tuai.Oper_Mode, @.tuai.User_Is_jmam FROM `t_ua_inf` tuai;
	--	było do 25 V 2022 	IN ('<LOG>', '<AUTH>')  ALE przeciez autoryzacja to tylko popr. loginu i hasła a nie sprawdzanie limitów jak przy logowaniu
	--	IF @.tuai.Oper_Mode IN ('<LOG>', '<AUTH>') AND NOT @.tuai.User_Is_jmam THEN
		IF @.tuai.Oper_Mode IN ('<LOG>') AND NOT @.tuai.User_Is_jmam THEN
			IF @session.LOGON.Check.Limit.Ver IS NULL THEN
				CALL _Globals_Get('LOGON.Check.Limit.Ver', @session.LOGON.Check.Limit.Ver, '1.0');
			END IF;
			-- 12 XII 2023 IF @session.LOGON.Ver < '2022.21' THEN
			IF @session.LOGON.Check.Limit.Ver < '2023.12' THEN
			--	Najpierw rekord inf. logowań
				SET @.C_Ext_Flag_PROGRAMISTA = 'SUPERVISOR';
								SET @.x = '5.1;';
				DROP TEMPORARY TABLE IF EXISTS `t_Sessions_ACTIVE`;
				/* */
				CREATE TEMPORARY TABLE `t_Sessions_ACTIVE`
				SELECT 
					_VarInt(COUNT(*)) AS C_ALL,
					_VarInt(IFNULL(SUM(
						(sdl.Kind != 'EVENT')
					), 0)) AS C_Users, 	--	Do INT-owcow zaliczamy a)	logowanie na int'',		b)	zalogowany nie na 'int' ale z USER_CALL lub 	c)	z USER_GUID
					_VarInt(SUM(
						(sdl.Kind = 'EVENT')
					)) AS C_Event, 	--	Do INT-owcow zaliczamy a)	logowanie na int'',		b)	zalogowany nie na 'int' ale z USER_CALL lub 	c)	z USER_GUID
					_VarInt(SUM(
						(sdl.log_USER = 'jmam') AND 
						(
							(IFNULL(sdl.log_USER, '') != '') OR
							(IFNULL(sdl.log_USER_GUID, '') != '')
						)	
					)) AS C_jmam_MOTLAWA, 	--	Do INT-owcow zaliczamy a)	logowanie na int'',		b)	zalogowany nie na 'int' ale z USER_CALL lub 	c)	z USER_GUID
					_VarInt(SUM(
						(sdl.log_USER = 'jmam') AND (sdl.Ext_Flag != @.C_Ext_Flag_PROGRAMISTA) AND
						(
							(IFNULL(sdl.log_USER, '') != '') OR
							(IFNULL(sdl.log_USER_GUID, '') != '')
						)	
					)) AS C_jmam_MOTLAWA_Non_Supervisor, 	--	Do INT-owcow zaliczamy a)	logowanie na int'',		b)	zalogowany nie na 'int' ale z USER_CALL lub 	c)	z USER_GUID
					_VarInt(0) AS C_LIMIT,
					DATE('0000-00-00') AS C_LIMIT_DATE_START,
					DATE('0000-00-00') AS C_LIMIT_DATE_MAX,
					_VarInt(0) AS C_LIMIT_GRACE,
					CAST('' AS CHAR(1024)) AS C_LIMIT_MSG_ERR,
					CAST('' AS CHAR(1024)) AS C_LIMIT_MSG_GRACE,
					CAST('' AS CHAR(1024)) AS C_LIMIT_MSG_WARRNING,
					CAST('' AS CHAR(1024)) AS C_LIMIT_MSG_EXTRA,
					_VarInt(0) AS C_Over,
					_VarInt(NULL) AS C_Grace_Between_Range,
					_VarStr(NULLIF('xxxxxxxxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxxxxx')) AS C_Status
				FROM `_sys_db_logons` sdl
				WHERE
					sdl.INACTIVE = 0
					AND IF(@session.globals.Owner = 'AMICUS', sdl.Status = 'ACTIVE', TRUE)
					AND sdl.PING_AT > NOW() - INTERVAL 20 DAY
					AND sdl.log_USER <> 'jmam'
					AND sdl.STATUS <> 'NEW'
					AND sdl.Kind <> 'EVENT'
					AND sdl.Ext_Flag != @.C_Ext_Flag_PROGRAMISTA	-- != 'SUPERVISOR'
				;
				UPDATE `t_Sessions_ACTIVE` sa
				SET
					
					C_LIMIT = _VarInt(IFNULL((SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT'), 999)),
					C_LIMIT_DATE_START = DATE((SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_DATE_START')),
					C_LIMIT_DATE_MAX = DATE((SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_DATE_MAX')),
					C_LIMIT_GRACE = _VarInt((SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_GRACE')),
					
					C_LIMIT_MSG_ERR = (SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_MSG_ERR'),
					C_LIMIT_MSG_GRACE = (SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_MSG_GRACE'),
					C_LIMIT_MSG_WARRNING = (SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_MSG_WARRNING'),
					C_LIMIT_MSG_EXTRA = (SELECT gl.Value FROM _db_globals gl WHERE gl.key = 'CONNECT_LIMIT_MSG_EXTRA')
				;
				-- to tylko test UPDATE `t_Sessions_ACTIVE` sa set C_Users = 10;
				
								SET @.x = '5.2;';
				UPDATE `t_Sessions_ACTIVE` sa
				SET
					sa.C_Over = (@.sa.C_Over := sa.C_Users - sa.C_LIMIT),
					sa.C_Grace_Between_Range = (@.sa.C_Grace_Between_Range := (CURRENT_DATE() BETWEEN sa.C_LIMIT_DATE_START AND sa.C_LIMIT_DATE_MAX)),
					sa.C_Status = 
						IF(@.sa.C_Over < 0,
							'OK',
							IF(@.sa.C_Over = 0,
								'OK.ZERO.WARRNING',
								IF(@.sa.C_Over > sa.C_LIMIT_GRACE,
									'ERR',	-- GRACE nie wystarcza
									IF(@.sa.C_Grace_Between_Range,
										'OK.GRACE.WARRNING',
										'ERR.GRACE.DATE'
									)
								)
							)
						),
					sa.C_LIMIT_MSG_ERR = REPLACE(REPLACE(REPLACE(sa.C_LIMIT_MSG_ERR, 
						'#C_COMPARE_VALUE', _VarStr(sa.C_Users)), '#C_CONNECT_LIMIT', _VarStr(sa.C_LIMIT)), '#C_LIMIT_OVER', _VarStr(@.sa.C_Over)), 
					sa.C_LIMIT_MSG_ERR = REPLACE(REPLACE(REPLACE(sa.C_LIMIT_MSG_ERR, 
						'#C_COMPARE_VALUE', _VarStr(sa.C_Users)), '#C_CONNECT_LIMIT', _VarStr(sa.C_LIMIT)), '#C_LIMIT_OVER', _VarStr(@.sa.C_Over)), 
					sa.C_LIMIT_MSG_GRACE = REPLACE(REPLACE(REPLACE(sa.C_LIMIT_MSG_GRACE, 
						'#C_COMPARE_VALUE', _VarStr(sa.C_Users)), '#C_CONNECT_LIMIT', _VarStr(sa.C_LIMIT)), '#C_LIMIT_OVER', _VarStr(@.sa.C_Over)),
					sa.C_LIMIT_MSG_WARRNING = REPLACE(REPLACE(REPLACE(sa.C_LIMIT_MSG_WARRNING, 
						'#C_COMPARE_VALUE', _VarStr(sa.C_Users)), '#C_CONNECT_LIMIT', _VarStr(sa.C_LIMIT)), '#C_LIMIT_OVER', _VarStr(@.sa.C_Over))
				;
		SET @.x = '5.3;';
			--	Teraz dodaj odp. rekord do `t_ua_inf_msg` o ILE JEST nie OK czyli <> 'OK'
				INSERT IGNORE INTO `t_ua_inf_msg`
				(S_Status, S_type, S_Yes, S_LP, S_Msg)
				SELECT
					CONCAT(IF(sa.C_Status LIKE '%Err%', 'ERR.', 'WARN.'), sa.C_Status) AS S_Status,
					IF(sa.C_Status  LIKE '%Err%', 'ERROR', 'WARNING') AS S_type,
					1 AS S_Yes,	-- od razu zaznaczam 1
					400 AS S_LP,
					CONCAT_WS('\n', 
					CASE sa.C_Status 
						WHEN 'OK' THEN ''
						WHEN 'OK.ZERO.WARRNING' THEN sa.C_LIMIT_MSG_WARRNING
						WHEN 'OK.GRACE.WARRNING' THEN sa.C_LIMIT_MSG_GRACE
						WHEN 'ERR.GRACE.DATE' THEN sa.C_LIMIT_MSG_ERR -- powinno byc cos o datach sa.LIMIT_MSG_WARRNING
						WHEN 'ERR' THEN sa.C_LIMIT_MSG_ERR
						ELSE 'OK'
					END,
					IF(sa.C_Status != 'OK', sa.C_LIMIT_MSG_EXTRA, NULL)	-- nie dodajemy extra msg gdy OK
					) AS S_Msg
				FROM `t_Sessions_ACTIVE` sa
				WHERE 
					sa.C_Status <> 'OK'
				;
												SET @.x = '5.4;';
				-- CALL _user_accounts_inf('Summary', '', '', @.Access_MODULE.Params); 
				CALL _user_accounts_inf('Summary', '', '', ''); 
			END IF; 	-- @session.LOGON.Ver < '2022.21'
			
			-- 12 XII 2023 IF @session.LOGON.Ver >= '2022.21' THEN
			IF @session.LOGON.Check.Limit.Ver >= '99999.2023.12' THEN
			--	Zamknij nieużywane sesje ...
				CALL _sessions_SEL('SPEC.TIME.CLEAR.EVENT', '', '', '','');
				DO _counters_tools('INC', 'Check.Limit.Log', '', '');		-- to tylko Licznik!!!!
			--	Ustaw liczniki w `_sys_db_logons_agg` na podstawie sesji tylko akt. sesji ...
				CALL _sys_db_logons_agg_tools('UPDATE.NOW', '', '', '', '', '');
			--	i pobierz ewent. przelroczenia to temp. `t_limit_M`
				CALL _sys_db_logons_agg_tools('GET.t_limit_M', '', '', '', '', '');
			--	Teraz ustaw odp. rekord w `t_ua_inf_msg` o ILE w ogóle JEST coś w `t_limit_M` 
				UPDATE `t_ua_inf_msg` tsm, `t_ua_inf` tuai, `t_limit_M` t
				SET
					tsm.S_Yes = 1,
					tsm.S_Msg =
					REPLACE(REPLACE(REPLACE(REPLACE(tsm.S_Msg,
						'#CC#', t.ActSessions),
						'#LIMIT#', t.Limit),
						'#LIMIT_GRACE#', t.LimitGrace),
						'#DATE_MAX_GRACE#', _VarStr(_Format_DT(t.DATE_MAX_GRACE, '[DZ][DW]%a %d %b %YH')))
				WHERE
					tsm.S_Status = t.SMsg
					AND tuai.Oper_Mode IN ('<LOG>')
					AND tuai.Oper_Status = 'OK'
				;
			
				CALL _user_accounts_inf('Summary', '', '', ''); 
			END IF;		-- @session.LOGON.Ver >= '2022.21'
		END IF;
	END IF;

	IF _MODE IN ('ADD.BIO.ID') THEN
	/******************************************************************************************************************************************
		Dodanie ID biometrycznego
	******************************************************************************************************************************************/
	--	Najpierw nazwa grupy dostepowek	
		SELECT 
            tuai.IN_MODE, tuai.Oper_Mode, tuai.DEV_ID, tuai.User_Is_jmam 
		INTO 
            @.tuai.IN_MODE, @.tuai.Oper_Mode, @.tuai.DEV_ID, @.tuai.User_Is_jmam
        FROM `t_ua_inf` tuai 
        ;
		SET @.ALL.Errors = IFNULL((SELECT SUM(IFNULL(tsm.S_Yes, 0)) FROM `t_ua_inf_msg` tsm WHERE S_type = 'ERROR'), 0);
		IF 
			@.tuai.DEV_ID IS NOT NULL
			AND @.ALL.Errors = 0 
			AND @.tuai.Oper_Mode IN ('<AUTH>')
			AND @.tuai.IN_Mode LIKE '%ADD.BIO%'
		THEN
			REPLACE `_sys_Id_Device` (ID, ID_Type, LAST_USED, Descr) 
			SELECT 
				tuai.DEV_ID AS ID, 
				'McAddr' AS ID_Type,
				NOW(),
				'Id Bio-metr.' AS Descr
			FROM `t_ua_inf` tuai 
			;
			INSERT IGNORE INTO `hr_cards`
			(ID, Kind, res_type, OsobaGUID)
			SELECT 
				tuai.DEV_ID AS ID, 
				'MACADDRESS' AS Kind,
				'HR' AS res_type,
				tuai.UserGUID AS OsobaGUID
			FROM `t_ua_inf` tuai 
			;
		END IF;
	END IF;
	
	IF _MODE IN ('to.LOG') THEN
	/*
		np. Aktywacja
			CALL _user_accounts_inf('to.LOG', 0, '', '', '', 402, '', '', '');
			zapomnialem hasla
			CALL _user_accounts_inf('to.LOG', 0, '', '', '', 404, '', '', '');
		_PARAM_A - miejsce		(100)
		_PARAM_B - czynność
			CALL _user_accounts_inf('to.LOG', '', '', @.tuai.Params); 
			401, 'Kereowanie konta', 'Kreowanie
			402, 'Email - aktywacja mailowa konta
			403, 'Aktywacja konta i nadanie hasła
			404, 'Email - zapomniane hasło
			405, 'Zmiana hasła z emaila
			410, 'Zablokowanie konta
			411, 'Odblokowanie konta
	*/
	SET @.X.log = '1';
		SET 
			@.account.Log.Miejsce = IFNULL(NULLIF(_PARAM_A, ''), 100) 	-- 100 lub 302 to "Konto użytkownika")
			-- @.account.Log.Czynnosc = IFNULL(NULLIF(_PARAM_B, ''), 3)
		;
	SET @.X.log = '2';
		CREATE TEMPORARY TABLE IF NOT EXISTS `t_log_guids` (guid VARCHAR(38), info TEXT) ENGINE=MYISAM ; 
		TRUNCATE `t_log_guids`; 
		INSERT INTO `t_log_guids` 
		SELECT 
			tuai.UserGUID, 
			IF((@.account.Log.Czynnosc := tuai.Log_Czynnosc) IS NULL, 
				tuai.Oper_Status_Msg,
				tuai.Oper_Status_Msg
			)
		FROM `t_ua_inf` tuai
		;
	SET @.X.log = '3';
		-- CALL log_Insert('INS.Session', @_Idn, '', @.account.Log.Miejsce, @.account.Log.Czynnosc, '', '', '', 'osoby'); -- 100 to "Konto użytkownika")
	END IF;

	IF _MODE IN ('<SELECT>') THEN
		SELECT 
			tuai.Oper_Status_Msg AS Actv_Status_Msg,
			tuai.Oper_Status AS Actv_Status,
			tuai.* 
		FROM `t_ua_inf` tuai
		;
	END IF;
	
END$$

DELIMITER ;

/*
$Log: _user_accounts_inf.sql,v $
Revision 1.18  2025/03/31 10:09:22  jmam
$send$ c.d. poprawki po Waliant + polskie znaki

*/

/*
====================================================================================================================================================================================
	NOTATNIK
====================================================================================================================================================================================

select * FROM `_res_strings` WHERE ID LIKE 'account_spec_msg.%';

DELETE FROM `_res_strings` WHERE ID LIKE 'account_spec_msg.%';
INSERT IGNORE INTO `_res_strings`
(ID, T)
VALUES
('account_spec_msg.ERR.NO.USER;100', 'Brak takiego konta użytkownika'),
('account_spec_msg.ERR.account.inactive;105', 'Konto jest nieaktywe!'),
('account_spec_msg.ERR.account.expired;110', 'Konto nieaktywne!\n#MSG.ERR.account.expired#'),
('account_spec_msg.ERR.account.user_type.ZERO;115', 'Twoje konto nie pozwala na logowanie do aplikacji! Skontaktuj się z administratorem by zmienił ustawienia Twojego konta.'),
('account_spec_msg.ERR.account.No.Activate;120', 'Konto nie było przez Ciebie aktywowane - sprawdź email z odpowiednim linkiem!'),
('account_spec_msg.ERR.account.Reset;125', 'Konto wymaga ustawienia hasła (opcja "zapomniałem hasła").'),
('account_spec_msg.ERR.err_logon_count;130', 'Konto jest zablokowane - niepoprawnych autoryzacji: #actual_try_attempt_pre#.'),
('account_spec_msg.ERR.err_logon_count_temp;131', 'Konto jest czasowo zablokowane - niepoprawnych autoryzacji: #actual_try_attempt_pre#. Spróbuj ponownie#Wait_for_Log#.'),
('account_spec_msg.ERR.RODO.Need.Change.PSWD;135', 
	CONCAT_WS('', 
		'Ze względu na przepisy RODO wymagana jest okresowa zmiana hasła.\n',
		'#ERR.RODO.Need.Change.PSWD.Kiedy# ',
		'upłynął termin obowiązywania aktualnego hasła i aby się logować konieczna jest zmiana hasła!\n'
		'Proszę wprowadzić nowe - zmienione - hasło!'
	) 
),
('account_spec_msg.ERR.Empty.PSWD;140', 'Ze względu na wdrożenie dyrektywy RODO \npuste hasła nie są akceptowane!\nWybierz opcje "Zapomniałem hasła" by ustawić nowe niepuste hasło lub \nskontaktuj się z administraorem.'),

--	<SetUp.New><SetUp.Reset>	
('account_spec_msg.ERR.DISABLED.Zapomnialem;5', 'Funkcja jest niedostępna w systemie!'),
('account_spec_msg.ERR.Empty.Email;151', 'Niepoprawny login lub brak adresu e-mial na Twoim koncie. \nKoniecznie skontaktuj sie z administratorem w celu zmiany lub uzupełnienia danych.'),
('account_spec_msg.ERR.Unknown.Email;152', 'Próba aktywacji konta z nieznanego adresu mailowego!'),
-- <confirm.SetUp.New><confirm.SetUp.Reset><Change>
('account_spec_msg.ERR.Empty.Input.PSWD;10', 'Wprowadzane hasło nie może być puste'),
('account_spec_msg.ERR.1.raz;161', 'Operacja zmiany hasła z maila jest jednorazowa - \npowtórne jej wykorzystanie jest niemożliwe -\ndlatego zmiana hasła nie powiodła się!!'),
('account_spec_msg.ERR.Bylo.Aktywowane;162', 'Konto było już aktywowane - i jest to operacja jednorazowa - dlatego zmiana hasła nie powiodła się!'),
('account_spec_msg.ERR.PSWD;163', '#When_Invslid_Attempt_Msg#'),
('account_spec_msg.ERR.PSWD.MUST.BE.DIFFERENT;164', 'Nowe hasło musi się różnić od aktualnego!'),
('account_spec_msg.ERR.PSWD.WAS.IN.USE;165', 'Podane do zmiany hasło było już wcześniej w użyciu!'),
--	warnings	
('account_spec_msg.WARN.Empty.PSWD;200', 'UWAGA! Ze względu na wdrożenie dyrektywy RODO \npuste hasła nie są akceptowane!\nUstaw nowe hasło (uwaga - logowanie z pustym hasłem jest jednorazowe - po tym komunikacie następne logowanie z pustym hasłem nie będzie juz możliwe) lub \nskontaktuj się z administraorem.'),
('account_spec_msg.WARN.RODO.Need.Change.PSWD;205', 
	CONCAT_WS('', 
		'UWAGA! Ze względu na przepisy RODO wymagana jest okresowa zmiana hasła.\n',
		'#OK.RODO.Need.Change.PSWD.Kiedy# ',
		'upływa termin obowiązywania aktualnego hasła, w następnych dniach hasło przestanie obowiązywać!\n',
		'Wymagana będzie zmiana hasła!'
	) 
),
('account_spec_msg.ERR.Bad.Session;300', 'Sesja której dot. autoryzacja nie istnieje bądź wygasła.'),
('account_spec_msg.ERR.Access.Module;305', '#Err.Access.Module#'),
('account_spec_msg.LOG.Access.Module;305', '#OK.Access.Module#'),
('account_spec_msg.WARN.Access.Module.VER;306', 'Jest nowsza wersja aplikacji której używasz (#USER.APP.VER#), sugeruje się wymianę na wersję co najmniej #CURR.APP.VER#.'),
('account_spec_msg.ERR.Access.Module.Disabled;307', 'Aplikacja ta została wycofana z użytkowania, wznowienie działania wymaga zmian administracyjnych!')
;

INSERT IGNORE INTO `_res_strings`
(ID, T)
VALUES
('account_spec_msg.WARN.Access.Module.VER;306', 'Jest nowsza wersja aplikacji której używasz (#USER.APP.VER#), sugeruje się wymianę na wersję co najmniej #CURR.APP.VER#.')
;

INSERT IGNORE INTO `_res_strings`
(ID, T)
VALUES
('account_spec_msg.ERR.USER.BIO.ID;102', 'Nie zidentyfikowano urządzenia z danymi biometrycznymi'),
('account_spec_msg.ERR.USER.BIO.ID.OUT.OF.DATE;103', 'Ustawienia biometryczne na tym urządzeniu wymagają aktualizacji')
;

INSERT IGNORE INTO `_res_strings`
(ID, T)
VALUES
('account_spec_msg.ERR.Access.Module.Disabled;307', 'Aplikacja ta została wycofana z użytkowania, wznowienie działania wymaga zmian administracyjnych!')
;

INSERT IGNORE INTO `_res_strings`
(ID, T)
VALUES
('account_spec_msg.WARN.AUTO.TEMPORARY.PSWD;210', 
	CONCAT_WS('', 
		'UWAGA! Używasz hasła tymczasowego.\n',
		'#OK.TEMPORARY.PSWD.Kiedy# ',
		'upływa termin ważności aktualnego hasła, w następnych dniach hasło przestanie obowiązywać!\n',
		'Wymagana jest zmiana hasła, możesz to zrobić wybierając odpowiednia opcje w Twojej aplikacji!'
	) 
)
;
INSERT IGNORE INTO `_res_strings`
(ID, T)
VALUES
('account_spec_msg.WARN.AUTO.PSWD;210',
"UWAGA! Używasz hasła wygenerowanego automatycznie.
Zalecane jest ustawienie własnego hasła.
Możesz to zrobić wybierając odpowiednia opcje w Twojej aplikacji!" 
),
('account_spec_msg.WARN.AUTO.TEMPORARY.PSWD;211',
"UWAGA! Używasz hasła tymczasowego.
#OK.TEMPORARY.PSWD.Kiedy# upływa termin ważności aktualnego hasła, w następnych dniach hasło przestanie obowiązywać!
Wymagana jest zmiana hasła, możesz to zrobić wybierając odpowiednia opcje w Twojej aplikacji!"
),
('account_spec_msg.ERR.AUTO.TEMPORARY.PSWD;212', 
"UWAGA! #ERR.TEMPORARY.PSWD.Kiedy# upłynął termin obowiązywania tymczasowego hasła i aby się logować konieczna jest zmiana tego hasła!
Proszę wprowadzić nowe - zmienione - hasło!"
)
;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
