 SET NAMES CP1250;

DELIMITER $$

DROP PROCEDURE IF EXISTS fk_dekretacja$$

CREATE DEFINER='root'@'localhost' PROCEDURE fk_dekretacja(
    IN _MODE VARCHAR(150),
    IN _GUID VARCHAR(38),
    IN _PARAM_A VARCHAR(250),
    IN _PARAM_B VARCHAR(250),
    IN _PARAM_C VARCHAR(250)
)

/*
CALL fk_dekretacja('DEKRETUJ_OPER',@guid,'','','DEBUG');
CALL fk_dekretacja('CHECK_UPR',@guid,@osobaguid,'','DEBUG');
CALL fk_dekretacja('CHECK_UPR_DETAIL',@guid,@osobaguid,'','DEBUG');
create temporary table t_guid select guid from opng where rodzaj in (0,1,2,3,4) and datawystaw between '2024-12-01' and '2024-12-31' and deleted=0 and (netto+brutto)<>0;
CALL fk_dekretacja('DEKRETUJ_ALL','','','DEBUG');
CALL fk_dekretacja('USUN_DEKRET',@guid,'','','DEBUG');
SET @guid='0d3f0083393938fde8df737451d9de7e';
select guid into @guid from opng where idn=7656600;
rgl:
select guid from opng where idn=114429;
select t.wyroznik,sum(o.wartnet) as netto,sum(o.wartmag) as wmag from oppo o, TowrNg t where t.guid=o.idntowr and o.idnoperfin=@guid group by wyroznik;
7655612, 7658556

update IReg set valueb=1 where idkey like "AutomatycznaDekretacjaCall";

TODO: 
ustawianie katcoli z operacji
rozpulchnienie przy dekretacji z dokł. do katcoli z pozycji
testy na operacjach bankowych
dodanie zapisu do logu przy dekretacji
rodzaj_fk
dodanie typu kwoty - wg znaku - dodatnie, wg znaku - ujemne
*/

DEKRETUJ: BEGIN
DECLARE _ROK INT DEFAULT 0;
DECLARE _DEBUG,_VERBOSE BOOLEAN;
DECLARE _WZORDEKR,_WZORDEKRGUID,_KONTRGUID,_PLATNIKGUID,_ZLECENIEGUID VARCHAR(38);

SET _DEBUG=_PARAM_C LIKE '%DEBUG%',_VERBOSE=_Param_C LIKE '%VERBOSE%';

IF ISNULL(@session.globals.Owner) THEN SELECT g.value from _db_globals g WHERE g.key='Owner' INTO @session.globals.Owner; END IF;
SET @session.Registration.UserLogin=ifnull(@SYSTEM.Client.Session.log_USER,ifnull(@session.Registration.UserLogin,'root'));

SET @session.has_webdoc=IFNULL(@session.has_webdoc,(SELECT count(*)>0 from oppo_budzet)),@session.FK.IR.Dekretacja_webdoc_wersja=1;
-- ustawia domyślną wersję dekretacji
-- TODO
-- CALL _IReg_Get_2('FK', 'Dekretacja_webdoc_wersja', 0, 'INTEGER', @session.FK.IR.Dekretacja_webdoc_wersja, @session.has_webdoc, '@session.FK.IR.Dekretacja_webdoc_wersja');
-- CALL _IReg_Get('@session.FK.IR.Dekretacja_webdoc_wersja', 'FK', 'Dekretacja_webdoc_wersja', 0, 'INTEGER', @session.FK.IR.Dekretacja_webdoc_wersja, @session.has_webdoc);

IF _MODE = 'USUN_DEKRET' THEN
-- tylko zapisy o statusie tymczasowym  
-- TODO: log?
    DELETE FROM zapisy where idnoper=_GUID AND status=0;
    UPDATE opng SET zaksiegowana=0,datadekretacji=NULL WHERE guid=_GUID;
END IF;
  
IF _MODE = 'DEKRETUJ_OPER' THEN 
    SELECT zaksiegowana,wzordekr FROM opng WHERE guid=_GUID INTO @zaksiegowana,@wzordekr;
    IF @zaksiegowana=1 THEN LEAVE DEKRETUJ; END IF;

    IF @wzordekr='WEBDOC' THEN
        IF @session.FK.IR.Dekretacja_webdoc_wersja=1 THEN
            CALL fk_webdoc_dekret('DEKRETUJ_OPER',_GUID,'','','');
        END IF;
        IF @session.FK.IR.Dekretacja_webdoc_wersja=2 THEN
            CALL fk_webdoc_dekret2('DEKRETUJ_OPER',_GUID,'','','');
        END IF;
    ELSE    
        CALL fk_dekretacja('DEKRETUJ_OPER_AUTO',_GUID,'','','');
    END IF;
    -- TODO: ujednolicić
    SELECT zaksiegowana FROM opng WHERE guid=_GUID INTO @zaksiegowana;
    CALL fk_update_zaksiegowana('OperToUpdateZaksiegowanaSQL0',_GUID,@zaksiegowana,'','','');
    CALL fk_update_zaksiegowana('OperToUpdateZaksiegowanaSQL1',_GUID,'','','','');
    CALL fk_update_zaksiegowana('OperToUpdateZaksiegowanaSQL2',_GUID,'','','','');
END IF;

