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

DROP PROCEDURE IF EXISTS `fr_pl_nal_graf`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `fr_pl_nal_graf`(
 IN _MODE VARCHAR(38),
 IN _ROK VARCHAR(38),
 IN _MIESIAC VARCHAR(38),
 IN _GUID VARCHAR(38),
 IN _Param_A VARCHAR(50),
 IN _Param_B VARCHAR(255),
 IN _Param_C VARCHAR(255),
 IN _Param_D TEXT,
 IN _scenariusz VARCHAR(100)
 )
SPROC: BEGIN

	DECLARE _od, _do, _okres VARCHAR(10);
	DECLARE _i, _LP, _liczba, _limit_we, _limit_wy, _ncp INT;
	DECLARE _warunek VARCHAR(15);
	DECLARE _pracGUID, _nalGUID, _GUID_pracownika VARCHAR(38);
	DECLARE _GodzPracy, _GodzPracy_hm decimal(16,2);

 SET SESSION group_concat_max_len = 1024*1024*1024;

/*
nazwa dlatego taka, że chodzi o przygotowanie danych do naliczenia płac/zleceń na podstawie grafików prac na sklepach
_db_globals - ustawienie czy korzystamy z tej sciezki i jak klucz na zero, to wypad z procedury
format komunikatu do programu: status cyfrowy (0 = OK), msg tekstowe

Przygotowanie danych do naliczanie płac w Konkolu zoo poprzed przeliczenie czasów prac na sklepach i ogólnie rentownosci sklepów
W sumie przypomina to mechanizm naliczania zleceń w Security (na podstawie czasów pracy na obiektach (kartach obiektów))
Tutaj powstają nowe tabele z danymi (płachta, etaty)

pytanie/sprawdzenie, czy są już zapisy na ten rok/miesiąc
CALL fr_pl_nal_graf('NALICZ1', '_ROK', '_MIESIAC', '_GUID', '_Param_A', '_Param_B', '_Param_C', '_Param_D', _scenariusz)
*/
-- select 0 as status, 'wstępnie działa' as msg;


-- sprawdzenie, czy są już p ozycje na dany okres, żeby program mógł zadać pytanie, czy na pewno naliczać ponownie
IF (_MODE = 'CHECK') THEN
 select count(*) as pozycje into _liczba from pl_zrcp where Y = _ROK and M = _MIESIAC;

 if _liczba = 0 then
  select 0 as status, 'Pierwsze naliczenie na dany okres.' as msg;
 else
  select 1 as status, 'Są już pozycje na wybrany okres. Czy przeliczyć ponownie?' as msg;
 end if;

END IF;

/*
wydruk detali do zapisu płacowego
CALL fr_pl_nal_graf('ZEST_DETAL_PLACE_DS1', '-1', '-1', '_GUID', '_Param_A', '_Param_B', '_Param_C', '_Param_D','scenariusz')
CALL fr_pl_nal_graf('ZEST_DETAL_PLACE_DS1', '-1', '-1', '{3DDB872D-A84D-41B9-A7D1-9B276DF92680}', '_Param_A', '_Param_B', '_Param_C', '_Param_D','scenariusz');
*/
IF (_MODE = 'ZEST_DETAL_PLACE_DS1') THEN

 SELECT GUID_pracownika, rok, miesiac
 INTO _GUID_pracownika, _rok, _miesiac
 FROM place WHERE GUID = _GUID;

-- CALL pl_pres_zlecenia('ADRESY_PRAC',_GUID_pracownika,'','','','','scenariusz');

 SELECT 'fr_pl_nal_graf_ZEST_DETAL_PLACE_DS1' AS fr_pl_nal_graf_ZDPL1,
 _scenariusz AS scenariusz,
 (SELECT valuea FROM IReg WHERE idkey = 'Pelna_nazwa' LIMIT 1) AS FirmaNazwa,
 (SELECT valuea FROM IReg WHERE idkey = 'Address Info' LIMIT 1) AS FirmaAdres,
 (SELECT valuex FROM IReg WHERE idkey = 'Contact' LIMIT 1) AS FirmaKontakt,
 (SELECT valuea FROM IReg WHERE idkey = 'Reprezentant_firmy_sprawy_kadrowe' LIMIT 1) AS FirmaReprezentant,
 IF(o.plec = 0,'Pani','Pan') AS plecStr,
 a.symbol as sklep, a.nazwa as nazwa_sklepu,
 o.Nazwisko AS Nazwisko,
 o.imiona AS imiona,
 d.recNo, d.Y, d.M, d.StGodz_PL, d.StGodz_SN, d.StGodz_Noc, d.StGodzPRplace, d.StGodzPRzlec,
 d.WartZaGodz, d.DodZaSN, d.DodNocny, d.WartPremii, d.RazemWynagrBrt,
 if(d.GodzPracy_HM <> 0, concat(floor(d.GodzPracy_HM),':', lpad(round((d.GodzPracy_HM - floor(d.GodzPracy_HM))*100),2,'0')), '') as GodzPracy_HM,
 if(d.GodzSNS_HM <> 0, concat(floor(d.GodzSNS_HM),':', lpad(round((d.GodzSNS_HM - floor(d.GodzSNS_HM))*100),2,'0')), '') as GodzSNS_HM,
 if(d.GodzNoc_HM <> 0, concat(floor(d.GodzNoc_HM),':', lpad(round((d.GodzNoc_HM - floor(d.GodzNoc_HM))*100),2,'0')), '') as GodzNoc_HM
 FROM place pl
 left join place_grafiki_rcp d ON d.placeGUID = pl.GUID
 left join erp_area_nodes a on a.GUID = d.areaGUID
 INNER JOIN osoby o ON o.GUID = pl.GUID_pracownika
 INNER JOIN Pracownicy p ON p.GUID=o.GUID
 WHERE pl.GUID = _GUID
 order by d.recNo;

