 DELIMITER $$

DROP PROCEDURE IF EXISTS `crm_porta_fide_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `crm_porta_fide_tools`(
	IN _MODE VARCHAR(250),	 --	_handle_oper INSERT, EDIT, DELETE,
	IN _Key VARCHAR(38),
	IN _Key2 VARCHAR(150),
	IN _Key3 VARCHAR(150),	--	najczescie _Cul_Idn a przy nowym to GUID Szablonu
	IN _Param_A VARCHAR(150),	--	tutaj np. Temat
	IN _Param_B TEXT,	
	IN _Param_C VARCHAR(150),	
	IN _Param_D VARCHAR(150),	
	IN _Param_E MEDIUMTEXT
)
/*
*/	
S_crm_porta_fide_tools: BEGIN
	
	DECLARE _OsobaGUID, _crmGUID VARCHAR(38);
	DECLARE _D1, _D2 DATE;
    DECLARE _YM1, _YM2 INTEGER;
	DECLARE _confirm_status VARCHAR(150);
	DECLARE _Archiwum, _Komentarz VARCHAR(255);
	DECLARE _IDN_workflow, _Rodzaj, _PodRodzaj INTEGER;
	IF @session.globals.WORK.FLOW.Ver IS NULL THEN CALL _Globals_Get_2('WORK.FLOW.Ver', @session.globals.WORK.FLOW.Ver, '2015', '?'); END IF;
			/*
			IF _MODE LIKE 'Zastepstwo.%' THEN
				IF _MODE LIKE 'Zastepstwo.SELECT%' THEN
					IF _MODE = 'Zastepstwo.SELECT%' THEN
				END IF;
			END IF;
			*/
			
			IF _MODE LIKE 'user_calendar.%' THEN
			/************************************************************************************************************************************************
				Tworzy zdarzenie _Key przez osobe _Key2 z szablonu _Key3.
				CALL crm_porta_fide_tools('user_calendar.Prepare.for.Osoba', '', 'Osoba', '', '2021-01-01', '2021-12-01', '', '', '');
				_Key2		_OsobaGUID
				_Key3		Rok (no chyba że '' wtedy aktualny) o ile nie podalismy w _Param_A i _Param_B
				ale...!!! daty podajemy w 
				_Param_A	Od 
				_Param_B	Do 
				
			************************************************************************************************************************************************/
				IF _MODE LIKE 'user_calendar.%' THEN
					SET @.WE.YYYY = IFNULL(NULLIF(_Key3, ''), YEAR(CURRENT_DATE()));
					SET 
						-- było _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
						_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID),
						@.DateFrom = DATE(IFNULL(NULLIF(_Param_A, ''), _FirstDayYYYY(@.WE.YYYY))),
						@.DateTo = DATE(IFNULL(NULLIF(_Param_B, ''), _LastDayYYYY(@.WE.YYYY)))
					;
					DROP TEMPORARY TABLE IF EXISTS `t_user_calendar_osoby`;
					CREATE TEMPORARY TABLE `t_user_calendar_osoby` (
					  `PracGUID` VARCHAR(38) NOT NULL COMMENT 'Klucz osoby',
					  `Date_From` DATE NOT NULL,
					  `Date_To` DATE NOT NULL,
					  PRIMARY KEY (`PracGUID`),
					  KEY `Date_From` (`Date_From`),
					  KEY `Date_To` (`Date_To`)
					)
					;
					INSERT IGNORE INTO `t_user_calendar_osoby` 
					SET 
						PracGUID = _OsobaGUID, 
						Date_From = @.DateFrom, 
						Date_To = @.DateTo
					;
				END IF;
				
				IF _MODE LIKE 'user_calendar.Prepare.for.Osoba%' THEN
					-- SHOW CREATE TABLE `t_user_calendar`;
					DROP TEMPORARY TABLE IF EXISTS `t_user_calendar`;
					CREATE TEMPORARY TABLE `t_user_calendar` (
					  `Date` DATE NOT NULL,
					  `PracGUID` VARCHAR(38) NOT NULL COMMENT 'Klucz osoby',
					  `Src` VARCHAR(50) NULL COMMENT 'np. frekw_po/ kp, absencje',
					  `fp_GUID` VARCHAR(38) NOT NULL COMMENT 'Klucz osoby',
					  `fp_absencja` VARCHAR(5),
					  `fp_kp_godziny` DOUBLE(16,4),
					  `fp_godziny` DOUBLE(16,4),
					  `fp_kp_info` CHAR(1),
					  `Abs_GUID` VARCHAR(38) NOT NULL COMMENT 'Klucz absencji',
					  `Abs_Wniosek_GUID` VARCHAR(38) NOT NULL COMMENT 'Klucz absencji/wniosku',
					  `Abs_Date` DATE COMMENT 'gdy ABS to tutaj jest powt. pole Date',
					  `Abs_Wniosek_Date` DATE COMMENT 'gdy ABS to tutaj jest powt. pole Date',
					  `Abs_Rodzaj` INTEGER,
					  `Abs_Wniosek_Rodzaj` INTEGER,
					  `Abs_Symbol` VARCHAR(5),
					  `Abs_Wniosek_Symbol` VARCHAR(5),
					  `Abs_Kod_ABS` VARCHAR(50),
					  `Abs_Wniosek_Kod_ABS` VARCHAR(50),
					  `Abs_okres_typ` VARCHAR(20),
					  `Abs_KazdyDzien` INTEGER DEFAULT 0,
					  `Abs_Wniosek` INTEGER DEFAULT 0,
					  `Abs_godz_absencji` DOUBLE(16,4),
					  `Abs_dzien_absencji` DOUBLE(16,4),
					  `kp_godziny` DOUBLE(16,4),
					  `kp_dni` DOUBLE(16,4),
					  `YYYY` INTEGER,
					  `YYYY_MM` INTEGER,
					  PRIMARY KEY (`Date`, `PracGUID`),
					  KEY `fp_GUID` (`fp_GUID`),
					  KEY `Abs_GUID` (`Abs_GUID`),
					  KEY `Abs_Symbol` (`Abs_Symbol`),
					  KEY `Abs_Rodzaj` (`Abs_Rodzaj`),
					  KEY `Abs_Kod_ABS` (`Abs_Kod_ABS`),
					  KEY `YYYY` (`YYYY`),
					  KEY `YYYY_MM` (`YYYY_MM`),
					  KEY `Date` (`Date`)
					) -- ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT 'Tabela poz. wazen'
					;
					TRUNCATE `t_user_calendar`;

				--	z frekwencji
					INSERT IGNORE INTO `t_user_calendar`
					(
					`Src`, `Date`, `PracGUID`, `kp_godziny`, `kp_dni`, `fp_GUID`, `fp_absencja`, `fp_kp_godziny`, `fp_godziny`, `fp_kp_info`,
					`Abs_GUID`, `Abs_Date`, `Abs_Rodzaj`, `Abs_Symbol`, `Abs_Kod_ABS`, `Abs_okres_typ`, `Abs_KazdyDzien`, `Abs_godz_absencji`, `Abs_dzien_absencji`,
					`YYYY`, `YYYY_MM`
					)
					SELECT
						'frekw_po', fp.rok_msc_dzien, o.PracGUID, fp.kp_godziny, fp.kp_godziny > 0 AS kp_dni, fp.GUID, fp.absencja, fp.kp_godziny, fp.godziny, fp.kp_info,
						-- teraz nie !!!CONCAT('FREKWPO:', ad.Kod_ABS) AS Abs_GUID,
						NULL AS Abs_GUID,
						IF(fp.absencja <> '', fp.rok_msc_dzien, NULL) AS Abs_Date,
						ad.Idn AS Abs_Rodzaj,
						fp.absencja AS Abs_Symbol,
						ad.Kod_ABS AS Abs_Kod_ABS,
						ad.okres_typ,
						ad.KazdyDzien AS Abs_KazdyDzien,
						IF(fp.absencja <> '', fp.kp_godziny, 0) AS Abs_godz_absencji,
						IF(fp.absencja <> '', IF(ad.KazdyDzien, 1, fp.kp_godziny > 0), 0) AS Abs_dzien_absencji,
						fn.rok AS YYYY,
						fn.YYYY_MM AS YYYY_MM
					FROM `t_user_calendar_osoby` o
					INNER JOIN `frekw` fn ON fn.deleted = 0 AND fn.PracGUID = o.PracGUID AND fn.rok = YEAR(o.Date_From) 
					INNER JOIN `frekw_po` fp  ON fp.frekwguid = fn.GUID
					LEFT JOIN `absencje_dict` ad ON ad.Symbol = fp.absencja
					;

				--	z Kalendarza pracy
					INSERT IGNORE INTO `t_user_calendar`
					(`Src`, `Date`, `PracGUID`, `kp_godziny`, `kp_dni`,
					`YYYY`, `YYYY_MM`
					)
					SELECT
						'kalendpracy_po', kp.Data, o.PracGUID, kp.godziny, kp.godziny > 0,
						YEAR(kp.Data) AS YYYY,
						YEAR(kp.Data)*100 + MONTH(kp.Data) AS YYYY_MM
						-- (select a.GUID from `absencje` a where a.GUIDpr = o.PracGUID and kp.Data between a.AbsencjaOd and IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd)) as Abs_GUID
					FROM `t_user_calendar_osoby` o
					INNER JOIN `Pracownicy` pr ON pr.GUID = o.PracGUID
					INNER JOIN `kalendpracy` k ON  k.Symbol = pr.SymbolKalendarza AND k.rok = YEAR(o.Date_From)
					INNER JOIN `kalendpracy_po` kp ON kp.GUIDNg = k.GUID AND kp.Data BETWEEN o.Date_From AND o.Date_To
					;
					
				--	z Kalendarza systemowego
					INSERT IGNORE INTO `t_user_calendar`
					(`Src`, `Date`, `PracGUID`, `kp_godziny`, `kp_dni`,
					`YYYY`, `YYYY_MM`
					)
					SELECT
						'v_sys_calendar', vcal.Date, o.PracGUID, 8*60*vcal.Working_Day_A AS kp_godziny, vcal.Working_Day_A > 0 AS kp_dni,
						vcal.Y AS YYYY,
						vcal.Y*100 + MONTH(vcal.Date) AS YYYY_MM
						-- (select a.GUID from `absencje` a where a.GUIDpr = o.PracGUID and kp.Data between a.AbsencjaOd and IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd)) as Abs_GUID
					FROM `t_user_calendar_osoby` o
					INNER JOIN `v_sys_calendar` vcal ON vcal.Date BETWEEN o.Date_From AND o.Date_To
					;
				--	poszukaj absencji dla ost. insertów (dla tych z frekw_po juz sa!!!)
				/*
				
					UPDATE `t_user_calendar` t, `absencje` a, `absencje_dict` ad
					SET
						t.Abs_GUID = a.GUID,
						t.Abs_Date = IF(Src != 'frekw_po' OR a.rodzaj < 0, t.Date, t.Abs_Date),
						t.fp_Absencja = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.symbol, t.fp_Absencja),
						t.Abs_Rodzaj = ad.idn,
						t.Abs_Symbol = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.Symbol, t.Abs_Symbol),
						t.Abs_Kod_ABS = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.Kod_ABS, t.Abs_Kod_ABS),
						t.Abs_okres_typ = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.okres_typ, t.Abs_okres_typ),
						t.Abs_KazdyDzien = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.KazdyDzien, t.Abs_KazdyDzien),
						t.Abs_godz_absencji = IF(Src != 'frekw_po' OR a.rodzaj < 0, kp_godziny, t.Abs_godz_absencji),
						t.Abs_dzien_absencji = IF(Src != 'frekw_po' OR a.rodzaj < 0, kp_dni, t.Abs_dzien_absencji),
						t.Abs_Wniosek = (a.rodzaj < 0)
					WHERE 
						TRUE
						-- AND IFNULL(t.Abs_GUID, '') = ''
						AND a.GUIDpr = t.PracGUID 
						AND t.Date BETWEEN a.AbsencjaOd AND IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd)
						AND (a.PelnaAbsencjaOd <=> a.AbsencjaOd)	-- ta zgodnosć konieczna by wyeliminowac absencje cząstkowe
						AND ad.idn = ABS(a.rodzaj)
					;
				*/
					UPDATE `t_user_calendar` t
					SET
						t.Abs_GUID = (
							SELECT
								a.GUID
							FROM `absencje` a
							WHERE 
								TRUE
								-- AND IFNULL(t.Abs_GUID, '') = ''
								AND a.GUIDpr = t.PracGUID 
								-- AND t.Date BETWEEN a.AbsencjaOd AND IFNULL(a.PelnaAbsencjaDo, a.AbsencjaDo)
								AND t.Date BETWEEN a.AbsencjaOd AND a.AbsencjaDo
								AND (a.PelnaAbsencjaOd <=> a.AbsencjaOd)	-- ta zgodnosć konieczna by wyeliminowac absencje cząstkowe
								-- AND ad.idn = ABS(a.rodzaj)
							ORDER BY a.Rodzaj DESC -- najpierw absencje potem wnioski	
							LIMIT 1
							)
					WHERE 
						TRUE
						-- AND IFNULL(t.Abs_GUID, '') = ''
					;
					UPDATE `t_user_calendar` t, `absencje` a, `absencje_dict` ad
					SET
						t.Abs_GUID = a.GUID,
						t.Abs_Date = IF(Src != 'frekw_po' OR a.rodzaj < 0, t.Date, t.Abs_Date),
						t.fp_Absencja = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.symbol, t.fp_Absencja),
						t.Abs_Rodzaj = ad.idn,
						t.Abs_Symbol = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.Symbol, t.Abs_Symbol),
						t.Abs_Kod_ABS = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.Kod_ABS, t.Abs_Kod_ABS),
						t.Abs_okres_typ = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.okres_typ, t.Abs_okres_typ),
						t.Abs_KazdyDzien = IF(Src != 'frekw_po' OR a.rodzaj < 0, ad.KazdyDzien, t.Abs_KazdyDzien),
						t.Abs_godz_absencji = IF(Src != 'frekw_po' OR a.rodzaj < 0, kp_godziny, t.Abs_godz_absencji),
						t.Abs_dzien_absencji = IF(Src != 'frekw_po' OR a.rodzaj < 0, kp_dni, t.Abs_dzien_absencji),
						t.Abs_Wniosek = (a.rodzaj < 0)
					WHERE 
						TRUE
						AND a.GUID = t.Abs_GUID
						AND ad.idn = ABS(a.rodzaj)
					;
					SET
						@.sekcje.CUR_YYYY_MM := YEAR(CURRENT_DATE())*100 + MONTH(CURRENT_DATE())
					;
					DROP TEMPORARY TABLE IF EXISTS `t_user_calendar_agg`;
					CREATE TEMPORARY TABLE `t_user_calendar_agg`
					SELECT
						t.PracGUID, YEAR(t.Date) AS Abs_Okres, t.Abs_Kod_ABS AS Sekcja, 
						t.Abs_Rodzaj, t.Abs_Symbol, t.Abs_Kod_ABS AS Kod_ABS, ad.okres_typ AS Abs_okres_typ, ad.VGridMask,
						t.YYYY, t.YYYY_MM,
					--	ABS	
						SUM((t.Abs_Wniosek = 0) * t.Abs_godz_absencji)/60 AS ABS_H, 
						SUM((t.Abs_Wniosek = 0) * t.Abs_dzien_absencji) AS ABS_D,
					--	ABS do dzisiaj	
						SUM((t.Date <= CURRENT_DATE()) * (t.Abs_Wniosek = 0) * t.Abs_godz_absencji)/60 AS ABS_do_dzis_H, 
						SUM((t.Date <= CURRENT_DATE()) * (t.Abs_Wniosek = 0) * t.Abs_dzien_absencji) AS ABS_do_dzis_D,
					--	ABS do biez.m-ca	
						SUM((t.YYYY_MM <= @.sekcje.CUR_YYYY_MM) * (t.Abs_Wniosek = 0) * t.Abs_godz_absencji)/60 AS ABS_do_b_mc_H, 
						SUM((t.YYYY_MM <= @.sekcje.CUR_YYYY_MM) * (t.Abs_Wniosek = 0) * t.Abs_dzien_absencji) AS ABS_do_b_mc_D,
					--	Wnioski	
						SUM((t.Abs_Wniosek = 1) * t.Abs_godz_absencji)/60 AS Wniosek_H, 
						SUM((t.Abs_Wniosek = 1) * t.Abs_dzien_absencji) AS Wniosek_D,
						MIN(t.Abs_Date) AS ABS_MIN_Date,
						MAX(t.Abs_Date) AS ABS_MAX_Date
					FROM `t_user_calendar` t
					LEFT JOIN `absencje_dict` ad ON ad.Idn = t.Abs_Rodzaj
					WHERE
						TRUE
						-- and t.Abs_Rodzaj IS NOT NULL
					GROUP BY PracGUID, Abs_Okres, Sekcja
					;
				END IF;
					
			END IF;
			
	IF _MODE LIKE 'DASHBOARD.%' THEN
	/************************************************************************************************************************************************
		Tworzy zdarzenie _Key przez osobe _Key2 z szablonu _Key3.
		CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Sekcje', '', '', '', '', '', '', '', '');
		_Key2		_OsobaGUID (nie zawsze potrzebny
			SET 
				_crmGUID = IFNULL(_Key, ''),
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				_IDN_workflow = IFNULL(NULLIF(_Key3, ''), 0)	-- zero gdy brak
			;
	************************************************************************************************************************************************/
		SET 
			-- było _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID)
			_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID)
		;
		IF _MODE = 'DASHBOARD.Sekcje.Create.Sekcje' THEN
		/************************************************************************************************************************************************
			Kreuje `t_PF_abs_sekcje`
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Create.Sekcje', '', '', '', '', '', '', '', '');
		************************************************************************************************************************************************/
			LEAVE S_crm_porta_fide_tools;
			DROP TEMPORARY TABLE IF EXISTS `t_PF_abs_sekcje`;
			CREATE TEMPORARY TABLE `t_PF_abs_sekcje`
			SELECT
				ad.Idn AS Abs_Rodzaj, 
				ad.LP,
				ad.Wniosek_rodzaj, ad.Wniosek_podrodzaj, 
				-- IF(ad.Kod_ABS LIKE 'L4.%', 'L4', ad.Kod_ABS) AS Sekcja,
				ad.Kod_ABS AS Sekcja,
				_UpperFirst(ad.Definicja) AS Opis,
				_VarStr('') AS OpisFull,
				_VarInt(0) AS IleDni_w_tym_roku_fp,
				_VarInt(0) AS IleDni_w_tym_roku_abs,
				ad.symbol,
				ad.okres_typ,
				ad.Kod_ABS,
				ad.KazdyDzien,
				ad.VGridMask
				-- ,ad.*
			FROM `absencje_dict` ad
			WHERE
				(ad.Wniosek_rodzaj IS NOT NULL AND ad.Wniosek_podrodzaj IS NOT NULL)
			GROUP BY Sekcja
			;
		END IF;
		
		IF _MODE = 'DASHBOARD.Create.For.User.Rok' THEN
		/************************************************************************************************************************************************
			Zwraca sekcje dostepne -  `t_PF_abs_sekcje`
			CALL crm_porta_fide_tools('DASHBOARD.Create.For.User.Rok', '', 'Osoba', 'Rok', '', '', '', '', '');
		--	_Key3 to ROK!!!!
		
		************************************************************************************************************************************************/
			-- set _Key3 = 2021;
			CALL pl_abs_frekw_tools('Prac.ABS.Create.Prepare', _OsobaGUID, '', '', _Key3, '');
			-- CALL pl_abs_frekw_tools('ABS.Sekcje.Select', '', '', '', '', '');
		END IF;
		
		IF _MODE = 'DASHBOARD.Sekcje.Select.Sekcje' THEN
		/************************************************************************************************************************************************
			Zwraca sekcje dostepne -  `t_PF_abs_sekcje`
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Sekcje', '', '', '', '', '', '', '', '');
		************************************************************************************************************************************************/
			-- set _Key2 = '{4689A192-0BC4-4A21-AF51-3B8149A94E21}';
			-- CALL pl_abs_frekw_tools('Prac.ABS.Create.Prepare', _Key2, '', '', '', '');
			CALL pl_abs_frekw_tools('ABS.Sekcje.Select', '', '', '', '', '');
			LEAVE S_crm_porta_fide_tools;
			/*
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Create.Sekcje', '', '', '', '', '', '', '', '');
			-- SELECT ts.* FROM `t_PF_abs_sekcje`  ts ORDER BY IF(ts.Sekcja = 'URL.WYP', 0, 1), Abs_Rodzaj, Sekcja;
			SELECT ts.* FROM `t_PF_abs_sekcje`  ts ORDER BY ts.LP;
			*/
		END IF;
		
		IF _MODE = 'DASHBOARD.Sekcje.Select.Absencje' THEN
		/************************************************************************************************************************************************
			Lista absencji dla wszystkich sekcji dla prac. _Key2
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Absencje', '', 'UserGUID', '', '', '', '', '', '');
			_Key2		_OsobaGUID
		************************************************************************************************************************************************/
			-- set _Key2 = '{4689A192-0BC4-4A21-AF51-3B8149A94E21}';
			-- CALL pl_abs_frekw_tools('Prac.ABS.Create.Prepare', _Key2, '', '', '', '');
			CALL pl_abs_frekw_tools('Prac.ABS.Select.Absencje', '', '', '', '', '');		
			LEAVE S_crm_porta_fide_tools;
		
		END IF;
		
		IF _MODE = 'DASHBOARD.Sekcje.Select.Absencje.OLD' THEN
		/************************************************************************************************************************************************
			Lista absencji dla wszystkich sekcji dla prac. _Key2
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Absencje', '', 'UserGUID', '', '', '', '', '', '');
			_Key2		_OsobaGUID
		************************************************************************************************************************************************/
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Create.Sekcje', '', '', '', '', '', '', '', '');
			-- Historia ogolna
			
			SELECT 
			-- he.guid, he.`duration_hour`,
				a.AbsencjaOd AS od, a.Absencjado AS DO, 
				ad.definicja,
				(@.S_Dni :=
				(
					SELECT 
						SUM(IF(p.absencja = ad.symbol, 1, 0) ) 
					FROM `frekw` n, `frekw_po` p 
					WHERE 
						n.guid = a.frekwguid AND n.guid = p.FrekwGUID AND p.PracGUID = a.guidpr AND p.rok_msc_dzien BETWEEN a.PelnaAbsencjaOd AND a.PelnaAbsencjaDo 
				)) AS S_Dni, 	
				(@.S_H :=
				(
					SELECT 
						SUM(IF(p.absencja = ad.symbol, p.godz_absencji, 0) )/60 	-- IF all_day) godz_absencji godziny_yy godziny_zz duration_min
					FROM `frekw` n, `frekw_po` p 
					WHERE 
						n.guid = a.frekwguid AND n.guid = p.FrekwGUID AND p.PracGUID = a.guidpr AND p.rok_msc_dzien BETWEEN a.PelnaAbsencjaOd AND a.PelnaAbsencjaDo 
				)) AS S_H, 
				IF(a.godz_absencji_fixed = 1, 
					_DisplayDurationH('D/H', @.S_H, '', ''),
					CONCAT(_DisplayDurationH('D', @.S_Dni*24, '', ''), ' (', _DisplayDurationH('H', @.S_H, '', ''), ')')
				) AS Okres,
				ad.Symbol, 
				ad.Kod_ABS,
				-- IF(ad.Kod_ABS LIKE 'L4.%', 'L4', ad.Kod_ABS) AS Sekcja,
				ad.Kod_ABS AS Sekcja,
				(ad.Wniosek_rodzaj IS NOT NULL AND ad.Wniosek_podrodzaj IS NOT NULL) AS IsWniosek,
				ad.Idn AS Abs_Rodzaj, 
				ad.Wniosek_rodzaj, ad.Wniosek_podrodzaj, 
				a.godz_absencji_fixed,	-- gdy 1 to godz_absencji ust. recznie i nie nadpisujemy, gdy 0 to naliczamy z kalend. gdy -1 to stare dane i nic nie robie
				ad.okres_typ
			FROM `absencje` a 
			LEFT JOIN `hr_events` he ON he.SrcGUID = a.GUID
			INNER JOIN `absencje_dict` ad ON ad.idn = a.rodzaj 
			WHERE 
				TRUE
				-- AND GUIDpr = '{4689A192-0BC4-4A21-AF51-3B8149A94E21}' 
				-- AND GUIDpr = 'IM_96e08d840a32960d1776cd691097bb00'
				AND a.GUIDpr = _OsobaGUID
				AND 
				(ad.Wniosek_rodzaj IS NOT NULL AND ad.Wniosek_podrodzaj IS NOT NULL)
				AND YEAR(IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd))=YEAR(CURRENT_DATE()) 
				AND (a.PelnaAbsencjaOd <=> a.AbsencjaOd)	-- ta zgodnosć konieczna by wyeliminowac absencje cząstkowe
			ORDER BY Sekcja, od DESC
			;
		END IF;

		IF _MODE = 'DASHBOARD.Sekcje.Select.Inf.2.0' THEN
		/************************************************************************************************************************************************
			Lista absencji dla wszystkich sekcji dla prac. _Key2
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Inf', '', 'UserGUID', '', '', '', '', '', '');
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Inf', '', 'UserGUID', '2023', '', '', '', '', '');
			_Key2		_OsobaGUID
			_Key3		Rok (no chyba że '' wtedy aktualny 
		************************************************************************************************************************************************/
			set @.X = 'jestem 1';
			-- set _Key2 = '{4689A192-0BC4-4A21-AF51-3B8149A94E21}';
			-- CALL pl_abs_frekw_tools('Prac.ABS.Create.Prepare', _Key2, '', '', '', '');
			CALL pl_abs_frekw_tools('Prac.ABS.Select.VGrid', '', '', '', '', '');
			LEAVE S_crm_porta_fide_tools;
			
			
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Create.Sekcje', '', '', '', '', '', '', '', '');
			SET @.WE.YYYY = IFNULL(NULLIF(_Key3, ''), YEAR(CURRENT_DATE()));
			-- CALL crm_porta_fide_tools('user_calendar.Prepare.for.Osoba', '', _OsobaGUID, '', _FirstDayY(CURRENT_DATE()), _LastDayY(CURRENT_DATE()), '', '', '');
			CALL crm_porta_fide_tools('user_calendar.Prepare.for.Osoba', '', _OsobaGUID, '', _FirstDayYYYY(@.WE.YYYY), _LastDayYYYY(@.WE.YYYY), '', '', '');
		/******************************
			Zbieranie ogólnych wartości 
			(tak jak w starym panelu w PortaFide)	
		******************************/
			DROP TEMPORARY TABLE IF EXISTS `t_user_calendar_sekcje_Frekw_AGG`;
			CREATE TEMPORARY TABLE `t_user_calendar_sekcje_Frekw_AGG`
			SELECT
				-- SUM(f.W_dni) AS WykWypDni,
			--	DNIOWE
			--	Wymiar_D
				_varDouble(
				IF(tca.Sekcja = 'URL.WYP', 
					p.WymiarUrlopuDni,					-- dawny WymiarUrlopu, wymiar urlop wypoczynkowy
					IF(tca.Sekcja = 'URL.N.Z', 
						p.UrlopZPDni,					-- dawny WymiarUZP, wymiar urlop na żądanie pracownika
						IF(tca.Sekcja = 'OPIEK.ZDR.DZ',
							NULL,
							NULL
						)
					)
				)) AS Wymiar_D,
			--	Zalegly_D
				_varDouble(
				IF(tca.Sekcja IN ('URL.WYP'),
					p.IleDniZaleglegoUrlopuDni,			-- dawny PozostUrlopZaleglyDni, zaleg. urlop wypoczynkowy
					NULL
				)) AS Zalegly_D,
			--	Zaliczkowy_D
				_varDouble(
				IF(tca.Sekcja IN ('URL.WYP'),
					p.UrlopZaliczkowy,					-- dawny UrlopZaliczkowy,
					NULL
				)) AS Zaliczkowy_D,
			--	Wykorzystano_D
				_varDouble(
				IF(tca.Sekcja IN ('URL.WYP'),
					SUM(f.W_dni) + SUM(f.G_dni),		-- dawny WykWypDni = SUM(f.W_dni), UWAGA!!!! w urlop. wyp. wykorz. podajemy wraz z wykorz. url. n/ż !!!
					IF(tca.Sekcja = 'URL.N.Z', 
						SUM(f.G_dni),					-- dawny WykUZPdni = SUM(f.G_dni),
						tca.ABS_D 
					)
				)) AS Wykorzystano_D,
			--	Pozostalo_D
				_varDouble(
				IF(tca.Sekcja IN ('URL.WYP'),
					(									-- dawny PozostUrlopWypoczDni, 
						SELECT 
							fh.PozostUrlopWypoczDni  -- poz. urlop wypoczynkowy
						FROM `frekw` fh
						WHERE 
							fh.deleted = 0 AND fh.PracGUID = tca.PracGUID AND fh.rok = tca.YYYY 
						ORDER BY fh.miesiac 
						DESC LIMIT 1
					),
					
					IF(tca.Sekcja = 'URL.N.Z', 
						NULL,		-- na razie NULL - dawny v.WymiarUZP - v.WykUZPdni, 
						NULL
					)
				)) AS Pozostalo_D,
			
			--	GODZINOWE
			-- 	Wymiar_H,	
				_varDouble(
				IF(tca.Sekcja = 'OPIEK.ZDR.DZ',	-- OPIEK_ZDR_DZ_Wymiar_H
					(p.GodzOpiekiZdroweDziecko * @FrekwPrec.MinFact/60),
					NULL
				)) AS Wymiar_H,
			--	Wykorzystano_H =	
				_varDouble(
				IF(tca.Sekcja = 'OPIEK.ZDR.DZ',	-- OPIEK_ZDR_DZ_Wykorz_H
					(
					(
						SELECT 
							IFNULL(SUM(fzd.D_godz), 0) 
						FROM `frekw` fzd 
						WHERE 
							-- było fzd.PracGUID = f.PracGUID AND fzd.deleted = 0 AND fzd.rok = @.select.Y AND fzd.miesiac <= @.select.M
							fzd.PracGUID = tca.PracGUID AND fzd.deleted = 0 AND fzd.YYYY_MM <= tca.YYYY_MM
					) * @FrekwPrec.MinFact/60 -- GODZ wykorzystana opieka nad zdrowym dzieckiem
					), -- GODZ wykorzystana opieka nad zdrowym dzieckiem
					NULL
				)) AS Wykorzystano_H,
			--	Pozostalo_H
				_varDouble(
				IF(tca.Sekcja = 'OPIEK.ZDR.DZ',
					NULL,	-- na razie NULL nizej ustawiamy
					NULL
				)) AS Pozostalo_H,
				-- SUM(NOT (t.Abs_Wniosek) * t.Abs_godz_absencji) AS godz_absencji, SUM(t.Abs_dzien_absencji) AS ABS_D
				tca.*
			FROM `t_user_calendar_agg` tca
			INNER JOIN `t_PF_abs_sekcje` s ON s.Sekcja = tca.Sekcja
			INNER JOIN `Pracownicy` p ON p.GUID = tca.PracGUID 
			INNER JOIN `frekw` f ON f.PracGUID = tca.PracGUID AND f.deleted = 0 AND f.rok = tca.YYYY
			WHERE
				TRUE
				AND tca.Abs_Rodzaj IS NOT NULL
			/*
			FROM `t_user_calendar_agg` tca
			-- INNER JOIN `t_PF_abs_sekcje` s ON s.Sekcja = tca.Sekcja
			INNER JOIN `Pracownicy` p ON p.GUID = tca.PracGUID 
			LEFT JOIN `frekw` f ON f.PracGUID = tca.PracGUID AND f.deleted = 0 AND f.rok = tca.YYYY
			WHERE
				TRUE
				-- AND tca.Abs_Rodzaj IS NOT NULL
			*/
			GROUP BY PracGUID, Abs_Okres, Sekcja
			;
			UPDATE `t_user_calendar_sekcje_Frekw_AGG` tfagg
			SET
				tfagg.Pozostalo_D = IF(tfagg.Sekcja = 'URL.N.Z', tfagg.Wymiar_D - tfagg.Wykorzystano_D, tfagg.Pozostalo_D),
				tfagg.Pozostalo_H = IF(tfagg.Sekcja = 'OPIEK.ZDR.DZ', tfagg.Wymiar_H - tfagg.Wykorzystano_H, tfagg.Pozostalo_H )
				-- tfagg.Wykorzystano_D = IF(tfagg.Sekcja = 'URL.WYP', tfagg.Wykorzystano_D + , tfagg.Wykorzystano_D)
			WHERE
				TRUE
			;
		-- 	SELECT * FROM `t_user_calendar_sekcje_Frekw_AGG` tfagg;
		/******************************
			Budowanie VGrida ale najpierw
			Labele
		******************************/
			DROP TEMPORARY TABLE IF EXISTS `t_PF_abs_sekcje_labels`;
			CREATE TEMPORARY TABLE `t_PF_abs_sekcje_labels` (
			  `ID` VARCHAR(200) DEFAULT NULL,
			  `Caption` VARCHAR(200) DEFAULT NULL,
			  `LP` INTEGER DEFAULT 0,
			  PRIMARY KEY (`ID`)
			)--  ENGINE=MyISAM DEFAULT CHARSET=cp1250
			;
			TRUNCATE `t_PF_abs_sekcje_labels`;
			SET @LP := 0;
			INSERT IGNORE INTO `t_PF_abs_sekcje_labels`
			(ID, Caption, LP)
			VALUES
			('Wymiar', 'Wymiar:', @LP := @LP + 1),
			('Zalegly', 'Zaległy urlop:', @LP := @LP + 1),
			('Zaliczkowy', 'Urlop zaliczkowy:', @LP := @LP + 1),
			('Do_dzis', 'Do dziś wyk.:', @LP := @LP + 1),
			('Wykorzystano', 'Wykorzystano:', @LP := @LP + 1),
			('Pozostalo', 'Pozostało:', @LP := @LP + 1)
			;
			set @.X = concat_WS('/ ', @.X, 'INS labels');
		--	SELECT * FROM `t_PF_abs_sekcje_labels`;
		
		/******************************
			VGrid	
		******************************/
			DROP TEMPORARY TABLE IF EXISTS `t_PF_abs_sekcje_VGrid`;
			CREATE TEMPORARY TABLE `t_PF_abs_sekcje_VGrid` (
			  `Sekcja` VARCHAR(100) DEFAULT NULL,
			  `ID` VARCHAR(200) DEFAULT NULL,
			  `Caption` VARCHAR(200) DEFAULT NULL,
			  `Inf` VARCHAR(200) DEFAULT NULL,
			  `Inf2` VARCHAR(200) DEFAULT NULL,
			  `LP` INTEGER DEFAULT NULL,
			  `H` DOUBLE(16,4),		-- w godzinach gdy godziny 
			  `D` DOUBLE(16,4),		-- w dniach gdy w dniach i godzinach
			  `D_w_Ilu_D` INTEGER, 	-- gdy godziny w ilu dniach z ABS_D
			  `Abs_okres_typ` VARCHAR(20),
			  `VGridMask` VARCHAR(200) DEFAULT '',
			  `Visible` BOOLEAN DEFAULT TRUE,
			  PRIMARY KEY `SC`(`Sekcja`, `ID`)
			)--  ENGINE=MyISAM DEFAULT CHARSET=cp1250
			;
			TRUNCATE `t_PF_abs_sekcje_VGrid`;
			set @.X = concat_WS('/ ', @.X, 'INS');

			-- EXPLAIN 
			INSERT IGNORE INTO `t_PF_abs_sekcje_VGrid`
			(Sekcja, ID, Caption, LP, Inf2, H, D, D_w_Ilu_D, Abs_okres_typ, VGridMask, Visible)
			SELECT
				ts.Sekcja, tl.ID, tl.Caption, ts.LP*1000 + tl.LP,
				IFNULL(
					IF(tl.ID IN ('Wykorzystano', 'Do_dzis!!'),
						_Format_DT_Range_Mask(tfagg.ABS_MIN_Date, tfagg.ABS_MAX_Date, '%D %mmm %YH;%D %mmm %YH;',  '[od][#from#][do][#to#]') 
						/*
						CONCAT(
							'od ', 
							_Format_DT(tfagg.ABS_MIN_Date, '%DZ%DW %D %mmm %YH'), 
							' do ', 
							_Format_DT(tfagg.ABS_MAX_Date, '%DZ%DW %D %mmm %YH')
						)
						*/
						,
						NULL
					)
				, '') AS Inf2,
				(
					CASE 
					WHEN tl.ID = 'Wymiar' THEN tfagg.Wymiar_H
					-- WHEN tl.ID = 'Zalegly' THEN tfagg.Zalegly_H
					-- WHEN tl.ID = 'Zaliczkowy' THEN tfagg.Zaliczkowy_H
					WHEN tl.ID = 'Wykorzystano' THEN tfagg.Wykorzystano_H
					WHEN tl.ID = 'Pozostalo' THEN tfagg.Pozostalo_H
					WHEN tl.ID = 'Do_dzis' THEN tfagg.ABS_do_dzis_H
					ELSE
					NULL
					END
				) AS H,
				(
					CASE 
					WHEN tl.ID = 'Wymiar' THEN tfagg.Wymiar_D
					WHEN tl.ID = 'Zalegly' THEN tfagg.Zalegly_D
					WHEN tl.ID = 'Zaliczkowy' THEN tfagg.Zaliczkowy_D
					WHEN tl.ID = 'Wykorzystano' THEN tfagg.Wykorzystano_D
					WHEN tl.ID = 'Pozostalo' THEN tfagg.Pozostalo_D
					WHEN tl.ID = 'Do_dzis' THEN tfagg.ABS_do_dzis_D
					ELSE
					NULL
					END
				) AS D,
				IF(tfagg.Abs_okres_typ LIKE '%H%' AND tl.ID IN ('Wykorzystano', 'Do_dzis'),
					ABS_D,
					NULL
				) AS D_w_Ilu_D,
				IFNULL(tfagg.Abs_okres_typ, ts.okres_typ) AS Abs_okres_typ,
				-- tfagg.VGridMask,
				_Midle_Two_Sep(IFNULL(tfagg.VGridMask, ts.VGridMask), CONCAT('{', tl.ID, ':'), '}') AS VGridMask,
				(
					CASE 
					WHEN tl.ID = 'Wymiar' THEN ts.Sekcja IN ('URL.WYP', 'URL.N.Z', 'OPIEK.ZDR.DZ')
					WHEN tl.ID = 'Zalegly' THEN ts.Sekcja IN ('URL.WYP')
					WHEN tl.ID = 'Zaliczkowy' THEN ts.Sekcja IN ('URL.WYP')
					WHEN tl.ID = 'Wykorzystano' THEN 1 -- dla wszystkich
					WHEN tl.ID = 'Pozostalo' THEN ts.Sekcja IN ('URL.WYP', 'URL.N.Z', 'OPIEK.ZDR.DZ')
					WHEN tl.ID = 'Do_dzis' THEN ts.Sekcja IN ('URL.WYP', 'URL.N.Z', 'OPIEK.ZDR.DZ')
					ELSE
					0
					END
				) AS Visible
			/*
			było
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_labels` tl, `t_user_calendar_sekcje_Frekw_AGG` tfagg
			WHERE
				tfagg.Sekcja = ts.Sekcja
			jest */
			FROM `t_PF_abs_sekcje` ts
			INNER JOIN `t_PF_abs_sekcje_labels` tl
			LEFT JOIN `t_user_calendar_sekcje_Frekw_AGG` tfagg ON tfagg.Sekcja = ts.Sekcja
			WHERE
				TRUE -- tfagg.Sekcja = ts.Sekcja
			GROUP BY Sekcja, ID
			;
			set @.X = concat_WS('/ ', @.X, 'PO INS', ROW_COUNT());
			UPDATE `t_PF_abs_sekcje_VGrid` tv
			SET
				tv.Inf = 
					/*
					tu jest ręczne ale pewne
					IF(tv.Abs_okres_typ LIKE '%H%' AND tv.Sekcja <> 'URL.WYP',
						_Concat_Value1_Value2(_DisplayDurationH('H', tv.H, '', ''), '', 'b.d.', CONCAT('w ', tv.D_w_Ilu_D), 'dn', '', '(', ')'),
						_Concat_Value1_Value2(ROUND(tv.D), 'dn', 'b.d.', _DisplayDurationH('H', tv.H, '', ''), '', '', '(', ')')
					)
					a poniżej z maskami
					*/
					TRIM(
						REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(_VarStr(tv.VGridMask),
						'#VD dn', '#VD'),	--  dn bedzie dodawane zawsze za dniami
						'(w #VD)', IFNULL(CONCAT(_VarStr('(w '), ROUND(tv.D), ' dn)'), 'b.d.')),
						'(#VD)', IFNULL(CONCAT('(', ROUND(tv.D), ' dn '), 'b.d.')),
						'#VD', IFNULL(CONCAT(ROUND(tv.D), ' dn '), 'b.d.')),
						
						'(#VH)', IFNULL(CONCAT('(', _DisplayDurationH('H', tv.H, '', ''), ')'), '')),
						'#VH', IFNULL(_DisplayDurationH('H', tv.H, '', ''), '')),
						'  ', ' ')
					),
				tv.Caption = 	
					IF(tv.ID = 'Wykorzystano' AND tv.Sekcja = 'URL.WYP',
						'Wykorzystano (wraz z n/ż):',
						tv.Caption
					)
			WHERE
				TRUE
				AND tv.Visible
			;
		--	Na koniec przenieś opis zakresu dat do opisu posz. sekcji
			UPDATE `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_VGrid` tv
			SET
				-- ts.OpisFull = 
				ts.Opis = 
					CONCAT_WS('',
						ts.Opis,
						' (', 2021, ' r.)'
						' - w okresie: ', tv.Inf2
					)
			WHERE
					ts.Sekcja = tv.Sekcja
					AND tv.ID = 'Wykorzystano'
			;
			
			SELECT
				tv.*
			FROM `t_PF_abs_sekcje_VGrid` tv
			WHERE
				TRUE
				AND tv.Visible
			ORDER BY tv.LP
			;
			
		
		END IF;
		
		IF _MODE IN ('DASHBOARD.Sekcje.Select.Inf', 'DASHBOARD.Sekcje.Select.Inf.OLD') THEN
		/************************************************************************************************************************************************
			Lista absencji dla wszystkich sekcji dla prac. _Key2
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Inf', '', 'UserGUID', '', '', '', '', '', '');
			_Key2		_OsobaGUID
		************************************************************************************************************************************************/
			IF _MODE IN ('DASHBOARD.Sekcje.Select.Inf') THEN
				CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Select.Inf.2.0', '', _OsobaGUID, _Key3, '', '', '', '', ''); 
				LEAVE S_crm_porta_fide_tools;
			END IF;
			CALL crm_porta_fide_tools('DASHBOARD.Sekcje.Create.Sekcje', '', '', '', '', '', '', '', '');
			CALL crm_porta_fide_tools('user_calendar.Prepare.for.Osoba', '', _OsobaGUID, '', _FirstDayY(CURRENT_DATE()), _LastDayY(CURRENT_DATE()), '', '', '');
		--	Zbieranie ogólnych wartości (tak jak w starym panelu w PortaFide)	
			DROP TEMPORARY TABLE IF EXISTS `t_PF_abs_sekcje_all`;
			CREATE TEMPORARY TABLE `t_PF_abs_sekcje_all` 
			SELECT 
				(@.select.Y := YEAR(CURRENT_DATE())) AS Curr_YEAR,
				(@.select.M := MONTH(CURRENT_DATE())) AS Curr_MONTH,
				SUM(W_dni) AS WykWypDni, 	-- urlop wypoczynkowy
				SUM(G_dni) AS WykUZPdni,	-- urlop na żądanie pracownika
				(
					SELECT 
						fh.PozostUrlopWypoczDni 
					FROM `frekw` fh
					WHERE 
						fh.deleted = 0 AND fh.PracGUID = p.GUID AND fh.rok = YEAR(CURRENT_DATE()) 
					ORDER BY fh.miesiac 
					DESC LIMIT 1
				) AS PozostUrlopWypoczDni, 	-- poz. urlop wypoczynkowy
				p.WymiarUrlopuDni AS WymiarUrlopu, 	-- wymiar urlop wypoczynkowy
				p.UrlopZPDni AS WymiarUZP, 			-- wymiar urlop na żądanie pracownika
				p.IleDniZaleglegoUrlopuDni AS PozostUrlopZaleglyDni,  -- zaleg. urlop wypoczynkowy
				(
					SELECT 
						IFNULL(SUM(DATEDIFF(IFNULL(a.PelnaAbsencjaDo, a.AbsencjaDo), IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd))+1), 0) AS iloscDni 
					FROM `absencje` a 
					-- POCO?? LEFT JOIN absencje_dict ad ON ad.idn = a.rodzaj 
					WHERE 
						a.GUIDpr = f.PracGUID AND a.rodzaj = 14 AND YEAR(IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd)) = @.select.Y
				) AS WykDniOpiekiZdroweDziecko, 	--  opieka nad zdrowym dzieckiem
			--	DniOpiekiZdroweDziecko -> OPIEK_ZDR_DZ_WYM_D???
				p.DniOpiekiZdroweDziecko, 			-- opieka nad zdrowym dzieckiem
			--	GodzOpiekiZdroweDziecko -> OPIEK_ZDR_DZ_Wymiar_H
				(@.OPIEK_ZDR_DZ_Wymiar_H := 
					(p.GodzOpiekiZdroweDziecko * @FrekwPrec.MinFact/60)
				) AS OPIEK_ZDR_DZ_Wymiar_H, 			-- GODZ wymiar opieki nad zdrowym dzieckiem - NOWE
			--	GodzWykOpiekaZdroweDziecko -> OPIEK_ZDR_DZ_Wykorz_H
				(@.OPIEK_ZDR_DZ_Wykorz_H := 
					(
					(
						SELECT 
							IFNULL(SUM(fzd.D_godz), 0) 
						FROM `frekw` fzd 
						WHERE 
							fzd.PracGUID = f.PracGUID AND fzd.deleted = 0 AND fzd.rok = @.select.Y AND fzd.miesiac <= @.select.M
					) * @FrekwPrec.MinFact/60
					) 
				) AS OPIEK_ZDR_DZ_Wykorz_H, -- GODZ wykorzystana opieka nad zdrowym dzieckiem
				(@.OPIEK_ZDR_DZ_Wymiar_H - @.OPIEK_ZDR_DZ_Wykorz_H) AS OPIEK_ZDR_DZ_Pozost_H,
				p.IleDniZaleglegoUrlopu, 	-- urlop wypoczynkowy
				p.UrlopZaliczkowy, 		-- urlop wypoczynkowy
				(f.DostepnyUrlWypoczGodz/60) AS DostepnyUrlWypoczGodz, 		-- urlop wypoczynkowy
				f.DostepnyUrlWypoczDni,	-- urlop wypoczynkowy
				(f.PozostUrlopZaleglyGodz/60) AS PozostUrlopZaleglyGodz,	-- urlop wypoczynkowy
				(f.UrlopZaliczkGodz/60) AS UrlopZaliczkGodz, 	-- urlop wypoczynkowy
				f.UrlopZaliczkDni, 		-- urlop wypoczynkowy
				(f.NaZadanieGodz/60) AS `NaZadanieGodz`, 	-- urlop na żądanie pracownika
				f.NaZadanieDni, 		-- urlop na żądanie pracownika
				(f.UrlopWypoczEkwiwGodz/60) AS`UrlopWypoczEkwiwGodz`, 	-- urlop wypoczynkowy
				f.UrlopWypoczEkwiw 		-- urlop wypoczynkowy,
			
			FROM `frekw` f
			INNER JOIN `Pracownicy` p ON p.GUID = PracGUID 
			WHERE 
				TRUE
				-- AND f.PracGUID ='{4689A192-0BC4-4A21-AF51-3B8149A94E21}' 
				AND f.PracGUID = _OsobaGUID
				AND f.deleted = 0
				AND f.rok = YEAR(CURRENT_DATE())
			;
			DROP TEMPORARY TABLE IF EXISTS `t_PF_abs_sekcje_inf`;
			CREATE TEMPORARY TABLE `t_PF_abs_sekcje_inf` (
			  `ID` VARCHAR(200) DEFAULT NULL,
			  `Sekcja` VARCHAR(100) DEFAULT NULL,
			  `Caption` VARCHAR(200) DEFAULT NULL,
			  `Inf` VARCHAR(200) DEFAULT NULL,
			  `LP` INTEGER DEFAULT NULL,
			  PRIMARY KEY `SC`(`Sekcja`, `Caption`)
			)--  ENGINE=MyISAM DEFAULT CHARSET=cp1250
			;
			UPDATE `t_PF_abs_sekcje` ts
			SET
				ts.IleDni_w_tym_roku_fp = 
			--	pozostałe rodzaje rodzajów absencji (np. url.macierz.) zliczamy (dni) z `frekw_po`
				(
					SELECT 
						SUM(IF(p.absencja = ts.symbol, 1, 0) ) 
					FROM `frekw` n, `frekw_po` p 
					WHERE 
						TRUE
						-- AND n.PracGUID ='{4689A192-0BC4-4A21-AF51-3B8149A94E21}' 
						AND n.PracGUID = _OsobaGUID
						AND n.deleted = 0
						AND n.rok = YEAR(CURRENT_DATE())
						AND p.FrekwGUID = n.guid
						-- AND p.PracGUID = a.guidpr 
						AND p.rok_msc_dzien <= CURRENT_DATE() 
				),
				ts.IleDni_w_tym_roku_abs =
				(
					SELECT 
						-- IFNULL(SUM(DATEDIFF(IFNULL(a.PelnaAbsencjaDo, a.AbsencjaDo), IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd))+1), 0) AS iloscDni 
						IFNULL(SUM(a.dni_absencji), 0) AS iloscDni 
					FROM `absencje` a
					WHERE 
						TRUE
						AND YEAR(IFNULL(a.PelnaAbsencjaOd, a.AbsencjaOd))=YEAR(CURRENT_DATE()) 
						-- AND a.GUIDpr = '{4689A192-0BC4-4A21-AF51-3B8149A94E21}' 
						AND a.GUIDpr = _OsobaGUID
						AND a.Rodzaj = ts.Abs_rodzaj
				)
			;
			TRUNCATE `t_PF_abs_sekcje_inf`;
			SET @LP := 0, @.BD.Str = 'b.d.';
			
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'Wymiar', ts.Sekcja, 'Wymiar:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.WymiarUrlopu), 'dn', 'b.d.', NULL, '', '', '(', ')')
				WHEN 'URL.N.Z' THEN _Concat_Value1_Value2(ROUND(v.WymiarUZP), 'dn', 'b.d.', NULL, '', '', '(', ')') 
				-- WHEN 'OPIEK.ZDR.DZ' THEN CONCAT(ROUND(v.DniOpiekiZdroweDziecko), ' dn')
				WHEN 'OPIEK.ZDR.DZ' THEN _Concat_Value1_Value2(_DisplayDurationH('H', v.OPIEK_ZDR_DZ_Wymiar_H, '', ''), '', 'b.d.', NULL, '', '', '(', ')') 
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			;
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'Zalegly', ts.Sekcja, 'Zaległy urlop:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.PozostUrlopZaleglyDni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			;
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'Zaliczkowy', ts.Sekcja, 'Urlop zaliczkowy:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.UrlopZaliczkowy), 'dn', 'b.d.', NULL, '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			;
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'Wykorzystano', ts.Sekcja, 'Wykorzystano:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.WykWypDni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				WHEN 'URL.N.Z' THEN _Concat_Value1_Value2(ROUND(v.WykUZPdni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				WHEN 'OPIEK.ZDR.DZ' THEN _Concat_Value1_Value2(_DisplayDurationH('H', v.OPIEK_ZDR_DZ_Wykorz_H, '', ''), '', 'b.d.', NULL, '', '', '(', ')')
				ELSE
					_Concat_Value1_Value2(NULLIF(t.ABS_D, 0), 'dn', '(brak)', NULL, '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts 
			INNER JOIN `t_PF_abs_sekcje_all` v ON TRUE
			LEFT JOIN `t_user_calendar_agg` t ON t.PracGUID = _OsobaGUID AND t.Sekcja = ts.Sekcja AND t.Abs_Okres = YEAR(CURRENT_DATE())
			;
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'Pozostalo', ts.Sekcja, 'Pozostało:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.PozostUrlopWypoczDni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				WHEN 'URL.N.Z' THEN _Concat_Value1_Value2(ROUND(v.WymiarUZP - v.WykUZPdni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				WHEN 'OPIEK.ZDR.DZ' THEN _Concat_Value1_Value2(_DisplayDurationH('H', v.OPIEK_ZDR_DZ_Pozost_H, '', ''), '', 'b.d.', NULL, '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			;
		--	????? nie ma go w opisie AS	
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'UrlopZaliczkDni', ts.Sekcja, 'UrlopZaliczkDni i Godz:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.UrlopZaliczkDni), 'dn', 'b.d.', _DisplayDurationH('D/H', v.UrlopZaliczkGodz, '', ''), '', '', '(', ')')
				-- NULLIF(CONCAT_WS(' ', CONCAT(ROUND(v.UrlopZaliczkDni), ' dn'), CONCAT('(', NULLIF(_DisplayDurationH('D/H', v.UrlopZaliczkGodz, '', ''), ''), ')')), '')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			WHERE FALSE 	-- nie ma go w opisie AS	
			;
		--	????? nie ma go w opisie AS	
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'DostepnyUrlWypoczGodz', ts.Sekcja, 'DostepnyUrlWypoczGodz:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.DostepnyUrlWypoczGodz), 'dn', 'b.d.', NULL, '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			WHERE FALSE 	-- nie ma go w opisie AS	
			;
		--	????? nie ma go w opisie AS	
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'UrlopWypoczEkwiw', ts.Sekcja, 'UrlopWypoczEkwiw:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.UrlopWypoczEkwiw), 'dn', 'b.d.', _DisplayDurationH('D/H', v.UrlopWypoczEkwiwGodz, '', ''), '', '', '(', ')')
				END, 
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			WHERE FALSE 	-- nie ma go w opisie AS	
			;
		--	????? nie ma go w opisie AS	
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'DostepnyUrlWypoczDni', ts.Sekcja, 'DostepnyUrlWypoczDni:', 
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.DostepnyUrlWypoczDni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				END, 
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			WHERE FALSE 	-- wg AS won 2021-10-04
			;
		--	????? nie ma go w opisie AS	
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'PozostUrlopZaleglyDni', ts.Sekcja, 'PozostUrlopZaleglyDni:',  
				CASE ts.Sekcja 
				WHEN 'URL.WYP' THEN _Concat_Value1_Value2(ROUND(v.PozostUrlopZaleglyDni), 'dn', 'b.d.', NULL, '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			WHERE FALSE 	-- nie ma go w opisie AS	
			;
		--	????? nie ma go w opisie AS	
			INSERT IGNORE INTO `t_PF_abs_sekcje_inf`
			SELECT 
				'NaZadanieDni', ts.Sekcja, 'NaZadanieDni i godz:', 
				CASE ts.Sekcja 
				WHEN 'URL.N.Z' THEN _Concat_Value1_Value2(ROUND(v.NaZadanieDni), 'dn', 'b.d.', _DisplayDurationH('D/H', v.NaZadanieGodz, '', ''), '', '', '(', ')')
				END,
				ts.Abs_Rodzaj*1000 + @LP := @LP + 1
			FROM `t_PF_abs_sekcje` ts, `t_PF_abs_sekcje_all` v
			WHERE FALSE 	-- wg AS won 2021-10-04
			;
			SELECT 
				ti.* 
			FROM `t_PF_abs_sekcje_inf` ti 
			WHERE 
				ti.Inf IS NOT NULL 
			ORDER BY ti.LP, ti.Sekcja, ti.LP
			;
			
		END IF;
		
	END IF;
	
	IF _MODE = 'GET.DATE.RANGE.Result' THEN
	/************************************************************************************************************************************************
		Stare ale spr. kto uzywa
		teraz 
		'crm.Wniosek.GET.DATE.RANGE.Result'
		
		Tworzy zdarzenie _Key przez osobe _Key2 z szablonu _Key3.
		CALL crm_porta_fide_tools('GET.DATE.RANGE.Result', 'crmGUID', 'Prac70', '', 'DataOD', 'DataDO', '', '', '');
		_Key		_crmGUID
		_Key2		_OsobaGUID
		_Param_A	Data OD
		_Param_B	Data Do
	************************************************************************************************************************************************/
		SET _crmGUID = IFNULL(_Key, '');
		-- było SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
		SET _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID);
		CALL crm_INSERT('z.szablonu', _crmGUID, _Key3, 16, 0, _Param_A, _Param_B, 0.5, '', NULL, NULL, _OsobaGUID, '', '', '', 0, 4, 'new', 'new');
		SELECT 
			a.AbsencjaOd, a.AbsencjaDo, IFNULL(ad.definicja, '?') AS Opis
		FROM `absencje` a
		LEFT JOIN `absencje_dict` ad ON ad.Idn = ABS(a.Rodzaj)
		WHERE
			a.GUIDpr = _OsobaGUID
			AND
			_TimeRange('conflict', DATE(_Param_A), DATE(_Param_B), a.AbsencjaOd, a.AbsencjaDo, '', '')
			AND a.GUID != _crmGUID
		;		
	END IF;
	
	IF _MODE LIKE 'crm.Wniosek.%' THEN
		IF _MODE = 'crm.Wniosek.NEW.SELECT.Rodzaje' THEN
--	UWAGA zastąpic jakims uniwrsalnym selectem w wokflow - i zmienic wywołanie u DARKA!!!
		/************************************************************************************************************************************************
			Tworzy zdarzenie _Key przez osobe _Key2 z szablonu _Key3.
			CALL crm_porta_fide_tools('crm.Wniosek.NEW.SELECT.Rodzaje', '', '', '', '', '', '', '', '');
		************************************************************************************************************************************************/
			SELECT 
				cr.Rodzaj, 
				cr.PodRodzaj, 
				cr.Alg_Typ AS Wniosek_Typ,
				/*
				IF(IFNULL(ad.Idn, 0) > 0,
					'W.ABSENCJA',
						CASE 
							WHEN cr.PodRodzaj = 1 THEN 'W.ZALICZKA'
							WHEN cr.PodRodzaj = 2 THEN 'W.ZAPOMOGA'
							WHEN cr.PodRodzaj = 3 THEN 'W.POZYCZKA'
							WHEN cr.PodRodzaj = 5 THEN 'W.SZKOLENIE'
							WHEN cr.PodRodzaj = 6 THEN 'W.DELEGACJA'
							ELSE 
								'???'
						END
				) AS Wniosek_Typ,
				*/
				ad.Idn IS NOT NULL AS IsAbsencja,
				IFNULL(ad.Idn, 0) AS Rodzaj_Absencji,
				IFNULL(ad.okres_typ, 'D') AS okres_typ, 	-- gdy nie absencja to na razie uznaj że "D" czyli dniowa
				CONCAT_WS(' - ', cr.Nazwa, ad.Definicja) AS Nazwa,
				cr.Opis,
				cr.Def_confirm_statuses,
				cr.ExtFlags_Init,
				(
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = cr.Def_confirm_statuses
							AND cwr.UserGUID = 'szef'
					)
				) AS IS_Szef,
				(
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = cr.Def_confirm_statuses
							AND cwr.UserGUID = 'bryg'
					)
				) AS IS_Brygadzista,
				(
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = cr.Def_confirm_statuses
						AND cwr.UserGUID = 'zastepca'
					)
					OR
					EXISTS(
						SELECT
							-- cwd.uDW
							cwd.Param2
						FROM `crm_workflow_def` cwd
						WHERE
							cwd.Def = cr.Def_confirm_statuses 
							-- AND cwd.uDW LIKE '%zastepca%'
							AND cwd.Param2 LIKE '%uAbsZast%'
					)
				) AS IS_Zastepca,
				cr.* 
			FROM `crm_rodzaje` cr 
			LEFT JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = cr.Rodzaj AND ad.Wniosek_podrodzaj = cr.Podrodzaj
			WHERE 
				cr.Rodzaj = 16
				AND NOT cr.Deleted
			;
		END IF;
		
		IF _MODE = 'crm.Wniosek.GET.DATE.RANGE.Result' THEN
