 /*!40101 SET NAMES cp1250 */;
DELIMITER $$

/* ************************************************************************************************************************************************************************
	BI
************************************************************************************************************************************************************************ */	
DROP TRIGGER IF EXISTS `frekw_po_bi`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `frekw_po_bi` BEFORE INSERT ON `frekw_po` FOR EACH ROW 
A: BEGIN
	IF _TriggerDisabled() THEN LEAVE A; END IF;
	
	
	SET 
		NEW.GUID_kp_F = NEW.GUID,
		NEW.kp_info_F = NEW.kp_info,
		NEW.kp_godziny_F = NEW.kp_godziny,
		NEW.dzien_wolny_F = NEW.dzien_wolny
	;
	CALL _frekw_po_Before_Post('', NEW.GUID, NEW.godziny, NEW.noc, NEW.kp_info_F, NEW.kp_godziny_F, NEW.data_wej, NEW.data_wyj, NEW.godziny150, NEW.godziny200, NEW.absencja, NEW.PracGUID, '', '');
	SET 
		NEW.dni_absencji = ROUND(IF(NEW.kp_godziny != 0, NEW.godz_absencji/NEW.kp_godziny, NEW.dni_absencji), 4)
	;
	
END;
$$

/* ************************************************************************************************************************************************************************
	AI
************************************************************************************************************************************************************************ */	

/* ************************************************************************************************************************************************************************
	BU
************************************************************************************************************************************************************************ */	
DROP TRIGGER IF EXISTS `frekw_po_bu`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `frekw_po_bu` BEFORE UPDATE ON `frekw_po` FOR EACH ROW 
A: BEGIN
	IF _TriggerDisabled() THEN LEAVE A; END IF;
		
/*
	godziny
	noc
	kp_info
	kp_godziny
*/
	IF IFNULL(NEW.GUID_kp_F, '') = '' THEN
		SET NEW.GUID_kp_F = OLD.GUID;
	END IF;
	SET @_modify_frekw_po.duration_min_changed = FALSE;
	IF ((OLD.godz_wej IS NULL) AND (NEW.godz_wej IS NOT NULL)) OR (NEW.godz_wej != OLD.godz_wej) THEN
		SET 
			NEW.data_wej = _varDateToDateTime(NEW.rok_msc_dzien, NEW.godz_wej), 
			@_modify_frekw_po.duration_min_changed = TRUE
		;			
	END IF;
	IF ((OLD.godz_wyj IS NULL) AND (NEW.godz_wyj IS NOT NULL)) OR (NEW.godz_wyj != OLD.godz_wyj) THEN
		SET 
			NEW.data_wyj = _varDateToDateTime(IF(NEW.godz_wej > NEW.godz_wyj, DATE_ADD(NEW.rok_msc_dzien, INTERVAL 1 DAY), NEW.rok_msc_dzien), NEW.godz_wyj), 
			@_modify_frekw_po.duration_min_changed = TRUE
		;			
	END IF;
	
	IF @_modify_frekw_po.duration_min_changed THEN
	--	trzeba ustawic duration bo sie zmienil
		SET NEW.duration_min = TIMESTAMPDIFF(MINUTE, NEW.data_wej, NEW.data_wyj);
	END IF; 
	
	SET @F_change = NULL;
	IF @_modify_frekw_po.duration_min_changed OR (NEW.godziny != OLD.godziny) OR (NEW.noc != OLD.noc) OR (NEW.kp_info_F != OLD.kp_info_F) OR (NEW.kp_godziny_F != OLD.kp_godziny_F)  OR (NEW.GUID_kp_F != OLD.GUID_kp_F) THEN
		SET @F_change = 1;
		IF @session.globals.Owner <> 'ZREMB' THEN  -- #45043
		  CALL _frekw_po_Before_Post('', NEW.GUID, NEW.godziny, NEW.noc, NEW.kp_info_F, NEW.kp_godziny_F, NEW.data_wej, NEW.data_wyj, NEW.godziny150, NEW.godziny200, NEW.absencja, NEW.PracGUID, '', '');
		END IF;  
	END IF;
	
	IF (NEW.godz_absencji != OLD.godz_absencji) OR (NEW.kp_godziny != OLD.kp_godziny) THEN
		SET 
			NEW.dni_absencji = ROUND(IF(NEW.kp_godziny != 0, NEW.godz_absencji/NEW.kp_godziny, 0), 4)
		;
	END IF;
END;
$$

/* ************************************************************************************************************************************************************************
	AU
************************************************************************************************************************************************************************ */	




