 DELIMITER $$


/* ************************************************************************************************************************************************************************
	2.0 Pobieranie uprawnien
************************************************************************************************************************************************************************ */	
DROP FUNCTION IF EXISTS `User_Upr`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `User_Upr`(
	_MODE VARCHAR(255),
	_Miejsce VARCHAR(200),
	_OsobaGUID VARCHAR(38),
	_Param_A VARCHAR(255),
	_Param_B VARCHAR(255)
) 
RETURNS INTEGER
	DETERMINISTIC
	COMMENT 'Zwraca Poziom'
S_User_Upr: BEGIN
	IF _MODE IN ('', 'GET') THEN
		SET 
			@.UPR.Poziom = NULL,
			@.UPR.Search = _Miejsce,
			@.UPR.UserGUID = _OsobaGUID,
			@.UPR.Admin = NULL, @.UPR.Self = NULL, @.UPR.Brak = NULL
		;
		SELECT		
			5 AS Poziom,
			ua.Admin,
			NULL AS Self,
			NULL AS Brak
		INTO
			@.UPR.Poziom, @.UPR.Admin, @.UPR.Self, @.UPR.Brak
		FROM `_user_accounts` ua
		INNER JOIN `uprawnienia_dict` ud ON ud.Miejsce = @.UPR.Search
		WHERE
			TRUE
			AND ua.OsobaGUID = @.UPR.UserGUID
			AND IFNULL(ua.Status, 0) = 0
			AND ua.Admin = 1
			AND ud.Miejsce = @.UPR.Search
		;		
		IF @.UPR.Poziom IS NOT NULL THEN
			RETURN @.UPR.Poziom;
		ELSE
			SELECT
				u1.Poziom,
				@.UPR.Admin := ua.Admin,
				1 AS Self,
				0 AS Brak
			INTO
				@.UPR.Poziom, @.UPR.Admin, @.UPR.Self, @.UPR.Brak
			FROM `_user_accounts` ua
			INNER JOIN `uprawnienia` u1 ON u1.OsobaGUID = ua.OsobaGUID AND u1.Miejsce = @.UPR.Search
			WHERE
				TRUE
				AND ua.OsobaGUID = @.UPR.UserGUID
				AND IFNULL(ua.Status, 0) = 0
			;		
			IF @.UPR.Poziom IS NOT NULL THEN
				RETURN @.UPR.Poziom;
			ELSE
				SELECT
					IFNULL(MAX(uN.Poziom), 5) AS Poziom,
					ua.Admin,
					NULL AS Self,
					MAX(uN.Poziom) IS NULL AS Brak
				INTO
					@.UPR.Poziom, @.UPR.Admin, @.UPR.Self, @.UPR.Brak
				FROM `_user_accounts` ua
				INNER JOIN `grupy_osob` go ON go.OsobaGUID = ua.OsobaGUID 
				LEFT JOIN `uprawnienia` uN ON uN.OsobaGUID = go.GrupaGUID AND uN.Miejsce = @.UPR.Search
				WHERE
					TRUE
					AND ua.OsobaGUID = @.UPR.UserGUID
					AND IFNULL(ua.Status, 0) = 0
				GROUP BY @.UPR.Search, ua.OsobaGUID
				;		
				RETURN @.UPR.Poziom;
			END IF;
		END IF;
	END IF;
	
END
$$

/* ************************************************************************************************************************************************************************
	Pobieranie uprawnien
************************************************************************************************************************************************************************ */	
DROP FUNCTION IF EXISTS `_GetUprawnienie`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_GetUprawnienie`(
	_Miejsce VARCHAR(200),
	_OsobaGUID VARCHAR(38)
) 
RETURNS INTEGER
	DETERMINISTIC
	COMMENT 'Zwraca Poziom'
S_GetUprawnienie: BEGIN
	IF IFNULL(@session.Registration.Admin, IFNULL(@session.user.Admin, 0)) THEN
		RETURN 5;
		LEAVE S_GetUprawnienie;
	END IF;
	SET 
		_OsobaGUID = IFNULL(_OsobaGUID, ''),
		@u.poziom = 0
	;
	IF _OsobaGUID = '' THEN
		SET _OsobaGUID = IFNULL(@session.Registration.UserGUID, IFNULL(@SYSTEM.Client.Session.log_USER_GUID, ''));
	END IF;
	SET @u.poziom = NULL;
	SELECT 
		u.login, u.miejsce, u.poziom, u.rodzaj, u.opis, u.upr_type, u.core_id, g.osobaguid = g.grupaguid AS IsOsoba
	INTO
		@u.login, @u.miejsce, @u.poziom, @u.rodzaj, @u.opis, @u.upr_type, @u.core_id, @IsOsoba
	FROM `uprawnienia` u, `grupy_osob` g 
	WHERE 
		u.miejsce = _Miejsce
		AND u.osobaguid = g.grupaguid 
		AND g.osobaguid = _OsobaGUID
	ORDER BY IsOsoba DESC, poziom DESC 	
	LIMIT 1
	;
	SET @u.poziom = IFNULL(@u.poziom, 5);
	RETURN @u.poziom;
END
$$

DROP FUNCTION IF EXISTS `_GetUprawnienieExpected`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_GetUprawnienieExpected`(
	_Miejsce VARCHAR(200),
	_OsobaGUID VARCHAR(38),
	_Expected INTEGER
) 
RETURNS INTEGER
	DETERMINISTIC
	COMMENT 'Zwraca TRUE gdy uprawnienie = _Expected '
