DELIMITER $$

DROP PROCEDURE IF EXISTS `pl_frekw_zlec_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pl_frekw_zlec_tools`(
	IN _MODE    VARCHAR(150),
	IN _Key     VARCHAR(255),	
	IN _Year    VARCHAR(4),
	IN _Month   VARCHAR(4),	
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
SPROC: BEGIN 
	/*
	_MODE

	------------------------------------------------------------------------------------------------------------------------------------------------------------

	------------------------------------------------------------------------------------------------------------------------------------------------------------
	*/
	
	DECLARE _SQLText TEXT DEFAULT '';
	DECLARE _PracGUID, _GUID VARCHAR(38);
	DECLARE _firma varchar(250);
	DECLARE _nadg, _NCP, _NCP_kodeks, _etat, _zdjac double;  
	DECLARE  _I, _start, _counter, _msc, _ile, _days_in_month, _def, _dzien_P integer;
	DECLARE _Owner  VARCHAR(100);
	
	DECLARE _done BOOL DEFAULT FALSE;
		
	DECLARE _c_PracGUID CURSOR FOR
	SELECT 
		PracGUID
	FROM 
		t_frekw_automat;

			
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
		
/*---------------------------------------------------------------------------------------------------------------------------------------------------------
	   Generowanie frekwencji zlecb. na podst. standardowej frekwencji (wersja dla Konkol)
	   Zostana utworzone karty dla tych zleceniobiorcow, ktorzy na dany miesiac posiadaja: 1) karte frekwencji  2) zlecenie
-----------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'f2f.konkol') THEN
	
		CALL pl_frekw_zlec_tools('f2f', '', _Year, _Month, '', '');	-- tworzy tabele bazowe: t_fz, t_fz_poz; wstawia dane do frekw_zlec
		
		REPLACE INTO frekw_zlec_po(GUID, FrekwGUID, PracGUID, rok_msc_dzien, dzien, godziny)  -- nie wstawiamy symbolu absencji
		SELECT GUID, FrekwGUID, PracGUID, rok_msc_dzien, dzien, godziny_zz 
		FROM t_fz_poz;	  -- godziny_zz (`Praca (Z)`) sa z dokladnoscia do 30 min
		
		SELECT COUNT(*) AS ile FROM t_fz;
		
				
	END IF;  -- IF (_MODE = 'f2f.konkol') THEN

		
		
/*---------------------------------------------------------------------------------------------------------------------------------------------------------
	   Generowanie frekwencji zlecb. na podst. standardowej frekwencji (wersja dla Jarz.)
	   Zostana utworzone karty dla tych zleceniobiorcow, ktorzy na dany miesiac posiadaja karte frekwencji i zlecenie
-----------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'f2f.jarz') THEN
	
		CALL pl_frekw_zlec_tools('f2f', '', _Year, _Month, '', '');	-- tworzy tabele bazowe: t_fz, t_fz_poz, 
		
		-- naliczyc godziny_pracy
		
	    SELECT COUNT(*) AS ile FROM t_fz;		
				
	END IF;  -- IF (_MODE = 'f2f.jarz') THEN
	
/*---------------------------------------------------------------------------------------------------------------------------------------------------------
	   Generowanie frekwencji zlecb. na podst. standardowej frekwencji - częśc wspólna
	   Zostana utworzone karty dla tych zleceniobiorcow, ktorzy na dany miesiac posiadaja karte frekwencji i zlecenie
-----------------------------------------------------------------------------------------------------------------------------------------------------------*/		
	IF (_MODE = 'f2f') THEN
	
		DROP TEMPORARY TABLE IF EXISTS t_fz;	
		CREATE TEMPORARY TABLE t_fz
		SELECT DISTINCT f.guid, f.rok, f.miesiac, f.kategoria, f.PracGUID, f.zamkniety, f.PracowalDni, f.UGrpGUID, IF(@session.globals.Owner = 'KONKOL', f.godziny_pracy, 0) AS godziny_pracy -- sum(PracaZ)   'F.godziny_pracy   dla Konkola: pole z suma godz_zz
		FROM frekw f, prace_zlecone z
		WHERE f.rok = _varINT(_Year) AND f.miesiac = _varINT(_Month) AND z.rok=f.rok AND z.miesiac =f.miesiac AND z.GUID_pracownika = f.PracGUID
		AND f.deleted = 0 AND z.deleted = 0 AND f.PracowalDni > 0;
		
		
		DROP TEMPORARY TABLE IF EXISTS t_fz_poz;
		CREATE TEMPORARY TABLE t_fz_poz
		SELECT *
		FROM frekw_po 
		WHERE FrekwGUID IN (SELECT guid FROM t_fz)
		;
						
		-- UPDATE t_fz_poz SET idn = 0;
		
		REPLACE INTO frekw_zlec (guid, rok, miesiac, kategoria, PracGUID, zamkniety, PracowalDni, UGrpGUID, godziny_pracy, godz100prac)
		SELECT 	guid, rok, miesiac, kategoria, PracGUID, zamkniety, PracowalDni, UGrpGUID, godziny_pracy, godziny_pracy
		FROM t_fz;
								
	END IF;  -- IF (_MODE = 'f2f') 

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

-----------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'calc.rec') THEN
	
		SET _GUID = _Key;
		
		UPDATE frekw_zlec n SET
			n.godz100prac = (SELECT SUM(godziny) FROM frekw_zlec_po WHERE FrekwGUID = n.GUID), 
			n.godziny_pracy =  n.godz100prac,
			n.PracowalDni = (SELECT SUM(IF(godziny>0, 1, 0)) FROM frekw_zlec_po WHERE FrekwGUID = n.GUID)		
		WHERE n.GUID = _GUID;
		
		SELECT ROW_COUNT() INTO _I;  -- 0 lub 1 "row(s) affected"
		IF _I > 0 THEN
			SET @tmp = 'zapisac do logu';
		END IF;
		
		
	END IF;  -- IF (_MODE = 'calc.rec') THEN
	
	
