 DELIMITER $$

/* ************************************************************************************************************************************************************************
	BI
************************************************************************************************************************************************************************ */	
DROP TRIGGER IF EXISTS `oppo_e_bi`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `oppo_e_bi` BEFORE INSERT ON `oppo_e` FOR EACH ROW 
A: BEGIN
	IF _TriggerDisabled() THEN LEAVE A; END IF;

	SET @tr.oppo_e.ISNewDoc = (IFNULL(NEW.IDN, 0) = 0);
	IF NOT @tr.oppo_e.ISNewDoc THEN
	/* *************************************************************************************************************************
		ładowany jako 'real.to.e' WYJDŹ
	************************************************************************************************************************* */
		LEAVE A;
	END IF;

	SET NEW.CREATE_AT = NOW();

	SET @.oppo_e.Update_status = NEW.Update_status;
	SET NEW.Update_status = '';	--	zawsze
	
	IF NEW.Tag > 0 OR @.oppo_e.Update_status = 'NO_TRIGGER' THEN
	/* *************************************************************************************************************************
		ładowany z jakiegos algorytmu
	************************************************************************************************************************* */
		SET @NEW.Tag = 'jest';
		LEAVE A;
		
	END IF;
	/* *************************************************************************************************************************
		Kreowany w swiecie 'e'
	************************************************************************************************************************* */
	IF IFNULL(NEW.IdnOper, '') != '' THEN
		SET @aDoIt = @session.HT.IR.Wymus_przepisywanie_katcol_do_poz;
		IF IFNULL(NEW.LP, 0) = 0 THEN
			SET NEW.LP = (@tr.oppo_e.oppo_e.LP := IFNULL(@tr.oppo_e.oppo_e.LP, 0) + 1);
		END IF;
		
		IF IFNULL(NEW.IdnOper_e, '') = '' OR TRUE THEN 
		/*	od VII 2024
		UPDATE `opng_e` n
		SET
			n.IlePoz = @n.IlePoz := (IFNULL(n.IlePoz, 0) + 1),
			-- NEW.LP = @n.IlePoz,
			NEW.IdnOper_e = n.GUID,		--	tutaj docieramy tylko gdy tworzymy rekord (idn=0) - gdy wgrywamy z real to idn != 0 - jest to mozliwe w fvrudowz ale tylko gdy tworzymy wlasna pozycje uslugowa
			NEW.Tymczasowa = n.Tymczasowa,
			NEW.kontridn = n.kontridn,
			NEW.datawystaw = n.datawystaw,
			NEW.datasprzed = n.datasprzed,
			NEW.datawplywu = n.datawplywu,
			NEW.Ilosc = IFNULL(NEW.Ilosc, 1),
			-- NEW.rabat = IFNULL(NEW.rabat, 0),
			-- bylo na chwile NEW.rabat = IF(IFNULL(NEW.GUIDZM, '') = '', IFNULL(n.kontrrabat, 0), NEW.rabat),	--	dla wstaw. pozycji z zamowien nie zmieniaj rabatu!!!!
			NEW.rabat = IFNULL(n.kontrrabat, 0),
			NEW.idncennik = n.kontrklasacenowa,
			NEW.cenanet = IFNULL(NEW.cenanet, 0),
			-- NEW.IleOpakowan = 1,
			NEW.ilewopakowaniu = 1,
			NEW.rodzaj = n.rodzaj,
			NEW.rodzaj_typ = n.rodzaj_typ,
			NEW.kurs = n.kurs,
			NEW.ZMagazynu = n.ZMagazynu, 
			NEW.DoMagazynu = n.DoMagazynu,
			NEW.Calc_Ver = n.Calc_Ver,
			NEW.AreaGUID = IFNULL(NEW.AreaGUID, n.AreaGUID),
			NEW.TypSymbolow = IF(n.rodzaj = 73, 0, IFNULL(@tr.oppo_e.TypSymbolow, 0)), 	--	CZmZP = 73;      { Zamówienie - zlecenie produkcyjne }
			NEW.kat0 = IF(n.KatCol0 != -1 AND @aDoIt, n.KatCol0, NEW.kat0),
			NEW.kat1 = IF(n.KatCol1 != -1 AND @aDoIt, n.KatCol1, NEW.kat1),
			NEW.kat2 = IF(n.KatCol2 != -1 AND @aDoIt, n.KatCol2, NEW.kat2),
			NEW.kat3 = IF(n.KatCol3 != -1 AND @aDoIt, n.KatCol3, NEW.kat3),
			NEW.kat4 = IF(n.KatCol4 != -1 AND @aDoIt, n.KatCol4, NEW.kat4),
			NEW.cenanet = IF(NEW.opakowanie_zwrotne > 0, 0, NEW.cenanet),
			
			NEW.Rodzaj_Przeliczenia = IFNULL(n.Rodzaj_Przeliczenia,
		--	Gdy drukarka fiskalna i realizujemy tu paragon lub Fakt. imienna (uproszcz.) to ustaw rodzaj przeliczenia na 3 (Fiskalny)
				IF(IFNULL(@session.HT.IR.DrukarkaFiskalna, FALSE) AND (n.Rodzaj IN (@ht.CSpBR, @ht.CSpRU, @ht.CSpKR) OR (n.Rodzaj = 10 AND n.rodzaj2 IN (@ht.CSpBR, @ht.CSpRU, @ht.CSpKR))),
				--	UWAGA Powinien byc fiskalny = 3 ale dla JARZ jeśli jest 5 to niech zostanie !!!!
					IF(@session.globals.Owner = 'JARZEBINSCY' AND NEW.Rodzaj_Przeliczenia = 5, 
						5,  	--	dla JARZ jeśli jest 5 to niech zostanie !!!!
						3		--  3 -> _BN_CN_WN - fiskalne z brutto->netto  (fiskalne)
					),
					NEW.Rodzaj_Przeliczenia
				)
			)
		WHERE
			n.GUID = NEW.IdnOper
		;
		do VII 2024	*/
		UPDATE `opng_e` n
		SET
			n.IlePoz = @n.IlePoz := (IFNULL(n.IlePoz, 0) + 1)
		WHERE
			n.GUID = NEW.IdnOper
		;
		SELECT
			n.GUID,		--	tutaj docieramy tylko gdy tworzymy rekord (idn=0) - gdy wgrywamy z real to idn != 0 - jest to mozliwe w fvrudowz ale tylko gdy tworzymy wlasna pozycje uslugowa
			n.rodzaj,
			n.rodzaj_typ,
			n.Rodzaj2,
			od.MagTyp,
			od.IsKorekta,
			od.ZerowaStawkaVat,
			n.Tymczasowa,
			n.fvrudowz,
			n.kontrGUID,
			n.kontridn,
			n.PlatnikGUID,
			n.datawystaw,
			n.datasprzed,
			n.datawplywu,
			--	NEW.Ilosc = IFNULL(NEW.Ilosc, 1),
			IFNULL(n.kontrrabat, 0) AS kontrrabat,
			n.kontrklasacenowa,
			-- NEW.IleOpakowan = 1,
			n.kurs,
			n.ZMagazynu, 
			n.DoMagazynu,
			n.Calc_Ver,
			n.AreaGUID,
			n.KatCol0,
			n.KatCol1,
			n.KatCol2,
			n.KatCol3,
			n.KatCol4,
			n.Rodzaj_Przeliczenia,
			n.RV_Id 
		INTO
			@.n.GUID,
			@.n.rodzaj,
			@.n.rodzaj_typ,
			@.n.Rodzaj2,
			@.od.MagTyp,
			@.od.IsKorekta,
			@.od.ZerowaStawkaVat,
			@.n.Tymczasowa,
			@.n.fvrudowz,
			@.n.kontrGUID,
			@.n.kontridn,
			@.n.PlatnikGUID,
			@.n.datawystaw,
			@.n.datasprzed,
			@.n.datawplywu,
			@.n.kontrrabat,
			@.n.kontrklasacenowa,
			-- NEW.IleOpakowan = 1,
			@.n.kurs,
			@.n.ZMagazynu, 
			@.n.DoMagazynu,
			@.n.Calc_Ver,
			@.n.AreaGUID,
			@.n.KatCol0,
			@.n.KatCol1,
			@.n.KatCol2,
			@.n.KatCol3,
			@.n.KatCol4,
			@.n.Rodzaj_Przeliczenia,
			@.n.RV_Id 
		FROM `opng_e` n, `operdoc` od
		WHERE
			n.GUID = NEW.IdnOper
			AND NEW.IdnOper IS NOT NULL
			AND od.Rodzaj = n.Rodzaj
		;
		SET
			NEW.IdnOper_e = @.n.GUID,		--	tutaj docieramy tylko gdy tworzymy rekord (idn=0) - gdy wgrywamy z real to idn != 0 - jest to mozliwe w fvrudowz ale tylko gdy tworzymy wlasna pozycje uslugowa
			NEW.Tymczasowa = @.n.Tymczasowa,
			NEW.kontridn = @.n.kontridn,
			NEW.datawystaw = @.n.datawystaw,
			NEW.datasprzed = @.n.datasprzed,
			NEW.datawplywu = @.n.datawplywu,
			NEW.Ilosc = IFNULL(NEW.Ilosc, 1),
			NEW.rabat = IFNULL(@.n.kontrrabat, 0),
			NEW.idncennik = @.n.kontrklasacenowa,
			NEW.cenanet = IFNULL(NEW.cenanet, 0),
			NEW.ilewopakowaniu = 1,
			NEW.rodzaj = @.n.rodzaj,
			NEW.rodzaj_typ = @.n.rodzaj_typ,
			NEW.kurs = @.n.kurs,
			NEW.ZMagazynu = @.n.ZMagazynu, 
			NEW.DoMagazynu = @.n.DoMagazynu,
			NEW.Calc_Ver = @.n.Calc_Ver,
			NEW.AreaGUID = IFNULL(NEW.AreaGUID, @.n.AreaGUID),
			NEW.TypSymbolow = IF(@.n.rodzaj = 73, 0, IFNULL(@tr.oppo_e.TypSymbolow, 0)), 	--	CZmZP = 73;      { Zamówienie - zlecenie produkcyjne }
			NEW.kat0 = IF(@.n.KatCol0 != -1 AND @aDoIt, @.n.KatCol0, NEW.kat0),
			NEW.kat1 = IF(@.n.KatCol1 != -1 AND @aDoIt, @.n.KatCol1, NEW.kat1),
			NEW.kat2 = IF(@.n.KatCol2 != -1 AND @aDoIt, @.n.KatCol2, NEW.kat2),
			NEW.kat3 = IF(@.n.KatCol3 != -1 AND @aDoIt, @.n.KatCol3, NEW.kat3),
			NEW.kat4 = IF(@.n.KatCol4 != -1 AND @aDoIt, @.n.KatCol4, NEW.kat4),
			NEW.cenanet = IF(NEW.opakowanie_zwrotne > 0, 0, NEW.cenanet),
			
			NEW.Rodzaj_Przeliczenia = IFNULL(@.n.Rodzaj_Przeliczenia,
		--	Gdy drukarka fiskalna i realizujemy tu paragon lub Fakt. imienna (uproszcz.) to ustaw rodzaj przeliczenia na 3 (Fiskalny)
				IF(IFNULL(@session.HT.IR.DrukarkaFiskalna, FALSE) AND (@.n.Rodzaj IN (@ht.CSpBR, @ht.CSpRU, @ht.CSpKR) OR (@.n.Rodzaj = 10 AND @.n.rodzaj2 IN (@ht.CSpBR, @ht.CSpRU, @ht.CSpKR))),
				--	UWAGA Powinien byc fiskalny = 3 ale dla JARZ jeśli jest 5 to niech zostanie !!!!
					IF(@session.globals.Owner = 'JARZEBINSCY' AND NEW.Rodzaj_Przeliczenia = 5, 
						5,  	--	dla JARZ jeśli jest 5 to niech zostanie !!!!
						3		--  3 -> _BN_CN_WN - fiskalne z brutto->netto  (fiskalne)
					),
					NEW.Rodzaj_Przeliczenia
				)
			)
		;
		END IF;
		IF NEW.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND) AND
			((NEW.iloscbylo != 0) OR (NEW.iloscjest != 0)) THEN
			SET
				NEW.Ilosc = NEW.iloscjest - NEW.iloscbylo
			;
		END IF;
		
		SET
			@p.Rodzaj = NEW.Rodzaj,
			@p.ZMagazynu = NEW.ZMagazynu,
			@p.DoMagazynu = NEW.DoMagazynu
		;
		CALL e_oppo_ustal_magazyny_rodzaj('', @p.Rodzaj, @p.ZMagazynu, @p.DoMagazynu, NEW.Ilosc, NEW.WartNet);
		SET 
			NEW.Rodzaj = @p.Rodzaj, 
			NEW.ZMagazynu = @p.ZMagazynu, 
			NEW.DoMagazynu = @p.DoMagazynu
		;
		CALL ht_rodzaj_update_zmienne(NEW.Rodzaj);
		-- CALL ht_rodzaj_calc(NEW.Rodzaj);
	END IF;
	SET
		NEW.idnoperfin =  
			IF(IFNULL(NEW.idnwz, '') != '', 
				NEW.idnwz,
				NEW.idnoper
			)
	;	
	
	
	CALL ht_rodzaj_update_zmienne(NEW.Rodzaj);
	-- CALL ht_rodzaj_calc(NEW.Rodzaj);
	
	IF IFNULL(NEW.TowrSymb, '') = '' AND IFNULL(NEW.IdnTowr, '') != '' THEN
		UPDATE `TowrNg` t
		SET
			NEW.TowrSymb = t.Symbol, 
			NEW.TowrNazwa = t.Nazwa, 
			NEW.IdnVat = 
			/*	do X 2024
				IFNULL(IF((t.VatPrevYear > 0) AND (@session.vat.edityear <= t.VatPrevYear), t.VatPrevId, t.Vat), 0),
			... teraz dodałem w X 2024 */
				_Get_IdnVat('', 'OP', IFNULL(IF((t.VatPrevYear > 0) AND (@session.vat.edityear <= t.VatPrevYear), t.VatPrevId, t.Vat), 0), @.n.Rodzaj, @.n.Rodzaj2, @.n.RV_Id, @.od.ZerowaStawkaVat, ''),
			NEW.Jednostka = t.Jednostka,
			NEW.Usluga = t.Usluga,
			-- NEW.ilewopakowaniu = IF(@session.globals.Owner = 'IZOHAN', t.opakowanie_zbiorcze_d, t.ilewopakowaniu),
			NEW.ilewopakowaniu = 
			CASE -- TODO dodać kolumnę do operdoc decydujaca co wchodzi do opak.
				WHEN @ht.doc.MagTyp = @ht.mtRZ THEN 	/*RZ, ZM OO = 2*/
				--	rozchod
					IF(@session.globals.Owner = 'IZOHAN', 
						t.opakowanie_zbiorcze_d, 
						t.opakowanie_d
					) 
				WHEN @ht.doc.MagTyp = @ht.mtPZ THEN 	/*PZ, ZM DD = 0*/
				--	przychod
					IF(@session.globals.Owner = 'IZOHAN', 
						t.ilewopakowaniu_zbiorczym_d, 
						t.ilewopakowaniu
					) 
				WHEN @ht.doc.MagTyp = @ht.mtMM THEN 	/*MM = 1*/
						t.ilewopakowaniu
				ELSE 		/*NN = 3*/
						t.ilewopakowaniu
			END,
			NEW.kat5 = t.katcol0,
			NEW.kat6 = t.katcol1,
			NEW.kat7 = t.katcol2,
			NEW.kat8 = t.katcol3,
			NEW.kat9 = t.katcol4,
			NEW.cena_minimalna = t.cena_minimalna,
			NEW.opakowanie_zwrotne = t.opakowanie_zwrotne,
			NEW.info = t.info,
			NEW.info2 = t.info2,
			NEW.info3 = t.info3,
			NEW.info4 = t.info4,
			NEW.oplata_produktowa = t.oplata_produktowa,
			NEW.min_ord_quant = t.min_ord_quant,
			-- skok NEW.CzasOczekiwania = t.CzasOczekiwania,
			NEW.waga_jedn = t.waga,
			NEW.pkwiu = t.pkwiu,
			NEW.termin_waznosci = DATE_ADD(CURRENT_DATE(), INTERVAL t.dni_waznosci DAY),
			NEW.CenaNet = IF(NEW.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND), t.CenaZkpNet, NEW.CenaNet)
		WHERE
			t.GUID = NEW.IdnTowr
		;
		-- na pozniej CALL e_xxpo_GetSymbolNazwaByType('', @_Symbol, @_Nazwa, NEW.IdnTowr, NEW.KontrGUID, NEW.PlatnikGUID, _IFDEF_DisplayNazwaLang, _IFDEF_TOWARY_TRANSLATE, '', '');
	END IF;
	SET NEW.GUIDzm = IFNULL(NEW.GUIDzm, '');
	
	SET NEW.wartNetWal = IFNULL(NEW.wartNetWal, 0);
	SET NEW.wartBrtWal = IFNULL(NEW.wartBrtWal, 0);
	SET NEW.wartNet = IFNULL(NEW.wartNet, 0);
	SET NEW.wartBrt = IFNULL(NEW.wartBrt, 0);
	SET NEW.wartVat = IFNULL(NEW.wartVat, 0);
	