/*
przykładowe tworzenie tabeli tymczasowej
DROP TEMPORARY TABLE IF EXISTS t_guid;
CREATE TEMPORARY TABLE t_guid AS SELECT guid FROM opng WHERE zaksiegowana=0 AND datawystaw BETWEEN '2024-08-01' AND '2024-08-01' and wzordekr='SprzedazGaz';
CALL fk_dekretacja('DEKRETUJ_ALL','','','','');
*/

IF _MODE = 'DEKRETUJ_ALL' THEN
    SELECT COUNT(*),now() FROM t_guid INTO @ile,@czasstartu;
    SET @ilejeszcze=@ile;

    IF _VERBOSE THEN
        SELECT @ile AS Ile_operacji;
        SET @krok=_VarInt(SUBSTRING_INDEX(_Param_C,'=',-1));
        IF @krok=0 THEN SET @krok=100; END IF;
    END IF;   

    BEGIN
        DECLARE alldone BOOL DEFAULT FALSE;
        DECLARE c_proc CURSOR FOR SELECT guid FROM t_guid;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET alldone = TRUE;
        
        OPEN c_proc;
        loop2: LOOP
            SET alldone = FALSE;
            FETCH c_proc INTO _guid;
            IF alldone THEN LEAVE loop2; END IF;
            CALL fk_dekretacja('DEKRETUJ_OPER',_GUID,_Param_A,_Param_B,_Param_C);
            IF _VERBOSE THEN
                SET @ilejeszcze=@ilejeszcze-1;
                IF @ilejeszcze MOD @krok = 0 THEN
                    SET @timeelapsed=TIMEDIFF(now(),@czasstartu),@secondselapsed=TIME_TO_SEC(@timeelapsed),
                        @czas_na_oper=@secondselapsed/(@ile-@ilejeszcze),
                        @czas_pozostaly=@czas_na_oper*(@ilejeszcze);
                    SELECT @ilejeszcze,@timeelapsed as czas,@czas_na_oper as czas_na_operacje,@czas_pozostaly as czas_pozostaly;
                END IF;  
            END IF;
        END LOOP;
        CLOSE c_proc;
        IF _VERBOSE THEN
            SELECT 'KONIEC:' as koniec,@ile,timediff(now(),@czasstartu) as czas,time_to_sec(timediff(now(),@czasstartu))/@ile as czas_na_operacje;
        END IF;
    END;  
END IF;    

IF _MODE LIKE 'CHECK_UPR%' THEN
    SELECT COUNT(*) AS Ile,
    SUM(ISNULL(P.idn)) as Brak,
    SUM(IF(ISNULL(P.idn),1,IFNULL(
	    (SELECT COUNT(*) FROM grupy_osob grp WHERE grp.grupaGUID=P.ugrpGUID AND grp.osobaGUID=_Param_A)>0,1))
	  ) as OK
    FROM zapisy Z
    LEFT JOIN plankont P ON P.symbol=Z.konto AND P.Rok = Z.Rok 
    WHERE Z.idnoper = _GUID
    INTO @Ile,@Brak,@OK;
    IF _MODE='CHECK_UPR_DETAIL' THEN
        SELECT @Ile AS Ile,@Brak AS Brak,@OK AS OK;
    ELSE
        SELECT @ile=@ok AS OK;
    END IF;
END IF;    

/*
CALL fk_dekretacja('DEKRETUJ_OPER_AUTO.KATCOLS',@guid,'','','DEBUG');
*/
IF _MODE = 'DEKRETUJ_OPER_AUTO.KATCOLS'  THEN
    DROP TEMPORARY TABLE IF EXISTS t_dekret_katcols;
    CREATE TEMPORARY TABLE t_dekret_katcols (
        k varchar(10) primary key,
        c int not null default -1,
        p int not null default -1,
        v int not null default 0,
        sqltext varchar(1000) default '',
        msg varchar(250) default ''
    );
    SET @i=0;
    WHILE @i<10 DO
        SET @sql=CONCAT('INSERT IGNORE INTO t_dekret_katcols (k) SELECT kat',@i,'def FROM t_dekret where kat',@i,'def<>""');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        SET @i=@i+1;
    END WHILE;
    DEALLOCATE PREPARE stmt;
    UPDATE t_dekret_katcols SET c=_VarINT(mid(k,3,1)) 
    WHERE length(k)=3 and LEFT(k,2) IN ('%c','%a') AND (mid(k,3,1) BETWEEN '0' AND '9');
    UPDATE t_dekret_katcols SET c=_VarINT(mid(k,5,1)),p=_VarINT(mid(k,4,1)) 
    WHERE length(k)=5 and LEFT(k,3)='%cp' AND (mid(k,4,1) BETWEEN '0' AND '9') AND (mid(k,5,1) BETWEEN '1' AND '5');
    -- TODO: - trochę na wyrost
    UPDATE t_dekret_katcols SET c=-2 WHERE k in ('%k','%l','%p','%r','%w','%z','%zs','%mz','%md'); 
    UPDATE t_dekret_katcols SET c=-1 WHERE c<>-2 AND c NOT BETWEEN 0 AND 4; -- 0-4 to kategorie kolumnowe z operacji, na razie nie obsługujemy obrotów
    UPDATE t_dekret_katcols SET p=-1 WHERE p>-1 AND p NOT BETWEEN 1 AND 5; 
    UPDATE t_dekret_katcols SET msg="błąd definicji kategorii kolumnowej" WHERE c=-1 OR (LEFT(k,3)='%cp' AND p=-1);

    UPDATE t_dekret_katcols SET sqltext=
        CONCAT("UPDATE t_dekret_katcol SET v=(SELECT kat",c," FROM opng WHERE guid='",_GUID,"'") 
    WHERE k like '\%c_' AND msg='';

    UPDATE t_dekret_katcols SET sqltext=
        CONCAT("UPDATE t_dekret_katcol SET v=(SELECT k.kontofk FROM opng  n,katcols k ",
                "WHERE k.klucz=n.katcol",c," AND n.guid='",_GUID,"' AND k.typ=0 AND k.colnr=",c+1)
    WHERE k like '\%a_' AND msg='';

    UPDATE t_dekret_katcols SET sqltext=
        CONCAT("UPDATE t_dekret_katcol SET v=(SELECT k.param",p," FROM opng  n,katcols k ",
                "WHERE k.klucz=n.katcol",c," AND n.guid='",_GUID,"' AND k.typ=0 AND k.colnr=",c+1)
    WHERE k like '\%cp__' AND msg='';