END IF;

-- drugi mode dla wydruku z plac - sumowanie roznych rzeczy
IF (_MODE = 'ZEST_DETAL_PLACE_DS2') THEN

 select sum(d.GodzPracy) INTO _GodzPracy
 FROM place pl
 left join place_grafiki_rcp d ON d.placeGUID = pl.GUID
 WHERE pl.GUID = _GUID
 group by d.placeGUID
 ;

 -- teraz godziny trzeba zamienic na minuty, bo funkcja tworzaca hh:mm dziala tylko z minut, ehhh
 SET _GodzPracy = floor(_GodzPracy)*60 + (_GodzPracy - floor(_GodzPracy))*60;

 -- teraz minuty zamieniamy na format hh:mm
 SET _GodzPracy_hm =
 ((_RndTIME('MIN', 60*(_GodzPracy), 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*(_GodzPracy), 1, '', '')) MOD 60)/100);

 SELECT 'fr_pl_nal_graf_ZEST_DETAL_PLACE_DS2' AS fr_pl_nal_graf_ZDPL2,
 _scenariusz AS scenariusz,
 d.godzPracyNOM, d.StGodz_PL, d.StGodz_SN, d.StGodz_Noc,

 if(d.godzPracyNOM <> 0, concat(floor(d.godzPracyNOM),':', lpad(round((d.godzPracyNOM - floor(d.godzPracyNOM))*100),2,'0')), '') as godzPracyNOM_hm,

 if(_GodzPracy_hm <> 0, concat(floor(_GodzPracy_hm),':', lpad(round((_GodzPracy_hm - floor(_GodzPracy_hm))*100),2,'0')), '') as GodzPracy_hm,

 sum(d.GodzPracy) as GodzPracy,
 sum(d.WartZaGodz) as WartZaGodz,
 sum(d.DodZaSN) as DodZaSN,
 sum(d.DodNocny) as DodNocny,
 _Rnd2(d.StGodz_PL * d.godzPracyNOM) as placa_zasadnicza,
 _Rnd2((sum(d.GodzPracy) - d.godzPracyNOM) * d.StGodz_PL) + sum(d.DodZaSN) + sum(d.WartPremii) as premia_uzn
 FROM place pl
 left join place_grafiki_rcp d ON d.placeGUID = pl.GUID
 WHERE pl.GUID = _GUID
 group by d.placeGUID
 ;

 -- select 'ok' as msg;
END IF;


IF (_MODE = 'ZEST_DETAL_PLACE_DS3') THEN
 select 'ok' as msg;
END IF;


-- CALL fr_pl_nal_graf('ZEST_DETAL_ZLEC_DS1', '-1', '-1', '{EBA33D45-5B74-410D-9C64-2A956C1BFD5F}', '_Param_A', '_Param_B', '_Param_C', '_Param_D','scenariusz');
IF (_MODE = 'ZEST_DETAL_ZLEC_DS1') THEN
 SELECT GUID_pracownika, rok, miesiac
  INTO _GUID_pracownika, _rok, _miesiac
  FROM prace_zlecone WHERE GUID = _GUID;

  -- CALL pl_pres_zlecenia('ADRESY_PRAC',_GUID_pracownika,'','','','','scenariusz');

 SELECT 'fr_pl_nal_graf_ZEST_DETAL_ZLEC_DS1' AS fr_pl_nal_graf_ZDZL1,
	_scenariusz AS scenariusz,
 (SELECT valuea FROM IReg WHERE idkey = 'Pelna_nazwa' LIMIT 1) AS FirmaNazwa,
 (SELECT valuea FROM IReg WHERE idkey = 'Address Info' LIMIT 1) AS FirmaAdres,
 (SELECT valuex FROM IReg WHERE idkey = 'Contact' LIMIT 1) AS FirmaKontakt,
 (SELECT valuea FROM IReg WHERE idkey = 'Reprezentant_firmy_sprawy_kadrowe' LIMIT 1) AS FirmaReprezentant,
 a.symbol as sklep, a.nazwa as nazwa_sklepu,
 o.Nazwisko AS Nazwisko,
 o.imiona AS imiona,
 d.recNo, d.Y, d.M, d.StGodz_PL, d.StGodz_SN, d.StGodz_Noc, d.StGodzPRplace, d.StGodzPRzlec,
 d.WartZaGodz, d.DodZaSN, d.DodNocny, d.WartPremii, d.RazemWynagrBrt,

 if(d.GodzPracy_HM <> 0, concat(floor(d.GodzPracy_HM),':', lpad(round((d.GodzPracy_HM - floor(d.GodzPracy_HM))*100),2,'0')), '') as GodzPracy_HM,
 if(d.GodzSNS_HM <> 0, concat(floor(d.GodzSNS_HM),':', lpad(round((d.GodzSNS_HM - floor(d.GodzSNS_HM))*100),2,'0')), '') as GodzSNS_HM,
 if(d.GodzNoc_HM <> 0, concat(floor(d.GodzNoc_HM),':', lpad(round((d.GodzNoc_HM - floor(d.GodzNoc_HM))*100),2,'0')), '') as GodzNoc_HM

 FROM prace_zlecone pl
 left join place_grafiki_rcp d ON d.zlecGUID = pl.GUID
 left join erp_area_nodes a on a.GUID = d.areaGUID
 INNER JOIN osoby o ON o.GUID = pl.GUID_pracownika
 INNER JOIN Pracownicy p ON p.GUID=o.GUID
 WHERE pl.GUID = _GUID
 ORDER by d.recNo;

