 SET NAMES utf8;
DELIMITER $$

DROP PROCEDURE IF EXISTS `m_api`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `m_api`(
IN _MODE VARCHAR(200),
IN _GUID VARCHAR(38),
IN _ParamA VARCHAR(255),
IN _ParamB VARCHAR(255),
IN _ParamC VARCHAR(255),
IN _ParamD VARCHAR(255),
IN _ParamE VARCHAR(255),
IN _ParamF TEXT
)

/*
set @guid=CONCAT('OBC',uuid_short());
CALL m_api('UPDATE_OPNG_INIT',@guid,'ZP NN','','','','','DEBUG');
CALL m_api('UPDATE_TE_OPNG_KURSY',@guid,'','','','','','DEBUG');
CALL m_api('UPDATE_OPNG',@guid,'','waluta','nrrachunku','sposobplatn','','DEBUG');
CALL m_api('GET_OPPO_B',@guid,'','','','','','DEBUG');
CALL m_api('TEST','','','','','','','DEBUG');

CALL m_api('UPDATE_OPNG_DONE','','','','','','','DEBUG');
CALL m_api('GET_PDF',@guid,'','','','','','DEBUG');

CALL m_api('GET_ABSENCJE',@guid,@localtime,'','','','','DEBUG');

*/

sproc: BEGIN

DECLARE _TGUID VARCHAR(38);
DECLARE _PLATNIKGUID VARCHAR(38);
DECLARE _KONTRGUID VARCHAR(38);
DECLARE _NRRACHUNKU VARCHAR(38);
DECLARE _WALUTA, _rodzaj, _korekta INT;
DECLARE _KURS DOUBLE(16,4);
DECLARE _NR_TAB_KURS VARCHAR(38);
DECLARE _DATA DATE;
DECLARE _TIMESTAMP TIMESTAMP;
DECLARE _DEBUG BOOLEAN;
DECLARE _WEBDOC BOOLEAN;
DECLARE _dl, _dl_max, _i, _lp, _lp_oppo INT; -- dlugosc uwag do pociecia, dlugosc maksymalna, iteracja, nr pozycji po kolei, numer lp w oppo
DECLARE _kurs_op DECIMAL(16,4); -- kurs faktury, potrzebny w tabelce vat
DECLARE _uwagi TEXT;
DECLARE _czesc TEXT; -- uwaga na maksymalna dlugosc, gdyby sie miala zmienic

SET _DEBUG=_ParamF LIKE "%DEBUG%",_WEBDOC=FALSE;
SET _ParamF=REPLACE(_ParamF,"DEBUG","");

-- bez ownera wiele rzeczy nie dziala dobrze, na pewno wybor konta i fr_ht_OP
SELECT value INTO @session.globals.Owner FROM _db_globals g WHERE g.key='Owner';

IF (@session.globals.Owner IN ('SEVENET')) THEN
  SET _WEBDOC=TRUE;
END IF;

/*
ID dokumentu
rodzaj operacji (ZP FV, ZP-FV, ZT FV, ZT-FV itp)
data wystawienia
data sprzedaży
termin płatności
*sposób płatności
numer dokumentu
numer dokumentu korygowanego (dla korekt)
NIP kontrahenta (pozostałe dane pobierane z kart. kontrahentów)
*nr rachunku bankowego
waluta dokumentu
opis dokumentu
wartości netto,vat podzielone wg stawek (tabelka VAT)
nr dok. PZ
status zatwierdzenia dokumentu
status zatwierdzenia płatności dokumentu
zaakceptowana kwota płatności

pozycje:
ID dokumentu
liczba porządkowa pozycji
kwota netto
opis
select vname,nazwa,user_vname from v_katcol_names where user_vname<>'';
+--------+-----------------+----------------+
| vname  | nazwa           | user_vname     |
+--------+-----------------+----------------+
| v_kpk2 | Pracownik       | v_pracownicy   | katcol2 2778 | P Gmur Jakub 
| v_kza0 | zlecenie        | v_mpk          | katcol5 ZO/31894/2022-0
| v_kza1 | delegacje       | v_delegacje    | katcol6 018/03/2022
| v_kza2 | rodzaj kosztów  | v_rodz_kosztow | katcol7 45603
| v_kza4 | Samochód        | v_pojazdy      | katcol9 GD239VW
+--------+-----------------+----------------+

*/

IF _MODE='UPDATE_OPNG_INIT' THEN
    CALL _Session_Refresh_Variables('', '', '');
    SELECT COUNT(*) INTO @ile FROM opng WHERE guid=_GUID AND _GUID<>"" AND deleted=0 ;
    -- AND zaksiegowana=1
    SET @nrwewn=''; -- zachowanie nrwewn przy usuwaniu i ponownym tworzeniu dok.
    SELECT nrwewn INTO @nrwewn FROM opng WHERE guid=_GUID AND _GUID<>"" AND deleted=1 ;
    SET @nrwewn=IFNULL(@nrwewn,''),@rodzaj=-1;

    IF _ParamA LIKE 'Z%' THEN 
      SELECT rodzaj INTO @rodzaj FROM operdoc WHERE nazwa=_ParamA and nazwa like "Z%";
    ELSE
      SET @rodzaj=_VarINT(_ParamA);
    END IF;

    IF (@ile>0 AND _GUID NOT LIKE "TEST%") THEN 
      UPDATE opng SET akcept_platn=_VarInt(_ParamB),akcept_platn_kwota=_VarDouble(_ParamC) WHERE guid=_GUID;
      SELECT "EXISTS" AS status;
      LEAVE sproc;
    END IF;
    IF IFNULL(@rodzaj,-1)=-1 THEN 
      SELECT "RODZAJ" AS status;
      LEAVE sproc;
    END IF;
    
    IF _WEBDOC THEN
      DELETE b FROM oppo_budzet b WHERE b.idnoper=_GUID;
    END IF;
    DELETE o FROM oppo o WHERE o.idnoper=_GUID;
    DELETE v FROM opng_vat v WHERE v.idnoper=_GUID;
    DELETE n FROM opng n WHERE n.guid=_GUID;
    
    SET @Params=CONCAT("Rodzaj=",_VarStr(@rodzaj),"&AutoNum=0");
    CALL C_HT_OPZM('recreate.`TE_xxxx`', '', 'OP', 'TE', '', '' ,'', '', '', '' ,'');
    CALL C_HT_OPZM('INIT.NEW(CLEAR)', '', 'OP', 'TE', _GUID, '', '', '', '', '' , @Params);
    CALL C_HT_OPZM('START', '', 'OP', 'TE', _GUID, '', '', '', '' ,'', '');
    UPDATE TE_opng SET nrwewn=@nrwewn WHERE guid=_GUID;
    SELECT "OK" as status;
END IF;

IF _MODE = 'UPDATE_TE_OPNG_KURSY' THEN
    SET @mode=_MODE;
    SELECT waluta,datawystaw INTO _WALUTA,_DATA FROM TE_opng;
    SET _WALUTA=IFNULL(_WALUTA,0);
    SELECT kurs,numer_tab_kurs
    INTO _KURS,_NR_TAB_KURS
    FROM kursy
    WHERE DATA BETWEEN _DATA - interval 7 day 
      AND _DATA - interval 1 day AND idnwaluty=_WALUTA
      ORDER BY DATA DESC LIMIT 1
      ;
    SET  _KURS=IFNULL(_KURS,1);
    UPDATE TE_opng SET kurs=_KURS,kurs_rozliczen=_KURS,tabela_kursow=IFNULL(_NR_TAB_KURS,'?') WHERE guid=_GUID;
END IF;

-- CALL m_api('INSERT_RACHBANKOWE',@kontrguid,'','',@nrrachunku,@swift,@waluta,'');
-- CALL m_api('INSERT_RACHBANKOWE_SELECT',@kontrguid,'','',@nrrachunku,@swift,@waluta,'');

IF _MODE IN ('INSERT_RACHBANKOWE','INSERT_RACHBANKOWE_SELECT') THEN
    SET @mode=_MODE,_PLATNIKGUID=_GUID;
    SET _NRRACHUNKU=REPLACE(IFNULL(_ParamC,''),' ',''),@m_api.idnrachunku=0;
    SET @walutastr=IF(_ParamE='','PLN',_ParamE);
    SET @swift=IF(@walutastr<>'PLN',_ParamD,'');
    SELECT idn INTO @waluta FROM waluty WHERE symbol=@walutastr;
    SET @waluta=IFNULL(@waluta,0);
    SELECT max(idn) as idn,count(*) as ile INTO @m_api.idnrachunku,@m_api.ile FROM rachbankowe WHERE nrrachunku=_NRRACHUNKU AND kontrguid=_PLATNIKGUID;
    IF @m_api.ile=0 THEN
      SELECT max(idn) as idn,count(*) as ile
      INTO @m_api.idnrachunku,@m_api.ile
      FROM rachbankowe WHERE REPLACE(nrrachunku,' ','')=_NRRACHUNKU AND kontrguid=_PLATNIKGUID;
    END IF;
    IF @m_api.ile=0 THEN
      IF  isValidIBAN(_NRRACHUNKU) AND _PLATNIKGUID<>'INNI' THEN
        INSERT IGNORE INTO rachbankowe (NrRachunku,bankguid,kontrguid,rodzaj,NazwaKonta,swift,waluta)
        SELECT _NRRACHUNKU,mid(_NRRACHUNKU,3,8),guid,1,'r.biez. z obiegu',@swift,@waluta FROM kontrah k 
        WHERE k.guid<>'' and k.guid=_PLATNIKGUID;
        SELECT idn INTO @m_api.idnrachunku FROM rachbankowe WHERE nrrachunku=_NRRACHUNKU AND kontrguid=_PLATNIKGUID;
      END IF;
    ELSE
      UPDATE rachbankowe set waluta=@waluta WHERE idn=@m_api.idnrachunku;
    END IF;
    
    IF _MODE IN ('INSERT_RACHBANKOWE_SELECT') THEN
      SELECT @m_api.idnrachunku AS idn;
    END IF;
