 DELIMITER $$

DROP PROCEDURE IF EXISTS `e_dekl_jpk_dane2`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `e_dekl_jpk_dane2`(
    IN _MODE VARCHAR(38),
    IN _GUID VARCHAR(38),
    IN _rok VARCHAR(38),
    IN _miesiac VARCHAR(38),
    IN _NaDzien VARCHAR(10),
    IN _OdDnia VARCHAR(10),
    IN _DoDnia VARCHAR(10),
    IN _XML LONGTEXT,
    IN _Param_A VARCHAR(50),
    IN _Param_B VARCHAR(50),
    IN _Param_C VARCHAR(50), -- okresla czy wybieramy opcje DEBUG czy generowanie zestawienia
    IN _Param_D VARCHAR(50)  -- okresla wybrane zestawienie JPK
    )
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 cSL INT(11);
    DECLARE _liczba_wierszy INT(11);
    DECLARE _wartosc_faktur VARCHAR(18);
    DECLARE _wartosc_dok VARCHAR(18);
    DECLARE _wartosc_dok2 VARCHAR(18);
    DECLARE _podatek_s VARCHAR(18);
    DECLARE _podatek_z VARCHAR(18);
    DECLARE _proc_struktura DOUBLE(16,2);
    DECLARE _waluta VARCHAR(3);

    DECLARE _rokbo SMALLINT(11);
    DECLARE _saldo_poczatkowe VARCHAR(18);
    DECLARE _saldo_koncowe VARCHAR(18);
    DECLARE _RokOdDnia, _RokDoDnia, _zois VARCHAR(10);

    SET cSL := 2;

    SET _GUID = IFNULL(_GUID, '');
    SET SESSION group_concat_max_len = 1024*1024*1024;
    SET SESSION tmp_table_size = 1024 * 1024 * 512;      -- 512 MB
    SET SESSION max_heap_table_size = 1024 * 1024 * 512; -- 512 MB


/*
plik jpk, druga czesc dla kolejnych deklaracji jpk/xml, zeby nie grzebac w tym, co dziala
na razie wersja JPK_KPiR3
CALL e_dekl_jpk_dane2('JPK_PKPIR3', '', '', '', '', '2025-01-01','2025-06-20', '', '_RAPORT', '', '','');
SET @session.globals.Owner='SKOK';
*/

CREATE TEMPORARY TABLE t_jpk (
    guid VARCHAR(38),
    xmlnag LONGTEXT, -- naglowek i podmiot1
    xmlnag2 LONGTEXT, -- pusty na razie
    xmlpoz1 LONGTEXT, -- kontrahenci
    xmlpoz2 LONGTEXT, -- zois
    xmlpoz3 LONGTEXT, -- dziennik + zapisy
    xmlpoz4 LONGTEXT, -- ctrl
    xmlpoz5 LONGTEXT, -- krd
KEY guid (guid)) DEFAULT CHARSET=utf8;

SET NAMES "utf8"; -- ??? bez tego sa powalone polskie znaki

