/*****************************************************
$Id: fk_dekret_CP.sql,v 1.8 2018/01/17 14:09:46 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;
  
  
  IF _MODE = 'ZEST_RCP'  THEN  -- uproszczona wersja CALL fr_pl_hr_team(''ZEST6'')
		
	    -- przygotowanie tabeli `t_frekw_osoba_mc`
		IF _GUID = 'TEMPTABLE' THEN  -- `dla zaznaczonych`. `dla wszystkichkich`
		-- 'ALL' = pokazuj zest. dla wszystkich rekordów (tj. nie analizuj wartości "frekw.Zamkniety")
			CALL pl_frekw_tools('pl.select.osoba_mc.frekw', '', _Param_B, '1', 'ALL', '');  
		ELSE	-- `dla wskazanego`
			CALL pl_frekw_tools('pl.select.osoba_mc.frekw', _GUID, _Param_B, '', 'ALL', '');
		END IF;
		
		DELETE FROM t_frekw_osoba_mc WHERE ( (dzien_wolny = 1)  OR (godziny = 0) );
		-- godz_wyj = godz_wej + 8godz + (-20..20) min
		UPDATE t_frekw_osoba_mc SET godz_wyj = TIME(DATE_ADD(DATE_ADD(data_wej, INTERVAL 8 HOUR), INTERVAL FLOOR(-20 + RAND() * (41)) MINUTE));
		
		DROP TABLE if exists t_zest6_zakres;
		CREATE TEMPORARY TABLE t_zest6_zakres select concat('od ',MIN(StartDate), ' do ', MAX(StartDate)) as zakres from t_frekw_osoba_mc;  
		
		DROP TABLE if exists t_zest6_zakressum;
		CREATE TEMPORARY TABLE t_zest6_zakressum
			SELECT 
			pracguid, 
			COUNT(distinct startdate) as ile_dni_kal,
			SUM(IF(@session.globals.Owner = 'KONKOL' ,t.godziny_zz, t.kp_godziny)) as sum_bilans,
			SUM(IF(@session.globals.Owner = 'KONKOL' ,t.godziny_xx, t.kp_godziny)) as sum_czas_pracy,
			SUM(t.godziny_yy) as sum_czas_noc,
			SUM(t.noc) as sum_czas_noc_normal 
			FROM t_frekw_osoba_mc t
			GROUP BY pracguid
		;  
		
		SET @bilans=0;
		DROP TABLE if exists t_zest6_zakresFinal;
		CREATE TEMPORARY TABLE t_zest6_zakresFinal
			SELECT  
			t.StartDate as Data,
			t.kp_info,
			IF(t.IsKorekta_Wy=1,'K',IFNULL(t.kp_info,"")) as ob_udok,
			IF(t.IsKorekta_Wy=1,'K',"") as korekta,
			t.godz_wej as Wejscie,
			t.godz_wyj as Wyjscie,
			(t.kp_godziny) as t_czas_pracy,
			(t.godziny_xx) as t_czas_obec,
			(t.godziny_yy) as t_czas_noc,
			@bilans := @bilans+(t.kp_godziny)  as t_bilans,
			_pl_Min2Godz(t.godziny) as czas_pracy_normal,
			_pl_Min2Godz(IF(@session.globals.Owner = 'KONKOL' ,t.godziny_zz, t.kp_godziny)) as czas_pracy,
			_pl_Min2Godz(t.godziny_xx) as czas_obec,
			_pl_Min2Godz(t.godziny_yy) as czas_noc,
			_pl_Min2Godz(t.noc) as czas_noc_normalny,
			_pl_Min2Godz(@bilans := @bilans+(IF(@session.globals.Owner = 'KONKOL' ,t.godziny_zz, t.kp_godziny)))  as bilans,
			t.godziny,
			"" as status,
			t.pracGUID,
			o.Nazwisko, o.Imiona,
			t.NrKarty as numerKarty,
			(select zakres from t_zest6_zakres) as ZakresDat,
			 zs.ile_dni_kal,
			_pl_Min2Godz(zs.sum_bilans) as sum_bilans,
			_pl_Min2Godz(zs.sum_czas_pracy) as sum_czas_pracy,
			_pl_Min2Godz(zs.sum_czas_noc) as sum_czas_noc,
			_pl_Min2Godz(zs.sum_czas_noc_normal) as sum_czas_noc_normal,
			_pl_Min2Godz(zs.sum_czas_noc+zs.sum_czas_noc_normal) as sum_czas_noc_all, 
			t.absencja,
			_pl_Min2Godz(ng_godz100prac) as ng_godz100prac, 
			_pl_Min2Godz(ng_godz_plus50prac) AS ng_godz_plus50prac, 
			_pl_Min2Godz(ng_godz_plus100wolne) AS ng_godz_plus100wolne,
			_pl_Min2Godz(ng_godz_Noc) as ng_godz_Noc,
			_pl_Min2Godz(ng_godz_plus50prac_15) as ng_godz_plus50prac_15, 
			_pl_Min2Godz(ng_godz_plus100wolne_20) as ng_godz_plus100wolne_20,
			_pl_Min2Godz(ng_godz100prac+ng_godz_plus50prac_15+ng_godz_plus100wolne_20) as suma_godzin,
			_pl_Min2Godz(ng_godzSNS) as ng_godzSNS,
			t.godziny150,
			t.godziny200,
			(t.godziny-t.godziny150-t.godziny200) AS godz_zwykle_num,
			_pl_Min2Godz(t.godziny-t.godziny150-t.godziny200) AS godz_zwykle,
			t.alertPrn, t.alert 
		FROM 
		t_frekw_osoba_mc t
		join osoby o on o.GUID=t.pracGUID
		join t_zest6_zakressum zs on zs.pracguid=t.pracguid
		ORDER BY 
			o.Nazwisko, o.Imiona, o.GUID, t.StartDate;
			
		
		SET @BILANS = 0;
		SET @LastPracGuid = '';	
		SELECT 
			_PL_MIN2GODZ(@BILANS := IF(@LastPracGuid != t.PracGUID, t.godziny, @BILANS + t.godziny)) AS BilansStr,
			@LastPracGuid := t.PracGUID AS LastPracGuid,
			t.* 
		FROM t_zest6_zakresFinal t
		order by PracGUID, data;	
		
	END IF;	-- _MODE = 'ZEST_RCP'

	IF _MODE = 'ZEST_WYPLAT'  THEN  -- 47812
	
		DROP TEMPORARY TABLE IF EXISTS t_zlecb;
		CREATE TEMPORARY TABLE t_zlecb AS
		SELECT rok, miesiac, GUID_pracownika, SUM(ZaZlecenie) AS brutto   -- piewotnie: SUM(KwotaBrutto) AS brutto 
		FROM prace_zlecone 
		WHERE GUID IN (SELECT GUID FROM t_zlecenia) -- t_zlecenia:  DBPlacesPlaceZlec.Shell.CreateTableWithCDSOnlyKeyField
			AND deleted = 0
			and rok = _varINT(_PARAM_A) 
			and miesiac = _varINT(_PARAM_B)
		GROUP BY GUID_pracownika	
		;
		
		-- CALL _IReg_Get('Place2003\\Parametry_kartoteki_zlecen', 'Minimalna_stawka_godzinowa', _varINT(_PARAM_A), 'FLOAT', @MinStGodz, '13.00');

		DROP TEMPORARY TABLE IF EXISTS  t_zest_wyplat;
		CREATE TEMPORARY TABLE t_zest_wyplat AS	
		SELECT 
			b.miesiac, o.nazwisko, o.imiona,
			(f.godz100prac + f.godz_plus50prac + f.godz_plus100wolne)/60 AS przepr_godz,
			b.brutto,
			_varDOUBLE(_Rnd2(p.StawkaGodzinowa * (f.godz100prac + f.godz_plus50prac + f.godz_plus100wolne)/60)) AS wg_stawki,
			b.brutto - _Rnd2(p.StawkaGodzinowa * (f.godz100prac + f.godz_plus50prac + f.godz_plus100wolne)/60 ) AS dodatk_wynagr
		FROM 
			t_zlecb b, osoby o, Pracownicy p, frekw f
		WHERE
			b.GUID_pracownika = o.GUID and f.PracGUID = o.guid and p.GUID = o.GUID and f.deleted = 0 and f.rok = b.rok and f.miesiac = b.miesiac
		GROUP BY o.GUID
		;	
		
		SELECT * FROM t_zest_wyplat;
		
		/*
			A) Miesiąc
			B) Nazwisko
			C) Imię
			D) Liczba przepracowanych godzin (ZLECENIA!!!!! - z "krt frekwencji" dla zleceniobiorców)
			E) Kwota brutto za zlecenia danej osoby w tym miesiącu (suma)
			F) Wg stawki godz. = SGzlecKonfig x wartość kolumny D   SGzlecKonfig:  minimalna stawka godzinowa: 13,00 w 2017; 13,7 w 2018
			G) Dodatkowe wynagrodzenie = kol E - kol F
			
			USE ht;

			SELECT DISTINCT o.nazwisko, o.imiona 
			FROM frekw f, osoby o 
			WHERE f.PracGUID = o.guid
			AND f.PracGUID IN (SELECT guid_pracownika FROM prace_zlecone WHERE rok=2017 AND miesiac=11)
			ORDER BY nazwisko;

-- godz100prac, godz_plus50prac, godz_plus100wolne
			
		*/
		
	END IF;	-- _MODE = 'ZEST_WYPLAT'
	
END $$

DELIMITER ;