END IF;
    
IF _MODE = 'UPDATE_OPNG' THEN
    SET @_GUID=_GUID;
    SELECT kontrnip,IFNULL(kontrguid,''),IFNULL(platnikguid,''),split_payment INTO @nip,_KONTRGUID,_PLATNIKGUID,@split FROM TE_opng;
    IF _KONTRGUID='' THEN
      SELECT guid INTO _KONTRGUID
      FROM kontrah WHERE nip in (@nip,replace(@nip,'PL','')) and deleted=0 and nip<>''
      ORDER BY idn desc LIMIT 1;
    END IF;
    SET _KONTRGUID=IF(IFNULL(_KONTRGUID,'')='','INNI',_KONTRGUID);

    IF _PLATNIKGUID='' THEN
      SET _PLATNIKGUID=_KONTRGUID;
    END IF;

    -- jeżeli @webdoc jest false i @nie_importuj_z_ksef=1 to sprzatamy po sobie i wychodzimy z procedury
    IF NOT _WEBDOC THEN
      SELECT nie_importuj_z_ksef into @nie_importuj_z_ksef FROM kontrah WHERE guid=_KONTRGUID;
      IF @nie_importuj_z_ksef=1 THEN
        DELETE b FROM oppo_budzet b WHERE b.idnoper=_GUID;
        DELETE o FROM TE_oppo o WHERE o.idnoper=_GUID;
        DELETE v FROM TE_opng_vat v WHERE v.idnoper=_GUID;
        DELETE n FROM TE_opng n WHERE n.guid=_GUID;
        SELECT "KSEF_BLOCKED" AS status;
        LEAVE sproc;
      END IF;
    END IF;

    SELECT datawystaw,IFNULL(nrwewn,'') INTO _DATA,@nrwewn from TE_opng;
    SELECT idn INTO _WALUTA FROM waluty WHERE symbol=_ParamB;
    SET _WALUTA=IFNULL(_WALUTA,0);
    SELECT kurs,numer_tab_kurs INTO _KURS,_NR_TAB_KURS
    FROM kursy
    WHERE DATA BETWEEN _DATA - interval 7 day 
      AND _DATA - interval 1 day AND idnwaluty=_WALUTA
      ORDER BY DATA DESC LIMIT 1
      ;
    SET _KURS=IFNULL(_KURS,1),_NR_TAB_KURS=IFNULL(_NR_TAB_KURS,'');
    SET @sposobplatnosci=IFNULL(_ParamD,''),@sposobplatn=-1;

    IF(@session.globals.Owner IN ('SEVENET')) THEN
      IF @sposobplatnosci LIKE "GOT%" OR @sposobplatnosci=1 THEN SET @sposobplatn=1; END IF;
      IF @sposobplatnosci LIKE "_rodki%pryw%" THEN SET @sposobplatn=1; END IF;
      IF @sposobplatnosci LIKE "Karta%" OR @sposobplatnosci=2 THEN SET @sposobplatn=39; END IF;
      IF @sposobplatnosci LIKE "PRZEDP%" THEN SET @sposobplatn=99; END IF;
    ELSE  
      IF @sposobplatnosci=1 THEN SET @sposobplatn=(select min(idn) from platnosc where rodzaj = 0); END IF; -- gotowka
      IF @sposobplatnosci=3 THEN SET @sposobplatn=(select min(idn) from platnosc where rodzaj = 2); END IF; -- karta
      IF @sposobplatnosci=6 THEN SET @sposobplatn=-1; END IF; -- przelew
    END IF;

    SET _NRRACHUNKU=REPLACE(IFNULL(_ParamC,''),' ',''),@idnrachunku=0;
    IF  isValidIBAN(_NRRACHUNKU) AND _KONTRGUID<>'INNI' THEN
      INSERT IGNORE INTO rachbankowe (NrRachunku,bankguid,kontrguid,rodzaj,NazwaKonta)
      SELECT _NRRACHUNKU,mid(_NRRACHUNKU,3,8),guid,1,'r.biez. z obiegu' FROM kontrah k 
      WHERE k.guid<>'' and k.guid=_KONTRGUID;
      SELECT idn INTO @idnrachunku FROM rachbankowe WHERE nrrachunku=_NRRACHUNKU AND kontrguid=_KONTRGUID;
    END IF;

    UPDATE TE_opng n SET 
      n.domagazynu=1,n.zmagazynu=0,n.kancelaria_kierunek=1,n.calc_ver=3,n.przeliczenie_B_N=0,
      n.kontrguid=_KONTRGUID,n.platnikguid=_PLATNIKGUID,
      n.ExtFlags = concat_WS('', IFNULL(n.ExtFlags,''), '(NG<-Kontrah)'),
      n.waluta=_WALUTA,n.waluta_rozliczen=_WALUTA, n.kurs=_KURS,n.kurs_rozliczen=_KURS,
      n.tabela_kursow=_NR_TAB_KURS, n.datawaluty=_DATA,n.dataplatnosci_oczekiwana=n.dataplatnosci,n.data_vat=n.datawplywu,
      n.wzordekr='WEBDOC',n.idnrachunku=@idnrachunku
    WHERE n.guid=_GUID;
    
    UPDATE TE_opng_vat  SET fixed=1;
    UPDATE TE_opng_vat  SET idvat=15 where idvat=0; -- mail p.Sadowska 20240411
    UPDATE TE_opng_vat  SET netto=_RND2(nettoWal*_KURS),vat=_RND2(vatWal*_KURS);
    UPDATE TE_opng_vat  SET brutto=netto+vat,bruttoWal=nettoWal+vatWal;
    
    -- SELECT * from TE_opng_vat;
    
    CALL C_HT_OPZM('NG<-Kontrah', '', 'OP', 'TE', _GUID, '', '', '', '' ,'', '');
    UPDATE TE_opng n SET n.sposobplatn=@sposobplatn WHERE n.guid=_GUID;
    CALL C_HT_OPZM('TE.NG.POST', '', 'OP', 'TE', _GUID, '', '', '', '' ,'', '');
    -- tutaj są oczywiście przed APPLY jeszcze inne możliwe dodatki np. wsatwienie cen etc.
    -- CALL C_HT_OPZM('TE.xxpo<-POZYCJE_CENYRABAT', '', 'OP', 'TE', _GUID, '', '', '', '' ,'', '');
    CALL C_HT_OPZM('APPLY', '', 'OP', 'TE', _GUID, '', '', '', '' ,'', '');
    CALL C_HT_OPZM('END', '', 'OP', 'TE', _GUID, '', '', '', '' ,'', '');

    IF _WEBDOC THEN
      SET @ilepoz=IFNULL((SELECT count(DISTINCT katcol5,katcol2,katcol1,katcol9) FROM oppo_budzet WHERE idnoper=_GUID),0);
      SET @ilepoz_zlec=IFNULL((SELECT COUNT(DISTINCT katcol5) FROM oppo_budzet WHERE idnoper=_GUID),0);
      SET @ilepoz_del =IFNULL((SELECT COUNT(DISTINCT katcol6) FROM oppo_budzet WHERE idnoper=_GUID),0);

      UPDATE opng n,oppo_budzet b SET n.katcol0=b.katcol5,n.katcol2=b.katcol2,n.katcol3=b.katcol1,n.katcol4=b.katcol9
      WHERE b.idnoper=n.guid and n.guid=_GUID AND @ilepoz=1;
      
      UPDATE opng n,oppo_budzet b SET n.katcol0=b.katcol5
      WHERE b.idnoper=n.guid AND n.guid=_GUID AND @ilepoz_zlec=1;
    
      UPDATE opng n,oppo_budzet b SET n.katcol1=b.katcol6
      WHERE b.idnoper=n.guid AND n.guid=_GUID AND @ilepoz_del=1;
      
      UPDATE opng n SET n.katcol1=-1 -- podział na poziomie pozycji
      WHERE n.guid=_GUID AND @ilepoz_del>1;
      IF @nrwewn='' THEN 
        CALL m_api('SET_NRWEWN',_GUID,'','','','','','');
      END IF;
    END IF;
  -- obejście/test
    UPDATE opng SET split_payment=IFNULL(@split,0) WHERE guid=_GUID;
    SELECT nrwewn, "OK" as status FROM opng WHERE guid=_GUID;
END IF;

/*
tylko SEVENET
-- CALL m_api('SET_NRWEWN',@guid,'','','','','','DEBUG');
*/