/*---------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'calc.sum.abs') THEN
	
		-- 1. zerujemy tabelke (zawsze naliczamy calosc od nowa)
		UPDATE 	t_fz_sum_abs SET Dni = 0;
			
		-- 2. wyliczamy dlugosc w dniach poszczegolnych nieobecnosci	
		DROP TEMPORARY TABLE IF EXISTS t_absent_dni;
		CREATE TEMPORARY TABLE t_absent_dni AS
		SELECT rodzaj, (AbsencjaDo - AbsencjaOd) + 1 AS Dni
		FROM absencje_zlec
		WHERE FrekwGUID = _Key;
		
		DROP TEMPORARY TABLE IF EXISTS t_absent_grp;
		CREATE TEMPORARY TABLE t_absent_grp AS
		SELECT rodzaj, SUM(Dni) AS Dni
		FROM t_absent_dni
		GROUP BY rodzaj;
		
		-- 3.  sumujemy poszczegolne nieobecnosci
		UPDATE t_fz_sum_abs s, t_absent_grp g
		SET s.dni = g.dni
		WHERE s.idn = g.rodzaj;
		
		
	END IF;  -- IF (_MODE = 'calc.sum.abs') THEN
	

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

-----------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'init.tabs') THEN
		DROP TEMPORARY TABLE IF EXISTS  t_fz_dp_abs;
		CREATE TEMPORARY TABLE  t_fz_dp_abs(   -- tabelka w dolnym panelu kartoteki frekw. zlecb.   
		  okres VARCHAR(30) not null default 'dni',         
		  C INTEGER DEFAULT 0,     
		  B INTEGER DEFAULT 0,     
		  L INTEGER DEFAULT 0,     
		  K INTEGER DEFAULT 0,     
		  M INTEGER DEFAULT 0,     
		  R INTEGER DEFAULT 0,     
		  E INTEGER DEFAULT 0,     
		  Y INTEGER DEFAULT 0,     
		 -- J INTEGER DEFAULT 0,     
		  U INTEGER DEFAULT 0      
		  ); 
		  
		DROP TEMPORARY TABLE IF EXISTS  t_fz_sum_abs;  
		CREATE TEMPORARY TABLE t_fz_sum_abs AS -- tabelka z sumami urlopow w karcie edycji frekw. zlecb.
			SELECT idn, symbol, definicja, _varInt(0) AS dni 
			FROM absencje_dict WHERE zlec=1;  
		
		
	END IF;  -- IF (_MODE = 'init.tabs') THEN		
		
/*---------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'insert.rec') THEN
	
		SET _PracGUID = _Key;
		SET _GUID = UUID(); -- MD5(CONCAT(_Key, _Year, _Month)); -- UUID();  
		
		INSERT INTO frekw_zlec (GUID, PracGUID, rok, miesiac)  -- kategoria
		SELECT _GUID, _PracGUID, _Year, _Month;
		
		-- uzpelnienie poz.
		SET _I = 1;    -- DAY(LAST_DAY('#_Param_B#-#_Param_C#-01'))   SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y');
		SET _days_in_month = _varINT(_Param_A);
		REPEAT
			INSERT INTO frekw_zlec_po (GUID, FrekwGUID, PracGUID, dzien, rok_msc_dzien)
			SELECT  UUID(), _GUID, _PracGUID, _I, DATE(CONCAT(_Year, '-', _Month, '-', _I));
			
			SET _I = _I + 1;
	
			UNTIL _I > _days_in_month 
		END REPEAT;
		
		-- wpis do logu...
		
		-- zwracamy GUID utworzonego rekordu;
		SELECT _GUID AS GUID;  
	END IF;  -- IF (_MODE = 'insert.rec') THEN
	
					
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'absencje.mies'
	Wylicza zestawienie absencji do dolnego panelu kartoteki frekw.
		Parametry
			_Key		GUID zapisu frekw.
					
	CALL pl_frekw_zlec_tools('absencje.mies', @GUIDfrekw, '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'absencje.mies') THEN
		-- SET _Param_A = IFNULL(_Param_A, '');
		IF IFNULL(_Key, '') = '' THEN
			LEAVE SPROC;	--	nie podano GUIDa zapisu - przerywamy pracę 
		END IF;
			
		TRUNCATE t_fz_dp_abs;	
					
		INSERT INTO  t_fz_dp_abs
			SELECT 'dni' AS okres, 
			SUM(IF(absencja = 'C', 1, 0)) AS C, SUM(IF(absencja = 'B', 1, 0)) AS B, 
			SUM(IF(absencja = 'L', 1, 0)) AS L, SUM(IF(absencja = 'K', 1, 0)) AS K,
			SUM(IF(absencja = 'M', 1, 0)) AS M, SUM(IF(absencja = 'R', 1, 0)) AS R, 									
			SUM(IF(absencja = 'E', 1, 0)) AS E,	SUM(IF(absencja = 'Y', 1, 0)) AS Y,
			SUM(IF(absencja = 'U', 1, 0)) AS U
		FROM  frekw_zlec h, frekw_zlec_po  f
		WHERE f.FrekwGUID = h.guid  AND h.guid =  _Key;  -- '{741C1192-A77B-4085-85E3-E8E7F1988073}'  
			-- GROUP BY h.guid;
					
	--	SELECT * FROM t_fz_dp_abs;   -- zwracamy wynik naszych wyliczen (zapytanie to trafia jako CommandText do CDSa)
						
	END IF;	--	IF _MODE = 'pl.frekw.absencje.mies'	
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'pl.frekw.absencje.mies'
	Wylicza zestawienie absencji do dolnego panelu kartoteki frekw.
		Parametry
			_Key		GUID zapisu frekw.
					
	CALL pl_frekw_zlec_tools('fetch.abs', @GUIDfrekw, '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'fetch.abs') THEN
		-- SET _Param_A = IFNULL(_Param_A, '');
		IF IFNULL(_Key, '') = '' THEN
			LEAVE SPROC;	--	nie podano GUIDa zapisu - przerywamy pracę 
		END IF;
		
		-- 1. zerujemy nieobecnosci
		UPDATE 	frekw_zlec_po SET absencja = ''
		WHERE FrekwGUID = _Key;
		
		-- 2. wstawiamy absencje
		UPDATE 	frekw_zlec_po f, absencje_zlec a, absencje_dict d
		SET f.godziny = 0, f.absencja = d.symbol
		WHERE f.FrekwGUID = _Key AND f.FrekwGUID = a.FrekwGUID  -- ewent. zamiast zlaczenia po frekwGUID, moze byc zlaczenie po date i pracowniku
		  AND a.rodzaj = d.idn
		  AND f.rok_msc_dzien BETWEEN a.AbsencjaOd AND a.AbsencjaDo;
		
		-- 3. naliczamy tabelke z sumami absencji (t_fz_sum_abs)
		CALL pl_frekw_zlec_tools('calc.sum.abs', _Key, '', '', '', '');	
		
		
		-- 4. wstawiamy sumy do nagłowka rekordu
		CALL pl_frekw_zlec_tools('absencje.mies', _Key, '', '', '', '');	-- nalicz t_fz_dp_abs
		UPDATE 	frekw_zlec f, t_fz_dp_abs t SET
			f.C = t.C,
			f.L = t.L,
			f.K = t.K,
			f.M = t.M,
			f.R = t.R,
			f.B = t.B,
			f.E = t.E,
			f.Y = t.Y,
			f.U = t.U
		WHERE f.GUID = _Key;
		
	/*	UPDATE 	frekw_zlec f SET
			f.C = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'C'),
			f.L = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'L'),
			f.K = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'K'),
			f.M = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'M'),
			f.R = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'R'),
			f.B = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'B'),
			f.E = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'E'),
			f.Y	= (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'Y'),
			f.U = (SELECT dni FROM t_fz_sum_abs WHERE symbol = 'U')
		WHERE f.GUID = _Key;	*/
		
	--	SELECT * FROM t_fz_sum_abs;   -- zwracamy wynik naszych wyliczen (zapytanie to trafia jako CommandText do CDSa)
						
	END IF;	--	IF _MODE = 'fetch.abs'		
	
	
	
	
END$$

DELIMITER ;

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


	

*/