/*        CASE @param
            WHEN 'oc' THEN SET @paramsql=
                CONCAT("SELECT o.katcol",@katcol," INTO @paramval FROM opng n,Pracownicy p ",
                        "WHERE n.osobaguid=p.guid and n.guid='",_GUID,"'");
        END CASE;
*/
    BEGIN
        DECLARE fkdone BOOLEAN DEFAULT FALSE;
        DECLARE _SQL VARCHAR(2000);
        DECLARE _K VARCHAR(10);
        
        DECLARE c_proc CURSOR FOR SELECT k,sqltext FROM t_dekret_katcols; 
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET fkdone = TRUE;
        OPEN c_proc;
        loop2: LOOP
            SET fkdone=FALSE;
            FETCH c_proc INTO _K,_SQL;
            IF fkdone THEN LEAVE loop2; END IF;
            IF _DEBUG THEN SELECT _SQL; END IF;
            CALL _ExecuteCmd(_SQL, @Error);
            IF @error<>'' THEN
                UPDATE t_dekret_katcols SET msg=CONCAT('błąd wykonania: ',@error) WHERE k=_K;
            END IF;
        END LOOP;
        CLOSE c_proc;

    END;
    SELECT * FROM t_dekret_katcols;
END IF;

/*
idny: 7629110, 7629112
select guid into @guid from opng where idn=7629110;
set @guid='7f15cb41-479a-11f1-96f8-e4434b6ff4e5*';
set @guid='{1CC13442-DAA1-477D-B805-2E4C5A634178}';
CALL fk_dekretacja('USUN_DEKRET',@guid,'','','DEBUG');
CALL fk_dekretacja('DEKRETUJ_OPER_AUTO',@guid,'','','DEBUG');

*/