_GetUprawnienieExpected: BEGIN
	RETURN (_GetUprawnienie(_Miejsce, _OsobaGUID) = _Expected);
END
$$


DROP FUNCTION IF EXISTS `_Get_Upr_IS_OK`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_Get_Upr_IS_OK`(
	_MODE VARCHAR(250),		--	'BEFORE' lub 'AFTER' ma znaczenie dla EDIT
	_Oper VARCHAR(250),
	_User_Upr INTEGER,
	_IsReadOnly BOOLEAN,
	_IsSelfDoc BOOLEAN,
	_Ext_Miejsce VARCHAR(250),	-- dodatkowo gdy chcemy msg
	_Ext_Caption VARCHAR(250)	-- dodatkowo gdy chcemy msg
) 
RETURNS INTEGER
	DETERMINISTIC
	COMMENT 'Zwraca Poziom jest OK dla edycji i insert'
S_GetUprawnienie: BEGIN
	/***************************************************************************************************************************
		DO _Get_Upr_IS_OK('AFTER', 'EDIT', Upr, ReadOnly, SelfDoc, ExtMiejsce, _Ext_Caption);
	***************************************************************************************************************************/
	SET
		@.Upr.IS_OK.Warrning = '',
		@.Upr.IS_OK.Warrning.UP = @uprDSView,
		@.Upr.IS_OK = (_User_Upr >= @uprDSView),
		_IsReadOnly = IFNULL(_IsReadOnly, FALSE),
		_IsSelfDoc = IFNULL(_IsSelfDoc, FALSE)
	;	
	IF @.Upr.IS_OK THEN

		/*	UWAGA dla BEFORE 
			- gdy jesteśmy przed ('BEFORE') wgraniem dokumentu do edycji i 
			wiemy że jest view to puszczamy bo może po wgraniu okazać się że jest readonly i view wystarczy
			- oczywiście dla 'AFTER' badamy juz wszystko
		*/
		IF NOT _MODE LIKE 'BEFORE%' THEN	-- Czyli 'AFTER' (jest to zaszłośc po co to komu???
		
			IF _Oper LIKE 'INS%' THEN
				SET 
					@.Upr.IS_OK = (_User_Upr >= @uprDSInsert),
					@.Upr.IS_OK.Warrning.UP = @uprDSInsert
				;
			END IF;

			IF _Oper LIKE 'EDIT%' THEN
				SET 
					@.Upr.IS_OK = 
						(_User_Upr >= @uprDSEdit)
						OR
						((_User_Upr >= @uprDSEditSelf) AND _IsSelfDoc)
						OR
						((_User_Upr >= @uprDSView) AND _IsReadOnly),
					@.Upr.IS_OK.Warrning.UP = @uprDSEdit
				;
				-- SET @.Upr.IS_OK = (_User_Upr >= @uprDSEditSelf)or(_User_Upr = @uprDSView AND _IsReadOnly)or(_User_Upr = @uprDSInsert); -- slon test czy przy insert bedzie tez View ??
			END IF;

			IF _Oper LIKE 'DEL%' THEN
				SET 
					@.Upr.IS_OK = (_User_Upr >= @uprDSDelete),
					@.Upr.IS_OK.Warrning.UP = @uprDSDelete
				;
			END IF;
			
		END IF;
	END IF;
	
	IF NOT @.Upr.IS_OK AND _MODE LIKE '%+MSG' THEN
		SET @.Upr.IS_OK.Warrning = 
			CONCAT_WS('\n',
				_Ext_Caption,
				CONCAT(
					'Nie masz uprawnień ',
					CASE 
						WHEN @.Upr.IS_OK.Warrning.UP = @uprDSDisabled THEN 'do przetwarzania tych danych.' 
						WHEN @.Upr.IS_OK.Warrning.UP = @uprDSView THEN 'do oglądania tych pozycji.' 
						WHEN @.Upr.IS_OK.Warrning.UP = @uprDSInsert THEN 'do tworzenia tych danych.' 
						WHEN @.Upr.IS_OK.Warrning.UP = @uprDSEditSelf THEN 'do modyfikowania swoich danych.' 
						WHEN @.Upr.IS_OK.Warrning.UP = @uprDSEdit THEN 'do modyfikowania tych danych.' 
						WHEN @.Upr.IS_OK.Warrning.UP = @uprDSDelete THEN 'do usuwania tych danych.' 
					END
				),
				CONCAT('Miejsce uprawnienia:\n', _Ext_Miejsce),
				NULL
			)
		;
	END IF;
--	ZWRACAM	
	RETURN @.Upr.IS_OK;
END
$$

DROP PROCEDURE IF EXISTS `_sys_upr_CustomUprWarrning`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_sys_upr_CustomUprWarrning`(
	IN _Up INTEGER,
	IN _Miejsce VARCHAR(250),
	IN _extCaption VARCHAR(250),
	OUT _Warrning TEXT
)
/*
	
*/
BEGIN 
	
	SET
		@Warr = CONCAT( 
			'Nie masz uprawnień ',
			CASE 
				WHEN _Up = @uprDSDisabled THEN 'do przetwarzania tych danych.' 
				WHEN _Up = @uprDSView THEN 'do oglądania tych pozycji.' 
				WHEN _Up = @uprDSInsert THEN 'do tworzenia tych danych.' 
				WHEN _Up = @uprDSEditSelf THEN 'do modyfikowania swoich danych.' 
				WHEN _Up = @uprDSEdit THEN 'do modyfikowania tych danych.' 
				WHEN _Up = @uprDSDelete THEN 'do usuwania tych danych.' 
			END 
		)
	;
	SET
		_Warrning = CONCAT(
			IF(_extCaption != '',
				CONCAT(_extCaption, '\n'),
				''
			),	
			@Warr, 
			IF(_Miejsce != '',
				CONCAT('\nMiejsce uprawnienia:\n', _Miejsce),
				''
			)
		)
	;
	-- set @_Warrning = _Warrning;
