 DELIMITER $$

DROP PROCEDURE IF EXISTS `e_dekl_jpk_dane`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `e_dekl_jpk_dane`(
    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), -- okresla numer pliku za dany okres dla JPK VAT3, okresla magazyn dla JPK MAG, okresla konto dla JPK WB
    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 kr w wersji pd, wstepny i finalny, wszystko tutaj, poza lista wywolania
-- CALL fr_ht_zest_jpk('JPK_KR', '', '', '', '', '2023-02-01','2023-02-28', '', '_RAPORT', '', '','');

CALL e_dekl_jpk_dane('JPK_KR_PD_DANE', '', '', '', '', '2025-01-01','2025-06-20', '', '_RAPORT', '', '','');

SET @session.globals.Owner='SKOK';
ograniczenie na wielkosc pliku to max_allowed_packet = 16777216 -  jest to zmienna, ktorej nie mozna zmienic w sesji
33554432, zmienilem na 99 MB, potem na 130M
dla slave_max_allowed_packet = 1073741824
zamkniecie okresu/miesiaca oznacza nadanie numerow w polu nr_pozycji w tabeli zapisy. Tam nie moga byc zera i nie moga byc duble.
*/

    DROP TABLE IF EXISTS t_jpk;
    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, -- rpd
    KEY guid (guid)) DEFAULT CHARSET=utf8;

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

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

    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;

    -- TODO tutaj wstawic badanie zakresu roku obrotowego, na razie na sztywno (lata obrachunkowe)
    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');

		/* obsluga dodatkowych znacznikow
    Znacznik_EST  TINYINT     NULL,
    Znacznik_MSSF TINYINT     NULL
  */
    SELECT valueb INTO _zm01 FROM IReg WHERE idkey = 'JPK_Znacznik_EST';
    IF _zm01 = '1' THEN
     SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<Znacznik_EST>', _zm01, '</Znacznik_EST>\n');
    END IF;

    SELECT valueb INTO _zm01 FROM IReg WHERE idkey = 'JPK_Znacznik_MSSF';
    IF _zm01 = '1' THEN
     SET _XMLnag = CONCAT(_XMLnag, SPACE(@xml.IC*cSL), '<Znacznik_MSSF>', _zm01, '</Znacznik_MSSF>\n');
    END IF;


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

			-- SET @_XMLnag = _XMLnag;
		UPDATE t_jpk SET xmlnag = _XMLnag WHERE guid = 'JPK_KR_PD';