IF _MODE = 'DEKRETUJ_OPER_AUTO'  THEN
-- datadowSrc, dataoperSrc =0 - default
    SET _ROK=0,@dekretuj.status='',@datadowodu=NULL,_WZORDEKR=NULL,@zaksiegowana=NULL,@kontofkkontrah=NULL;
    SELECT n.kontrguid,n.platnikguid,n.zlecenieguid,IFNULL(n.wzordekr,''),n.fvrudowz,n.zaksiegowana,
        IFNULL(n.opis,'') as opis,IFNULL(n.dotyczy,'') as dotyczy,n.rodzajdowodu,
        n.datawystaw,n.datasprzed,n.datawplywu,n.data_VAT,IFNULL(n.nrdokfin,''),
        IFNULL(n.nrwewn,''),IFNULL(n.nrdokmag,''), n.rodzaj, d.nazwa,
        IF(IFNULL(n.zmagazynu,0)>0,(SELECT m.grupa_dekretacji FROM Magazyny m WHERE m.idnmagazynu=n.zmagazynu),0) as zmagazynu,
        IF(IFNULL(n.domagazynu,0)>0,(SELECT m.grupa_dekretacji FROM Magazyny m WHERE m.idnmagazynu=n.domagazynu),0) as domagazynu,
        IF(d.dekr_data_dowodu='datawplywu',n.datawplywu,IF(d.dekr_data_dowodu='datasprzed',n.datasprzed,n.datawystaw)) as datadowodu, 
        IF(d.dekr_data_oper='datawystaw',n.datawystaw,IF(d.dekr_data_oper='datasprzed',n.datasprzed,n.datawystaw)) as dataoper,
        n.kontrsymbol,IFNULL(n.kontofk,''),IFNULL(n.kontofk2,''),
        IF(n.rodzaj in (36,37),
            (SELECT bb.kontofk FROM banki bb where bb.idn=n.nrkasy),
            IF(n.rodzaj in (20,21),
              (SELECT bk.kontofk FROM kasy bk where bk.idn=n.nrkasy),'')
        ) as kontoksbn
        
        INTO _KONTRGUID,_PLATNIKGUID,_ZLECENIEGUID,_WZORDEKR,@dowz,@zaksiegowana,@opis,@dotyczy,@rodzajdowodu,
            @datawystaw,@datasprzed,@datawplywu,@dataVAT,@nrdokfin,@nrwewn,@nrdokmag,
            @rodzaj,@rodzajnazwa,@zmagazynu,@domagazynu,@datadowodu,@dataoper,@kontrsymbol,@kontofk,@kontofk2,@kontoksbn
    
    FROM opng n
    INNER JOIN operdoc d ON d.rodzaj=n.rodzaj
    WHERE n.guid=_GUID;
    
    SET @wzordekr=_WZORDEKR;

    SET @dekretuj.status = IF(ISNULL(_WZORDEKR),CONCAT('Brak operacji:',_GUID),'');
    SET @dekretuj.status = IF(@dekretuj.status='' AND @zaksiegowana,CONCAT(_UTF8'Operacja jest już zaksięgowana',' dla:',_GUID),@dekretuj.status);
    
    SELECT idn into _ROK FROM lata_obrachunkowe WHERE @datadowodu BETWEEN DataBO and DataBZ LIMIT 1;SET @rok=_ROK;
    SET @dekretuj.status = IF(@dekretuj.status='' AND _ROK=0,CONCAT('Brak roku obrachunkowego dla daty dowodu:',_VarStr(@datadowodu),' dla:',_GUID),@dekretuj.status);

    SELECT GUID,rodzaj_numeru INTO _WZORDEKRGUID,@rodzaj_numeru FROM wzordekr WHERE symbol=_WZORDEKR AND rok=_ROK LIMIT 1;
    SET @dekretuj.status = IF(@dekretuj.status='' AND _WZORDEKRGUID IS NULL,CONCAT('Brak wzorca dekretacji ',_WZORDEKR,' dla:',_GUID),@dekretuj.status);
    
    IF @dekretuj.status<>'' THEN
        SELECT @dekretuj.status AS status;
        LEAVE DEKRETUJ;
    END IF;

    SET @nrdowodu=IF(@rodzaj_numeru=0,@nrdokfin,IF(@rodzaj_numeru=1,@nrwewn,@nrdokmag));
    SET @nrdowodu=IF((SELECT valueb FROM IReg WHERE idkey='Dekretacja_Dodaj_rodzaj_operacji_do_numeru_dowodu'),CONCAT(@rodzajnazwa,@nrdowodu),@nrdowodu);
    SET @nrdok=IF(@rodzaj IN (20,21),@nrdokkas,IF(@rodzaj IN (36,37),@nrraportu,@nrdokfin));
    SET @nrdok=IF(@nrdok='',@nrdokwewn,@nrdok),@nrdok=IF(@nrdok='',@nrdokmag,@nrdok);
    SET @idnoperfld=IF(@dowz,'idnoperfin','idnoper');
    SET @magazyn=IF(@zmagazynu<>0,@zmagazynu,@domagazynu);
    SET @okres=IFNULL(LEFT(@datadowodu,7)<>LEFT(@dataVAT,7)+1,1); -- 0 - dowolny, 1 - bieżący, 2 - przyszły

    IF _DEBUG THEN 
        SELECT @rok,_WZORDEKR,_WZORDEKRGUID,_KONTRGUID,_PLATNIKGUID,_ZLECENIEGUID,@dowz,@opis,@dotyczy,
        @datawystaw,@datasprzed,@datawplywu,@dataVAT,@nrdokfin,@nrwewn,@nrdokmag,
        @rodzaj,@rodzajnazwa,@zmagazynu,@domagazynu,@datadowodu,@dataoper,@kontrsymbol,@kontofk,@kontofk2,@kontoksbn,
        @nrdowodu,@datadowodu,@dataoper,@dataVAT,@okres,@idnoperfld; 
    END IF;

    DROP TEMPORARY TABLE IF EXISTS t_dekret;
    CREATE TEMPORARY TABLE t_dekret 
    SELECT p.*,_VarDouble(0) as kwota, IF(p.pozycje,d.exp_p,d.exp_n) as exp, d.opis as rodzaj_kwoty, p.opis as msg,0 as pozabilans
    FROM wzordekr n
    INNER JOIN wzordekrpo p ON n.guid=p.wzordekrguid
    INNER JOIN dekretacja_kwoty d ON d.idn=p.rodzajkwoty AND d.modul='HT'
    WHERE n.guid=_WZORDEKRGUID;
    UPDATE t_dekret SET msg='';

    BEGIN
        DECLARE fkdone BOOLEAN DEFAULT FALSE;
        DECLARE _WGUID VARCHAR(38);
        DECLARE _EXP VARCHAR(250);
        DECLARE _POZYCJE BOOLEAN;
        DECLARE _WYROZNIK,_KONTO,_WZORZEC_KONTA VARCHAR(100);
        DECLARE _OKRES,_RODZAJ_KONTA INT;
        -- DECLARE _MAGAZYN INT;
        
        DECLARE c_proc CURSOR FOR SELECT t.GUID,t.exp,t.pozycje,t.wyroznik,t.konto,t.wzorzec_konta,t.kontoposr,t.okres FROM t_dekret t;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET fkdone = TRUE;
        OPEN c_proc;
        loop2: LOOP
            FETCH c_proc INTO _WGUID,_EXP,_POZYCJE,_WYROZNIK,_KONTO,_WZORZEC_KONTA,_RODZAJ_KONTA,_OKRES;
            IF _DEBUG THEN SELECT _WGUID,_EXP,_POZYCJE,_WYROZNIK,_KONTO,_WZORZEC_KONTA,_RODZAJ_KONTA,_OKRES,@okres,fkdone; END IF;    
            -- 0 - dowolny, 1 - bieżący, 2 - przyszły
            IF fkdone THEN 
                LEAVE loop2; 
            END IF;
            IF _OKRES>0 AND _OKRES<>@okres THEN 
                IF _DEBUG THEN SELECT "Inny okres - pomijam" AS msg; END IF;
                ITERATE loop2; 
            END IF;
            
            IF _EXP='' THEN
                UPDATE t_dekret SET msg='brak wzorca kwoty' WHERE GUID=_WGUID;