--	UWAGA zapytaj Darka i zastąpic check!!!
--	8 XII 2022 Już wiem - jest wołana ale z nie używanych kodów PHP na razie robimy LEAVE !!!! do ZAORANIA TEN MODE
		/************************************************************************************************************************************************
			Zwraca konflikty absencyjne
			CALL crm_porta_fide_tools('crm.Wniosek.GET.DATE.RANGE.Result', 'crmGUID', 'Prac70', '', '', '', '', '', 'sznurek');
			_Key		_crmGUID
			_Key2		_OsobaGUID
		************************************************************************************************************************************************/
			LEAVE S_crm_porta_fide_tools;
			
		END IF;
		
		IF _MODE = 'crm.Wniosek.SELECT.Zastepca' THEN
		/************************************************************************************************************************************************
			Zwraca konflikty absencyjne
			CALL crm_porta_fide_tools('crm.Wniosek.SELECT.Zastepca', '', 'Nazwisko', '', '', '', '', '', '');
			_Key		
			_Key2		Nazwisko
		************************************************************************************************************************************************/
			SET 
				_crmGUID = IFNULL(_Key, ''),
				-- było _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID),
				@.Params = _Param_E
			;
			SELECT 
				ozast.GUID AS ZastepcaGUID,
				CONCAT_WS(' ', ozast.Nazwisko, ozast.Imie1) AS ZastepcaStr
				-- CONCAT_WS(' ', o.Nazwisko, o.Imiona) AS ZastepcaStr
			FROM `osoby` ozast, `Pracownicy` p
			WHERE
				TRUE
				AND ozast.Nazwisko = _Key2
				-- AND ozast.Nazwisko  IN (_Key2, 'KACPROWICZ')
				AND p.GUID = ozast.GUID
				AND (
					p.CzyObecniePracuje = 1
					OR
					p.firma_wspolprac <> 0
				)
			;	
		END IF;
		
		IF _MODE LIKE 'crm.Wniosek.GET.Limit.godzin.Dnia%' THEN
		/************************************************************************************************************************************************
			Zwraca konflikty absencyjne
			CALL crm_porta_fide_tools('crm.Wniosek.GET.Limit.godzin.Dnia', 'crmGUID', 'Prac70', '', '', '', '', '', 'sznurek');
			_Key		_crmGUID
			_Key2		_OsobaGUID
		************************************************************************************************************************************************/
			SET 
				_crmGUID = IFNULL(_Key, ''),
				-- było _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID),
				@.Params = _Param_E
			;
			SET
				@.crm.StartTime = _VarDateTime(_Params2('_FetchParams', '', @.Params, 'StartTime', '')),
				@.crm.Duration = IFNULL(NULLIF(_Params2('_FetchParams', '', @.Params, 'Duration', ''), ''), 0) -- puste lub NULL -> wstaw 0
			;
			SELECT
				kp.godziny/60
				-- k.rok, kp.*
			INTO
				@.kp.godziny
			FROM `Pracownicy` p, `kalendpracy` k, `kalendpracy_po` kp
			WHERE
				p.GUID = _OsobaGUID
				AND k.Symbol = p.SymbolKalendarza
				AND k.rok = YEAR(@.crm.StartTime)
				AND kp.GUIDNg = k.GUID
				AND kp.Data = DATE(@.crm.StartTime)
				-- AND kp.Data <= LEAST(NEW.AbsencjaDo, LAST_DAY(NEW.AbsencjaOd))
			LIMIT 1
			;
			IF _MODE = 'crm.Wniosek.GET.Limit.godzin.Dnia.SELECT' THEN
				SELECT 
					(@.crm.Duration > @.kp.godziny) AS Err,
					IF(@.crm.Duration <= @.kp.godziny,
						'',
						CONCAT_WS('',
							'Podana liczba godzin (', @.crm.Duration,'h) ',
							'jest większa niż nominalny czas pracy: ', @.kp.godziny, 'h ',
							'dnia ', DATE(@.crm.StartTime)
						)
					) AS Msg
				;
			ELSE
				SELECT @.kp.godziny AS Limit_godzin_nadzien;
			END IF;
		END IF;
		
		IF _MODE IN ('crm.Wniosek.SELECT.GUID', 'crm.Wniosek.SELECT.IDN_workflow') THEN	
		/************************************************************************************************************************************************
			_Key		_crmGUID
			_Key2		_OsobaGUID
			_Key3		to _IDN_workflow czyli IDN w `crm_workflow` KONIECZNY dla crm.Wniosek.SELECT.IDN_workflow
			CALL crm_porta_fide_tools('crm.Wniosek.SELECT.GUID', 'NewcrmGUID', 'OsobaGUID', '_IDN_workflow/NULL', '', '', '', '', '');
		************************************************************************************************************************************************/
			SET 
				_crmGUID = IFNULL(_Key, ''),
				-- było _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID),
				_IDN_workflow = IFNULL(NULLIF(_Key3, ''), 0)	-- zero gdy brak
			;
			CALL _Session_Refresh_Variables('', '', '');			
		--	ZASTEPCA ...
		--	Na wszelk. wyp. usun zast. nie spelniajacych warunk.	
			UPDATE `hr_self_links` hl
			SET
				hl.OsobaGUID_B = ''
			WHERE
				TRUE
				AND hl.Rel = '<-zastepca' 
				AND hl.A_Rel_Unique = 1
				AND hl.OsobaGUID_A = _OsobaGUID 	-- Osoba wejsciowa
				AND NOT EXISTS(
					SELECT 
						p.Idn
					FROM `osoby` o, `Pracownicy` p
					WHERE
						o.GUID = hl.OsobaGUID_B
						AND p.GUID = o.GUID
						AND p.CzyObecniePracuje = 1
						
				)
			;
			/* 	było
			SELECT
				c.GUID,
				c.Temat,
				c.Opis,
				IFNULL(c.www_tag_text, '') AS www_tag_text,	-- jako opis dodatkowy dołączny do pola opis który jest składany autom. 
				IF(IFNULL(ad.Idn, 0) > 0,
					'W.ABSENCJA',
						CASE 
							WHEN c.PodRodzaj = 1 THEN 'W.ZALICZKA'
							WHEN c.PodRodzaj = 2 THEN 'W.ZAPOMOGA'
							WHEN c.PodRodzaj = 3 THEN 'W.POZYCZKA'
							WHEN c.PodRodzaj = 5 THEN 'W.SZKOLENIE'
							WHEN c.PodRodzaj = 6 THEN 'W.DELEGACJA'
							ELSE 
								'???'
						END
				) AS Wniosek_Typ,
				ad.Idn IS NOT NULL AS IsAbsencja,
				IFNULL(ad.Idn, 0) AS Rodzaj_Absencji,
				IFNULL(ad.okres_typ, 'D') AS okres_typ, 	-- gdy nie absencja to na razie uznaj że "D" czyli dniowa
				MONTH(c.Data) AS Plan_Month,
				YEAR(c.Data) AS Plan_Year,
				c.AreaGUID AS Oddzial,
				CONCAT(d.Symbol, ' ', d.Nazwa) AS Oddzial_Str,
				CONCAT(owner.Nazwisko, ' ', owner.Imiona) AS Hadlowiec_Nazw,
				CONCAT(owner.idnuser) AS Hadlowiec_IdnUser,
				cr.nazwa AS typ_nazwa, -- c.GUID, c.data, c.temat, c.opis, c.startTime, c.endTIme, c.status, c.duration, 
				_VarStr(CONCAT_WS('', st.statusName, ': "', cw.Status_Current, '"')) AS Status_Info,
			
				cw.IDN AS workflow_idn,
				
				s_c.Descr_status,
				_VarINT(
					-- (c.STATUS IN (3, 4, 8, 11, 13, 14)) BEZ 13 ki !!!
					(c.STATUS IN (3, 4, 8, 11, 14))
					AND 
					(CURRENT_DATE() > c.Data)			
				) AS IsArchiwum,
				c.Data, 
				c.DeadLine, 
				c.confirm_status,
				c.StartTime,
				c.EndTime,
				c.duration, 
				IFNULL(c.status2, 0) AS godz_absencji_fixed,	-- UWAGA c.status2 dla absencji jako godz_absencji_fixed
				c.Work_EndTime,
				c.Status,
				@session.PL.IR.Event.Work.Default.Godz_Wej AS Default_Godz_Wej,
				EXISTS(
				SELECT
				 cwr.UserGUID
				 FROM `crm_workflow_def_responsible` cwr
				 WHERE
					cwr.Def = cr.Def_confirm_statuses
					AND cwr.UserGUID = 'szef'
				 
				) AS IS_Szef,
				EXISTS(
				SELECT
				 cwr.UserGUID
				 FROM `crm_workflow_def_responsible` cwr
				 WHERE
					cwr.Def = cr.Def_confirm_statuses
					AND cwr.UserGUID = 'bryg'
					-- and cwr.UserGUID = 'szef'
				 
				) AS IS_Brygadzista,
				(@.IS_Zastepca :=
				EXISTS(
				SELECT
				 cwr.UserGUID
				 FROM `crm_workflow_def_responsible` cwr
				 WHERE
					cwr.Def = cr.Def_confirm_statuses
					AND cwr.UserGUID = 'zastepca'
					-- and cwr.UserGUID = 'szef'
				 
				)
				) AS IS_Zastepca,
				ozast.GUID AS ZastepcaGUID,
				CONCAT_WS(' ', ozast.Nazwisko, ozast.Imie1) AS ZastepcaStr
				
				-- ,c.*
			FROM `crm_commisions` c 
			LEFT JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = c.Rodzaj AND ad.Wniosek_podrodzaj = c.Podrodzaj
			INNER JOIN `v_crm_usr_links` cul0 ON cul0.commisionGUID = c.GUID AND cul0.Poziom = 0
			LEFT JOIN `osoby` AS `owner` ON owner.GUID = cul0.Osoba
			INNER JOIN `v_crm_usr_links` cul ON cul.commisionGUID = c.GUID AND cul.poziom = 2
			INNER JOIN `grupy_osob` go ON go.grupaGUID = cul.Osoba
			LEFT JOIN `crm_rodzaje` cr ON cr.rodzaj = c.rodzaj AND cr.podrodzaj = c.podrodzaj
			LEFT JOIN `crm_confirm_statuses` s_c ON s_c.Def = cul.Def_confirm_statuses AND s_c.Status = c.confirm_status
			LEFT JOIN `status` st ON st.statusID = c.status
			LEFT JOIN `erp_division_schema` d ON d.GUID = c.AreaGUID
			LEFT JOIN `v_crm_workflow` cw ON cw.IDN = (SELECT cw.IDN FROM `v_crm_workflow` cw WHERE cw.commisionGUID = c.GUID ORDER BY idn LIMIT 1)
			LEFT JOIN `v_prac_zastepca` zast ON zast.PracGUID = _OsobaGUID
			LEFT JOIN `osoby` ozast ON ozast.GUID = zast.ZastepcaGUID
			WHERE 
				c.Rodzaj = 16
				AND c.Template_Osoba = '' 
				AND c.confirm_status != '' 
				-- AND go.OsobaGUID = _ID_2
				AND go.OsobaGUID = _OsobaGUID
				-- AND IF(_MODE = 'Select.1', c.GUID = 'NewcrmGUID', TRUE)
				AND IF(TRUE, c.GUID = _crmGUID, TRUE)
				
			GROUP BY c.GUID
			ORDER BY c.data DESC 
			LIMIT 530
			;
			*/
			SELECT
				c.GUID,
				c.Temat,
				c.Opis,
				IFNULL(c.www_tag_text, '') AS www_tag_text,	-- jako opis dodatkowy dołączny do pola opis który jest składany autom. 
				/* 
				IF(IFNULL(ad.Idn, 0) > 0,
					'W.ABSENCJA',
						CASE 
							WHEN c.PodRodzaj = 1 THEN 'W.ZALICZKA'
							WHEN c.PodRodzaj = 2 THEN 'W.ZAPOMOGA'
							WHEN c.PodRodzaj = 3 THEN 'W.POZYCZKA'
							WHEN c.PodRodzaj = 5 THEN 'W.SZKOLENIE'
							WHEN c.PodRodzaj = 6 THEN 'W.DELEGACJA'
							ELSE 
								'???'
						END
				) AS Wniosek_Typ,
				*/
				c.Wniosek_Typ,
				-- jmam ad.Idn IS NOT NULL AS IsAbsencja,
				c.IS_Absencja AS IsAbsencja,
				-- jmam IFNULL(ad.Idn, 0) AS Rodzaj_Absencji,
				c.Absencja_Rodzaj AS Rodzaj_Absencji,
				c.Kod_ABS,
				-- jmam IFNULL(ad.okres_typ, 'D') AS okres_typ, 	-- gdy nie absencja to na razie uznaj że "D" czyli dniowa
				c.okres_typ,
				MONTH(c.Data) AS Plan_Month,
				YEAR(c.Data) AS Plan_Year,
				c.AreaGUID AS Oddzial,
				-- jmam CONCAT(d.Symbol, ' ', d.Nazwa) AS Oddzial_Str,
				c.Oddzial_Str,
				-- jmam CONCAT(owner.Nazwisko, ' ', owner.Imiona) AS Hadlowiec_Nazw,
				c.Owner_Kto AS Hadlowiec_Nazw,
				-- jmama ??? CONCAT(owner.idnuser) AS Hadlowiec_IdnUser,
				-- jmama cr.nazwa AS typ_nazwa, -- c.GUID, c.data, c.temat, c.opis, c.startTime, c.endTIme, c.status, c.duration, 
				c.typ_nazwa,
				-- jmam _VarStr(CONCAT_WS('', st.statusName, ': "', cw.Status_Current, '"')) AS Status_Info,
				c.Status_Info,
				cw.IDN AS workflow_idn,
				
				-- jmam s_c.Descr_status,
				c.Descr_status,
				/* jmam
				_VarINT(
					-- (c.STATUS IN (3, 4, 8, 11, 13, 14)) BEZ 13 ki !!!
					(c.STATUS IN (3, 4, 8, 11, 14))
					AND 
					(CURRENT_DATE() > c.Data)			
				) AS IsArchiwum,
				*/
				c.Status_IsArchiwum AS IsArchiwum,
				c.Data, 
				c.DeadLine, 
				c.confirm_status,
				c.StartTime,
				c.EndTime,
				c.duration AS duration, 
				IFNULL(c.status2, 0) AS godz_absencji_fixed,	-- UWAGA c.status2 dla absencji jako godz_absencji_fixed
				-- jmam c.Work_EndTime,
				c.Status,
				@session.PL.IR.Event.Work.Default.Godz_Wej AS Default_Godz_Wej,
				(
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = c.Def_confirm_statuses
							AND cwr.UserGUID = 'szef'
					)
				) AS IS_Szef,
				(
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = c.Def_confirm_statuses
							AND cwr.UserGUID = 'bryg'
					)
				) AS IS_Brygadzista,
				(
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = c.Def_confirm_statuses
						AND cwr.UserGUID = 'zastepca'
					)
					OR
					EXISTS(
						SELECT
							-- cwd.uDW
							cwd.Param2
						FROM `crm_workflow_def` cwd
						WHERE
							cwd.Def = c.Def_confirm_statuses 
							-- AND cwd.uDW LIKE '%zastepca%'
							AND cwd.Param2 LIKE '%uAbsZast%'
					)
				) AS IS_Zastepca,
				ozast.GUID AS ZastepcaGUID,
				CONCAT_WS(' ', ozast.Nazwisko, ozast.Imie1) AS ZastepcaStr,
                c.LimitBackDate,
                c.LimitBackDaysWniosek
				
				-- ,c.*
			FROM `v_crm_workflow_coms2` c
			-- FROM `crm_commisions` c 
			-- jmam LEFT JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = c.Rodzaj AND ad.Wniosek_podrodzaj = c.Podrodzaj
			-- jmam INNER JOIN `v_crm_usr_links` cul0 ON cul0.commisionGUID = c.GUID AND cul0.Poziom = 0
			-- jmam LEFT JOIN `osoby` AS `owner` ON owner.GUID = cul0.Osoba
			-- jmam INNER JOIN `v_crm_usr_links` cul ON cul.commisionGUID = c.GUID AND cul.poziom = 2
			-- jmam INNER JOIN `grupy_osob` go ON go.grupaGUID = cul.Osoba
			-- jmam LEFT JOIN `crm_rodzaje` cr ON cr.rodzaj = c.rodzaj AND cr.podrodzaj = c.podrodzaj
			-- jmam ?? LEFT JOIN `crm_confirm_statuses` s_c ON s_c.Def = cul.Def_confirm_statuses AND s_c.Status = c.confirm_status
			-- jmam LEFT JOIN `status` st ON st.statusID = c.status
			-- jmam LEFT JOIN `erp_division_schema` d ON d.GUID = c.AreaGUID
			-- jmam LEFT JOIN `v_crm_workflow` cw ON cw.IDN = (SELECT cw.IDN FROM `v_crm_workflow` cw WHERE cw.commisionGUID = c.GUID ORDER BY idn LIMIT 1)
			-- jmam LEFT JOIN `v_crm_workflow` cw ON cw.IDN = (SELECT cw.IDN FROM `v_crm_workflow` cw WHERE cw.commisionGUID = c.GUID ORDER BY idn LIMIT 1)
			LEFT JOIN `crm_workflow` cw ON cw.IDN = (SELECT cw.IDN FROM `crm_workflow` cw WHERE cw.commisionGUID = c.GUID ORDER BY idn LIMIT 1)
			LEFT JOIN `v_prac_zastepca` zast ON zast.PracGUID = _OsobaGUID
			LEFT JOIN `osoby` ozast ON ozast.GUID = zast.ZastepcaGUID
			WHERE 
				c.Rodzaj = 16
				AND c.Template_Osoba = '' 
				AND c.confirm_status != '' 
				-- AND go.OsobaGUID = _ID_2
				AND c.Owner_GUID = _OsobaGUID
				-- AND go.OsobaGUID = _OsobaGUID
				-- AND IF(_MODE = 'Select.1', c.GUID = 'NewcrmGUID', TRUE)
				AND IF(TRUE, c.GUID = _crmGUID, TRUE)
			GROUP BY c.GUID
			ORDER BY c.data DESC 
			LIMIT 530
			;
			
			
		END IF;
		
		IF _MODE IN ('crm.Wniosek.INSERT') THEN	
		/************************************************************************************************************************************************
			Tworzy zdarzenie _Key przez osobe _Key2 z szablonu _Key3.
			CALL crm_porta_fide_tools('crm.Wniosek.INSERT', 'NewcrmGUID', 'OsobaGUID', 'SzablonGUID', '4', '', '', '', '');
			CALL crm_porta_fide_tools('crm.Wniosek.NEW.2.0', 'webdoc.kuku', 'Prac70', 'webdoc.16.0', 'Temat', 'Opis szerszy', '2', '', '');
			_Key		_crmGUID
			_Key2		_OsobaGUID
			_Key3		Szablon
			_Param_A	Typ wniosku/Podrodzaj tabeli crm_rodzaje (rodzaj zawsze 16, podrodzaj = _Param_A)
						UWAGA gdy Podrodzaj 100 .. 199 to absencja ale !! może się zdarzyć że < 100 dlatego spr. czy 
						w slowniku absencji nie ma rekordu wniosek_rodzaj = 16 AND wniosek_podrodzaj = _Param_A
						i jesli jest to jest to absencja
						Inne (4) podrodzaje sa predefiniowane i obsługiwane IF-ami
						(16, 1, 'Wniosek o zaliczkę', 'Wniosek o zaliczkę', 'Wniosek o zaliczkę', 'CRdzC_Wniosek', 44, 8, 1, 'web_crm', 'wnioskodawca', 'wnioskodawca', 0),
						(16, 2, 'Wniosek o zapomogę', 'Wniosek o zapomogę', 'Wniosek o zapomogę', 'CRdzC_Wniosek', 44, 8, 1, 'web_crm', 'wnioskodawca', 'wnioskodawca', 0),
						(16, 3, 'Wniosek o pożyczkę', 'Wniosek o pożyczkę', 'Wniosek o pożyczkę', 'CRdzC_Wniosek', 44, 8, 1, 'web_crm', 'wnioskodawca', 'wnioskodawca', 0),
						patrz wyżej (16, 4, 'Wniosek o urlop za wolne', 'Wniosek o urlop za wolne', 'Wniosek o urlop za wolne', 'CRdzC_Wniosek', 44, 8, 1, 'web_crm', 'wnioskodawca', 'wnioskodawca', 1),
						(16, 5, 'Wniosek o szkolenie', 'Wniosek o szkolenie', 'Wniosek o szkolenie', 'CRdzC_Wniosek', 44, 8, 1, 'web_crm', 'wnioskodawca', 'wnioskodawca', 1)
						
			_Param_B	Uwagi/Opis
			_Param_C	Typ (z `absencje_dict`)
			-- _Param_D	Inicjalny status
		************************************************************************************************************************************************/
			CALL _Session_Refresh_Variables('', '', '');
			SET 
				_crmGUID = IFNULL(NULLIF(_Key, ''), _Get_GUID_xxx('Wniosek.PF', '', '', '', '', '', '')),
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID),
				@.crm.Rodzaj = 16,
				@.crm.Podrodzaj = _Param_A
			;
