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

DROP PROCEDURE IF EXISTS `pl_ppk`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pl_ppk`(
	IN _MODE VARCHAR(150),
	IN _GUID VARCHAR(38),	
	IN _Param_A VARCHAR(255), -- skad wywolane
	IN _Param_B VARCHAR(255),
	IN _Param_C TEXT, 
	IN _Param_D VARCHAR(255),
	IN _Param_E VARCHAR(255),
	IN _Param_F VARCHAR(255), -- rok w wywolaniu z zestawienia sqd
	IN _Param_G VARCHAR(255) -- miesiac w wywolaniu z zestawienia sqd
)
SPROC: BEGIN 

		DECLARE _S LONGTEXT;
		DECLARE _XML LONGTEXT;
		DECLARE _XMLnag LONGTEXT;
		DECLARE _XMLnag2 LONGTEXT;
		DECLARE _XMLpoz LONGTEXT;
		DECLARE _XMLpoz1 LONGTEXT;
		DECLARE _XMLpoz_s LONGTEXT;
		DECLARE _XMLpoz_z LONGTEXT;
		DECLARE _XMLpoz_p LONGTEXT;
		DECLARE _KodUS VARCHAR(50);
		DECLARE _NIP VARCHAR(50);
		DECLARE _REGON VARCHAR(50);
		DECLARE _PelnaNazwa VARCHAR(255); -- nazwa podmiotu wystawiajacego jpk
		DECLARE _Adres VARCHAR(255); -- adres podmiotu wystawiajacego jpk (fa), co jest glupota zupelna
		DECLARE _zm01 VARCHAR(255);
		DECLARE _zm02 VARCHAR(255);
		DECLARE cSL INT;
		DECLARE _LP INT;

		DECLARE _rok, _miesiac INT;
		DECLARE _par1 DOUBLE(16,4);
		DECLARE _par2 DOUBLE(16,4);
		DECLARE _par3 DOUBLE(16,4);
		DECLARE _par4 DOUBLE(16,4);
		DECLARE _par5 INT;
		DECLARE _nowe_adresy INT;
		DECLARE _zlecenie TINYINT; -- flga mowica o tym, jak szukac dat zatrudnienia dla zleceniobiorcow

		SET cSL := 2;

		SET _GUID = IFNULL(_GUID, '');
		SET SESSION group_concat_max_len = 1024*1024*1024;

		IF @session.globals.Owner IN ('CRIST','OFFSHORE') THEN
			SET _nowe_adresy = 1;
		ELSE 
			SET _nowe_adresy = 0;
		END IF;

		IF @session.globals.Owner IN ('SECURITY','KONKOL','SPOA','PBUCH') THEN
			SET _zlecenie = 1; -- data z tabeli umowa_zlecenie (minimalna)
		ELSE 
			SET _zlecenie = 0; -- data z umowy okresowej z tabeli Pracownicy
		END IF;



/*

Rejestracja uczestnika PPK - pracownicy
Składka PPK - płace + zlecenia
Korekta składki PPK - płace + zlecenia
Deklaracje uczestnika PPK - pracownicy
Zmiana danych kontaktu elektronicznego uczestnika PPK - pracownicy
Zmiana danych identyfikacyjnych uczestnika PPK - pracownicy
Zwolnienie pracownika (zleceniobiorcy) – uczestnika PPK* - pracownicy 


Zrobione pod PPM <Informacje do instytucji finansowej (PPK)>
prośba o zwrotkę pola MSG - jeśli pustę nie ma komunikatu. <> '' komunikat
tworze tabele tymczasowe t_prace_zlecone, t_place, t_pracownicy
Mody:
pracownicy:
DANE.REJESTRACYJNE
   DEKLARACJE
   ZMIANA.DANYCH.KONTAKTOWYCH
   ZMIANA.DANYCH.IDENTYFIKACYJNYCH
   ZWOLNIENIE.UCZESTNIKA
place/zlec:
SKLADKA.PPK
KOREKTA.SKLADKI.PPK

-- pomocnicze
SET @session.globals.Owner = 'CRIST';

DROP TABLE t_pracownicy;
CREATE TEMPORARY TABLE t_pracownicy (guid VARCHAR(38));
INSERT INTO t_pracownicy
SELECT guid FROM osoby WHERE nazwisko  LIKE 'Michalowski%'; OR guid='Prac12';

INSERT INTO t_pracownicy VALUE('{72580AE7-742B-444E-AEED-3A534A5874E8}');

CALL pl_ppk('DANE.REJESTRACYJNE', '', 'PRACOWNICY', '', '', '', '', '', '');
CALL pl_ppk('ZMIANA.DANYCH.KONTAKTOWYCH', '', 'PRACOWNICY', '', '', '', '', '', '');
CALL pl_ppk('ZWOLNIENIE.UCZESTNIKA', '', 'PRACOWNICY', '', '', '', '', '', '');
CALL pl_ppk('ZMIANA.DANYCH.IDENTYFIKACYJNYCH', '', 'PRACOWNICY', '', '', '', '', '', '');
CALL pl_ppk('DANE.REJESTRACYJNE', '', 'PRACOWNICY', '', '', '', '', '', '');
CALL pl_ppk('DEKLARACJE', '', 'PRACOWNICY', '', '', '', '', '', '');

CALL pl_ppk('SKLADKA.PPK', '', 'PLACE', '', '', '', '', '', '');
CALL pl_ppk('KOREKTA.SKLADKI.PPK', '', 'PLACE', '', '', '', '', '', '');


SELECT * FROM t_ppk_uczestnicy;
SELECT * FROM t_ppk_uczestnicy2;
SELECT * FROM t_ppk_dane;
SELECT * FROM t_ppk;
SELECT * FROM t_pracownicy;
SELECT * FROM t_ppk_danelogu;


CREATE TEMPORARY TABLE t_place (guid VARCHAR(38));
INSERT INTO t_place VALUES ('{21EF169F-74FC-4C18-B62B-3370C6474FA6}');

CREATE TEMPORARY TABLE t_prace_zlecone (guid VARCHAR(38));
INSERT INTO t_prace_zlecone VALUES ('{6259F84C-F129-40B4-B51F-B5A4A90B802C}');
INSERT INTO t_prace_zlecone VALUES ('{AFC15621-114E-4E8C-8454-68B0858B9441}');


SELECT  
IF(`compressed`=1, UNCOMPRESS(info),info) AS info,
l.*
FROM `log` l WHERE guidlink IN ('Prac246', 'Prac12')
AND miejsce IN (5055) AND czynnosc=5;


SELECT info,
SUBSTRING_INDEX(SUBSTRING_INDEX(info,'RowState="1"',-1),'RowState="8"',1) AS dane_old,
SUBSTRING_INDEX(info,'RowState="8"',-1) AS dane
FROM t_ppk_danelogu;


SELECT * FROM osoby WHERE guid='Prac246'

BLOCK - ŚCIĄGATEST

*/


IF (_MODE = 'NAGLOWEK') THEN

    DROP TABLE IF EXISTS t_ppk;
    CREATE TEMPORARY TABLE t_ppk (
                    _mode VARCHAR(50),
                    guid VARCHAR(38),
                    rok VARCHAR(4),
                    miesiac VARCHAR(2),
                    xmlnag LONGTEXT,
                    xmlnag2 LONGTEXT,
                    xmlpoz1 LONGTEXT,
                    xmlpoz2 LONGTEXT,
                    xmlpoz3 LONGTEXT,
                    xmlpoz4 LONGTEXT,
    KEY guid (guid)) DEFAULT CHARSET=utf8;

    IF _Param_A in ('PRACOWNICY') then
        INSERT INTO t_ppk select _Param_D,guid,'','','','','','','','' from t_pracownicy;
    elseif _Param_A in ('PLACE') then
        INSERT INTO t_ppk  select _Param_D,guid_pracownika,YEAR(p.datawyplaty),MONTH(p.datawyplaty),'','','','','','' from t_place t inner join place p on t.guid=p.guid AND p.PPKskladkaPracow <> 0 group by p.guid_pracownika;
    elseif _Param_A in ('PRACE_ZLECONE') then
        INSERT INTO t_ppk  select _Param_D,guid_pracownika,YEAR(p.datawyplaty),MONTH(p.datawyplaty),'','','','','','' from t_prace_zlecone t inner join prace_zlecone p on t.guid=p.guid AND p.PPKskladkaPracow <> 0 group by p.guid_pracownika;
    end if;

    IF _Param_A in ('PLACE','PRACE_ZLECONE') then
        SET _rok = (SELECT MAX(rok) FROM t_ppk);
    END IF;


    SET NAMES "utf8";

    SET @xml.IC = 1;
    SET _XMLnag = concat('<?xml version="1.0" encoding="UTF-8"?>\n',
                                            -- '<PPK xmlns="http://pekaofs.com.pl/ppk/api/2.2" wersja="1.0">\n',
                                            '<PPK wersja="1.0">\n',
                                            '<WERSJA>GRUPA_PPK 1.00</WERSJA>\n',
                                            '<GENERACJA>',CURRENT_DATE,' ',CURRENT_TIME,'</GENERACJA>\n');

    UPDATE t_ppk SET xmlnag = _XMLnag;

    CALL _IReg_Get('DaneFirmy', 'NIP', '0', 'STRING', _NIP, '(brak danych)');
    SET _NIP = REPLACE(_NIP, '-', '');
    CALL _IReg_Get('DaneFirmy', 'REGON', '0', 'STRING', _REGON, '(brak danych)');
    CALL _IReg_Get('DeklaracjeVAT', 'JPK_email', '0', 'STRING',_zm01, '(brak danych)');
    SET _zm02 = (SELECT valueA FROM IReg WHERE idpath='INT\\SYSTEM\\MOTLAWA\\Place2003\\PPK' AND idkey='PPK_nr_umowy' order by rok desc limit 1);
    -- CALL _IReg_Get('Place2003\PPK', 'PPK_nr_umowy', '0', 'STRING',_zm02, '(brak danych)');

    SET _zm02 = IFNULL(_zm02,'brak nr umowy');

-- tutaj wstawiamy dane firmy, do xmlnag2
    SET _XMLnag = concat('<PRACODAWCA>\n',
    '<NIP>',_NIP,'</NIP>\n',
    '<REGON>',_REGON,'</REGON>\n',
    -- '<DOK_TOZ_TYP>','','</DOK_TOZ_TYP>\n',
    -- '<DOK_TOZ_SYM>','','</DOK_TOZ_SYM>\n',
    IF(_zm02='','',CONCAT('<NR_UMOWY_PPK>',_zm02,'</NR_UMOWY_PPK>\n')),
    IF(_zm01='','',CONCAT('<KONTAKT>',_zm01,'</KONTAKT>\n')),
    '</PRACODAWCA>\n');

    UPDATE t_ppk SET xmlnag2 = _XMLnag;

-- wyciagam dane uczestnikow, bo sa potrzebne zawsze
    drop table if exists t_ppk_uczestnicy;
    create temporary table t_ppk_uczestnicy (
    guid VARCHAR(38),
    ID_PPK VARCHAR(30),
    PZIF_RACH_PPK VARCHAR(50),
    imie VARCHAR(50),
    imie2 VARCHAR(50),
    nazwisko VARCHAR(50),
    plec VARCHAR(5),
    obyw VARCHAR(50),
    nr_pesel VARCHAR(50),
    data_ur VARCHAR(10),
    DOK_TOZ_TYP VARCHAR(5),
    DOK_TOZ_SYM VARCHAR(50),
    xml1 TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;

    insert into t_ppk_uczestnicy (guid,xml1) select guid, '' from t_ppk;

    update t_ppk_uczestnicy t, osoby o, Pracownicy p, obywatelstwa ob set
        t.ID_PPK = p.ID_PPK,
        t.PZIF_RACH_PPK = p.PZIF_RACH_PPK,
        t.imie = o.imie1,
        t.imie2 = o.imie2,
        t.nazwisko = o.nazwisko,
        t.plec = IF(o.plec=0,'K','M'),
        t.obyw = ob.code,
        t.nr_pesel = o.nrpesel,
        t.data_ur = o.dataurodzenia,
        t.DOK_TOZ_TYP = 'D',
        t.DOK_TOZ_SYM = IFNULL(o.NrSeriaDowoduOsobistego,'')
    WHERE o.guid = t.guid AND o.obywatelstwo = ob.obywatelstwo AND p.guid = o.guid;

    update t_ppk_uczestnicy t set t.xml1 = CONCAT(
        '<UCZESTNIK>\n',
        '<ID_KADRY>',guid,'</ID_KADRY>\n',
        IF(ID_PPK='','',CONCAT('<ID_PPK>',ID_PPK,'</ID_PPK>\n')),
        IF(PZIF_RACH_PPK='','',CONCAT('<PZIF_RACH_PPK>',PZIF_RACH_PPK,'</PZIF_RACH_PPK>\n')), -- chodzi o rachunek bankowy lub inny nr przypisany w inst. finansowej
        '<IMIE>',imie,'</IMIE>\n',
        IF(imie2='','',CONCAT('<IMIE_2>',imie2,'</IMIE_2>\n')),
        '<NAZWISKO>',nazwisko,'</NAZWISKO>\n',
        '<PLEC>',plec,'</PLEC>\n',
        '<OBYW>',obyw,'</OBYW>\n',
        '<NR_PESEL>',nr_pesel,'</NR_PESEL>\n',
        '<DATA_UR>',data_ur,'</DATA_UR>\n',
        IF(DOK_TOZ_SYM='','',CONCAT('<DOK_TOZ_TYP>',DOK_TOZ_TYP,'</DOK_TOZ_TYP>\n')),
        IF(DOK_TOZ_SYM='','',CONCAT('<DOK_TOZ_SYM>',DOK_TOZ_SYM,'</DOK_TOZ_SYM>\n'))
        );

END IF; -- NAGLOWEK

-- rejestracja uczestnika ppk
IF (_MODE = 'DANE.REJESTRACYJNE') THEN

	CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

	drop table if exists t_ppk_dane;
	create temporary table t_ppk_dane (
	guid VARCHAR(38),
	data_obowiazku VARCHAR(7),
	data_zatrudnienia VARCHAR(10) DEFAULT '',
	KONTAKT_EMAIL VARCHAR(100) DEFAULT '',
	KONTAKT_TEL VARCHAR(50) DEFAULT '',
	ADR_ZAM_KRAJ VARCHAR(10) DEFAULT '',
	ADR_ZAM_KOD_POCZ VARCHAR(9) DEFAULT '',
	ADR_ZAM_POCZ VARCHAR(50) DEFAULT '',
	ADR_ZAM_MSC VARCHAR(50) DEFAULT '',
	ADR_ZAM_ULICA VARCHAR(50) DEFAULT '',
	ADR_ZAM_NR_DOMU VARCHAR(50) DEFAULT '',
	ADR_ZAM_NR_MIESZ VARCHAR(50) DEFAULT '',
	ADR_KOR_KRAJ VARCHAR(10) DEFAULT '',
	ADR_KOR_KOD_POCZ VARCHAR(9) DEFAULT '',
	ADR_KOR_POCZ VARCHAR(50) DEFAULT '',
	ADR_KOR_MSC VARCHAR(50) DEFAULT '',
	ADR_KOR_ULICA VARCHAR(50) DEFAULT '',
	ADR_KOR_NR_DOMU VARCHAR(50) DEFAULT '',
	ADR_KOR_NR_MIESZ VARCHAR(50) DEFAULT '',
	procSkladDodPPKpracod DOUBLE(16,2),
	procSkladDodPPKpracodOd VARCHAR(500),
	xml2 TEXT,
	KEY guid (guid)
	) DEFAULT CHARSET=utf8;

	insert into t_ppk_dane (guid,xml2) select guid, '' from t_ppk;
	update t_ppk_dane set data_obowiazku = (select left(min(OdDnia),7) from pracownicy_ppk where guid_pracownika = guid and deleted=0);

	update t_ppk_dane t set data_zatrudnienia = (select DataZatrudnieniaWzakl from Pracownicy where t.guid = guid);

	IF _zlecenie = 0 THEN
		update t_ppk_dane t set data_zatrudnienia = (select ZlecenieOd from Pracownicy where t.guid = guid AND ZlecenieOkresowe = 1)
			where data_zatrudnienia IS NULL;
	ELSEIF _zlecenie = 1 THEN
		update t_ppk_dane t set data_zatrudnienia = (select MIN(DataZawarcia) from umowa_zlecenie where t.guid = guid_pracownika AND CzyUmowaAkt = 1)
			where data_zatrudnienia IS NULL;
	END IF;

	update t_ppk_dane set procSkladDodPPKpracod = (select ifnull(procSkladDodPPKpracod,0.00) from pracownicy_ppk where guid_pracownika = guid and deleted=0 order by OdDnia desc LIMIT 1);
	update t_ppk_dane set procSkladDodPPKpracodOd = (select ifnull(procSkladDodPPKpracodOd,'') from pracownicy_ppk where guid_pracownika = guid and deleted=0 order by OdDnia desc LIMIT 1);

	-- dane kontaktowe
	update t_ppk_dane t, osoby o set
		KONTAKT_EMAIL = IFNULL((SELECT adres FROM kontakty WHERE typ_medium=3 AND osobaguid = t.guid ORDER BY priorytet LIMIT 1),''),
		KONTAKT_TEL = IFNULL((SELECT adres FROM kontakty WHERE typ_medium=2 AND osobaguid = t.guid AND adres<>'co jest???' ORDER BY priorytet LIMIT 1),'')
	WHERE o.guid = t.guid;

	-- dane adresowe wg roznych sciezek

	IF _nowe_adresy = 0 THEN
		update t_ppk_dane t, osoby o set
			ADR_ZAM_KRAJ = IF(IFNULL(AZAM_Kraj,'') = '', IFNULL(AMEL_Kraj,''), AZAM_Kraj),
			ADR_ZAM_KOD_POCZ = IF(LENGTH(IFNULL(AZAM_KodPocztowy,'')) < 5, IFNULL(AMEL_KodPocztowy,''), AZAM_KodPocztowy),
			ADR_ZAM_POCZ = IF(IFNULL(AZAM_Poczta,'') = '', IFNULL(AMEL_Poczta,''), AZAM_Poczta),
			ADR_ZAM_MSC = IF(IFNULL(AZAM_Miejscowosc,'') = '', IFNULL(AMEL_Miejscowosc,''), AZAM_Miejscowosc),
			ADR_ZAM_ULICA = IF(IFNULL(AZAM_Ulica,'') = '', IFNULL(AMEL_Ulica,''), AZAM_Ulica),
			ADR_ZAM_NR_DOMU = IF(IFNULL(AZAM_NrDomu,'') = '', IFNULL(AMEL_NrDomu,''), AZAM_NrDomu),
			ADR_ZAM_NR_MIESZ = IF(IFNULL(AZAM_nrMieszkania,'') = '', IFNULL(AMEL_nrMieszkania,''), AZAM_nrMieszkania),
			ADR_KOR_KRAJ = IFNULL(AKOR_Kraj,''),
			ADR_KOR_KOD_POCZ = IFNULL(AKOR_KodPocztowy,''),
			ADR_KOR_POCZ = IFNULL(AKOR_Poczta,''),
			ADR_KOR_MSC = IFNULL(AKOR_Miejscowosc,''),
			ADR_KOR_ULICA = IFNULL(AKOR_Ulica,''),
			ADR_KOR_NR_DOMU = IFNULL(AKOR_NrDomu,'') ,
			ADR_KOR_NR_MIESZ = IFNULL(AKOR_nrMieszkania,'')
		WHERE o.guid = t.guid;

		update t_ppk_dane t, Kraje k SET ADR_ZAM_KRAJ = k.idn_kraju where t.ADR_ZAM_KRAJ = k.idn;
		update t_ppk_dane t, Kraje k SET ADR_KOR_KRAJ = k.idn_kraju where t.ADR_KOR_KRAJ = k.idn;
	END IF;

	IF _nowe_adresy = 1 THEN
		-- adres zamieszkania jako najwazniejszy
		UPDATE t_ppk_dane t, 
			geo_int_adr_link A, geo_int_miejsca A_M, geo_int_adm A_P, geo_int_adresy A_U
		SET
			t.ADR_ZAM_KRAJ = IFNULL(A_M.IDcountry,''),
			t.ADR_ZAM_KOD_POCZ = IFNULL(A.ZipCode,''),
			t.ADR_ZAM_POCZ = IFNULL(A_P.nazwa,''),
			t.ADR_ZAM_MSC = IFNULL(A_M.nazwa,''),
			t.ADR_ZAM_ULICA = IFNULL(A_U.nazwa_1,''),
			t.ADR_ZAM_NR_DOMU = IFNULL(A.NrPos,'') ,
			t.ADR_ZAM_NR_MIESZ = IFNULL(A.NrLoc,'')
		WHERE A.objguid = t.guid AND A.status = 0 AND adrtyp LIKE '%ZAM%' AND A.objtable = 'osoby'
			AND A_M.ID = A.geo_int_miejsca_ID
			AND A_M.ID_Adm = A_P.ID
			AND A_U.ID = A.geo_int_adresy_ID;

		-- dla adresow nie gusowskich
		UPDATE t_ppk_dane t, 
			geo_int_adr_link A, geo_int_miejsca A_M, geo_int_adm A_P
		SET
			t.ADR_ZAM_KRAJ = IFNULL(A_M.IDcountry,''),
			t.ADR_ZAM_KOD_POCZ = IFNULL(A.ZipCode,''),
			t.ADR_ZAM_POCZ = IFNULL(A_P.nazwa,''),
			t.ADR_ZAM_MSC = IFNULL(A_M.nazwa,''),
			-- t.ADR_ZAM_MSC = IF(IFNULL(A.ulica_not_gus,'') = '', A_M.nazwa, A.ulica_not_gus),
			-- t.ADR_ZAM_ULICA = IFNULL(A_U.nazwa_1,''),
			t.ADR_ZAM_ULICA = IF(IFNULL(A.ulica_not_gus,'') = '', A_M.nazwa, A.ulica_not_gus),
			t.ADR_ZAM_NR_DOMU = IFNULL(A.NrPos,'') ,
			t.ADR_ZAM_NR_MIESZ = IFNULL(A.NrLoc,'')
		WHERE A.objguid = t.guid AND A.status = 0 AND adrtyp LIKE '%ZAM%' AND A.objtable = 'osoby'
			AND A_M.ID = A.geo_int_miejsca_ID
			AND A_M.ID_Adm = A_P.ID
			AND A.geo_int_adresy_ID = '';


		-- jezeli nie bylo adresu zamieszkania, to zamledowania
		UPDATE t_ppk_dane t, 
			geo_int_adr_link A, geo_int_miejsca A_M, geo_int_adm A_P, geo_int_adresy A_U
		SET
			t.ADR_ZAM_KRAJ = IFNULL(A_M.IDcountry,''),
			t.ADR_ZAM_KOD_POCZ = IFNULL(A.ZipCode,''),
			t.ADR_ZAM_POCZ = IFNULL(A_P.nazwa,''),
			t.ADR_ZAM_MSC = IFNULL(A_M.nazwa,''),
			t.ADR_ZAM_ULICA = IFNULL(A_U.nazwa_1,''),
			t.ADR_ZAM_NR_DOMU = IFNULL(A.NrPos,'') ,
			t.ADR_ZAM_NR_MIESZ = IFNULL(A.NrLoc,'')
		WHERE A.objguid = t.guid AND A.status = 0 AND adrtyp LIKE '%MEL%' AND A.objtable = 'osoby'
			AND A_M.ID = A.geo_int_miejsca_ID
			AND A_M.ID_Adm = A_P.ID
			AND A_U.ID = A.geo_int_adresy_ID
			AND t.ADR_ZAM_KRAJ = '';

		-- dla adresow nie gusowskich
		UPDATE t_ppk_dane t, 
			geo_int_adr_link A, geo_int_miejsca A_M, geo_int_adm A_P
		SET
			t.ADR_ZAM_KRAJ = IFNULL(A_M.IDcountry,''),
			t.ADR_ZAM_KOD_POCZ = IFNULL(A.ZipCode,''),
			t.ADR_ZAM_POCZ = IFNULL(A_P.nazwa,''),
			t.ADR_ZAM_MSC = IFNULL(A_M.nazwa,''),
			-- t.ADR_ZAM_MSC = IF(IFNULL(A.ulica_not_gus,'') = '', A_M.nazwa, A.ulica_not_gus),
			-- t.ADR_ZAM_ULICA = IFNULL(A_U.nazwa_1,''),
			t.ADR_ZAM_ULICA = IF(IFNULL(A.ulica_not_gus,'') = '', A_M.nazwa, A.ulica_not_gus),
			t.ADR_ZAM_NR_DOMU = IFNULL(A.NrPos,'') ,
			t.ADR_ZAM_NR_MIESZ = IFNULL(A.NrLoc,'')
		WHERE A.objguid = t.guid AND A.status = 0 AND adrtyp LIKE '%MEL%' AND A.objtable = 'osoby'
			AND A_M.ID = A.geo_int_miejsca_ID
			AND A_M.ID_Adm = A_P.ID
			AND A.geo_int_adresy_ID = ''
			AND t.ADR_ZAM_KRAJ = '';

		-- adres do korespondencji tylko jezeli jest osobny
		UPDATE t_ppk_dane t, 
			geo_int_adr_link A, geo_int_miejsca A_M, geo_int_adm A_P, geo_int_adresy A_U
		SET
			t.ADR_KOR_KRAJ = IFNULL(A_M.IDcountry,''),
			t.ADR_KOR_KOD_POCZ = IFNULL(A.ZipCode,''),
			t.ADR_KOR_POCZ = IFNULL(A_P.nazwa,''),
			t.ADR_KOR_MSC = IFNULL(A_M.nazwa,''),
			t.ADR_KOR_ULICA = IFNULL(A_U.nazwa_1,''),
			t.ADR_KOR_NR_DOMU = IFNULL(A.NrPos,'') ,
			t.ADR_KOR_NR_MIESZ = IFNULL(A.NrLoc,'')
		WHERE A.objguid = t.guid AND A.status = 0 AND adrtyp LIKE '%KOR%' AND A.objtable = 'osoby'
			AND A_M.ID = A.geo_int_miejsca_ID
			AND A_M.ID_Adm = A_P.ID
			AND A_U.ID = A.geo_int_adresy_ID;
/*
		UPDATE t_ppk_dane t
			SET t.ADR_KOR_KRAJ = t.ADR_ZAM_KRAJ
		WHERE t.ADR_KOR_KRAJ = '';
*/
	END IF;

	update t_ppk_dane t set t.xml2 = CONCAT(
	'<REJESTRACJA>\n',
	'<DATA_OBOWIAZKU>',t.data_obowiazku,'</DATA_OBOWIAZKU>\n',
	'<DATA_ZATRUDNIENIA>',t.data_zatrudnienia,'</DATA_ZATRUDNIENIA>\n',
	IF(KONTAKT_EMAIL='','',CONCAT('<KONTAKT_EMAIL>',KONTAKT_EMAIL,'</KONTAKT_EMAIL>\n')),
	IF(KONTAKT_TEL='','',CONCAT('<KONTAKT_TEL>',KONTAKT_TEL,'</KONTAKT_TEL>\n')),
	'<ADR_ZAM_KRAJ>',ADR_ZAM_KRAJ,'</ADR_ZAM_KRAJ>\n',
	'<ADR_ZAM_KOD_POCZ>',ADR_ZAM_KOD_POCZ,'</ADR_ZAM_KOD_POCZ>\n',
	IF(ADR_ZAM_POCZ='','',CONCAT('<ADR_ZAM_POCZ>',ADR_ZAM_POCZ,'</ADR_ZAM_POCZ>\n')),
	'<ADR_ZAM_MSC>',ADR_ZAM_MSC,'</ADR_ZAM_MSC>\n',
	IF(ADR_ZAM_ULICA='','',CONCAT('<ADR_ZAM_ULICA>',ADR_ZAM_ULICA,'</ADR_ZAM_ULICA>\n')),
	'<ADR_ZAM_NR_DOMU>',ADR_ZAM_NR_DOMU,'</ADR_ZAM_NR_DOMU>\n',
	IF(ADR_ZAM_NR_MIESZ='','',CONCAT('<ADR_ZAM_NR_MIESZ>',ADR_ZAM_NR_MIESZ,'</ADR_ZAM_NR_MIESZ>\n')),

-- dla Crist bez kraju, dla innych - trudno powiedziec
	IF(ADR_KOR_KRAJ='','',CONCAT('<ADR_KOR_KRAJ>',ADR_KOR_KRAJ,'</ADR_KOR_KRAJ>\n')),
	-- '<ADR_KOR_KRAJ>',ADR_KOR_KRAJ,'</ADR_KOR_KRAJ>\n',
	IF(ADR_KOR_KOD_POCZ='','',CONCAT('<ADR_KOR_KOD_POCZ>',ADR_KOR_KOD_POCZ,'</ADR_KOR_KOD_POCZ>\n')),
	-- '<ADR_KOR_KOD_POCZ>',ADR_KOR_KOD_POCZ,'</ADR_KOR_KOD_POCZ>\n',
	IF(ADR_KOR_POCZ='','',CONCAT('<ADR_KOR_POCZ>',ADR_KOR_POCZ,'</ADR_KOR_POCZ>\n')),
	IF(ADR_KOR_MSC='','',CONCAT('<ADR_KOR_MSC>',ADR_KOR_MSC,'</ADR_KOR_MSC>\n')),
	-- '<ADR_KOR_MSC>',ADR_KOR_MSC,'</ADR_KOR_MSC>\n',
	IF(ADR_KOR_ULICA='','',CONCAT('<ADR_KOR_ULICA>',ADR_KOR_ULICA,'</ADR_KOR_ULICA>\n')),
	IF(ADR_KOR_NR_DOMU='','',CONCAT('<ADR_KOR_NR_DOMU>',ADR_KOR_NR_DOMU,'</ADR_KOR_NR_DOMU>\n')),
	-- '<ADR_KOR_NR_DOMU>',ADR_KOR_NR_DOMU,'</ADR_KOR_NR_DOMU>\n',
	IF(ADR_KOR_NR_MIESZ='','',CONCAT('<ADR_KOR_NR_MIESZ>',ADR_KOR_NR_MIESZ,'</ADR_KOR_NR_MIESZ>\n')),
	'<FIR_SKL_DOD_PROCENT>',t.procSkladDodPPKpracod,'</FIR_SKL_DOD_PROCENT>\n',
	'<FIR_SKL_DOD_OPIS>',t.procSkladDodPPKpracodOd,'</FIR_SKL_DOD_OPIS>\n',
	'</REJESTRACJA>\n','</UCZESTNIK>\n\n')
	;

	UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
	UPDATE t_ppk SET xmlpoz1 = CONCAT('\n<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');


	SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk LIMIT 1);

	IF LENGTH(IFNULL(_XML,''))>1 THEN
		SELECT _XML;
	ELSE
		SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
	END IF;	

	DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;

END IF; -- DANE.REJESTRACYJNE


-- chyba trzeb abedzie kiedys dorobic podawanie daty, z ktorej trzeba wygenerowac zmiany
-- aktualnie procedura dziala tak, ze uzglednia wszystkie zmiany z ostatniego dnia, ale z poprzednich dni juz nie
IF (_MODE = 'ZMIANA.DANYCH.IDENTYFIKACYJNYCH') THEN

    CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

    drop table if exists t_ppk_uczestnicy2;
    create temporary table t_ppk_uczestnicy2 like t_ppk_uczestnicy;
    insert into t_ppk_uczestnicy2 select * from t_ppk_uczestnicy;
    alter table t_ppk_uczestnicy2 add column DATA_ZMIANY VARCHAR(10);

    drop table if exists t_ppk_danelogu;
    create table t_ppk_danelogu (
    guid VARCHAR(38),
    datalogu date,
    info TEXT,
    dane_old TEXT,
    dane TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;

    drop table if exists t_ppk_danelogu2;
    create temporary table t_ppk_danelogu2
    select guidlink as guid , max(date(czas)) as datalogu from `log`
    where guidlink in (select guid from t_ppk_uczestnicy) and miejsce in (5055) AND czynnosc=5
    group by guidlink;

    alter table t_ppk_danelogu2 add index guid(guid), add index datalogu(datalogu);

    insert into t_ppk_danelogu
    select guidlink, date(czas), IF(`compressed`=1, UNCOMPRESS(info),info) AS info,
        SUBSTRING_INDEX(SUBSTRING_INDEX(IF(`compressed`=1, UNCOMPRESS(info),info),'RowState="1"',-1),'RowState="8"',1) AS dane_old,
        SUBSTRING_INDEX(IF(`compressed`=1, UNCOMPRESS(info),info),'RowState="8"',-1) AS dane			from `log` l, t_ppk_danelogu2 t
        where l.guidlink = t.guid and date(l.czas) = t.datalogu and l.miejsce in (5055) AND l.czynnosc=5
    ;


    update t_ppk_uczestnicy2 t set
    DATA_ZMIANY = (select datalogu from t_ppk_danelogu where guid = t.guid limit 1)
    ;

    update t_ppk_uczestnicy t set
    nazwisko = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'nazwisko="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%nazwisko%' limit 1),nazwisko),
    imie = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'imie1="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%imie%' limit 1),imie),
    imie2 = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'imie2="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%imie2%' limit 1),imie2),
    plec = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'plec="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%plec%' limit 1),plec),

    obyw = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'Obywatelstwo="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%Obywatelstwo%' limit 1),obyw),

    nr_pesel = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'NrPesel="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%NrPesel%' limit 1),nr_pesel),
    data_ur = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'DataUrodzenia="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%DataUrodzenia%' limit 1),data_ur),

-- tutaj w ogole chyba nie ma danych w logu
    DOK_TOZ_TYP = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'DataUrodzenia="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%DataUrodzenia%' limit 1),DOK_TOZ_TYP),

-- tutaj brakuje obslugi nr paszportu
    DOK_TOZ_SYM = ifnull((select SUBSTRING_INDEX(SUBSTRING_INDEX(dane_old,'NrSeriaDowoduOsobistego="',-1),'"',1)
    FROM t_ppk_danelogu where guid = t.guid and dane like '%NrSeriaDowoduOsobistego%' limit 1),DOK_TOZ_SYM)
    ;

-- plec i obywatelstwo trzeba zlookapowac
    update t_ppk_uczestnicy t set plec = IF(plec=0,'K','M') where plec in (0,1);
    update t_ppk_uczestnicy t set obyw = ifnull((select code from obywatelstwa where t.obyw= obywatelstwo),obyw) where obyw <>'';


    drop table if exists t_ppk_dane;
    create temporary table t_ppk_dane (
    guid VARCHAR(38),
    DATA_ZMIANY VARCHAR(10),
    ID_KADRY VARCHAR(30),
    IMIE VARCHAR(50),
    IMIE_2 VARCHAR(50),
    NAZWISKO VARCHAR(50),
    PLEC VARCHAR(5),
    OBYW VARCHAR(5),
    NR_PESEL VARCHAR(50),
    DATA_UR VARCHAR(10),
    DOK_TOZ_TYP VARCHAR(5),
    DOK_TOZ_SYM VARCHAR(50),
    xml2 TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;


    INSERT INTO t_ppk_dane
    select t2.guid, t2.data_zmiany,
    '',
    IF(t2.imie<>t.imie,t2.imie,''),
    IF(t2.imie2<>t.imie2,t2.imie2,''),
    IF(t2.nazwisko<>t.nazwisko,t2.nazwisko,''),
    IF(t2.plec<>t.plec,t2.plec,''),
    IF(t2.obyw<>t.obyw,t2.obyw,''),
    IF(t2.nr_pesel<>t.nr_pesel,t2.nr_pesel,''),
    IF(t2.data_ur<>t.data_ur,t2.data_ur,''),
    IF(t2.DOK_TOZ_TYP<>t.DOK_TOZ_TYP,t2.DOK_TOZ_TYP,''),
    IF(t2.DOK_TOZ_SYM<>t.DOK_TOZ_SYM,t2.DOK_TOZ_SYM,''),
    ''
    from t_ppk_uczestnicy2 t2, t_ppk_uczestnicy t
    where t2.guid = t.guid
    ;


    delete t from t_ppk_uczestnicy t, t_ppk_dane td
    where td.guid = t.guid and (td.id_kadry='' and td.imie='' and td.imie_2='' and td.nazwisko='' and td.plec='' and td.obyw='' and td.nr_pesel='' and td.data_ur='' and td.DOK_TOZ_TYP='' and td.DOK_TOZ_SYM='');

    delete td from t_ppk_uczestnicy t, t_ppk_dane td
    where td.guid = t.guid and t.guid is null;


    update t_ppk_dane t set t.xml2 = CONCAT(
    '<UCZESTNIK_ZMIANA>\n',
    '<DATA_ZMIANY>',t.data_zmiany,'</DATA_ZMIANY>\n',
    IF(ID_KADRY ='','',CONCAT('<ID_KADRY>',ID_KADRY,'</ID_KADRY>\n')),
    IF(IMIE ='','',CONCAT('<IMIE>',IMIE,'</IMIE>\n')),
    IF(IMIE_2 ='','',CONCAT('<IMIE_2>',IMIE_2,'</IMIE_2>\n')),
    IF(NAZWISKO ='','',CONCAT('<NAZWISKO>',NAZWISKO,'</NAZWISKO>\n')),
    IF(PLEC ='','',CONCAT('<PLEC>',PLEC,'</PLEC>\n')),
    IF(OBYW ='','',CONCAT('<OBYW>',OBYW,'</OBYW>\n')),
    IF(NR_PESEL ='','',CONCAT('<NR_PESEL>',NR_PESEL,'</NR_PESEL>\n')),
    IF(DATA_UR ='','',CONCAT('<DATA_UR>',DATA_UR,'</DATA_UR>\n')),
    IF(DOK_TOZ_TYP ='','',CONCAT('<DOK_TOZ_TYP>',DOK_TOZ_TYP,'</DOK_TOZ_TYP>\n')),
    IF(DOK_TOZ_SYM ='','',CONCAT('<DOK_TOZ_SYM>',DOK_TOZ_SYM,'</DOK_TOZ_SYM>\n')),
    '</UCZESTNIK_ZMIANA>\n','</UCZESTNIK>\n')
    ;

    update t_ppk_uczestnicy t set t.xml1 = CONCAT(
        '<UCZESTNIK>\n',
        '<ID_KADRY>',guid,'</ID_KADRY>\n',
        IF(ID_PPK='','',CONCAT('<ID_PPK>',ID_PPK,'</ID_PPK>\n')),
        IF(PZIF_RACH_PPK='','',CONCAT('<PZIF_RACH_PPK>',PZIF_RACH_PPK,'</PZIF_RACH_PPK>\n')), -- chodzi o rachunek bankowy lub inny nr przypisany w inst. finansowej
        '<IMIE>',imie,'</IMIE>\n',
        IF(imie2='','',CONCAT('<IMIE_2>',imie2,'</IMIE_2>\n')),
        '<NAZWISKO>',nazwisko,'</NAZWISKO>\n',
        '<PLEC>',plec,'</PLEC>\n',
        '<OBYW>',obyw,'</OBYW>\n',
        '<NR_PESEL>',nr_pesel,'</NR_PESEL>\n',
        '<DATA_UR>',data_ur,'</DATA_UR>\n',
        '<DOK_TOZ_TYP>',DOK_TOZ_TYP,'</DOK_TOZ_TYP>\n',
        '<DOK_TOZ_SYM>',DOK_TOZ_SYM,'</DOK_TOZ_SYM>\n'
        );


    UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
    UPDATE t_ppk SET xmlpoz1 = CONCAT('\n<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');

    SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk LIMIT 1);

    IF LENGTH(IFNULL(_XML,''))>1 THEN
        SELECT _XML;
    ELSE
        SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
    END IF;

    DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;
	drop table if exists t_ppk_uczestnicy2;
	drop table if exists t_ppk_danelogu;
	drop table if exists t_ppk_danelogu2;


END IF; -- ZMIANA.DANYCH.IDENTYFIKACYJNYCH

-- tutaj jest problem, bo trzeba wygrzebac dane aktualne i poprzednie, z informacja, co sie zmienilo
-- a my nie mamy historii zmian danych - z logu? w tej sekcj mozna przyjac, ze dane tel i email nie sa krytyczne i mozna zawsze podawac aktualne
IF (_MODE = 'ZMIANA.DANYCH.KONTAKTOWYCH') THEN

    CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

    drop table if exists t_ppk_dane;
    create temporary table t_ppk_dane (
    guid VARCHAR(38),
    data_zmiany VARCHAR(10),
    KONTAKT_EMAIL VARCHAR(100) DEFAULT '',
    KONTAKT_TEL VARCHAR(50) DEFAULT '',
    xml2 TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;

    insert into t_ppk_dane (guid,xml2) select guid, '' from t_ppk;

    update t_ppk_dane t set
        data_zmiany = CURRENT_DATE(),
        KONTAKT_EMAIL = IFNULL((SELECT adres FROM kontakty WHERE typ_medium=3 AND osobaguid = t.guid ORDER BY priorytet LIMIT 1),''),
        KONTAKT_TEL = IFNULL((SELECT adres FROM kontakty WHERE typ_medium=2 AND osobaguid = t.guid AND adres<>'co jest???' ORDER BY priorytet LIMIT 1),'')
    ;

    update t_ppk_dane t set t.xml2 = CONCAT(
    '<DANE_ZMIANA>\n',
    '<DATA_ZMIANY>',t.data_zmiany,'</DATA_ZMIANY>\n',
    IF(KONTAKT_EMAIL='','',CONCAT('<KONTAKT_EMAIL>',KONTAKT_EMAIL,'</KONTAKT_EMAIL>\n')),
    IF(KONTAKT_TEL='','',CONCAT('<KONTAKT_TEL>',KONTAKT_TEL,'</KONTAKT_TEL>\n')),
    '</DANE_ZMIANA>\n','</UCZESTNIK>\n')
    ;

    UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
    UPDATE t_ppk SET xmlpoz1 = CONCAT('\n<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');


    SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk LIMIT 1);

    IF LENGTH(IFNULL(_XML,''))>1 THEN
        SELECT _XML;
    ELSE
        SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
    END IF;

    DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;

END IF; -- ZMIANA.DANYCH.KONTAKTOWYCH


-- deklaracje uczestnika ppk
IF (_MODE = 'DEKLARACJE') THEN
    CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

    drop table if exists t_ppk_dane;
    create temporary table t_ppk_dane (
    idn INT(11),
    guid VARCHAR(38),
    data_deklaracji VARCHAR(10),
    typ_deklaracji VARCHAR(50),
    procent_skladki DOUBLE(16,2),
    -- POP_PZIF_ID VARCHAR(50),
    EPPK_ID_PZIF_DO_WYPLATY VARCHAR(50), --  nazwa instytucji ppk u poprzedniego pracodawcy - nie mamy takiej informacji na razie - dodac pole do PRacownika?
    xml2 TEXT,
    KEY idn (idn)
    ) DEFAULT CHARSET=utf8;

    -- insert into t_ppk_dane (guid,xml2) select guid, '' from t_ppk;

    drop table if exists t_prac2;
    create temporary table t_prac2
    SELECT guid_pracownika, MAX(oddnia) as oddnia
        FROM pracownicy_ppk
        WHERE deleted=0 -- AND oddnia <> ifnull(dataprzystapieniaPPK,'')
        AND guid_pracownika IN (select guid FROM t_pracownicy)
        GROUP BY guid_pracownika;

    DROP TABLE IF EXISTS t_pracownicy_ppk;
    CREATE TEMPORARY TABLE t_pracownicy_ppk LIKE pracownicy_ppk;
    INSERT INTO t_pracownicy_ppk
    SELECT p.* FROM pracownicy_ppk p, t_prac2 t
    WHERE t.guid_pracownika = p.guid_pracownika AND t.oddnia = p.oddnia;

    insert into t_ppk_dane (idn,guid,xml2) select idn, guid_pracownika, '' from t_pracownicy_ppk;

-- badanie rodzaju deklaracji nie jest takie trywialne
    update t_ppk_dane set data_deklaracji = (select left(OdDnia,7) from t_pracownicy_ppk where idn = idn);

-- dla rezygnacji z placenia skladek
    update t_ppk_dane d, t_pracownicy_ppk t set typ_deklaracji = 'UCZ_REZYGNACJA'
        where t.idn = d.idn and t.aktywnyPPK=0 and dataRezygnacjiPPK = oddnia;


    update t_ppk_dane d, t_pracownicy_ppk t set typ_deklaracji = 'UCZ_WZNOWIENIE'
        where t.idn = d.idn and t.aktywnyPPK=1 and dataPrzystapieniaPPK = oddnia
        and exists (select idn from pracownicy_ppk where guid_pracownika=d.guid and deleted=0 and oddnia=dataRezygnacjiPPK);

    -- update t_ppk_dane set procent_skladki = (select ifnull(procSkladDodPPKpracodOd,'') from t_pracownicy_ppk where idn = idn);

    -- update t_ppk_dane set typ_deklaracji = (select ifnull(procSkladDodPPKpracod,0.00) from pracownicy_ppk where guid_pracownika = guid and deleted=0 order by OdDnia desc LIMIT 1);



    update t_ppk_dane t set t.xml2 = CONCAT(
        '<DANE_DEKLARACJI>\n',
        '<DEKLARACJA>\n',
        '<DATA_DEKLARACJI>',data_deklaracji,'</DATA_DEKLARACJI>\n',
        '<TYP_DEKLARACJI>',typ_deklaracji,'</TYP_DEKLARACJI>\n',
        IF(procent_skladki IS NULL,'',CONCAT('<PROCENT_SKLADKI>',procent_skladki,'</PROCENT_SKLADKI>\n')),
        -- '<POP_PZIF_ID>',POP_PZIF_ID,'</POP_PZIF_ID>\n',
        IF(EPPK_ID_PZIF_DO_WYPLATY IS NULL,'',CONCAT('<EPPK_ID_PZIF_DO_WYPLATY>',EPPK_ID_PZIF_DO_WYPLATY,'</EPPK_ID_PZIF_DO_WYPLATY>\n')),
        '</DEKLARACJA>\n'
        '</DANE_DEKLARACJI>\n','</UCZESTNIK>\n')
    ;

    UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
    UPDATE t_ppk SET xmlpoz1 = CONCAT('<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');


    SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk);

    IF LENGTH(IFNULL(_XML,''))>1 THEN
        SELECT _XML;
    ELSE
        SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
    END IF;

    DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;

END IF; -- DEKLARACJE

IF (_MODE = 'ZWOLNIENIE.UCZESTNIKA') THEN

    CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

    drop table if exists t_ppk_dane;
    create temporary table t_ppk_dane (
    guid VARCHAR(38),
    data_zmiany VARCHAR(10),
    xml2 TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;

    insert into t_ppk_dane (guid,xml2) select guid, '' from t_ppk;

    update t_ppk_dane t, Pracownicy p set data_zmiany = p.DataZwolnienia WHERE t.guid = p.guid;

    update t_ppk_dane t set t.xml2 = CONCAT(
    '<ZWOLNIENIE>\n',
    '<DATA_ZWOLNIENIA>',t.data_zmiany,'</DATA_ZWOLNIENIA>\n',
    '</ZWOLNIENIE>\n','</UCZESTNIK>\n')
    ;

    UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
    UPDATE t_ppk SET xmlpoz1 = CONCAT('\n<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');

    SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk LIMIT 1);

    IF LENGTH(IFNULL(_XML,''))>1 THEN
        SELECT _XML;
    ELSE
        SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
    END IF;

    DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;

END IF; -- ZWOLNIENIE.UCZESTNIKA


-- deklaracje uczestnika ppk
IF (_MODE = 'SKLADKA.PPK') THEN

    CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

    drop table if exists t_ppk_dane;
    create temporary table t_ppk_dane (
    guid VARCHAR(38),
    rok VARCHAR(4),
    miesiac VARCHAR(2),
    skl_za_okres VARCHAR(10),
    ucz_war_pod DOUBLE(16,2),
    ucz_war_dod DOUBLE(16,2),
    fir_war_pod DOUBLE(16,2),
    fir_war_dod DOUBLE(16,2),
    ucz_obniz_skl_dod VARCHAR(1),

    procSkladPodstPPKpracow DOUBLE(16,2),
    procSkladDodPPKpracow DOUBLE(16,2),
    procSkladPodstPPKpracod DOUBLE(16,2),
    procSkladDodPPKpracod DOUBLE(16,2),

    ucz_war_pod2 DOUBLE(16,2),
    ucz_war_dod2 DOUBLE(16,2),
    fir_war_pod2 DOUBLE(16,2),
    fir_war_dod2 DOUBLE(16,2),

    xml2 TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;


    if _Param_A = 'PLACE' then

        insert into t_ppk_dane
            select t.guid, t.rok, t.miesiac, concat(t.rok,'-',LPAD(t.miesiac,2,'0')), sum(PPKskladkaPracow), 0, sum(PPKskladkaPracod), 0,
            ifnull((select if(obnizonaskladkappk>0,'T','N') from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
                and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1),'N') as ucz_obniz_skl_dod,
            0, 0, 0, 0, 0, 0, 0, 0, ''
            from t_ppk t
            inner join place p ON t.guid=p.guid_pracownika AND t.rok = YEAR(p.datawyplaty) AND t.miesiac = MONTH(p.datawyplaty) AND p.deleted = 0
            group by t.guid
        ;

    update t_ppk_dane t set
        ucz_war_pod = ucz_war_pod + ifnull((select sum(PPKskladkaPracow) from prace_zlecone where deleted=0 and guid_pracownika = t.guid and YEAR(datawyplaty)=t.rok and MONTH(datawyplaty)=t.miesiac),0),
        fir_war_pod = fir_war_pod + ifnull((select sum(PPKskladkaPracod) from prace_zlecone where deleted=0 and guid_pracownika = t.guid and YEAR(datawyplaty)=t.rok and MONTH(datawyplaty)=t.miesiac),0);

    end if;


    if _Param_A = 'PRACE_ZLECONE' then

        insert into t_ppk_dane
            select t.guid, t.rok, t.miesiac, concat(t.rok,'-',LPAD(t.miesiac,2,'0')), sum(PPKskladkaPracow), 0, sum(PPKskladkaPracod), 0,
            (select if(obnizonaskladkappk>0,'T','N') from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
                and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1) as ucz_obniz_skl_dod,
            0, 0, 0, 0, 0, 0, 0, 0, ''
            from t_ppk t
            inner join prace_zlecone p ON t.guid=p.guid_pracownika AND t.rok = YEAR(p.datawyplaty) AND t.miesiac = MONTH(p.datawyplaty) AND p.deleted = 0
            group by t.guid
        ;

    update t_ppk_dane t set
        ucz_war_pod = ucz_war_pod + ifnull((select sum(PPKskladkaPracow) from place where deleted=0 and guid_pracownika = t.guid and YEAR(datawyplaty)=t.rok and MONTH(datawyplaty)=t.miesiac),0),
        fir_war_pod = fir_war_pod + ifnull((select sum(PPKskladkaPracod) from place where deleted=0 and guid_pracownika = t.guid and YEAR(datawyplaty)=t.rok and MONTH(datawyplaty)=t.miesiac),0);

    end if;

-- tutaj wstawiam podzial porpocjonalny miedzy skladkami podstawowa i dodatkowa, dla uczestnika i dla pracodawcy
-- pobieranie stawek z badaniem zmian, niestety
    update t_ppk_dane t set
    procSkladPodstPPKpracow =
    (select procSkladPodstPPKpracow from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
    and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1),

    procSkladDodPPKpracow =
    (select procSkladDodPPKpracow from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
    and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1),

    procSkladPodstPPKpracod =
    (select procSkladPodstPPKpracod from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
    and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1),

    procSkladDodPPKpracod =
    (select procSkladDodPPKpracod from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
    and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1)
    ;

    update t_ppk_dane set
    ucz_war_pod2 = _Rnd2(ucz_war_pod * procSkladPodstPPKpracow/(procSkladPodstPPKpracow+procSkladDodPPKpracow)),
    fir_war_pod2 = _Rnd2(fir_war_pod * procSkladPodstPPKpracod/(procSkladPodstPPKpracod+procSkladDodPPKpracod))
    ;

    update t_ppk_dane set
    ucz_war_dod2 = ucz_war_pod - ucz_war_pod2,
    fir_war_dod2 = fir_war_pod - fir_war_pod2
    ;

/*
(select if(obnizonaskladkappk>0,'T','N') from pracownicy_ppk where guid_pracownika=t.guid and deleted=0
                and oddnia<= last_day(concat(t.rok,'-',t.miesiac,'-01')) order by oddnia desc limit 1)
*/

    update t_ppk_dane t set t.xml2 = CONCAT(
        '<SKLADKA>\n',
        '<SKL_ZA_OKRES>',skl_za_okres,'</SKL_ZA_OKRES>\n',
        '<UCZ_WAR_POD>',ucz_war_pod2,'</UCZ_WAR_POD>\n',
        '<UCZ_WAR_DOD>',ucz_war_dod2,'</UCZ_WAR_DOD>\n',
        '<FIR_WAR_POD>',fir_war_pod2,'</FIR_WAR_POD>\n',
        '<FIR_WAR_DOD>',fir_war_dod2,'</FIR_WAR_DOD>\n',
        '<UCZ_OBNIZ_SKL_POD>',ucz_obniz_skl_dod,'</UCZ_OBNIZ_SKL_POD>\n',
        '</SKLADKA>\n','</UCZESTNIK>\n')
    ;

    UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
    UPDATE t_ppk SET xmlpoz1 = CONCAT('<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');


    SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk LIMIT 1);

    IF LENGTH(IFNULL(_XML,''))>1 THEN
        SELECT _XML;
    ELSE
        SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
    END IF;

    /*
    DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;
    */

END IF; -- SKLADKA.PPK

IF (_MODE = 'KOREKTA.SKLADKI.PPK') THEN

    CALL pl_ppk('NAGLOWEK', '', _Param_A, '', '', _MODE, '', '','');

    drop table if exists t_ppk_dane;
    create temporary table t_ppk_dane (
    guid VARCHAR(38),
    rok VARCHAR(4),
    miesiac VARCHAR(2),
    skl_za_okres VARCHAR(10),
    ucz_war_pod DOUBLE(16,2),
    ucz_war_dod DOUBLE(16,2),
    fir_war_pod DOUBLE(16,2),
    fir_war_dod DOUBLE(16,2),
    xml2 TEXT,
    KEY guid (guid)
    ) DEFAULT CHARSET=utf8;



-- skad dane - pomysl jest, zeby to zrobic przez zapisy stornujace i wyciaganie roznic miedzy zapisem a strono
-- na razie wstawiam -1, zeby plik wychodzil poprawny (kwoty musza byc ujemne)

    if _Param_A = 'PLACE' then
        insert into t_ppk_dane
        SELECT t.guid, t.rok, t.miesiac, concat(p.rok,'-',LPAD(p.miesiac,2,'0')),
        -1,-1,-1,-1,
        ''
        from t_ppk t
        inner join place p ON t.guid=p.guid_pracownika AND t.rok = p.rok AND t.miesiac = p.miesiac
        group by t.guid;
    END IF;

    if _Param_A = 'PRACE_ZLECONE' then
        insert into t_ppk_dane
        SELECT t.guid, t.rok, t.miesiac, concat(p.rok,'-',LPAD(p.miesiac,2,'0')),
        -1,-1,-1,-1,
        ''
        from t_ppk t
        inner join prace_zlecone p ON t.guid=p.guid_pracownika AND t.rok = p.rok AND t.miesiac = p.miesiac
        group by t.guid;
    END IF;



    update t_ppk_dane t set t.xml2 = CONCAT(
        '<DANE_KOREKT>\n',
        '<KOREKTA>\n',
        '<SKL_ZA_OKRES>',skl_za_okres,'</SKL_ZA_OKRES>\n',
        '<UCZ_WAR_POD>',ucz_war_pod,'</UCZ_WAR_POD>\n',
        '<UCZ_WAR_DOD>',ucz_war_dod,'</UCZ_WAR_DOD>\n',
        '<FIR_WAR_POD>',fir_war_pod,'</FIR_WAR_POD>\n',
        '<FIR_WAR_DOD>',fir_war_dod,'</FIR_WAR_DOD>\n',
        '</KOREKTA>\n','</DANE_KOREKT>\n','</UCZESTNIK>\n')
    ;

    UPDATE t_ppk SET xmlpoz1 = (SELECT GROUP_CONCAT(CONCAT(xml1,'\n',xml2) SEPARATOR '') FROM t_ppk_dane td, t_ppk_uczestnicy tu WHERE td.guid=tu.guid);
    UPDATE t_ppk SET xmlpoz1 = CONCAT('<DANE_UCZESTNIKA>\n',xmlpoz1,'</DANE_UCZESTNIKA>\n');


    SET _XML := (SELECT CONCAT(xmlnag,xmlnag2,xmlpoz1,xmlpoz2,xmlpoz3,xmlpoz4,'</PPK>') FROM t_ppk LIMIT 1);

    IF LENGTH(IFNULL(_XML,''))>1 THEN
        SELECT _XML;
    ELSE
        SELECT _MODE; -- zwracamy cokolwiek, aby uniknać komunikatu "Cursor not returned from query"
    END IF;

    DROP TABLE IF EXISTS t_ppk;
	drop table if exists t_ppk_uczestnicy;
	drop table if exists t_ppk_dane;

END IF; -- KOREKTA.SKLADKI.PPK

/*
czesc zwiazana z importem plikow
wciaganie samego pliku z serwera i podamiana danych - czyli calosc operacji
dla obslugi pliku z programu bedzie trzeba zmienic kawalek
call pl_ppk('XML_LOAD','','','',LOAD_FILE('$plik'),'','','','');
LOAD_FILE laduje plik do zmiennej
*/
	IF _MODE = 'XML_LOAD' THEN
		
		DROP TABLE IF EXISTS t_xml;
		CREATE TEMPORARY TABLE t_xml (xmltext LONGTEXT) DEFAULT CHARSET=utf8;
		-- CREATE TABLE t_xml (xmltext LONGTEXT);

		-- LOAD DATA LOCAL INFILE '\\home\\waliant\\Pobrane\\import_test.xml' 
		-- INTO TABLE `t_xml` FIELDS TERMINATED BY '\r\n' LINES TERMINATED BY '\r\n' 
		-- SET _XML = LOAD_FILE('\\home\\waliant\\Pobrane\\import_test.xml');
-- 		set @XML = _XML;Stanowisko dowodzenia jak na lotniskowcu (no, prawie), wygoda mocno średnia

 		INSERT INTO t_xml VALUES(_Param_C);

		-- select * from t_xml;

		DROP TABLE IF EXISTS t_xml2;
		CREATE TABLE t_xml2 (guid LONGTEXT, id_ppk LONGTEXT, PZIF_RACH_PPK LONGTEXT, liczba1 INT(11), liczba2 INT(11), liczba3 INT(11)) DEFAULT CHARSET=utf8;

		INSERT INTO t_xml2
		SELECT
			IFNULL(extractvalue(xmltext,'//UCZESTNIK/ID_KADRY'),'') AS guid,
			IFNULL(ExtractValue(xmltext,'//NUMER_PPK/ID_PPK'),'') AS id_ppk,
			IFNULL(ExtractValue(xmltext,'//NUMER_PPK/PZIF_RACH_PPK'),'') AS PZIF_RACH_PPK,
			IFNULL(extractvalue(xmltext,'count(//UCZESTNIK/ID_KADRY)'),0) AS liczba1,
			IFNULL(extractvalue(xmltext,'count(//NUMER_PPK/ID_PPK)'),0) AS liczba2,
			IFNULL(extractvalue(xmltext,'count(//NUMER_PPK/PZIF_RACH_PPK)'),0) AS liczba3
		FROM t_xml; 

		SET @liczba = (select liczba1 from t_xml2 limit 1);

		DROP TABLE IF EXISTS t_xml3;
		CREATE TABLE t_xml3 
			(guid VARCHAR(38), id_ppk VARCHAR(50), PZIF_RACH_PPK VARCHAR(50), KEY guid (guid)) DEFAULT CHARSET=utf8;

		SET _LP =1;
		REPEAT
			INSERT INTO t_xml3
				SELECT SUBSTRING_INDEX(guid,' ',1), SUBSTRING_INDEX(id_ppk,' ',1), SUBSTRING_INDEX(PZIF_RACH_PPK,' ',1) FROM t_xml2;
				
			UPDATE t_xml2 SET 
				guid = REPLACE(guid, CONCAT(SUBSTRING_INDEX(guid,' ',1),' '),''),
				id_ppk = REPLACE(id_ppk, CONCAT(SUBSTRING_INDEX(id_ppk,' ',1),' '),''),
				PZIF_RACH_PPK = REPLACE(PZIF_RACH_PPK, CONCAT(SUBSTRING_INDEX(PZIF_RACH_PPK,' ',1),' '),'');

		SET _LP = _LP+1;
		UNTIL _LP > @liczba 
		END REPEAT;

		update Pracownicy p, t_xml3 t SET p.id_ppk = t.id_ppk, p.PZIF_RACH_PPK = t.PZIF_RACH_PPK WHERE p.guid = t.guid;

	END IF;

-- data przystapienia podawana w parametrze G
	IF _MODE = 'REJESTRACJA_AUTOMATYCZNA' THEN

		DROP TABLE IF EXISTS t_pracownicy2;
		CREATE TABLE t_pracownicy2 LIKE t_pracownicy;
		INSERT INTO t_pracownicy2 SELECT * FROM t_pracownicy;

		DELETE from t_pracownicy2 WHERE guid in (select distinct guid_pracownika from pracownicy_ppk where deleted=0);

		SET _rok = YEAR(_Param_G);
		SET _par1 = (SELECT valueN FROM IReg WHERE idkey = 'PPKskladPodstPracow' AND rok = _rok);
		-- SET _par2 = (SELECT valueN FROM IReg WHERE idkey = 'PPKskladDodMaxPracow' AND rok = _rok);
		SET _par3 = (SELECT valueN FROM IReg WHERE idkey = 'PPKskladPodstPracod' AND rok = _rok);
		-- SET _par4 = (SELECT valueN FROM IReg WHERE idkey = 'PPKskladDodMaxPracod' AND rok = _rok);
		-- SET _par5 = (SELECT valueB FROM IReg WHERE idkey = 'PPKskladPracObniz' AND rok = _rok);

		INSERT INTO pracownicy_ppk (GUID_Pracownika, OdDnia, aktywnyPPK,
			dataPrzystapieniaPPK,
			procSkladPodstPPKpracow,
			procSkladkiPodstOd,
			procSkladDodPPKpracow,
			procSkladkiDodOd,
			procSkladPodstPPKpracod,
			procSkladkiPodstPracodOd,
			procSkladDodPPKpracod,
			procSkladkiDodatkPracodOd,
			ObnizonaSkladkaPPK)
		SELECT guid, _Param_G, 1,
			_Param_G,
			_par1,
			_Param_G,
			0,	
			_Param_G,
			_par3,
			_Param_G,
			0,
			_Param_G,
			0
		FROM t_pracownicy2;


		IF (SELECT count(*) FROM t_pracownicy2) = 0 THEN
			select 'brak danych';
		ELSE 
			 SELECT count(*) FROM t_pracownicy2;
		END IF;
	
        DROP TABLE IF EXISTS t_pracownicy2;

	END IF;
/*
jest to wariant zestawienia specjalnie dla Pliszki, uzywany w zestawieniu sqd po to, zeby potem dane wyeksportowac do Excela, na potrzeby firmy Investors
w filtrze podajemy rok i miesiac
CALL pl_ppk('SKLADKA.PPK.SQD', '', '', '', '', '', '', '2024', '5');
*/
IF (_MODE = 'SKLADKA.PPK.SQD') THEN
  SET _rok = _Param_F;
  SET _miesiac = _Param_G;

  drop table if exists t_ppk_wynik;
  create temporary table t_ppk_wynik (
  guid VARCHAR(38),
  pesel VARCHAR(15),
  nazwisko VARCHAR(50),
  imie VARCHAR(30),
  rok VARCHAR(4),
  miesiac VARCHAR(2),
  skl_pracownika DOUBLE(16,2),
  skl_pracodawcy DOUBLE(16,2),
  KEY guid (guid)
  ) DEFAULT CHARSET=utf8;


  insert into t_ppk_wynik
  select o.guid, o.nrpesel, o.nazwisko, o.imie1, _rok, _miesiac, sum(PPKskladkaPracow), sum(PPKskladkaPracod)
  from place p
  inner join osoby o on o.GUID = p.GUID_Pracownika
  where YEAR(p.datawyplaty) = _rok AND MONTH(p.datawyplaty) = _miesiac AND p.deleted= 0
  and (PPKskladkaPracow<>0 OR PPKskladkaPracod <>0)
  group by o.guid
  ;

  insert into t_ppk_wynik
  select o.guid, o.nrpesel, o.nazwisko, o.imie1, _rok, _miesiac, sum(PPKskladkaPracow), sum(PPKskladkaPracod)
  from prace_zlecone p
  inner join osoby o on o.GUID = p.GUID_Pracownika
  where YEAR(p.datawyplaty) = _rok AND MONTH(p.datawyplaty) = _miesiac AND p.deleted= 0
  and (PPKskladkaPracow<>0 OR PPKskladkaPracod <>0)
  group by o.guid
  ;

END IF;

END$$

DELIMITER ;