--                LEAVE loop2;
                SET _EXP='0';
            END IF;

            IF _POZYCJE=0 THEN
                SET @SQL=CONCAT('UPDATE t_dekret SET kwota=(SELECT ',_EXP,' FROM opng n WHERE n.guid="',_GUID,'") WHERE GUID="',_WGUID,'"');
            ELSE
                SET @SQL=CONCAT('UPDATE t_dekret t SET kwota=IFNULL((SELECT SUM(',_EXP,') FROM oppo p, TowrNg tw ',
                    ' WHERE tw.guid=p.idntowr AND p.',@idnoperfld,'="',_GUID,'" AND (t.wyroznik="" OR tw.wyroznik=t.wyroznik)),0) ',
                    'WHERE GUID="',_WGUID,'" AND t.magazyn in (0,',@magazyn,')');
            END IF;
            IF _DEBUG THEN SELECT @SQL; END IF;
            CALL _ExecuteCmd(@SQL, @Error);
            IF @error<>'' THEN
                UPDATE t_dekret SET msg=CONCAT(_UTF8'błąd pobierania kwoty: ',@error) WHERE GUID=_WGUID;
            END IF;
            UPDATE t_dekret SET kwota=_RND2(kwota*procent/100) WHERE procent<>100; -- procent może być ujemny - wtedy odwrócenie znaku
            -- 0: normalny, 1: storno, 2: wg znaku, 3: storno wg znaku, 4: tylko dodatni, 5: tylko ujemny
            UPDATE t_dekret SET kwota=abs(kwota) WHERE storno=0;
            UPDATE t_dekret SET kwota=-abs(kwota) WHERE storno=1;
            UPDATE t_dekret SET kwota=-kwota WHERE storno=3;
            UPDATE t_dekret SET kwota=IF(kwota>0, kwota,0) WHERE storno=4;
            UPDATE t_dekret SET kwota=IF(kwota<0,-kwota,0) WHERE storno=5;

--            UPDATE t_dekret SET kwota=_RND2(IF(storno=1,-1,1)*IF(storno in (0,1),ABS(kwota),kwota)); 
            -- konta wg wzorca
            IF _RODZAJ_KONTA=5 THEN
                SET _KONTO=_WZORZEC_KONTA,@maxcount=3;
                WHILE _KONTO LIKE '%\%_%' AND @maxcount>0 DO
                    SET @k=_KONTO,@maxcount=@maxcount-1;
                    SET @param='',@poz=LOCATE('%',@k),@fmt=LOCATE(':',MID(@k,@poz+2,@poz+4)),@npoz=0;
                    SET @npoz=LOCATE('-',MID(@k,@poz+@fmt+1,250)),@npoz=IF(@npoz=0,250,@npoz)-1;
                    SET @param=IF(@fmt>0,MID(@k,@poz+1,@fmt),MID(@k,@poz+1,@npoz));
                    SET @fmtlen=IF(@fmt>0,_VarINT(MID(@k,@poz+@fmt+2,1)),0);
                    -- SELECT @k,@poz,@fmt,@npoz,@param; 
--                    IF _DEBUG THEN SELECT _KONTO,@k,@poz,@fmt,@npoz,@param; END IF;

                    IF LEFT(@param,1) IN ('c','a','o') THEN
                        SET @katcol=RIGHT(@param,1);