IF (_MODE = 'JPK_KR_PD_DANE') THEN

    SET @databo = CONCAT(YEAR(_DoDnia),'-01-01');
    -- select ValueD from IReg where idkey="Data bilansu"
    SET _rokbo = YEAR(@databo);
    -- SELECT dl_potomka FROM plankont WHERE poziom = 0 AND rok = _rokbo INTO @kod1;
    -- IF @session.globals.Owner='PBUCH' THEN 	SET @kod1=3; END IF;
    SELECT valueI INTO @kod1 FROM IReg WHERE idkey='Konta_pierwsze_znaki_bez_separatora';

    SET _liczba_wierszy = 0; -- chodzi o wiersze w dzienniku, ktore nie maja numerow, czy nie sa zamkniete
    SET _zois = 'ZOiS7'; -- rodzaj dzialanosci, 7 to jednostki pozostale, na sztywno na razie - dodac klucz

    DROP TABLE IF EXISTS t_salda;
    CREATE TEMPORARY TABLE t_salda (
    SymbolKonta VARCHAR(50) DEFAULT '',
    konto VARCHAR(50) DEFAULT '',
    KodZespolu VARCHAR(3) DEFAULT NULL,
    BO_WN DECIMAL(18,2) DEFAULT NULL,
    BO_MA DECIMAL(18,2) DEFAULT NULL,
    OBR_OKR_WN DECIMAL(18,2) DEFAULT NULL,
    OBR_OKR_MA DECIMAL(18,2) DEFAULT NULL,
    OBR_NAR_WN DECIMAL(18,2) DEFAULT NULL,
    OBR_NAR_MA DECIMAL(18,2) DEFAULT NULL,
    SALDO_WN DECIMAL(18,2) DEFAULT NULL,
    SALDO_MA DECIMAL(18,2) DEFAULT NULL,
    TypKonta VARCHAR(13) DEFAULT NULL, -- CHARACTER SET utf8 DEFAULT NULL,
    jpkcit VARCHAR(20),
    jpkcit2 VARCHAR(20),
    jpkcit3 VARCHAR(20),
    KEY SymbolKonta (SymbolKonta),
    KEY konto (konto),
    KEY KodZespolu (KodZespolu)
    ) DEFAULT CHARSET=utf8
    ;

    DROP TABLE IF EXISTS t_zapisy;
    CREATE TEMPORARY TABLE t_zapisy LIKE zapisy;
    INSERT INTO t_zapisy
    SELECT Z.*
    FROM zapisy Z
    JOIN plankont P ON Z.konto = P.symbol AND P.rok = Z.rok
    WHERE Z.data_dowodu >= _OdDnia AND Z.data_dowodu <= _DoDnia
    -- AND P.pozabilans=0
    -- AND IF(@session.globals.Owner='SKOK', P.pozabilans=0, TRUE) -- na podstawie rozmowy tel. z glowna ksiegowa SKOK
    ;

		-- char(31) - chyba twarda spacja, crist
		UPDATE t_zapisy SET opis = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(opis,'<',''),'>',''),'&','and'),'\n',''),CHAR(31),''),'\r',' ');

		UPDATE t_zapisy SET opis = 'brak' WHERE opis='';

		IF @session.globals.Owner='SKOK' THEN
			UPDATE t_zapisy SET opis = REPLACE(REPLACE(opis,char(25),'e'),char(5),'a');
		END IF;

		UPDATE t_zapisy SET uid = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(uid,'<',''),'>',''),'&','and'),'\n',''),CHAR(31),''),'\r',' ');

		INSERT INTO t_salda
		SELECT
		P.symbol AS SymbolKonta,
		P.symbol_fmt AS konto,
		LEFT(symbol_fmt,@kod1) AS KodZespolu,
		-- SUBSTRING_INDEX(Z.konto,'|',3) AS KodKategorii,
		-- SUBSTRING_INDEX(P.symbol_fmt,'-',3) AS KodKategorii,
		SUM(IF((Z.rodzaj_fk IN (1,2)) AND (Z.stronaWN),Z.kwota,0)) AS BO_WN,
		SUM(IF((Z.rodzaj_fk IN (1,2)) AND NOT (Z.stronaWN),Z.kwota,0)) AS BO_MA,
		SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>= _OdDnia), Z.kwota,0)) AS OBR_OKR_WN,
		SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>= _OdDnia), Z.kwota,0)) AS OBR_OKR_MA,
		SUM(IF( (Z.stronaWN) ,Z.kwota,0)) AS OBR_NAR_WN,
		SUM(IF(NOT (Z.stronaWN) ,Z.kwota,0)) AS OBR_NAR_MA,
		ROUND(IF(ABS(SUM(IF(Z.stronaWN,Z.kwota,0)))>ABS(SUM(IF(Z.stronaWN,0,Z.kwota))) ,SUM(IF(Z.stronaWN,Z.kwota,-Z.kwota)),0),4) AS SALDO_WN,
		ROUND(IF(ABS(SUM(IF(Z.stronaWN,Z.kwota,0)))<=ABS(SUM(IF(Z.stronaWN,0,Z.kwota))) ,SUM(IF(Z.stronaWN,-Z.kwota,Z.kwota)),0),4) AS SALDO_MA,
		P.typ_konta AS TypKonta,
		P.jpkcit,
		P.jpkcit2,
		P.jpkcit3
		FROM  t_zapisy Z
		JOIN plankont P ON Z.konto = P.symbol AND P.rok = Z.rok
		WHERE Z.konto<>'' AND (Z.data_dowodu<= _DoDnia) AND (Z.data_dowodu>= @databo) AND Z.RodzajDowodu<>'BZ'
		-- AND IF(@session.globals.Owner='SKOK', P.pozabilans=0, TRUE) -- na podstawie rozmowy tel. z glowna ksiegowa SKOK
		-- AND P.pozabilans=0
		GROUP BY P.symbol_fmt;

    DROP TABLE IF EXISTS t_jpk_zois;
    CREATE TEMPORARY TABLE t_jpk_zois (
    guid VARCHAR(38) NOT NULL COMMENT 'symbol konta jako guid',
    S_1 VARCHAR(50) NOT NULL COMMENT 'Kod konta, czyli symbol_fmt',
    S_2 VARCHAR(255) COMMENT 'Nazwa konta',
    S_3 VARCHAR(50) COMMENT 'Identyfikator konta nadrzędnego',
    S_4 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Bilans otwarcia po stronie Winien',
    S_5 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Bilans otwarcia po stronie Ma',
    S_6 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Obroty po stronie Winien za okres',
    S_7 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Obroty po stronie Ma za okres',
    S_8 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Obroty narastająco po stronie Winien',
    S_9 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Obroty narastająco po stronie Ma',
    S_10 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Saldo końcowe po stronie Winien - kwota',
    S_11 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Saldo końcowe po stronie Ma - kwota',
    S_12_1 VARCHAR(20) COMMENT 'Znacznik konta wynikający z rozporządzenia w sprawie dodatkowego zakresu danych, o które należy uzupełnić prowadzone księgi rachunkowe',
    S_12_2 VARCHAR(20) COMMENT 'Dodatkowy znacznik konta wynikający z rozporządzenia w sprawie dodatkowego zakresu danych, o które należy uzupełnić prowadzone księgi rachunkowe',
    S_12_3 VARCHAR(20) COMMENT 'Dodatkowy znacznik konta wynikający z rozporządzenia w sprawie dodatkowego zakresu danych, o które należy uzupełnić prowadzone księgi rachunkowe (PD)',
    xml TEXT,
    KEY guid (guid),
    KEY S_1 (S_1)
    ) DEFAULT CHARSET=utf8mb4;

    DROP TABLE IF EXISTS t_jpk_dziennik;
    CREATE TEMPORARY TABLE t_jpk_dziennik (
    idnoper VARCHAR(38) NOT NULL COMMENT 'jako guid tabeli i idnoper z zapisu do grupowania i linkowni pozycji',
    D_1 VARCHAR(50) NOT NULL COMMENT 'Lp. zapisu w dzienniku -  unikalny numer zapisu, nr dekretu',
    D_2 VARCHAR(255) COMMENT 'Opis dziennika, nazwa dziennika czastkowego',
    D_3 VARCHAR(100) NOT NULL COMMENT 'Kod kontrahenta (T_1) niewymagany',
    D_4 VARCHAR(50) COMMENT 'Nr dowodu ksiegowego',
    D_5 VARCHAR(50) COMMENT 'Rodzaj dowodu (FV, WB, PK...)',
    D_6 DATE NOT NULL COMMENT 'Data operacji',
    D_7 DATE NOT NULL COMMENT 'Data dowodu',
    D_8 DATE NOT NULL COMMENT 'Data księgowania',
    D_9 VARCHAR(50) COMMENT 'Kod operatora / Imię i nazwisko',
    D_10 VARCHAR(512) COMMENT 'Opis operacji (wielkosc 512)',
    D_11 DECIMAL(15, 2) NOT NULL COMMENT 'Kwota operacji',
    D_12 VARCHAR(50) DEFAULT '' COMMENT 'Nr faktury KSeF',
    xml TEXT, -- tutaj xml naglowka dziennika
    xml2 TEXT, -- tutaj grupowane pozycje z kontozapis
    KEY idnoper (idnoper),
    KEY D_3 (D_3)
    ) DEFAULT CHARSET=utf8mb4;

    DROP TABLE IF EXISTS t_jpk_kontozapis;
    CREATE TABLE t_jpk_kontozapis (
    guid varchar(38) NOT NULL COMMENT 'guid zapisu',
    idnoper VARCHAR(38) NOT NULL COMMENT 'Powiązanie z D_1 z tabeli Dziennik',
    Z_1 VARCHAR(50) NOT NULL COMMENT 'Nr kolejny zapisu wewnątrz dekretu',
    Z_2 VARCHAR(512) NOT NULL COMMENT 'Opis linii (max 512 znaków)',
    Z_3 VARCHAR(50) NOT NULL COMMENT 'Kod konta (musi być w ZOiS S_1)',
    -- Strona Winien (Wn)
    Z_4 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Kwota PLN Wn',
    Z_5 DECIMAL(18,2) DEFAULT NULL COMMENT 'Kwota Waluta Wn',
    Z_6 VARCHAR(3) DEFAULT NULL COMMENT 'Kod Waluty Wn',
    -- Strona Ma
    Z_7 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Kwota PLN Ma',
    Z_8 DECIMAL(18,2) DEFAULT NULL COMMENT 'Kwota Waluta Ma',
    Z_9 VARCHAR(3) DEFAULT NULL COMMENT 'Kod Waluty Ma',
    xml TEXT,
    KEY guid (guid),
    KEY idnoper (idnoper)
    ) DEFAULT CHARSET=utf8mb4;

    DROP TABLE IF EXISTS t_jpk_ctrl;
    CREATE TEMPORARY TABLE t_jpk_ctrl (
    C_1 INT           NOT NULL,
    C_2 DECIMAL(18,2) NOT NULL,
    C_3 INT           NOT NULL,
    C_4 DECIMAL(18,2) NOT NULL,
    C_5 DECIMAL(18,2) NOT NULL,
    xml TEXT
    ) DEFAULT CHARSET=utf8mb4;

    DROP TABLE IF EXISTS t_jpk_kontrah;
    CREATE TEMPORARY TABLE t_jpk_kontrah (
    T_1 varchar(38) NOT NULL COMMENT 'guid kontrahenta', -- ale przechodzimy na idn, nie ma problemu z kodowaniem
    T_2 VARCHAR(3) NOT NULL, -- kod kraju nadania identyfikatora podatkowego
    T_3 VARCHAR(15) NOT NULL, -- nr podatkowy, czyli w sumie nip
    xml TEXT,
    KEY T_1 (T_1)
    ) DEFAULT CHARSET=utf8mb4;


    DROP TABLE IF EXISTS t_jpk_rpd;
    CREATE TEMPORARY TABLE t_jpk_rpd (
    K_1 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Przychody zwolnione z opodatkowania',
    K_2 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Przychody niepodlegające opodatkowaniu w roku bieżącym',
    K_3 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Przychody podlegające opodatkowaniu w roku bieżącym, ujęte w księgach rachunkowych lat ubiegłych',
    K_4 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Koszty niestanowiące kosztów uzyskania przychodów (trwałe różnice pomiędzy zyskiem/stratą dla celów rachunkowych a dochodem/stratą dla celów podatkowych)',
    K_5 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Koszty nieuznawane za koszty uzyskania przychodów w bieżącym roku',
    K_6 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Koszty uznawane za koszty uzyskania przychodów w roku bieżącym, ujęte w księgach lat ubiegłych',
    K_7 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Przychody podlegające opodatkowaniu nie ujmowane w księgach rachunkowych',
    K_8 DECIMAL(18,2) DEFAULT 0.00 COMMENT 'Koszty uznawane za koszty uzyskania przychodów nie ujmowane w księgach rachunkowych',
    xml TEXT
    ) DEFAULT CHARSET=utf8mb4;

    INSERT INTO t_jpk_zois
    SELECT
    SymbolKonta AS guid,
    konto AS S_1,
    _escape_to_xml(trim(p0.nazwa)) AS OpisKonta, -- S_2
    KodZespolu AS KodZespolu, -- S_3
    bo_wn AS BilansOtwarciaWinien, -- S_4
    bo_ma AS BilansOtwarciaMa, -- S_5
    obr_okr_wn AS ObrotyWinien, -- S_6
    obr_okr_ma AS ObrotyMa, -- S_7
    obr_nar_wn AS ObrotyWinienNarast, -- S_8
    obr_nar_ma AS ObrotyMaNarast, -- S_9
    saldo_wn AS SaldoWinien,
    saldo_ma AS SaldoMa,
    -- p.typ_konta AS TypKonta,
    ifnull(p0.jpkcit, ''), -- S_12_1
    ifnull(p0.jpkcit2, ''),
    ifnull(p0.jpkcit3, ''),
    '' AS xml
    FROM t_salda s
    JOIN plankont p0 ON s.SymbolKonta = p0.symbol AND p0.rok = _rokbo
    ORDER BY s.konto;