IF _MODE = 'SET_NRWEWN' THEN
    IF _DEBUG THEN
        SELECT "PRZED:",n.nrwewn,c.nr from opng n 
        LEFT JOIN erp_obj_counters c ON c.objtype='opng.nrwewn' and c.rodzaj=n.rodzaj and c.y=year(n.datasprzed) and c.m=month(n.datasprzed)
        WHERE n.guid=_GUID;
        DELETE FROM erp_obj_counters_values WHERE objtype in ('opng.nrwewn','') AND ID=_GUID;
    END IF;

    INSERT IGNORE INTO erp_obj_counters_values (id,objtype,input_number,number_text) 
    SELECT n.guid,'opng.nrwewn',ifnull(c.nr,0)+1,
    CONCAT(LPAD(ifnull(c.nr,0)+1,6,'0'),'/',lpad(month(n.datasprzed),2,'0'),'/',left(n.datasprzed,4))
    FROM opng n
    LEFT JOIN erp_obj_counters c ON c.objtype='opng.nrwewn' and c.rodzaj=n.rodzaj and c.y=year(n.datasprzed) and c.m=month(n.datasprzed) 
    WHERE n.guid=_GUID;

    INSERT IGNORE INTO erp_obj_counters (objtype,nr,rodzaj,y,m) 
    SELECT 'opng.nrwewn',0,rodzaj,year(n.datasprzed),month(n.datasprzed) FROM opng n WHERE guid=_GUID;
    UPDATE erp_obj_counters c, opng n SET c.nr=c.nr+1 
    WHERE c.objtype='opng.nrwewn' and c.rodzaj=n.rodzaj and c.y=year(n.datasprzed) and c.m=month(n.datasprzed) AND n.guid=_GUID;

    UPDATE opng n,erp_obj_counters_values c SET n.nrwewn=c.number_text WHERE c.id=n.guid and n.guid=_GUID;
    IF _DEBUG THEN
        SELECT * from erp_obj_counters_values WHERE id=_GUID;
        SELECT n.nrwewn,c.nr from opng n,erp_obj_counters c 
        WHERE n.guid=_GUID and c.objtype='opng.nrwewn' and c.rodzaj=n.rodzaj and c.y=year(n.datasprzed) and c.m=month(n.datasprzed);
    END IF;
END IF;

-- CALL m_api('GET_OPPO_B',@guid,'','','','','','DEBUG');
IF _MODE = 'GET_OPPO_B' THEN
    SELECT b.netto,b.info,  
    (SELECT valuex FROM v_lok_fk v       WHERE v.klucz=b.katcol1) as lokalizacja,
    (SELECT valuex FROM v_pracownicy v   WHERE v.klucz=b.katcol2) as pracownik,
    (SELECT valuex FROM v_mpk v          WHERE v.klucz=b.katcol5) as zlecenie,
--    (SELECT valuex FROM v_delegacje v    WHERE v.klucz=b.katcol6) as delegacja,
-- tymczasowo - pierwsza synchroniowana
    (SELECT valuex FROM v_kkn1 v    WHERE v.klucz=b.katcol6) as delegacja,
    (SELECT valuex FROM v_rodz_kosztow v WHERE v.klucz=b.katcol7) as rodzaj,
    (SELECT valuex FROM v_pojazdy      v WHERE v.klucz=b.katcol9) as pojazd
    FROM oppo_budzet b
    WHERE b.idnoper=_GUID; 
END IF;

IF _MODE = 'TEST' THEN
    SET @guid='TEST1';
    UPDATE opng SET deleted=1 WHERE guid=@guid;
    CALL m_api('UPDATE_OPNG_INIT',@guid,'ZP NN','','','','','DEBUG');
    UPDATE TE_opng set datawystaw=current_date,nrdokfin='TEST',kontrnip='5831016029';
    CALL m_api('UPDATE_OPNG',@guid,'','','','','','DEBUG');
END IF;

/*
@guid opcjonalny
@localtime opcjonalny
CALL m_api('GET_ABSENCJE',@guid,@localtime,'','','','','DEBUG');
wszystkie niewysłane zmiany
CALL m_api('GET_ABSENCJE','','new','','','','','DEBUG');
nieuzywany
*/

IF _MODE = 'GET_ABSENCJE' THEN
    SET _TIMESTAMP=IFNULL(_ParamA,'0000-00-00 00:00:00');

    SELECT
        IF(u.login IS NULL, o.idnuser, u.login) AS user_name,
        IF(firma_wspolprac = 0, IF(d.external_id = '', 'xxx', d.external_id), d.external_id_b2b) AS event_type,
        a.guid AS id,
        d.definicja AS name,
        0 AS whole_day,
        CASE
          WHEN a.absencjaod = a.absencjado AND fp.kp_godziny <> a.godz_absencji THEN CONCAT(a.absencjaod, 'T08:00:00')
          ELSE CONCAT(a.absencjaod, 'T00:00:00')
        END AS date_start,
        
        CASE
          WHEN a.absencjaod = a.absencjado AND fp.kp_godziny <> a.godz_absencji THEN CONCAT(a.absencjaod, 'T', ADDTIME('08:00:00', SEC_TO_TIME(a.godz_absencji * 60)))
          ELSE CONCAT(a.absencjado, 'T23:59:00')
        END AS date_end,
        
        '' AS date,
        a.opis AS description,
        0 as deleted,
        a.ModifyAt AS erp_date_modified
    FROM absencje a
    INNER JOIN absencje_dict d ON d.idn = a.rodzaj
    INNER JOIN osoby o ON o.guid = a.GUIDpr
    INNER JOIN Pracownicy p ON p.guid = a.GUIDpr
    LEFT JOIN _user_accounts u ON u.osobaGUID = o.GUID
    INNER JOIN frekw_po fp ON fp.frekwguid = a.frekwguid AND fp.rok_msc_dzien = a.absencjaod
    WHERE   a.ModifyAt>_TIMESTAMP AND a.absencjaod>'2025-04-20' AND
            (_ParamA<>'new' OR a.ModifyAT>IFNULL(a.RemoteTime,'0000-00-00 00:00:00')) AND
            (_GUID='' OR a.guid=_GUID) 
    -- AND a.absencjaod = a.absencjado AND a.godz_absencji <> fp.kp_godziny
    -- HAVING date_start LIKE '%T08%'
    ;

--        (SELECT count(*)>0 FROM log l WHERE l.table_link='absencje' AND l.info='Usuwam' AND l.guidlink=a.guid) AS deleted,

END IF;

IF _MODE = 'GET_ABSENCJE_DELETED' THEN
  SELECT idn, czas, guidlink, LEFT(info, 30) AS info 
  FROM log l 
  WHERE table_link = 'absencje' 
    AND NOT EXISTS ( SELECT 1 FROM absencje a WHERE a.guid = l.guidlink
    ) 
    AND info LIKE 'Usu%' 
    AND czas > '2025-07-01';
END IF;

/*
CALL m_api('KSEF_GET_LIST','','','','','','','DEBUG');
pobranie listy dokumentów do wysyłki do ksef
czy na pewno tu ma być *?
*/

IF _MODE = 'KSEF_GET_LIST' THEN
  SET @mode=_MODE;
  SELECT * FROM opng WHERE statusKSeF in (10) AND deleted=0 AND tymczasowa = 0;
END IF;


/*
CALL m_api('KSEF_GET_KONTO',@guid,'','','','','','DEBUG');
pobranie konta wystawcy faktury
TODO: dokończyć
*/

IF _MODE = 'KSEF_GET_KONTO' THEN
    SET @mode=_MODE;

    SET @bankKontrahenta = 
      (SELECT k.domyslnybank
      FROM opng n 
      JOIN kontrah k ON k.guid = n.platnikguid WHERE n.guid = '{C1EF56B7-14FB-4AFD-A851-A12F784DDE48}');

    IF IFNULL(@bankKontrahenta,'')='' OR @bankKontrahenta = 0 THEN
      SET @nrKontaKSeF = IFNULL((SELECT valuex FROM IReg WHERE idkey="Konta" AND IdPath= 'INT\\SYSTEM\\MOTLAWA\\DaneFirmy'),'');
    ELSE
      SET @nrKontaKSeF = (SELECT konto FROM banki WHERE idn = @bankKontrahenta);
    END IF;
END IF;