-- set @guid='{AB4D0383-8D33-46E6-A31C-3D4B60EDA838}' - mpgk - operacja z katcolami w pozycjach i wzorcem a6 i a8
-- set @guid='HTd16b04df-f8e6-11ef-839f-525400eb203e';
                        IF @katcol BETWEEN '0' AND '4' THEN -- na razie tylko kategorie z operacji
                            SET @param=MID(@param,1,LENGTH(@param)-1);
                            SET @typ=IF(@katcol BETWEEN '0' AND '4',0,1),@colnr=IF(@katcol BETWEEN '0' AND '4',_VarINT(@katcol),_VarINT(@katcol)-5);
                            IF @param LIKE 'cp_' THEN
                                SET @paramnr=RIGHT(@param,1),@param=LEFT(@param,LENGTH(@param)-1);
                                SET @paramvalsql=
                                CONCAT("SELECT k.param",@paramnr," INTO @paramval FROM oppo o,katcols k ",
                                       "WHERE k.klucz=o.kat",@katcol," AND o.",@idnoperfld,"='",_GUID,
                                       "' AND k.typ=",@typ," AND k.colnr=",_VarStr(@colnr+1)); -- niekonsekwencja - colnr=1 dla v_kkn0
                            END IF;
                            CASE @param
                                WHEN 'c' THEN SET @paramvalsql=
                                    IF(@katcol BETWEEN 0 AND 4,CONCAT("SELECT katcol",@katcol," INTO @paramval FROM opng WHERE guid='",_GUID,"'"),"");
                                    -- TODO - co z katcolami z pozycji?
                                WHEN 'oc' THEN SET @paramvalsql=
                                    CONCAT("SELECT o.katcol",@katcol," INTO @paramval FROM opng n,Pracownicy p ",
                                           "WHERE n.osobaguid=p.guid and n.guid='",_GUID,"'");
                                WHEN 'a' THEN SET @paramvalsql=
                                    CONCAT("SELECT k.kontofk INTO @paramval FROM opng n,katcols k ",
                                           "WHERE k.klucz=n.katcol",@katcol," AND n.guid='",_GUID,
                                           "' AND k.typ=",@typ," AND k.colnr=",_VarStr(@colnr+1)); -- niekonsekwencja - colnr=1 dla v_kkn0
                                    -- TODO: co z katcolami z pozycji? jak to grupować?
                                    -- CONCAT("SELECT k.kontofk INTO @paramval FROM oppo o,katcols k ",
                                    --        "WHERE k.klucz=o.kat",@katcol," AND o.",@idnoperfld,"='",_GUID,
                                    --        "' AND k.typ=",@typ," AND k.colnr=",@colnr);
                            END CASE;
                            IF _DEBUG THEN SELECT @paramvalsql; END IF;

                            SET @paramvalsql=IF(@paramvalsql<>'',@paramvalsql,'SELECT 0 INTO @paramval');
                            CALL _ExecuteCmd(@paramvalsql, @Error);

                            IF IFNULL(@paramval,"")="" OR @error<>'' THEN
                                UPDATE t_dekret SET msg=CONCAT(_UTF8'błąd parametru: ',@param,' w ',@k) WHERE GUID=_WGUID;
                            END IF;
                        ELSE
                            UPDATE t_dekret SET msg=CONCAT(_UTF8'błąd parametru: ',@param,' w ',@k) WHERE GUID=_WGUID;
                        END IF;
                    ELSE
                        CASE @param
                            WHEN 'mz' THEN SET @paramval=@zmagazynu; 
                            WHEN 'md' THEN SET @paramval=@domagazynu;
                            WHEN 'k'  THEN SET @paramval=(SELECT analityka FROM kontrah WHERE guid=_KONTRGUID);
                            WHEN 'l'  THEN SET @paramval=(SELECT analityka_powiazanych FROM kontrah WHERE guid=_KONTRGUID);
                            WHEN 'p'  THEN SET @paramval=(SELECT analityka FROM kontrah WHERE guid=_PLATNIKGUID);
                            WHEN 'zs' THEN SET @paramval=(SELECT konto_zlecenia FROM zlec z WHERE guid=_ZLECENIEGUID);
                            WHEN 'z'  THEN SET @paramval=(SELECT analityka FROM zlec z WHERE guid=_ZLECENIEGUID);
                            WHEN 'r'  THEN SET @paramvalsql=CONCAT('SELECT w.kontofk INTO @paramval FROM oppo p, TowrNg tw, wyrozniki w ',
                                            'WHERE tw.guid=o.idntowr AND p.',@idnoperfld,'="',_GUID,'" AND (t.wyroznik="" OR tw.wyroznik=t.wyroznik) ',
                                            'WHERE GUID="',_WGUID,'" AND t.magazyn in (0,',@magazyn,')');
                                            CALL _ExecuteCmd(@paramvalsql, @Error);
                            WHEN 'w'  THEN SET @paramval=""; -- czy to w ogóle ma sens? (wydzial)
                            ELSE SET @paramval='';
                        END CASE;
                    END IF;
                    IF @fmtlen>0 THEN 
                        SET @paramval=LPAD(@paramval,@fmtlen,'0');
                    END IF;
                    SET _KONTO=CONCAT(MID(@k,1,@poz-1),@paramval,MID(@k,@poz+@npoz+3,250));