END
$$

DROP PROCEDURE IF EXISTS `_sys_upr_DefaultUprIsOK`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_sys_upr_DefaultUprIsOK`(
	IN _MODE VARCHAR(250),		--	'BEFORE' lub 'AFTER' ma znaczenie dla EDIT
	IN _Oper VARCHAR(250),
	IN _IsReadOnly BOOLEAN,
	IN _IsSelfDoc BOOLEAN,
	IN _User_Upr INTEGER,
	IN _Miejsce VARCHAR(250),
	IN _extCaption VARCHAR(250),
	OUT _IsOK BOOLEAN,
	OUT _Warrning TEXT
)
/*
	
*/
S_sys_upr_DefaultUprIsOK: BEGIN
	
	SET
		_Warrning = '',
		_IsOK = (_User_Upr >= @uprDSView),
		_IsReadOnly = IFNULL(_IsReadOnly, FALSE),
		_IsSelfDoc = IFNULL(_IsSelfDoc, FALSE)
	;	
	IF NOT _IsOK THEN
		CALL _sys_upr_CustomUprWarrning(@uprDSView, _Miejsce, _extCaption, _Warrning);		
		LEAVE S_sys_upr_DefaultUprIsOK;
	END IF;

	IF _MODE = 'BEFORE' THEN
	/*	Mamy _IsOK zatem
		- gdy jesteśmy przed ('BEFORE') wgraniem dokumentu do edycji i wiemy że jest view to puszczamy bo może po wgraniu okazać się że jest readonly i view wystarczy
		- oczywiście dla 'AFTER' badamy juz wszystko
	*/
		LEAVE S_sys_upr_DefaultUprIsOK;
	END IF;
	
	IF _Oper IN ('INS', 'INSERT') THEN
		SET _IsOK = (_User_Upr >= @uprDSInsert);
		IF NOT _IsOK THEN
			CALL _sys_upr_CustomUprWarrning(@uprDSInsert, _Miejsce, _extCaption, _Warrning);		
			LEAVE S_sys_upr_DefaultUprIsOK;
		END IF;
	END IF;

	IF _Oper = 'EDIT' THEN
		SET _IsOK = 
			(_User_Upr >= @uprDSEdit)
			OR
			((_User_Upr >= @uprDSEditSelf) AND _IsSelfDoc)
			OR
			((_User_Upr >= @uprDSView) AND _IsReadOnly)
		;
		-- SET _IsOK = (_User_Upr >= @uprDSEditSelf)or(_User_Upr = @uprDSView AND _IsReadOnly)or(_User_Upr = @uprDSInsert); -- slon test czy przy insert bedzie tez View ??
		IF NOT _IsOK THEN
			CALL _sys_upr_CustomUprWarrning(@uprDSEdit, _Miejsce, _extCaption, _Warrning);		
			LEAVE S_sys_upr_DefaultUprIsOK;
		END IF;
	END IF;

	IF _Oper = 'DEL' THEN
		SET _IsOK = (_User_Upr >= @uprDSDelete);
		IF NOT _IsOK THEN
			CALL _sys_upr_CustomUprWarrning(@uprDSDelete, _Miejsce, _extCaption, _Warrning);		
			LEAVE S_sys_upr_DefaultUprIsOK;
		END IF;
	END IF;
END
$$


/* ************************************************************************************************************************************************************************
	inicjalne oraz `t_ht_ngpo_transact` 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `_sys_upr_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_sys_upr_init`(
	IN _MODE VARCHAR(250)
)
/*
	CALL _sys_upr_init('');
*/
BEGIN 
	SET
		@uprDSDisabled    = 0,	--	nieaktywana
		@uprDSView        = 1,	--	Ogladanie
		@uprDSInsert      = 2,	--	Wstawianie
		@uprDSEditSelf    = 3,	--	Edycja własnych dokumentów/operacji/rekordów itp
		@uprDSEdit        = 4,	--	Edycja (modyfikacje)
		@uprDSDelete      = 5 	--	Usuwanie (najwyższy
	;
END
$$


-- CZY JEST POTRZEBNA????
DROP PROCEDURE IF EXISTS `_sys_upr_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_sys_upr_tools`(
	IN _MODE VARCHAR(150),
	IN _OsobaGUID VARCHAR(38),
	IN _Miejsce VARCHAR(200),	
	IN _Param_A VARCHAR(150),	
	IN _Param_B VARCHAR(150),	
	IN _Param_C VARCHAR(150),	
	IN _Param_D VARCHAR(150)	
)
BEGIN
	/*
	_MODE

	------------------------------------------------------------------------------------------------------------------------------------------------------------
	'REFRESH_UPR'
		Odswieza tabele `t_uprawnienia` dla uzytkownika
		Parametry
			_OsobaGUID		Opcjonalnie gdy '' to brana jest zmienna @session.CheckLogonUser
		CALL _sys_upr_tools('REFRESH_UPR', '', '', '', '', '', '');		
		CALL _sys_upr_tools('REFRESH_UPR', OsobaGUID, '', '', '', '', '');		

	------------------------------------------------------------------------------------------------------------------------------------------------------------
	'SELECT_UPR'
		Odswieza i zwraca (select) tabele `t_uprawnienia` dla uzytkownika
		Parametry
			_OsobaGUID		Opcjonalnie gdy '' to brana jest zmienna @session.CheckLogonUser
		CALL _sys_upr_tools('SELECT_UPR', '', '', '', '', '', '');		
		CALL _sys_upr_tools('SELECT_UPR', OsobaGUID, '', '', '', '', '');		
		
	------------------------------------------------------------------------------------------------------------------------------------------------------------
	*/
	
	DECLARE _I INTEGER DEFAULT 0;
	DECLARE _Poziom INTEGER DEFAULT 0;
	
	
	SET NAMES 'cp1250';
--	zmienna sesyjna - język polski	
	SET lc_time_names = 'pl_PL';
	
	
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'REFRESH_UPR'
		Odswieza tabele `t_uprawnienia` dla uzytkownika
		Parametry
			_OsobaGUID		Opcjonalnie gdy '' to brana jest zmienna @session.CheckLogonUser
		CALL _sys_upr_tools('REFRESH_UPR', '', '', '', '', '', '');		
		CALL _sys_upr_tools('REFRESH_UPR', OsobaGUID, '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'REFRESH_UPR' THEN
		SET _OsobaGUID = IFNULL(_OsobaGUID, '');
		IF _OsobaGUID = '' THEN
			SET _OsobaGUID = IFNULL(@session.CheckLogonUser, '');
		END IF;
	--	Buduj tabele uprawnien `t_uprawnienia` 
		DROP TEMPORARY TABLE IF EXISTS `t_uprawnienia`;
		CREATE TEMPORARY TABLE `t_uprawnienia`(
		  `Owner_GUID` varchar(38) NOT NULL DEFAULT '',
		  `miejsce` varchar(50) NOT NULL DEFAULT '',
		  `poziom` int(11) NOT NULL DEFAULT '0',
		  `poziom_final` int(11) NOT NULL DEFAULT '0',
		  `osobaguid` varchar(38) NOT NULL DEFAULT '',
		  `grupaguid` varchar(38) NOT NULL DEFAULT '',
		  `IsUser` int(11) NOT NULL DEFAULT '1',
		  `IsAdmin` int(11) NOT NULL DEFAULT '1',
		  `rodzaj` int(11) NOT NULL DEFAULT '0',
		  `opis` varchar(150) NOT NULL DEFAULT '',
		  `upr_type` varchar(250) NOT NULL DEFAULT '',
		  `core_id` varchar(50) DEFAULT NULL,
		  `login` varchar(20) NOT NULL DEFAULT '',
		  `osoba_idnuser` varchar(50) NOT NULL DEFAULT '',  
		  `grupa_idnuser` varchar(50) NOT NULL DEFAULT '', 
		  UNIQUE KEY `loginmiejsce` (`login`,`miejsce`),
		  KEY `osobaguid` (`osobaguid`)
		) 
		;		
		
		INSERT INTO `t_uprawnienia`
			SELECT 
				_VarStr(_OsobaGUID) AS Owner_GUID,
				u.miejsce,  
				u.poziom AS poziom,  
				u.poziom AS poziom_final,  
				go.osobaguid, 
				go.grupaguid,  
				_VarInt(go.osobaguid = go.grupaguid) AS IsUser,
				o.administrator AS IsAdmin,
				u.rodzaj,
				u.opis,
				u.upr_type,
				u.core_id,  
				u.login,
				o.idnuser AS osoba_idnuser,  
				g.idnuser AS grupa_idnuser 
			FROM grupy_osob go 
			INNER JOIN osoby o on o.guid=go.osobaguid  
			INNER JOIN osoby g on g.guid=go.grupaguid  
			LEFT JOIN uprawnienia u on go.grupaguid=u.osobaguid 
			WHERE 
				-- ou.idnuser = 'jmam' 
				go.OsobaGUID = _OsobaGUID
				AND u.miejsce <> ''
		;
		
	
	END IF;	--	IF _MODE = 'REFRESH_UPR'

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'SELECT_UPR'
		Odswieza i zwraca (select) tabele `t_uprawnienia` dla uzytkownika
		Parametry
			_OsobaGUID		Opcjonalnie gdy '' to brana jest zmienna @session.CheckLogonUser
		CALL _sys_upr_tools('SELECT_UPR', '', '', '', '', '', '');		
		CALL _sys_upr_tools('SELECT_UPR', OsobaGUID, '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'SELECT_UPR' THEN
		CALL _sys_upr_tools('REFRESH_UPR', _OsobaGUID, '', '', '', '', '');		
		SELECT * FROM `t_uprawnienia` ORDER BY miejsce;
	END IF;	--	IF _MODE = 'SELECT_UPR'

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CHECK_UPR'
		Wylicza uprawnienie dla osoby
		UWAGA zaklada sie itnienie tabeli `t_uprawnienia`
		Parametry
			//_OsobaGUID		Opcjonalnie gdy '' to brana jest zmienna @session.CheckLogonUser
			_Miejsce		Miejsce uprawnienia
			_Param_A		gdy <> '' to zwraca select
		CALL _sys_upr_tools('CHECK_UPR', '', 'Miejsce', '', '', '', '');		
		CALL _sys_upr_tools('CHECK_UPR', OsobaGUID, 'Miejsce', '1', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CHECK_UPR' THEN
		/*
		SET _OsobaGUID = IFNULL(_OsobaGUID, '');
		IF _OsobaGUID = '' THEN
			SET _OsobaGUID = IFNULL(@session.CheckLogonUser, '');
		END IF;
		*/
		SET _Miejsce = IFNULL(_Miejsce, '');
		SELECT
			MAX(upr.Poziom) AS Poziom 
		INTO
			_Poziom
		FROM `t_uprawnienia` upr
		WHERE
			upr.Miejsce = _Miejsce
		GROUP BY IsUser
		ORDER BY NOT IsUser	
		LIMIT 1
		;	
		SET @CurrUpr_Poziom = _Poziom;	--	!!!!!!!!!!! wazne bo z tej zmiennej korzystaja inne procedury
		IF IFNULL(_Param_A, '') != '' THEN
			SELECT _Poziom;
		END IF;
	END IF;	--	IF _MODE = 'CHECK_UPR'

	
END$$


DROP PROCEDURE IF EXISTS `_sys_upr__INTNET`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_sys_upr__INTNET`(
	IN _MODE VARCHAR(150),
	IN _OsobaGUID VARCHAR(38),
	IN _Miejsce VARCHAR(200),	
	IN _Param_A VARCHAR(150),	
	IN _Param_B VARCHAR(150),	
	IN _Param_C VARCHAR(150),	
	IN _Param_D VARCHAR(150)	
)
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
		
  `rodzaj` INT(11) NOT NULL DEFAULT '0',
  `opis` VARCHAR(150) NOT NULL DEFAULT '',
  `ValueList` TEXT,
  `upr_type` VARCHAR(250) NOT NULL DEFAULT '',
  `core_id` VARCHAR(50) DEFAULT NULL,
		
		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
