DELIMITER $$

DROP PROCEDURE IF EXISTS `hr_stat_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `hr_stat_tools`(
	IN _MODE      VARCHAR(150),	
	IN _Year      VARCHAR(50),
	IN _Month     VARCHAR(50),	
	IN _StatType  VARCHAR(50),
	IN _Recalc    VARCHAR(10),   -- czy przeliczy� ?
	IN _HR_GUID   VARCHAR(38),    -- GUID pracownika	
	IN _ZPCHR     VARCHAR(50),
	IN _StatExtra VARCHAR(50)
)

SPROC: BEGIN
	/*
	_MODE

	*/
		
	DECLARE _SQLText, _ColsSQL TEXT;
	DECLARE _GUID, _fixGUID, _fGUID, _pGUID	   VARCHAR(38);	
	DECLARE _Msc VARCHAR(10);	
	DECLARE _Luty DATE;
	DECLARE _done BOOL DEFAULT FALSE;	
	DECLARE _IsCrist BOOL DEFAULT FALSE;	
	DECLARE _I, _Last INTEGER;
	DECLARE cStatMies INTEGER DEFAULT 0;
    DECLARE cStatRoczna INTEGER DEFAULT 1;
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'check.and.fill.data'
		Sprawdza, czy s� ju� dane - je�li nie ma (lub je�li u�ytkownik chce dokona� aktualizacji) to naliczamy statystyke
		Parametry
			_Year		rok, za kt�ry naliczamy statystyk�
			_Month   	j. w. miesiac
			_StatType  VARCHAR(50),  -- stat. miesieczna lub roczna
	        _Recalc    VARCHAR(10),  -- TRUE/FALSE
			_HR_GUID   VARCHAR(38),    -- GUID pracownika	(niepusty, gdy chcemy przeliczy� stat. dla wybranego pracownika)
			_ZPCHR      czy jest to zak�ad pracy chronionej (odpowiednik {$IFDEF ZPCHR})
			_StatExtra  odpowiednik {$IFDEF STAT_EXTRA} (w�. powoduje, �e w statystyce s� uwzgl�dniani tylko pracownicy o w�. kluczu "UwzglStat")
			
		CALL hr_stat_tools('check.and.fill.data', '2014', '3', '0', 'TRUE', '', 'FALSE', 'FALSE');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'check.and.fill.data' THEN
	   
	/*
      tabela 	 `stat_prac` bedzie utworzona poprzez SQLzmiane
	  
	  SET _SQLText =	'CREATE TABLE IF NOT EXISTS stat_prac ( 		
				 rok integer not null default 0,
                 data_pracy date, 
                 guid_prac varchar(38), 
                 jest integer, 
                 zfron integer, 
                 etat_l integer, 
                 etat_m integer, 
                 TypNiepelnospr integer,                  
                 PZON_TypNiepelnospr integer default 0,                  
                 KategoriaPracownicza integer not null default 0, 
                 stanowisko varchar(38) not null default '', 
                 uGrpGUID varchar(38) not null default '', 
                 typ_absencji integer not null default 0, 
                 bezplZ06 integer not null default 0, 
                 unique key dg(guid_prac, data_pracy), 
                 index data_pracy(data_pracy) 
              ); ';
			  
		
		
		SET @_SQLText = _SQLText;		
		CALL _ExecuteCmd(_SQLText, @Error);	    */
		
		-- IF _Month <> '' THEN  -- gdy statystyka miesieczna:
			set _I = 0;
			
			-- Self.CheckStatTable
			select count(*) as ile 
			from stat_prac 
			where rok = _Year and IF(_Month <> '', month(data_pracy) = _Month, TRUE)   -- _Month <> '' czyli cStatMies
			into _I;
			IF _I = 0 THEN
				SET _StatType = cStatRoczna;
			END IF;
			IF ((_I = 0) OR (_Recalc = 'TRUE') ) THEN
			    -- Self.FillStatTable;
				CALL hr_stat_tools('fill.data', _Year, _Month, _StatType, _Recalc, '', _ZPCHR, _StatExtra);  
			END IF;
		
		-- END IF;
		
	END IF;	--	IF _MODE = 'check.and.fill.data'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'fill.data'
		Wygenerowanie danych statystyki za wskazany okres  (odpowiednik DBPlacesStat.FillStatTable)
		Parametry			
			_Year		rok, za kt�ry naliczamy statystyk�
			_Month   	j. w. miesiac
			_StatType  VARCHAR(50),  -- stat. miesieczna lub roczna
	        _Recalc    VARCHAR(10),  -- w tym mode nie ma znaczenia
			_HR_GUID   VARCHAR(38),    -- GUID pracownika	(niepusty, gdy chcemy przeliczy� stat. dla wybranego pracownika)
			_ZPCHR      czy jest to zak�ad pracy chronionej (odpowiednik {$IFDEF ZPCHR})
			_StatExtra  odpowiednik {$IFDEF STAT_EXTRA} (w�. powoduje, �e w statystyce s� uwzgl�dniani tylko pracownicy o w�. kluczu "UwzglStat")
					
		CALL hr_stat_tools('fill.data', '2014', '3', '0', 'TRUE', '', 'FALSE', 'FALSE');		
		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'fill.data' THEN
	
		-- 1. usuniecie ewentualnych starych danych (replace into nie wystarczy, bo moglyby zostac  wpisy o osobach, ktore w miedzyczasie zostaly zwolnione)
		DELETE FROM stat_prac 
		WHERE YEAR(data_pracy) = _Year AND (rok = _Year) AND 
		IF(_StatType = cStatMies, MONTH(data_pracy) = _Month, TRUE)	AND
		IF(_HR_GUID = '', TRUE, guid_prac = _HR_GUID);

		-- 2. wstepne wygenerowanie danych na podstawie frekwencji
		INSERT IGNORE INTO stat_prac
		(rok, ugrpGUID, data_pracy, guid_prac, jest, zfron)
		select n.rok, n.ugrpGUID, p.rok_msc_dzien, n.pracguid, 1, 1
		from frekw n
		join frekw_po p on p.frekwguid=n.guid and p.absencja <> '-' 
		join Pracownicy pr on pr.guid=n.PracGUID 
		where n.rok = _Year  and n.deleted = 0 AND IF(_StatType = cStatMies, n.miesiac = _Month, TRUE)	AND
		    IF(_StatExtra = 'TRUE', pr.UwzglStat=1, TRUE)   --  IF(_StatExtra = 'TRUE'...)   ? 
		    AND IF(_HR_GUID = '', TRUE, n.pracGUID = _HR_GUID);
		
		-- 3. update na podstawie historii pracy  (to zrobic jako oddzielny mode, i wolac takze w triggerze historii_pracy)
		UPDATE stat_prac s,  historia_pracy h1 
        LEFT JOIN historia_pracy h2 on h1.guidpr = h2.guidpr 
        and h2.oddnia = 
		  (select min(sp1.oddnia) from historia_pracy sp1 where sp1.guidpr=h1.guidpr and sp1.oddnia > h1.oddnia 
		   and sp1.topracownik=1 and year(sp1.oddnia) = _Year and  IF(_StatType = cStatMies, month(sp1.oddnia) = _Month, TRUE) -- (month(sp1.oddnia) between %d and %d) 
		   and (sp1.CzyObecniePracuje=1 or locate('Zwolnienie', sp1.zmiany) >0) ) 
		SET s.Etat_L = h1.Etat_L, s.Etat_M=h1.Etat_M, s.TypNiepelnospr = h1.TypNiepelnospr,     
		s.PZON_TypNiepelnospr = h1.PZON_TypNiepelnospr,   -- <- to bylo na  {$IFDEF ZPCHR}, czyli tu na _ZPCHR    
		s.KategoriaPracownicza = h1.KategoriaPracownicza, s.stanowisko = h1.stanowisko 
		WHERE s.rok = _Year AND s.guid_prac=h1.guidpr and s.data_pracy >= h1.OdDnia and s.data_pracy < ifnull(h2.oddnia, '2099-01-01') 
		and h1.ToPracownik = 1 and h1.CzyObecniePracuje=1 
		and h1.OdDnia = (select max(sp2.oddnia) from historia_pracy sp2 where sp2.guidpr=s.guid_prac and sp2.ToPracownik = 1 and sp2.CzyObecniePracuje=1 and sp2.oddnia <=s.data_pracy) 
		and year(s.data_pracy) = _Year AND IF(_StatType = cStatMies, month(s.data_pracy) = _Month, TRUE) AND  IF(_HR_GUID = '', TRUE, h1.guidpr = _HR_GUID)  ;  -- month(s.data_pracy) between %d and %d
		
		-- 4. update na podstawie historii pracy - z dnia zwolnienia
		 UPDATE stat_prac s,  historia_pracy h 
		SET s.Etat_L=h.Etat_L, s.Etat_M=h.Etat_M, s.TypNiepelnospr = h.TypNiepelnospr, 
		
		s.PZON_TypNiepelnospr = h.PZON_TypNiepelnospr,     -- <- to bylo na  {$IFDEF ZPCHR}, czyli tu na _ZPCHR 
		
		s.KategoriaPracownicza = h.KategoriaPracownicza, s.stanowisko = h.stanowisko 
		WHERE s.guid_prac=h.guidpr and s.data_pracy = h.OdDnia  
		and h.ToPracownik = 1 and (locate('Zwolnienie', h.zmiany) > 0) 
		and year(h.oddnia) = _Year and IF(_StatType = cStatMies, month(h.oddnia) = _Month, TRUE) -- month(h.oddnia) between %d and %d 
		AND  IF(_HR_GUID = '', TRUE, h.guidpr = _HR_GUID);
		
		-- 5. update na podstawie absencji   (wewn.: {$IFDEF CRIST} => )  SELECT `value`  AS firma FROM _db_globals WHERE `key` = 'owner';  if firma = 'CRIST'
		
		-- _IsCrist: 
		SELECT IF(`value` IN ('crist', 'irko', 'offshore', 'SHIPYARD'), 1, 0) AS iscrist FROM _db_globals WHERE `key`='Owner'
		INTO
		  _IsCrist;
		
		SET _Luty = _varDateTime(concat(_Year, '-', _Month, '-', '01'));		
		  
		UPDATE stat_prac s, frekw f , absencje a
			SET -- dla CRIST: jesli ktos by� na bezpl. przez caly luty (to nie bedzie to 30 dni, ale jest to caly miesiac, wiec wykazujemy absencje (wstawiamy jej typ))
			s.typ_absencji = if((a.rodzaj=11) and (((to_days(a.pelnaabsencjado) - to_days(a.pelnaabsencjaod))+1)>=30 OR ( IF(_IsCrist, a.pelnaabsencjaod <= _Luty and a.pelnaabsencjado >= last_day(_Luty), FALSE ) ) ), 11, (if(a.rodzaj<> 11, a.rodzaj,  0))),
			s.bezplZ06     = if((a.rodzaj=11) and (f.B_godz>0), 1, 0),
			-- 10 = rehab, 11 = bezpl., 20 = wychow, 21 = wojsko
			-- // ZFRON = 0 wtedy, gdy: pracownik niepe�nosprawny na urlopie bezp�atnym lub pe�nosprawny na urlopie: (wychow., rehab., wojsko) :
		    s.zfron = if(  
			( ( (s.TypNiepelnospr > 0) OR IF(_ZPCHR = 'TRUE', s.PZON_TypNiepelnospr > 0, TRUE)  ) and (a.rodzaj=11 and f.B_godz>0) 
			) OR 
			( ( (s.TypNiepelnospr = 0) and IF(_ZPCHR = 'TRUE', s.PZON_TypNiepelnospr = 0, TRUE) ) and a.rodzaj IN (10, 20, 21) )
			,      0, 1) 
		WHERE s.guid_prac = f.PracGUID  and f.rok = _Year  and f.deleted = 0   and  IF(_StatType = cStatMies, f.miesiac = _Month, TRUE)   --  and (f.miesiac between %d and %d) 
           and a.frekwguid = f.guid and a.absencjaod <= s.data_pracy and a.absencjado >= s.data_pracy ;  
		   
	/*	SET _SQLText = REPLACE(_SQLText, '#luty#', concat(_Year, '-', _Month, '-', '01');		   
		SET _SQLText = REPLACE(_SQLText, '#luty#', _Year, '-', _Month, '-', '01');		      
		   
		SET @_SQLText = _SQLText;		
		CALL _ExecuteCmd(_SQLText, @Error);		*/
	
	    -- calosc procesu zakonczona !
	
	END IF;	--	IF _MODE = 'stat.fill.data'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'check.age.for.dues.payment'
		Zestawienie pracownik�w, dla kt�rych nie wy��czono naliczania sk�adek FP / FG�P, 
		cho� przekroczyli		ju� pr�g wiekowy		
					
		CALL hr_stat_tools('check.age.for.dues.payment', '', '', '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'check.age.for.dues.payment' THEN
	
		SELECT 
			o.nazwisko, o.imiona, (DATEDIFF(LAST_DAY(CURDATE()), o.dataurodzenia) DIV 365) AS wiek, o.dataurodzenia AS ` data urodz.`
		FROM 
			Pracownicy k, osoby o  
		WHERE 
			o.guid = k.guid  and (k.CzyObecniePracuje = 1)
			AND (k.ToPracownik=1 OR k.ToZleceniobiorca = 1)
			AND (k.naliczFGSP = 1 OR k.naliczFP = 1 OR k.naliczFGSP_zlec = 1 OR k.naliczFP_zlec = 1) 
			AND (DATEDIFF(LAST_DAY(CURDATE()), o.dataurodzenia) DIV 365) >= IF(o.plec = 0, 55, 60)
		ORDER BY 
			o.nazwisko, o.imiona;
		
	END IF;	--	IF _MODE = 'check.age.for.dues.payment'
	

		
	
	
END$$



DELIMITER ;

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

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