--                    IF _DEBUG THEN SELECT "PO",_KONTO,@k,@poz,@fmt,@npoz,@param,@paramval; END IF;
                END WHILE;
                SET _KONTO=CONCAT('*|',REPLACE(REPLACE(_KONTO,'*|',''),'-','|'));
            ELSE
                CASE _RODZAJ_KONTA
                    WHEN 0 THEN SET _KONTO=_KONTO;   -- dla formalności
                    WHEN 1 THEN SET _KONTO=(SELECT kontofk2 FROM kontrah WHERE guid=_KONTRGUID);
                    WHEN 2 THEN SET _KONTO=(SELECT kontofk FROM kontrah WHERE guid=_KONTRGUID);
                    WHEN 3 THEN SET _KONTO=(SELECT kontofk2 FROM kontrah WHERE guid=_PLATNIKGUID);
                    WHEN 4 THEN SET _KONTO=(SELECT kontofk FROM kontrah WHERE guid=_PLATNIKGUID);
                    WHEN 6 THEN SET _KONTO=CONCAT(_KONTO,'|',(SELECT analityka FROM kontrah WHERE guid=_KONTRGUID));
                    WHEN 7 THEN SET _KONTO=CONCAT(_KONTO,'|',(SELECT analityka FROM kontrah WHERE guid=_PLATNIKGUID));
                    WHEN 8 THEN SET _KONTO=@kontoksbn;
                    WHEN 9 THEN SET _KONTO=@kontofk;
                    WHEN 10 THEN SET _KONTO=@kontofk2;
                    ELSE SET _KONTO='';
                END CASE;
            END IF;

            SET _KONTO=CONCAT('*|',REPLACE(REPLACE(_KONTO,'*|',''),'-','|'));
            SELECT nazwa,pozabilans FROM plankont WHERE symbol=_KONTO AND rok=_ROK INTO @nazwakonta,@pozabilans;
            IF @nazwakonta IS NULL THEN
                UPDATE t_dekret SET msg=CONCAT(_UTF8'błąd konta: ',_KONTO) WHERE GUID=_WGUID;
            ELSE
                UPDATE t_dekret SET konto=_KONTO,pozabilans=@pozabilans WHERE GUID=_WGUID;
            END IF;
            SET fkdone=FALSE; 
        END LOOP;
        CLOSE c_proc;
    END;

    UPDATE t_dekret SET opis=(SELECT valuea FROM IReg WHERE idkey='Format opisu w dekretacji automatycznej') WHERE opis='';
 
    UPDATE t_dekret SET opis=REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(opis,
        '%o',@opis),'%n',@nrdok),'%m',@nrdokmag),'%w',@nrwewn),'%k',@kontrsymbol),'%d',@dotyczy),
        '%r',@rodzajnazwa),'%a',@datawystaw),'%v',IFNULL(@dataVAT,''))
    WHERE opis LIKE '%\%_%'; 
    
    DROP TEMPORARY TABLE IF EXISTS t_zapisy;
    CREATE TEMPORARY TABLE t_zapisy 
    SELECT lp,stronaWN,konto,opis,SUM(kwota) as kwota,pozabilans,
        _VarInt(kat0def) as k0, _VarInt(kat1def) as k1, _VarInt(kat2def) as k2, _VarInt(kat3def) as k3, _VarInt(kat4def) as k4,
        _VarInt(kat5def) as k5, _VarInt(kat6def) as k6, _VarInt(kat7def) as k7, _VarInt(kat8def) as k8, _VarInt(kat9def) as k9
    FROM t_dekret 
    GROUP BY stronaWN,konto,opis,if(sumuj,1,uuid_short()),k0,k1,k2,k3,k4,k5,k6,k7,k8,k9;
    
    SET @suma=0,@saldo=0;

    SELECT SUM(IF(pozabilans=0,IF(stronaWN,1,-1)*kwota,0)),sum(kwota) INTO @saldo,@suma FROM t_zapisy;
    SET @saldo=round(@saldo,3),@suma=round(@suma,3);

    IF @saldo<>0 THEN
        SET @dekretuj.status = CONCAT(_UTF8' Dekret się nie bilansuje: ',@saldo);
    ELSE
        SET @lp=0;
        UPDATE t_zapisy SET lp=@lp:=@lp+1 ORDER BY lp;

        INSERT INTO zapisy (idnoper,guid,rok,data_dowodu,data_oper,numer_dok,rodzajdowodu,wzordekr,uid,nr_dekretu,
            lp,stronaWn,konto,kwota,opis,pozabilans,rodzaj_fk,
            katcol0,katcol1,katcol2,katcol3,katcol4,katcol5,katcol6,katcol7,katcol8,katcol9)
        SELECT _GUID,CONCAT(uuid(),'AD'),_ROK,@datadowodu,@dataoper,@nrdowodu,@rodzajdowodu,_WZORDEKR,@session.Registration.UserLogin,0,
            lp,stronaWn,konto,kwota,opis,pozabilans,if(kwota<0,4,3),k0,k1,k2,k3,k4,k5,k6,k7,k8,k9
        FROM t_zapisy
        WHERE kwota<>0
        ORDER BY lp;
        IF @suma<>0 THEN
            SET @kontofkkontrah='';
            IF @rodzaj NOT IN (20,21,36,37) AND _PLATNIKGUID<>'' AND _KONTRGUID<>'' THEN
                SELECT p.symbol INTO @kontofkkontrah FROM zapisy z, plankont p 
                WHERE z.konto=p.symbol and z.rok=p.rok and p.obcyguid IN (_PLATNIKGUID,_KONTRGUID) 
                    AND left(p.symbol_fmt, 1) <> '8' /* and z.stronaWn = @cwn */ LIMIT 1;
            END IF;
            UPDATE opng SET
                zaksiegowana=1,datadekretacji=@datadowodu,
                kontofk=IF(IFNULL(@kontofkkontrah,'')='',kontofk,@kontofkkontrah) 
            WHERE guid=_GUID; 
            -- TODO: log?
        ELSE
            SET @dekretuj.status = ' Dekret jest zerowy';
        END IF; 
    END IF;

    IF NOT _DEBUG THEN
        DROP TEMPORARY TABLE IF EXISTS t_dekret;
        DROP TEMPORARY TABLE IF EXISTS t_zapisy;
    ELSE
        SELECT idn,exp,rodzaj_kwoty,stronaWN,konto,wzorzec_konta,magazyn,wyroznik,kwota,opis,msg FROM t_dekret;
        SELECT lp,konto,if(stronawn,round(kwota,2),0) as wn,if(stronawn=0,round(kwota,2),0) as ma,opis,pozabilans,k0,k1,k2,k3,k4,k5,k6,k7,k8,k9 FROM t_zapisy where kwota<>0 order by konto;
    END IF;
    -- TODO: silent mode
    SELECT @dekretuj.status AS status;