END IF;

IF (_MODE = 'ZEST_DETAL_ZLEC_DS2') THEN
 select 'ok' as msg;
END IF;

IF (_MODE = 'ZEST_DETAL_ZLEC_DS3') THEN
 select 'ok' as msg;
END IF;



-- dane do wydruku zestawienia zbiorczego pracy danego pracownika w danym miesiacu
-- CALL fr_pl_nal_graf('ZEST_PRAC_DS1', '-1', '-1', '_GUID', '_Param_A', '_Param_B', '_Param_C', '_Param_D','scenariusz')
-- program wysyla guid frekwencji!!! z tego trzeba sobie pobrac resztę danych
IF (_MODE = 'ZEST_PRAC_DS1') THEN

  select pracguid, rok, miesiac
  into _pracGUID, _ROK, _MIESIAC
  from frekw where guid = _GUID
  ;

 SELECT 'fr_pl_nal_graf_ZEST_PRAC_DS1' AS fr_pl_nal_graf_ZEST_PRAC_DS1,
		_scenariusz AS scenariusz,
		(SELECT valuea FROM IReg WHERE idkey = 'Pelna_nazwa' LIMIT 1) AS FirmaNazwa,
		(SELECT valuea FROM IReg WHERE idkey = 'Address Info' LIMIT 1) AS FirmaAdres,
		(SELECT valuex FROM IReg WHERE idkey = 'Contact' LIMIT 1) AS FirmaKontakt,
		(SELECT valuea FROM IReg WHERE idkey = 'NIP' AND IdPath= 'INT\\SYSTEM\\MOTLAWA\\DaneFirmy' LIMIT 1) AS FirmaNIP,
		(SELECT valuea FROM IReg WHERE idkey = 'Miasto' AND IdPath= 'INT\\SYSTEM\\MOTLAWA\\DaneFirmy' LIMIT 1) AS FirmaMiasto,
		(SELECT valuea FROM IReg WHERE idkey = 'Reprezentant_firmy_sprawy_kadrowe' LIMIT 1) AS FirmaReprezentant,
		IF(o.plec = 0,'Pani','Pan') AS plecStr,
		o.Nazwisko AS Nazwisko,
		o.imiona AS imiona,
		-- o.Imie1 AS Imie1,
  concat(a.symbol, '-', a.nazwa) as sklep,
  if(p.tP_Z_hm <> 0, concat(floor(p.tP_Z_hm),':', lpad(round((p.tP_Z_hm - floor(p.tP_Z_hm))*100),2,'0')), '') as tP_Z,
  if(p.tP_SNS_hm <> 0, concat(floor(p.tP_SNS_hm),':', lpad(round((p.tP_SNS_hm - floor(p.tP_SNS_hm))*100),2,'0')), '') as tP_SNS,
  if(p.tP_Noc_hm <> 0, concat(floor(p.tP_Noc_hm),':', lpad(round((p.tP_Noc_hm - floor(p.tP_Noc_hm))*100),2,'0')), '') as tP_Noc,
  -- if(p.tP_SNS_hm <> 0, p.tP_SNS_hm, '') as tP_SNS,
  -- if(p.tP_Noc_hm <> 0, p.tP_Noc_hm, '') as tP_Noc,
  p.Y, p.M, p.D
  -- p.tp_SNS,
  -- p.tP_Noc
  -- p.*
  FROM pl_zrcp p
		INNER JOIN osoby o ON o.GUID = p.pracGUID
		inner join erp_area_nodes a on a.GUID = p.areaGUID
		WHERE p.licznik=0 and p.pracGUID = _pracGUID and p.Y = _ROK and p.M = _MIESIAC
		and p.tP_Z <> 0
		order by p.D, p.we_wy, a.symbol
		;


  -- select 0 as status, 'Zestawienie czasu pracy pracownika na sklepach w miesiącu dataset 1' as msg;