S__sys_upr__INTNET: BEGIN
	IF _MODE = 'select.distinct.Grupy' THEN
	/* *************************************************************************************************************************************************************
		Zwraca lewy panel do szukania
		CALL _sys_upr__INTNET('select.distinct.Grupy', '', '', '', '', '', '');		
	**************************************************************************************************************************************************************/
		SELECT
			@X
		;
		
	END IF;

	IF _MODE = 'select.upr.for.OsoboGrupa' THEN
	/* *************************************************************************************************************************************************************
		Zwraca juz gotowe rekordy dla edycji 
		CALL _sys_upr__INTNET('select.upr.for.OsoboGrupa', 'OsoboGrupa', '', '', '', '', '');		
		_OsobaGUID		Grupa/osoba
	**************************************************************************************************************************************************************/
		/* było 
		SELECT 
			d.*,
			u.login,
			u.poziom,
			u.osobaguid
		... jest */ 
		SELECT 
			d.miejsce,
			d.opis,
			d.rodzaj, 
			CONVERT(NULLIF(d.ValueList, '') USING utf8) AS ValueList,
			d.upr_type, d.core_id, d.poziom, d.parent_miejsce, d.alocaltime,
			u.login,
			u.poziom,
			u.osobaguid
		FROM `uprawnienia` u
		LEFT JOIN uprawnienia_dict d ON d.miejsce = u.miejsce
		LEFT JOIN `_sys_app_reg` c ON c.ID = u.Miejsce 
		WHERE 
			u.OsobaGUID = _OsobaGUID
			AND IF(NOT u.miejsce LIKE 'M.%', TRUE, IFNULL(c.not_used = 0 AND c.ID IN ('M.EXE.PL2024','M.EXE.PL2003','M.EXE.HT2003','M.WEB.INT.NET.CENTER'), FALSE))
		ORDER BY miejsce
		;
	END IF;
	
	IF _MODE LIKE 'sync.uprawnienia.%' THEN
	/* *************************************************************************************************************************************************************
		Synchronizacja
		1.Tworzenie tempa
		CALL _sys_upr__INTNET('sync.uprawnienia.init', 'AktualnaOsobaGrupa', '', '', '', '', '');		
		_OsobaGUID	grupa/osoba aktualna 
		2.select z tempa
		CALL _sys_upr__INTNET('sync.uprawnienia.select', '', '', '', '', '', '');		
		3.Synchronizacja zaznaczonych
		CALL _sys_upr__INTNET('sync.uprawnienia.apply', 'AktualnaOsobaGrupa', '', '', '', '', '');		
		_OsobaGUID	grupa/osoba aktualna 
		4.drop tempa
		CALL _sys_upr__INTNET('sync.uprawnienia.final', '', '', '', '', '', '');		
	**************************************************************************************************************************************************************/
		IF _MODE = 'sync.uprawnienia.init' THEN
			DROP TEMPORARY TABLE IF EXISTS `t_uprawnienia_sync`;
			CREATE TEMPORARY TABLE `t_uprawnienia_sync`
				SELECT 
					_VarInt(0) AS Checked, 
					d.* 
				FROM `uprawnienia_dict` d
				LEFT JOIN `uprawnienia` u ON u.Miejsce = d.Miejsce AND u.OsobaGUID = _OsobaGUID
				LEFT JOIN `_sys_app_reg` c ON c.ID = d.Miejsce 
				WHERE 
					u.Miejsce IS NULL
					AND IF(NOT d.miejsce LIKE 'M.%', TRUE, IFNULL(c.not_used = 0 AND c.ID IN ('M.EXE.PL2024','M.EXE.PL2003','M.EXE.HT2003','M.WEB.INT.NET.CENTER'), FALSE))
				GROUP BY d.Miejsce
			;
		END IF;

		IF _MODE = 'sync.uprawnienia.select' THEN
			SELECT * FROM `t_uprawnienia_sync`;
		END IF;

		IF _MODE = 'sync.uprawnienia.apply' THEN
		set @ms = 'aaa';
			DELETE FROM `t_uprawnienia_sync` WHERE Checked = 0;
			INSERT IGNORE INTO `uprawnienia`
			(`osobaguid`,`miejsce`,`login`,`poziom`,`core_id`, `ValueList`)
				SELECT 
					o.GUID AS osobaguid,
					t.miejsce,
					o.IdnUser AS login, 
					t.poziom,
					t.core_id,
					t.ValueList
				FROM `t_uprawnienia_sync` t
				INNER JOIN `osoby` o ON o.GUID = _OsobaGUID
			;
		set @ms = _OsobaGUID;
		END IF;
		
		IF _MODE = 'sync.uprawnienia.final' THEN
			DROP TEMPORARY TABLE IF EXISTS `t_uprawnienia_sync`;
		END IF;
	END IF;
	

	
	IF _MODE LIKE 'get.upr.from.osobagrupa.%' THEN
	/* *************************************************************************************************************************************************************
		Pobieranie uprawnien z grupy
		1.A Select osoby
		CALL _sys_upr__INTNET('get.upr.from.osobagrupa.select.osoby', 'AktualnaOsobaGrupa', '', '', '', '', '');		
		_OsobaGUID	grupa/osoba aktualna 
		1.B Select grupy
		CALL _sys_upr__INTNET('get.upr.from.osobagrupa.select.grupy', 'AktualnaOsobaGrupa', '', '', '', '', '');		
		_OsobaGUID	grupa/osoba aktualna 
		2.Wstaw 
		CALL _sys_upr__INTNET('get.upr.from.osobagrupa.apply', 'AktualnaOsobaGrupa', '', 'SrcOsobaGrupa', '', '', '');		
		_OsobaGUID	grupa/osoba aktualna 
		_Param_A	grupa zrodlowa
	**************************************************************************************************************************************************************/
	
					IF _MODE = 'get.upr.from.osobagrupa.select.%.upr' THEN
					/* *************************************************************************************************************************************************************
						Zwraca uprawnienia do INT_NET
						CALL _sys_upr__INTNET('get.upr.from.osobagrupa.select.INT.NET.upr', 'AktualnaOsobaGrupa', 'szukana fraza', '', '', '', '');		
						np.
						CALL _sys_upr__INTNET('get.upr.from.osobagrupa.select.%.upr', '{FE87B9E2-6114-4CC8-A3CE-4B7BAA8862EA}', 'INT', '', '', '', '');		
						_OsobaGUID	Grupa/osoba
						_Miejsce	szukana fraza w uprawnieniach INT
					**************************************************************************************************************************************************************/
						SET
							_Miejsce = IF(LOCATE('%', _Miejsce) > 0, _Miejsce, CONCAT(_Miejsce, '%')),
							@_Param_A = _Param_A
						;
						SELECT 
								ud.miejsce, ud.opis,  ud.rodzaj,
								_VarInt(
									IFNULL(
									--	najpierw upr. własne
										(
										SELECT 
											u.poziom 
										FROM `uprawnienia` u
										WHERE 
											u.miejsce = ud.Miejsce 
											AND u.osobaguid = ua.OsobaGUID
										ORDER BY poziom DESC 
										LIMIT 1
										), 
										IF(ua.Admin AND (@_Param_A = ''), 
											5, 	--	najwyzsze dla ua.Admin
											IFNULL(
												(
												SELECT 
													u.poziom 
												FROM `uprawnienia` u, `grupy_osob` g 
												WHERE 
													u.miejsce = ud.Miejsce 
								
													AND u.osobaguid = g.grupaguid AND g.osobaguid = ua.OsobaGUID 
												ORDER BY (g.osobaguid = g.grupaguid) DESC, poziom DESC 
												LIMIT 1
												), 
												0
											)
										)
									)
								) AS poziom, 
								ua.Admin,
								ud.valuelist 
						FROM `uprawnienia_dict` ud 
						INNER JOIN `_user_accounts` ua ON ua.OsobaGUID = _OsobaGUID
						WHERE 
							-- np. ud.miejsce LIKE 'INT%'
							ud.miejsce LIKE _Miejsce
						;
					END IF;
					
	
		IF _MODE = 'get.upr.from.osobagrupa.select.osoby' THEN
			SELECT 
				u.* 
			FROM `v_intnet_users` u
			WHERE
				u.GUID != _OsobaGUID
				AND
				EXISTS(SELECT miejsce FROM `uprawnienia` WHERE OsobaGUID = u.GUID)
			;
		END IF;
		
		IF _MODE = 'get.upr.from.osobagrupa.select.grupy' THEN
			SELECT 
				g.* 
			FROM `v_grupy_hr` g
			WHERE
				g.GUID != _OsobaGUID
				AND
				EXISTS(SELECT miejsce FROM `uprawnienia` WHERE OsobaGUID = g.GUID)
			;
		END IF;
		
		IF _MODE = 'get.upr.from.osobagrupa.apply' THEN
			DROP TEMPORARY TABLE IF EXISTS `t_uprawnienia_copy`;
			CREATE TEMPORARY TABLE `t_uprawnienia_copy`
				SELECT 
					u.* 
				FROM `uprawnienia` u
				WHERE 
					u.OsobaGUID = _Param_A
			;
			UPDATE `t_uprawnienia_copy` t
			INNER JOIN `osoby` o ON o.GUID = _OsobaGUID
			LEFT JOIN `_user_accounts` ua ON ua.OsobaGUID = o.GUID
			SET
				t.guid = NULL,
				t.osobaguid = o.GUID,
				t.login = IFNULL(ua.login, o.IdnUser)
			WHERE
				TRUE
			;
			INSERT IGNORE INTO `uprawnienia`
				SELECT 
					t.*
				FROM `t_uprawnienia_copy` t
				ON DUPLICATE KEY UPDATE
				`uprawnienia`.Poziom = t.Poziom
			;
            /* było do XII 2024
			UPDATE `t_uprawnienia_copy` t, `osoby` o 
			SET
				t.guid = NULL,
				t.osobaguid = o.GUID,
				t.login = o.IdnUser
			WHERE
				o.GUID = _OsobaGUID
			;
			INSERT IGNORE INTO `uprawnienia`
				SELECT 
					t.*
				FROM `t_uprawnienia_copy` t
			;
            */
			DROP TEMPORARY TABLE IF EXISTS `t_uprawnienia_copy`;
		END IF;
		
	END IF;
	
	IF _MODE LIKE 'select.poziom.uprawnien.osob.dla.danego.upr' THEN
	/* *************************************************************************************************************************************************************
		Zobacz to uprawnienie (_Miejsce) dla innych uzytkownikow
		CALL _sys_upr__INTNET('select.poziom.uprawnien.osob.dla.danego.upr', '', 'miejsce', '', '', '', '');		
		_Miejsce
	**************************************************************************************************************************************************************/
		SELECT 
			(o.Rodzaj = 0) AS IsGrupa,
			CONCAT(o.Nazwisko, ' ', o.Imiona) AS Nazwisko_Imiona,
			d.*, -- tu tez jest d.poziom, zawsze rowny 0
			u.poziom AS poziom,  -- #46935 przesuwamy u.poziom za d.*, bo jest tez d.poziom, i potem w kontrolerze jest odwolanie do danych zwroconych przez to zapytanie, w tym do kolumny `poziom` - bierze tą poźniejszą z listy 
			_VarInt(IFNULL(ua.Status = 1, o.user_inactive)) AS user_inactive,
			u.OsobaGUID
		FROM `uprawnienia` u
		INNER JOIN `osoby` o ON o.GUID = u.OsobaGUID -- AND o.Rodzaj = 1
		LEFT JOIN `uprawnienia_dict` d ON d.Miejsce = u.Miejsce
		LEFT JOIN `_user_accounts` ua ON ua.OsobaGUID = o.GUID AND ua.typ = 'SYS'
		WHERE
			u.Miejsce = _Miejsce
		GROUP BY o.GUID -- OsobaGUID
		;
	END IF;

	