/* ************************************************************************************************************************************************************************
	Narz�dzia 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `_frekw_po_Before_Post`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_frekw_po_Before_Post`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(255),	
	INOUT _godziny DOUBLE,
	INOUT _godziny_noc DOUBLE,
	INOUT _kp_info VARCHAR(255),
	INOUT _kp_godziny DOUBLE,
	INOUT _data_wej DATETIME,
	INOUT _data_wyj DATETIME,
	OUT godziny150 DOUBLE,
	OUT godziny200 DOUBLE,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255)
)
S_frekw_po_Before_Post: BEGIN 

	/*
	_MODE
	SET
	@_godziny = 0,
	@_godziny_noc = 0,
	@_kp_info = '',
	@_kp_godziny = 0,
	@_data_wej = '0000-00-00 00:00:00',
	@_data_wyj = '0000-00-00 00:00:00',
	@godziny150 = 0,
	@godziny200 = 0
	;
	CALL _frekw_po_Before_Post('', '', @_godziny, @_godziny_noc, @_kp_info, @_kp_godziny, @_data_wej, @_data_wyj, @godziny150, @godziny200,  '', '', '', '');
	------------------------------------------------------------------------------------------------------------------------------------------------------------
	
	------------------------------------------------------------------------------------------------------------------------------------------------------------
	*/
	
	DECLARE _N DOUBLE DEFAULT 0;	--	Nadgodziny (roznica miedzy kalendarzem a rzeczywistoscia (_kp_godziny i _godziny)
	DECLARE _SQLText TEXT DEFAULT '';
	DECLARE _N_godziny_noc DOUBLE DEFAULT 0;	--	Nadgodziny nocne
	DECLARE _Owner  VARCHAR(100);
	DECLARE _defRownCP,  _defNadgNocne VARCHAR(100);
	DECLARE _LiczNadgodzPoPrzekroczeniuNCP BOOLEAN;
	DECLARE _GodzKalend DOUBLE DEFAULT 0;	
	DECLARE _rownCP INTEGER;
	
	--	IF GUID_Fki != '' THEN SET _kp_godziny = 8
	
	IF _MODE = '' THEN
	
		SELECT _GetAppOwner() INTO _Owner;			
		IF _Owner IN ('POLAM') THEN 
			LEAVE S_frekw_po_Before_Post;  --  PrzeliczGodzinyPolamRem  dzialaja na sumach godzin -> 'pl.nalicz.sumy.naglowka'
		END IF;
		/*
				// dla rownowaznego czasu pracy naliczanie odbywa sie w 'pl.nalicz.narast.frekw'
				{$IFDEF ROWNOWAZNY_CP}  -- wlaczone dla: Security, Holender
				if (TShellEFrekw(BrowseDataSetShell).InfoPracDS.FieldByName('rodzaj_pracownika').AsInteger = cRownCP) then
					exit;
				{$ENDIF ROWNOWAZNY_CP}	zrealizowane ponizej			
		*/		
		
		CALL _Globals_Get('pl.rownowazny.CP', _defRownCP, 0);
		IF _defRownCP = '1' THEN
		/* if (TShellEFrekw(BrowseDataSetShell).InfoPracDS.FieldByName('rodzaj_pracownika').AsInteger = cRownCP) then
					exit; */  -- czyli do zrobienia select .... if... leave
			SELECT 
				(rodzaj_pracownika = 1)	
			FROM Pracownicy 
			WHERE GUID = _Param_B 
			INTO _rownCP 	;
			IF _rownCP = 1 THEN
				LEAVE S_frekw_po_Before_Post;	--	// dla rownowaznego czasu pracy naliczanie odbywa sie w 'pl.nalicz.narast.frekw'
			END IF;
			-- SET @tmp.RCP = 	_defRownCP;		
		END IF;
				
		-- C_Dysc.pas 1.283:  aLiczNadgodzPoPrzekroczeniuNCPzKalendarza := RegistryInt.GetRegIntValueBoolean('LiczNadgodzPoPrzekrNCPzKalend', true, 'Place');
		-- _IReg_Get jest do zastapienia, bo powoduje komunikat "Dynamic SQL not allowed ....in trigger"  -> zastapione przez @session.globals.pl.Frekw.LiczNadgodzPoPrzekroczeniuNCP
		-- CALL _IReg_Get('Place', 'LiczNadgodzPoPrzekrNCPzKalend', '0', 'BOOLEAN', _LiczNadgodzPoPrzekroczeniuNCP, 'TRUE');		-- na tym sie wywala, zastapione przez @session.globals.
		SET _GodzKalend = IF( (@session.globals.pl.Frekw.LiczNadgodzPoPrzekroczeniuNCP = 1), _kp_godziny, 8*60);
				
		SET 			
			@_frekw_po_Before_Post.N_Noc = 0,
			@_frekw_po_Before_Post.kp_EndWork = DATE_ADD(_Data_Wej, INTERVAL _kp_godziny MINUTE),
			
			_N = GREATEST(_godziny - _GodzKalend, 0),   -- 29.05.2013: jesli mamy "niedor�bk�", to zerujemy, bo bez zerowania dostawalismy ujemne nadgodz.
			--  _N =IF(GUID_Fki != '', 0, _godziny - _kp_godziny),
			godziny150 = 0,
			godziny200 = 0;
			
		IF _kp_info IN ('N', 'D') THEN
			SET	godziny200 = _N;	
		END IF;

		SET	godziny150 = _N - godziny200;			
					
		CALL _Globals_Get('pl.frekw.nadgodz.nocne', _defNadgNocne, 0);
		IF _defNadgNocne = '1' THEN  -- {$IFDEF NADGODZINY_NOCNE}  
			SET _N = GREATEST(_godziny - _kp_godziny, 0);
			IF _N > 0 AND _godziny_noc > 0 THEN
			 SET godziny200 = LEAST(_godziny_noc, _N),  	-- 200delta := Min(nadgodziny, noc)
			     godziny150 = _N - LEAST(_godziny_noc, _N)  -- a150delta := nadgodziny - a200delta;
			;
			END IF;
			-- LEAVE S_frekw_po_Before_Post;	
		END IF;	-- IF _defNadgNocne = '1' THEN  ---- {$IFDEF NADGODZINY_NOCNE}
		
		SET @_frekw_po_Before_Post.absencja = IFNULL(_Param_A, '');
		
		IF (_N <= 0) OR (@_frekw_po_Before_Post.absencja = 'F') THEN
			LEAVE S_frekw_po_Before_Post;	--	wychodze bo nie mam nadgodzin (_N <= 0), lub gdy danego dnia pracownik otrzymal wolne za soboty/niedziele/�wi�ta (wiec rowniez nie ma nadgodzin)					
		END IF;
								
		IF (_data_wej = '0000-00-00 00:00:00') OR (_data_wyj = '0000-00-00 00:00:00') THEN
			-- LEAVE S_frekw_po_Before_Post;	--	"wychodze bo dane RCP nie sa uzywane"  <- tak bylo do tej pory, a teraz implementujemy tu standardowa procedure TShellEFrekwPo.PrzeliczGodziny, ktora jest w sumie juz powyzej zrealizowana
			SET @tmp = 'tmp';									
			-- TShellEFrekwPo.PrzeliczGodziny() zawiera obsluge nieobecnosci typu "F", ale to nie moze byc w triggerze, jest to obslugiwane w pl_frekw_tools('pl.tool.update.absencje.F'
																			
		ELSE  -- wyliczenie nadgodzin (w tym nocnych) na podst. czasu wej. i wyj.
			SET	@_frekw_po_Before_Post._DayNext = DATE_ADD(DATE(_data_wej), INTERVAL 1 DAY)	;	
			SET
				@_frekw_po_Before_Post._D0000 = _varDateToDateTime(DATE(_data_wej), '00:00:00'),
				@_frekw_po_Before_Post._D2200 = _varDateToDateTime(DATE(_data_wej), '22:00:00'),
				-- @_frekw_po_Before_Post._D2359 = _varDateToDateTime(DATE(_data_wej), '23:59:59'),
				@_frekw_po_Before_Post._D0600 = _varDateToDateTime(DATE(_data_wyj), '06:00:00'),
				@_frekw_po_Before_Post._ND0600 = _varDateToDateTime(DATE(@_frekw_po_Before_Post._DayNext), '06:00:00')	;	
		
			/*
				Do @_frekw_po_Before_Post.N_Noc wstaw czesc wspolna przedzialow czasowych:
				1. od pocz pracy ponad standard(czyli nadg.) - do wyjscia 
				2. od 22:00 - do 6:00
			*/
			IF @_frekw_po_Before_Post.kp_EndWork < @_frekw_po_Before_Post._D0600 THEN 
			--	Nietypowo!!! Sko�czy� przed 6:00 tego samego dnia  (1. od pocz pracy ponad standard(czyli nadg.) - do wyjscia )
				SET
					@_frekw_po_Before_Post.N_Noc = _TimeRange('Czas.czesc.wspolna.min', @_frekw_po_Before_Post.kp_EndWork, _data_wyj, @_frekw_po_Before_Post._D0000, @_frekw_po_Before_Post._D0600, '', '');
			ELSE
			--	Ca�a reszta przypadk�w  							(2. od 22:00 - do 6:00)
				SET
					@_frekw_po_Before_Post.N_Noc = _TimeRange('Czas.czesc.wspolna.min', @_frekw_po_Before_Post.kp_EndWork, _data_wyj, @_frekw_po_Before_Post._D2200, @_frekw_po_Before_Post._ND0600, '', '');
			END IF;
					
			IF @_frekw_po_Before_Post.N_Noc > _N THEN
				SET _N_godziny_noc = _N;
			ELSE	
				SET _N_godziny_noc = @_frekw_po_Before_Post.N_Noc;
			END IF;
					
			IF _kp_info IN ('N', 'D') THEN
				SET	godziny200 = _N;
			ELSE	
				SET	godziny200 = _N_godziny_noc;	
			END IF;
			
			SET	godziny150 = _N - godziny200;		--	do godz150 daj ca�� reszt� nadgodzin kt�re nie wesz�y do 200
		
		END IF;	
											
	END IF;  -- IF _MODE = '' THEN
	
END$$

DELIMITER ;


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


*/