END IF;
-- CALL fr_pl_nal_graf('ZEST_PRAC_DS2', -1, -1, '{CEB7156C-E93A-4EC8-B3E0-C901B9490F5D}', '', '', '', '', 'PL_ZRCP_MC')
-- pani Volvenko w lipcu 2024
IF (_MODE = 'ZEST_PRAC_DS2') THEN

 select pracguid, rok, miesiac
 into _pracGUID, _ROK, _MIESIAC
 from frekw where guid = _GUID
  ;

 SELECT 'fr_pl_nal_graf_ZEST_PRAC_DS2' AS fr_pl_nal_graf_ZEST_PRAC_DS2,
		_scenariusz AS scenariusz,
  concat(a.symbol, '-', a.nazwa) as sklep,
  if(p.godz_hm <> 0, concat(floor(p.godz_hm),':', lpad(round((p.godz_hm - floor(p.godz_hm))*100),2,'0')), '') as godz,
  if(p.godz_sns_hm <> 0, concat(floor(p.godz_sns_hm),':', lpad(round((p.godz_sns_hm - floor(p.godz_sns_hm))*100),2,'0')), '') as godz_sns,
  if(p.godz_noc_hm <> 0, concat(floor(p.godz_noc_hm),':', lpad(round((p.godz_noc_hm - floor(p.godz_noc_hm))*100),2,'0')), '') as godz_noc
  -- p.*
  FROM pl_zrcp_gr p
		INNER JOIN osoby o ON o.GUID = p.pracGUID
		inner join erp_area_nodes a on a.GUID = p.areaGUID
		WHERE p.pracGUID = _pracGUID and p.Y = _ROK and p.M = _MIESIAC
		and p.godz <>0
		order by a.symbol
		;


END IF;

IF (_MODE = 'ZEST_PRAC_DS3') THEN

  select 0 as status, 'Zestawienie czasu pracy pracownika na sklepach w miesiącu dataset 3' as msg;

END IF;


-- napliczanie płachty i tabeli grupującej na dany miesiąc i rok
-- najpierw przygotowanie danych w tabeli tymczasowej, potem, po obrobce, wrzucenie danych do tabeli stalej z licznikiem zmian i czasami zmian rekordow
-- CALL fr_pl_nal_graf('NALICZ1', '2024', '11', '_GUID', '_Param_A', '_Param_B', '_Param_C', '_Param_D', '_scenariusz')
IF (_MODE = 'NALICZ1') THEN

 -- daty sa takze potrzebne dalej, do sumowania sprzedazy w sklepach
 SET _od = CONCAT(_ROK,'-',LPAD(_MIESIAC,2,'0'),'-01');
	SET _do = LAST_DAY(_od);

 IF _od < '2024-12-01' THEN
  select 1 as status, 'Naliczenie przeznaczone dla okresów od 12/2024' as msg;
  LEAVE SPROC;
 END IF;

  -- przeliczenie tabeli zrodlowej dla danego miesiaca
 SET _okres = CONCAT(_ROK,LPAD(_MIESIAC,2,'0'));
	-- nowsza wersja od 23 grudnia 2024, pełne naliczenie trwa 32 sekundy


	IF _GUID = '' THEN -- naliczanie dla wszystkich pracownikow
  CALL pl_all_frekw_tools('pl.nalicz.ALL.YYYYMM', '', _okres, '', '', '');
 END IF;


 IF _GUID <> '' THEN -- naliczanie tylko pracownikow danego sklepu
  drop table if exists tt_prac10;
  create temporary table tt_prac10 (
  pracGUID varchar(38),
  KEY pracGUID (pracGUID)
  ) DEFAULT CHARSET=cp1250;

  insert into tt_prac10
  select distinct osobaGUID from hr_team_po where guidng = _GUID and osobaGUID <> '';

  BEGIN
   DECLARE done BOOL DEFAULT FALSE;
   DECLARE _pracGUID_p VARCHAR(38);
   DECLARE c_proc CURSOR FOR
    SELECT pracGUID FROM tt_prac10;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN c_proc;
    loop1: LOOP
     FETCH c_proc INTO _pracGUID_p;
     IF done THEN
      LEAVE loop1;
     END IF;

     CALL pl_all_frekw_tools('pl.nalicz.ALL.YYYYMM', _pracGUID_p, _okres, '', '', '');

    END LOOP;
   CLOSE c_proc;
  END;

 END IF;