END$$


DROP FUNCTION IF EXISTS `_sys_GetUprawnienie`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_sys_GetUprawnienie`(
	_SESSION VARCHAR(250),
	_Miejsce VARCHAR(200),
	_OsobaGUID VARCHAR(38)
) 
RETURNS INTEGER
	DETERMINISTIC
	COMMENT 'Zwraca Poziom'
S_sys_GetUprawnienie: BEGIN
	IF _SESSION = 'jmam' THEN
		RETURN 5;
		LEAVE S_sys_GetUprawnienie;
	END IF;
	
	SET 
		_OsobaGUID = IFNULL(_OsobaGUID, ''),
		@u.poziom = 0
	;
	IF _OsobaGUID = '' THEN
		SET _OsobaGUID = (SELECT Log_USER_GUID FROM `_sys_db_logons` WHERE GUID = _SESSION);
	END IF;
	
	SELECT 
		IF(ua.Admin,
			5,
			IFNULL(
				(SELECT MAX(u.poziom) FROM `uprawnienia` u WHERE u.miejsce = _Miejsce AND u.OsobaGUID = ua.OsobaGUID),
				IFNULL(
					(SELECT MAX(u.poziom) FROM `uprawnienia` u, `grupy_osob` go WHERE go.OsobaGUID = ua.OsobaGUID AND u.miejsce = _Miejsce AND u.OsobaGUID = go.GrupaGUID),
					0
				)
			)
		) AS poziom
	INTO
		@u.poziom
	FROM `_user_accounts` ua
	WHERE
		ua.OsobaGUID = _OsobaGUID
	;
	RETURN @u.poziom;
END$$


DELIMITER ;


DELIMITER $$
DROP FUNCTION IF EXISTS `_GetUpr2024`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_GetUpr2024`(
	_Miejsce VARCHAR(200),
	_uGUID VARCHAR(38),
	_weAdmin BOOLEAN,	--	prawie zawsze dawać NULL gdy mamy NOT NULL to nie spr. w user_accounts
	_PoziomIfNull INTEGER	--	gdy brak upr. zwracamy IFNULL(_PoziomIfNull, 5)
) 
RETURNS INTEGER
	DETERMINISTIC
	COMMENT 'Zwraca Poziom'