END;
$$

/* ************************************************************************************************************************************************************************
	AI
************************************************************************************************************************************************************************ */	
DROP TRIGGER IF EXISTS `oppo_e_ai`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `oppo_e_ai` AFTER INSERT ON `oppo_e` FOR EACH ROW 
A: BEGIN
	IF _TriggerDisabled() THEN LEAVE A; END IF;
	/*
	IF IFNULL(@session.trigger.oppo_e, FALSE) THEN 
		LEAVE A; 
	END IF;
	SET @session.trigger.oppo_e = TRUE;
	*/
	SET @.oppo_e.Update_status = '';

	SET @tr.oppo_e.oppo_e.LP = GREATEST(IFNULL(@tr.oppo_e.oppo_e.LP, 0), NEW.LP);
	
	/*
	SET @session.trigger.oppo_e = FALSE;
	*/
END;
$$

/* ************************************************************************************************************************************************************************
	BU
************************************************************************************************************************************************************************ */	
DROP TRIGGER IF EXISTS `oppo_e_bu`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `oppo_e_bu` BEFORE UPDATE ON `oppo_e` FOR EACH ROW 
A: BEGIN
	SET @gdzie = '0';
	IF _TriggerDisabled() THEN LEAVE A; END IF;
	SET @gdzie = '1';
	
	SET @session.oppo_e = FALSE;
	IF IFNULL(@session.oppo_e, FALSE) THEN 
		LEAVE A; 
	END IF;
	
	SET @gdzie = '3';
	SET @session.oppo_e = TRUE;

	SET @.oppo_e.Update_status = NEW.Update_status;
	SET NEW.Update_status = '';	--	zawsze
	
	IF NEW.Calc_Ver >= 3 THEN
	
	SET @gdzie = '4';
	/*	26 VII 2024 przeniosłem (skopiowałem 1:1) z fragm. niżej 
		aby przed LEAVE A ust. podcz. WZ/PZ - inaczej dla zazn. Tag = 1 nie podczepiały się!!!
		inna sprawa to po co w ogóle ten warunek???
	*/	
		SET
			NEW.idnoperfin =  
				IF(IFNULL(NEW.idnwz, '') != '', 
					NEW.idnwz,
					NEW.idnoper
				),
			NEW.GUIDzm = IFNULL(NEW.GUIDzm, '')
		;	
        IF NEW.Tag > 0 AND @session.globals.Owner = 'ATM' THEN
        --  Omijam dla nop, ATM to ż zatagowane się nie przeliczają
            SET NEW.Tag = -1;   -- -1 ozbacza że na koniec TAG wraca do wartości OLD czyli 1 -> -1 -> 1
		END IF;
		IF NEW.Tag > 0 OR @.oppo_e.Update_status = 'NO_TRIGGER' THEN
			SET @session.oppo_e = FALSE;
			LEAVE A; 
		END IF;
												SET @gdzie = '5';
	
		SELECT 
			n.Rodzaj, n.Rodzaj2, n.ZMagazynu, n.DoMagazynu, n.fvrudowz, od.IsKorekta, n.KontrGUID, n.PlatnikGUID, n.RV_Id, od.ZerowaStawkaVat
		INTO 
			@.n.Rodzaj, @.n.Rodzaj2, @.n.ZMagazynu, @.n.DoMagazynu, @.n.fvrudowz, @.n.IsKorekta, @.n.KontrGUID, @.n.PlatnikGUID, @.n.RV_Id, @.od.ZerowaStawkaVat
		FROM `opng_e` n, `operdoc` od
		WHERE 
			n.GUID = NEW.IdnOper_e
			AND od.Rodzaj = n.Rodzaj
		;
												SET @gdzie = '6';
		SET
			NEW.idnoperfin =  
				IF(IFNULL(NEW.idnwz, '') != '', 
					NEW.idnwz,
					NEW.idnoper
				),
			NEW.GUIDzm = IFNULL(NEW.GUIDzm, '')
		;	

		SET @tr.oppo_e.IS_Do_WZ = (@.n.fvrudowz != 0) AND !(NEW.IdnOper <=> NEW.IdnOper_e);
		IF @tr.oppo_e.IS_Do_WZ THEN 
		/* *************************************************************************************************************************
			Jest to edycja podlaczonych WZ/PZ do FV
		**************************************************************************************************************************/
			IF 
				((NEW.Tag < 0) AND (NEW.Rodzaj = 12)) 
				OR
				NOT(NEW.kurs <=> OLD.kurs)
				OR
				NOT(NEW.idnvat <=> OLD.idnvat)
				OR
				NOT(NEW.Rabat <=> OLD.Rabat)
				OR
				NOT(NEW.CenaNet <=> OLD.CenaNet)
				OR
				NOT(NEW.CenaNetWalzRab <=> OLD.CenaNetWalzRab)
				OR
				NOT(NEW.cenabrt <=> OLD.cenabrt)
				OR
				NOT(NEW.wartnetwal <=> OLD.wartnetwal)
				OR
				NOT(NEW.wartnet <=> OLD.wartnet)
				OR
				NOT(NEW.wartbrt <=> OLD.wartbrt)
				OR
				NOT(NEW.wartbrtwal <=> OLD.wartbrtwal)
			THEN
				CALL ht_rodzaj_update_zmienne(NEW.Rodzaj);
				IF NEW.IdnWZ = '' THEN
					SET
						NEW.idnvat = OLD.idnvat,
						NEW.Rabat = OLD.Rabat,
						NEW.CenaNet = OLD.CenaNet,
						NEW.CenaNetWalzRab = OLD.CenaNetWalzRab,
						NEW.cenabrt = OLD.cenabrt,
						NEW.wartnetwal = OLD.wartnetwal,
						NEW.wartnet = OLD.wartnet,
						NEW.wartbrt = OLD.wartbrt,
						NEW.wartbrtwal = OLD.wartbrtwal
					;
					-- LEAVE A; 
				ELSE
					CALL CalcXXPo('', 
					--	uwaga zamast NEW.Wspolplatnosc od 24 V 2022 NEW.Usluga (zad IDN = 55317)
						NEW.rodzaj_przeliczenia, NEW.IdnVat, NEW.Ilosc, NEW.Usluga, NEW.Rabat, NEW.CenaNet, @.CenaNetPL, NEW.CenaNetWalzRab, NEW.CenaBrt, 
						NEW.WartNet, NEW.WartNetWal, @.StawkaVat, NEW.WartVat, NEW.WartBrt, NEW.WartBrtWal, @.WartBrtEdit, @.WartRabatNet, @.WartRabatBrt, 
						NEW.Kurs, NEW.Koszt_nabycia, NEW.StawkaCla, NEW.WartClo, @.WartNetWalEdit, NEW.Oplata_produktowa,
						NULL, NULL, -- było @ht.doc.IsKorekta, @ht.doc.IsWaluta,
						NEW.calc_ver, '', '', '')
					;
					SET NEW.wartBrtWal = IFNULL(NEW.wartBrtWal, 0);
				END IF;
			END IF;
			
			IF NEW.Tag < 0 THEN
				SET NEW.Tag = IF(NEW.Tag = -2, -2, IFNULL(OLD.Tag, 0));
			END IF;
			LEAVE A; 
		END IF;	-- @tr.oppo_e.IS_Do_WZ
		
		CALL ht_rodzaj_update_zmienne(NEW.Rodzaj);
		-- CALL ht_rodzaj_calc(NEW.Rodzaj);

		
		SET @tr.oppo_e.IdnTowr.Change = NOT(IFNULL(NEW.IdnTowr, '') <=> IFNULL(OLD.IdnTowr, ''));
		SET @tr.oppo_e.IdnTowr.Is_New = @tr.oppo_e.IdnTowr.Change AND IFNULL(OLD.IdnTowr, '') = '';	--	Zad:42609 oznacza ze wlasnie wstawiono towar (z pustego na faktyczny towar A NIE z innego towaru na nowy)
		SET @tr.oppo_e.Ilosc.Change = NOT(IFNULL(NEW.Ilosc, '') <=> IFNULL(OLD.Ilosc, ''));
		SET @tr.oppo_e.iloscjest.Change = NOT(IFNULL(NEW.iloscjest, '') <=> IFNULL(OLD.iloscjest, ''));
		SET @tr.oppo_e.iloscbylo.Change = NOT(IFNULL(NEW.iloscbylo, '') <=> IFNULL(OLD.iloscbylo, ''));
		
		SET @tr.oppo_e.WartNet.Change = NOT(IFNULL(NEW.WartNet, '') <=> IFNULL(OLD.WartNet, ''));

		
		-- IF _ExtFlags('GET', NEW.ExtFlags, 'USE_VALIDATOR', '', '') = '<USE_VALIDATOR>' THEN
		IF _ExtFlags('GET', NEW.ExtFlags, 'USE_VALIDATOR', '', '') IN ('<USE_VALIDATOR>', '<GUI>') THEN
			SET NEW.ExtFlags = _ExtFlags('Del', NEW.ExtFlags, 'USE_VALIDATOR', '', '');
			SET NEW.ExtFlags = _ExtFlags('Del', NEW.ExtFlags, 'GUI', '', '');
			SET NEW.ExtFlags_Inf = _Validators('Set.USE_VALIDATOR', NEW.ExtFlags_Inf, @session.HT.OP.walidacja_pol_aktywna, '', '', '', '');
		END IF;
		
		/*
		IF _ExtFlags('GET', NEW.ExtFlags, 'GUI', '', '') = '<GUI>' THEN
		-- IF NEW.ExtFlags LIKE '%<GUI>%' THEN
			SET NEW.ExtFlags = _ExtFlags('Del', NEW.ExtFlags, 'GUI', '', '');
			SET NEW.ExtFlags_Inf = _Validators('Set.USE_VALIDATOR', NEW.ExtFlags_Inf, @session.HT.OP.walidacja_pol_aktywna, '', '', '', '');
		END IF;
		*/
		
		/**************************************************************************************************************************
			Sprawdz `op_instancje` czy są egzemplarze
		**************************************************************************************************************************/
		IF NOT @ht.doc.IsKorekta AND NOT @tr.oppo_e.IS_Do_WZ THEN
		SET @X = '';
		END IF;
		
		/**************************************************************************************************************************
			Sprawdz `oppo_instancje_e` czy są egzemplarze
		**************************************************************************************************************************/
		/* Nie ma juz `oppo_instancje`
		IF NOT @ht.doc.IsKorekta AND NOT @tr.oppo_e.IS_Do_WZ THEN
			SET NEW.Ilosc = 
				IFNULL(
					(
						SELECT 
							SUM(ABS(Ilosc)) AS Ilosc
						FROM `oppo_instancje_e`
						WHERE
							guid_oppo = NEW.GUID
					),
					NEW.Ilosc
			);
		END IF;
		*/
		IF NEW.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND) THEN
		--	Inwentaryzacja
			IF @tr.oppo_e.Ilosc.Change THEN
				SET
					NEW.iloscjest = NEW.Ilosc + NEW.iloscbylo
				;
			ELSEIF @tr.oppo_e.iloscjest.Change THEN
				SET
					NEW.Ilosc = NEW.iloscjest - NEW.iloscbylo
				;
			END IF;
			SET @tr.oppo_e.iloscjest.Change = NOT(IFNULL(NEW.iloscjest, '') <=> IFNULL(OLD.iloscjest, ''));
			SET @tr.oppo_e.iloscbylo.Change = NOT(IFNULL(NEW.iloscbylo, '') <=> IFNULL(OLD.iloscbylo, ''));
		END IF;
		
		/**************************************************************************************************************************
			Jeśli towar sie zmienił ...
		**************************************************************************************************************************/
		IF @tr.oppo_e.IdnTowr.Change THEN	
		--	Zad:42609  - GUID dostawy mozna owszem skasować ale gdy towar zmienił się z innego a nie z pustego co oznacza ze wlasnie dodaliśmy nowy towar i byc może ustawiliśmy NEW.GUID_Dostawy - wtedy go NIE KASUJMY
			SET NEW.GUID_Dostawy = IF(@tr.oppo_e.IdnTowr.Is_New, NEW.GUID_Dostawy, '');
			IF IFNULL(NEW.IdnTowr, '') != '' THEN 
			/*	było do 6 VIII 2024
				UPDATE `TowrNg` t
				SET
					NEW.TowrSymb = t.Symbol, 
					NEW.TowrNazwa = t.Nazwa, 
					NEW.IdnVat = IFNULL(IF((t.VatPrevYear > 0) AND (@session.vat.edityear <= t.VatPrevYear), t.VatPrevId, t.Vat), 0),
					NEW.Jednostka = t.Jednostka,
					NEW.Usluga = t.Usluga,
					-- NEW.ilewopakowaniu = IF(@session.globals.Owner = 'IZOHAN', t.opakowanie_zbiorcze_d, t.ilewopakowaniu),
					NEW.ilewopakowaniu = 
					CASE -- TODO dodać kolumnę do operdoc decydujaca co wchodzi do opak.
						WHEN @ht.doc.MagTyp = @ht.mtRZ THEN 	-- RZ, ZM OO = 2
						--	rozchod
							IF(@session.globals.Owner = 'IZOHAN', 
								t.opakowanie_zbiorcze_d, 
								t.opakowanie_d
							) 
						WHEN @ht.doc.MagTyp = @ht.mtPZ THEN 	-- ZM DD = 0
						--	przychod
							IF(@session.globals.Owner = 'IZOHAN', 
								t.ilewopakowaniu_zbiorczym_d, 
								t.ilewopakowaniu
							) 
						WHEN @ht.doc.MagTyp = @ht.mtMM THEN 	-- MM = 1
								t.ilewopakowaniu
						ELSE 		-- NN = 3
								t.ilewopakowaniu
					END,
					NEW.kat5 = t.katcol0,
					NEW.kat6 = t.katcol1,
					NEW.kat7 = t.katcol2,
					NEW.kat8 = t.katcol3,
					NEW.kat9 = t.katcol4,
					NEW.cena_minimalna = t.cena_minimalna,
					NEW.opakowanie_zwrotne = t.opakowanie_zwrotne,
					-- było NEW.info = t.info,
					NEW.info = IFNULL(NULLIF(NEW.info, ''), t.info),
					-- było NEW.info2 = t.info2,
					NEW.info2 = IFNULL(NULLIF(NEW.info2, ''), t.info2),
					-- było NEW.info3 = t.info3,
					NEW.info3 = IFNULL(NULLIF(NEW.info3, ''), t.info3),
					-- było NEW.info4 = t.info4,
					NEW.info4 = IFNULL(NULLIF(NEW.info4, ''), t.info4),
					
					NEW.oplata_produktowa = t.oplata_produktowa,
					NEW.min_ord_quant = t.min_ord_quant,
					-- NEW.CzasOczekiwania = t.CzasOczekiwania,
					NEW.waga_jedn = t.waga,
					NEW.pkwiu = t.pkwiu,
					NEW.termin_waznosci = DATE_ADD(CURRENT_DATE(), INTERVAL t.dni_waznosci DAY),
					NEW.CenaNet = IF(NEW.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND), t.CenaZkpNet, NEW.CenaNet)
				WHERE
					t.GUID = NEW.IdnTowr
				;
				było 	*/
			/*	pobierz z towaru do zmiennych	*/
				SELECT
					t.Symbol, 
					t.Nazwa, 
					IFNULL(IF((t.VatPrevYear > 0) AND (@session.vat.edityear <= t.VatPrevYear), t.VatPrevId, t.Vat), 0) AS IdnVat,
					t.Jednostka,
					t.Usluga,
					CASE -- TODO dodać kolumnę do operdoc decydujaca co wchodzi do opak.
						WHEN @ht.doc.MagTyp = @ht.mtRZ THEN 	-- RZ, ZM OO = 2
						--	rozchod
							IF(@session.globals.Owner = 'IZOHAN', 
								t.opakowanie_zbiorcze_d, 
								t.opakowanie_d
							) 
						WHEN @ht.doc.MagTyp = @ht.mtPZ THEN 	-- ZM DD = 0
						--	przychod
							IF(@session.globals.Owner = 'IZOHAN', 
								t.ilewopakowaniu_zbiorczym_d, 
								t.ilewopakowaniu
							) 
						WHEN @ht.doc.MagTyp = @ht.mtMM THEN 	-- MM = 1
								t.ilewopakowaniu
						ELSE 		-- NN = 3
								t.ilewopakowaniu
					END 
					AS ilewopakowaniu,
					t.katcol0,
					t.katcol1,
					t.katcol2,
					t.katcol3,
					t.katcol4,
					t.cena_minimalna,
					t.opakowanie_zwrotne,
					IFNULL(NULLIF(NEW.info, ''), t.info) AS info,
					IFNULL(NULLIF(NEW.info2, ''), t.info2) AS info2,
					IFNULL(NULLIF(NEW.info3, ''), t.info3) AS info3,
					IFNULL(NULLIF(NEW.info4, ''), t.info4) AS info4,
					t.oplata_produktowa,
					t.min_ord_quant,
					-- t.CzasOczekiwania,
					t.waga,
					t.pkwiu,
					DATE_ADD(CURRENT_DATE(), INTERVAL t.dni_waznosci DAY) AS termin_waznosci,
					IF(NEW.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND), t.CenaZkpNet, NEW.CenaNet) AS CenaNet
				INTO
					@.t.Symbol, 
					@.t.Nazwa, 
					@.t.IdnVat,
					@.t.Jednostka,
					@.t.Usluga,
					@.t.ilewopakowaniu,
					@.t.katcol0,
					@.t.katcol1,
					@.t.katcol2,
					@.t.katcol3,
					@.t.katcol4,
					@.t.cena_minimalna,
					@.t.opakowanie_zwrotne,
					@.t.info,
					@.t.info2,
					@.t.info3,
					@.t.info4,
					@.t.oplata_produktowa,
					@.t.min_ord_quant,
					-- @.t.CzasOczekiwania,
					@.t.waga,
					@.t.pkwiu,
					@.t.termin_waznosci,
					@.t.CenaNet
				FROM `TowrNg` t
				WHERE
					t.GUID = NEW.IdnTowr
				;
				SET
					NEW.TowrSymb = @.t.Symbol, 
					NEW.TowrNazwa = @.t.Nazwa, 
					NEW.IdnVat = @.t.IdnVat,
					NEW.Jednostka = @.t.Jednostka,
					NEW.Usluga = @.t.Usluga,
					NEW.ilewopakowaniu = @.t.ilewopakowaniu,
					NEW.kat5 = @.t.katcol0,
					NEW.kat6 = @.t.katcol1,
					NEW.kat7 = @.t.katcol2,
					NEW.kat8 = @.t.katcol3,
					NEW.kat9 = @.t.katcol4,
					NEW.cena_minimalna = @.t.cena_minimalna,
					NEW.opakowanie_zwrotne = @.t.opakowanie_zwrotne,
					NEW.info = @.t.info,
					NEW.info2 = @.t.info2,
					NEW.info3 = @.t.info3,
					NEW.info4 = @.t.info4,
					NEW.oplata_produktowa = @.t.oplata_produktowa,
					NEW.min_ord_quant = @.t.min_ord_quant,
					-- NEW.CzasOczekiwania = @.t.CzasOczekiwania,
					NEW.waga_jedn = @.t.waga,
					NEW.pkwiu = @.t.pkwiu,
					NEW.termin_waznosci = @.t.termin_waznosci,
					NEW.CenaNet = @.t.CenaNet
				;
				/*	Przez chwile VIII 2024 potem f. _Get_IdnVat
				IF 
				IFNULL(@session.HT.IR.ZmienianaIdnVatNaZeroDlaFvWalutowych, TRUE) 
			--	po rozmowie z apro jesli stawka idnVat jest nie podlega to wtedy nie ustawiamy 0
				AND NEW.idnVat != 5 	--	cvNiepodlega 
				THEN
					SELECT n.Rodzaj2, n.RV_Id INTO @.n.Rodzaj2, @.n.RV_Id FROM `opng_e` n WHERE n.GUID = NEW.IdnOper;
					IF 
					--	Rodzaj niekrajowy! - GetCzyRodzajToSprzedazNieKrajowa
					NEW.Rodzaj IN (@ht.CSpFE, @ht.CSTUE, @ht.CSTKU, @ht.CSTKE, @ht.CZmEX) THEN		
						SET NEW.idnVat = 2;	-- VatInfo[cv0].VatValue;
					ELSEIF 
					NEW.Rodzaj = @ht.CRzWZ AND
					--	Rodzaj2 nagł. niekrajowy! - GetCzyRodzajToSprzedazNieKrajowa
					@.n.Rodzaj2 IN (@ht.CSpFE, @ht.CSTUE, @ht.CSTKU, @ht.CSTKE, @ht.CZmEX) THEN		
						SET NEW.idnVat = 2;	-- VatInfo[cv0].VatValue;
					ELSEIF NEW.Rodzaj IN (@ht.CZkFV) AND @.n.RV_Id = 2028 THEN --	RV_RR_5 dla rolników idywidualnych - zakupu RR
						SET NEW.idnVat = 5;	-- Nie podlega VatInfo[cv5].VatValue;
					END IF;
				END IF;
				*/
			END IF;
		END IF;
	--	Idn Vat mógł sie zmienic po zm. towaru albo też "z ręki"
		IF !(NEW.idnVat <=> OLD.idnVat) THEN
		/*	A może VAT 0 - spr. czy spełnia warunki...	*/	
			--	 juz nie bo wyżej pobieram rodzaj2 i RV_ID SELECT n.Rodzaj2, n.RV_Id INTO @.n.Rodzaj2, @.n.RV_Id FROM `opng_e` n WHERE n.GUID = NEW.IdnOper;
			SET NEW.idnVat = _Get_IdnVat('', 'OP', NEW.idnVat, NEW.Rodzaj, @.n.Rodzaj2, @.n.RV_Id, @.od.ZerowaStawkaVat, '');
		END IF;
		
		SET NEW.wartBrtWal = IFNULL(NEW.wartBrtWal, 0);
		
		/**************************************************************************************************************************
			Sprawdz czy nie trzeba zmienic rodzaju i .. Magazynu!!!!!!!!!!!!!!!!!!
			Skoro zmieniono ilosc lub wart. netto	
			Ale także gdy w ZMagazynu lub DoMagazynu jest -100 oznacza to bowiem, ze zadamy naliczenia magazynu z naglowka
		**************************************************************************************************************************/
		
		SET @tr.oppo_e.Magazyny.Update.Z.Naglowka = ((NEW.ZMagazynu = -100) OR (NEW.DoMagazynu = -100)) AND NOT @tr.oppo_e.IS_Do_WZ;
		IF (@tr.oppo_e.Magazyny.Update.Z.Naglowka OR @tr.oppo_e.Ilosc.Change OR @tr.oppo_e.iloscjest.Change OR @tr.oppo_e.iloscbylo.Change OR @tr.oppo_e.WartNet.Change OR @.oppo_e.Update_status = 'CALC_INW') 
		AND NOT @tr.oppo_e.IS_Do_WZ THEN

			IF 
			NEW.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND) 
			AND
			(@tr.oppo_e.iloscjest.Change OR @tr.oppo_e.iloscbylo.Change OR @.oppo_e.Update_status = 'CALC_INW') 
			THEN
				SET
					NEW.Ilosc = NEW.iloscjest - NEW.iloscbylo
				;
			END IF;
			
			SET
				@p.Rodzaj = @.n.Rodzaj,
				@p.ZMagazynu = @.n.ZMagazynu,
				@p.DoMagazynu = @.n.DoMagazynu
			;
			CALL e_oppo_ustal_magazyny_rodzaj('', @p.Rodzaj, @p.ZMagazynu, @p.DoMagazynu, NEW.Ilosc, NEW.WartNet);
			-- ??? CALL e_oppo_ustal_magazyny_rodzaj('', @_Rodzaj, @_ZMagazynu, @_DoMagazynu, NEW.Ilosc, NEW.WartNet);
			-- stare CALL e_oppo_rec_ustal_magazyny_rodzaj('', @p.Rodzaj, @p.ZMagazynu, @p.DoMagazynu, NEW.Ilosc, NEW.WartNet);
			SET 
				NEW.Rodzaj = @p.Rodzaj, 
				NEW.ZMagazynu = @p.ZMagazynu, 
				NEW.DoMagazynu = @p.DoMagazynu
			;
			-- CALL ht_rodzaj_calc(NEW.Rodzaj);
			-- CALL ht_rodzaj_calc(@.n.Rodzaj);
			CALL ht_rodzaj_update_zmienne(@.n.Rodzaj);
		END IF;

	--	Ze wzgledu na to że mogła sie ilosc zmienic jeszcze (inwent. albo co innego zatem ponownie sprawdzamy Changed
		SET @tr.oppo_e.Ilosc.Change = NOT(IFNULL(NEW.Ilosc, '') <=> IFNULL(OLD.Ilosc, ''));
	--	A jeśli sie zmieniła ilosc lub jednostka to ....	
		SET @tr.oppo_e.Jednostka.Change = NOT(IFNULL(NEW.Jednostka, '') <=> IFNULL(OLD.Jednostka, ''));
		IF FALSE AND (@tr.oppo_e.Ilosc.Change OR @tr.oppo_e.Jednostka.Change) THEN
			SET @tr.oppo_e.NEW.Jednostka.precyzja = (SELECT j.precyzja FROM Jednostki j WHERE j.idn = NEW.Jednostka);
			SET NEW.Ilosc = IF(@tr.oppo_e.NEW.Jednostka.precyzja IS NULL, NEW.Ilosc, _Rnd(NEW.Ilosc, @tr.oppo_e.NEW.Jednostka.precyzja));
			-- aaa
		END IF;
		
		-- SET NEW.waga = IF(IFNULL(NEW.Ilosc, 0) > 0, IFNULL(NEW.waga_jedn, 0/) * IFNULL(NEW.Ilosc, 0), 0);
		SET NEW.waga = IFNULL(NEW.waga_jedn, 0) * ABS(IFNULL(NEW.Ilosc, 0));
		
		/**************************************************************************************************************************
			Przelicz (calcOppo) jeśli to nie korekta
		**************************************************************************************************************************/
		-- IF NOT @ht.doc.IsKorekta AND NOT @tr.oppo_e.IS_Do_WZ THEN
		IF NOT @.n.IsKorekta AND NOT @tr.oppo_e.IS_Do_WZ THEN
			-- IF NOT @ht.doc.IsKorekta THEN
			SET @tr.oppo_e.Need.CalcXXPo = 
				(NEW.Tag < 0) OR
				NOT(IFNULL(NEW.rodzaj_przeliczenia, '') <=> IFNULL(OLD.rodzaj_przeliczenia, '')) OR
				NOT(IFNULL(NEW.IdnVat, '') <=> IFNULL(OLD.IdnVat, '')) OR
				NOT(IFNULL(NEW.Ilosc, '') <=> IFNULL(OLD.Ilosc, '')) OR
				--	uwaga zamast NEW.Wspolplatnosc od 24 V 2022 NEW.Usluga (zad IDN = 55317)
				--	NOT(IFNULL(NEW.Wspolplatnosc, '') <=> IFNULL(OLD.Wspolplatnosc, '')) OR
				NOT(IFNULL(NEW.Usluga, '') <=> IFNULL(OLD.Usluga, '')) OR
				NOT(IFNULL(NEW.Rabat, '') <=> IFNULL(OLD.Rabat, '')) OR
				NOT(IFNULL(NEW.CenaNet, '') <=> IFNULL(OLD.CenaNet, '')) OR
				NOT(IFNULL(NEW.CenaNetWalzRab, '') <=> IFNULL(OLD.CenaNetWalzRab, '')) OR
				NOT(IFNULL(NEW.WartNet, '') <=> IFNULL(OLD.WartNet, '')) OR
				NOT(IFNULL(NEW.WartNetWal, '') <=> IFNULL(OLD.WartNetWal, '')) OR
				NOT(IFNULL(NEW.CenaNet, '') <=> IFNULL(OLD.CenaNet, '')) OR
				NOT(IFNULL(NEW.WartBrt, '') <=> IFNULL(OLD.WartBrt, '')) OR
				NOT(IFNULL(NEW.WartBrtWal, '') <=> IFNULL(OLD.WartBrtWal, '')) OR
				NOT(IFNULL(NEW.Kurs, '') <=> IFNULL(OLD.Kurs, '')) OR
				NOT(IFNULL(NEW.Koszt_nabycia, '') <=> IFNULL(OLD.Koszt_nabycia, '')) OR
				NOT(IFNULL(NEW.StawkaCla, '') <=> IFNULL(OLD.StawkaCla, '')) OR
				NOT(IFNULL(NEW.WartClo, '') <=> IFNULL(OLD.WartClo, '')) OR
				NOT(IFNULL(NEW.Oplata_produktowa, '') <=> IFNULL(OLD.Oplata_produktowa, '')) OR
				NOT(IFNULL(NEW.CenaBrt, '') <=> IFNULL(OLD.CenaBrt, ''))
			;
			IF @tr.oppo_e.Need.CalcXXPo THEN
				CALL CalcXXPo('', 
				--	uwaga zamast NEW.Wspolplatnosc od 24 V 2022 NEW.Usluga (zad IDN = 55317)
					NEW.rodzaj_przeliczenia, NEW.IdnVat, NEW.Ilosc, NEW.Usluga, NEW.Rabat, NEW.CenaNet, @.CenaNetPL, NEW.CenaNetWalzRab, NEW.CenaBrt, 
					NEW.WartNet, NEW.WartNetWal, @.StawkaVat, NEW.WartVat, NEW.WartBrt, NEW.WartBrtWal, @.WartBrtEdit, @.WartRabatNet, @.WartRabatBrt, 
					NEW.Kurs, NEW.Koszt_nabycia, NEW.StawkaCla, NEW.WartClo, @.WartNetWalEdit, NEW.Oplata_produktowa,
					NULL, NULL, -- było @ht.doc.IsKorekta, @ht.doc.IsWaluta,
					NEW.calc_ver, '', '', '')
				;
				SET NEW.wartBrtWal = IFNULL(NEW.wartBrtWal, 0);
				SET @Test_speed = 1;
				
				IF 
				(
					(@ht.doc.Optyp = @ht.ST) OR 
					(NEW.Rodzaj IN (@ht.CRzWZ, @ht.CRzRW, @ht.CRzKR, @ht.CZmEX, @ht.CZMOO))		
				)
				/*
				AND
				(	
					NEW.ExtFlags LIKE '%{NUREK}%'
				)
				*/
				AND
				(	
					NOT(IFNULL(NEW.CenaNet, 0) <=> IFNULL(OLD.CenaNet, 0)) OR
					NOT(IFNULL(NEW.CenaNetWalzRab, 0) <=> IFNULL(OLD.CenaNetWalzRab, 0))
				) 
				AND
				(
					NOT @session.HT.IR.Sprzedaz_ponizej_ceny_min
					OR
					NOT @session.HT.IR.Sprzedaz_ponizej_ceny_zakupu
				)
				THEN
			--	NURKOWANIE	
					SET NEW.ExtFlags = REPLACE(REPLACE(IFNULL(NEW.ExtFlags, ''), '<NUREK>', ''), '{NUREK}', '');
					SET @.CenaNetPL = NEW.CenaNetWalzRab * NEW.Kurs;
					CALL Calc_ceny_Po('GetNurkowanie.oppo_e.trigger', @Nurek.OK, NEW.IdnOper, NEW.IdnTowr, @.CenaNetPL, NEW.Datawystaw, '', '', '', '', '', '');		

					SET NEW.ExtFlags = 
						CONCAT(
							REPLACE(REPLACE(NEW.ExtFlags, '<NUREK>', ''), '{NUREK}', ''),
							IF(NOT @Nurek.OK,
								'<NUREK>',
								''
							)
						)
					;
					
				END IF;
			END IF;
		END IF;
		
		/**************************************************************************************************************************
			TypSymbolow
		**************************************************************************************************************************/
		SET @tr.oppo_e.TypSymbolow.Change = !(NEW.TypSymbolow <=> OLD.TypSymbolow);
		IF @tr.oppo_e.TypSymbolow.Change OR @tr.oppo_e.IdnTowr.Change THEN
			SET 
				@tr.oppo_e.IdnTowr = NEW.IdnTowr,
				@tr.oppo_e.TypSymbolow = NEW.TypSymbolow,
				@_Symbol.XXX = NEW.TowrSymb, 
				@_Symbol = NEW.TowrSymb, 
				@_Nazwa = NEW.TowrNazwa
			;
			CALL e_xxpo_GetSymbolNazwaByType('', @_Symbol, @_Nazwa, NEW.TypSymbolow, NEW.IdnTowr, @.n.KontrGUID, @.n.PlatnikGUID, @_IFDEF_DisplayNazwaLang := FALSE, @_IFDEF_TOWARY_TRANSLATE, '', '');
			SET
				NEW.TowrSymb = IFNULL(@_Symbol, NEW.TowrSymb),
				NEW.TowrNazwa = IFNULL(@_Nazwa, NEW.TowrNazwa)
			;
			
		END IF;
			
		IF NEW.Tag < 0 THEN
			SET NEW.Tag = IF(NEW.Tag = -2, -2, IFNULL(OLD.Tag, 0));
		END IF;
		
	ELSE
--	STARE
		CALL ht_rodzaj_update_zmienne(NEW.Rodzaj);
		-- CALL ht_rodzaj_calc(NEW.Rodzaj);

		-- SET @tr.oppo_e.IdnTowr.Change = IFNULL(NEW.IdnTowr, '') != IFNULL(OLD.IdnTowr, '');
		
		SET @tr.oppo_e.IdnTowr.Change = NOT(IFNULL(NEW.IdnTowr, '') <=> IFNULL(OLD.IdnTowr, ''));
		SET @tr.oppo_e.Ilosc.Change = NOT(IFNULL(NEW.Ilosc, '') <=> IFNULL(OLD.Ilosc, ''));
		
		SET @tr.oppo_e.WartNet.Change = NOT(IFNULL(NEW.WartNet, '') <=> IFNULL(OLD.WartNet, ''));

		SET
			NEW.idnoperfin =  
				IF(IFNULL(NEW.idnwz, '') != '', 
					NEW.idnwz,
					NEW.idnoper
				),
			NEW.GUIDzm = IFNULL(NEW.GUIDzm, '')
		;	
		
		--	Sprawdz `oppo_instancje_e` czy są egzemplarze
		
		IF NOT @ht.doc.IsKorekta THEN
			SET NEW.Ilosc = 
				IFNULL(
					(
						SELECT 
							SUM(Ilosc) AS Ilosc
						FROM `oppo_instancje_e`
						WHERE
							guid_oppo = NEW.GUID
					),
					NEW.Ilosc
			);
		END IF;
		
		
		IF @tr.oppo_e.IdnTowr.Change THEN
			IF IFNULL(NEW.IdnTowr, '') != '' THEN 
				UPDATE `TowrNg` t
				SET
					NEW.TowrSymb = t.Symbol, 
					NEW.TowrNazwa = t.Nazwa, 
					NEW.IdnVat = IFNULL(IF((t.VatPrevYear > 0) AND (@session.vat.edityear <= t.VatPrevYear), t.VatPrevId, t.Vat), 0),
					NEW.Jednostka = t.Jednostka,
					NEW.Usluga = t.Usluga,
					NEW.ilewopakowaniu = t.ilewopakowaniu,
					NEW.kat5 = t.katcol0,
					NEW.kat6 = t.katcol1,
					NEW.kat7 = t.katcol2,
					NEW.kat8 = t.katcol3,
					NEW.kat9 = t.katcol4,
					NEW.cena_minimalna = t.cena_minimalna,
					NEW.pkwiu = t.pkwiu,
					NEW.termin_waznosci = DATE_ADD(CURRENT_DATE(), INTERVAL t.dni_waznosci DAY),
					NEW.opakowanie_zwrotne = t.opakowanie_zwrotne,
					NEW.waga_jedn = t.waga
				WHERE
					t.GUID = NEW.IdnTowr
				;
			END IF;
		END IF;

		SET NEW.wartBrtWal = IFNULL(NEW.wartBrtWal, 0);
		
		/**************************************************************************************************************************
		Sprawdz czy nie trzeba zmienic rodzaju!!!!!!!!!!!!!!!!!!
		Skoro zmieniono ilosc lub wart. netto	
		**************************************************************************************************************************/
		IF @tr.oppo_e.Ilosc.Change OR @tr.oppo_e.WartNet.Change THEN
			SELECT 
				n.Rodzaj, n.ZMagazynu, n.DoMagazynu 
			FROM `opng_e` n 
			WHERE 
				n.GUID = NEW.IdnOper 
			INTO 
				@.n.Rodzaj, @.n.ZMagazynu, @.n.DoMagazynu
			;
			-- SET @.n.Rodzaj = NEW.Rodzaj; -- , @.n.ZMagazynu = NEW.ZMagazynu, @.n.DoMagazynu = NEW.DoMagazynu;
			SET
				@p.Rodzaj = @.n.Rodzaj,
				@p.ZMagazynu = @.n.ZMagazynu,
				@p.DoMagazynu = @.n.DoMagazynu
			;
			CALL e_oppo_rec_ustal_magazyny_rodzaj('', @p.Rodzaj, @p.ZMagazynu, @p.DoMagazynu, NEW.Ilosc, NEW.WartNet);
			SET 
				NEW.Rodzaj = @p.Rodzaj, 
				NEW.ZMagazynu = @p.ZMagazynu, 
				NEW.DoMagazynu = @p.DoMagazynu
			;
			-- CALL ht_rodzaj_calc(NEW.Rodzaj);
			-- CALL ht_rodzaj_calc(@.n.Rodzaj);
			CALL ht_rodzaj_update_zmienne(@.n.Rodzaj);
		END IF;
		
		-- SET NEW.waga = IF(IFNULL(NEW.Ilosc, 0) > 0, IFNULL(NEW.waga_jedn, 0) * IFNULL(NEW.Ilosc, 0), 0);
		SET NEW.waga = IFNULL(NEW.waga_jedn, 0) * ABS(IFNULL(NEW.Ilosc, 0));
		
		IF NOT @ht.doc.IsKorekta THEN
			-- IF NOT @ht.doc.IsKorekta THEN
			SET @jmam = true;
			CALL CalcXXPo('', 
			--	uwaga zamast NEW.Wspolplatnosc od 24 V 2022 NEW.Usluga (zad IDN = 55317)
				NEW.rodzaj_przeliczenia, NEW.IdnVat, NEW.Ilosc, NEW.Usluga, NEW.Rabat, NEW.CenaNet, @.CenaNetPL, NEW.CenaNetWalzRab, NEW.CenaBrt, 
				NEW.WartNet, NEW.WartNetWal, @.StawkaVat, NEW.WartVat, NEW.WartBrt, NEW.WartBrtWal, @.WartBrtEdit, @.WartRabatNet, @.WartRabatBrt, 
				NEW.Kurs, NEW.Koszt_nabycia, NEW.StawkaCla, NEW.WartClo, @.WartNetWalEdit, NEW.Oplata_produktowa,
				NULL, NULL, -- było @ht.doc.IsKorekta, @ht.doc.IsWaluta,
				NEW.calc_ver, '', '', '');
			SET NEW.wartBrtWal = IFNULL(NEW.wartBrtWal, 0);
			/*	
			CALL CalcPo('', 
				NEW.rodzaj_przeliczenia, NEW.IdnVat, NEW.Ilosc, NEW.Wspolplatnosc, NEW.Rabat, NEW.CenaNet, @.CenaNetPL, NEW.CenaNetWalzRab, NEW.CenaBrt, 
				NEW.WartNet, NEW.WartNetWal, @.StawkaVat, NEW.WartVat, NEW.WartBrt, @.WartBrtEdit, @.WartRabatNet, @.WartRabatBrt, 
				NEW.Kurs, NEW.Koszt_nabycia, NEW.StawkaCla, NEW.WartClo, @.WartNetWalEdit, NEW.Oplata_produktowa,
				@ht.doc.IsKorekta, @ht.doc.IsWaluta,
				'', '', '', '');
			*/	
		END IF;
		
		
	END IF;		--	PO Staremu NEW.Calc_Ver < 3
	SET @session.oppo_e = FALSE;
END;
$$

/* ************************************************************************************************************************************************************************
	AU
************************************************************************************************************************************************************************ */	
DROP TRIGGER IF EXISTS `oppo_e_au`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `oppo_e_au` AFTER UPDATE ON `oppo_e` FOR EACH ROW 
A: BEGIN
	IF _TriggerDisabled() THEN LEAVE A; END IF;
	/*
	IF IFNULL(@session.trigger.oppo_e, FALSE) THEN 
		LEAVE A; 
	END IF;
	SET @session.trigger.oppo_e = TRUE;
	*/
	
	--	Uwaga zmienna @_ng_E_LetPost.DONE okresla czy byl POST i sprawdzana jest w _ng_E_LetApply
	SET @_ng_E_LetPost.DONE = FALSE;
	SET @tr.oppo_e.oppo_e.LP = GREATEST(IFNULL(@tr.oppo_e.oppo_e.LP, 0), NEW.LP);

	
	/*
	SET @session.trigger.oppo_e = FALSE;
	*/
END;
$$


/* ************************************************************************************************************************************************************************
	Narzędzia  triggera `oppo_e`
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `e_oppo_ustal_magazyny_rodzaj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `e_oppo_ustal_magazyny_rodzaj`(
	IN _MODE VARCHAR(250),
	INOUT _Rodzaj INTEGER,			--	rodzaj z nagłówka
	INOUT _ZMagazynu INTEGER,		--	ZMagazynu z nagłówka		
	INOUT _DoMagazynu INTEGER,		--	DoMagazynu z nagłówka
	IN _Ilosc DECIMAL(16,6),
	IN _WartNet DECIMAL(16,6)
)
/*
	CALL e_oppo_ustal_magazyny_rodzaj('', @_Rodzaj, @_ZMagazynu, @_DoMagazynu, @_Ilosc, @_WartNet);
*/
S_e_oppo_ustal_magazyny_rodzaj: BEGIN 
	DECLARE N_Rodzaj INTEGER;
	SET N_Rodzaj = _Rodzaj;
	
	--	Czy zmienne sa nadane (gdy null to wolaj refresh bo wychodza czasem bzdury typu oba magazyny zerowe :(
	IF @ht.mtRZ IS NULL THEN	--	@ht.mtRZ to tylko przyklad mozna by uzyc kazdej innej stalej
		CALL _Session_Refresh_Variables('', '', '');
	END IF;
	
	SELECT
		IF(od.MA_Magzyny,
			IF(od.IsKorekta,
			--	Korekta
				IF((_Ilosc > 0.0) OR (_WartNet > 0),
					od.AntyRodzaj,
					_Rodzaj
				),
			--	NIE Korekta
				IF(_Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND),
					IF(_Ilosc >= 0.0, @ht.CInNW, @ht.CInND),
					IF(_Rodzaj IN (@ht.CZmZP),
						@ht.CZM_ZP1,
						_Rodzaj
					)
				)
			),	
			_Rodzaj
		) AS Rodzaj	
	FROM `operdoc` od
	WHERE
		od.rodzaj = _Rodzaj
	INTO 
		N_Rodzaj
	;
	
	SET 
		@_ZMagazynu = _ZMagazynu, @_DoMagazynu = _DoMagazynu,
		_Rodzaj = N_Rodzaj
	;
	SELECT
		_VarInt(
			CASE 
		/*RZ*/	WHEN od.MagTyp = @ht.mtRZ THEN IF(@_ZMagazynu > 0, @_ZMagazynu, @_DoMagazynu) 
		/*PZ*/	WHEN od.MagTyp = @ht.mtPZ THEN 0
		/*MM*/	WHEN od.MagTyp = @ht.mtMM THEN IF(@_ZMagazynu > 0, @_ZMagazynu, @_DoMagazynu) 
		/*NN*/	ELSE 0
			END
		) AS _ZMagazynu,
		_VarInt(
			CASE 
		/*RZ*/	WHEN od.MagTyp = @ht.mtRZ THEN 0
		/*PZ*/	WHEN od.MagTyp = @ht.mtPZ THEN IF(@_DoMagazynu > 0, @_DoMagazynu, @_ZMagazynu) 
		/*MM*/	WHEN od.MagTyp = @ht.mtMM THEN IF(@_DoMagazynu > 0, @_DoMagazynu, @_ZMagazynu) 
		/*NN*/	ELSE 0
			END
		) AS _DoMagazynu
	FROM `operdoc` od
	WHERE
		od.rodzaj = N_Rodzaj
	INTO 
		_ZMagazynu, _DoMagazynu
	;
	
	LEAVE S_e_oppo_ustal_magazyny_rodzaj;
	
END$$


DROP PROCEDURE IF EXISTS `e_xxpo_GetSymbolNazwaByType`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `e_xxpo_GetSymbolNazwaByType`(
	IN _MODE VARCHAR(250),
	INOUT _Symbol VARCHAR(255),
	INOUT _Nazwa VARCHAR(255),
	IN _TypSymbolow INTEGER,
	IN _IdnTowr VARCHAR(38),
	IN _KontrGUID VARCHAR(38),
	IN _PlatnikGUID VARCHAR(38),
	IN _IFDEF_DisplayNazwaLang BOOLEAN,
	IN _IFDEF_TOWARY_TRANSLATE  BOOLEAN,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
w C_Towary
aType: Integer; aIdnTowr,
  aKontrGUID, aPlatnikGUID: String; var aSymbol, aNazwa: String
	CALL e_xxpo_GetSymbolNazwaByType('', @_Symbol, @_Nazwa, NEW._TypSymbolow, _IdnTowr, NEW.KontrGUID, NEW.PlatnikGUID, _IFDEF_DisplayNazwaLang, _IFDEF_TOWARY_TRANSLATE, '', '');
*/
S_GetSymbolNazwaByType: BEGIN 
	DECLARE CtsKarta INTEGER DEFAULT 0;
	DECLARE CtsDostawca INTEGER DEFAULT 1;
	DECLARE CtsProducent INTEGER DEFAULT 2;
	DECLARE CtsDlaKontrahenta INTEGER DEFAULT 3;
	DECLARE CTowrLangId VARCHAR(20) DEFAULT 'PL';

	SET	
		@t.Symbol = _Symbol, 
		@t.Nazwa = _Nazwa
	;
	IF _TypSymbolow = CtsKarta THEN
		SELECT
			t.Symbol,
			t.Nazwa,
			_VarStr(IFNULL(lt.ToStr, '')) AS NazwaLang
		FROM `TowrNg` t
		LEFT JOIN `lang_translations` lt ON t.GUID = lt.object_key AND lt.object_name = 'TowrNg' AND lt.to_lang = CTowrLangId
		WHERE
			t.GUID = _IdnTowr
		INTO 
			@t.Symbol, @t.Nazwa, @t.NazwaLang
		;	
		SET 
			_Symbol = @t.Symbol,
			_Nazwa = IF(_IFDEF_DisplayNazwaLang, @t.NazwaLang, @t.Nazwa)
		;	
	END IF;

	IF _TypSymbolow IN (CtsDostawca, CtsProducent) THEN
		SELECT 
			t.symboludost, t.symbolproducenta, t.Nazwa, IFNULL(t.NazwaUProducenta, '') AS NazwaUProducenta
		FROM `TowrNg` t
		WHERE
			t.GUID = _IdnTowr
		INTO
			@t.symboludost, @t.symbolproducenta, @t.Nazwa, @t.NazwaUProducenta
		;	
		SET 
			_Symbol = IF(_TypSymbolow = CtsProducent, @t.symbolproducenta, @t.symboludost),
			_Nazwa = IF(@t.NazwaUProducenta != '', @t.NazwaUProducenta, @t.Nazwa)
		;	
	END IF;
	
	IF _TypSymbolow = CtsDlaKontrahenta THEN
		SELECT 
			o.Symbol, o.Nazwa
		FROM `oferty` o 
		LEFT JOIN `kontrah` k ON k.GUID = _KontrGUID
		WHERE 
			o.idntowr = _IdnTowr 
			AND 
			o.kontrGUID IN (_KontrGUID, _PlatnikGUID, IFNULL(k.grupaguid, '')) 
		ORDER BY IF(o.kontrGUID = _KontrGUID, 0, IF(o.kontrGUID = _PlatnikGUID, 1, 2))
		LIMIT 1
		INTO
			@t.Symbol, @t.Nazwa
		;
	
		SET 
			_Symbol = @t.Symbol,
			_Nazwa = @t.Nazwa
		;	
	END IF;
	
END$$

DELIMITER ;

DELIMITER $$
DROP FUNCTION IF EXISTS `_Get_IdnVat`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_Get_IdnVat`(
	_MODE VARCHAR(250),	 		--	
	_FROM VARCHAR(250),
	_weIdnVat INTEGER,				--	dotychcz. IdnVat
	_Rodzaj INTEGER,				--	Rodzaj dok. 
	_Rodzaj2 INTEGER,				--	Rodzaj2 dok. 
	_Param_A VARCHAR(200),			--	np. RV_Id
	_Param_B VARCHAR(200),			--	ZerowaStawkaVat UWAGA gdy NULL to sam pobierz z `operdoc`
	_Param_C VARCHAR(200)			--	np. RV_Id
	) RETURNS INTEGER
    NO SQL
    DETERMINISTIC
/*
	np.
	_Get_IdnVat('', 'OP', NEW.idnVat, NEW.Rodzaj, @.n.Rodzaj2, @.n.RV_Id, '', '');	
*/	
BEGIN
	SET 
		@.NEW.IdnVat = _weIdnVat,
		@.NEW.Rodzaj = _Rodzaj,
		@.NEW.Rodzaj2 = _Rodzaj2,
		@.NEW.RV_Id = _Param_A,
		@.NEW.ZerowaStawkaVat = NULLIF(_Param_B, '')	--	ZerowaStawkaVat UWAGA gdy NULL to sam pobierz z `operdoc`
	;
--	Ustalenie z apro jeśli stawka idnVat jest nie podlega to wtedy nie ustawiamy 0
--	gdy podlega to oczywiście nic nie ustawiamy
	IF @.NEW.IdnVat != 5 THEN	--	cvNiepodlega 
	--	spr, flagę w db_globals (ZerowaStawkaVatZOperDoc)
		IF @session.globals.ZerowaStawkaVatZOperDoc IS NULL THEN CALL _Globals_Get_2('ZerowaStawkaVatZOperDoc', @session.globals.ZerowaStawkaVatZOperDoc, 0, '?'); END IF;
		IF @session.globals.ZerowaStawkaVatZOperDoc THEN
		--	Ustawiamy z operdoc >= X 2024
			SET @.NEW.ZerowaStawkaVat = 
			--	UWAGA gdy NULL to sam pobierz z `operdoc`
				IFNULL(@.NEW.ZerowaStawkaVat,
				(
				SELECT 
					ZerowaStawkaVat
				FROM `operdoc` od 
				WHERE 
					od.Rodzaj = IF(@.NEW.Rodzaj = @ht.CRzWZ, @.NEW.Rodzaj2, @.NEW.Rodzaj)
				)
				)
			; 
			IF @.NEW.ZerowaStawkaVat = 1 THEN
			--	tak dla tego rodzaju (albo Rodzaj2) stawka ma byc ZERO 0%
				SET @.NEW.IdnVat = 2;	-- Stawka 0% VatInfo[cv0].VatValue;
			ELSEIF @.NEW.Rodzaj IN (@ht.CZkFV) AND @.NEW.RV_Id = 2028 THEN --	RV_RR_5 dla rolników idywidualnych - zakupu 
				SET @.NEW.IdnVat = 8;	-- Stawka 5% VatInfo[cv5].VatValue;
			ELSEIF @.NEW.Rodzaj IN (@ht.CZkRU) THEN --	RV_RR_5 dla rolników idywidualnych - zakupu RR
				SET @.NEW.IdnVat = 5;	-- Nie podlega VatInfo[cvNiepodlega].VatValue;
			END IF;
		ELSE
		--	Ustawiamy z IREGA
			IF 
			IFNULL(@session.HT.IR.ZmienianaIdnVatNaZeroDlaFvWalutowych, TRUE) 
		--	po rozmowie z apro jesli stawka idnVat jest nie podlega to wtedy nie ustawiamy 0
		--	uwaga od X 2024 i tak ten warunek nie ma juz znaczenie ze wzgledu na IF stosowany wyżej
			AND @.NEW.IdnVat != 5 	--	cvNiepodlega 
			THEN
				IF @.NEW.Rodzaj IN (@ht.CSpFE, @ht.CSTUE, @ht.CSTKU, @ht.CSTKE, @ht.CZmEX) THEN		
				--	Rodzaj niekrajowy! - GetCzyRodzajToSprzedazNieKrajowa
					SET @.NEW.IdnVat = 2;	-- Stawka 0% VatInfo[cv0].VatValue;
				ELSEIF @.NEW.Rodzaj IN (@ht.CZkIm, @ht.CZTUE) THEN --	praktycznie to samo co wyżej ale zostawiam (jmam)
					SET @.NEW.IdnVat = 2;	-- Stawka 0% VatInfo[cv0].VatValue;
				ELSEIF @.NEW.Rodzaj = @ht.CRzWZ AND
				--	WZ-ka i Rodzaj2 nagł. niekrajowy! - GetCzyRodzajToSprzedazNieKrajowa
					@.NEW.Rodzaj2 IN (@ht.CSpFE, @ht.CSTUE, @ht.CSTKU, @ht.CSTKE, @ht.CZmEX) THEN		
					SET @.NEW.IdnVat = 2;	-- Stawka 0% VatInfo[cv0].VatValue;
				ELSEIF @.NEW.Rodzaj IN (@ht.CZkFV) AND @.NEW.RV_Id = 2028 THEN --	RV_RR_5 dla rolników idywidualnych - zakupu RR
					SET @.NEW.IdnVat = 8;	-- Stawka 5% VatInfo[cv5].VatValue;
				ELSEIF @.NEW.Rodzaj IN (@ht.CZkRU) THEN --	RV_RR_5 dla rolników idywidualnych - zakupu RR
					SET @.NEW.IdnVat = 5;	-- Nie podlega VatInfo[cvNiepodlega].VatValue;
				END IF;
			END IF;
		END IF;
	END IF;
	
	RETURN @.NEW.IdnVat;
END$$

DELIMITER ;

/*
====================================================================================================================================================================================
	NOTATNIK
====================================================================================================================================================================================

*/