--	TEST
	SET @session.globals.WORK.FLOW.Ver = '2024.02';
		--	WorkFLOW >= 2024
			IF @session.globals.WORK.FLOW.Ver >= '2024' THEN
				SET
					_Key = _crmGUID, 	-- musze tu wstawic bo potem poniżej _Key tworzy inną wartość 
					@.cwn.we.GUID = _crmGUID, 
					@.cwn.we.uOwner = _OsobaGUID,	-- patrz wyżej
					@.cwn.we.PodRodzaj = @.crm.Podrodzaj,	-- patrz wyżej
					@.cwn.we.D1 = DATE(NOW()),
					@.cwn.we.D2 = DATE(NOW()),
					@.cwn.we.DeadLine = NULL,
					@.cwn.we.dAbs = NULL, 
					@.cwn.we.tAbs = 0,
					@.cwn.we.Temat = NULL, 
					@.cwn.we.Opis = NULL, 
					@.cwn.we.ExtDescr = NULL
				;
											--	set @.watch.2024 = 'INS';			
				CALL P_crm_workflow_n('INSERT.from.@', _crmGUID, @_cwIdn, @_cwcIdn, @.cwn.we.uOwner, @_Param_A, @_Param_B, @_Param_C, @_Params);
											--	set @.watch.2024 = concat_ws('/', @.watch.2024, 'cw Insert.New', _crmGUID);			
				CALL crm_workflow_TOOLS('Insert.New', _crmGUID, 'new', '', '', '', '');
			END IF;
			
			SET 
			-- niżej...	_crmGUID = IFNULL(NULLIF(_Key, ''), _Get_GUID_xxx('Wniosek.PF', '', '', '', '', '', '')),
				_crmGUID = _Key,
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				@.crm.Rodzaj = 16,
				@.crm.Podrodzaj = _Param_A
				/*
				-- @.crm.Temat = NULLIF(_Params2('_FetchParams', '', @.Params, 'Temat', ''), ''),
				-- @.crm.Opis = NULLIF(_Params2('_FetchParams', '', @.Params, 'Opis', ''), ''),
				-- @.crm.Typ = NULLIF(_Params2('_FetchParams', '', @.Params, 'Typ', ''), ''),
				-- @.crm.StartTime = _VarDateTime(_Params2('_FetchParams', '', @.Params, 'StartTime', '')),
				-- @.crm.EndTime = _VarDateTime(_Params2('_FetchParams', '', @.Params, 'EndTime', '')),
				-- @.crm.Duration = (_Params2('_FetchParams', '', @.Params, 'Duration', '')),
				-- @.crm.confirm_status = (_Params2('_FetchParams', '', @.Params, 'confirm_status', '')),
				-- _IDN_workflow = NULLIF(_Params2('_FetchParams', '', @.Params, 'IDN_workflow', ''), ''), 	-- Powinno byc w _Key3 a gdy nie to z zapytania!!!
				-- _confirm_status = (_Params2('_FetchParams', '', @.Params, 'confirm_status', '')),
				-- @.cw.confirm_tekst = _Param_B	-- np. '(wysłany zaraz po utworzeniu)'
				*/
			;
			SELECT 
				cr.Alg_Typ
			INTO
				@.crm.Alg_Typ
			FROM `crm_rodzaje` cr
			WHERE	
				cr.Rodzaj = 16 AND cr.Podrodzaj = @.crm.Podrodzaj
			;
			IF @.crm.Alg_Typ LIKE 'W.DELEGACJA%' THEN
				SET @.crm.Alg_Typ = @.crm.Alg_Typ;
			END IF;
			IF @.crm.Alg_Typ LIKE 'W.SZKOLENIE%' THEN
				SET @.crm.Alg_Typ = @.crm.Alg_Typ;
			END IF;
			SET 
				_crmGUID = IFNULL(NULLIF(_crmGUID, ''), _Get_GUID_xxx('Wniosek.PF', '', '', '', '', '', ''))
			;
			-- CALL crm_INSERT('z.szablonu', _crmGUID, _Key3, @.crm.Rodzaj, @.crm.Podrodzaj, @.crm.Temat, @.crm.Opis, 0.5, '', NULL, NULL, _OsobaGUID, '', '', '', 0, 4, 'new', 'new');
			CALL crm_INSERT('', _crmGUID, _Key3, @.crm.Rodzaj, @.crm.Podrodzaj, null, null, 0.5, '', NULL, NULL, _OsobaGUID, '', '', '', 0, 4, 'new', 'new');
			
			IF @.crm.Podrodzaj = 0 THEN
				CALL crm_usr_links_INSERT('z.hr_self_links.szef', _crmGUID, '', _OsobaGUID, 1, 0, NULL, NULL, 'sent', '');
			ELSEIF @.crm.PodRodzaj = 1 THEN
				CALL crm_usr_links_INSERT('z.hr_self_links.szef', _crmGUID, '', _OsobaGUID, 3, 0, NULL, NULL, '', '');
			ELSE
				CALL crm_usr_links_INSERT('z.hr_self_links.szef', _crmGUID, '', _OsobaGUID, 1, 0, NULL, NULL, '', '');
			END IF;
			IF @.crm.PodRodzaj = 5 THEN
			--	szkolenia
				IF @session.globals.Owner = 'SKOK' THEN
				--	dodaj do CC (do wiad.) grupe audytorów
					CALL crm_usr_links_INSERT('insert', _crmGUID, '', 'AUDYTORZY_SZKOLEN', 3, 0, NULL, NULL, '', '');
					CALL crm_usr_links_INSERT('insert', _crmGUID, '', 'DZIAL_SZKOLENIE_Decyzje', 3, 0, NULL, NULL, '', '');
					CALL crm_usr_links_INSERT('insert', _crmGUID, '', 'PREZES_SZKOLENIE_Decyzje', 3, 0, NULL, NULL, '', '');
				END IF;
			END IF;
			IF @.crm.PodRodzaj = 6 THEN
			--	delegacje
				IF @session.globals.Owner = 'SKOK' THEN
				--	dodaj do CC (do wiad.) grupe audytorów
					CALL crm_usr_links_INSERT('z.hr_self_links.szef', _crmGUID, '', _OsobaGUID, 3, 0, NULL, NULL, '', '');
					CALL crm_usr_links_INSERT('insert', _crmGUID, '', 'DELEGACJE_Koordynatorzy', 3, 0, NULL, NULL, '', '');
					CALL crm_usr_links_INSERT('insert', _crmGUID, '', 'DELEGACJE_Decyzje', 3, 0, NULL, NULL, '', '');
					CALL crm_usr_links_INSERT('insert', _crmGUID, '', 'DELEGACJE_Wyplata', 3, 0, NULL, NULL, '', '');
				END IF;
			END IF;
			IF @session.globals.WORK.FLOW.Ver < '2024' THEN
            --	NOWY WorkFLOW	ALE do 2024
                CALL crm_workflow_TOOLS('Insert.New', _crmGUID, 'new', '', '', '', '');
            -- 	UWAGA w @.crm_workflow.Last.IDN jest ost. idn  
			END IF;

			UPDATE `crm_commisions` c
			LEFT JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = c.Rodzaj AND ad.Wniosek_podrodzaj = c.Podrodzaj
			SET
				-- c.Update_status = '->crm_workflow_n',
				c.Typ = IFNULL(ad.Idn, c.Typ),
				c.confirm_status = 'new', -- tutaj zawsze new,
				c.StartTime = DATE(NOW()),
				c.EndTime = DATE(NOW()),
				c.status2 = 0,	-- UWAGA c.status2 dla absencji jako godz_absencji_fixed
				c.deleted = 2	-- UWAGA w przy INSERT wstawiamy deleted = 2 w MODIFY zminiamy na 0 a w CANCEL gdy deleted = 2 USUWAMY!!!
			WHERE
				c.GUID = _crmGUID
			;
			IF _Param_E LIKE '%<select>%' THEN	
				SELECT _crmGUID AS GUID, @.crm_workflow.Last.IDN AS IDN_workflow;	--	zwracam IDN z `crm_workflow` aby mozna teraz zrobić 'crm.MODIFY.one'
			END IF;
		END IF;

		IF _MODE = 'crm.Wniosek.MODIFY' THEN
		/************************************************************************************************************************************************
			Modyfikujemy zdarzenie _Key przez osobe _Key2
			CALL crm_porta_fide_tools('crm.Wniosek.MODIFY', 'NewcrmGUID', 'OsobaGUID', '233333', '', '', '', '', '');
			_Key		_crmGUID
			_Key2		_OsobaGUID
			_Key3		to _IDN_workflow czyli IDN w `crm_workflow`
		************************************************************************************************************************************************/
			SET 
				_crmGUID = IFNULL(_Key, ''),
				-- było _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				_OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID),
				@.Params = _Param_E
			;