L_EXIT: BEGIN
/*
	Zazwyczaj
		SELECT _GetUpr2024('Dostep_do_mag_nieakt', @.Handle_UserGUID, NULL, NULL);
	dla zalogowanego gdy mamy go z sesji
		SELECT _GetUpr2024('Dostep_do_mag_nieakt', NULL, NULL, NULL);
	dodatk. gdy chcemy aby przy braki jakichkolwiek upr. zwracał np. 0 to ...
		SELECT _GetUpr2024('Dostep_do_mag_nieakt', NULL, NULL, 0);
*/
	SET
		@.u.Poziom = NULL,
		_uGUID = 
		IFNULL(_uGUID,
		IFNULL(@SYSTEM.Client.Session.log_USER_GUID,
		IFNULL(@session.Registration.UserGUID,
		NULL
		)))
	;
	IF _uGUID IS NOT NULL THEN
		SET
		@.u.IsAdnin = 
			IFNULL(_weAdmin,
			IFNULL(@SYSTEM.Client.Session.log_USER.admin,
			IFNULL((SELECT ua.Admin FROM `_user_accounts` ua WHERE osobaGUID = _uGUID),
			FALSE
		)))
		;
		IF @.u.IsAdnin THEN
			SET @.u.Poziom = 5;
		ELSE
			SELECT 
				u.login, u.miejsce, u.poziom, u.rodzaj, u.opis, u.upr_type, u.core_id, 
				g.osobaguid = g.grupaguid AS IsOsoba
			INTO
				@u.login, @u.miejsce, @.u.Poziom, @u.rodzaj, @u.opis, @u.upr_type, @u.core_id, @IsOsoba
			FROM `uprawnienia` u, `grupy_osob` g 
			WHERE 
				u.miejsce = _Miejsce
				AND u.osobaguid = g.grupaguid 
				AND g.osobaguid = _uGUID
			ORDER BY IsOsoba DESC, poziom DESC 	
			LIMIT 1
			;
		END IF;
	END IF;
	SET @.u.Poziom = IFNULL(@.u.Poziom, IFNULL(_PoziomIfNull, 5));
	RETURN @.u.Poziom;
END
$$
DELIMITER ;

/*
$Log$
*/

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