-- naliczanie calej plachty ale bez przeliczania wyzej to 61 sekund
 DROP TABLE IF EXISTS tt_z01;
	CREATE TEMPORARY TABLE tt_z01 (
  areaGUID varchar(38) NOT NULL DEFAULT '',
  pracGUID varchar(38) NOT NULL DEFAULT '',
  D date NOT NULL DEFAULT '0000-00-00',
  Y int NOT NULL DEFAULT '0',
  M int NOT NULL DEFAULT '0',
  we_wy varchar(150) DEFAULT NULL COMMENT 'lista we/wy nomin.',
  we_wy_plan varchar(150) DEFAULT NULL COMMENT 'lista we/wy wg planu',
  tP double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'czas (godziny) pracy wyjsciowe do obliczen',
  tP_Z double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'godziny Z',
  tP_SNS double(16,4) NOT NULL DEFAULT 0.0000,
  tP_Noc double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'godziny nocne',
		tP_Noc_ofic double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'godziny nocne oficjalne',
  tP_hm double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'czas (godziny) pracy wyjsciowe do obliczen',
  tP_Z_hm double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'godziny Z',
  tP_SNS_hm double(16,4) NOT NULL DEFAULT 0.0000,
  tP_Noc_hm double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'godziny nocne',
  tP_Noc_ofic_hm double(16,4) NOT NULL DEFAULT 0.0000 COMMENT 'godziny nocne oficjalne',
  alarm int NOT NULL DEFAULT '0', -- pobierac z pozycji frekwencji?
  dni_pracy int NOT NULL DEFAULT '0',
  dni_pracowal int NOT NULL DEFAULT '0',
  dni_absencji int NOT NULL DEFAULT '0',
  nie_naliczac_premii int NOT NULL DEFAULT '0', -- pobierane z naglowka frekwencji, na razie nie ma pola
  osobaGUID varchar(38) NOT NULL DEFAULT '', -- jest to guid osoby typu kierownik, handlowiec
  licznik int NOT NULL DEFAULT '0',
  nalGUID varchar(38) NOT NULL DEFAULT '', --  jest to tak naprawde guid naliczenia, jeden wspolny, prawie jak licznik
  -- Create_At timestamp NOT NULL DEFAULT current_timestamp(),
  -- PRIMARY KEY (idn),
  -- UNIQUE GUID (GUID),
  UNIQUE a_p_d (areaGUID,pracGUID, D),
  KEY areaGUID (areaGUID),
  KEY pracGUID (pracGUID),
  KEY D (D),
  KEY Y (Y),
  KEY M (M),
  KEY licznik (licznik)
 ) DEFAULT CHARSET=cp1250 -- COLLATE=cp1250_general_ci
;


 SELECT UUID() into _nalGUID;

 insert into tt_z01
 select
 AreaGUID, PracGUID, D, Y, month(D), we_wy, we_wy_plan, tP, tP_Z, tP_SNS, tP_Noc,
 0,0,0,0,0,0,
 0 as alarm,
 0 as dni_pracy, 0 as dni_pracy_kp, 0 as dni_absencji,
 0 as nie_naliczac_premii, '' as osobaGUID, 0 as licznik,
 _nalGUID as nalGUID
 from pl_PxDA plt
 where plt.Y = _ROK and plt.YM = _okres -- month(plt.D) = _MIESIAC
 and ifnull(plt.areaguid, '') <> '' and plt.areaGUID not in ('{1A33DF97-66FD-4DA1-BFF0-39E1D2F133EB}')
 ;

 update tt_z01 t SET
 t.tp_noc_ofic =
 (select noc from frekw_po p, frekw n where n.guid = p.frekwguid and n.deleted=0 and p.pracguid = t.pracguid and t.D = p.rok_msc_dzien)
 where tp_noc > 0
 ;

 -- zamiana minut na format HH,MM - zapytanie robi sie 3,6 sekundy
 update tt_z01 t set
 t.tP_hm = ((_RndTIME('MIN', 60*t.tP, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.tP, 1, '', '')) MOD 60)/100),
 t.tP_Z_hm = ((_RndTIME('MIN', 60*t.tP_Z, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.tP_Z, 1, '', '')) MOD 60)/100),
 t.tP_SNS_hm = ((_RndTIME('MIN', 60*t.tP_SNS, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.tP_SNS, 1, '', '')) MOD 60)/100),
 t.tP_Noc_hm = ((_RndTIME('MIN', 60*t.tP_Noc, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.tP_Noc, 1, '', '')) MOD 60)/100),
 t.tP_Noc_ofic_hm = ((_RndTIME('MIN', 60*t.tP_Noc_ofic, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.tP_Noc_ofic, 1, '', '')) MOD 60)/100)
 ;

 -- zbieranie okreslonych absencji w ciagu calego miesiaca dla danego pracownika
 drop table if exists tt_absencje;
 create temporary table tt_absencje (
  pracGUID varchar(38) NOT NULL DEFAULT '',
  dni_absencji int NOT NULL DEFAULT '0',
  KEY pracGUID (pracGUID)
 ) DEFAULT CHARSET=cp1250
 ;

 insert into tt_absencje
 select n.PracGUID, count(p.GUID)
 from frekw_po p, frekw n
 where n.guid = p.FrekwGUID and n.deleted=0
 and p.absencja in ('C', 'L', 'K', 'M', 'R', 'Z', 'U', 'MO', 'MR', 'MT')
 and n.rok = _ROK and n.miesiac = _MIESIAC
 group by n.PracGUID
 ;

 update tt_z01 t, tt_absencje ta set
 t.dni_absencji = ta.dni_absencji
 where t.pracGUID = ta.pracGUID
 ;

 /*
 -- robi sie 5,5 sekundy
 update tt_z01 t set
 dni_absencji =
 (select count(p.GUID) from frekw_po p, frekw n where n.guid = p.FrekwGUID and n.deleted=0 and n.PracGUID = t.PracGUID
 and t.Y = n.rok and t.M = n.miesiac
 and p.absencja in ('C', 'L', 'K', 'M', 'R', 'Z', 'U', 'MO', 'MR', 'MT')
 and n.rok = _ROK and n.miesiac = _MIESIAC)
 ;
*/
 update tt_z01 t, frekw n
 set t.dni_pracy = n.dnipracy
 -- t.dni_pracowal = n.pracowaldni
 -- t.nie_naliczac_premii = n.nie_naliczac_premii
 where n.PracGUID = t.pracGUID and n.rok = t.Y and n.miesiac = t.M
 and n.deleted = 0
 and n.rok = _ROK and n.miesiac = _MIESIAC
 ;

 -- naliczanie samych dni pracy
 DROP TABLE IF EXISTS tt_z02;
	CREATE TEMPORARY TABLE tt_z02 (
  pracGUID varchar(38) NOT NULL DEFAULT '',
  dni_pracowal int NOT NULL DEFAULT '0',
  KEY pracGUID (pracGUID)
 ) DEFAULT CHARSET=cp1250
	;

 insert into tt_z02
 select pracguid, count(distinct D) as dni_pracowal
 from tt_z01 where (tP + tP_Z) > 0
 group by pracguid;

 update tt_z01 t, tt_z02 t2
 set t.dni_pracowal = t2.dni_pracowal
 where t2.pracGUID = t.pracGUID
 ;