set @.watch.c1 = '1';			
			SET
				@.crm.Temat = NULLIF(_Params2('_FetchParams', '', @.Params, 'Temat', ''), ''),
				@.crm.Opis = NULLIF(_Params2('_FetchParams', '', @.Params, 'Opis', ''), ''),
				@.crm.www_tag_text = NULLIF(_Params2('_FetchParams', '', @.Params, 'www_tag_text', ''), ''), -- jako opis dodatkowy dołączny do pola opis który jest składany autom. 
				-- @.crm.Typ = NULLIF(_Params2('_FetchParams', '', @.Params, 'Typ', ''), ''),
				@.crm.StartTime = _VarDateTime(_Params2('_FetchParams', '', @.Params, 'StartTime', '')),
				@.crm.EndTime = _VarDateTime(_Params2('_FetchParams', '', @.Params, 'EndTime', '')),
				@.crm.Duration = IFNULL(NULLIF(_Params2('_FetchParams', '', @.Params, 'Duration', ''), ''), 0), -- puste lub NULL -> wstaw 0
				_IDN_workflow = IFNULL(NULLIF(_Params2('_FetchParams', '', @.Params, 'IDN_workflow', ''), ''), _Key3),	-- Powinno byc w _Key3 a gdy nie to z zapytania!!!
				@.abs.godz_absencji_fixed = NULLIF(_Params2('_FetchParams', '', @.Params, 'godz_absencji_fixed', ''), ''),
				@.cw.NEW.confirm_status = (_Params2('_FetchParams', '', @.Params, 'confirm_status', '')),
				@.cw.NEW.confirm_tekst = (_Params2('_FetchParams', '', @.Params, 'confirm_tekst', '')),	-- np. '(wysłany zaraz po utworzeniu)',
				@.crm.ZastepcaGUID = NULLIF(_Params2('_FetchParams', '', @.Params, 'ZastepcaGUID', ''), '')
			;
			IF @session.globals.WORK.FLOW.Ver >= '2024' THEN
				SET
					@.cwn.we.GUID = _crmGUID, 
					@.cwn.we.uOwner = _OsobaGUID,	-- patrz wyżej
					-- @.cwn.we.PodRodzaj = @.crm.Podrodzaj,	-- patrz wyżej
					@.cwn.we.D1 = @.crm.StartTime,	-- patrz wyżej
					@.cwn.we.D2 = @.crm.EndTime,	-- patrz wyżej
                    @.cwn.we.Duration = @.crm.Duration,
					@.cwn.we.DeadLine = NULL,
					@.cwn.we.dAbs = NULL, 
					@.cwn.we.tAbs = @.abs.godz_absencji_fixed,	-- patrz wyżej
					@.cwn.we.Temat = @.crm.Temat, 
					@.cwn.we.Opis = @.crm.Opis, 
					@.cwn.we.ExtDescr = @.crm.www_tag_text	-- patrz wyżej
				;
				CALL P_crm_workflow_n('UPDATE.from.@', _crmGUID, @_cwIdn, @_cwcIdn, @.cwn.we.uOwner, @_Param_A, @_Param_B, @_Param_C, @_Params);
				
				SELECT 
					cwn.Rodzaj, cwn.Podrodzaj, cwn.crmStatus, cwn.cwStatus,
					cwn.Alg_Typ AS Wniosek_Typ,
					IFNULL(ad.okres_typ, 'D') AS okres_typ, 	-- gdy nie absencja to na razie uznaj że "D" czyli dniowa
					EXISTS(
						SELECT
							cwr.UserGUID
						FROM `crm_workflow_def_responsible` cwr
						WHERE
							cwr.Def = cwn.Def
							AND cwr.UserGUID = 'zastepca'
						) AS IS_Zastepca_cw,	-- jest zastępca ale faktycznie jest w work flow!!! a nie jako RE
					EXISTS(
						SELECT
							-- cwd.uDW
							cwd.Param2
						FROM `crm_workflow_def` cwd
						WHERE
							cwd.Def = cwn.Def
							AND cwd.Param2 LIKE '%uAbsZast%'
					) AS IS_AbsZastepca	-- jest zastępca ale faktycznie jest w work flow!!! a nie jako RE
				INTO
					@.crm.Rodzaj, @.crm.Podrodzaj, @.crm.Status, @.crm.confirm_status, @.crm.Wniosek_Typ, @.abs.okres_typ, @.crm.IS_Zastepca_cw, @.crm.IS_AbsZastepca
				FROM `crm_workflow_n` cwn
				-- INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.Podrodzaj = c.Podrodzaj
				LEFT JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = cwn.Rodzaj AND ad.Wniosek_podrodzaj = cwn.Podrodzaj
				WHERE 
					cwn.GUID = @.cwn.we.GUID
				;
				IF IFNULL(@.crm.ZastepcaGUID, '') <> '' THEN
					IF @.crm.IS_Zastepca_cw THEN
					--	Zastepca - wskazanie osoby do zastępstwa - Zastepca - zwykły
						SET @.crm.Zastepca.Params = 
							CONCAT_WS('&',			-- bez _VarStr był Illegal mix of collations for operation 'concat_ws'
								_VarStr(CONCAT('ZastepcaGUID=', @.crm.ZastepcaGUID)),
								_VarStr(CONCAT('DateFrom=', @.crm.StartTime)),
								_VarStr(CONCAT('DateTo=', @.crm.EndTime)),
								_VarStr(CONCAT('Status=', -1)),
								NULL
								-- 'ZastepcaGUID={39D5A7B4-893A-4B0E-BE87-673E73ADC5EE}&DateFrom=2022-02-16 00:00:00&DateTo=2022-05-01 00:00:00&Status=-1&';	-- na zast. Tescinska
						);	
						-- LOG
						CALL _user_accounts_sys_cfg('Profil.GUI.Zastepca.Update', 0, _OsobaGUID, '', '', '', '', '', @.crm.Zastepca.Params);
						CALL P_crm_workflow_n('USERS.Insert.Update', @.cwn.we.GUID, NULL, NULL, @.crm.ZastepcaGUID, 'uZast', '', @_Param_C, @_Params);
					END IF;
					IF @.crm.IS_AbsZastepca THEN
					--	Zastepca - wskazanie osoby do zastępstwa
						CALL P_crm_workflow_n('USERS.Insert.Update', @.cwn.we.GUID, NULL, NULL, @.crm.ZastepcaGUID, 'uAbsZast', '', @_Param_C, @_Params);
					END IF;
				END IF;
			END IF;
			-- set @._IDN_workflow = _IDN_workflow, @._confirm_status = _confirm_status;
		--	Zastepca
		/*	Tu był zastępca ale przenisimy za inne zmienne pbierane bo potrzebny nam jest rodzaj i pole Is_zastepca
			SET @.crm.Zastepca.Params = 
				CONCAT_WS('&',			-- bez _VarStr był Illegal mix of collations for operation 'concat_ws'
					_VarStr(CONCAT('ZastepcaGUID=', @.crm.ZastepcaGUID)),
					_VarStr(CONCAT('DateFrom=', @.crm.StartTime)),
					_VarStr(CONCAT('DateTo=', @.crm.EndTime)),
					_VarStr(CONCAT('Status=', -1)),
					NULL
					-- 'ZastepcaGUID={39D5A7B4-893A-4B0E-BE87-673E73ADC5EE}&DateFrom=2022-02-16 00:00:00&DateTo=2022-05-01 00:00:00&Status=-1&';	-- na zast. Tescinska
			);	
			-- LOG
			CALL _user_accounts_sys_cfg('Profil.GUI.Zastepca.Update', 0, _OsobaGUID, '', '', '', '', '', @.crm.Zastepca.Params);
		*/
set @.watch.c1 = concat_WS('/', @.watch.c1, 'zminne');			
				
			SELECT 
				c.Rodzaj, c.Podrodzaj, c.Status, c.confirm_status,
				IF(IFNULL(ad.Idn, 0) > 0,
					'W.ABSENCJA',
						CASE 
							WHEN c.PodRodzaj = 1 THEN 'W.ZALICZKA'
							WHEN c.PodRodzaj = 2 THEN 'W.ZAPOMOGA'
							WHEN c.PodRodzaj = 3 THEN 'W.POZYCZKA'
							WHEN c.PodRodzaj = 5 THEN 'W.SZKOLENIE'
							WHEN c.PodRodzaj = 6 THEN 'W.DELEGACJA'
							ELSE 
								'???'
						END
				) AS Wniosek_Typ,
				IFNULL(ad.okres_typ, 'D') AS okres_typ, 	-- gdy nie absencja to na razie uznaj że "D" czyli dniowa
				EXISTS(
					SELECT
						cwr.UserGUID
					FROM `crm_workflow_def_responsible` cwr
					WHERE
						cwr.Def = cr.Def_confirm_statuses
						AND cwr.UserGUID = 'zastepca'
					) AS IS_Zastepca_cw	-- jest zastępca ale faktycznie jest w work flow!!! a nie jako RE
			INTO
				@.crm.Rodzaj, @.crm.Podrodzaj, @.crm.Status, @.crm.confirm_status, @.crm.Wniosek_Typ, @.abs.okres_typ, @.crm.IS_Zastepca_cw
			FROM `crm_commisions` c
			INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.Podrodzaj = c.Podrodzaj
			LEFT JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = c.Rodzaj AND ad.Wniosek_podrodzaj = c.Podrodzaj
			WHERE 
				c.GUID = _crmGUID
			;
		/*	Zastepca (przeniesiony z wyżej ...	*/	
			IF @session.globals.WORK.FLOW.Ver < '2024' THEN
			IF @.crm.IS_Zastepca_cw AND IFNULL(@.crm.ZastepcaGUID, '') <> '' THEN
			--	Zastepca - wskazanie osoby do zastępstwa
				SET @.crm.Zastepca.Params = 
					CONCAT_WS('&',			-- bez _VarStr był Illegal mix of collations for operation 'concat_ws'
						_VarStr(CONCAT('ZastepcaGUID=', @.crm.ZastepcaGUID)),
						_VarStr(CONCAT('DateFrom=', @.crm.StartTime)),
						_VarStr(CONCAT('DateTo=', @.crm.EndTime)),
						_VarStr(CONCAT('Status=', -1)),
						NULL
						-- 'ZastepcaGUID={39D5A7B4-893A-4B0E-BE87-673E73ADC5EE}&DateFrom=2022-02-16 00:00:00&DateTo=2022-05-01 00:00:00&Status=-1&';	-- na zast. Tescinska
				);	
				-- LOG
				CALL _user_accounts_sys_cfg('Profil.GUI.Zastepca.Update', 0, _OsobaGUID, '', '', '', '', '', @.crm.Zastepca.Params);
			END IF;
			END IF;
			SET	
				@.crm.crm.Ile.Dni = 1 + TIMESTAMPDIFF(DAY, DATE(@.crm.StartTime), DATE(@.crm.EndTime))
			;
set @.watch.c1 = concat_WS('/', @.watch.c1, 'SET dni');			
			SET	
				@.crm.ABS.Ile.Dni = 
					IF(@.crm.Wniosek_Typ = 'W.ABSENCJA' AND IFNULL(@.abs.godz_absencji_fixed, 0) = 0, 
						(
						SELECT
							SUM(kp.godziny > 0)	-- zliczamy dni z godz. pracy (pracujące)
						FROM `Pracownicy` p, `kalendpracy` k, `kalendpracy_po` kp
						WHERE
							p.GUID = _OsobaGUID
							AND k.Symbol = p.SymbolKalendarza
							AND k.rok = YEAR(DATE(@.crm.StartTime))
							AND kp.GUIDNg = k.GUID
							AND kp.Data >= DATE(@.crm.StartTime)
							AND kp.Data <= DATE(@.crm.EndTime)
						),
						NULL
					)
			;
					
set @.watch.c1 = concat_WS('/', @.watch.c1, 'UPDATE `crm_commisions` 1');			
			UPDATE `crm_commisions` c
			SET	
				-- c.Update_status = '->crm_workflow_n',
				c.StartTime = 
					IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
						IF(IFNULL(@.abs.godz_absencji_fixed, 0) = 0,
							DATE(@.crm.StartTime),	-- bez godzin
							@.crm.StartTime 
						),
						_varDateTime(@.crm.StartTime)  -- c.StartTime
					),
				c.EndTime = 
					IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
					-- Absencje - tylko?
						IF(@.abs.okres_typ = 'D' OR @.crm.Duration = 0,
						--	ustawienue Od Do
							_varDateTime(DATE(@.crm.EndTime)), 
						--	ustawienue godzinowe
							_varDateTime(Get_StartEndDuration('End<-Start,Duration', c.StartTime, NULL, @.crm.Duration, 'HOUR', '', '', ''))
						),
						_varDateTime(@.crm.EndTime)  -- c.EndTime
					),
				c.status2 = 	-- UWAGA c.status2 dla absencji jako godz_absencji_fixed
					IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
						IFNULL(@.abs.godz_absencji_fixed, c.status2), 
						c.status2
					),
				c.www_tag_text = @.crm.www_tag_text, -- jako opis dodatkowy dołączny do pola opis który jest składany autom. 
				c.deleted = 0	-- UWAGA przy INSERT wstawiamy deleted = 2 w MODIFY musimy zminic na 0 bo w CANCEL gdy deleted = 2 USUWAMY!!!
			WHERE
				c.GUID = _crmGUID
				AND c.Status < 2
			;