IF (_MODE = 'JPK_PKPIR3') THEN

    INSERT INTO t_jpk VALUES ('JPK_PKPIR3','','','','','','','');

    SET @xml.IC = 1;
    SET _XMLnag = '<?xml version="1.0" encoding="UTF-8"?>\n';
    SET _XMLnag = CONCAT(_XMLnag,
        '<JPK xmlns="http://jpk.mf.gov.pl/wzor/2024/09/04/09041/"\n',
        'xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/">\n');

    -- <Naglowek>
    SET _KodUS = '';
    SELECT _varSTR_NOTNULL(kod_urzedu) INTO _KodUS FROM US
    WHERE  guid = (SELECT valueA FROM IReg WHERE idpath='INT\\SYSTEM\\MOTLAWA\\DaneFirmy' AND idkey='Urzad_skarbowy');

    IF IFNULL(_KodUS,'') = '' THEN
        SELECT _varSTR_NOTNULL(kod_urzedu) INTO _KodUS FROM urzedy_skarbowe
        WHERE  kod_urzedu = (SELECT valueA FROM IReg WHERE idpath='INT\\SYSTEM\\MOTLAWA\\DaneFirmy' AND idkey='Urzad_skarbowy');
    END IF;

    SET _RokOdDnia = _OdDnia;
    SET _RokDoDnia = _DoDnia;

    SET _XMLnag = CONCAT(_XMLnag,'<Naglowek>\n',' <KodFormularza kodSystemowy="','JPK_KR_PD (1)',
						'" wersjaSchemy="','1-1','">','JPK_KR_PD','</KodFormularza>\n',
						' <WariantFormularza>', 1,'</WariantFormularza>\n',
						' <CelZlozenia>', 1,'</CelZlozenia>\n',
						' <DataWytworzeniaJPK>',CURRENT_DATE,'T',CURRENT_TIME,'</DataWytworzeniaJPK>\n',
						' <DataOd>', _OdDnia, '</DataOd>\n',
						' <DataDo>', _DoDnia, '</DataDo>\n',
						' <RokDataOd>', _RokOdDnia, '</RokDataOd>\n',
						' <RokDataDo>', _RokDoDnia, '</RokDataDo>\n',
						' <DomyslnyKodWaluty>', 'PLN', '</DomyslnyKodWaluty>\n',
						' <KodUrzedu>', _KodUS, '</KodUrzedu>\n',
						'</Naglowek>\n'
						);

    SET @xml.IC = 0;
    SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<Podmiot1>\n');
				SET @xml.IC = @xml.IC + 1;
				CALL _IReg_Get('DaneFirmy', 'NIP', '0', 'STRING', _NIP, '(brak danych)');
				SET _NIP = REPLACE(_NIP, '-', '');
				SET @NIP = _NIP;
--                                 CALL _IReg_Get('DaneFirmy', 'REGON', '0', 'STRING', _REGON, '(brak danych)');
				CALL _IReg_Get('DaneFirmy', 'pelna_nazwa', '0', 'STRING', _PelnaNazwa, '');

				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<IdentyfikatorPodmiotu>\n');
				SET @xml.IC = @xml.IC + 1;
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:NIP>', _NIP, '</etd:NIP>\n');

				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:PelnaNazwa>', REPLACE(_PelnaNazwa, CHAR(38), ' and '), '</etd:PelnaNazwa>\n');

