/*****************************************************
$Id: fk_dekret_CP.sql,v 1.4 2017/03/23 11:35:23 max Exp $
*****************************************************/


DELIMITER $$


DROP PROCEDURE IF EXISTS `fk_dekret_CP`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `fk_dekret_CP`(
	IN _MODE VARCHAR(150),
	IN _PARAM_A VARCHAR(250),		-- rok
	IN _PARAM_B VARCHAR(250),		-- miesiac
	IN _PARAM_C VARCHAR(250),	
	IN _GUID VARCHAR(38)			-- na razie nieuzywany
)

/*
 rozdzielnik czasu pracy na poszczegolnych sklepach
 */


DEKRET_CP: BEGIN

	DECLARE _SQLText TEXT;
	
	SET @fk.DataTmp = IFNULL(CONCAT(_PARAM_A,'-', _PARAM_B, '-01'), CURRENT_DATE);	
	SET @fk.CP.idnoper = CONCAT('rozdzielnik_CP_sklepy_', _PARAM_B, '/', _PARAM_A);
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'VALIDATE'
		Sprawdzenie zgodnosci pomiedzy czasem pracy z grafikowa frekwencja (funkcja zwraca rekordy, dla ktorych jest niezgodnosc)
		
		Parametry
			_PARAM_A  rok
			_PARAM_B  miesiac
			
		CALL fk_dekret_CP('VALIDATE', '2017', '3', '', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/		
  IF _MODE = 'VALIDATE' THEN	
  
	SET @fk.okrOd  = _varINT(_PARAM_A) * 100 + _varINT(_PARAM_B); 
	SET @fk.okrDo  =  @fk.okrOd;

	SELECT 
		o.nazwisko, o.imiona, SUM(d.duration_min)/60 AS grafik_CP, ROUND(f.godziny_pracy/60, 1) AS frekw_CP
	FROM 
			osoby o, Pracownicy k, hr_team_ng g, erp_area_nodes s, hr_team_po d , frekw f  
	WHERE d.osobaguid = k.guid AND k.guid = o.guid  AND f.PracGUID = o.guid AND f.rok = _PARAM_A AND f.miesiac = _PARAM_B AND f.deleted = 0
				AND g.guid = d.guidng 
				-- AND YEAR(g.DayWork) = 2016  AND MONTH(g.DayWork) = 3
				AND YEAR(g.DayWork)*100 + MONTH(g.DayWork) BETWEEN @fk.okrOd AND @fk.okrDo
				AND  g.areaguid <> '' AND g.areaGUID = s.guid AND s.deleted = 0
	GROUP BY o.guid -- g.areaguid			
	HAVING grafik_CP <> frekw_CP
	ORDER BY nazwisko, imiona; 
  
  END IF;	
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CHECK'
		Sprawdzenie, czy sa juz zapisy pozabilansowe (rozdzielnik) na wskazany okres (utworzone poprzez CALL fk_dekret_CP('PREPARE') )
		
		Parametry
			_PARAM_A  rok
			_PARAM_B  miesiac
			
		CALL fk_dekret_CP('CHECK', '2016', '4', '', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/		
  IF _MODE = 'CHECK' THEN	

	SELECT 
		COUNT(*) AS ile 
	FROM 
		zapisy
	WHERE pozabilans = 1 
	  AND konto LIKE '*|901|%'
	  AND idnoper = @fk.CP.idnoper
      -- AND data_dowodu = LAST_DAY(@fk.DataTmp) ?
	;	
  
  END IF;
  
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'DELETE'
		Usuniecie zapisow pozabilansowych (rozdzielnika) na wskazany okres (utworzonych poprzez CALL fk_dekret_CP('PREPARE') )
		
		Parametry
			_PARAM_A  rok
			_PARAM_B  miesiac
			
		CALL fk_dekret_CP('DELETE', '2016', '4', '', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/		
  IF _MODE = 'DELETE' THEN	

	DELETE	FROM 
		zapisy
	WHERE pozabilans = 1 
	  AND konto LIKE '*|901|%'
	  AND idnoper = @fk.CP.idnoper
      -- AND data_dowodu = LAST_DAY(@fk.DataTmp) ?
	;	
  
  END IF;
  
  
  
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'PREPARE'
		 Generuje rozdzielnik na kontach pozabilansowych wg wzorca:
			`901- x - analityka_pracownika - symbol_sklepu`, gdzie `x` przyjmuje wartości od 1-3
		 wartością tego konta ma być łączna ilość godzin przepracowana przez  pracownika określonego przez analityka_pracownika na sklepie określonym 
		 przez symbol_sklepu w okresie
		 
		Parametry
			_PARAM_A  rok
			_PARAM_B  miesiac
			_PARAM_C  '' lub 'DEBUG': gdy 'DEBUG' to procedura nie wstawia rekordow do tabeli `zapisy`, lecz zwraca je jako zapytanie
			
		CALL fk_dekret_CP('PREPARE', '2016', '4', '', '');
		CALL fk_dekret_CP('PREPARE', '2016', '4', 'DEBUG', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/		
  IF _MODE = 'PREPARE' THEN
  
    UPDATE Pracownicy SET analitykafk = LPAD(idn, 4, '0') WHERE IFNULL(analitykafk,'') = '';  -- ustalone z p.Karsznia 29.04.2016
	
	DROP TEMPORARY TABLE IF EXISTS t_fk_cp;
	
	CREATE TEMPORARY TABLE t_fk_cp
	(
	  pracGUID  varchar(38),
	  analityka varchar(7),
	  Symbol    varchar(50),	  
	  duration_min double(16,4),
	  typ       integer
	);
	
	ALTER TABLE t_fk_cp ADD UNIQUE klucz (pracGUID, Symbol, typ);		-- do dodania oddzielny mode ktory porowna SUM(d.duration_min) z danego dnia (z wszyskich sklepow) z frekw_po.godz_zz
	
	SET @fk.SQLText = 
		'INSERT INTO t_fk_cp
		SELECT 
			o.guid, IFNULL(k.analitykaFK, ''0000'') AS analityka, s.symbol, SUM(d.duration_min)/60 AS CP, @fk.typ  -- o.nazwisko, o.imiona, s.nazwa,
		 FROM 
			osoby o, Pracownicy k, hr_team_ng g, erp_area_nodes s, hr_team_po d  
		WHERE d.osobaguid = k.guid AND k.guid = o.guid
				AND g.guid = d.guidng 
				-- AND YEAR(g.DayWork) = 2016  AND MONTH(g.DayWork) = 3
				AND YEAR(g.DayWork)*100 + MONTH(g.DayWork) BETWEEN @fk.okrOd AND @fk.okrDo
				AND  g.areaguid <> '''' AND g.areaGUID = s.guid AND s.deleted = 0
		GROUP BY o.guid, g.areaguid			
		ORDER BY nazwisko, imiona; ';
	
	-- konta `901- x - analityka_pracownika - symbol_sklepu`, gdzie `x` przyjmuje wartości od 1-3
  
	-- 901-1 - w miesiącu za który jest wynagrodzenie (np. 4.2016):
	SET @fk.typ    = 1;
	SET @fk.okrOd  = _varINT(_PARAM_A) * 100 + _varINT(_PARAM_B); 
	SET @fk.okrDo  =  @fk.okrOd;    
	CALL _ExecuteCmd(@fk.SQLText, @Error);	
			
	 -- SET @fk.DataTmp = IFNULL(CONCAT(_PARAM_A,'-', _PARAM_B, '-01'), CURRENT_DATE);	
	 SET @fk.DataOd = DATE_SUB(@fk.DataTmp, INTERVAL 12 MONTH);
	 SET @fk.DataDo = DATE_SUB(@fk.DataTmp, INTERVAL 1 MONTH);
	 SET @fk.okrOd  = YEAR(@fk.DataOd) * 100 + MONTH(@fk.DataOd);
	 SET @fk.okrDo  = YEAR(@fk.DataDo) * 100 + MONTH(@fk.DataDo);
	
	 -- 901-2 - w okresie, z którego był liczony urlop  	 (12 poprz. m-cy) (np. 4.2015 - 3.2016)	
	 SET @fk.typ    = 2;
	 CALL _ExecuteCmd(@fk.SQLText, @Error);
	
	-- 901-3 - w okresie, z którego był liczony zasiłek  (12 poprz. m-cy) (np. 4.2015 - 3.2016)	
	 SET @fk.typ    = 3;
	 CALL _ExecuteCmd(@fk.SQLText, @Error);
	 
	 -- okreslamy rok obrachunkowy, do ktorego nalezy wskazany miesiac roku kalend.
	SET @fk.data_obr = CONCAT(_PARAM_A,'-', _PARAM_B, '-', '01');		
	SELECT idn FROM `lata_obrachunkowe` WHERE @fk.data_obr BETWEEN databo AND databz INTO @fk.rok_obr;
	 
	 	 	 
	 IF IFNULL(_PARAM_C, '') <> 'DEBUG' THEN
		SET @fk.action = 'tworzymy rozdzielnik na kontach pozabilansowych: SELECT COUNT(*) FROM t_fk_cp WHERE duration_min > 0.0; ';
						
		-- przed wywolaniem CALL fk_dekret_CP('PREPARE') bedzie najpierw wykonywane CALL fk_dekret_CP('CHECK') i ewentualnie CALL fk_dekret_CP('DELETE')
		INSERT INTO zapisy 
			(GUID, idnoper, numer_dok, rok, pozabilans, stronaWn, placowy, kwota, konto, data_dowodu, data_oper, opis) 
		SELECT 
		    MD5(CONCAT(@fk.CP.idnoper, t.typ, '|', t.analityka, '|', symbol)) AS GUID, 
			@fk.CP.idnoper AS idnoper, @fk.CP.idnoper AS numer_dok, 
			@fk.rok_obr AS rok, 1 AS pozabilans, 1 AS stronaWn, 1 AS placowy, t.duration_min AS kwota, 
			CONCAT ('*|901|', t.typ, '|', t.analityka, '|', symbol) AS konto, 
			LAST_DAY(@fk.DataTmp) AS data_dowodu, LAST_DAY(@fk.DataTmp) AS data_oper,
			'CALL fk_dekret_CP(''PREPARE'') ' AS opis
		FROM 
			t_fk_cp t 
		WHERE 
			duration_min > 0.0 
		;
		-- tworzymy konta w planie kont  
		CALL fk_konta_tools('CREATE_ALL_FROM_ZAPISY', '', @fk.rok_obr, '', '', '', '');	-- -- zwraca konta niezalozone (empty dataset gdy OK)
	ELSE	
		SELECT 
		    MD5(CONCAT(@fk.CP.idnoper, t.typ, '|', t.analityka, '|', symbol)) AS GUID, 
			@fk.CP.idnoper AS idnoper, @fk.CP.idnoper AS numer_dok, @fk.rok_obr AS rok, 
			1 AS pozabilans, 1 AS stronaWn, 1 AS placowy, t.duration_min AS kwota, 
			CONCAT ('*|901|', t.typ, '|', t.analityka, '|', symbol) AS konto, 
			LAST_DAY(@fk.DataTmp) AS data_dowodu, LAST_DAY(@fk.DataTmp) AS data_oper,
			'CALL fk_dekret_CP(''PREPARE'') ' AS opis
		FROM 
			t_fk_cp t 
		WHERE 
			duration_min > 0.0 
		;
	 END IF;
	 
	 
      
  END IF; -- IF _MODE = 'PREPARE'
  
  IF _MODE = 'DEKRETUJ_OPER'  THEN
    SET _GUID = _GUID; -- do nothing 
-- TODO   - na razie to szkielet
  END IF;

  
	
END $$

DELIMITER ;