set @.watch.c1 = concat_WS('/', @.watch.c1, 'UPDATE `crm_commisions` 2');			
			UPDATE `crm_commisions` c
			LEFT JOIN `crm_commisions` ct ON ct.GUID = _Key3	-- szablon
			LEFT JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.PodRodzaj = c.PodRodzaj
			SET	
				-- c.Update_status = '->crm_workflow_n',
				c.Temat = IFNULL(
					@.crm.Temat,
					CONCAT_WS(' ',
						IFNULL(cr.Nazwa, ct.Temat),
						'prac.', 
						(SELECT CONCAT_WS(' ', o.Imie1, o.Nazwisko) FROM `osoby` o WHERE o.GUID = _OsobaGUID),
						-- _Brackets('"', (SELECT ad.Definicja FROM `absencje_dict` ad WHERE ad.IDN = ABS(NEW.Rodzaj)), '" '),
						IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
							IF(@.crm.ABS.Ile.Dni IS NOT NULL AND @.crm.ABS.Ile.Dni <> @.crm.crm.Ile.Dni,
								CONCAT(@.crm.ABS.Ile.Dni, ' z'),
								NULL
							),	
							NULL
						),
						IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
							_Format_DT_Range_Mask(c.StartTime, c.EndTime, '%D %mmm %YH;%D %mmm %YH;',  '[#dni#] [#hour#] ([od][#from#][do][#to#])'),
							-- NULL
							_Format_DT_Range_Mask(c.StartTime, c.EndTime, '%D %mmm %YH;%D %mmm %YH;',  '[#dni#] ([od][#from#][do][#to#])')
						),
						NULL
					)
				),
				c.Opis = 
					CONCAT_WS(' ',
						IFNULL(cr.Nazwa, 'Wniosek'),
						IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
							IF(@.crm.ABS.Ile.Dni IS NOT NULL AND @.crm.ABS.Ile.Dni <> @.crm.crm.Ile.Dni,
								CONCAT(@.crm.ABS.Ile.Dni, ' z'),
								NULL
							),	
							NULL
						),
						IF(@.crm.Wniosek_Typ = 'W.ABSENCJA', 
							_Format_DT_Range_Mask(c.StartTime, c.EndTime, '%D %mmm %YH;%D %mmm %YH;',  '[#dni#] [#hour#] ([od][#from#][do][#to#])'),
							-- NULL
							_Format_DT_Range_Mask(c.StartTime, c.EndTime, '%D %mmm %YH;%D %mmm %YH;',  '[#dni#] ([od][#from#][do][#to#])')
						),
						-- CONCAT('- ', NULLIF(NULLIF(@.crm.Opis, ''), cr.Nazwa)),
						CONCAT('- ', NULLIF(@.crm.www_tag_text, '')), -- jako opis dodatkowy dołączny do pola opis który jest tu wypełniany
						NULL
					)
			WHERE
				c.GUID = _crmGUID
				AND c.Status < 2
			;
		--	Teraz SENT/RECALL etc	
			SET 
				_confirm_status = @.cw.NEW.confirm_status,	-- wejsciowy ze sznurka 
				-- @.cw.NEW.confirm_tekst = _Param_B,	-- np. '(wysłany zaraz po utworzeniu)'
				@.cw.CURRENT.IDN = NULL, 
				@.cw.CURRENT.Confirm_Status = NULL,
				@.cw.Need.Send.Mail = FALSE
			;
			set @._IDN_workflow = _IDN_workflow, @.cw.NEW.confirm_status = _confirm_status;
			SELECT 
				cw.IDN, 
			--	cw.commisionGUID, 
				cw.Confirm_Status
			INTO
				@.cw.CURRENT.IDN, @.cw.CURRENT.Confirm_Status
			FROM `crm_workflow` cw
			WHERE
				cw.commisionGUID = _crmGUID
				AND 
				IF(_IDN_workflow = 0, TRUE, cw.IDN =  _IDN_workflow) -- gdy _IDN_workflow wskazany to wez ten idn a jak nie to najstarszy
			ORDER BY IDN DESC
			LIMIT 1
			;	
			SET _IDN_workflow = IFNULL(@.cw.CURRENT.IDN, 0);
			SET @.bylem = '1';
			IF @.cw.CURRENT.Confirm_Status = 'new' AND @.cw.NEW.confirm_status <> '' AND IFNULL(_IDN_workflow, 0) > 0 THEN
				SET @.bylem = '2';
				SET @.cw.Need.Send.Mail = TRUE;
				CALL crm_workflow_TOOLS('confirm.Response', _IDN_workflow, _OsobaGUID, @.cw.NEW.confirm_status, '', '', @.cw.NEW.confirm_tekst);
			END IF;


			
		--	Wstawic ABSENCJE ?
			IF @.crm.Wniosek_Typ = 'W.ABSENCJA' AND @session.globals.WORK.FLOW.Ver < '2022' THEN
			--	Mamy tu wniosek o absencję - wołaj 
			--	tworzenie/modyf. absencji związanej z wnioskiem
				CALL crm_porta_fide_tools('crm.Wniosek.Update.ABS', _crmGUID, '', '', '', '', '', '', '');
			END IF;	
			
			IF @.cw.Need.Send.Mail THEN
		--	Wyślij maile do zainteresoweanych
				CALL crm_porta_fide_tools('SEND.Mail.for.GUID', _crmGUID, '', '', '', '', '', '', '');
			END IF;
			
			IF _Param_E LIKE '%<select>%' THEN	
				SELECT _crmGUID AS GUID, _IDN_workflow AS IDN_workflow;	--	zwracam IDN z `crm_workflow` aby mozna teraz zrobić 'crm.MODIFY.one'
			END IF;
																
		END IF;

		IF _MODE = 'crm.Wniosek.CANCEL' THEN
		/************************************************************************************************************************************************
			CANCEL - po INSERT oznacza usunięcie!!! ale po MODIFY nie robi nic
			CALL crm_porta_fide_tools('crm.Wniosek.CANCEL', 'NewcrmGUID', '', '', '', '', '', '', '');
			_Key		_crmGUID
			_Key2		_OsobaGUID
		************************************************************************************************************************************************/
			SET 
				_crmGUID = IFNULL(_Key, ''),
				-- _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @session.CurrOsobaGUID),
				@_Params = _Param_E
			;
            --  CANCEL - po INSERT oznacza usunięcie!!! ale po MODIFY nie robi nic
            --  zatem sprawdź czy już była edycja 
            SET
                @_FazaInsert = IFNULL((SELECT c.deleted <> 0 FROM `crm_commisions` c WHERE c.GUID = _crmGUID), 1)
			;
            --  wyjdź jeśli już była edycja 
            IF NOT @_FazaInsert THEN LEAVE S_crm_porta_fide_tools; END IF;
			IF @session.globals.WORK.FLOW.Ver >= '2024' THEN
                SET @_Params = CONCAT_WS('', @_Params, '<crm.always>'); -- taki tam tag aby działało pełne usunięcie 
				CALL P_crm_workflow_n('DELETE.from.@', _crmGUID, @_cwIdn, @_cwcIdn, @_Param_A, @_Param_B, @_Param_C, '', @_Params);
				IF @session.globals.WORK.FLOW.Ver >= '2024.02' THEN
					LEAVE S_crm_porta_fide_tools;
				END IF;
			END IF;
			
			DELETE c FROM `crm_commisions` c
			WHERE
				c.GUID = _crmGUID
				AND c.deleted <> 0
				-- AND c.Status < 2
			;
		END IF;
		
--	UWAGA zapytaj Darka i WYWAL		
--	8 XII 2022 Już wiem - NIE jest wołana u Darka!!!! do ZAORANIA TEN MODE
		IF _MODE = 'crm.Wniosek.Update.ABS' THEN
		/************************************************************************************************************************************************
			Tworzenie/modyf. absencji związanej z wnioskiem = _Key
			Wołany po /w
				'Update.Wniosek.After.Confirm.After.Edit' oraz
				'crm.Wniosek.MODIFY'
			CALL crm_porta_fide_tools('crm.Wniosek.Update.ABS', 'crmGUID', '', '', '', '', '', '', '');
			_Key		_crmGUID
		************************************************************************************************************************************************/
			IF @session.globals.WORK.FLOW.Ver >= '2022' THEN
				LEAVE S_crm_porta_fide_tools;
			END IF;
		/*	ewentualnie dodaj to
			CALL absencje_tools('crm.Wniosek.Update.ABS', @resp.commisionGUID, '', '', '', '');
			LEAVE S_crm_porta_fide_tools;
			
			.. czyli i tak po nowemu
		*/	
			SET 
				_crmGUID = IFNULL(_Key, ''),
				@.GUIDpr = NULL,
				@.t_crm_wniosek_2_absencje.ROW_COUNT = 0
			;
			IF _crmGUID = '' THEN LEAVE S_crm_porta_fide_tools; END IF;
			
			DROP TEMPORARY TABLE IF EXISTS `t_crm_wniosek_2_absencje`;
			CREATE TEMPORARY TABLE `t_crm_wniosek_2_absencje` 
				SELECT 
					-- c.*,
					c.GUID AS GuidWniosku,
					_VarStr(MD5(c.GUID)) AS GUID,
					c.Status,
					c.StartTime AS AbsencjaOd, 
					c.EndTime AS AbsencjaDo, 
					c.StartTime AS PelnaAbsencjaOd, 
					c.EndTime AS PelnaAbsencjaDo, 
					IF(c.status2 = 1, c.Duration * 60,0) AS godz_absencji,
					-- @.abs.godz_absencji_fixed
					c.status2 AS godz_absencji_fixed,	-- UWAGA c.status2 dla absencji jako godz_absencji_fixed
					-- IF(c.Status = 3, c.Typ, -ABS(c.Typ)) AS Rodzaj, 
					-- IF(c.Status = 3, c.Typ, -ABS(c.Typ)) AS Rodzaj, -- było (-ABS(2)) AS Rodzaj, 
					-ABS(ad.Idn) AS Rodzaj,
					-- MONTH(c.StartTime) AS miesiac,
					c.Opis,
					(@.GUIDpr := 
						(SELECT cul.Osoba FROM `crm_usr_links` cul WHERE cul.commisionGUID = c.GUID AND cul.Poziom = 2 LIMIT 1)
					) AS GUIDpr,
					(@.YYYY_MM := _var_DateToYM(c.StartTime)) AS YYYY_MM
				FROM `crm_commisions` c 
				INNER JOIN `absencje_dict` ad ON ad.Wniosek_rodzaj = c.Rodzaj AND ad.Wniosek_podrodzaj = c.Podrodzaj
				WHERE 
					c.GUID = _crmGUID
					AND 
					c.Status > 1
			;
			SET @.t_crm_wniosek_2_absencje.ROW_COUNT = ROW_COUNT();
			IF @.t_crm_wniosek_2_absencje.ROW_COUNT > 0 AND IFNULL(@.GUIDpr, '') <> '' THEN
			/************************************************************************************
				Jest rekord, jest paracownik ...
				Wstawiamy, modyfikujemy, etc
			************************************************************************************/
																	-- SET @COMS.Absencje.AU = '3';
			--	1. Wstawiamy Wnioski ale tylko przeslane wnioski
				INSERT IGNORE INTO `absencje`
					(GUID, GuidWniosku, GUIDpr, AbsencjaOd, AbsencjaDo, PelnaAbsencjaOd, PelnaAbsencjaDo, Rodzaj, Opis, godz_absencji, godz_absencji_fixed) -- , miesiac, FrekwGUID)
					SELECT
						-- _MODE AS nrzwolnienia, -- potem wywal
						ta.GUID,
						ta.GuidWniosku,
						(@PracGUID := ta.GUIDpr) AS GUIDpr,
						ta.AbsencjaOd, 
						ta.AbsencjaDo, 
						ta.PelnaAbsencjaOd, 
						ta.PelnaAbsencjaDo, 
						ta.Rodzaj, -- było (-ABS(2)) AS Rodzaj, 
						ta.Opis,
						ta.godz_absencji,
						ta.godz_absencji_fixed
					FROM `t_crm_wniosek_2_absencje` ta
					WHERE
						TRUE -- ta.guid = '240c4cc4b3ed9ad21515c3d6abc559f9'
						AND
						ta.Status > 1	--	tylko dla przeslanych wnioskow
					HAVING GUIDpr != ''
					ON DUPLICATE KEY UPDATE
						`absencje`.AbsencjaOd = ta.AbsencjaOd, 
						`absencje`.AbsencjaDo = ta.AbsencjaDo, 
						`absencje`.PelnaAbsencjaOd = ta.PelnaAbsencjaOd, 
						`absencje`.PelnaAbsencjaDo = ta.PelnaAbsencjaDo, 
						-- `absencje`.Rodzaj = ta.Rodzaj, 
						`absencje`.Rodzaj = IF(ta.Status = 3, ABS(ta.Rodzaj), ta.Rodzaj), 
						`absencje`.Opis = ta.Opis
				;
									-- SET @COMS.Absencje.AU = '4';
			--	2. Anulowane usuwamy
				DELETE a FROM `absencje` a, `t_crm_wniosek_2_absencje` ta
				WHERE
					a.GUID = _VarStr(ta.GUID)	
					AND
					ta.Status IN (0, 8, 14)	--	tylko dla nowych i anulowanych
					AND
					IFNULL(a.FrekwGUID, '') = '' 
					-- ????? AND	a.Rodzaj < 0
				;
				UPDATE `absencje` a, `t_crm_wniosek_2_absencje` ta
				SET
					a.FrekwGUID = '???' 
				WHERE
					a.GUID = _VarStr(ta.GUID)	
					AND ta.Status = 3		-- ale tylko dla zaakceptowanych
				;	
				
				/*************************************************************************************************************
					zamiast 
					CALL crm_porta_fide_tools('Update.Wniosek.After.Confirm.After.Edit', _crmGUID, '', '', '', '', '', '', '');
					wołaj to poniżej - zienia dane w tabelach płac
				*************************************************************************************************************/
				CALL p_e_pl_all_frekw_tools('pl.nalicz.NOWE.albo.STARE.dla.Prac.YYYYMM', @.GUIDpr, @.YYYY_MM, '', '', '');	
				
			END IF;		
		END IF;
		
	END IF;

	IF _MODE = 'crm.NEW.one' THEN
--	UWAGA zapytaj Darka i WYWAL		
--	8 XII 2022 Już wiem - jest wołana u Darka ALE w starym PHP!!!! do ZAORANIA TEN MODE
	/************************************************************************************************************************************************
		Tworzy zdarzenie _Key przez osobe _Key2 z szablonu _Key3.
		CALL crm_porta_fide_tools('crm.NEW.one', 'NewcrmGUID', 'OsobaGUID', 'SzablonGUID', '', '', '', '', '');
		CALL crm_porta_fide_tools('crm.NEW.one', 'webdoc.kuku', 'Prac70', 'webdoc.16.0', 'Temat', 'Opis szerszy', '2', '', '');
		_Key		_crmGUID
		_Key2		_OsobaGUID
		_Key3		Szablon
		_Param_A	- Temat
		_Param_B	Uwagi/Opis
		_Param_C	Typ (z `absencje_dict`)
		-- _Param_D	Inicjalny status
	************************************************************************************************************************************************/
		CALL _Session_Refresh_Variables('', '', '');
		SET _crmGUID = IFNULL(_Key, '');
		SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
		CALL crm_INSERT('z.szablonu', _crmGUID, _Key3, 16, 0, _Param_A, _Param_B, 0.5, '', NULL, NULL, _OsobaGUID, '', '', '', 0, 4, 'new', 'new');
		
		SELECT 
			c.Rodzaj, c.PodRodzaj, cr.Def_confirm_statuses
		INTO
			@.c.Rodzaj, @.c.PodRodzaj, @.cr.Def_confirm_statuses
		FROM `crm_commisions` c 
		INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.PodRodzaj = c.PodRodzaj
		WHERE 
			c.GUID = _crmGUID
		;
		IF @.c.Rodzaj = 16 THEN
			IF @.c.Rodzaj = 16 AND @.c.PodRodzaj = 0 THEN
				CALL crm_usr_links_INSERT('z.hr_self_links', _crmGUID, '', _OsobaGUID, 1, 0, NULL, NULL, 'sent', '');
			ELSEIF @.c.Rodzaj = 16 AND @.c.PodRodzaj = 1 THEN
				CALL crm_usr_links_INSERT('z.hr_self_links', _crmGUID, '', _OsobaGUID, 3, 0, NULL, NULL, '', '');
			END IF;
		END IF;
		
	-- NOWY WorkFLOW
		CALL crm_workflow_TOOLS('Insert.New', _crmGUID, 'new', '', '', '', '');
		
		UPDATE `crm_commisions` c
		SET
			c.Typ = _Param_C,
			
			c.confirm_status = 'new', -- tutaj zawsze new,
			c.www_tag_text = 'abcdefgh'
		WHERE
			c.GUID = _crmGUID
		;
		
		SET @_IDN_workflow = NULL;
		SELECT 
			IDN
		INTO
			@_IDN_workflow
		FROM `crm_workflow` 
		WHERE 
			commisionGUID = _crmGUID
		LIMIT 1 
		;
		
		SELECT @_IDN_workflow AS idn;	--	zwracam IDN z `crm_workflow` aby mozna teraz zrobić 'crm.MODIFY.one'
	END IF;

	IF _MODE = 'crm.MODIFY.one' THEN
--	UWAGA zapytaj Darka i WYWAL		
--	8 XII 2022 Już wiem - jest wołana u Darka ALE w starym PHP!!!! do ZAORANIA TEN MODE
	/************************************************************************************************************************************************
		Modyfikujemy zdarzenie _Key przez osobe _Key2
		CALL crm_porta_fide_tools('crm.MODIFY.one', 'NewcrmGUID', 'OsobaGUID', '233333', '', '', '', '', '');
		CALL crm_porta_fide_tools('crm.MODIFY.one', 'webdoc.kuku', 'Prac70', '233333', 'Temat', 'Uwagi', 'sent', 'DataOD', 'DataDO');
		_Key		_crmGUID
		_Key2		_OsobaGUID
		_Key3		to _IDN_workflow czyli IDN w `crm_workflow`
		_Param_A	Temat
		_Param_B	Uwagi/Opis
		_Param_C	Inicjalny status - _confirm_status
		_Param_D	Data Od
		_Param_E	Data Do
	************************************************************************************************************************************************/
		SET 
			_crmGUID = IFNULL(_Key, ''),
			_OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2),
			_confirm_status = _Param_C,
			_IDN_workflow = IF(IFNULL(_Key3, 0) IN ('', 0), NULL, _Key3)
		;
		SET 
			_IDN_workflow = 	-- Powinno byc w _Key3 a gdy nie to z zapytania!!!
				IFNULL(_IDN_workflow, 
					(
					SELECT 
						IDN 
					FROM `crm_workflow` 
					WHERE 
						commisionGUID = _crmGUID
						AND Start_Status = 'new'
					LIMIT 1 
					)
				)
		;
		UPDATE `crm_commisions` c
		SET	
			c.Temat = IF(_Param_A = '', c.Temat, _Param_A),
			c.Opis = IF(_Param_B = '', c.Opis, _Param_B),
			c.StartTime = IF(_Param_D = '', c.StartTime, _Param_D),
			c.EndTime = IF(_Param_E = '', c.EndTime, _Param_E)
		WHERE
			c.GUID = _crmGUID
		;
		
		
		IF _confirm_status = 'sent' AND IFNULL(_IDN_workflow, 0) > 0 THEN -- ?? poco o to pytac _confirm_status = 'new' THEN
			CALL crm_workflow_TOOLS('confirm.Response', _IDN_workflow, _OsobaGUID, _confirm_status, '', '', '(wysłany zaraz po utworzeniu)');
															
		END IF;
		
		IF @session.globals.WORK.FLOW.Ver >= '2022' THEN
			LEAVE S_crm_porta_fide_tools;
		END IF;

	--	tworzenie/modyf. absencji związanej z wnioskiem
		CALL crm_porta_fide_tools('crm.Wniosek.Update.ABS', _crmGUID, '', '', '', '', '', '', '');
		LEAVE S_crm_porta_fide_tools;															
	END IF;

	
	IF _MODE = 'Update.Wniosek.After.Confirm.After.Edit' THEN
--	UWAGA zapytaj Darka i WYWAL		
--	8 XII 2022 Już wiem - NIE jest wołana u Darka !!!! do ZAORANIA TEN MODE
	--	Przekierowanie na inny MODE 
	--	tak na prawdę to tutaj (po confirm) tylko ewntualnie tworzy się lub modyf. absencję o ile jest zwiazana z wnioskiem
		SET _crmGUID = IFNULL(_Key, '');
		CALL crm_porta_fide_tools('crm.Wniosek.Update.ABS', _crmGUID, '', '', '', '', '', '', '');
		LEAVE S_crm_porta_fide_tools;
		
	END IF;
	
				--	UWAGA zapytaj Darka i WYWAL		
				--	8 XII 2022 Już wiem - NIE jest wołana u Darka !!!! do ZAORANIA TEN MODE
					IF _MODE = 'COMS.Absencje.AU' AND (_Key2 = 16) THEN
					--	Tylko Wnioski urlopowo zwolnieniowe
						SET _crmGUID = IFNULL(_Key, '');
					--	tworzenie/modyf. absencji związanej z wnioskiem
						CALL crm_porta_fide_tools('crm.Wniosek.Update.ABS', _crmGUID, '', '', '', '', '', '', '');
						LEAVE S_crm_porta_fide_tools;					
						
						
					END IF;
	