/*
CALL m_api('KSEF_GET_OPNG',@guid,'','','','','','DEBUG');
pobranie danych dokumentu opng do ksef
*/
IF _MODE = 'KSEF_GET_OPNG' THEN

  SET @mode=_MODE;

  SELECT rodzaj, kontrguid, platnikguid, kurs
  INTO @rodzaj, @kontrguid, @platnikguid, _kurs_op
  FROM opng WHERE guid = _GUID LIMIT 1;
  SELECT k.idn INTO @tytulkorekty FROM powody_korekty k, opng n WHERE n.guid = _GUID AND n.korektatytulem = k.nazwa LIMIT 1;
  SELECT 'VAT', '', usluga, wartnet INTO @rodzajFaktury, @guidzaliczki, @zaliczka, @zalwartnet
  FROM oppo p,  opng n 
  WHERE n.guid = p.idnoperfin AND usluga = 8 AND n.guid = _GUID LIMIT 1;
  -- CALL m_api('KSEF_GET_KONTO',_GUID,'','','','','','');
  CALL fr_ht_konto('OP', _GUID, 'KSEF', '',0,'','','','');
  SET @nrKontaKSeF = @_KontoBankowe;
   -- SET @nrKontaKSeF = @_konto; powinno byc tak, ale dopiero, gdy w ht_konto bedzie ta zmienna dla wszystkich

  IF @rodzaj in (1,80,50) and @zaliczka = 8 and @zalwartnet > 0 THEN
    SET @rodzajFaktury = 'ZAL';
  ELSEIF @rodzaj in (1,80,50) and @zaliczka = 8 and @zalwartnet < 0 THEN
    SET @rodzajFaktury = 'ROZ';
  ELSEIF @rodzaj in (3,85,90) and @zaliczka = 8 and @zalwartnet < 0 THEN
    SET @rodzajFaktury = 'KOR_ZAL';
  ELSEIF @rodzaj in (3,85,90) and @zaliczka = 8 and @zalwartnet > 0 THEN
    SET @rodzajFaktury = 'KOR_ROZ';
  ELSEIF @rodzaj in (1,80,50) THEN
    SET @rodzajFaktury = 'VAT';
  ELSEIF @rodzaj in (3,85,90) THEN
    SET @rodzajFaktury = 'KOR';
  END IF;

  IF @rodzajFaktury in ('ROZ', 'KOR_ROZ') THEN
    SELECT op2.idnoper INTO @guidzaliczki
    FROM opng n
    JOIN oppo op1 ON op1.idnoperfin = n.guid AND op1.usluga = 8
    JOIN zmpo p1 ON p1.guid = op1.guidzm AND p1.usluga = 8
    JOIN zmpo p2 ON p1.idnng = p2.idnng AND p2.usluga = 8 AND p1.guid != p2.guid
    JOIN oppo op2 ON op2.guidzm = p2.guid
    WHERE n.guid = _GUID LIMIT 1;

    SELECT numerksef, nrdokfin, if(ifnull(numerksef,'')='','1','') INTO @numerKsefZaliczki, @nrdokfinZaliczki, @znacznikPozaKsefZaliczki FROM opng WHERE guid = @guidzaliczki LIMIT 1;
  END IF;

  -- Podmiot1 dane

    SELECT valuea INTO @Nip FROM IReg WHERE idkey='NIP' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @PelnaNazwa FROM IReg WHERE idkey='Pelna_nazwa' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @KodKraju FROM IReg WHERE idkey='Kraj' AND Idpath LIKE '%DaneFirmy' AND length(valuea) = 2 LIMIT 1;
    SELECT valuea INTO @Ulica FROM IReg WHERE idkey='Ulica' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @NrDomu FROM IReg WHERE idkey='Nr_domu' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @KodPocztowy FROM IReg WHERE idkey='Kod_poczt' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @Miasto FROM IReg WHERE idkey='Miasto' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @BDO FROM IReg WHERE idkey='BDO' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @REGON FROM IReg WHERE idkey='REGON' AND Idpath LIKE '%DaneFirmy' LIMIT 1;
    SELECT valuea INTO @NazwaSkrocona FROM IReg WHERE idkey='Nazwa_skrocona' and Idpath LIKE '%DaneFirmy' LIMIT 1;
    
    SELECT
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), kp.nip, @Nip))  as P1_NIP, -- samofakturowanie - w przypadku zakupów podmiotem pierwszym jest kontrahent wystawiającego (dzialacz-sprzedający), w innym przypadku noramlnie
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), left(kp.nazwa,512), left(@PelnaNazwa,512))) as P1_Nazwa,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), 'PL', @KodKraju)) as P1_KodKraju,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), kp.ulica, concat(@Ulica, ' ', @NrDomu))) as P1_AdresL1,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), concat(kp.zipcode, ' ', kp.NazwaMiasta), concat(@KodPocztowy, ' ', @Miasto))) as P1_AdresL2,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), '', @BDO)) as P1_BDO,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), '', @REGON)) as P1_REGON,

  -- Podmiot2 dane
      _VarStr(if(n.rodzaj in (1,3), k.nip, if(@rodzaj in (5,6,7,8,23,24,25,26),@Nip,''))) as P2_NIP, -- samofakturowanie - w przypadku zakupowych podmiotem drugim jest wystawca (kupujący)
      _VarStr(if(n.rodzaj in (80,85),IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',LEFT(k.nip,2),''),'')) as P2_KodUE,
      _VarStr(if(n.rodzaj in (80,85), IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',SUBSTRING(k.nip,2),''),'')) as P2_NrVatUe,
      _VarStr(if(n.rodzaj in (50,90), k.nip,'')) as P2_NrID,
      _VarStr(if(n.rodzaj in (50,90) and k.nip='','1','')) as P2_BrakID,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26),left(@PelnaNazwa,512),left(k.nazwa,512))) as P2_Nazwa,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), @KodKraju, k.isocountrycode)) as P2_KodKraju,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), concat(@Ulica, ' ', @NrDomu), k.ulica)) as P2_AdresL1,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), concat(@KodPocztowy, ' ', @Miasto), concat(k.zipcode, ' ', k.NazwaMiasta))) as P2_AdresL2,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), @NazwaSkrocona, k.symbol)) as NrKlienta,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), '2', if(n.kontrah_ksef_jst=1,1,2))) as P2_JST,
      _VarStr(if(@rodzaj in (5,6,7,8,23,24,25,26), '2', if(n.kontrah_ksef_gv=1,1,2))) as P2_GV,

  -- Podmiot3 dane
    -- Było na rozruch, obecnie na podstawie  kontrah_ksef_jst i kontrah_ksef_gv w osobnym modzie bo zwraca listę
      -- if(@platnikguid!=@kontrguid, if(n.rodzaj in (1,3), k.nip,''),'') as P3_NIP,
      -- if(@platnikguid!=@kontrguid, if(n.rodzaj in (80,90),IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',LEFT(k.nip,2),''),''),'') as P3_KodUE,
      -- if(@platnikguid!=@kontrguid, if(n.rodzaj in (80,90), IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',SUBSTRING(k.nip,2),''),''),'') as P3_NrVatUe,
      -- if(@platnikguid!=@kontrguid, if(n.rodzaj in (50,90), k.nip,''),'') as P3_NrID,
      -- if(@platnikguid!=@kontrguid, if(n.rodzaj in (50,90) and k.nip='','1',''),'') as P3_BrakID,
      -- if(@platnikguid!=@kontrguid, if(_DEBUG,'Testowa - nazwa podmiotu3 Sp.z o.o.',k.nazwa),'') as P3_Nazwa,
      -- if(@platnikguid!=@kontrguid, k.isocountrycode,'') as P3_KodKraju,
      -- if(@platnikguid!=@kontrguid, k.ulica,'') as P3_AdresL1,
      -- if(@platnikguid!=@kontrguid, concat(k.zipcode, ' ', k.NazwaMiasta),'') as P3_AdresL2,
      -- if(@platnikguid!=@kontrguid, 8,'') as Rola,

  -- FA-naglowek faktury
      w.symbol as KodWaluty,
      n.datawystaw as P_1,
      @Miasto as P_1M, -- miejsce wystawienia faktury, pole nieobowiazkowe
      n.nrdokfin as P_2,
      _VarStr(if(@rodzaj in (3), n.korektadata,n.datasprzed)) as P_6,
      -- n.bruttowal as P_15,
      IF(_kurs_op = 1, n.brutto, n.bruttowal) AS P_15,
      n.dataplatnosci as TerminPlatnosci,
      CASE
        WHEN p.rodzaj = 0 THEN '1' -- gotówka
        WHEN p.rodzaj in (1,-1)  THEN '6' -- przelew
        WHEN p.rodzaj = 2 THEN '2' -- karta
        ELSE '6'
      END AS FormaPlatnosci,
      LEFT(@nrKontaKSeF, 255) AS NrRB,
      LEFT(@_swift, 20) AS SWIFT,
      LEFT(@_nazwabanku, 255) AS NazwaBanku,

      -- 'PLN Konto: PKOBP SA Oddział 27 w GdańskuNumer: 29 1440 1169 0000 0000 0181 8503' AS NrRB,
      2 as P_16, -- metoda kasowa (1=tak 2=nie)
      _VarStr(if (@rodzaj in (5,6,7,8,23,24,25,26) and rodzajdowodu = 'samofakturowanie', 1, 2)) as P_17, -- samowfakturowanie (1=tak 2=nie) (tylko dla zp i zt fv ru oraz ich korekt)
      2 as P_18, -- odwrotne obciążenie (1=tak 2=nie)
      _VarStr(if(n.split_payment=1,1,if(n.split_payment=0,2,2))) as P_18A,
      1 as P_19N, 
      1 as P_22N, -- pola P_22 informacja Wewnątrzwspólnotowej dostawie środka transportu - brak informacji
      2 as P_23, 
      1 as P_MarzyN,
      @rodzajFaktury as RodzajFaktury,
      _VarStr(if(@rodzajFaktury in ('ROZ','KOR_ROZ'),if(@znacznikPozaKsefZaliczki='1','1',''),'') ) as NrKSeFZN,  -- znacznik poza ksef fv zaliczki
      _VarStr(if(@rodzajFaktury in ('ROZ','KOR_ROZ'),if(@znacznikPozaKsefZaliczki='1',@nrdokfinZaliczki,''),'') ) as NrFaZaliczkowej,  -- nrdokfin fv zaliczki jeśli poza ksef
      _VarStr(if(@rodzajFaktury in ('ROZ','KOR_ROZ'),if(@znacznikPozaKsefZaliczki='1','',@numerKsefZaliczki),'') ) as NrKSeFFaZaliczkowej,  
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26),if(ifnull(n.numerksef,'')='',1,''), '') ) as NrKSeFN,  -- znacznik że fv korygowana nie miała nadanego numeru ksef
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26),n.korektatytulem, '') ) as PrzyczynaKorekty,
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26),n.korektadata, '') ) as DataWystFaKorygowanej,  
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26),n.korektanrdokfin, '') ) as NrFaKorygowanej,
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26),if(ifnull(n.numerksef,'')='','', (select numerksef from opng where guid = n.korektaguid)), '') ) as NrKSeF,  -- numer ksef fv korygowanej
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26),if(ifnull(n.numerksef,'')='',1,''), '') ) as NrKSeFN,  -- znacznik że fv korygowana nie miała nadanego numeru ksef
  -- FA-podmiot2K - dane kontrahenta po poprawie (pomimo że w Podmiot2 i tak są poprawne)
      _VarStr(if(@rodzaj in (3,7,8,24,26) and @tytulkorekty = -1, if(_DEBUG,'5870003657',kp.nip),'') ) as P2K_NIP,
      _VarStr(if(@rodzaj in (85) and @tytulkorekty = -1, if(_DEBUG,'DE',IF(LEFT(kp.nip,1) NOT REGEXP '^[0-9]' AND kp.nip <> 'brak',LEFT(kp.nip,2),'')),'') ) as P2K_KodUE,
      _VarStr(if(@rodzaj in (85) and @tytulkorekty = -1, if(_DEBUG,'5870003657',IF(LEFT(kp.nip,1) NOT REGEXP '^[0-9]' AND kp.nip <> 'brak',SUBSTRING(kp.nip,2),'')),'') ) as P2K_NrVatUe,
      _VarStr(if(@rodzaj in (90) and @tytulkorekty = -1, if(_DEBUG,'5870003657', kp.nip),'') ) as P2K_NrID,
      _VarStr(if(@rodzaj in (90) and @tytulkorekty = -1, if(n.rodzaj in (90) and kp.nip='','1',''),'') ) as P2K_BrakID,
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26) and @tytulkorekty = -1, if(_DEBUG,'Testowa - nazwa Sp.z o.o.',kp.nazwa),'') ) as P2K_Nazwa,
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26) and @tytulkorekty = -1, kp.isocountrycode,'') ) as P2K_KodKraju,
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26) and @tytulkorekty = -1,if(_DEBUG,'ul. testowa ulica 3',kp.ulica),'') ) as P2K_AdresL1,
      _VarStr(if(@rodzaj in (3,85,90,7,8,24,26) and @tytulkorekty = -1,if(_DEBUG,'99-999',concat(kp.zipcode, ' ', kp.NazwaMiasta)),'') ) as P2K_AdresL2



    FROM opng n 
    JOIN kontrah kp ON kp.guid = n.platnikguid
    JOIN kontrah k ON k.guid = n.kontrguid
    JOIN waluty w ON w.idn = n.waluta
    JOIN platnosc p ON n.sposobplatn = p.idn
    WHERE n.guid = _GUID;