--                                 SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:REGON>', _REGON, '</etd:REGON>\n');
				SET @xml.IC = @xml.IC - 1;
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '</IdentyfikatorPodmiotu>\n');


    SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<Adres>\n');
    SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<AdresPol>\n');
				SET _zm01 := '';
				CALL _IReg_Get('DaneFirmy', 'Kraj', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:KodKraju>', _zm01, '</etd:KodKraju>\n');
				CALL _IReg_Get('Owner', 'Wojewodztwo', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:Wojewodztwo>', _zm01, '</etd:Wojewodztwo>\n');
				CALL _IReg_Get('Owner', 'Powiat', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:Powiat>', _zm01, '</etd:Powiat>\n');
				CALL _IReg_Get('Owner', 'Gmina', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:Gmina>', _zm01, '</etd:Gmina>\n');
				CALL _IReg_Get('DaneFirmy', 'Ulica', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:Ulica>', _zm01, '</etd:Ulica>\n');
				CALL _IReg_Get('Owner', 'Nr_Domu', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:NrDomu>', _zm01, '</etd:NrDomu>\n');
				CALL _IReg_Get('Owner', 'Nr_Lokalu', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = IF(IFNULL(_zm01,'')<>'',CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:NrLokalu>', _zm01, '</etd:NrLokalu>\n'),_XMLnag);
				CALL _IReg_Get('Owner', 'Miasto', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:Miejscowosc>', _zm01, '</etd:Miejscowosc>\n');
				CALL _IReg_Get('Owner', 'Code', '0', 'STRING',_zm01, '(brak danych)');
				SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<etd:KodPocztowy>', _zm01, '</etd:KodPocztowy>\n');

    SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '</AdresPol>\n');
    SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '</Adres>\n');

    SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '</Podmiot1>\n');

			-- SET @_XMLnag = _XMLnag;
    UPDATE t_jpk SET xmlnag = _XMLnag WHERE guid = 'JPK_PKPIR3';
-- koniec naglowka, dalej juz same dane


	SET @databo = CONCAT(YEAR(_DoDnia),'-01-01');
	SET _rokbo = YEAR(@databo);

	DROP TABLE IF EXISTS t_info;
	CREATE TEMPORARY TABLE t_info (
		P_1 DOUBLE(16,2) DEFAULT 0,
		P_2 DOUBLE(16,2) DEFAULT 0,
		P_3 DOUBLE(16,2) DEFAULT 0,
		P_4 DOUBLE(16,2) DEFAULT 0,
		xml TEXT
	) DEFAULT CHARSET=utf8;

	DROP TABLE IF EXISTS t_spis;
	CREATE TEMPORARY TABLE t_spis (
		P_5A VARCHAR(10),
		P_5B DOUBLE(16,2) DEFAULT 0,
		xml TEXT
	) DEFAULT CHARSET=utf8;

	DROP TABLE IF EXISTS t_kpr;
	CREATE TEMPORARY TABLE t_kpr (
		guid VARCHAR(38),
		kontrguid VARCHAR(38),
		K_1 INT(11) DEFAULT 0,
		K_2 VARCHAR(10),
		K_3 VARCHAR(50),
		K_4 VARCHAR(250),
		K_5 VARCHAR(250),
		K_6 VARCHAR(250),
		K_7 DOUBLE(16,2) DEFAULT 0,
		K_8 DOUBLE(16,2) DEFAULT 0,
		K_9 DOUBLE(16,2) DEFAULT 0,
		K_10 DOUBLE(16,2) DEFAULT 0,
		K_11 DOUBLE(16,2) DEFAULT 0,
		K_12 DOUBLE(16,2) DEFAULT 0,
		K_13 DOUBLE(16,2) DEFAULT 0,
		K_14 DOUBLE(16,2) DEFAULT 0,
		K_15 DOUBLE(16,2) DEFAULT 0,
		K_16A VARCHAR(250),
		K_16B DOUBLE(16,2) DEFAULT 0,
		K_17 VARCHAR(250),
		xml TEXT,
	KEY guid (guid),
	KEY kontrguid (kontrguid)
	) DEFAULT CHARSET=utf8;

	-- sekcja dla tabeli t_spis nie jest obslugiwana, innymi slowy program nie obsluguje w ogole sytuacji inwentaryzacji w ciagu roku
	-- procedura obsluguje taki przypadek, jako brak danych

	INSERT INTO t_kpr
	SELECT guid, kontrguid,
		lpkpr AS K_1,
		datawplywu AS K_2,
		nrdokfin AS K_3,
		kontrnazwa AS K_4,
		kontradres AS K_5,
		opis AS K_6,
		IF(kolumnaKPR = 7,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_7,
		IF(kolumnaKPR = 8,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_8,
		0 AS K_9,
		IF(kolumnaKPR = 10,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_10,
		IF(kolumnaKPR = 11,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_11,
		IF(kolumnaKPR = 12,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_12,
		IF(kolumnaKPR = 13,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_13,
		IF(kolumnaKPR = 14,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_14,
		0 AS K_15,
		IF(kolumnaKPR = 16,_varStr(_Rnd2(netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd)),'') AS K_16A, -- tego nie obslugujemy(?)
		IF(kolumnaKPR = 17,netto+bezodliczen+vat_bez_odliczenia_paliwo+vat_bez_odliczenia_pojazd,0) AS K_16B,
		uwagi AS K_17,
		'' AS xml
	FROM opng
	WHERE deleted=0 AND kolumnakpr>0
	AND datawplywu >= _OdDnia AND datawplywu <= _DoDnia
	ORDER BY lpKPR
	;


	-- tutaj wrzucic badanie tresci i kontrole znakow
	UPDATE t_kpr SET
		K_9 = K_7 + K_8,
		K_3 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(K_3,'<',''),'>',''),'&','and'),'\n',''),CHAR(31),''),'\r',' '),
		K_4 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(K_4,'<',''),'>',''),'&','and'),'\n',''),CHAR(31),''),'\r',' '),
		K_5 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(K_5,'<',''),'>',''),'&','and'),'\n',''),CHAR(31),''),'\r',' '),
		K_6 = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(K_6,'<',''),'>',''),'&','and'),'\n',''),CHAR(31),''),'\r',' '),
		K_17 = IFNULL(K_17,'')
	;

	INSERT INTO t_info
	SELECT
		ifnull((select wart_remanent_na_bo from lata_obrachunkowe where idn= _rokbo),0) AS P1,
		ifnull((select wart_remanent_na_bz from lata_obrachunkowe where idn= _rokbo),0) AS P2,
		SUM(K_9) AS P3,
		SUM(K_10 + K_11 + K_14) AS P4,
		'' AS xml
	FROM t_kpr
	;

		IF _Param_A <> 'RAPORT' THEN

			UPDATE t_info SET xml =
				CONCAT('<PKPIRInfo>\n',
				'<P_1>',P_1,'</P_1>\n',
				'<P_2>',P_2,'</P_2>\n',
				'<P_3>',P_3,'</P_3>\n',
				'<P_4>',P_4,'</P_4>\n',
				'</PKPIRInfo>\n')
			;

			UPDATE t_jpk SET xmlpoz1 = (SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_info);

			UPDATE t_spis SET xml =
				CONCAT('<PKPIRSpis typ="G">\n',
				'<P_5A>',P_5A,'</P_5A>\n',
				'<P_5B>',P_5B,'</P_5B>\n',
				'</PKPIRSpis>\n')
			;

			UPDATE t_jpk SET xmlpoz2 = IFNULL((SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_spis),'');

		UPDATE t_kpr SET xml =
			CONCAT('<PKPIRWiersz typ="G">\n',
			'<K_1>',K_1,'</K_1>\n',
			'<K_2>',K_2,'</K_2>\n',
			'<K_3>',K_3,'</K_3>\n',
			'<K_4>',K_4,'</K_4>\n',
			'<K_5>',K_5,'</K_5>\n',
			'<K_6>',K_6,'</K_6>\n',
			'<K_7>',K_7,'</K_7>\n',
			'<K_8>',K_8,'</K_8>\n',
			'<K_9>',K_9,'</K_9>\n',
			'<K_10>',K_10,'</K_10>\n',
			'<K_11>',K_11,'</K_11>\n',
			'<K_12>',K_12,'</K_12>\n',
			'<K_13>',K_13,'</K_13>\n',
			'<K_14>',K_14,'</K_14>\n',
			'<K_15>',K_15,'</K_15>\n',
			IF(K_16A='','',CONCAT('<K_16A>',K_16A,'</K_16A>\n')),
			IF(K_16B='','',CONCAT('<K_16B>',K_16B,'</K_16B>\n')),
			IF(K_17='','',CONCAT('<K_17>',K_17,'</K_17>\n')),
			'</PKPIRWiersz>\n')
			;

			UPDATE t_jpk SET xmlpoz3 = (SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_kpr);

			SELECT COUNT(*) INTO _liczba_wierszy FROM t_kpr;
			SELECT SUM(_Rnd2(K_9)) INTO _wartosc_faktur FROM t_kpr;

			SET _XMLpoz = '';

			SET _XMLpoz = CONCAT(SPACE(@xml.IC*cSL), '<PKPIRCtrl>\n');
			SET _XMLpoz = CONCAT(_XMLpoz, SPACE(@xml.IC*cSL), '<LiczbaWierszy>',_liczba_wierszy,'</LiczbaWierszy>\n');
			SET _XMLpoz = CONCAT(_XMLpoz, SPACE(@xml.IC*cSL), '<SumaPrzychodow>',_wartosc_faktur,'</SumaPrzychodow>\n');
			SET _XMLpoz = CONCAT(_XMLpoz, SPACE(@xml.IC*cSL), '</PKPIRCtrl>\n');

			UPDATE t_jpk SET xmlpoz3 = CONCAT('\n',xmlpoz3,IFNULL(_XMLpoz,'brak_kpr'),'\n');



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

			CALL fr_ht_zest_jpk('ZAPIS', '', '', '', '', _OdDnia,_DoDnia, '', '', _Param_B, '',_MODE);

			SELECT _XML;

		ELSE
			SELECT _Param_A; -- 'RAPORT'  (zwracamy cokolwiek, aby uniknać komunikatu `Cursor not returned from query`)
		END IF;  -- IF _Param_A <> 'RAPORT'

/*
    DROP TABLE IF EXISTS t_info;
    DROP TABLE IF EXISTS t_spis;
    DROP TABLE IF EXISTS t_kpr;
*/













END IF; -- _MODE = 'JPK_PKPIR3'

END$$

DELIMITER ;