-- alarmy, limit alarmów pobieram z dwóch kluczy, są w minutach
 select valueI into _limit_we from IReg where idkey = 'limit_czasu_alarmu_we' limit 1;
 select valueI into _limit_wy from IReg where idkey = 'limit_czasu_alarmu_wy' limit 1;
 -- zmianiamy na sekundy
 SET _limit_we = _limit_we * 60;
 SET _limit_wy = _limit_wy * 60;

 -- alarm jest wlaczany, gdy roznica wejscia z planem lub wyjscia jest wieksza niz limit (w każdą stronę!) lub gdy w we_wy są dwa okresy
 -- limit to aktualnie 15 minut dla we i wy
 update tt_z01 t set
 t.alarm = 1
 where t.we_wy is null OR t.we_wy_plan is null OR
 (abs(time_to_sec(timediff(left(we_wy_plan,5), left(we_wy,5)))) > _limit_we OR
 abs(time_to_sec(timediff(right(we_wy,5), right(we_wy_plan,5)))) > _limit_wy
 OR we_wy like '%;%')
 ;

 -- przypisanie kierowników/handlowców
 DROP TABLE IF EXISTS tt_z03;
	CREATE TEMPORARY TABLE tt_z03 (
  areaGUID varchar(38) NOT NULL DEFAULT '',
  osobaGUID varchar(38) NOT NULL DEFAULT '',
  KEY areaGUID (areaGUID)
 ) DEFAULT CHARSET=cp1250
	;

 insert into tt_z03
 select t.areaGUID, l.OsobaGuid
 from tt_z01 t
 inner join hr_team_ng n on n.AreaGUID = t.areaGUID and n.DayWork = t.D
 inner join hr_team_ng_links l on n.GUIDTemplate = l.guidng and l.rel = 'Team->Kierownik'
 group by t.areaguid;

 update tt_z01 t, tt_z03 t3
 set t.osobaGUID = t3.osobaGUID
 where t.areaGUID = t3.areaGUID
 ;

 -- druga tabela z danymi grupowanymi (tabela 2 w specyfikacji)
 drop table if exists tt_z10;
	create temporary table tt_z10 (
	areaGUID varchar(38),
	pracGUID varchar(38),
	Y int NOT NULL DEFAULT '0',
 M int NOT NULL DEFAULT '0',
	godz double(16,2),
	godz_sns double(16,2),
	godz_noc double(16,2),
	godz_noc_ofic double(16,2),
	godz_hm double(16,2),
	godz_sns_hm double(16,2),
	godz_noc_hm double(16,2),
	godz_noc_ofic_hm double(16,2),
	ncp double(16,2),
	etat_przel double(16,2),
	osobaGUID varchar(38) NOT NULL DEFAULT '', -- jest to guid osoby typu kierownik, handlowiec
	nalGUID varchar(38) NOT NULL DEFAULT '',
	UNIQUE a_p_y_m (areaGUID,pracGUID,Y,M),
 KEY areaGUID (areaGUID),
 KEY pracGUID (pracGUID),
 KEY Y (Y),
 KEY M (M)
	) DEFAULT CHARSET=cp1250
 ;
 -- wyciagamy z ireg-a normatywny czas pracy w danym miesiacu
 SET _warunek = concat('NCP', IF(left(_MIESIAC,1) = '0', replace(_MIESIAC, '0', ''), _MIESIAC));
 select valuen into _ncp from IReg where idkey = _warunek and rok= _ROK limit 1;
 -- set @_warunek = _warunek;

 insert into tt_z10
 select areaGUID, pracGUID, Y, M,
 sum(tP_Z/60) as godz, -- na pewno?
 sum(tP_SNS/60) as godz_sns, -- na pewno?
 sum(tP_Noc/60) as godz_noc, -- na pewno?
 sum(tP_Noc_ofic/60) as godz_noc_ofic,
 0,0,0,0,
 _ncp,
 0 as etat_przel,
 osobaGUID,
 nalGUID
 from tt_z01 t
 where t.areaGUID <> ''
 group by t.areaGUID, t.pracGUID
 ;

 -- zamiana minut na format HH,MM
 update tt_z10 t set
 t.godz_hm = ((_RndTIME('MIN', 60*t.godz*60, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.godz*60, 1, '', '')) MOD 60)/100),
 t.godz_sns_hm = ((_RndTIME('MIN', 60*t.godz_sns*60, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.godz_sns*60, 1, '', '')) MOD 60)/100),
 t.godz_noc_hm = ((_RndTIME('MIN', 60*t.godz_noc*60, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.godz_noc*60, 1, '', '')) MOD 60)/100),
 t.godz_noc_ofic_hm = ((_RndTIME('MIN', 60*t.godz_noc_ofic*60, 1, '', '')) DIV 60)  + (((_RndTIME('MIN', 60*t.godz_noc_ofic*60, 1, '', '')) MOD 60)/100)
 ;


 update tt_z10
 set etat_przel = if(godz >= ncp, 1, _Rnd2(godz/ncp))
 ;

 -- trzecia tabela, premia na sklep (wg specyfikacji tabela 5)
 drop table if exists tt_z20;
	create temporary table tt_z20 (
	-- idn int NOT NULL AUTO_INCREMENT,
	areaGUID varchar(38),
	Y int NOT NULL DEFAULT '0',
 M int NOT NULL DEFAULT '0',
 godz double(16,2),
	przychod double(16,2) NOT NULL DEFAULT '0',
	przychod_korekta double(16,2) NOT NULL DEFAULT '0',
	przychod_razem double(16,2),
	etat_przel double(16,2),
	przychod_na_etat double(16,2),
	premia_place double(16,2),
	premia_zlec double(16,2),
	osobaGUID varchar(38) NOT NULL DEFAULT '', -- jest to guid osoby typu kierownik, handlowiec
	kontrGUID varchar(38) NOT NULL DEFAULT '', -- guid kontrahenta, ktory reprezentuje dany sklep
	nalGUID varchar(38) NOT NULL DEFAULT '',
	-- PRIMARY KEY (idn),
	UNIQUE a_y_m (areaGUID,Y,M),
 KEY areaGUID (areaGUID),
 KEY osobaGUID (osobaGUID),
 KEY kontrGUID (kontrGUID),
 KEY Y (Y),
 KEY M (M)
	) DEFAULT CHARSET=cp1250
 ;

 insert into tt_z20
 select areaGUID, Y, M,
 sum(godz) as godz,
 0, 0, 0,
 sum(etat_przel) as etat_przel,
 0, 0, 0, osobaGUID,
 '' as kontrGUID,
 nalGUID
 from tt_z10
 group by areaGUID
 ;

 update tt_z20 t, erp_area_nodes a, kontrah k
	set t.kontrGUID = k.guid
	where concat('02',right(a.symbol,2)) = k.symbol and t.areaGUID = a.GUID
	;

 -- przychody i korekty przychodow po nowemu - czyli szybciej, a wyzej brakowalo klucza na pole kontrGUID
	drop table if exists tt_przychod;
 create temporary table tt_przychod (
  kontrGUID varchar(38) NOT NULL DEFAULT '',
  przychod double(16,2) NOT NULL DEFAULT 0,
  KEY kontrGUID (kontrGUID)
 ) DEFAULT CHARSET=cp1250
 ;

 insert into tt_przychod
 select n.kontrGUID, sum(n.brutto)
 from opng n
 inner join tt_z20 t on t.kontrGUID = n.kontrGUID
 where n.datawystaw >= _od and n.datawystaw <= _do
	and n.rodzaj in (0) and n.deleted=0
	group by n.kontrGUID;

 update tt_z20 t, tt_przychod tp set
 t.przychod = tp.przychod
 where t.kontrGUID = tp.kontrGUID
 ;

	truncate table tt_przychod;
	insert into tt_przychod
 select n.kontrGUID, sum(n.brutto)
 from opng n
 inner join tt_z20 t on t.kontrGUID = n.kontrGUID
 where n.datawystaw >= _od and n.datawystaw <= _do
	and n.rodzaj in (3,4) and n.deleted=0
	group by n.kontrGUID;

 update tt_z20 t, tt_przychod tp set
 t.przychod_korekta = tp.przychod
 where t.kontrGUID = tp.kontrGUID
 ;

	/*
	-- tak jest w rentownsoci sklepow (4, 0, 30, 32, 3, 29)
 update tt_z20 t set
 t.przychod = ifnull((select sum(brutto) from opng where kontrGUID = t.kontrGUID
	and datawystaw >= _od and datawystaw <= _do
	and rodzaj in (0) and deleted=0), 0)
 ;

 update tt_z20 t set
 t.przychod_korekta = ifnull((select sum(brutto) from opng where kontrGUID = t.kontrGUID
	and datawystaw >= _od and datawystaw <= _do
	and rodzaj in (4,3) and deleted=0), 0)
 ;

*/


 update tt_z20
 set przychod_razem = przychod - przychod_korekta;

 update tt_z20
 set przychod_na_etat = _Rnd2(przychod_razem/etat_przel);

 -- progi premii uzyskane z kluczy
 drop table if exists tt_wiersze;
	create temporary table tt_wiersze (
	wiersz varchar(255) NOT NULL DEFAULT '')
	;

 SET _i = 0;
	WHILE _i < 21 DO
		-- @pos =  LOCATE(substr,str,pos)
		SET _i = _i + 1;
		insert into tt_wiersze
		-- select replace(substring_index(substring_index(zakresy,char(13),@Iter),char(13),-1),char(10),'') as linia
		select substring_index(substring_index(valuex,'\n',_i),'\n',-1) as linia
		from IReg
		where idkey = 'progi_premii_place' and rok = _ROK
		and (substring_index(substring_index(valuex,'\n',_i),'\n',-1)) <> ''
		-- having length(linia) > 11 -- wycina pojedyncze daty od, czyli w sumie zbedny
		;
	END WHILE;

 drop table if exists tt_progi;
	create temporary table tt_progi (
	lp int,
	utarg double(16,2),
	premia double(16,2)
	)
	;
 -- wartosci w kluczu są w tysiącach!!!
 insert into tt_progi
 select substring_index(substring_index(wiersz,';',1),';',-1),
 substring_index(substring_index(wiersz,';',2),';',-1) * 1000,
 substring_index(substring_index(wiersz,';',3),';',-1)
 from tt_wiersze;

 update tt_z20 t set
 premia_place = ifnull((select premia from tt_progi where t.przychod_na_etat > utarg order by utarg desc, lp desc limit 1),0)
 ;

 -- progi premii uzyskane z kluczy dla zlecen
 drop table if exists tt_wiersze;
	create temporary table tt_wiersze (
	wiersz varchar(255) NOT NULL DEFAULT '')
	;

 SET _i = 0;
	WHILE _i < 21 DO
		-- @pos =  LOCATE(substr,str,pos)
		SET _i = _i + 1;
		insert into tt_wiersze
		-- select replace(substring_index(substring_index(zakresy,char(13),@Iter),char(13),-1),char(10),'') as linia
		select substring_index(substring_index(valuex,'\n',_i),'\n',-1) as linia
		from IReg
		where idkey = 'progi_premii_zlec' and rok = _ROK
		and (substring_index(substring_index(valuex,'\n',_i),'\n',-1)) <> ''
		-- having length(linia) > 11 -- wycina pojedyncze daty od, czyli w sumie zbedny
		;
	END WHILE;

 drop table if exists tt_progi;
	create temporary table tt_progi (
	lp int,
	utarg double(16,2),
	premia double(16,2)
	)
	;
 -- wartosci w kluczu są w tysiącach!!!
 insert into tt_progi
 select substring_index(substring_index(wiersz,';',1),';',-1),
 substring_index(substring_index(wiersz,';',2),';',-1) * 1000,
 substring_index(substring_index(wiersz,';',3),';',-1)
 from tt_wiersze;

 update tt_z20 t set
 premia_zlec = ifnull((select premia from tt_progi where t.przychod_na_etat > utarg order by utarg desc, lp desc limit 1),0)
 ;


 -- zrzucanie danych do tabel stalych
 update pl_zrcp SET licznik = licznik+1 where Y = _ROK and M = _MIESIAC;
 -- truncate table pl_zrcp;
 -- kasujemy najstarsze naliczenia
 DELETE FROM pl_zrcp WHERE licznik > 14 AND Y = _ROK and M = _MIESIAC;

 insert into pl_zrcp (areaGUID ,pracGUID, D, Y, M, we_wy, we_wy_plan,
 tP, tP_Z, tP_SNS, tP_Noc, tP_Noc_ofic, tP_hm, tP_Z_hm, tP_SNS_hm, tP_Noc_hm, tP_Noc_ofic_hm,
 alarm, dni_pracy, dni_pracowal, dni_absencji, nie_naliczac_premii, osobaGUID, licznik, nalGUID)
 select t.* from tt_z01 t;

 delete from pl_zrcp_gr where Y = _ROK and M = _MIESIAC;
 insert into pl_zrcp_gr (areaGUID, pracGUID, Y, M, godz, godz_sns, godz_noc, godz_noc_ofic, godz_hm, godz_sns_hm, godz_noc_hm, godz_noc_ofic_hm, ncp, etat_przel, osobaGUID, nalGUID)
 select t.* from tt_z10 t;

 delete from pl_zrcp_pr where Y = _ROK and M = _MIESIAC;
 insert into pl_zrcp_pr (areaGUID, Y, M, godz, przychod, przychod_korekta, przychod_razem, etat_przel, przychod_na_etat, premia_place, premia_zlec, osobaGUID, kontrGUID, nalGUID)
 select t.* from tt_z20 t;



 select 0 as status, 'Wstępnie nawet działa' as msg;

END IF;


END$$

DELIMITER ;