END IF;

/*
CALL m_api('KSEF_GET_PODMIOTY_3',@guid,'','','','','','DEBUG');
pobranie danych vat dokumentu opng do ksef
*/
IF _MODE = 'KSEF_GET_PODMIOTY_3' THEN
    SET @mode=_MODE;
    SELECT 
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (1,3), k.nip,''),'') ) as P3_NIP,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (80,90),IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',LEFT(k.nip,2),''),''),'') ) as P3_KodUE,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (80,90), IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',SUBSTRING(k.nip,2),''),''),'') ) as P3_NrVatUe,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (50,90), k.nip,''),'') ) as P3_NrID,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (50,90) and k.nip='','1',''),'') ) as P3_BrakID,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, left(k.nazwa,512),'') ) as P3_Nazwa,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, k.isocountrycode,'') ) as P3_KodKraju,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, k.ulica,'') ) as P3_AdresL1,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, concat(k.zipcode, ' ', k.NazwaMiasta),'') ) as P3_AdresL2,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, p3.rola,'') ) as Rola
    FROM opng_podmioty_3 p3
    join opng n on n.guid = p3.opngguid
    join kontrah k on k.guid = p3.kontrguid
    WHERE p3.opngguid = _GUID

    UNION
    -- dodajemy specyficzny u nas przypadek, gdy odbiorca jest tak naprawde miejscem dostawy (areaguid w opng)
    SELECT
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (1,3), k.nip,''),'') ) as P3_NIP,
      k.nip AS P3_NIP,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (80,90),IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',LEFT(k.nip,2),''),''),'') ) as P3_KodUE,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (80,90), IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',SUBSTRING(k.nip,2),''),''),'') ) as P3_NrVatUe,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (50,90), k.nip,''),'') ) as P3_NrID,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (50,90) and k.nip='','1',''),'') ) as P3_BrakID,
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, left(k.nazwa,512),'') ) as P3_Nazwa,
      ean.nazwa AS P3_Nazwa,
      -- todo jezeli w ean jest adres, to go podawac, na razie adres z kontrahenta, podmieniamy tylko nazwe i role
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, k.isocountrycode,'') ) as P3_KodKraju,
      k.isocountrycode as P3_KodKraju,
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, k.ulica,'') ) as P3_AdresL1,

      IF(IFNULL(a.adres,'') = '', k.ulica, a.adres) as P3_AdresL1,

      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, concat(k.zipcode, ' ', k.NazwaMiasta),'') ) as P3_AdresL2,
      '2' as Rola
    FROM opng n
    join kontrah k on k.guid = n.kontrguid
    join erp_area_nodes ean on ean.GUID = n.areaGUID
    LEFT JOIN geo_int_adr_link a ON a.ObjGUID = ean.GUID AND a.objTable = 'erp_area_nodes'
    WHERE n.GUID = _GUID

    UNION
    --  dodajemy platnika z danyc z opng - nie jest on w tabeli KSEF_GET_PODMIOTY_3
    SELECT
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (1,3), k.nip,''),'') ) as P3_NIP,
      k.nip AS P3_NIP,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (80,90),IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',LEFT(k.nip,2),''),''),'') ) as P3_KodUE,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (80,90), IF(LEFT(k.nip,1) NOT REGEXP '^[0-9]' AND k.nip <> 'brak',SUBSTRING(k.nip,2),''),''),'') ) as P3_NrVatUe,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (50,90), k.nip,''),'') ) as P3_NrID,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, if(n.rodzaj in (50,90) and k.nip='','1',''),'') ) as P3_BrakID,
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, left(k.nazwa,512),'') ) as P3_Nazwa,
      k.nazwa AS P3_Nazwa,
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, k.isocountrycode,'') ) as P3_KodKraju,
      k.isocountrycode as P3_KodKraju,
      -- _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, k.ulica,'') ) as P3_AdresL1,
      k.ulica as P3_AdresL1,
      _VarStr(if(n.kontrah_ksef_jst=1 or n.kontrah_ksef_gv=1, concat(k.zipcode, ' ', k.NazwaMiasta),'') ) as P3_AdresL2,
      '6' as Rola -- 6 to platnik, tak wynika ze specyfikacji, ale glowy nie dam
    FROM opng n
    join kontrah k on k.guid = n.platnikguid
    WHERE n.GUID = _GUID AND n.kontrGUID <> n.platnikGUID
    ;


END IF;