--    SHOW WARNINGS;

    INSERT INTO t_jpk_dziennik
    SELECT
    idnoper AS guid,
    -- MIN(nr_pozycji) AS LpZapisuDziennika,
    t.nr_dekretu AS D_1, -- nr zapisu w dziennniku, nr dekretu
    ifnull(o.grupa, 'PK') AS D_2,
    _escape_to_xml(ifnull(n.kontrguid, '')) AS D_3, -- kod kontrahenta, pytanie czy wstawiać
    t.numer_dok AS D_4, -- Numer dowodu w sensie numer dokumentu
    ifnull(o.rodzaj, 'PK'), -- rodzaj dowodu
    -- rodzaj_fk AS D_5, -- RodzajDowodu
    data_oper AS D_6,
    data_dowodu AS D_7,
    data_ksiegowania AS D_8,
    IF(uid='','ad',uid) AS D_9, --  osoba, ad oznacza automatyczna dekretacje
    t.opis AS D_10,
    _Rnd2(SUM(IF(stronawn=1,kwota,0))) AS D_11, -- kwota operacji z dokumentu (nie mamy, u nas to jednak suma)
    '' as D_12, -- numer ksef
    '' AS xml,
    '' AS xml2
    FROM t_zapisy t
    left join opng n on n.guid = t.idnoper
    inner join operdoc o on o.rodzaj = n.rodzaj
    GROUP BY idnoper, nr_dekretu;

    INSERT INTO t_jpk_kontrah
    SELECT DISTINCT
    D_3 AS T_1,
    CASE WHEN k.nip NOT IN ('', 'brak') THEN
        IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]',LEFT(k.nip,2),'')
    ELSE ''
    END AS T_2, -- prefiks nipu, symbol kraju kontrahenta
    CASE WHEN k.nip NOT IN ('', 'brak') THEN k.nip
    ELSE ''
    END AS T_3, -- nip kontrahenta
    '' AS xml
    FROM kontrah k, t_jpk_dziennik t
    WHERE k.GUID = t.D_3 AND t.D_3 <> ''
    ;

    INSERT INTO t_jpk_kontozapis
    SELECT
    z.guid AS guid,
    z.idnoper AS guid,
    -- nr_pozycji AS Z_1,
    z.lp as Z_1,
    z.opis AS Z_2,
    p.symbol_fmt AS Z_3, -- to samo co S_1
    IF(stronawn=1,kwota,0) AS Z_4, -- KwotaWinien,
    0 AS Z_5, -- KwotaWinienWaluta,
    '' AS Z_6, -- KodWalutyWinien,
    IF(stronawn=0,kwota,0) AS Z_7, -- KwotaMa,
    0 AS Z_8, -- KwotaMaWaluta,
    '' AS Z_9, -- KodWalutyMa
    '' as xml
    FROM t_zapisy z
    JOIN plankont p ON z.konto = p.symbol AND p.rok = _rokbo
    ;

    INSERT INTO t_jpk_ctrl
    SELECT
    (SELECT COUNT(*) FROM t_jpk_dziennik) AS C_1,
    (SELECT IFNULL(SUM(D_11), 0) FROM t_jpk_dziennik) AS C_2,
    (SELECT COUNT(*) FROM t_jpk_kontozapis) AS C_3,
    (SELECT IFNULL(SUM(Z_4), 0) FROM t_jpk_kontozapis) AS C_4,
    (SELECT IFNULL(SUM(Z_7), 0) FROM t_jpk_kontozapis) AS C_5,
    '' AS xml;

    -- tutaj juz skladanie xml-a

    UPDATE t_jpk_zois SET xml =
    CONCAT('<', _zois, '>\n',
    '<S_1>',S_1,'</S_1>\n',
    '<S_2>',S_2,'</S_2>\n',
    '<S_3>',S_3,'</S_3>\n',
    '<S_4>',S_4,'</S_4>\n',
    '<S_5>',S_5,'</S_5>\n',
    '<S_6>',S_6,'</S_6>\n',
    '<S_7>',S_7,'</S_7>\n',
    '<S_8>',S_8,'</S_8>\n',
    '<S_9>',S_9,'</S_9>\n',
    '<S_10>',S_10,'</S_10>\n',
    '<S_11>',S_11,'</S_11>\n',
    '<S_12_1>',S_12_1,'</S_12_1>\n',
    IF(S_12_2='','',CONCAT('<S_12_2>',S_12_2,'</S_12_2>\n')),
    IF(S_12_3='','',CONCAT('<S_12_3>',S_12_3,'</S_12_3>\n')),
    '</', _zois, '>\n')
    ;

    UPDATE t_jpk SET xmlpoz2 = concat('<ZOiS>\n', (SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_jpk_zois), '</ZOiS>\n');

    UPDATE t_jpk_kontozapis SET xml =
    CONCAT('<KontoZapis>\n',
    '<Z_1>',Z_1,'</Z_1>\n',
    '<Z_2>',Z_2,'</Z_2>\n',
    '<Z_3>',Z_3,'</Z_3>\n',
    IF(Z_4 = 0,'',CONCAT('<Z_4>',Z_4,'</Z_4>\n')),
    IF(Z_5 = 0,'',CONCAT('<Z_5>',Z_5,'</Z_5>\n')),
    IF(Z_6 = 0,'',CONCAT('<Z_6>',Z_6,'</Z_6>\n')),
    IF(Z_7 = 0,'',CONCAT('<Z_7>',Z_7,'</Z_7>\n')),
    IF(Z_8 = 0,'',CONCAT('<Z_8>',Z_8,'</Z_8>\n')),
    IF(Z_9 = 0,'',CONCAT('<Z_9>',Z_9,'</Z_9>\n')),
    '</KontoZapis>\n')
    ;

    UPDATE t_jpk_dziennik SET xml =
    CONCAT('<Dziennik>\n',
    '<D_1>',D_1,'</D_1>\n',
    '<D_2>',D_2,'</D_2>\n',
    IF(D_3 = '','',CONCAT('<D_3>',D_3,'</D_3>\n')),
    '<D_4>',D_4,'</D_4>\n',
    '<D_5>',D_5,'</D_5>\n',
    '<D_6>',D_6,'</D_6>\n',
    '<D_7>',D_7,'</D_7>\n',
    '<D_8>',D_8,'</D_8>\n',
    '<D_9>',D_9,'</D_9>\n',
    '<D_10>',D_10,'</D_10>\n',
    '<D_11>',D_11,'</D_11>\n',
    IF(D_12 = '','',CONCAT('<D_12>',D_12,'</D_12>\n'))
    )
    ;

    -- grupa zapisow i jej zamkniecie na koniec
    UPDATE t_jpk_dziennik t SET t.xml2 =
    concat((SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_jpk_kontozapis WHERE idnoper = t.idnoper),
    '</Dziennik>\n');

    -- pozycje dziennika
    UPDATE t_jpk SET xmlpoz3 = (SELECT GROUP_CONCAT(concat(xml,xml2) SEPARATOR '') FROM t_jpk_dziennik);

    UPDATE t_jpk_ctrl
    SET xml = CONCAT(
        '<Ctrl>\n',
            '<C_1>', C_1, '</C_1>\n',
            '<C_2>', C_2, '</C_2>\n',
            '<C_3>', C_3, '</C_3>\n',
            '<C_4>', C_4, '</C_4>\n',
            '<C_5>', C_5, '</C_5>\n',
        '</Ctrl>\n'
    );

    UPDATE t_jpk SET xmlpoz4 = (SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_jpk_ctrl);


    UPDATE t_jpk_kontrah SET xml =
    CONCAT('<Kontrahent>\n',
    '<T_1>',T_1,'</T_1>\n',
    IF(T_2 = '','',CONCAT('<T_2>',T_2,'</T_2>\n')),
    IF(T_3 = '','',CONCAT('<T_3>',T_3,'</T_3>\n')),
    '</Kontrahent>\n')
    ;

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


    INSERT INTO t_jpk_rpd
    SELECT
    -- PRZYCHODY: Sumujemy (Saldo Ma - Saldo Wn)
    SUM(CASE WHEN S_12_3 LIKE 'PD1%' THEN IFNULL(S_11, 0) - IFNULL(S_10, 0) ELSE 0 END) AS K_1,
    SUM(CASE WHEN S_12_3 LIKE 'PD2%' THEN IFNULL(S_11, 0) - IFNULL(S_10, 0) ELSE 0 END) AS K_2,
    SUM(CASE WHEN S_12_3 LIKE 'PD3%' THEN IFNULL(S_11, 0) - IFNULL(S_10, 0) ELSE 0 END) AS K_3,

    -- KOSZTY: Sumujemy (Saldo Wn - Saldo Ma)
    SUM(CASE WHEN S_12_3 LIKE 'PD4%' THEN IFNULL(S_10, 0) - IFNULL(S_11, 0) ELSE 0 END) AS K_4,
    SUM(CASE WHEN S_12_3 LIKE 'PD5%' THEN IFNULL(S_10, 0) - IFNULL(S_11, 0) ELSE 0 END) AS K_5,
    SUM(CASE WHEN S_12_3 LIKE 'PD6%' THEN IFNULL(S_10, 0) - IFNULL(S_11, 0) ELSE 0 END) AS K_6,

    -- PRZYCHODY nieujęte: (Saldo Ma - Saldo Wn)
    SUM(CASE WHEN S_12_3 LIKE 'PD7%' THEN IFNULL(S_11, 0) - IFNULL(S_10, 0) ELSE 0 END) AS K_7,

    -- KOSZTY nieujęte: (Saldo Wn - Saldo Ma)
    SUM(CASE WHEN S_12_3 LIKE 'PD8%' THEN IFNULL(S_10, 0) - IFNULL(S_11, 0) ELSE 0 END) AS K_8,
    '' as xml
    FROM t_jpk_zois
    WHERE S_12_3 <> ''; -- Pomijamy puste znaczniki dla wydajności


    UPDATE t_jpk_rpd
    SET xml = CONCAT(
        '<RPD>\n',
            '<K_1>', IFNULL(K_1,'0.00'), '</K_1>\n',
            '<K_2>', IFNULL(K_2,'0.00'), '</K_2>\n',
            '<K_3>', IFNULL(K_3,'0.00'), '</K_3>\n',
            '<K_4>', IFNULL(K_4,'0.00'), '</K_4>\n',
            '<K_5>', IFNULL(K_5,'0.00'), '</K_5>\n',
            '<K_6>', IFNULL(K_6,'0.00'), '</K_6>\n',
            '<K_7>', IFNULL(K_7,'0.00'), '</K_7>\n',
            '<K_8>', IFNULL(K_8,'0.00'), '</K_8>\n',
        '</RPD>\n'
    );

    UPDATE t_jpk SET xmlpoz5 = (SELECT GROUP_CONCAT(xml SEPARATOR '') FROM t_jpk_rpd);

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

    SELECT _XML;

END IF; -- _MODE = 'JPK_KR_PD_DANE'

END$$

DELIMITER ;