--	CO To JEST!!!! UWAGA zapytaj Darka i WYWAL		
	IF _MODE = 'remove.app' THEN
	/************************************************************************************************************************************************
		Usuwa nie wysłany wniosek
		CALL crm_porta_fide_tools('remove.app', 'GUID', '', '', '', '', '', '', '');
		_Key		to GUID crm
		_Key2 to guid osoby
	************************************************************************************************************************************************/
		SET _crmGUID = IFNULL(_Key, '');
		SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
		
		SET @_isOwner = (SELECT cul.poziom FROM `crm_usr_links` cul WHERE cul.`commisionGUID`= _crmGUID AND osoba = _OsobaGUID AND cul.poziom = 0);		
		IF (@_isOwner IS NOT NULL) THEN
			DELETE c FROM `crm_commisions` c WHERE c.GUID = _crmGUID
			;
			-- DELETE FROM `crm_workflow` WHERE `commisionGUID` = _crmGUID;
		END IF;
		
		
	END IF;
	
	
	IF _MODE LIKE 'select.%' THEN
		SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
		/************************************************************************************************************************************************
			
			CALL crm_porta_fide_tools('Select.wnioski.do.decyzji', '', 'Prac50', '', '', '', '', '', '');
			CALL crm_porta_fide_tools('Select.wnioski.do.decyzji', '', 'Prac50', '1', '', '', '', '', '');	--	archiwum
			_Key2	- Osoba spr.
			_Key3	gdy != '' to archiwum
			
			CALL crm_porta_fide_tools('Select.wnioski.moje', '', 'Prac50', '', '', '', '', '', '');	
			CALL crm_porta_fide_tools('Select.wnioski.moje', '', 'Prac50', '1', '', '', '', '', '');	--	archiwum
			_Key2	- Osoba spr.
			_Key3	gdy != '' to archiwum
			
			Zwraca historie wniosku
			CALL crm_porta_fide_tools('select.hist', 'abc', '', '', '', '', '', '', '');
			_Key		to GUID crm
			
			Select do maila
			CALL crm_porta_fide_tools('Select.Get.email.select', 'GUID', '', '', '', '', '', '', '');
			_Key		to GUID crm
			
			Zdarzenia moje
			CALL crm_porta_fide_tools('Select.Zdarzenia', '', '2', '1', '', '', '', '', '');
			Zdarzenia wszystkie zwiazane ze mna
			CALL crm_porta_fide_tools('Select.Zdarzenia', '', '', '', '1', '', '', '', '');
			_Key2		gdy = 2 to moje a gdy != 2 np "" to wszystkie zwiazane ze mna
			_Key3		to Status czyli 1, 2, lub 3
		************************************************************************************************************************************************/
		IF _MODE = 'Select.Search.Osoba' THEN
			/************************************************************************************************************************************************
				CALL crm_porta_fide_tools('Select.Search.Osoba', 'Podrac', @UserGUID, '', '', '', '', '', '');
				_Key	- Szukana fraza
				_Key2	- Osoba zalog..
				_Key3	gdy != '' to zawsze dodajemy ja do reuslatu szukania
			************************************************************************************************************************************************/
			CALL erp_do_search_similar('SEARCH_OSOBY_LIKE.Prepare', _Key, _Key3, '', 0, 0, '', '', '', '');
			-- CALL erp_do_search_similar('SEARCH_OSOBY_LIKE.Prepare', _Key2, _Key3, '', 0, 0, '', '', '', '');
			SELECT
				o.*
			FROM `t_search_dataset`	o	-- `t_search_work`
			INNER JOIN `Pracownicy` p ON p.GUID = o.Result_Key AND ((p.ToPracownik AND p.CzyObecniePracuje) OR p.firma_wspolprac=1) 
			WHERE
				!(o.Result_Key <=> _OsobaGUID)
				-- !(o.Result_Key <=> _Key)
			;
			LEAVE S_crm_porta_fide_tools;
		END IF;
		
		IF _MODE = 'Select.wnioski.do.decyzji' THEN
			SET _Archiwum = _Key3;
			-- CALL crm_workflow_TOOLS('Select.all.nodes.do.decyzji', 'web_crm', _OsobaGUID, '16', '0', _Archiwum, '');
			CALL crm_workflow_TOOLS('Select.all.nodes.do.decyzji', '', _OsobaGUID, '16', '0', _Archiwum, '');
			LEAVE S_crm_porta_fide_tools;
		END IF;
		
		IF _MODE = 'Select.wnioski.moje' THEN
			SET _Archiwum = _Key3;
			-- CALL crm_workflow_TOOLS('Select.all.nodes.moje', 'web_crm', _OsobaGUID, '16', '0', _Archiwum, '');
			CALL crm_workflow_TOOLS('Select.all.nodes.moje', '', _OsobaGUID, '16', '0', _Archiwum, '');
			LEAVE S_crm_porta_fide_tools;
		END IF;

		IF _MODE = 'Select.hist.HTML' THEN
		/*
			po 25 IV 2024 - mozna już pobierać html-a jako hitorię
		*/
			SET _crmGUID = IFNULL(_Key, '');
			CALL P_crm_workflow_n('log.Prepare.HIST.html', _crmGUID, NULL, NULL, NULL, '', '', '', '<SELECT>');
		END IF;

		IF _MODE = 'Select.hist' THEN
		/*
			po 25 IV 2024 - mozna już dokonać przeróbki na pobiewranie tu albo innym callem gotewgo html-a
			moja propozycja jest aby wołać ...Html
			jako _MODE = 'Select.hist.HTML'
		*/
		SET @X = _MODE;
			SET _crmGUID = IFNULL(_Key, '');
			
			CALL crm_workflow_TOOLS('Select.workflow.history', _crmGUID, '', '', '', '', '');
			-- CALL crm_workflow_TOOLS('Select.workflow.history', '2afca98874a4ddf07b8410bce9ffbe54', '', '', '', '', '');
			
			/*
			bylo
			SELECT 
				CONCAT(o.Imie1, ' ', o.Nazwisko) AS OsobaStr,
				clog.time_sheet_when AS WhenStr,
				clog.jest AS HistStr
			FROM `crm_log` clog 
			LEFT JOIN `osoby` o ON o.GUID = clog.osobaGUID
			WHERE 
				clog.commissionguid = _crmGUID 
				AND clog.zmiana_dotyczy = 'VALIDATE'
			ORDER BY clog.Idn
			;
			*/
			
			
			
		END IF;

		IF _MODE = 'Select.Get.email.select' THEN
			SET _crmGUID = IFNULL(_Key, '');
			-- SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
			DROP TEMPORARY TABLE IF EXISTS `t_prepare_mail_by_workflow_confirm_1`;
			CREATE TEMPORARY TABLE `t_prepare_mail_by_workflow_confirm_1` (
			  `Send_Mode` VARCHAR(38) DEFAULT NULL,
			  `crm_GUID` VARCHAR(38) DEFAULT NULL,
			  `Idn_workflow` INT(11) NOT NULL DEFAULT '0',
			  `OsobaGUID_recipient` VARCHAR(38),
			  `OsobaGUID_owner` VARCHAR(38),
			  `adres` VARCHAR(255),
			PRIMARY KEY OsobaGUID_recipient(OsobaGUID_recipient)
			)
			;
			SET
				@.OsobaGUID_skladajaca = IFNULL((SELECT cul.Osoba FROM `crm_usr_links` cul WHERE cul.commisionGUID = _crmGUID AND cul.Poziom = 2), '')
			;
			SET
				@.Osoba_skladajaca = IFNULL((SELECT CONCAT(o.Imie1, ' ', o.Nazwisko) FROM `osoby` o WHERE o.GUID = @.OsobaGUID_skladajaca), '')
			;
			SET
				@workflow.mail.MSG.Ja.Ja = 'Twój wniosek ma teraz status "#STATUS_BEFORE#" i czeka na Twoją decyzję #STATUS_?#',
				@workflow.mail.MSG.Ja.Ktos = 'Twój wniosek ma teraz status "#STATUS_BEFORE#" i czeka na decyzję osoby(grupy): #GRUPA#',
				@workflow.mail.MSG.Ktos = 'Wniosek osoby #OSOBA# ma teraz status "#STATUS_BEFORE#" i czeka na Twoją decyzję #STATUS_?#',
				@workflow.mail.MSG.Ja.END = 'Twój wniosek zmienił status na "#STATUS_BEFORE#" (tym samym zakończono rozpatrywanie wniosku)'
			;
			TRUNCATE `t_prepare_mail_by_workflow_confirm_1`;
			INSERT IGNORE INTO `t_prepare_mail_by_workflow_confirm_1`
			(Send_Mode, crm_GUID, Idn_workflow, OsobaGUID_recipient, OsobaGUID_owner)
			SELECT
				'KTOS' AS Send_Mode,
				vw.commisionGUID AS crm_GUID, 
				vw.Idn_workflow, 
				o.GUID AS OsobaGUID_recipient,
				@.OsobaGUID_skladajaca
			FROM `crm_commisions` c 
			INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.PodRodzaj = c.PodRodzaj
			INNER JOIN `v_crm_workflow_confirm` vw ON vw.commisionGUID = c.GUID AND vw.Def = IFNULL(c.Def_confirm_statuses, cr.Def_confirm_statuses) AND vw.Response != 'RESPONSE_100'
			INNER JOIN `grupy_osob` go ON go.grupaGUID = vw.UserGUID
			INNER JOIN `osoby` o ON o.GUID = go.osobaGUID AND o.Rodzaj != 0
			-- UsewrGUID
			WHERE 
				c.GUID = _crmGUID 
			GROUP BY OsobaGUID_recipient -- , Idn_workflow
			;
			UPDATE `t_prepare_mail_by_workflow_confirm_1` t
			SET
				t.Send_Mode =  
					IF(t.OsobaGUID_owner = t.OsobaGUID_recipient,
						'JA.JA',
						t.Send_Mode
					)
			;
			INSERT IGNORE INTO `t_prepare_mail_by_workflow_confirm_1`
			(Send_Mode, crm_GUID, Idn_workflow, OsobaGUID_recipient, OsobaGUID_owner)
			SELECT
				'JA.KTOS' AS Send_Mode,
				c.GUID AS crm_GUID, 
				IFNULL(
					(SELECT vw.Idn_workflow FROM `v_crm_workflow_confirm` vw WHERE vw.commisionGUID = c.GUID AND vw.Def = IFNULL(c.Def_confirm_statuses, cr.Def_confirm_statuses) ORDER BY vw.Idn_workflow DESC LIMIT 1)
				, 0)
				AS Idn_workflow, 
				o.GUID AS OsobaGUID_recipient,
				@.OsobaGUID_skladajaca
			FROM `crm_commisions` c 
			INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.PodRodzaj = c.PodRodzaj
			INNER JOIN `osoby` o ON o.GUID = @.OsobaGUID_skladajaca
			-- UsewrGUID
			WHERE 
				c.GUID = _crmGUID
			GROUP BY OsobaGUID_recipient -- , Idn_workflow
			;
			
			UPDATE `t_prepare_mail_by_workflow_confirm_1` t, `v_crm_workflow_confirm` vw 
			SET
				t.Send_Mode =  
					IF(vw.Response = 'RESPONSE_100',
						'JA.END',
						t.Send_Mode
					)
			WHERE
				vw.Idn_workflow = t.Idn_workflow
			;
			DROP TEMPORARY TABLE IF EXISTS `t_prepare_mail_by_workflow_confirm_2`;
			CREATE TEMPORARY TABLE `t_prepare_mail_by_workflow_confirm_2` 
			SELECT
				CASE 
				WHEN t.Send_Mode = 'JA.JA' THEN @workflow.mail.MSG.Ja.Ja
				WHEN t.Send_Mode = 'JA.KTOS' THEN @workflow.mail.MSG.Ja.Ktos
				WHEN t.Send_Mode = 'KTOS' THEN @workflow.mail.MSG.Ktos
				WHEN t.Send_Mode = 'JA.END' THEN @workflow.mail.MSG.Ja.END
				END AS Msg_init,
				
				GROUP_CONCAT(vw.Imiona_Nazwisko) AS Grupa_Nazwy,
				CONCAT(o.Imie1, ' ', o.Nazwisko) AS Imiona_Nazwisko,
				t.*
			FROM `t_prepare_mail_by_workflow_confirm_1` t
			INNER JOIN `v_crm_workflow_confirm` vw  ON vw.Idn_workflow = t.Idn_workflow
			INNER JOIN `osoby` grupa ON grupa.GUID = vw.UserGUID
			INNER JOIN `osoby` o ON o.GUID = t.OsobaGUID_recipient
			GROUP BY t.OsobaGUID_recipient
			;
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t, `v_crm_workflow_confirm` vw  
			SET
				t.Msg_init = 
					REPLACE(
						REPLACE(
							REPLACE(
								REPLACE(
									t.Msg_init, '#STATUS_?#', ''
								),
								'#GRUPA#', t.Grupa_Nazwy
							),
							'#OSOBA#', @.Osoba_skladajaca
						),
						'#STATUS_BEFORE#', vw.Status_Before
						
					)
			WHERE
				vw.Idn_workflow = t.Idn_workflow

			;
			
			
		--	Adresy Mailowe
		--	1.	Najpierw sluzbowe dla poziomu <> 2 
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t
			SET
				t.adres = 
					IFNULL(
						(
						SELECT ua.Ad_mail FROM `_user_accounts` ua WHERE ua.OsobaGUID = t.OsobaGUID_recipient
						),
						IFNULL(
							(
							SELECT 
								k.Adres 
							FROM `kontakty` k 
							WHERE 
								k.osobaGUID = t.OsobaGUID_recipient
								AND k.typ_medium = 3 
								AND IFNULL(k.KontrGUID, '') != '' 				--	KontrGUID !!!
							ORDER BY k.newsletter DESC, k.priorytet DESC 
							LIMIT 1
							),
							''
						)
					)
				/*
				t.adres = (
					SELECT
						k.Adres
					FROM `kontakty` k 
					WHERE
						k.osobaGUID = t.OsobaGUID_recipient
						AND k.typ_medium = 3 
						AND IFNULL(k.KontrGUID, '') != '' 				--	KontrGUID !!!
					ORDER BY k.newsletter DESC, k.priorytet DESC 
					LIMIT 1
					)
				*/
			WHERE
				t.OsobaGUID_owner != t.OsobaGUID_recipient
			;
		--	2.	Teraz dla wszystkich jesli w p.1 nie wstawil sluzbowego to tutaj wstawi niesluzbowy
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t
			SET
				t.adres = (
					SELECT
						k.Adres
					FROM `kontakty` k 
					WHERE
						k.osobaGUID = t.OsobaGUID_recipient
						AND k.typ_medium = 3 
					ORDER BY k.newsletter DESC, k.priorytet DESC 
					LIMIT 1
					)
			WHERE
				IFNULL(t.adres, '') = ''
			;

			-- select @.Osoba_skladajaca;
			
			SELECT 
				t.Msg_init AS Msg, 
				GROUP_CONCAT(DISTINCT t.adres SEPARATOR ',') AS adres, 
				c.Temat 
			FROM `t_prepare_mail_by_workflow_confirm_2` t 
			INNER JOIN `crm_commisions` c ON c.GUID = t.crm_GUID
			GROUP BY Msg
			;
			
			-- SELECT * FROM `t_prepare_mail_by_workflow_confirm_2` t;
			
		END IF;


		IF _MODE LIKE 'Select.absencje.MxD%' THEN   /*  od III 2025 !!! */
            SET @.Params = _Param_E;
            SET 
                @.YM1 := 
                 NULLIF(_FetchPar('', @.Params, 'YM1',''), ''),
                @.YM2 := 
                 NULLIF(_FetchPar('', @.Params, 'YM2',''), ''),
                @.D1 := 
                 NULLIF(_FetchPar('', @.Params, 'D1',''), ''),
                @.D2 := 
                 NULLIF(_FetchPar('', @.Params, 'D2',''), ''),
                @.Dzial := 
                 NULLIF(_FetchPar('', @.Params, 'Dzial',''), ''),
                @.KategoriaPracownicza := 
                 NULLIF(_FetchPar('', @.Params, 'KategoriaPracownicza',''), '')
            ;
            IF @.YM1 IS NOT NULL THEN
            --  działamy wg YM1...
                SET _YM1 := @.YM1;
                SET _YM2 := IFNULL(@.YM2, PERIOD_ADD(_YM1, 1));
                SET _D1 := _var_YMToFirstDay(_YM1);
                SET _D2 := _var_YMToLastDay(_YM2);
                    SET @.D1 := _D1, @.D2 := _D2, _Param_A := _D1;   -- dla kompat.
            ELSE
            --  działamy wg dat D1...D2
                -- SET @.D1 := DATE(IFNULL(@.D1, DATE(_Param_A)));
                SET _D1 := IFNULL(@.D1, DATE(_Param_A));
                -- SET @.D2 := DATE(IFNULL(IFNULL(@.D2, DATE(_Param_A)), @.D1));
                SET _D2 := IFNULL(@.D2, _D1);
                    SET @.D1 := _D1, @.D2 := _D2, _Param_A := _D1;   -- dla kompat.
                IF @.D1 = @.D2 THEN
                    SET @.D1 := @.D2 - INTERVAL 7 DAY;
                    SET @.D2 := (@.D2 + INTERVAL 1 MONTH) + INTERVAL 6 DAY;
                END IF;
            END IF;
            -- IF _MODE IN ('Select.absencje.prac', 'Select.pseudo.absencje.all.prac') THEN
			DROP TEMPORARY TABLE IF EXISTS `t_we_P_inf`;
			CREATE TEMPORARY TABLE `t_we_P_inf` (
			  `Mode` VARCHAR(150) DEFAULT NULL,
			  OsobaGUID VARCHAR(38) DEFAULT NULL,
			  DataWe DATE,
			  DataOd DATE,
			  DataDo DATE,
			  Y INTEGER,
			  PseudoAbsOnly BOOLEAN DEFAULT FALSE,
			  Key3 VARCHAR(38)
			)
			;
			INSERT IGNORE INTO `t_we_P_inf`
			SET
				Mode = _Mode,
				OsobaGUID = _OsobaGUID,
				DataWe = (@.Calendar.DataWe := DATE(_Param_A)),
				DataOd = @.D1, -- (@.Calendar.DataOd := @.Calendar.DataWe - INTERVAL 7 DAY),
				DataDo = @.D2, -- (@.Calendar.DataDo := @.Calendar.DataWe + INTERVAL 1 MONTH + INTERVAL 6 DAY),
				Y = (@.Calendar.Y := YEAR(@.Calendar.DataWe)),
				-- PseudoAbsOnly = (_Mode = 'Select.pseudo.absencje.all.prac'),
                PseudoAbsOnly = (_Mode LIKE '%pseudo%'),
				Key3 = IF((_Mode = 'Select.pseudo.absencje.all.prac'), 'ALL', _Key3)
			;
							set _Key3 = IF((_Mode = 'Select.pseudo.absencje.all.prac'), 'ALL', _Key3);
                            set @._Key3 := _Key3;
			/*  DROP TEMPORARY TABLE IF EXISTS `t_days`;
			CREATE TEMPORARY TABLE `t_days` LIKE `_sys_calendar`;
			INSERT INTO `t_days`
			SELECT 
				sc.*, 
				IFNULL(h.GOV_Free_Day, 0) AS GOV_Free_Day
			FROM `t_we_P_inf` tinf -- , `_sys_calendar` sc
			INNER JOIN  `_sys_calendar` sc ON sc.date BETWEEN tinf.DataOd AND tinf.DataDo
			LEFT JOIN `_sys_calendar_Holidays` h ON h.Date = sc.date AND h.IDCountry = 'PL' 
			WHERE
				TRUE -- sc.date BETWEEN tinf.DataOd AND tinf.DataDo
			-- GROUP BY kp.data
			ORDER BY sc.date
			;   */
			DROP TEMPORARY TABLE IF EXISTS `t_days`;
			CREATE TEMPORARY TABLE `t_days` (
			  `date` DATE NOT NULL COMMENT 'dzien',
			  `D` INT(11) DEFAULT NULL COMMENT 'dzien m-ca',
			  `M` INT(11) DEFAULT NULL COMMENT 'miesiac roku',
			  `Y` INT(11) DEFAULT NULL COMMENT 'rok',
			  `DW` INT(11) DEFAULT NULL COMMENT 'dzien tyg. 1..7 (pn,wt..)',
			  `YM` INT(11) DEFAULT NULL COMMENT 'rok/m-c',
			  `GOV_Free_Day` BOOLEAN DEFAULT 0,
			  PRIMARY KEY (`date`),
			  KEY `YM` (`YM`)
			)
			;
			INSERT INTO `t_days`
			(`date`, D, M, Y, DW, YM, GOV_Free_Day)
			SELECT 
				sc.Date, sc.D, sc.M, sc.Y, sc.DW, sc.YM,  
				IFNULL(h.GOV_Free_Day, 0) AS GOV_Free_Day
			FROM `t_we_P_inf` tinf -- , `_sys_calendar` sc
			INNER JOIN  `_sys_calendar` sc ON sc.date BETWEEN tinf.DataOd AND tinf.DataDo
			LEFT JOIN `_sys_calendar_Holidays` h ON h.Date = sc.date AND h.IDCountry = 'PL' 
			WHERE
				TRUE -- sc.date BETWEEN tinf.DataOd AND tinf.DataDo
			-- GROUP BY kp.data
			ORDER BY sc.date
			;
            
			
			DROP TEMPORARY TABLE IF EXISTS `t_we_abs`;
			CREATE TEMPORARY TABLE `t_we_abs` (
			  `GUID` VARCHAR(38) NOT NULL DEFAULT '',
			  `PracGUID` VARCHAR(38) DEFAULT NULL,
			  `AbsencjaOd` DATE DEFAULT NULL,
			  `AbsencjaDo` DATE DEFAULT NULL,
			  `OK` int(11) DEFAULT 1,
			  PRIMARY KEY GUID(GUID),
			  KEY `PracGUID` (`PracGUID`,`OK`),
			  KEY `AbsencjaOd` (`AbsencjaOd`),
			  KEY `AbsencjaDo` (`AbsencjaDo`)
			)
			;
			INSERT IGNORE INTO `t_we_abs` 
            (GUID, PracGUID, AbsencjaOd, AbsencjaDo)
			SELECT
				a.GUID, a.GUIDPr AS PracGUID, a.AbsencjaOd, a.AbsencjaDo
			FROM `t_days` d  
			INNER JOIN `absencje` a ON d.Date BETWEEN a.AbsencjaOd AND a.AbsencjaDo
			GROUP BY a.GUID
			;
			
			DROP TEMPORARY TABLE IF EXISTS `t_we_P`;
			CREATE TEMPORARY TABLE `t_we_P` (
			  `PracGUID` VARCHAR(38) DEFAULT NULL,
              `ToPracownikSzefa` INT(1) NOT NULL DEFAULT 0,
			  `OK` INT(11) DEFAULT 0,
			  `Y` INT(11) DEFAULT 0,
			  `WykWypDni` INT(11) DEFAULT 0,
			  `PozostUrlopWypoczDni` INT(11) DEFAULT 0,
			  `Wykorzystano_H` DOUBLE DEFAULT 0,
			  `Wykorzystano_D` DOUBLE DEFAULT 0,
			  `Pozostalo_H` DOUBLE DEFAULT 0,
			  `Pozostalo_D` DOUBLE DEFAULT 0,
			  `MedAdres` VARCHAR(100) DEFAULT NULL,
			  `Kto` VARCHAR(50) DEFAULT '',
              `stanowisko` VARCHAR(38) DEFAULT NULL,
			  PRIMARY KEY (`PracGUID`),
			  KEY (`PracGUID`,`OK`)
			)
			;
                    TRUNCATE `t_we_P`;
            
			IF _Mode = 'Select.absencje.MxD.1P' THEN
            /*  macierz gęsta absencje tylko dla zalogowanego */
				INSERT IGNORE INTO `t_we_P`
                (PracGUID, OK, Y)
				SELECT 
					o.GUID AS PracGUID,
					1 AS OK, @.Calendar.Y
					-- hr.OsobaGuid_A AS PracGUID
				FROM `Pracownicy` o, `hr_self_links` hr, t_we_P_inf tinf  
				WHERE 
					o.GUID = tinf.OsobaGUID
					AND (o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
					AND o.CzyObecniePracuje != 0
				;
			ELSEIF _Mode LIKE 'Select.absencje.MxD.nP.ALL%' THEN
            /*  macierz rzadka wszystkich pracowników mających frekw. w danym roku */
				/*INSERT IGNORE INTO `t_we_P`
                (PracGUID, OK)
                SELECT 
                    o.GUID AS PracGUID, 1 AS OK
                FROM 
                (SELECT fn.PracGUID FROM `frekw` fn WHERE fn.rok = @.Calendar.Y AND fn.Deleted = 0 GROUP BY PracGUID) AS fn,
                `Pracownicy` o
                WHERE 
                    o.GUID = fn.PracGUID
                    AND 
                    (o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
                    AND
                    o.CzyObecniePracuje != 0
                ;
                */
				INSERT IGNORE INTO `t_we_P`
                (PracGUID, OK, Y)
                SELECT 
                    fn.PracGUID AS PracGUID, 1 AS OK, @.Calendar.Y
                FROM `frekw` fn 
                WHERE
					fn.rok = @.Calendar.Y 
					AND fn.Deleted = 0 
				GROUP BY PracGUID
                ;	

			ELSEIF _Mode = 'Select.absencje.MxD.nP.Szefa' THEN
				/*INSERT IGNORE INTO `t_we_P`
                (PracGUID, ToPracownikSzefa, OK)
				SELECT 
					o.GUID AS PracGUID,
					1 AS ToPracownikSzefa, 1 AS OK
					-- hr.OsobaGuid_A AS PracGUID
				FROM `Pracownicy` o, `hr_self_links` hr, t_we_P_inf tinf  
				WHERE 
					(o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
					AND
					o.CzyObecniePracuje != 0
					AND
					hr.OsobaGuid_A = o.GUID
					AND
					hr.OsobaGuid_B = tinf.OsobaGUID
					AND
					hr.Rel = 'szef'
                ;*/	
				INSERT IGNORE INTO `t_we_P`
                (PracGUID, ToPracownikSzefa, OK, Y)
				SELECT 
					hr.OsobaGuid_A AS PracGUID,
					1 AS ToPracownikSzefa, 1 AS OK, @.Calendar.Y
					-- hr.OsobaGuid_A AS PracGUID
				FROM `hr_self_links` hr, t_we_P_inf tinf
				WHERE 
					hr.OsobaGuid_B = tinf.OsobaGUID
					AND hr.Rel = 'szef'
                ;	
			ELSEIF _Mode = 'Select.absencje.MxD.nP.Szefa.z.absencji' THEN
            --  1. wstaw tylko tych z absencjami w okresie ALE OK daj na 0!!!
                INSERT IGNORE INTO `t_we_P`
                (PracGUID, OK, Y)
                SELECT 
                    ta.PracGUID, 0 AS OK, @.Calendar.Y
                FROM `t_we_abs` ta
                GROUP BY ta.PracGUID
                ;
            --  2. wstaw OK na 1 dla pracowników szefa
                UPDATE `t_we_P` tP, `hr_self_links` hr, t_we_P_inf tinf
                SET
                    tP.OK = 1
                WHERE 
                    hr.OsobaGuid_A = tP.PracGUID
                    AND hr.OsobaGuid_B = tinf.OsobaGUID
                    AND hr.Rel = 'szef'
                ;
            ELSEIF _Mode = 'Select.absencje.MxD.nP.z.absencji' THEN
            /*  macierz gęsta zwracamy tylko pracow. z absencja w danym roku (realnie istnieja jako absencje)   */
                INSERT IGNORE INTO `t_we_P`
                (PracGUID, OK, Y)
                SELECT 
                    ta.PracGUID, 1 AS OK, @.Calendar.Y
                FROM `t_we_abs` ta
                GROUP BY ta.PracGUID
                ;
			END IF;
        --  OK tylko zgodne z ust. w Kadrach
            UPDATE `t_we_P` tP, `Pracownicy` P
            SET
                tP.OK = 
                    tP.OK 
                    AND (P.ToPracownik OR (P.aktywny AND (P.firma_wspolprac OR P.ToZleceniobiorca)))
                    AND P.CzyObecniePracuje != 0
                    AND IF(@.Dzial IS NULL, TRUE, P.Dzial = @.Dzial)
                    AND IF(@.KategoriaPracownicza  IS NULL, TRUE, P.KategoriaPracownicza = @.KategoriaPracownicza)
                    AND EXISTS(
                        SELECT fn.GUID FROM `frekw` fn WHERE fn.PracGUID = tP.PracGUID AND fn.rok = tP.Y AND fn.Deleted = 0 
                    ),
                tP.stanowisko = P.stanowisko
            WHERE 
                P.GUID = tP.PracGUID
            ;
        --  Nazw, adres ale tylko dla OK
            UPDATE `t_we_P` tP, `osoby` o 
            SET
                tP.Kto = CONCAT_WS(' ', o.nazwisko, o.Imie1),
                tP.MedAdres = 
                    (SELECT adres FROM kontakty WHERE osobaGUID = tP.PracGUID AND rodzaj = 0 AND typ_medium = 2 LIMIT 1)
            WHERE
                tP.OK
                AND o.GUID = tP.PracGUID
            ;
			DROP TEMPORARY TABLE IF EXISTS `t_abs_mxd`;
			CREATE TEMPORARY TABLE `t_abs_mxd` (
			  -- `idn_absencji` int(11) NOT NULL AUTO_INCREMENT,
			  `Data` DATE DEFAULT NULL,
			  `PracGUID` VARCHAR(38) NOT NULL DEFAULT '',
			  `GUID_absencji` VARCHAR(38) NOT NULL DEFAULT '',
			  `ToPracownikSzefa` INT(11) DEFAULT 1,
              `IS_Swieto` BOOLEAN DEFAULT 0,
              `IS_Nd` BOOLEAN DEFAULT 0,
              `IS_So` BOOLEAN DEFAULT 0,
			  PRIMARY KEY ID(`PracGUID`, `Data`),
			  KEY `PracGUID` (`PracGUID`),
			  KEY `GUID_absencji` (`GUID_absencji`),
			  KEY `Data` (`Data`)
			);

		--	Dodatkowo dodaj zalogowanego do `t_we_P` jako osobe dla której też bedą absencje
			INSERT IGNORE INTO `t_abs_mxd` 
			(`PracGUID`, `Data`, `ToPracownikSzefa`, IS_Swieto, IS_Nd, IS_So)
			SELECT
				tP.PracGUID, td.Date, tP.ToPracownikSzefa,
                td.GOV_Free_Day AS IS_Swieto, td.DW = 7 AS IS_Nd, td.DW = 6 AS IS_So
			FROM `t_days` td, `t_we_P` tP
            WHERE
                tP.OK
			GROUP BY tP.PracGUID, td.Date
			;
			UPDATE `t_abs_mxd` ad
			SET
				ad.GUID_absencji = (SELECT GUID FROM `t_we_abs` a WHERE a.PracGUID = ad.PracGUID AND ad.Data BETWEEN a.AbsencjaOd AND a.AbsencjaDo LIMIT 1)
			;
		--	Naliczenie WykWypDni, PozostUrlopWypoczDni dla każdej z osób 	
			-- a to ??? IF _MODE = 'Select.absencje.prac' THEN
            IF _MODE LIKE 'Select.absencje.MxD%' THEN
				-- IF(@session.globals.Owner = 'SKOK') THEN
                IF TRUE THEN
				/*********************************************************************************************************************
					Uwaga dla SKOK od 2 lut.2023 wymiary bierzemy z tabeli `urlopy`
					Finalnie w 2023 bedzie zupełnie nowa przestrzeń wyliczeń.
				*********************************************************************************************************************/
					UPDATE `t_we_P` ti
					SET
						--	Wykorzystano_D
						ti.Wykorzystano_D = (
							SELECT
								-- SUM(f.W_dni) AS WykWypDni
								SUM(f.W_dni) + SUM(f.G_dni)		-- dawny WykWypDni = SUM(f.W_dni), UWAGA!!!! w urlop. wyp. wykorz. podajemy wraz z wykorz. url. n/ż !!!FROM `frekw` f
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.PracGUID
								AND f.deleted = 0
								AND f.rok = ti.Y -- YEAR(CURRENT_DATE())
						),
						--	Wykorzystano_H =	
						ti.Wykorzystano_H = (
							SELECT
								(SUM(f.W_godz) + SUM(f.G_godz))/60		-- dawny WykWypDni = SUM(f.W_dni), UWAGA!!!! w urlop. wyp. wykorz. podajemy wraz z wykorz. url. n/ż !!!
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.PracGUID
								AND f.deleted = 0
								AND f.rok = ti.Y -- YEAR(CURRENT_DATE())
						),
						ti.Pozostalo_H = (
							SELECT 
								f.PozostUrlopWypoczGodz/60  -- poz. urlop wypoczynkowy
							FROM `frekw` f
							WHERE 
								f.PracGUID = ti.PracGUID
								AND f.deleted = 0
								AND f.rok = ti.Y -- YEAR(CURRENT_DATE())
							ORDER BY f.miesiac 
							DESC LIMIT 1
						)
					;
				--	potem ...
					UPDATE `t_we_P` ti
					INNER JOIN `urlopy` u ON u.GUIDPr = ti.PracGUID AND u.Rok = ti.Y
					SET
						ti.Wykorzystano_D = 
							ti.Wykorzystano_H/(u.avg_min_per_day/60)
					WHERE
						TRUE
					;
				--	 a na koniec ... Pozostalo
					UPDATE `t_we_P` ti
					INNER JOIN `urlopy` u ON u.GUIDPr = ti.PracGUID AND u.Rok = ti.Y
					SET
						ti.Pozostalo_D = 
							ti.Pozostalo_H/(u.avg_min_per_day/60)
					;
					UPDATE `t_we_P` ti
					SET
						ti.WykWypDni = ti.Wykorzystano_D,
						ti.PozostUrlopWypoczDni = ti.Pozostalo_D
					WHERE
						TRUE
					;
				ELSE
				--	Dla wszystkich pozost.
					UPDATE `t_prac_inf` ti
					SET
						ti.WykWypDni = (
							SELECT
								SUM(f.W_dni) AS WykWypDni
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.PracGUID
								AND f.deleted = 0
								AND f.rok = @.Calendar.Y -- YEAR(CURRENT_DATE())
						),
						ti.PozostUrlopWypoczDni = (
							SELECT 
								f.PozostUrlopWypoczDni 
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.PracGUID
								AND f.deleted = 0
								AND f.rok = @.Calendar.Y -- YEAR(CURRENT_DATE())
							ORDER BY miesiac DESC LIMIT 1
						)
					;
				END IF;
			END IF;
			
			SELECT 		
				tad.PracGUID AS OsobaGUID,
				tad.GUID_absencji,
				tad.data AS DATA,
				-- tad.*,
				tad.IS_Swieto, -- sc.GOV_Free_Day AS IS_Swieto,
				-- IFNULL(kl.swieto, FALSE) AS IS_Swieto,
				tad.IS_So,	--	sc.DW = 6 AS IS_So,
				-- WEEKDAY(tad.data) = 5 AS IS_So,
				tad.IS_Nd,	--	sc.DW = 7 AS IS_Nd,
				-- WEEKDAY(tad.data) = 6 AS IS_Nd,
				CONCAT_WS(' ',
					tP.Kto, -- o.nazwisko, ' ', o.Imie1, ' ', 
					tP.MedAdres -- IFNULL((SELECT adres FROM kontakty WHERE osobaGUID = o.GUID AND rodzaj = 0 AND typ_medium = 2 LIMIT 1), '')
				) AS OsobaStrFull,
				-- CONCAT(o.nazwisko, ' ', o.Imie1) AS OsobaStr,
				CONCAT_WS(' ', 
					tP.Kto, -- o.nazwisko, o.Imie1, 
					tP.MedAdres, -- (SELECT adres FROM kontakty WHERE osobaGUID = o.GUID AND rodzaj = 0 AND typ_medium = 2 LIMIT 1),
                    IF(tinf.PseudoAbsOnly,
					-- IF(tinf.MODE = 'Select.pseudo.absencje.all.prac',
						NULL,
						_Brackets('(', 
							CONCAT_WS(' ', _ConcatPre('wyk:', tP.WykWypDni), _ConcatPre('zost:', tP.PozostUrlopWypoczDni)),
						')')
					)
				) AS OsobaStr,
				IFNULL(a.Rodzaj < 0, FALSE) AS As_Plan,		-- KOLORY: czerwony absencja prawomocna a zółty np. niezatwierdzony wniosek
				IFNULL(
					IF(tinf.PseudoAbsOnly,
						IF(a.Idn IS NULL,
							NULL,
							IF(ad.pseudo_abs, ad.Symbol, '---')
						),
						ad.Symbol
					),
					''
				) AS Symbol_Absencji,
				IFNULL(
					IF(tinf.PseudoAbsOnly,
						IF(a.Idn IS NULL,
							NULL,
							IF(ad.pseudo_abs, ad.definicja, 'absencja...')
						),
						ad.definicja
					),
					''
				) AS HINT,
				tad.ToPracownikSzefa,
				a.Idn,
                s.GUI_Color
                
				-- , a.*
			FROM `t_abs_mxd` tad USE KEY (PRIMARY) 
			INNER JOIN `t_we_P_inf` tinf ON TRUE
			INNER JOIN `t_we_P` tP USE KEY (PRIMARY) ON tP.PracGUID = tad.PracGUID
			LEFT JOIN `absencje` a ON a.GUID = tad.GUID_absencji
			LEFT JOIN `absencje_dict` ad ON ad.Idn = ABS(a.Rodzaj)
			-- LEFT JOIN `v_sys_calendar` sc ON sc.date = tad.Data
            LEFT JOIN `stanowiska` s ON  s.guid = tP.stanowisko
			ORDER BY tad.PracGUID, tad.Data
			;
						
			LEAVE S_crm_porta_fide_tools;
		END IF;




		IF _MODE IN ('Select.absencje.prac', 'Select.pseudo.absencje.all.prac') THEN
			DROP TEMPORARY TABLE IF EXISTS `t_select_abs_prac_inf`;
			CREATE TEMPORARY TABLE `t_select_abs_prac_inf` (
			  `Mode` VARCHAR(150) DEFAULT NULL,
			  OsobaGUID VARCHAR(38) DEFAULT NULL,
			  DataWe DATE,
			  DataOd DATE,
			  DataDo DATE,
			  Y INTEGER,
			  PseudoAbsOnly BOOLEAN DEFAULT FALSE,
			  Key3 VARCHAR(38)
			)
			;
			INSERT IGNORE INTO `t_select_abs_prac_inf`
			SET
				Mode = _Mode,
				OsobaGUID = _OsobaGUID,
				DataWe = (@.Calendar.DataWe := DATE(_Param_A)),
				DataOd = (@.Calendar.DataOd := @.Calendar.DataWe - INTERVAL 7 DAY),
				DataDo = (@.Calendar.DataDo := @.Calendar.DataWe + INTERVAL 1 MONTH + INTERVAL 6 DAY),
				Y = (@.Calendar.YYYY := YEAR(@.Calendar.DataWe)),
				PseudoAbsOnly = (_Mode = 'Select.pseudo.absencje.all.prac'),
				Key3 = IF((_Mode = 'Select.pseudo.absencje.all.prac'), 'ALL', _Key3)
			;
							set _Key3 = IF((_Mode = 'Select.pseudo.absencje.all.prac'), 'ALL', _Key3);
                            set @._Key3 := _Key3;
			DROP TEMPORARY TABLE IF EXISTS `t_absencje_day`;
			CREATE TEMPORARY TABLE `t_absencje_day` (
			  -- `idn_absencji` int(11) NOT NULL AUTO_INCREMENT,
			  `Data` DATE DEFAULT NULL,
			  `GUIDpr` VARCHAR(38) NOT NULL DEFAULT '',
			  `GUID_absencji` VARCHAR(38) NOT NULL DEFAULT '',
			  `ToPracownikSzefa` int(11) DEFAULT 1,
			  PRIMARY KEY ID(`GUIDpr`, `Data`),
			  KEY `GUIDpr` (`GUIDpr`),
			  KEY `GUID_absencji` (`GUID_absencji`),
			  KEY `Data` (`Data`)
			);
			DROP TEMPORARY TABLE IF EXISTS `t_days`;
			CREATE TEMPORARY TABLE `t_days` LIKE `_sys_calendar`;
			INSERT INTO `t_days`
			SELECT 
				sc.* 
			FROM `t_select_abs_prac_inf` tinf, `_sys_calendar` sc
			WHERE
				sc.date BETWEEN tinf.DataOd AND tinf.DataDo
			-- GROUP BY kp.data
			ORDER BY sc.date
			;
			
			DROP TEMPORARY TABLE IF EXISTS `t_absencje_day_abs`;
			CREATE TEMPORARY TABLE `t_absencje_day_abs` (
			  `GUID` VARCHAR(38) NOT NULL DEFAULT '',
			  `GUIDpr` VARCHAR(38) DEFAULT NULL,
			  `AbsencjaOd` DATE DEFAULT NULL,
			  `AbsencjaDo` DATE DEFAULT NULL,
			  PRIMARY KEY GUID(GUID),
			  KEY `GUIDpr` (`GUIDpr`),
			  KEY `AbsencjaOd` (`AbsencjaOd`),
			  KEY `AbsencjaDo` (`AbsencjaDo`)
			)
			;
			INSERT IGNORE INTO `t_absencje_day_abs` 
			SELECT
				a.GUID, a.GUIDPr, a.AbsencjaOd, a.AbsencjaDo
			FROM `t_days` d  
			INNER JOIN `absencje` a ON d.Date BETWEEN a.AbsencjaOd AND a.AbsencjaDo
			GROUP BY a.GUID
			;
			
			DROP TEMPORARY TABLE IF EXISTS `t_abs_pracownicy_szefa`;
			CREATE TEMPORARY TABLE `t_abs_pracownicy_szefa` (
				`GUIDpr` VARCHAR(38) DEFAULT NULL,
				`ToPracownikSzefa` INT(1) NOT NULL DEFAULT 0,
				PRIMARY KEY (`GUIDpr`)
			)
			;
			IF _Mode = 'Select.pseudo.absencje.all.prac' THEN
				INSERT IGNORE INTO `t_abs_pracownicy_szefa`
					SELECT 
						o.GUID AS GUIDpr,
						1 AS ToPracownikSzefa
					FROM 
					(SELECT fn.PracGUID FROM `frekw` fn WHERE fn.rok = @.Calendar.YYYY AND fn.Deleted = 0 GROUP BY PracGUID) AS fn,
					`Pracownicy` o
					WHERE 
						o.GUID = fn.PracGUID
						AND 
						(o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
						AND
						o.CzyObecniePracuje != 0
						AND
						NOT (o.GUID IN ('{7184A9AC-9B77-4BB3-B86C-43EE92592E58}', 'Prac5'))
						-- AND EXISTS(SELECT a.GUIDpr FROM `t_absencje_day_abs` a WHERE a.GUIDpr = o.GUID)
				;	
			ELSE
				IF _Key3 = '' THEN
					INSERT IGNORE INTO `t_abs_pracownicy_szefa`
						SELECT 
							o.GUID AS GUIDpr,
							1 AS ToPracownikSzefa
							-- hr.OsobaGuid_A AS GUIDpr
						FROM `Pracownicy` o, `hr_self_links` hr, t_select_abs_prac_inf tinf  
						-- INNER JOIN `hr_self_links` hr ON hr.OsobaGuid_A = o.GUID
						WHERE 
							(o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
							AND
							o.CzyObecniePracuje != 0
							AND
							NOT (o.GUID IN ('{7184A9AC-9B77-4BB3-B86C-43EE92592E58}', 'Prac5'))
							AND
							hr.OsobaGuid_A = o.GUID
							AND
							hr.OsobaGuid_B = tinf.OsobaGUID
							AND
							hr.Rel = 'szef'
					;
					INSERT IGNORE INTO `t_abs_pracownicy_szefa`
						SELECT
							o.GUID AS GUIDpr,
							0 AS ToPracownikSzefa
						FROM `Pracownicy` o, t_select_abs_prac_inf tinf 
						WHERE 
							o.GUID = tinf.OsobaGUID
					;	
				ELSEIF _Key3 = '1' THEN
					INSERT IGNORE INTO `t_abs_pracownicy_szefa`
					(
						SELECT 
							o.GUID AS GUIDpr,
							1 AS ToPracownikSzefa
						FROM `Pracownicy` o, t_select_abs_prac_inf tinf 
						WHERE 
							(o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
							AND
							o.CzyObecniePracuje != 0
							AND
							NOT (o.GUID IN ('{7184A9AC-9B77-4BB3-B86C-43EE92592E58}', 'Prac5'))
							AND
							EXISTS(SELECT a.GUIDpr FROM `t_absencje_day_abs` a WHERE a.GUIDpr = o.GUID)
					)
					;	
				ELSE
					INSERT IGNORE INTO `t_abs_pracownicy_szefa`
						SELECT 
							o.GUID AS GUIDpr,
							1 AS ToPracownikSzefa
						FROM `Pracownicy` o
						WHERE 
							(o.ToPracownik OR (o.aktywny AND (o.firma_wspolprac OR o.ToZleceniobiorca)))
							AND
							o.CzyObecniePracuje != 0
							AND
							NOT (o.GUID IN ('{7184A9AC-9B77-4BB3-B86C-43EE92592E58}', 'Prac5'))
					;
					INSERT IGNORE INTO `t_abs_pracownicy_szefa`
						SELECT
							o.GUID AS GUIDpr,
							0 AS ToPracownikSzefa
						FROM `Pracownicy` o, t_select_abs_prac_inf tinf 
						WHERE 
							o.GUID = tinf.OsobaGUID
					;	
				END IF;
			END IF;
			

		--	Dodatkowo dodaj zalogowanego do `t_abs_pracownicy_szefa` jako osobe dla której też bedą absencje
			INSERT IGNORE INTO `t_absencje_day` 
			(`GUIDpr`, `Data`, `ToPracownikSzefa`)
			SELECT
				ts.GUIDpr, td.Date, ts.ToPracownikSzefa
			FROM `t_days` td, `t_abs_pracownicy_szefa` ts
			GROUP BY ts.GUIDpr, td.Date
			;
			UPDATE `t_absencje_day` ad
			SET
				ad.GUID_absencji = (SELECT GUID FROM `t_absencje_day_abs` a WHERE a.GUIDPr = ad.GUIDpr AND ad.Data BETWEEN a.AbsencjaOd AND a.AbsencjaDo LIMIT 1)
			;
		--	Naliczenie WykWypDni, PozostUrlopWypoczDni dla każdej z osób 	
			DROP TEMPORARY TABLE IF EXISTS `t_prac_inf`;
			CREATE TEMPORARY TABLE `t_prac_inf` 
			SELECT
				ta.GUIDpr,
				tinf.Y AS YYYY,
				_VarINT(0) AS WykWypDni,
				_VarINT(0) AS PozostUrlopWypoczDni,
				_varDouble(0) AS Wykorzystano_H,	
				_varDouble(0) AS Wykorzystano_D,
				_varDouble(0) AS Pozostalo_H,
				_varDouble(0) AS Pozostalo_D
			FROM `t_select_abs_prac_inf` tinf, `t_absencje_day` ta
			GROUP BY GUIDpr
			;
			IF _MODE = 'Select.absencje.prac' THEN
				IF(@session.globals.Owner = 'SKOK') THEN
				/*********************************************************************************************************************
					Uwaga dla SKOK od 2 lut.2023 wymiary bierzemy z tabeli `urlopy`
					Finalnie w 2023 bedzie zupełnie nowa przestrzeń wyliczeń.
				*********************************************************************************************************************/
					UPDATE `t_prac_inf` ti
					SET
						--	Wykorzystano_D
						ti.Wykorzystano_D = (
							SELECT
								-- SUM(f.W_dni) AS WykWypDni
								SUM(f.W_dni) + SUM(f.G_dni)		-- dawny WykWypDni = SUM(f.W_dni), UWAGA!!!! w urlop. wyp. wykorz. podajemy wraz z wykorz. url. n/ż !!!FROM `frekw` f
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.GUIDpr
								AND f.deleted = 0
								AND f.rok = ti.YYYY -- YEAR(CURRENT_DATE())
						),
						--	Wykorzystano_H =	
						ti.Wykorzystano_H = (
							SELECT
								(SUM(f.W_godz) + SUM(f.G_godz))/60		-- dawny WykWypDni = SUM(f.W_dni), UWAGA!!!! w urlop. wyp. wykorz. podajemy wraz z wykorz. url. n/ż !!!
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.GUIDpr
								AND f.deleted = 0
								AND f.rok = ti.YYYY -- YEAR(CURRENT_DATE())
						),
						ti.Pozostalo_H = (
							SELECT 
								f.PozostUrlopWypoczGodz/60  -- poz. urlop wypoczynkowy
							FROM `frekw` f
							WHERE 
								f.PracGUID = ti.GUIDpr
								AND f.deleted = 0
								AND f.rok = ti.YYYY -- YEAR(CURRENT_DATE())
							ORDER BY f.miesiac 
							DESC LIMIT 1
						)
					;
				--	potem ...
					UPDATE `t_prac_inf` ti
					INNER JOIN `urlopy` u ON u.GUIDPr = ti.GUIDPr AND u.Rok = ti.YYYY
					SET
						ti.Wykorzystano_D = 
							ti.Wykorzystano_H/(u.avg_min_per_day/60)
					WHERE
						TRUE
					;
				--	 a na koniec ... Pozostalo
					UPDATE `t_prac_inf` ti
					INNER JOIN `urlopy` u ON u.GUIDPr = ti.GUIDPr AND u.Rok = ti.YYYY
					SET
						ti.Pozostalo_D = 
							ti.Pozostalo_H/(u.avg_min_per_day/60)
					;
					UPDATE `t_prac_inf` ti
					SET
						ti.WykWypDni = ti.Wykorzystano_D,
						ti.PozostUrlopWypoczDni = ti.Pozostalo_D
					WHERE
						TRUE
					;
				ELSE
				--	Dla wszystkich pozost.
					UPDATE `t_prac_inf` ti
					SET
						ti.WykWypDni = (
							SELECT
								SUM(f.W_dni) AS WykWypDni
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.GUIDpr
								AND f.deleted = 0
								AND f.rok = @.Calendar.YYYY -- YEAR(CURRENT_DATE())
						),
						ti.PozostUrlopWypoczDni = (
							SELECT 
								f.PozostUrlopWypoczDni 
							FROM `frekw` f 
							WHERE
								f.PracGUID = ti.GUIDpr
								AND f.deleted = 0
								AND f.rok = @.Calendar.YYYY -- YEAR(CURRENT_DATE())
							ORDER BY miesiac DESC LIMIT 1
						)
					;
				END IF;
			END IF;
			
			SELECT 
				ad.GUIDPr AS OsobaGUID,
				ad.GUID_absencji,
				ad.data AS Data,
				-- ad.*,
				sc.GOV_Free_Day AS IS_Swieto,
				-- IFNULL(kl.swieto, FALSE) AS IS_Swieto,
				sc.DW = 6 AS IS_So,
				-- WEEKDAY(ad.data) = 5 AS IS_So,
				sc.DW = 7 AS IS_Nd,
				-- WEEKDAY(ad.data) = 6 AS IS_Nd,
				CONCAT(
					o.nazwisko, ' ', o.Imie1, ' ', 
					IFNULL((SELECT adres FROM kontakty WHERE osobaGUID = o.GUID AND rodzaj = 0 AND typ_medium = 2 LIMIT 1), '')
				) AS OsobaStrFull,
				-- CONCAT(o.nazwisko, ' ', o.Imie1) AS OsobaStr,
				CONCAT_WS(' ', 
					o.nazwisko, o.Imie1, 
					(SELECT adres FROM kontakty WHERE osobaGUID = o.GUID AND rodzaj = 0 AND typ_medium = 2 LIMIT 1),
					IF(tinf.MODE = 'Select.pseudo.absencje.all.prac',
						NULL,
						
						_Brackets('(', 
							CONCAT_WS(' ', _ConcatPre('wyk:', ti.WykWypDni), _ConcatPre('zost:', ti.PozostUrlopWypoczDni)),
						')')
					)
				) AS OsobaStr,
				IFNULL(a.Rodzaj < 0, FALSE) AS As_Plan,		-- KOLORY: czerwony absencja prawomocna a zółty np. niezatwierdzony wniosek
				IFNULL(
					IF(tinf.PseudoAbsOnly,
						IF(a.Idn IS NULL,
							NULL,
							IF(d.pseudo_abs, d.Symbol, '---')
						),
						d.Symbol
					),
					''
				) AS Symbol_Absencji,
				IFNULL(
					IF(tinf.PseudoAbsOnly,
						IF(a.Idn IS NULL,
							NULL,
							IF(d.pseudo_abs, d.definicja, 'absencja...')
						),
						d.definicja
					),
					''
				) AS HINT,
				ad.ToPracownikSzefa,
				a.Idn,
                s.GUI_Color
                
				-- , a.*
			FROM `t_absencje_day` ad
			INNER JOIN `t_select_abs_prac_inf` tinf ON TRUE
			INNER JOIN `t_prac_inf` ti ON ti.GUIDpr = ad.GUIDpr
			LEFT JOIN osoby o ON o.GUID = ad.GUIDpr
			LEFT JOIN `absencje` a ON a.GUID = ad.GUID_absencji
			LEFT JOIN `absencje_dict` d ON d.Idn = ABS(a.Rodzaj)
			LEFT JOIN `v_sys_calendar` sc ON sc.date = ad.Data
            LEFT JOIN `Pracownicy` p ON p.guid = o.guid
            LEFT JOIN `stanowiska` s ON  s.guid = p.stanowisko
			-- LEFT JOIN `kalendarz` kl ON kl.data = ad.Data
			ORDER BY ad.GUIDpr, ad.Data
			;
						
			LEAVE S_crm_porta_fide_tools;
		END IF;

		IF _MODE = 'Select.Zdarzenia' THEN
			SELECT
				c.Temat, c.Opis, c.Data, c.Status,
				(SELECT COUNT(*) FROM `crm_log` cl WHERE cl.commissionguid = c.GUID) AS IleKomentarzy,
				(SELECT COUNT(*) FROM `dokumenty` d WHERE d.GUID = c.GUID) AS IleDok
			FROM `crm_commisions` c
			INNER JOIN `grupy_osob` go ON go.OsobaGUID = @session.CurrOsobaGUID 
			INNER JOIN `crm_usr_links` cul ON cul.commisionGUID = c.GUID AND cul.Osoba = go.grupaGUID AND IF(_Key2 = 2, cul.Poziom = 2, cul.Poziom != 2)
			WHERE
				c.Rodzaj IN (6, 2) 
				AND
				c.Status = _Key3
			GROUP BY c.GUID
			;			
		END IF;
		
	END IF;
	
	
	/*
	Zamienic trzeba w www/PHP
	'Select.Get.email.select'
	na 
	'SEND.Mail.for.GUID'
	Ten pierwszy zwraca zestaw (temp.) do wysyłki w PHP
	podczas gdy ten drugi wywołany sam juz wszystko zleca w tabelach com_msg_... z których wysyła apro swymi alg.
	Bedzie to juz 5 system który korzysta z `com_msg_ng` i `com_msg_po`
	*/
	
		IF _MODE = 'SEND.Mail.for.GUID' THEN
			SET _crmGUID = IFNULL(_Key, '');
			IF @session.globals.WORK.FLOW.Ver >= '2024.02' THEN
				SET @.we.wGUID = _crmGUID;
				CALL P_crm_workflow_n('log.Prepare.Mail.by.LogIdn', @.we.wGUID, NULL, NULL, NULL, '', '', '', @_Params);			
				LEAVE S_crm_porta_fide_tools;
			END IF;

			-- SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
			DROP TEMPORARY TABLE IF EXISTS `t_prepare_mail_by_workflow_confirm_1`;
			CREATE TEMPORARY TABLE `t_prepare_mail_by_workflow_confirm_1` (
			  `Send_Mode` VARCHAR(38) DEFAULT NULL,
			  `crm_GUID` VARCHAR(38) DEFAULT NULL,
			  `Idn_workflow` INT(11) NOT NULL DEFAULT '0',
			  `OsobaGUID_recipient` VARCHAR(38),
			  `OsobaGUID_owner` VARCHAR(38),
			  `adres` VARCHAR(255),
			PRIMARY KEY OsobaGUID_recipient(OsobaGUID_recipient)
			)
			;
			SET
				@.OsobaGUID_skladajaca = IFNULL((SELECT cul.Osoba FROM `crm_usr_links` cul WHERE cul.commisionGUID = _crmGUID AND cul.Poziom = 2), '')
			;
			SET
				@.Osoba_skladajaca = IFNULL((SELECT CONCAT(o.Imie1, ' ', o.Nazwisko) FROM `osoby` o WHERE o.GUID = @.OsobaGUID_skladajaca), '')
			;
			SET
				@workflow.mail.MSG.Ja.Ja = 'Twój wniosek ma teraz status "#STATUS_BEFORE#" i czeka na Twoją decyzję #STATUS_?#',
				@workflow.mail.MSG.Ja.Ktos = 'Twój wniosek ma teraz status "#STATUS_BEFORE#" i czeka na decyzję osoby(grupy): #GRUPA#',
				@workflow.mail.MSG.Ktos = 'Wniosek osoby #OSOBA# ma teraz status "#STATUS_BEFORE#" i czeka na Twoją decyzję #STATUS_?#',
				@workflow.mail.MSG.Ja.END = _Varstr('Twój wniosek zmienił status na "#STATUS_BEFORE#" (tym samym zakończono rozpatrywanie wniosku)'),
				@Html.Go.to.PortaFide.Button = "<br><br><a style='float:right;margin:0;padding:0;margin:0;padding:0;font-family:Helvetica Neue,Helvetica,Helvetica,Arial,sans-serif;text-decoration:none;color:#fff;background-color:blue;padding:10px 16px;font-weight:bold;margin-right:10px;text-align:center;display:inline-block' href=#href_PortaFide#> Przejdz do portalu </a>",
				@Html.Go.to.PortaFide.href.default = 'https://webapp.konkol.pl/PortaFide/',
				@Html.Hist.wnioskow.H = '<br><br><hr><br><center><b> HISTORIA WNIOSKU </b><br><table style="border:1px solid black;border-collapse: collapse;"> <tr> <th style="background-color:gray;color:white;padding:5px;border:1px solid black ;">Data</th><th style="background-color:gray;color:white;padding:5px;border:1px solid black;">Osoba</th><th style="background-color:gray;color:white;padding:5px;border:1px solid black;">Status</th></tr>',
				@Html.Hist.wnioskow.B = '',
				@Html.Hist.wnioskow.F = '</table></center>',
				/* #47363 maile o urlopach mają też trafiać do kadr (p.Wolszon i p.Tkaczyk: barbara.wolszon@konkol.pl;joanna.tkaczyk@konkol.pl); klucz 'PF_emaile_DW' zainicjowany poprzez 52.sql  */
				@workflow.mail.Adr.DW = IFNULL((SELECT ValueA AS maile FROM IReg i WHERE IdKey = 'PF_emaile_DW' AND IdPath = 'INT\\SYSTEM\\MOTLAWA\\DaneFirmy'), '')	
			;
	if ifnull(@.jmam.blokuj.wysylke.portafide, false) then
			SET
				@workflow.mail.MSG.Ja.Ja = 'Twój wniosek ma teraz status "#Param1#" i czeka na Twoją decyzję #Param2#',
				@workflow.mail.MSG.Ja.Ktos = 'Twój wniosek ma teraz status "#Param1#" i czeka na decyzję osoby(grupy): #Param3#',
				@workflow.mail.MSG.Ktos = 'Wniosek osoby #CtxN# ma teraz status "#Param1#" i czeka na Twoją decyzję #Param2#',
				@workflow.mail.MSG.Ja.END = _Varstr('Twój wniosek zmienił status na "#Param1#" (tym samym zakończono rozpatrywanie wniosku)')
			;
	end if;
			SET
			--	odczytaj z coresów link do PortaFide - potrzebny do podmiany frazy #href_PortaFide#
				@Html.Go.to.PortaFide.href = 
					IFNULL(
						(SELECT a.Prog_HREF FROM `_sys_app_reg` a WHERE a.ID LIKE 'M.WEB.PortaFide.www%' AND a.Prog_HREF <> '' LIMIT 1),
						IFNULL(
							(SELECT c.Prog_HREF FROM `sys_core` c WHERE c.GUID LIKE 'M.WEB.PortaFide.www%'),
							@Html.Go.to.PortaFide.href.default
						)
				)
			;
			SET	-- podmiana frazy #href_PortaFide# na link buttona
				@Html.Go.to.PortaFide.Button = REPLACE(@Html.Go.to.PortaFide.Button, '#href_PortaFide#', @Html.Go.to.PortaFide.href)
			;	
		--	Historia - wołamy ja bez pobierania selecta
			CALL crm_workflow_TOOLS('Select.workflow.history', _crmGUID, '', '1', '', '', '');	--	(1) bez select i dropa
			SET @Html.HIST.Tabela = IFNULL(
				(
				SELECT 
					CONCAT(
					'<br><br><hr><br><center><b> HISTORIA WNIOSKU </b><br><table style="border:1px solid black;border-collapse: collapse;"> <tr> <th style="background-color:gray;color:white;padding:5px;border:1px solid black ;">Data</th><th style="background-color:gray;color:white;padding:5px;border:1px solid black;">Osoba</th><th style="background-color:gray;color:white;padding:5px;border:1px solid black;">Status</th></tr>',
					GROUP_CONCAT(DISTINCT 
						CONCAT(
							_VarStr('<tr><td style="padding:5px;border:1px solid black;">'),
							IF(t.Time_log = '0000-00-00 00:00:00',
								_VarStr('Następny krok...'),
								_VarStr(_Fmt_DateTime(t.Time_log, 'ddd d mmm yyyy hh:nn @Y'))
							),
							_VarStr('</td><td style="padding:5px;border:1px solid black;">'),
							_VarStr(t.Users_Nazwiska_Log),
							_VarStr('</td><td style="padding:5px;border:1px solid black;">'),
							_VarStr(t.Status_Current),
							_VarStr('</td></tr>')
						)
						ORDER BY t.Y 
						SEPARATOR ''
					),
					'</table></center>'
					)
					 AS tabela
				FROM `v_crm_workflow.history` t
				ORDER BY t.Y
				), ''
			)
			;
			
			
			TRUNCATE `t_prepare_mail_by_workflow_confirm_1`;
			INSERT IGNORE INTO `t_prepare_mail_by_workflow_confirm_1`
			(Send_Mode, crm_GUID, Idn_workflow, OsobaGUID_recipient, OsobaGUID_owner)
			SELECT
				'KTOS' AS Send_Mode,
				vw.commisionGUID AS crm_GUID, 
				vw.Idn_workflow, 
				o.GUID AS OsobaGUID_recipient,
				@.OsobaGUID_skladajaca
			FROM `crm_commisions` c 
			INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.PodRodzaj = c.PodRodzaj
			INNER JOIN `v_crm_workflow_confirm` vw ON vw.commisionGUID = c.GUID AND vw.Def = IFNULL(c.Def_confirm_statuses, cr.Def_confirm_statuses) AND vw.Response != 'RESPONSE_100'
			INNER JOIN `grupy_osob` go ON go.grupaGUID = vw.UserGUID
			INNER JOIN `osoby` o ON o.GUID = go.osobaGUID AND o.Rodzaj != 0
			-- UsewrGUID
			WHERE 
				c.GUID = _crmGUID 
			GROUP BY OsobaGUID_recipient -- , Idn_workflow
			;
			UPDATE `t_prepare_mail_by_workflow_confirm_1` t
			SET
				t.Send_Mode =  
					IF(t.OsobaGUID_owner = t.OsobaGUID_recipient,
						'JA.JA',
						t.Send_Mode
					)
			;
			INSERT IGNORE INTO `t_prepare_mail_by_workflow_confirm_1`
			(Send_Mode, crm_GUID, Idn_workflow, OsobaGUID_recipient, OsobaGUID_owner)
			SELECT
				'JA.KTOS' AS Send_Mode,
				c.GUID AS crm_GUID, 
				IFNULL(
					(
					SELECT 
						vw.Idn_workflow 
					FROM `v_crm_workflow_confirm` vw 
					WHERE 
						vw.commisionGUID = c.GUID 
						AND vw.Def = IFNULL(c.Def_confirm_statuses, cr.Def_confirm_statuses) 
					ORDER BY vw.Idn_workflow DESC 
					LIMIT 1
					)
				, 0)
				AS Idn_workflow, 
				o.GUID AS OsobaGUID_recipient, -- de facto = @.OsobaGUID_skladajaca
				@.OsobaGUID_skladajaca
			FROM `crm_commisions` c 
			INNER JOIN `crm_rodzaje` cr ON cr.Rodzaj = c.Rodzaj AND cr.PodRodzaj = c.PodRodzaj
			INNER JOIN `osoby` o ON o.GUID = @.OsobaGUID_skladajaca
			-- UsewrGUID
			WHERE 
				c.GUID = _crmGUID
			GROUP BY OsobaGUID_recipient -- , Idn_workflow
			;
			/*
			było
			UPDATE `t_prepare_mail_by_workflow_confirm_1` t, `v_crm_workflow_confirm` vw 
			SET
				t.Send_Mode =  
					IF(vw.Response = 'RESPONSE_100',
						'JA.END',
						t.Send_Mode
					)
			WHERE
				vw.Idn_workflow = t.Idn_workflow
			;
			jest
			*/
			UPDATE `t_prepare_mail_by_workflow_confirm_1` t, `crm_workflow` cw 
			SET
				t.Send_Mode =  
					IF(cw .Response = 'RESPONSE_100',
						'JA.END',
						t.Send_Mode
					)
			WHERE
				cw .Idn = t.Idn_workflow
			;
			DROP TEMPORARY TABLE IF EXISTS `t_prepare_mail_by_workflow_confirm_2`;
			CREATE TEMPORARY TABLE `t_prepare_mail_by_workflow_confirm_2` (
			  `ID` VARCHAR(38) DEFAULT NULL,
			  `Msg_init` LONGTEXT,
			  `Grupa_Nazwy` TEXT,
			  `Imiona_Nazwisko` VARCHAR(150) DEFAULT NULL,
			  `Send_Mode` VARCHAR(38) DEFAULT NULL,
			  `crm_GUID` VARCHAR(38) DEFAULT NULL,
			  `Idn_workflow` INT(11) NOT NULL DEFAULT '0',
			  `OsobaGUID_recipient` VARCHAR(38) NOT NULL DEFAULT '',
			  `OsobaGUID_owner` VARCHAR(38) DEFAULT NULL,
			  `adres` VARCHAR(255) DEFAULT NULL,
			  PRIMARY KEY `ID`(`ID`)
			)
			;
			
			-- CREATE TEMPORARY TABLE `t_prepare_mail_by_workflow_confirm_2` 
			TRUNCATE `t_prepare_mail_by_workflow_confirm_2`;
			INSERT IGNORE INTO `t_prepare_mail_by_workflow_confirm_2`
			SELECT
				_Get_ID_xxxxx('SHORT', 38, 'Wnios.WorkFlow=', t.Idn_workflow, ':', NULL, NULL, NULL) AS ID,
				CASE 
				WHEN t.Send_Mode = 'JA.JA' THEN @workflow.mail.MSG.Ja.Ja
				WHEN t.Send_Mode = 'JA.KTOS' THEN @workflow.mail.MSG.Ja.Ktos
				WHEN t.Send_Mode = 'KTOS' THEN @workflow.mail.MSG.Ktos
				WHEN t.Send_Mode = 'JA.END' THEN @workflow.mail.MSG.Ja.END
				END AS Msg_init,
				
				GROUP_CONCAT(CONCAT(o1.Imie1, ' ', o1.Nazwisko)) AS Grupa_Nazwy,
				CONCAT(o.Imie1, ' ', o.Nazwisko) AS Imiona_Nazwisko,
				t.*
			FROM `t_prepare_mail_by_workflow_confirm_1` t
			-- INNER JOIN `v_crm_workflow_confirm` vw  ON vw.Idn_workflow = t.Idn_workflow
			INNER JOIN `crm_workflow_confirm` vw  ON vw.Idn_workflow = t.Idn_workflow
			INNER JOIN `osoby` o1 ON o1.GUID = vw.UserGUID

			INNER JOIN `osoby` grupa ON grupa.GUID = vw.UserGUID
			INNER JOIN `osoby` o ON o.GUID = t.OsobaGUID_recipient
			GROUP BY t.OsobaGUID_recipient
			;
	if ifnull(@.jmam.blokuj.wysylke.portafide, false) then
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t
			SET
				t.Msg_init = CONCAT_WS('',
					t.Msg_init,
					@Html.Go.to.PortaFide.Button,
					@Html.HIST.Tabela,
					NULL
				)
			;
			CALL send_mail('Init', 'crm_porta_fide_tools', 'MAIL_FROM_Kadry', 'M.WEB.PortaFide.www', '', '', '', NULL);
			INSERT IGNORE INTO `t_send_mail`
			-- (SendGUID, Send_Mode, Recip_GUID, Recip_Ad_mail, Msg_Title, Msg_Body_Template, Msg_Body_Content)
			(SendGUID, Send_Mode, Recip_GUID, Msg_Title, Msg_Body_Template, Msg_Body_Content, Ctx_GUID, Param1, Param2, Param3)
			SELECT 
				sn.ID AS GUID,
				sn.Send_Mode,
				sn.OsobaGUID_recipient AS Recip_GUID,
				-- sn.adres AS Recip_Ad_mail, 
				CONCAT_WS(' ', 
					c.Temat,
					_Format_DT_Range_Mask(c.StartTime, c.EndTime, '%D %MR %YH[DZ];%D %MR %YH[DZ];',  '[#dni#]([#from#][do][#to#])'),
					NULL
				) AS Msg_Title, 
				'DEFAULT' AS Msg_Body_Template,
				sn.Msg_init AS Msg_Body_Content,
				sn.OsobaGUID_owner AS Ctx_GUID,	-- #CtxN# <- #OSOBA#
				IF(sn.Send_Mode = 'JA.END', 
					cw.Status_Current,
					cw.Status_Before
				) AS Param1, 					-- #Param1# <- #STATUS_BEFORE#
				'' AS Param2,  					-- #Param2# <- #STATUS_?#
				sn.Grupa_Nazwy AS Param3 		-- #Param3# <- #GRUPA#
			FROM `t_prepare_mail_by_workflow_confirm_2` sn
			INNER JOIN `crm_commisions` c ON c.GUID = sn.crm_GUID
			INNER JOIN `v_crm_workflow` cw ON cw.Idn = sn.Idn_workflow
			WHERE
				TRUE -- sn.Adr_Mail <> ''
			;				
						update `t_send_mail` set Recip_Ad_mail = 'jmam68@gmail.com';
			CALL send_mail('send', '', '', '', '', '', '', '');
		LEAVE S_crm_porta_fide_tools;
	END if;
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t, `v_crm_workflow` cw  
			SET
				t.Msg_init = 
					REPLACE(
						REPLACE(
							REPLACE(
								REPLACE(
									t.Msg_init, '#STATUS_?#', ''
								),
								'#GRUPA#', t.Grupa_Nazwy
							),
							'#OSOBA#', @.Osoba_skladajaca
						),
						'#STATUS_BEFORE#', 
					-- 	było cw.Status_Before
						IF(t.Send_Mode = 'JA.END', 
							cw.Status_Current,
							cw.Status_Before
						) 					-- #Param1# <- #STATUS_BEFORE#
					)
			WHERE
				cw.Idn = t.Idn_workflow

			;
			/*
				#CtxN# <- #OSOBA#
				#Param1# <- #STATUS_BEFORE#
				#Param2# <- #STATUS_?#
				#Param3# <- #GRUPA#
			*/
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t
			SET
				t.Msg_init = CONCAT_WS('',
					t.Msg_init,
					@Html.Go.to.PortaFide.Button,
					@Html.HIST.Tabela,
					NULL
				)
			;
		--	Adresy Mailowe
		--	1.	Najpierw sluzbowe dla poziomu <> 2 
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t
			SET
				t.adres = 
					IFNULL(
						(
						SELECT ua.Ad_mail FROM `_user_accounts` ua WHERE ua.OsobaGUID = t.OsobaGUID_recipient
						),
						IFNULL(
							(
							SELECT 
								k.Adres 
							FROM `kontakty` k 
							WHERE 
								k.osobaGUID = t.OsobaGUID_recipient
								AND k.typ_medium = 3 
								AND IFNULL(k.KontrGUID, '') != '' 				--	KontrGUID !!!
							ORDER BY k.newsletter DESC, k.priorytet DESC 
							LIMIT 1
							),
							''
						)
					)
			WHERE
				TRUE
				-- and t.OsobaGUID_owner != t.OsobaGUID_recipient
			;
		--	2.	Teraz dla wszystkich jesli w p.1 nie wstawil sluzbowego to tutaj wstawi niesluzbowy
			UPDATE `t_prepare_mail_by_workflow_confirm_2` t
			SET
				t.adres = (
					SELECT
						k.Adres
					FROM `kontakty` k 
					WHERE
						k.osobaGUID = t.OsobaGUID_recipient
						AND k.typ_medium = 3 
					ORDER BY k.newsletter DESC, k.priorytet DESC 
					LIMIT 1
					)
			WHERE
				IFNULL(t.adres, '') = ''
			;
			
		--	zanim wstawisz maile ustal sendera (mail)
			CALL com_mailer('SET.Sender.MAIL', '', 'MAIL_FROM_Kadry', '', '', '');	-- ustawia zmienną @.Sender.MAIL jako np. Firmowy/MAIL_FROM_faktury/MAIL_FROM_zamowienia/MAIL_FROM_Place/MAIL_FROM_rozrach/ 
		--	Wstaw maile do `com_msg_ng`
		if ifnull(@.jmam.blokuj.wysylke.portafide, false) then
		LEAVE S_crm_porta_fide_tools;
		END if;
		
			INSERT IGNORE INTO `com_msg_ng`
				(GUID, CreateAt, GUID_crm_notification, OWNER, Msg_Title, Msg_Body,SrcGUID, SrcTable, 
				Notification_Start, Notification_Hour_Before, Notification_Until, Msg_Mode, Msg_SubMode, Sender)
				SELECT 
					sn.ID AS GUID,
					NOW() AS CreateAt, 
					NULL AS GUID_crm_notification,
					'System' AS OWNER, 
					c.Temat AS Msg_Title, 
					sn.Msg_init AS Msg_Body,
					c.GUID,
					'crm_commisions' AS SrcTable,
					NOW() AS Notification_Start, 
					0 AS Notification_Hour_Before, 
					DATE_ADD(NOW(), INTERVAL 1 DAY) AS Notification_Until,
					'MAIL' AS Msg_Mode, 
					'NEW' AS Msg_SubMode,
					@.Sender.MAIL AS Sender	--	było 'biuro@konkol.pl' AS Sender
				FROM `t_prepare_mail_by_workflow_confirm_2` sn
				INNER JOIN `crm_commisions` c ON c.GUID = sn.crm_GUID
				WHERE
					TRUE -- sn.Adr_Mail <> ''
			;
		--	Adresy mailowe - Recipient
			INSERT IGNORE INTO `com_msg_po`
				(GUIDNg, Medium_Type, Recipient, STATUS, Dispatch_ID, RecipientRole)
				SELECT
					sn.ID AS GUIDNg,
					'MAIL' AS Medium_Type,
					sn.adres AS Recipient,
					'NEW' AS STATUS,
					UUID_SHORT() AS Dispatch_ID, --  sn.GUID_Mail AS Dispatch_ID,
					'To' AS RecipientRole
				FROM `t_prepare_mail_by_workflow_confirm_2` sn
				WHERE
					sn.adres <> ''
			;
		--	Adresy mailowe - DW (CC)
			DROP TEMPORARY TABLE IF EXISTS `t_mail_adr_CC`;
			CREATE TEMPORARY TABLE `t_mail_adr_CC` (
			  `Mail_Adres` VARCHAR(255),
			PRIMARY KEY Mail_Adres(Mail_Adres)
			)
			;
		--	Adresy DW (CC) sa niestety w postaci "barbara.wolszon@konkol.pl;joanna.tkaczyk@konkol.pl" :( ...
		--	musze je w petli sparsować i wstawic do tabeleczki `t_mail_adr_CC`
		--	1. Wstaw wstepnie do zmiennej która gdy jest pusta kończy pętle
			SET @.N.Mail_Adres = @workflow.mail.Adr.DW;
			WHILE (IFNULL(@.N.Mail_Adres, '') <> '') DO
				CALL _SEQ_Get_Next(@.N.Mail_Adres , ';', @.Sub.Mail_Adres, '');	--	proc. zwraca zarowno (pomniejszony) @.N.Mail_Adres jak i @.Sub.Mail_Adres 
				-- SELECT @.Sub.Mail_Adres, @.N.Mail_Adres;
				IF IFNULL(@.Sub.Mail_Adres, '') <> '' THEN
					INSERT IGNORE INTO `t_mail_adr_CC` SET Mail_Adres = @.Sub.Mail_Adres;
				END IF;
			END WHILE;
		
			INSERT IGNORE INTO `com_msg_po`
				(GUIDNg, Medium_Type, Recipient, STATUS, Dispatch_ID, RecipientRole)
				SELECT
					sn.ID AS GUIDNg,
					'MAIL' AS Medium_Type,
					tcc.Mail_Adres AS Recipient,
					'NEW' AS STATUS,
					UUID_SHORT() AS Dispatch_ID, --  sn.GUID_Mail AS Dispatch_ID,
					'CC' AS RecipientRole
				FROM `t_prepare_mail_by_workflow_confirm_2` sn, `t_mail_adr_CC` tcc
				WHERE
					TRUE
			;
			-- select @.Osoba_skladajaca;
			LEAVE S_crm_porta_fide_tools;
			
			SELECT 
				t.Msg_init AS Msg, 
				GROUP_CONCAT(DISTINCT t.adres SEPARATOR ',') AS adres, 
				c.Temat 
			FROM `t_prepare_mail_by_workflow_confirm_2` t 
			INNER JOIN `crm_commisions` c ON c.GUID = t.crm_GUID
			GROUP BY Msg
			;
			
			-- SELECT * FROM `t_prepare_mail_by_workflow_confirm_2` t;
			
		END IF;
	
	IF _MODE LIKE 'Zdarzenia.%' THEN
	/************************************************************************************************************************************************
		Dla zdarzen rejestrowanych przez tablet
		Najpierw samo zdarzenie ...
		CALL crm_porta_fide_tools('Zdarzenia.NEW', 'GUIDCrm', 'OsobaZalogowanaZglaszajaca', '6', '0', 'Temat', '', '', '');
		_Key		to GUID crm
		_Key2 		to guid osoby
		_Key3		Rodzaj
		_Param_A	PodRodzaj
		_Param_B	tekst zdarzenia
		
		... potem aby dodać osoby n x wolamy
		CALL crm_porta_fide_tools('Zdarzenia.NEW.Osoby', 'GUIDCrm', 'OsobaZeZdarzenia', '', '', '', '', '', '');
		_Key		to GUID crm
		_Key2 		to guid osoby
		
		... potem aby dodać zdjęcia n x wolamy
		CALL crm_porta_fide_tools('Zdarzenia.NEW.Photo', 'GUIDCrm', '', '', '', 'binary???', '', '', '');
	************************************************************************************************************************************************/
		SET _crmGUID = IFNULL(_Key, '');
		-- bylo SET _OsobaGUID = IF(IFNULL(_Key2, '') = '', @session.CurrOsobaGUID, _Key2);
		SET _OsobaGUID = IFNULL(NULLIF(_Key2, ''), @SYSTEM.Client.Session.log_USER_GUID);
		IF _MODE = 'Zdarzenia.NEW' THEN
			SET
				_Rodzaj = _Key3, _PodRodzaj = _Param_A
			;
			CALL crm_INSERT('', _crmGUID, '', _Rodzaj, _PodRodzaj, 'Notatka', _Param_B, 0.5, 'NrWewn', NULL, NULL, _OsobaGUID, '', '', '', 0, 0, '', '');
			-- CALL crm_usr_links_INSERT('insert.bez.duplikatu.poziomu', _crmGUID, '', _OsobaGUID, 2, 0, NULL, NULL, '', '');
			CALL crm_usr_links_INSERT('delete', _crmGUID, '', _OsobaGUID, 2, 0, NULL, NULL, '', '');
			CALL crm_usr_links_INSERT('z.grupy_osob', _crmGUID, '', 'KADRY_Decyzje', 1, 0, NULL, NULL, '', '');
		END IF;

		IF _MODE = 'Zdarzenia.NEW.Osoby' THEN
			-- CALL crm_usr_links_INSERT('insert.bez.duplikatu.poziomu', _crmGUID, '', _OsobaGUID, 2, 0, NULL, NULL, '', '');
			CALL crm_usr_links_INSERT('', _crmGUID, '', _OsobaGUID, 2, 0, NULL, NULL, '', '');
			CALL crm_usr_links_INSERT('z.hr_self_links.szef', _crmGUID, '', _OsobaGUID, 1, 0, NULL, NULL, 'new', '');
		END IF;
		
		IF _MODE = 'Zdarzenia.NEW.Photo' THEN
			SET @X = 'obsluzone w function saveForm()';
		END IF;
		
		
	END IF;
	
END$$

DROP FUNCTION IF EXISTS `_Concat_ABS_Range_Date_Hours`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_Concat_ABS_Range_Date_Hours`(
	_MODE VARCHAR(200),
	_DateStart DATE,
	_DateEnd DATE,
	_DurationD INTEGER,		
	_DurationH DOUBLE(16,4),
	_Kod_ABS VARCHAR(50),
	_okres_typ VARCHAR(50),
	_Param_A VARCHAR(50)
) RETURNS VARCHAR(256)
    NO SQL
    DETERMINISTIC
BEGIN
	SET @.fmt.2.diff.Days = (@.fmt.Days := (1 + TIMESTAMPDIFF(DAY, _DateStart, _DateEnd)) != _DurationD);
	SET @.VGridMask = IF(@.typ_HD := (_okres_typ LIKE '%H%' AND _Kod_ABS <> 'URL.WYP'), 'URL.WYP', '#VH (w #VD)');
	
	RETURN 
		CONCAT_WS(' ',
			-- _Format_DT_Range_Mask(_DateStart, _DateEnd, '%D %mmm %YH;%D %mmm %YH;',  '[#from#][do][#to#] - [#dni#]'),
			_Format_DT_Range_Mask(_DateStart, _DateEnd, '%D %mmm %YH;%D %mmm %YH;',  '[#from#][do][#to#]'),
			IF(NOT @.typ_HD AND @.fmt.2.diff.Days,
				CONCAT('(', ROUND(@.fmt.Days), 'dn )'),
				NULL
			),
			TRIM(
				REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@.VGridMask,
				'#VD dn', '#VD'),	--  dn bedzie dodawane zawsze za dniami
				'(w #VD)', IFNULL(CONCAT(_VarStr('(w '), ROUND(@.S_Dni), ' dn)'), 'b.d.')),
				'(#VD)', IFNULL(CONCAT('(', ROUND(@.S_Dni), ' dn '), 'b.d.')),
				'#VD', IFNULL(CONCAT(ROUND(@.S_Dni), ' dn '), 'b.d.')),
				
				'(#VH)', IFNULL(CONCAT('(', _DisplayDurationH('H', @.S_H, '', ''), ')'), '')),
				'#VH', IFNULL(_DisplayDurationH('H', @.S_H, '', ''), '')),
				'  ', ' ')
			),
			NULL
		)
	;
END$$

DROP FUNCTION IF EXISTS `_Concat_Value1_Value2`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_Concat_Value1_Value2`(
	_Value1 VARCHAR(100),
	_Unit1 VARCHAR(100),
	_BD1 VARCHAR(20),		-- w przypadku gdy _Value1 = NULL
	_Value2 VARCHAR(100),
	_Unit2 VARCHAR(100),
	_BD2 VARCHAR(20),		-- w przypadku gdy _Value2 = NULL
	_Bra2_B VARCHAR(10),		-- nawias otwierajacy _Value2
	_Bra2_E VARCHAR(10)		-- nawias zamykajacy _Value2
) RETURNS VARCHAR(256)
    NO SQL
    DETERMINISTIC
BEGIN
	RETURN 
	CONCAT_WS(' ',
		IF(_Value1 IS NOT NULL,
			CONCAT_WS(' ', _Value1, NULLIF(_Unit1, '')),
			_BD1
		),
		IF(_Value2 IS NOT NULL,
			CONCAT(_Bra2_B, CONCAT_WS(' ', _Value2, NULLIF(_Unit2, '')), _Bra2_E),
			_BD2
		),
		NULL
	)
	;
END$$


DELIMITER ;

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

ALTER TABLE `crm_usr_links`   
  ADD COLUMN `confirm_status_init` VARCHAR(100) DEFAULT ''  NOT NULL  COMMENT 'Inicjalny Status zatwierdzenia z `crm_confirm_statuses`' AFTER `wydajnosc`, 
  ADD COLUMN `confirm_status` VARCHAR(100) DEFAULT ''  NOT NULL  COMMENT 'Aktualny Status zatwierdzenia z `crm_confirm_statuses`' AFTER `confirm_status_init`, 
  ADD  INDEX `confirm_status` (`confirm_status`),
  ADD  INDEX `confirm_status_init` (`confirm_status_init`) 
;
ALTER TABLE `crm_commisions`   
  ADD COLUMN `Update_status` VARCHAR(200) DEFAULT '' NOT NULL COMMENT 'gdy <> "" to zainicjowuje specjalne czynnosci w triggerze' AFTER `status2`,
  ADD COLUMN `confirm_status` VARCHAR(100) DEFAULT ''  NOT NULL  COMMENT 'Aktualny Status zatwierdzenia z `crm_confirm_statuses`' AFTER `Update_status`, 
  ADD  INDEX `confirm_status` (`confirm_status`)
;

SHOW CREATE TABLE `crm_confirm_statuses`;
CREATE TABLE `crm_confirm_statuses` (
  `Def` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Definicja zatwierdzenia (wspolklucz)',
  `Status` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Status zatwierdzenia',
  `Descr_status` VARCHAR(250) NOT NULL DEFAULT '' COMMENT 'Opis samego statusu',
  `Level` INT(11) NOT NULL DEFAULT '0' COMMENT 'Poziom od 0...n - w agregacji bierzemy MIN(Level)',
  `crm_Status` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Odp. Status crm',
  `Comment` VARCHAR(250) NOT NULL DEFAULT '' COMMENT 'komentarz',
  PRIMARY KEY (`Status`,`Def`),
  KEY `Status` (`Status`)
) DEFAULT CHARSET=cp1250 COMMENT='Statusy potwierdzen w zdarzeniach crm'
;
SHOW CREATE TABLE `crm_confirm_statuses_links`;
CREATE TABLE `crm_confirm_statuses_links` (
  `Def` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Definicja zatwierdzenia (wspolklucz)',
  `Status_1` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Poprz. Status zatwierdzenia',
  `Status_2` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'Nast. Status zatwierdzenia',
  `Desr_Item` VARCHAR(200) NOT NULL DEFAULT '' COMMENT 'Opis wybranej opcji',
  PRIMARY KEY (`Def`,`Status_1`,`Status_2`),
  KEY `Status_1` (`Status_1`),
  KEY `Status_2` (`Status_2`)
) DEFAULT CHARSET=cp1250 COMMENT='Statusy potwierdzen w zdarzeniach crm'
;

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

/*
$Log: crm_porta_fide.sql,v $
Revision 1.26  2025/03/27 09:54:19  jmam
no message

Revision 1.25  2025/02/19 17:40:23  jmam
$send$ Zmiany po TK

Revision 1.24  2025/02/19 14:05:58  waliant
Warningi $SEND$

Revision 1.23  2025/02/03 14:15:57  jmam
$SEND$ poprawki selektow + kolory do absencji

Revision 1.22  2024/11/20 18:00:47  jmam
$SEND$ Poprawka do mode "crm.Wniosek.CANCEL"

Revision 1.21  2024/04/27 09:14:14  jmam
Inicjacja WORK.FLOW.Ver = 2024.04 $SEND$

*/