/*
CALL m_api('KSEF_GET_OPNG_VAT',@guid,'','','','','','DEBUG');
pobranie danych vat dokumentu opng do ksef
*/
IF _MODE = 'KSEF_GET_OPNG_VAT' THEN
    SET @mode=_MODE;

    SELECT kurs, rodzaj into _kurs_op, _rodzaj FROM opng where GUID = _GUID;

    IF _rodzaj IN (3,4,85,90) THEN
        SET _korekta = 1;
    ELSE
        SET _korekta = 0;
    END IF;

    -- SET @nowy_naglowek_op = IFNULL(@nowy_naglowek_op,'nie'); tego raczej nie powinno byc, ale moze do zaliczkowych

    DROP TEMPORARY TABLE IF EXISTS t_opng_vat;
	CREATE TEMPORARY TABLE t_opng_vat (
	-- IdnOper VARCHAR(38) NOT NULL DEFAULT '' COMMENT 'GUID operacji',
    IdVat INT(11) NOT NULL DEFAULT '0' COMMENT 'ID stawki VAT',
    Netto DOUBLE(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Wart. Netto',
    Vat DOUBLE(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Wart. Vat',
    Brutto DOUBLE(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Wart. Brutto',
    NettoWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Wart. Netto w walucie',
    VatWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Wart. Vat w walucie',
    BruttoWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'Wart. Brutto w walucie',
    stawka DECIMAL(16,4) NOT NULL DEFAULT '0.0000' COMMENT 'stawka vat w sensie wartosci liczbowej',
    -- OperCount INT(11) NOT NULL DEFAULT '0' COMMENT 'Ile operacji',
    -- Fixed INT(11) NOT NULL DEFAULT '0' COMMENT '0 - normalnie naliczony rekord, 1 - ustalony/skorygowany przez uzytkownika',
    -- PRIMARY KEY (IdnOper,IdVat),
    KEY IdVat (IdVat)
    ) DEFAULT CHARSET=utf8
	;

    IF _korekta = 0 THEN
    -- czolgowe obejscie problemu zaokraglen przy braku kwot walutowych, dla kursu=1
        if (_kurs_op = 1) then
            insert into t_opng_vat
            SELECT n.IdVat, n.Netto, n.Vat, n.Brutto,
                if(n.NettoWal=0, n.Netto, n.NettoWal) as NettoWal,
                if(n.VatWal=0, n.Vat, n.VatWal) as VatWal,
                if(n.BruttoWal=0, n.Brutto, n.BruttoWal) as BruttoWal,
                -- v.name as name, v.shortname as idnVatStr,
                v.value as stawka
            FROM opng_vat n
            INNER JOIN v_erp_vat v ON v.id = n.idvat
            INNER JOIN oppo p ON (p.idnoper = n.idnoper OR p.idnoperfin = n.idnoper) AND n.idvat = p.idnvat
            WHERE n.idnoper = _GUID
            GROUP BY n.IdVat;
        end if;


        if (_kurs_op <> 1) then
            insert into t_opng_vat
            SELECT n.IdVat, n.Netto, n.Vat, n.Brutto,
                if(n.NettoWal=0 and n.Netto<>0, sum(p.wartnetwal), n.NettoWal) as NettoWal,
                if(n.VatWal=0 and n.Vat<>0, _Rnd2(sum(p.wartnetwal)*(v.value)), n.VatWal) as VatWal,
                if(n.BruttoWal=0 and n.Brutto<>0, _Rnd2(sum(p.wartnetwal) + _Rnd2(sum(p.wartnetwal)*(v.value))), n.BruttoWal) as BruttoWal,
                -- v.name as name, v.shortname as idnVatStr,
                v.value as stawka
            FROM opng_vat n
            INNER JOIN v_erp_vat v ON v.id = n.idvat
            INNER JOIN oppo p ON (p.idnoper = n.idnoper OR p.idnoperfin = n.idnoper) AND n.idvat = p.idnvat
            WHERE n.idnoper = _GUID
            GROUP BY n.IdVat;
        end if;
    END IF; -- _korekta = 0

   -- dla korekt trzeba zupelnie inaczej, z drugiej strony nie ma czesciowych pozycji i braku kwot walutowych
    IF _korekta = 1 THEN
        insert into t_opng_vat

        SELECT n.IdVat, n.Netto, n.Vat, n.Brutto, n.NettoWal, n.VatWal, n.BruttoWal,
            -- v.name as name, v.shortname as idnVatStr,
            v.value as stawka
        FROM opng_vat n
        INNER JOIN v_erp_vat v ON v.id = n.idvat
        WHERE n.idnoper = _GUID
        GROUP BY n.IdVat;

    END IF;



    SELECT
    -- 23% i 22%
    MAX(if(v.idvat in (15,0),v.nettowal,'')) as P_13_1,
    MAX(if(v.idvat in (15,0),v.vatwal,'')) as P_14_1,
    MAX(if(v.idvat in (15,0),v.vat,'')) as P_14_1W,
    -- 8%
    MAX(if(v.idvat in (16,1),v.nettowal,'')) as P_13_2,
    MAX(if(v.idvat in (16,1),v.vatwal,'')) as P_14_2,
    MAX(if(v.idvat in (16,1),v.vat,'')) as P_14_2W,
    -- 5%
    MAX(if(v.idvat in (8),v.nettowal,'')) as P_13_3,
    MAX(if(v.idvat in (8),v.vatwal,'')) as P_14_3,
    MAX(if(v.idvat in (8),v.vat,'')) as P_14_3W,
    -- 0%
    MAX(if(v.idvat in (2),v.netto,'')) as P_13_6_1,
    -- zw
    MAX(if(v.idvat in (3),v.netto,'')) as P_13_7,
    -- np
    MAX(if(v.idvat in (5),v.netto,'')) as P_13_8,
    -- oo
    MAX(if(v.idvat in (19),v.netto,'')) as P_13_10
    FROM t_opng_vat v
    ORDER BY v.stawka DESC
    ;

    DROP TEMPORARY TABLE IF EXISTS t_opng_vat;

/*
    IF @rodzaj in (1,3) THEN
      SELECT 
          -- 23% i 22%
          MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.nettowal,'')) as P_13_1,
          MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.vatwal,'')) as P_14_1,
          MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.vat,'')) as P_14_1W,
          -- 8%
          MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.nettowal,'')) as P_13_2,
          MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.vatwal,'')) as P_14_2,
          MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.vat,'')) as P_14_2W,
          -- 5%
          MAX(if(v.idvat in (8) and e.country_code = 'PL',v.nettowal,'')) as P_13_3,
          MAX(if(v.idvat in (8) and e.country_code = 'PL',v.vatwal,'')) as P_14_3,
          MAX(if(v.idvat in (8) and e.country_code = 'PL',v.vat,'')) as P_14_3W,
          -- 0%
          MAX(if(v.idvat in (2) and e.country_code = 'PL',v.netto,'')) as P_13_6_1,
          -- zw
          MAX(if(v.idvat in (3) and e.country_code = 'PL',v.netto,'')) as P_13_7,
          -- np
          MAX(if(v.idvat in (5) and e.country_code = 'PL',v.netto,'')) as P_13_8,
          -- oo
          MAX(if(v.idvat in (19) and e.country_code = 'PL',v.netto,'')) as P_13_10
      FROM opng_vat v
      JOIN erp_vat e ON e.id = v.idvat
      WHERE idnoper = _GUID
      GROUP BY v.idnoper;
    ELSEIF @rodzaj IN (80,85) THEN
      SELECT 
          -- 23%
          MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.nettowal,'')) as P_13_1,
          MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.vatwal,'')) as P_14_1,
          MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.vat,'')) as P_14_1W,
          -- 8%
          MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.nettowal,'')) as P_13_2,
          MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.vatwal,'')) as P_14_2,
          MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.vat,'')) as P_14_2W,
          -- 5%
          MAX(if(v.idvat in (8) and e.country_code = 'PL',v.nettowal,'')) as P_13_3,
          MAX(if(v.idvat in (8) and e.country_code = 'PL',v.vatwal,'')) as P_14_3,
          MAX(if(v.idvat in (8) and e.country_code = 'PL',v.vat,'')) as P_14_3W,
          -- 0%
          MAX(if(v.idvat in (2) and e.country_code = 'PL',v.netto,'')) as P_13_6_2,
          -- zw
          MAX(if(v.idvat in (3) and e.country_code = 'PL',v.netto,'')) as P_13_7,
          -- np
          MAX(if(v.idvat in (5) and e.country_code = 'PL',v.netto,'')) as P_13_8,
          -- oo
          MAX(if(v.idvat in (19) and e.country_code = 'PL',v.netto,'')) as P_13_9
      FROM opng_vat v
      JOIN erp_vat e ON e.id = v.idvat
      WHERE idnoper = _GUID
      GROUP BY v.idnoper;
      ELSEIF @rodzaj IN (50,90) THEN
        SELECT 
            -- 23%
            MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.nettowal,'')) as P_13_1,
            MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.vatwal,'')) as P_14_1,
            MAX(if(v.idvat in (15,0) and e.country_code = 'PL',v.vat,'')) as P_14_1W,
            -- 8%
            MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.nettowal,'')) as P_13_2,
            MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.vatwal,'')) as P_14_2,
            MAX(if(v.idvat in (16,1) and e.country_code = 'PL',v.vat,'')) as P_14_2W,
            -- 5%
            MAX(if(v.idvat in (8) and e.country_code = 'PL',v.nettowal,'')) as P_13_3,
            MAX(if(v.idvat in (8) and e.country_code = 'PL',v.vatwal,'')) as P_14_3,
            MAX(if(v.idvat in (8) and e.country_code = 'PL',v.vat,'')) as P_14_3W,
            -- 0%
            MAX(if(v.idvat in (2) and e.country_code = 'PL',v.netto,'')) as P_13_6_3,
            -- zw
            MAX(if(v.idvat in (3) and e.country_code = 'PL',v.netto,'')) as P_13_7,
            -- np
            MAX(if(v.idvat in (5) and e.country_code = 'PL',v.netto,'')) as P_13_8,
            -- oo
            MAX(if(v.idvat in (19) and e.country_code = 'PL',v.netto,'')) as P_13_9
        FROM opng_vat v
        JOIN erp_vat e ON e.id = v.idvat
        WHERE idnoper = _GUID
        GROUP BY v.idnoper;
    END IF;
*/

END IF;

/*
CALL m_api('KSEF_GET_OPPO',@guid,'','','','','','DEBUG');
pobranie danych pozycji dokumentu do ksef
*/

IF _MODE = 'KSEF_GET_OPPO' THEN

    -- badamy rodzaj grupowania i z tego wywolujemy rozne podsekcje
    CALL _IReg_Get('OPNGINFOPATH', 'Dok. drukować grupując towary', 0, 'INT', @session.grupowanie.pozycji, '0');

    IF (select count(*) from oppo where (idnoper = _GUID OR idnoperfin = _GUID) and grp_GUID <> '') > 0 THEN
        SET @session.grupowanie.pozycji = '10';
    END IF;

    IF @session.grupowanie.pozycji = '10' THEN -- grupowanie internalne
        -- CALL fr_ht_OPZM('GRUPOWANIE_INTERNALNE', _GUID, _scenario, _translate, 'KSEF', _Param_B, _Param_C, _Param_D);
        -- z parametrem KSEF procedura tylko przygotowuje tabele tymczasowe, do wykorzystania dalej
        CALL fr_ht_OPZM('GRUPOWANIE_INTERNALNE', _GUID, '', '', 'KSEF', '', '', '');

        -- select * from t_oppo_grp_prn;

        SELECT
        p.lp as NrWierszaFa,
          -- p.guid as UU_ID,
          '' as UU_ID, -- wyrzucamy jako zbedne
          -- p.datasprzed as P_6A,
          '' as P_6A, -- indywidualna data sprzedazy, nie obslugujemy tego na razie

          case when @session.globals.Owner IN ('SEVENET') and grp_towrnazwa = '' then
          p.towrnazwa2
          when @session.globals.Owner IN ('SEVENET') and grp_towrnazwa <> '' then
          p.grp_towrnazwa
          else p.towrnazwa
          end as P_7,

          case when @session.globals.Owner IN ('SEVENET') then
          ''
          else
          p.towrsymb
          end as Indeks,

          IFNULL(t.kod_kreskowy,'') as GTIN,
          IFNULL(t.pkwiu, '') as PKWiU,
          IFNULL(t.pcn,'') as CN,
          IF(IFNULL(j.nazwa,'')='','szt.',j.nazwa) AS P_8A,
          p.ilosc as P_8B,
          -- p.cenanet as P_9A,
          p.cenanetwal as P_9A,
          -- p.wartnet as P_11,
          p.wartnetwal as P_11,
          -- wartbrt as  P_11A,
          wartbrtwal as  P_11A,
          _Rnd2(p.wartvat) as  P_11Vat, -- podatek w PLN
          CASE
            WHEN LOWER(e.shortname) like '0%' THEN
              CASE
                WHEN @rodzaj IN (80,85) THEN '0 WDT'
                WHEN @rodzaj IN (50,90) THEN '0 EX'
                ELSE '0 KR'
              END
            WHEN LOWER(e.shortname) LIKE 'zw%' THEN 'zw'
            WHEN LOWER(e.shortname) LIKE 'odw%' THEN 'oo'
            WHEN LOWER(e.shortname) LIKE 'np%' THEN
              CASE
                WHEN @rodzaj IN (80,85,80,90) THEN 'np I'
                ELSE 'np II'
              END
            ELSE replace(e.shortname,'%','')
          END as P_12,
          IF(kurs <> 1, kurs, '') AS KursWaluty
      FROM t_oppo_grp_prn p
      LEFT JOIN TowrNg t ON t.guid = p.idntowr -- tutaj moze byc problem, bo bez left wycina pozycje grupowane
      -- ale za to teraz brakuje czesci danych z kartoteki towarow
      LEFT JOIN Jednostki j ON j.idn = p.jednostka
      JOIN erp_vat e ON e.id = p.idnvat AND e.country_code = 'PL'
      WHERE p.idnoperfin = _GUID
      ORDER BY NrWierszaFa;

    END IF; -- grupowanie internalne

    IF @session.grupowanie.pozycji = '0' THEN -- czyli pierwotna sciezka, bez grupowania

    SET @mode=_MODE;
    IF @rodzaj in (3,85,90) and @tytulkorekty != -1 THEN
      SELECT 
        p.lp as NrWierszaFa,
        c.guid as UU_ID,

        case when @session.globals.Owner IN ('SEVENET') then
        c.b_towrnazwa2
        else
        c.b_towrnazwa
        end as P_7,

        -- c.b_towrsymb as Indeks,
        case when @session.globals.Owner IN ('SEVENET') then
        ''
        else
        c.b_towrsymb
        end as Indeks,

        t.kod_kreskowy as GTIN,
        t.pkwiu as PKWiU,
        t.pcn as CN,
        j.nazwa as P_8A,
        c.b_ilosc as P_8B,
        c.b_cenanet as P_9A, -- ta cena jest w walucie
        -- c.b_wartnet as P_11,
        c.b_wartnetwal as P_11,
        -- c.b_wartbrt as  P_11A,
        c.b_wartbrtwal as  P_11A,
        _Rnd2(c.b_wartvat) as  P_11Vat, -- podatek w PLN
        CASE
          WHEN LOWER(e.shortname) like '0%' THEN
            CASE
              WHEN @rodzaj IN (85) THEN '0 WDT'
              WHEN @rodzaj IN (90) THEN '0 EX'
              ELSE '0 KR'
            END
          WHEN LOWER(e.shortname) LIKE 'zw%' THEN 'zw'
          WHEN LOWER(e.shortname) LIKE 'odw%' THEN 'oo'
          WHEN LOWER(e.shortname) LIKE 'np%' THEN
            CASE
              WHEN @rodzaj IN (80,85,80,90) THEN 'np I'
              ELSE 'np II'
            END
          ELSE replace(e.shortname,'%','')
        END as P_12,
        IF(c.b_kurs <> 1, c.b_kurs, '') AS KursWaluty,
        '1' as StanPrzed
      FROM oppo_corr c
      JOIN oppo p ON p.guid = c.guid_orig AND c.changed = 1
      JOIN TowrNg t ON t.guid = c.b_idntowr
      JOIN Jednostki j ON j.idn = c.b_jednostka
      JOIN erp_vat e ON e.id = c.b_idnvat
      WHERE c.idnoper_corr = _GUID AND e.country_code = 'PL'
      UNION
      SELECT 
        p.lp as NrWierszaFa,
        c.guid as UU_ID,

        case when @session.globals.Owner IN ('SEVENET') then
        c.j_towrnazwa2
        else
        c.j_towrnazwa
        end as P_7,

        -- c.j_towrsymb as Indeks,
        case when @session.globals.Owner IN ('SEVENET') then
        ''
        else
        c.j_towrsymb
        end as Indeks,

        t.kod_kreskowy as GTIN,
        t.pkwiu as PKWiU,
        t.pcn as CN,
        IF(IFNULL(j.nazwa,'')='','szt.',j.nazwa) AS P_8A,
        c.j_ilosc as P_8B,
        c.j_cenanet as P_9A, --  ta cena jest w walucie
        c.j_wartnetwal as P_11,
        c.j_wartbrtwal as  P_11A,
        _Rnd2(c.j_wartvat) as  P_11Vat, -- podatek w PLN
        CASE
          WHEN LOWER(e.shortname) like '0%' THEN
            CASE
              WHEN @rodzaj IN (85) THEN '0 WDT'
              WHEN @rodzaj IN (90) THEN '0 EX'
              ELSE '0 KR'
            END
          WHEN LOWER(e.shortname) LIKE 'zw%' THEN 'zw'
          WHEN LOWER(e.shortname) LIKE 'odw%' THEN 'oo'
          WHEN LOWER(e.shortname) LIKE 'np%' THEN
            CASE
              WHEN @rodzaj IN (80,85,80,90) THEN 'np I'
              ELSE 'np II'
            END
          ELSE replace(e.shortname,'%','')
        END as P_12,
        IF(c.j_kurs <> 1, c.j_kurs, '') AS KursWaluty,
        '' as StanPrzed
      FROM oppo_corr c
      JOIN oppo p ON p.guid = c.guid_orig AND c.changed = 1
      JOIN TowrNg t ON t.guid = c.j_idntowr
      JOIN Jednostki j ON j.idn = c.j_jednostka
      JOIN erp_vat e ON e.id = c.j_idnvat AND e.country_code = 'PL'
      WHERE c.idnoper_corr = _GUID;

    ELSE -- od tego miejsca sa pozycje faktur, nie korekt
      SELECT
          p.lp as NrWierszaFa,
          p.guid as UU_ID,
          -- p.datasprzed as P_6A,
          '' as P_6A, -- indywidualna data sprzedazy, nie obslugujemy tego na razie

          case when @session.globals.Owner IN ('SEVENET') then
          p.towrnazwa2
          else p.towrnazwa
          end as P_7,

          case when @session.globals.Owner IN ('SEVENET') then
          ''
          else
          p.towrsymb
          end as Indeks,

          t.kod_kreskowy as GTIN,
          t.pkwiu as PKWiU,
          t.pcn as CN,
          IF(IFNULL(j.nazwa,'')='','szt.',j.nazwa) AS P_8A,
          p.ilosc as P_8B,
          -- p.cenanet as P_9A,
          p.cenanetwalzrab as P_9A,
          -- p.wartnet as P_11,
          p.wartnetwal as P_11,
          -- wartbrt as  P_11A,
          wartbrtwal as  P_11A,
          -- IF(_kurs_op <> 1, _Rnd2(p.wartvat), '') as P_11Vat, -- podatek w PLN

          case when @session.globals.Owner IN ('SEVENET') then
          ''
          else
          _Rnd2(p.wartvat)
          end P_11Vat,

          CASE
            WHEN LOWER(e.shortname) like '0%' THEN
              CASE
                WHEN @rodzaj IN (80,85) THEN '0 WDT'
                WHEN @rodzaj IN (50,90) THEN '0 EX'
                ELSE '0 KR'
              END
            WHEN LOWER(e.shortname) LIKE 'zw%' THEN 'zw'
            WHEN LOWER(e.shortname) LIKE 'odw%' THEN 'oo'
            WHEN LOWER(e.shortname) LIKE 'np%' THEN
              CASE
                WHEN @rodzaj IN (80,85,80,90) THEN 'np I'
                ELSE 'np II'
              END
            ELSE replace(e.shortname,'%','')
          END as P_12,
          IF(kurs <> 1, kurs, '') AS KursWaluty
      FROM oppo p
      JOIN TowrNg t ON t.guid = p.idntowr
      LEFT JOIN Jednostki j ON j.idn = p.jednostka
      JOIN erp_vat e ON e.id = p.idnvat AND e.country_code = 'PL'
      WHERE p.idnoperfin = _GUID
      ORDER BY NrWierszaFa;
    END IF;

    END IF; -- grupowanie pozycji 0

END IF;

/*
CALL m_api('KSEF_GET_UWAGI',@guid,'','','','','','DEBUG');
pobranie uwag do faktury i do pozycji do ksef
uwagi potem sa w jednej sekcji DodatkowyOpis, z numerem wiersza (dla pozycji) i bez numeru (dla uwag faktury)
co ze znakami zakazanymi w xml? robic to tutaj czy caly plik jest potem sprawdzany?
*/
IF _MODE = 'KSEF_GET_UWAGI' THEN
    SET @mode=_MODE;

    DROP TABLE IF EXISTS tt_ksef_uwagi;
    CREATE TEMPORARY TABLE tt_ksef_uwagi (
    NrWiersza VARCHAR(10) DEFAULT '',
    Klucz VARCHAR(256) DEFAULT '',
    Wartosc VARCHAR(256) DEFAULT '',
    lp INT DEFAULT NULL -- wewnetrzna numeracja czesci uwagi, do sortowania
    ) DEFAULT CHARSET=utf8;

    SET _dl_max = 256; -- maksymalna dlugosc sekcji, wynika ze sepcyfikacji ksef, uwaga z deklaracja zmiennej _czesc

    -- na razie uwagi do calej faktury
    SELECT IFNULL(CHAR_LENGTH(uwagi), 0), uwagi
    INTO _dl, _uwagi
    FROM opng
    WHERE guid = _GUID;
    SET _i = 1, _lp = 1;

    WHILE _i <= _dl DO
        -- 1. Wycinamy czyste 256 znaków
        SET _czesc = SUBSTRING(_uwagi, _i, _dl_max);

        -- 2. Escapujemy znaki specjalne
        SET _czesc = _escape_to_xml(_czesc);

        -- 3. wstawiamy do tabeli tymczasowej
        insert into tt_ksef_uwagi
        SELECT
        '' AS NrWiersza,
        'Uwagi_do_faktury' AS Klucz,
        _czesc AS Wartosc,
        _lp as lp
        ;

        SET _i = _i + _dl_max;
        SET _lp = _lp +1;
    END WHILE;

    -- uwagi do pozycji, moze ich byc wiele, wybieramy te, ktore istnieja do kursora, potem jak wyzej, ale z nr wiersza
    BEGIN
        DECLARE done BOOL DEFAULT FALSE;
        DECLARE _GUIDoppo VARCHAR(38);
        DECLARE c_proc CURSOR FOR
        SELECT GUID FROM oppo WHERE idnoperfin = _GUID AND IFNULL(CHAR_LENGTH(uwagi), 0) > 1;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
        OPEN c_proc;
        loop1: LOOP
            FETCH c_proc INTO _GUIDoppo;
            IF done THEN
            LEAVE loop1;
            END IF;

            SELECT IFNULL(CHAR_LENGTH(uwagi), 0), uwagi, lp
            INTO _dl, _uwagi, _lp_oppo
            FROM oppo
            WHERE guid = _GUIDoppo;
            SET _i = 1, _lp = 1;

            WHILE _i <= _dl DO
                -- 1. Wycinamy czyste 256 znaków
                SET _czesc = SUBSTRING(_uwagi, _i, _dl_max);

                -- 2. Escapujemy znaki specjalne
                SET _czesc = _escape_to_xml(_czesc);

                -- 3. wstawiamy do tabeli tymczasowej
                insert into tt_ksef_uwagi
                SELECT
                _lp_oppo AS NrWiersza,
                'Uwagi_do_poz' AS Klucz,
                _czesc AS Wartosc,
                _lp as lp
                ;

                SET _i = _i + _dl_max;
                SET _lp = _lp +1;
            END WHILE;

        END LOOP;
        CLOSE c_proc;
    END;

    /*
    SELECT
      lp AS NrWiersza,
      'Uwagi_do_poz' AS Klucz,
      uwagi AS Wartosc
    FROM oppo
    WHERE idnoperfin = _GUID AND length(uwagi) > 3
    ORDER BY NrWiersza+0
    ;
    */

    SELECT NrWiersza, Klucz, Wartosc FROM tt_ksef_uwagi ORDER BY NrWiersza + 0, lp;


END IF;





END $$

DELIMITER ;

/*
$Log: m_api.sql,v $
Revision 1.38  2026/01/29 09:13:22  waliant
$SEND$ P_15 i indeksy w korektach

Revision 1.37  2026/01/29 08:02:43  robert
Zabezpieczenie przed brakiem split_payment w opng z TE_opng

Revision 1.36  2026/01/28 13:57:42  waliant
platnik i numery rach

Revision 1.35  2026/01/28 09:24:28  waliant
Zmiana w tablece vat, cen wal dla pozycji dla grupowanych

Revision 1.34  2026/01/26 12:48:36  waliant
Rozbudowa cd

Revision 1.33  2026/01/22 13:50:54  waliant
Grupowanie internalne i dzielone uwagi

Revision 1.32  2026/01/21 13:25:44  waliant
Rozbudowa

Revision 1.31  2026/01/21 08:58:30  waliant
Rozbudowa

Revision 1.30  2026/01/16 08:17:31  apro
idnoperfin

Revision 1.29  2026/01/15 11:12:07  robert
Zmiany pod KSeF
$SEND$

Revision 1.28  2026/01/12 06:21:22  robert
Poprawki - zabezpieczenia

Revision 1.27  2026/01/10 10:47:04  robert
Pomijanie importu z ksef kontrahentow do pominiecia
Generowanie listy podmiotow trzecich
Inne pod KSeF

Revision 1.26  2026/01/08 06:07:01  apro
rodzaj

Revision 1.25  2026/01/05 13:27:32  apro
Rodzaj - alternatywnie wg id

Revision 1.24  2026/01/02 08:14:43  apro
reformat, wyjątki dla SEV

Revision 1.23  2026/01/02 07:29:16  robert
sposoby zaplaty w update_opng

Revision 1.22  2025/12/16 09:24:06  robert
Podstawowa czesc KSEFowa gotowa, import i eksport dziala.

Revision 1.21  2025/11/06 13:20:25  robert
Zmiany dla korekty ksef

Revision 1.20  2025/10/24 14:01:11  robert
Poprawki do ksef

Revision 1.19  2025/10/24 11:45:11  robert
Pierwsze elementy pod API KSEF (absolutna podstawa)

Revision 1.18  2025/10/24 10:13:43  robert
Pierwsze elementy pod API KSEF

Revision 1.17  2025/10/22 07:29:44  apro
ksef 0.1

Revision 1.16  2025/10/22 07:28:15  apro
ksef 0

Revision 1.15  2025/10/07 12:44:59  apro
usuwanie z zachowanie nrwewn - c.d.

Revision 1.14  2025/10/07 05:20:46  apro
zachowanie nrwewn

Revision 1.13  2025/09/05 13:00:26  apro
SEV - absencje

Revision 1.12  2025/03/10 09:01:15  waliant
$SEND$ Warningi

Revision 1.11  2024/04/16 12:53:07  apro
..literówka

Revision 1.10  2024/04/15 13:02:36  apro
default 23%

Revision 1.9  2023/08/24 12:39:43  rafalg
opis vat sevenet

Revision 1.8  2023/06/27 05:49:50  apro
*** empty log message ***

Revision 1.7  2023/06/12 12:18:13  apro
*** empty log message ***

Revision 1.6  2023/04/19 06:51:08  rafalg
uzupelnianie cvs

Revision 1.5  2023/02/24 08:57:04  apro
literówka

Revision 1.4  2022/07/11 06:06:54  apro
*** empty log message ***

Revision 1.3  2022/05/26 04:59:20  apro
..

Revision 1.2  2022/05/18 06:34:02  apro
waluta

Revision 1.1  2022/05/17 06:10:58  apro
0

*/