END IF;


END $$


DELIMITER ;


/*
INSERT IGNORE INTO slowniki_pierwotne_def 
SET GUID = 'DEKRETACJA_DATY', Nazwa = 'Daty w dekretacji automatycznej', Kategorie = 'SYSTEM',Opis = 'Daty w dekretacji automatycznej';
INSERT IGNORE INTO slowniki_pierwotne (Slownik_GUID, Value, DisplayValue, ParamExtra, System) VALUES 
('DEKRETACJA_DATY', '0', '- domyślna -', '', 1),
('DEKRETACJA_DATY', '1', 'Data wystawienia', 'datawystaw', 1),
('DEKRETACJA_DATY', '2', 'Data sprzedaży', 'datasprzed', 1),
('DEKRETACJA_DATY', '3', 'Data wpływu', 'datawplywu', 1);
INSERT IGNORE INTO slowniki_pierwotne_def 
SET GUID = 'DEKRETACJA_NUMERY', Nazwa = 'Numery w dekretacji automatycznej', Kategorie = 'SYSTEM',Opis = 'Numery w dekretacji automatycznej';
INSERT IGNORE INTO slowniki_pierwotne (Slownik_GUID, Value, DisplayValue, ParamExtra, System) VALUES 
('DEKRETACJA_NUMERY', '0', '- domyślny -', '', 1),
('DEKRETACJA_NUMERY', '1', 'Nr dok. finans.', 'nrdokfin', 1),
('DEKRETACJA_NUMERY', '2', 'Nr wewnętrzny', 'nrwewn', 1),
('DEKRETACJA_NUMERY', '3', 'Nr magazynowy', 'nrdokmag', 1);

INSERT IGNORE INTO slowniki_pierwotne_def 
SET GUID = 'DEKRETACJA_KONTA', Nazwa = 'Konta w dekretacji automatycznej', Kategorie = 'SYSTEM',Opis = 'Konta w dekretacji automatycznej';
INSERT IGNORE INTO slowniki_pierwotne (Slownik_GUID, Value, DisplayValue, System) VALUES 
('DEKRETACJA_KONTA', '0', 'Konto bezpośrednie', 1),
('DEKRETACJA_KONTA', '1', 'Kontrahent - dostawca', 1),
('DEKRETACJA_KONTA', '2', 'Kontrahent - odbiorca', 1),
('DEKRETACJA_KONTA', '3', 'Płatnik - dostawca', 1),
('DEKRETACJA_KONTA', '4', 'Płatnik - odbiorca', 1),
('DEKRETACJA_KONTA', '5', 'Konto wg wzorca', 1),
('DEKRETACJA_KONTA', '6', 'Kontrahent - wg syntetyki', 1),
('DEKRETACJA_KONTA', '7', 'Płatnik - wg syntetyki', 1),
('DEKRETACJA_KONTA', '8', 'Kasy lub banku', 1),
('DEKRETACJA_KONTA', '9', 'Przeciwstawne z oper. kasa/bank', 1),
('DEKRETACJA_KONTA', '10', 'Przeciwstawne 5* z oper. kasa/bank', 1);

CREATE TABLE dekretacja_kwoty (
    modul VARCHAR(2) NOT NULL,
    idn INT NOT NULL,
    status INT NOT NULL DEFAULT 0,
    Opis VARCHAR(100) NOT NULL,
    lp INT NOT NULL,
    exp_n VARCHAR(250) NOT NULL,
    exp_p VARCHAR(250) NOT NULL,
    exp_v VARCHAR(250) NOT NULL,
    uwagi VARCHAR(100) NOT NULL,
    PRIMARY KEY (modul,idn)
);

*/


/*
$Log: fk_dekretacja.sql,v $
Revision 1.15  2026/04/16 09:43:37  apro
c.d.

Revision 1.14  2025/02/14 11:16:42  apro
porządki pod kątem dekr automat procedurą

Revision 1.13  2024/09/10 09:45:08  apro
polskie znaki

Revision 1.12  2024/09/10 05:23:37  apro
automatyczna dekretacja wersja alfa

Revision 1.11  2024/08/12 08:50:15  apro
$SEND$
podłączenie webdoc v2

Revision 1.10  2024/04/08 08:19:47  apro
.

Revision 1.9  2023/07/18 09:53:31  apro
$SEND$

Revision 1.8  2023/07/18 09:53:05  apro
CHECK_UPR

Revision 1.7  2022/12/19 06:47:37  apro
*** empty log message ***

Revision 1.6  2022/05/25 07:34:17  apro
refactor
$SEND$

Revision 1.5  2019/08/27 12:40:06  apro
$SEND$

Revision 1.4  2016/03/02 09:35:13  apro
$SEND$

Revision 1.3  2016/03/02 09:33:52  apro
poprawka set names

Revision 1.2  2016/02/29 13:58:50  apro
$SEND$

Revision 1.1  2016/02/29 13:57:08  apro
szkielet dekretacji automatycznej - do dalszego rozwiniecia
$SEND$
*/
