DELIMITER $$

/* ************************************************************************************************************************************************************************
	Realizacja zamówień 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `_zmng_Realizuj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_zmng_Realizuj`(
	IN _MODE VARCHAR(250),
	IN _ZM_Key VARCHAR(38),
	INOUT _Key VARCHAR(38),
	IN _Rodzaj INTEGER,
	IN _Rodzaj_typ INTEGER,		
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,		
	IN _Magazyn2 INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
	IN _Input_GUID VARCHAR(255),
	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _DataWystaw VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
POPRAWNA nowa niwa procedura !!!!!!!!!!!!!!!!
	SET 
		@IdnGUID = '{3B06DED6-D911-4E06-93ED-126253C6C282}',
		@IdnOperRealiz = '3_IdnOperRealiz'
	;
	CALL _zmng_Realizuj('', @IdnGUID, @IdnOperRealiz, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
	
	
	UWAGA!!!!!!!!!!!!!!!!!!
	GP porownal  naglowki 2 dokumentow (realizujacych takie samo zamowienie) 1 z delhi a drugi z swiata e
	OTO wynik:
	
Samo OPNG
wartosci NULL:
zrealizowano
symboper
platnik
niekrajowa 
data_nast_kontaktu
ugrpguid

rozne: 
datasprzed, datawystaw, datawplywu (roznica 5 dni)
dataplatnosci (roznica 14 dni)
dataplatnosci_oczekiwana (roznica 14 dni)	
dzial ( 0 a jest 1)
dotyczy ( inne )
data_vat (0000-00-00)
kolumnaKPR (0 - 7)
	
	
pozycje luzik
datasprzed 	
grupuj
iloscdo
*/
S_zmng_Realizuj: BEGIN 
	SET @_zmng_Realizuj.IlePoz = 0;
	SELECT _VarInt(IFNULL(SUM((p.Ilosc - p.zrealizowano) > 0), 0)) FROM `zmpo` p WHERE p.IdnNG = _ZM_Key INTO @_zmng_Realizuj.IlePoz;
	
	IF @_zmng_Realizuj.IlePoz = 0 THEN
		LEAVE S_zmng_Realizuj;
	END IF;
	
	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	END IF;

	CALL Opng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init

	CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, '', '3', _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, 0, _Param_A, _Param_B, _Param_C);
	
	CALL Opng_E_init_set_from_another_doc('Realizacja.ZM.Edit', _Key, _ZM_Key, '', '', '');	
	
	CALL Opng_E_Run('before.run', _Key, '', '', '');
	CALL Opng_E_Run('', _Key, '', '', '');
	CALL Opng_E_Run('after.run', _Key, '', '', '');

		LEAVE S_zmng_Realizuj;
	CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
	
	SELECT n.zamwpermn FROM `zmng` n WHERE n.GUID = _ZM_Key INTO @n.zamwpermn;
	
	IF @n.zamwpermn = 0 THEN
		UPDATE `zmng` n
		SET
			n.ilepoz = _VarInt((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID)),
			n.IlepozZreal = _VarInt((SELECT SUM(IFNULL(p.zrealizowano = p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID))
		WHERE
			n.GUID = _ZM_Key
			AND n.zamwpermn = 0
		;	
		UPDATE `zmng` n
		SET
			n.Status = IF(n.ilepoz = n.IlepozZreal, 2, n.Status),
			n.zrealizowane = (n.ilepoz = n.IlepozZreal)
		WHERE
			n.GUID = _ZM_Key
			AND n.zamwpermn = 0
		;	
	ELSE
		IF @session.HT.IR.Permanentne_Przesuwac_Termin_Realizacji_o_Cykl THEN
			UPDATE `zmng` n
			SET
				n.TerminRealizacji = DATE_ADD(n.TerminRealizacji, INTERVAL n.permanentne_cykl MONTH)
			WHERE
				n.GUID = _ZM_Key
				AND n.zamwpermn = 1
			;
		END IF;
	END IF;
END$$

DROP PROCEDURE IF EXISTS `_ZAM_Realizuj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ZAM_Realizuj`(
	IN _MODE VARCHAR(250),
	IN _ZM_Key VARCHAR(38),
	INOUT _Key VARCHAR(38),
	IN _Rodzaj INTEGER,
	IN _Rodzaj_typ INTEGER,		
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,		
	IN _Magazyn2 INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
	IN _Input_GUID VARCHAR(255),
	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _DataWystaw VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
POPRAWNA nowa procedura !!!!!!!!!!!!!!!!
	SET 
		@IdnGUID = '{3B06DED6-D911-4E06-93ED-126253C6C282}',
		@IdnOperRealiz = '3_IdnOperRealiz'
	;
	CALL _ZAM_Realizuj('', @IdnGUID, @IdnOperRealiz, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
	
	
	UWAGA!!!!!!!!!!!!!!!!!!
	GP porownal  naglowki 2 dokumentow (realizujacych takie samo zamowienie) 1 z delhi a drugi z swiata e
	OTO wynik:
	
Samo OPNG
wartosci NULL:
zrealizowano
symboper
platnik
niekrajowa 
data_nast_kontaktu
ugrpguid

rozne: 
datasprzed, datawystaw, datawplywu (roznica 5 dni)
dataplatnosci (roznica 14 dni)
dataplatnosci_oczekiwana (roznica 14 dni)	
dzial ( 0 a jest 1)
dotyczy ( inne )
data_vat (0000-00-00)
kolumnaKPR (0 - 7)
	
	
pozycje luzik
datasprzed 	
grupuj
iloscdo

*/
S__ZAM_Realizuj: BEGIN 
	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	END IF;
	
	SELECT
		z.rodzaj, z.rodzaj2, z.KontrGUID, z.Waluta, z.idnmagazyn, z.magazynwys, z.zamwpermn, z.terminrealizacji
	FROM `zmng` z
	WHERE
		z.GUID = _ZM_Key
	LIMIT 1	
	INTO
		@z.rodzaj, @z.rodzaj2, @z.KontrGUID, @z.Waluta, @z.idnmagazyn, @z.magazynwys, @z.zamwpermn, @z.terminrealizacji
	;
	SELECT
		p.MagTyp
	FROM `zmpo` p
	WHERE
		p.IdnNG = _ZM_Key
	LIMIT 1	
	INTO
		@z.MagTyp
	;
	
	IF _MODE = 'cTRANS_MM_FROMZamowienia' THEN
		SET
			_Rodzaj = @ht.CMMMM,
			_Magazyn = @z.idnmagazyn,
			_Magazyn2 = @z.magazynwys 
		;	
	ELSEIF _MODE = 'cTRANS_WZFVTemp_FROMZamowienia' THEN
		SET
			_Rodzaj = @ht.CSpFV,
			_Magazyn = @z.idnmagazyn,
			_Magazyn2 = @z.magazynwys,
			_Tymczasowa = 1
		;	
	ELSE
		IF @z.rodzaj IN (@ht.CZmOO, @ht.CZmZP, @ht.CZmEX) THEN
			SET
				_Rodzaj = IF(_Rodzaj >= 0, _Rodzaj, @z.rodzaj2),
				_Magazyn = 
				CASE 
					/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
					/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN 0
					/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.idnmagazyn
					/*NN*/	ELSE 0
				END,
				_Magazyn2 = 
				CASE 
					/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN 0
					/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
					/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.magazynwys
					/*NN*/	ELSE 0
				END	
			;	
			IF @z.rodzaj IN (@ht.CZmZP) THEN
				SET
					_Rodzaj = IF(@z.MagTyp = @ht.mtRZ, @ht.CRzRW, @ht.CPzPW),
					_Magazyn = IF(@z.MagTyp = @ht.mtRZ, @z.idnmagazyn, 0),
					_Magazyn2 = IF(@z.MagTyp = @ht.mtRZ, 0, @z.magazynwys)
				;	
			END IF;
		ELSEIF @z.rodzaj IN (@ht.CZMWE) THEN
			SET
				_Rodzaj = @ht.CMMMM,
				_Magazyn = @z.idnmagazyn,
				_Magazyn2 = @z.magazynwys
			;	
		ELSEIF @z.rodzaj IN (@ht.CZmDD, @ht.CZmIm) THEN
			SET
				_Rodzaj = IF(_Rodzaj IN (@ht.CZkFV, @ht.CPzPZ, @ht.CZkIm, @ht.CZTUE), _Rodzaj, @ht.CZkFV), 	--	fakturka zakup.
				_Magazyn = 0,
				_Magazyn2 = IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn)
			;	
		END IF;
	END IF;
	
	SET 
		_KontrGUID = @z.KontrGUID,
		_Waluta = IF(NOT _Rodzaj IN (@ht.CSpFE, @ht.CZkIm, @ht.CStUE, @ht.CZTUE), @z.Waluta, _Waluta)		-- !!!??????? C_Sprzedarz.pas linia 1258 
	;
	
	SET 
		@KontrGUID = _KontrGUID
	;	

	/*
	juz nie
	CALL opng_E_LetInsert('', _Key, _Rodzaj, _Rodzaj_typ, _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, _Param_A, _Param_B, _Param_C);
	*/
	CALL Opng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init
	
	CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, '', '3', _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, 0, _Param_A, _Param_B, _Param_C);

	CALL Opng_E_Run('before.run', _Key, '', '', '');
	CALL Opng_E_Run('', _Key, '', '', '');
	CALL Opng_E_Run('after.run', _Key, '', '', '');

	SET @_Key = _Key;
	-- SET _Get_Last_Kurs_For_Waluta(_Waluta, 0);
	
	--	Ogólny Update z zamowienia
	UPDATE `opng_e` n, `zmng` z
	SET
		n.Rodzaj2 = IF(n.Rodzaj = @ht.CRzWZ, 1, n.Rodzaj2),
		n.AkwizytorGUID = z.AkwizytorGUID,
		n.ZlecenieGUID = z.ZlecenieGUID,
		n.sposobplatn = z.sposobplatn,
		n.spedycja = z.spedycja,
		n.info1 = z.info1,
		n.info2 = z.info2,
		n.info3 = z.info3,
		n.info4 = z.info4,
		n.info5 = z.info5,
		n.info6 = z.info6,
		n.RodzajDowodu = z.RodzajDowodu,	-- ?????
		n.transza_zamow = z.transza_zamow,	-- ?????
		n.uwagi = IF(@session.HT.IR.PrzepiszUwagiZZamowienia, z.uwagi, n.uwagi),
		n.Dotyczy = CONCAT(
			'Zam. nr: ', z.nrzamw,
			IF(z.nrzamwkontr != '', 
				CONCAT('Nr zam. odbiorcy: ', z.nrzamwkontr),
				''
			)	
		)	
		
	WHERE
		n.GUID = _Key
		AND
		z.GUID = _ZM_Key
	;	

	--	Gdy zam. jest perman. OO lub eksportowe to ustal dete jako pierwszy nastepny roboczy dzien
	IF (@z.rodzaj IN (@ht.CZmOO, @ht.CZmEx)) AND @z.zamwpermn THEN
		SET
			@z.terminrealizacji = DATE(@z.terminrealizacji)
		;	
		SET
			@z.PierwszyNastepnyRoboczy = _Get_Next_WorkDay(@z.terminrealizacji)
		;
		SET _DataWystaw = @z.PierwszyNastepnyRoboczy;
	ELSE
		--	Gdy CDG i MM-ka to date jako termin realizacji
		IF (IFNULL(_DataWystaw, '') = '') OR ((_Rodzaj = @ht.CMMMM) AND (@session.globals.Owner = 'CDG')) THEN
			SET _DataWystaw = @z.terminrealizacji;
		END IF;	
		
	END IF;

	UPDATE `opng_e` n
	SET
		n.datawystaw = _DataWystaw,
		n.datasprzed = _DataWystaw,
		n.datawplywu = _DataWystaw
	WHERE
		n.GUID = _Key
	;	
	
	--	Przepisz wydzial i ustaw Guid zlecenia gdy RW lub PW
	IF (@z.rodzaj IN (@ht.CZmZP)) AND (_Rodzaj IN (@ht.CRzRW, @ht.CPzPW)) THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.Wydzial = z.Wydzial,
			n.ZlecenieGUID = IF(@session.HT.IR.PrzepiszGUIDZleceniaProd, z.GUID, n.ZlecenieGUID)
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;
	
	--	KatCol-e
	IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.katcol0 = z.katcol0,
			n.katcol1 = z.katcol1,
			n.katcol2 = z.katcol2,
			n.katcol3 = z.katcol3,
			n.katcol4 = z.katcol4
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;
	
	
	-- SELECT @IdnOper, @G;

	SET @G = '';
	CALL oppo_E_Let_Insert('From.zmng', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
	
-- ????		CALL oppo_E_Let_Update('from_opng_e', '', _IdnOper, '', '');
	
	CALL opng_E_Let('Post', _Key, '', '');
	
-- LEAVE S__ZAM_Realizuj;
	
	CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
	
	UPDATE `zmng` n
	SET
		n.ilepoz = _VarInt((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID)),
		n.IlepozZreal = _VarInt((SELECT SUM(IFNULL(p.zrealizowano = p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID))
	WHERE
		n.GUID = _ZM_Key
	;	
	UPDATE `zmng` n
	SET
		n.Status = IF(n.ilepoz = n.IlepozZreal, 2, n.Status),
		n.zrealizowane = (n.ilepoz = n.IlepozZreal)
	WHERE
		n.GUID = _ZM_Key
	;	
	
	-- !!!!! CALL opng_Numeracja_po_Apply('', _Key, '', '', '');
	
	-- SET @G = '';
/*	
	CALL oppo_e_Insert('IdnTowr', @G, @IdnOper, 'M580', 12, 2.5, '');
	CALL oppo_e_LetInsert('IdnTowr', @G, @IdnOper, 'M580', 12, 2.5, '', '', '', '');
	-- i jeszcze 'CUKIER'
	DESC `oppo_corr`;

		CALL ng_vat_e_build_from_po('', 'ZM', @IdnNg, '', '');
	CALL opng_E_LetPost('', @IdnOper, '', '');
	CALL opng_E_LetApply('', @IdnOper, '', '');
		CALL opng_E_LetCancel('', @IdnOper, '', '');
	CALL opng_E_LetEnd('', @IdnOper, '', '');
*/	
END$$

DROP PROCEDURE IF EXISTS `ZAM_Realizuj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ZAM_Realizuj`(
	IN _MODE VARCHAR(250),
	IN _ZM_Key VARCHAR(38),
	INOUT _Key VARCHAR(38),
	IN _Rodzaj INTEGER,
	IN _Rodzaj_typ INTEGER,		
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,		
	IN _Magazyn2 INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
	IN _Input_GUID VARCHAR(255),
	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _DataWystaw VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
Schyłkowa procedura !!!!!!!!!!!!!!!!
	CALL ZAM_Realizuj('', @IdnGUID, @IdnOper, @Rodzaj, 0, @KontrGUID, 2, 2, @_Tymczasowa, 0, '', '', '', 0, '', '', '', '');
*/
S_ZAM_Realizuj: BEGIN 
	
	SELECT
		z.rodzaj, z.rodzaj2, z.KontrGUID, z.Waluta, z.idnmagazyn, z.magazynwys, z.zamwpermn, z.terminrealizacji
	FROM `zmng` z
	WHERE
		z.GUID = _ZM_Key
	LIMIT 1	
	INTO
		@z.rodzaj, @z.rodzaj2, @z.KontrGUID, @z.Waluta, @z.idnmagazyn, @z.magazynwys, @z.zamwpermn, @z.terminrealizacji
	;
	SELECT
		p.MagTyp
	FROM `zmpo` p
	WHERE
		p.IdnNG = _ZM_Key
	LIMIT 1	
	INTO
		@z.MagTyp
	;
	
	IF _MODE = 'cTRANS_MM_FROMZamowienia' THEN
		SET
			_Rodzaj = @ht.CMMMM,
			_Magazyn = @z.idnmagazyn,
			_Magazyn2 = @z.magazynwys 
		;	
	ELSEIF _MODE = 'cTRANS_WZFVTemp_FROMZamowienia' THEN
		SET
			_Rodzaj = @ht.CSpFV,
			_Magazyn = @z.idnmagazyn,
			_Magazyn2 = @z.magazynwys,
			_Tymczasowa = 1
		;	
	ELSE
		IF @z.rodzaj IN (@ht.CZmOO, @ht.CZmZP, @ht.CZmEX) THEN
			SET
				_Rodzaj = IF(_Rodzaj >= 0, _Rodzaj, @z.rodzaj2),
				_Magazyn = 
				CASE 
					/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
					/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN 0
					/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.idnmagazyn
					/*NN*/	ELSE 0
				END,
				_Magazyn2 = 
				CASE 
					/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN 0
					/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
					/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.magazynwys
					/*NN*/	ELSE 0
				END	
			;	
			IF @z.rodzaj IN (@ht.CZmZP) THEN
				SET
					_Rodzaj = IF(@z.MagTyp = @ht.mtRZ, @ht.CRzRW, @ht.CPzPW),
					_Magazyn = IF(@z.MagTyp = @ht.mtRZ, @z.idnmagazyn, 0),
					_Magazyn2 = IF(@z.MagTyp = @ht.mtRZ, 0, @z.magazynwys)
				;	
			END IF;
		ELSEIF @z.rodzaj IN (@ht.CZMWE) THEN
			SET
				_Rodzaj = @ht.CMMMM,
				_Magazyn = @z.idnmagazyn,
				_Magazyn2 = @z.magazynwys
			;	
		ELSEIF @z.rodzaj IN (@ht.CZmDD, @ht.CZmIm) THEN
			SET
				_Rodzaj = IF(_Rodzaj IN (@ht.CZkFV, @ht.CPzPZ, @ht.CZkIm, @ht.CZTUE), _Rodzaj, @ht.CZkFV), 	--	fakturka zakup.
				_Magazyn = 0,
				_Magazyn2 = IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn)
			;	
		END IF;
	END IF;
	
	SET 
		_KontrGUID = @z.KontrGUID,
		_Waluta = IF(NOT _Rodzaj IN (@ht.CSpFE, @ht.CZkIm, @ht.CStUE, @ht.CZTUE), @z.Waluta, _Waluta)		-- !!!??????? C_Sprzedarz.pas linia 1258 
	;
	
	SET 
		@KontrGUID = _KontrGUID
	;	

	
	CALL opng_E_LetInsert('', _Key, _Rodzaj, _Rodzaj_typ, _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, _Param_A, _Param_B, _Param_C);

	SET @_Key = _Key;
	-- SET _Get_Last_Kurs_For_Waluta(_Waluta, 0);
	
	--	Ogólny Update z zamowienia
	UPDATE `opng_e` n, `zmng` z
	SET
		n.Rodzaj2 = IF(n.Rodzaj = @ht.CRzWZ, 1, n.Rodzaj2),
		n.AkwizytorGUID = z.AkwizytorGUID,
		n.ZlecenieGUID = z.ZlecenieGUID,
		n.sposobplatn = z.sposobplatn,
		n.spedycja = z.spedycja,
		n.info1 = z.info1,
		n.info2 = z.info2,
		n.info3 = z.info3,
		n.info4 = z.info4,
		n.info5 = z.info5,
		n.info6 = z.info6,
		n.RodzajDowodu = z.RodzajDowodu,	-- ?????
		n.transza_zamow = z.transza_zamow,	-- ?????
		n.uwagi = IF(@session.HT.IR.PrzepiszUwagiZZamowienia, z.uwagi, n.uwagi),
		n.Dotyczy = CONCAT(
			'Zam. nr: ', z.nrzamw,
			IF(z.nrzamwkontr != '', 
				CONCAT('Nr zam. odbiorcy: ', z.nrzamwkontr),
				''
			)	
		)	
		
	WHERE
		n.GUID = _Key
		AND
		z.GUID = _ZM_Key
	;	

	--	Gdy zam. jest perman. OO lub eksportowe to ustal dete jako pierwszy nastepny roboczy dzien
	IF (@z.rodzaj IN (@ht.CZmOO, @ht.CZmEx)) AND @z.zamwpermn THEN
		SET
			@z.terminrealizacji = DATE(@z.terminrealizacji)
		;	
		SET
			@z.PierwszyNastepnyRoboczy = _Get_Next_WorkDay(@z.terminrealizacji)
		;
		SET _DataWystaw = @z.PierwszyNastepnyRoboczy;
	ELSE
		--	Gdy CDG i MM-ka to dete jako termin realizacji
		IF (IFNULL(_DataWystaw, '') = '') OR ((_Rodzaj = @ht.CMMMM) AND (@session.globals.Owner = 'CDG')) THEN
			SET _DataWystaw = @z.terminrealizacji;
		END IF;	
		
	END IF;

	UPDATE `opng_e` n
	SET
		n.datawystaw = _DataWystaw,
		n.datasprzed = _DataWystaw,
		n.datawplywu = _DataWystaw
	WHERE
		n.GUID = _Key
	;	
	
	--	Przepisz wydzial i ustaw Guid zlecenia gdy RW lub PW
	IF (@z.rodzaj IN (@ht.CZmZP)) AND (_Rodzaj IN (@ht.CRzRW, @ht.CPzPW)) THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.Wydzial = z.Wydzial,
			n.ZlecenieGUID = IF(@session.HT.IR.PrzepiszGUIDZleceniaProd, z.GUID, n.ZlecenieGUID)
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;
	
	--	KatCol-e
	IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.katcol0 = z.katcol0,
			n.katcol1 = z.katcol1,
			n.katcol2 = z.katcol2,
			n.katcol3 = z.katcol3,
			n.katcol4 = z.katcol4
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;
	
	
	-- SELECT @IdnOper, @G;

	SET @G = '';
	CALL oppo_e_LetInsert('From.zmng', @G, _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
	
	CALL ng_vat_e_build_from_po('', 'OP', _Key, '', '');
	CALL opng_E_LetPost('', _Key, '', '');

-- LEAVE S_ZAM_Realizuj;
	
	CALL opng_E_LetApply('', _Key, '', '');
	
	CALL opng_E_LetEnd('', _Key, '', '');	
	
	UPDATE `zmng` n
	SET
		n.ilepoz = _VarInt((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID)),
		n.IlepozZreal = _VarInt((SELECT SUM(IFNULL(p.zrealizowano = p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID))
	WHERE
		n.GUID = _ZM_Key
	;	
	UPDATE `zmng` n
	SET
		n.Status = IF(n.ilepoz = n.IlepozZreal, 2, n.Status)
	WHERE
		n.GUID = _ZM_Key
	;	
	
	CALL opng_Numeracja_po_Apply('', _Key, '', '', '');
	
	-- SET @G = '';
/*	
	CALL oppo_e_Insert('IdnTowr', @G, @IdnOper, 'M580', 12, 2.5, '');
	CALL oppo_e_LetInsert('IdnTowr', @G, @IdnOper, 'M580', 12, 2.5, '', '', '', '');
	-- i jeszcze 'CUKIER'
	DESC `oppo_corr`;

		CALL ng_vat_e_build_from_po('', 'ZM', @IdnNg, '', '');
	CALL opng_E_LetPost('', @IdnOper, '', '');
	CALL opng_E_LetApply('', @IdnOper, '', '');
		CALL opng_E_LetCancel('', @IdnOper, '', '');
	CALL opng_E_LetEnd('', @IdnOper, '', '');
*/	
END$$

/* ************************************************************************************************************************************************************************
	Klonowanie zamówień 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `_ZAM_Kopiuj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ZAM_Kopiuj`(
	IN _MODE VARCHAR(250),
	IN _ZM_Key VARCHAR(38),		--	GUID zamowienia do kopiowania
	INOUT _Key VARCHAR(38),
	IN _Rodzaj INTEGER,			-- -1 to bez zmian	
	IN _Rodzaj_typ INTEGER,		-- -1 to bez zmian	
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,			-- -1 to bez zmian	
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,			-- -1 to bez zmian	
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
-- 	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _TerminRealizacji DATE,
	IN _CzyOferta BOOLEAN,			
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
	CALL _ZAM_Kopiuj('', @IdnGUID, @IdnOperRealiz, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
*/
S__ZAM_Kopiuj: BEGIN 

	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	END IF;
	SET @_Key = _Key;
	
	SET
		_Rodzaj = IFNULL(_Rodzaj, -1)
	;
	
	CALL Zmng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init
	
	CALL Zmng_E_init_set_from_another_doc('CLONE', _Key, _ZM_Key, '', '', '');	 -- kluczowe slowo 'CLONE'
	
	-- CALL Zmng_E_init_set('', _Key, @z.Rodzaj, @z.Rodzaj_typ, _MODE, '3', @z.KontrGUID, @z.idnmagazyn, @z.magazynwys, , @z.Tymczasowa, @z.Waluta, @z.OsobaGUID, @z.AreaGUID, _ZM_Key, 0, _Param_A, _Param_B, _Param_C);

	CALL Zmng_E_Run('before.run', _Key, '', '', '');
	CALL Zmng_E_Run('', _Key, '', '', '');
	/********************************************************************************************************************************************************
		U W A G A  TUTAJ po CALL Zmng_E_Run() mam `zmng_e` i `zmpo_e` mam już rekordy z klona z podmienionymi GUIDAmi IdnG i IDN = 0
	********************************************************************************************************************************************************/
	CALL Zmng_E_Run('after.run', _Key, '', '', '');
	
	SELECT
		z.rodzaj, z.rodzaj2, z.Rodzaj_typ, z.KontrGUID, z.OsobaGUID, z.AreaGUID, z.Waluta, z.idnmagazyn, z.magazynwys, z.zamwpermn, z.terminrealizacji
	FROM `zmng_e` z
	WHERE
		z.GUID = _Key
	INTO
		@z.rodzaj, @z.rodzaj2, @z.Rodzaj_typ, @z.KontrGUID, @z.OsobaGUID, @z.AreaGUID, @z.Waluta, @z.idnmagazyn, @z.magazynwys, @z.zamwpermn, @z.terminrealizacji
	;
	SET 
		@z.KontrGUID_Changed = ((IFNULL(_KontrGUID, '') != '') AND _KontrGUID != @z.KontrGUID),
		@z.idnmagazyn_Changed = (IFNULL(_Magazyn, 0) != @z.idnmagazyn),
		@z.WalutaGUID_Changed = (IFNULL(_Waluta, 0) != @z.Waluta)
	;
	
	UPDATE `zmng_e` n
	SET
		n.Rodzaj = IF(_Rodzaj = -1, IF(_CzyOferta, @ht.CZmOF, n.Rodzaj), _Rodzaj),
		n.Rodzaj_typ = IF(IFNULL(_Rodzaj_typ, -1) = -1, n.Rodzaj_typ, _Rodzaj_typ),
		n.idnmagazyn = IF(IFNULL(_Magazyn, -1) = -1, n.idnmagazyn, _KontrGUID),
		n.TerminRealizacji = IFNULL(_TerminRealizacji, n.TerminRealizacji),
		n.KontrGUID = IF(IFNULL(_KontrGUID, '') = '', n.KontrGUID, _KontrGUID),
		n.OsobaGUID = IF(IFNULL(_OsobaGUID, '') = '', n.OsobaGUID, _OsobaGUID),
		n.AreaGUID = IF(IFNULL(_AreaGUID, '') = '', n.AreaGUID, _AreaGUID),
		n.Waluta = IF(IFNULL(_Waluta, -1) = -1, n.Waluta, _Waluta),
		n.Tymczasowa = IF(_CzyOferta AND _Rodzaj = -1, 1, IFNULL(_Tymczasowa, 0)),
		n.Uwagi = IF(_CzyOferta AND _Rodzaj != -1, CONCAT('Dotyczy oferty nr:"', n.nrzamw, '"; ', n.Uwagi), n.Uwagi),
		n.nrzamwkontr = 
			IF(_Rodzaj = @ht.CZmZP,
				n.nrzamwkontr,
				''
			)	
	WHERE
		n.GUID = _Key
	;	


	
	IF NOT _CzyOferta THEN
		UPDATE `zmng_e` n
		SET
			n.Waluta = IF(IFNULL(_Waluta, -1) = -1, n.Waluta, _Waluta),
			n.Tymczasowa = IF(_CzyOferta AND _Rodzaj = -1, 1, IFNULL(_Tymczasowa, 0)),
			n.Uwagi = IF(_Rodzaj = -1 AND @session.HT.IR.Klonuj_uwagi_zamowien, n.Uwagi, ''),
			n.nrzamw = 
				IF(_Rodzaj = @ht.CZmZP,
					n.nrzamwkontr,
					CONCAT(@session.HT.IR.Prefiks_klonowanego_num_zam, n.nrzamw)
				)
			/*
		{$IFDEF DOMAX_CZECHY}
			n.nrzamwkontr = n.kontrsymbol
		{$ENDIF}
		{$IFDEF DOMAX_SLOWACJA}
			n.nrzamwkontr = n.kontrsymbol
		{$ENDIF}
			*/						
						
			
		WHERE
			n.GUID = _Key
		;	
	END IF;
	
	IF @z.KontrGUID_Changed THEN
		UPDATE `zmpo_e` p
		SET
			p.KontrGUID = @z.KontrGUID
		WHERE
			p.IdnNG = _Key
		;
	--	a ceny?????????????????????	
	END IF;
	
	IF @z.WalutaGUID_Changed THEN
		SET @Cos = 'x';
		/*
		w Delphi!!! gdy zmieniamy walute
      { Gdy chcemy innej waluty to przelicz pozycje (kurs)}
      if Self.CDS.FieldByName('waluta').AsInteger <> aWaluta then
        ChangeWaluteInPo(aWaluta, aKurs);
		*/
	END IF;
	
	SET 
		@KontrGUID = @z.KontrGUID
	;	

	-- SET _Get_Last_Kurs_For_Waluta(_Waluta, 0);
	
	/*
	--	Gdy zam. jest perman. OO lub eksportowe to ustal dete jako pierwszy nastepny roboczy dzien
	IF (@z.rodzaj IN (@ht.CZmOO, @ht.CZmEx)) AND @z.zamwpermn THEN
		SET
			@z.terminrealizacji = DATE(@z.terminrealizacji)
		;	
		SET
			@z.PierwszyNastepnyRoboczy = _Get_Next_WorkDay(@z.terminrealizacji)
		;
		SET _DataWystaw = @z.PierwszyNastepnyRoboczy;
	ELSE
		--	Gdy CDG i MM-ka to dete jako termin realizacji
		IF (IFNULL(_DataWystaw, '') = '') OR ((_Rodzaj = @ht.CMMMM) AND (@session.globals.Owner = 'CDG')) THEN
			SET _DataWystaw = @z.terminrealizacji;
		END IF;	
		
	END IF;
	*/
	
/*
   if aNewRodzaj = CZmZP then
   begin
      Self.CDS.FieldByName('datawystaw').AsDateTime := aDSNg.FieldByName('datawystaw').AsDateTime;
      Self.CDS.FieldByName('datawplywu').AsDateTime := aDSNg.FieldByName('datawplywu').AsDateTime;
   end;
*/	
	IF _Rodzaj != @ht.CZmZP THEN
		UPDATE `zmng_e` n
		SET
			n.datawystaw = CURRENT_DATE(),
			n.datawplywu = CURRENT_DATE()
		WHERE
			n.GUID = _Key
		;	
	END IF;
	
	-- SELECT @IdnOper, @G;

	SET @G = '';
	
	
	CALL zmng_E_Let('Post', _Key, '', '');
	
-- LEAVE S__ZAM_Kopiuj;
	
	CALL zmng_E_Let('ApplyAndClear', _Key, '', '1');
	
	
END$$


/* ************************************************************************************************************************************************************************
	Narzędzia 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `rozrach_rodzaj_calc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `rozrach_rodzaj_calc`(
	IN _Rodzaj INTEGER,
	IN _gruparozrach_wymus INTEGER,
	IN _Brutto DECIMAL(16,4)
)
BEGIN 
	CALL ht_rodzaj_calc(_Rodzaj);
	IF @ht.doc.IsRozrachunek THEN
		SET
			@ht.doc.RzTypRozrach = @RzTypRozrach :=
				IF(_gruparozrach_wymus != 0,
					_gruparozrach_wymus,
					IF(@ht.doc.FnTyp = @ht.fnKor AND _Brutto > 0,
						IF(@ht.doc.RzTyp = @ht.RzSNL,
							@ht.Rz_NL,
							IF(@ht.doc.RzTyp = @ht.RzSZB,
								@ht.Rz_ZB,
								@ht.doc.Rztyp
							)
						),
						IF(@ht.doc.fnTyp = @ht.fnNrm AND _Brutto < 0,
							IF(@ht.doc.RzTyp = @ht.Rz_ZB,
								@ht.RzSZB,
								IF(@ht.doc.RzTyp = @ht.Rz_NL,
									@ht.RzSNL,
									@ht.doc.Rztyp
								)	
							),
							@ht.doc.Rztyp
						)
					)	
				),
			@ht.doc.IsKorektaNaPlus = @IsKorektaNaPlus := (@ht.doc.IsKorekta AND _Brutto > 0),
			@ht.doc.SignRozliczone = 
				IF(@ht.doc.Rztyp IN (@ht.Rz_ZB, @ht.Rz_SN, @ht.RzSSZ),
					-1,
					IF(@ht.doc.Rztyp IN (@ht.RzSZB) AND @IsKorektaNaPlus,
						-1,
						IF(@ht.doc.Rztyp IN (@ht.RzSNL) AND NOT @IsKorektaNaPlus,
							-1,
							1
						)
					)
				)
		;
		--	@ht.doc.StronaWNForRozrach
		IF @ht.doc.Rodzaj IN (@ht.CBNBO, @ht.CRKBO) THEN
			SET @ht.doc.StronaWNForRozrach = @ht.CSTR_MA;
		ELSEIF @ht.doc.Rodzaj IN (@ht.CBNBM) THEN
			SET @ht.doc.StronaWNForRozrach = @ht.CSTR_WN;
		ELSEIF @ht.doc.Rodzaj IN (@ht.CWEDW, @ht.CWESM) THEN
			IF @NEW.gruparozrach IN (@ht.Rz_NL, @ht.RzSNL, @ht.Rz_Sz, @ht.RzSSZ) THEN
				SET @ht.doc.StronaWNForRozrach = @ht.CSTR_WN;
			ELSE
				SET @ht.doc.StronaWNForRozrach = @ht.CSTR_MA;
			END IF;
		ELSE	
			IF @ht.doc.RzTyp IN (@ht.Rz_NL, @ht.RzSNL, @ht.Rz_Sz, @ht.RzSSZ) THEN
				SET @ht.doc.StronaWNForRozrach = @ht.CSTR_WN;
			ELSE
				SET @ht.doc.StronaWNForRozrach = @ht.CSTR_MA;
			END IF;
		END IF;
		
	END IF;
END$$

DROP FUNCTION IF EXISTS `_GetKwotaWalForRozrach`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_GetKwotaWalForRozrach`(
	_Rodzaj INTEGER,
	_gruparozrach_wymus INTEGER,
	_Netto DECIMAL(16,4),
	_NettoWal DECIMAL(16,4),
	_Brutto DECIMAL(16,4),
	_BruttoWal DECIMAL(16,4),
	_NettoDoRozrach BOOLEAN,
	_Zaplacono DECIMAL(16,4),
	_Kurs DECIMAL(16,4),
	_Kurs_rozliczen DECIMAL(16,4),
	_Param_A VARCHAR(255),
	_Param_B VARCHAR(255),
	_Param_D VARCHAR(255),
	_Param_C VARCHAR(255)
	) RETURNS DECIMAL(16,4)
    NO SQL
    DETERMINISTIC
/*
SELECT BENCHMARK(100000, (SELECT _Rnd(-@V, 4)));	
*/	
BEGIN
	DECLARE _CKwotaWal DECIMAL(16,4) DEFAULT 0;
	
	CALL rozrach_rodzaj_calc(_Rodzaj, _gruparozrach_wymus, _Brutto);
	/*
	GetKwotaWalForRozrach do pola _CKwotaWal
	TODO:
	Kwestia do generalnego przemyslenia - dodanie pola bruttoWal i vatWal
	na razie NettoWal
	*/
	IF (_Rodzaj IN (@ht.CBNBO, @ht.CRKBO, @ht.CBNBM)) OR (@ht.doc.RzTyp IN (@ht.RZ_SN, @ht.RZ_SZ)) THEN
		SET _CKwotaWal = _Rnd2(ABS(_Zaplacono));
	ELSE
		IF _NettoDoRozrach THEN
			SET _CKwotaWal = _NettoWal;
		ELSE
			SET _CKwotaWal = _BruttoWal;
		END IF;
		
		IF (_Kurs_rozliczen != 0)	THEN
			SET _CKwotaWal = _Rnd2(_CKwotaWal*_Kurs/_kurs_rozliczen);
		END IF;
	END IF;		--	 IF Rodzaj
	
	
	RETURN _CKwotaWal;
END$$

DROP FUNCTION IF EXISTS `_GetCPozostalo`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_GetCPozostalo`(
	_CKwota DECIMAL(16,4),
	_CWN INTEGER,
 	_CRozliczone DECIMAL(16,4)
	) RETURNS DECIMAL(16,4)
    NO SQL
    DETERMINISTIC
/*
*/	
BEGIN
	DECLARE aCKwota DECIMAL(16,4) DEFAULT 0;
	SET aCKwota = IF(_CWN = @ht.CSTR_MA, -_CKwota, _CKwota);
	RETURN _Rnd2(aCKwota - _CRozliczone);
END$$

DROP FUNCTION IF EXISTS `_GetCPozostaloWal`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `_GetCPozostaloWal`(
	_CKwotaWal DECIMAL(16,4),
	_CWN INTEGER,
 	_CRozliczoneWal DECIMAL(16,4)
	) RETURNS DECIMAL(16,4)
    NO SQL
    DETERMINISTIC
/*
*/	
BEGIN
	DECLARE aCKwota DECIMAL(16,4) DEFAULT 0;
	SET aCKwota = IF(_CWN = @ht.CSTR_MA, -_CKwotaWal, _CKwotaWal);
	RETURN _Rnd2(aCKwota - _CRozliczoneWal);
END$$


DROP PROCEDURE IF EXISTS `_Rozrach_Nalicz_Pola`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_Rozrach_Nalicz_Pola`(
	IN _Rodzaj INTEGER,
	IN _gruparozrach_wymus INTEGER,
	IN _Netto DECIMAL(16,4),
	IN _NettoWal DECIMAL(16,4),
	IN _Brutto DECIMAL(16,4),
	IN _BruttoWal DECIMAL(16,4),
	IN _NettoDoRozrach BOOLEAN,
	IN _Zaplacono DECIMAL(16,4),
	IN _Kurs DECIMAL(16,4),
	IN _Kurs_rozliczen DECIMAL(16,4),
	INOUT _CWN INTEGER,
	INOUT _CKwota DECIMAL(16,4),
	INOUT _CKwotaWal DECIMAL(16,4),
	INOUT _CRozliczone DECIMAL(16,4),
	INOUT _CRozliczoneWal DECIMAL(16,4),
	INOUT _nierozliczony INTEGER,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_D VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
BEGIN 
	CALL rozrach_rodzaj_calc(_Rodzaj, _gruparozrach_wymus, _Brutto);
	SET
		_CWN := @ht.doc.StronaWNForRozrach
	;	
	/*
	GetKwotaWalForRozrach do pola _CKwotaWal
	TODO:
	Kwestia do generalnego przemyslenia - dodanie pola bruttoWal i vatWal
	na razie NettoWal
	*/
	SET _CKwotaWal = _GetKwotaWalForRozrach(_Rodzaj, _gruparozrach_wymus, _Netto, _NettoWal, _Brutto, _BruttoWal, _NettoDoRozrach, _Zaplacono, _Kurs, _Kurs_rozliczen, '', '', '', '');
	
	
	--	CKwota
	
    -- nie wykonujemy przeliczenia na PLN, gdy kurs został ustawiony na 0
	IF (_Kurs_rozliczen != 0)	THEN
		SET _CKwota = _Rnd2(_CKwotaWal*_kurs_rozliczen);
	END IF;

	--	//Slon CRM:9745
	IF _Rodzaj IN (@ht.CRoWn, @ht.CRoMa, @ht.CRoNO, @ht.CRoSW, @ht.CRoSM, @ht.CRoSN, @ht.CRoSZ, @ht.CROZN, @ht.CROZZ) AND _CKwota = 0 THEN
	SET
		_CRozliczone = 0,
		_CRozliczoneWal = 0
	;
	END IF;
		
	/*
	Pole nierozliczony znaczenie:
	0-rozliczony, 1 czesciowo, 2 nierozliczony
	czyli odwrotnie niż w dotychczasowym OnCalc
	CNierozliczony_0 =   0;  //rozliczony
	CNierozliczony_50 =  1;  //czesciowo
	CNierozliczony_100 = 2;  //nierozliczony
	*/
	--	gdy kurs został ustawiony na 0 i Ckwotawal=0 wtedy uznajemy, że zapis jest z założenia rozliczony
	IF (_Kurs_rozliczen = 0) AND (_CKwotaWal = 0) THEN
		SET _CRozliczone = IF(_CWN = 1, _CKwota, -_CKwota);
		
	END IF;

	SET	@aCPozostalo := _GetCPozostalo(_CKwota,	_CWN, _CRozliczone);
	IF ABS(@aCPozostalo) < 0.001 THEN
		SET _nierozliczony = @ht.CNierozliczony_0;
	ELSE	
		SET _nierozliczony = IF(_CRozliczone = 0, @ht.CNierozliczony_100, @ht.CNierozliczony_50);
	END IF;
	set @_nierozliczony = _nierozliczony;
	set @_CRozliczone = _CRozliczone;
END$$

DROP PROCEDURE IF EXISTS `rozrach_nalicz_pola`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `rozrach_nalicz_pola`(
	IN _Rodzaj INTEGER,
	IN _gruparozrach_wymus INTEGER,
	IN _Netto DECIMAL(16,4),
	IN _NettoWal DECIMAL(16,4),
	IN _Brutto DECIMAL(16,4),
	IN _Zaplacono DECIMAL(16,4),
	IN _Kurs DECIMAL(16,4),
	IN _Kurs_rozliczen DECIMAL(16,4),
	INOUT _CWN INTEGER,
	INOUT _CKwota DECIMAL(16,4),
	INOUT _CKwotaWal DECIMAL(16,4),
	INOUT _CRozliczone DECIMAL(16,4),
	INOUT _CRozliczoneWal DECIMAL(16,4),
	INOUT _nierozliczony INTEGER,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_D VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
BEGIN 
	CALL rozrach_rodzaj_calc(_Rodzaj, _gruparozrach_wymus, _Brutto);
	/*
	GetKwotaWalForRozrach do pola _CKwotaWal
	TODO:
	Kwestia do generalnego przemyslenia - dodanie pola bruttoWal i vatWal
	na razie NettoWal
	*/
	IF _Rodzaj IN (@ht.CBNBO, @ht.CRKBO) THEN
		SET _CKwotaWal = _Rnd2(Abs(_Zaplacono));
	ELSEIF _Rodzaj IN (@ht.CBNBM) THEN
		SET _CKwotaWal = _Rnd2(Abs(_Zaplacono));
	ELSEIF @ht.doc.RzTyp IN (@ht.RZ_SN, @ht.RZ_SZ) THEN	--	TODO: przejsc na edycję pola CKwotaWal dla RO**, KS i BN
		SET _CKwotaWal = _Rnd2(Abs(_Zaplacono));
	ELSEIF (_Kurs != 1) OR (_Kurs_rozliczen != 1)	THEN	--	w chwili obecnej nie obslugujemy sytuacji, gdy jest sprzedaz eksportowa z VAT<>0!!!! (rzadkie ale może być
		SET _CKwotaWal = _NettoWal;
	ELSE
		SET _CKwotaWal = _Brutto;
	END IF;
	
	SET
		_CWN := @ht.doc.StronaWNForRozrach
	;	
	SET
	--	nie wykonujemy przeliczenia na PLN, gdy kurs został ustawiony na 0
		_CKwota = 
			IF(_Kurs_rozliczen != 0,
				_CKwotaWal * _Kurs_rozliczen,
				_CKwota
			)	
			
	;
	--	CKwota
	CASE 
	WHEN _Rodzaj IN (@ht.CZkIm, @ht.CZTUE, @ht.CZTKU) THEN
		IF @session.HT.IR.Zakupy_import_Netto_do_rozrach THEN
			SET _CKwota = _Netto;
		END IF;
	WHEN _Rodzaj IN (@ht.CSTUE, @ht.CSTKE, @ht.CSTKU, @ht.CSpFE, @ht.CSpFV, @ht.CSpRU, @ht.CSpKF, @ht.CSpKR) THEN
		IF @session.HT.IR.Sprzedaz_export_Brutto_do_rozrach THEN
			SET _CKwota = _Brutto;
		END IF;
	WHEN _Rodzaj = @ht.CZkFV THEN
		IF @session.HT.IR.Zakup_krajowy_walucie_Brutto_do_rozrach AND (_Kurs_rozliczen != 0) THEN
			SET _CKwota = _Brutto;
		END IF;
	ELSE
		SET _CKwota = _CKwota;
	
	END CASE;
	
	--	//Slon CRM:9745
	IF _Rodzaj IN (@ht.CRoWn, @ht.CRoMa, @ht.CRoNO, @ht.CRoSW, @ht.CRoSM, @ht.CRoSN, @ht.CRoSZ, @ht.CROZN, @ht.CROZZ) AND _CKwota = 0 THEN
	SET
		_CRozliczone = 0,
		_CRozliczoneWal = 0
	;
	END IF;
		
	/*
	Pole nierozliczony znaczenie:
	0-rozliczony, 1 czesciowo, 2 nierozliczony
	czyli odwrotnie niż w dotychczasowym OnCalc
	CNierozliczony_0 =   0;  //rozliczony
	CNierozliczony_50 =  1;  //czesciowo
	CNierozliczony_100 = 2;  //nierozliczony
	*/
	--	gdy kurs został ustawiony na 0 i Ckwotawal=0 wtedy uznajemy, że zapis jest z założenia rozliczony
	IF (_Kurs_rozliczen = 0) AND (_CKwotaWal = 0) THEN
		SET _CRozliczone = IF(_CWN = 1, _CKwota, -_CKwota);
	END IF;
/*
	SET	@aCPozostalo := _Rnd2(GetCPozostalo(aDataSet));
*/
	IF ABS(@aCPozostalo) < 0.001 THEN
		SET _nierozliczony = @ht.CNierozliczony_0;
	ELSE	
		SET _nierozliczony = IF(_CRozliczone= 0, @ht.CNierozliczony_100, @ht.CNierozliczony_50);
	END IF;
	
END$$

/* ************************************************************************************************************************************************************************
	inicjalne 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `rozrach_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `rozrach_init`(
	IN _MODE VARCHAR(250)
)
BEGIN 
	SET @ht.rozrach_init = TRUE;

END$$

/* ************************************************************************************************************************************************************************
	Edycja cen
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `_pozycje_cenyrabat_xxpo_e_one_rec`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_pozycje_cenyrabat_xxpo_e_one_rec`(
	IN _MODE VARCHAR(150),
	IN _GUID VARCHAR(38),	--	GUID pozycji
	IN _for_Tagged BOOLEAN,	--	rob tylko dla zaznaczonych
	IN _rabat_fixed BOOLEAN,	--	nie ruszaj zwrotnie np. rabatu
	IN _Param_A VARCHAR(50),	--	
	IN _Param_B VARCHAR(50)	--	
)
/*
	CALL _pozycje_cenyrabat_xxpo_e_one_rec('ZM', @IdnOper, FALSE, FALSE, '', '');	
*/
S__pozycje_cenyrabat_xxpo_e_one_rec: BEGIN

	DECLARE _SQLText TEXT;

	IF _MODE != '' THEN
		CALL cenyrabat_edit_info('INIT', '', '', '', '', '', '', '');		
		TRUNCATE `t_cenyrabat_edit_info`;
		SET _SQLText = 
		"
		INSERT INTO `t_cenyrabat_edit_info`
			(KontrGUID, Rodzaj, CzyCenaSprzedazy, CzyRabatyHierarchiczne, DataSprzed, Kontrah_KlasaRabatowa,
			IdnTowr, Kontrah_KlasaCenowa, Kontrah_Rabat, Waluta, AkwizytorGUID,
			Towar_TreeNode, Towar_KalasaRabatowa, Towar_CenaEwid, Towar_Cenazkpnet, Towar_nie_realizuje_zamow)
			SELECT
				n.KontrGUID,
				@Rodzaj := n.Rodzaj,
				0, --
				@session.HT.IR.RabatyHierarchiczne,
				n.#DataSprzed#,	--	zm.terminrealizacji
				IFNULL(k.KlasaRabatowa, 0),
				
				p.IdnTowr,
				IF(p.IdnCennik != 0, p.IdnCennik, n.#kontrklasacenowa#) AS Kontrah_KlasaCenowa,		-- lub klasacenowa
				#kontrrabat#,	-- zm.rabat
				n.Waluta,
				n.AkwizytorGUID,
				
				t.TreeNode,
				t.klasarabatowa,
				t.cenaewid,
				t.cenazkpnet,
				t.nie_realizuje_zamow
			FROM `#xxpo_e#` p
			INNER JOIN `#xxng_e#` n ON n.GUID = p.#IdnOper#
			INNER JOIN `kontrah` k ON k.GUID = n.KontrGUID
			INNER JOIN `TowrNg` t ON t.GUID = p.IdnTowr
			WHERE
				p.GUID = '#_GUID#'
				AND
				#TAG#
		;
		"
		;
		SET _SQLText = REPLACE(_SQLText, '#kontrklasacenowa#', IF(_MODE != 'ZM', 'kontrklasacenowa', 'klasacenowa'));
		SET _SQLText = REPLACE(_SQLText, '#kontrrabat#', IF(_MODE != 'ZM', 'n.kontrrabat', 'GREATEST(IFNULL(n.rabat, 0), k.Rabat)'));
		SET _SQLText = REPLACE(_SQLText, '#DataSprzed#', IF(_MODE != 'ZM', 'DataSprzed', 'terminrealizacji'));
		SET _SQLText = REPLACE(_SQLText, '#xxng_e#', IF(_MODE != 'ZM', 'opng_e', 'zmng_e'));
		SET _SQLText = REPLACE(_SQLText, '#xxpo_e#', IF(_MODE != 'ZM', 'oppo_e', 'zmpo_e'));
		SET _SQLText = REPLACE(_SQLText, '#_GUID#', _GUID);
		SET _SQLText = REPLACE(_SQLText, '#IdnOper#', IF(_MODE != 'ZM', 'IdnOper', 'IdnNG'));
		SET _SQLText = REPLACE(_SQLText, '#TAG#', IF(_for_Tagged, ' p.Tag = 1 ', ' TRUE '));
		SET @_SQLText = _SQLText;
		SET @_SQLText1 = _SQLText;
		SET @_SQLText_CenyRabaty__Init = _SQLText;
		CALL _ExecuteCmd(_SQLText, @Error);
		
		SET @_CzyPrzypisywacCenyEwid = 
			NOT @CzyCenaSprzedazy AND (
				(@session.HT.IR.PrzypisywacCenyEwidDoPW AND @Rodzaj IN (13, 15)) OR	--	PW i -PW
				(@session.HT.IR.PrzypisywacCenyEwidDoRW AND @Rodzaj IN (11, 14)) OR	--	RW i -RW
				(@session.HT.IR.PrzypisywacCenyEwidDoPW AND @Rodzaj IN (39, 67, 68)) 	--	Inwentaryzacja i inw. nadw, niedob. UWAGA czy tu nie powinno byc @session.HT.IR.PrzypisywacCenyEwidDoINWENT
			)
		;
		CALL ht_rodzaj_calc(@Rodzaj);
		IF @ht.doc.TwTyp = @ht.TwZm THEN
			SET @FCzyCenaSprzedazy := (@ht.doc.Rodzaj in (@ht.CZmOO, @ht.CZmEx, @ht.CZmZP, @ht.CZmOF));
		ELSEIF @ht.doc.Rodzaj IN (@ht.CRzRW, @ht.CRzKR, @ht.CPzKW) THEN
			SET @FCzyCenaSprzedazy := Kontrah_KlasaCenowa <> 0;
		ELSE	
			SET @FCzyCenaSprzedazy := (@ht.doc.TwTyp <> @ht.TwPz) or (@ht.doc.Rodzaj = @ht.CMGZW);
		END IF;	

		
		SET @Kurs = 1;
		SELECT 
			k.kurs INTO @Kurs
		FROM `t_cenyrabat_edit_info` tci
		LEFT JOIN `kursy` k ON k.idnwaluty = tci.Waluta AND k.idn_tab_kurs = tci.Idn_tab_kurs
		ORDER BY data DESC 
		LIMIT 1
		;
		UPDATE `t_cenyrabat_edit_info` tci
		SET
			tci.Last_Kurs_For_Waluta = IFNULL(@Kurs, 1),
			CzyCenaSprzedazy = @FCzyCenaSprzedazy
		;	
		
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_ALL', '', '', '', '', '', '', '1');		-- bez selecta
	--	tezraz zrób update oppo_e
		
		SET _SQLText = 
		"
		UPDATE `#xxpo_e#` p, `t_cenyrabat_edit_result_k_x_t` t
		SET
			p.Rodzaj_Przeliczenia = 
				IF(NOT t.czy_ceny_brt,
					IF(p.Rodzaj_Przeliczenia != @ht._BN_CN_WN,
						@ht._NB_CN_WN,
						p.Rodzaj_Przeliczenia
					),	
					@ht._BN_CB_WN
				),
					
			p.CenaNet = 
				IF(NOT t.czy_ceny_brt,
					t.Cena,
					p.CenaNet
				),	
			p.CenaBrt = 
				IF(NOT t.czy_ceny_brt,
					p.CenaBrt,
					t.Cena
				),	
			p.Rabat = #rabat#, 
			p.idncennik = 
				IF(t.RabatType != 8,	 -- nie jest to pozycja z oferty gdy RabatType <> 8 czyli <> CRT_OFERTA
					t.KlasaCenowa,
					p.idncennik
				),	
			p.wartnet = 
				IF((t.Towar_nie_realizuje_zamow <> 0) AND (@session.globals.Owner = 'PLISZKA'),
					0,
					p.wartnet
				)	
			
		WHERE
			p.GUID = '#_GUID#'
			AND
			#TAG#
		;
		"
		;
		SET _SQLText = REPLACE(_SQLText, '#xxpo_e#', IF(_MODE != 'ZM', 'oppo_e', 'zmpo_e'));
		SET _SQLText = REPLACE(_SQLText, '#_GUID#', _GUID);
		SET _SQLText = REPLACE(_SQLText, '#IdnOper#', IF(_MODE != 'ZM', 'IdnOper', 'IdnNG'));
		SET _SQLText = REPLACE(_SQLText, '#TAG#', IF(_for_Tagged, ' p.Tag = 1 ', ' TRUE '));
		SET _SQLText = REPLACE(_SQLText, '#rabat#', IF(_rabat_fixed, 'p.Rabat', 't.Rabat'));
		SET @_SQLText = _SQLText;
		SET @_SQLText2 = _SQLText;
		SET @_SQLText_CenyRabaty__Update = _SQLText;
		-- LEAVE S__pozycje_cenyrabat_xxpo_e_one_rec;
		CALL _ExecuteCmd(_SQLText, @Error);
		
		-- CALL cenyrabat_edit_info('CLEAR', '', '', '', '', '', '', '');		
		-- DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_result_k_x_t`;
	END IF;		--	_MODE = ''
END$$

DROP PROCEDURE IF EXISTS `_pozycje_cenyrabat_oppo_e`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_pozycje_cenyrabat_oppo_e`(
	IN _MODE VARCHAR(150),
	IN _GUID VARCHAR(38),	--	GUID pozycji
	IN _for_Tagged BOOLEAN,	--	rob tylko dla zaznaczonych
	IN _rabat_fixed BOOLEAN,	--	nie ruszaj zwrotnie np. rabatu
	IN _Param_A VARCHAR(50),	--	
	IN _Param_B VARCHAR(50)	--	
)
/*
	CALL _pozycje_cenyrabat_oppo_e('', _GUID, FALSE, FALSE, '', '');	--	dla pozycji _GUID
	CALL _pozycje_cenyrabat_oppo_e('dla.IdnOper', @IdnOper, FALSE, FALSE, '', '');	--	dla wszystkich pozycji o IdnOper = _IdnOper
	CALL _pozycje_cenyrabat_oppo_e('dla.IdnOper', @IdnOper, TRUE, FALSE, '', '');	--	dla wszystkich pozycji o IdnOper = _IdnOper ALE zaznaczonych
*/
S_pozycje_cenyrabat_oppo_e: BEGIN

	IF _MODE = 'dla.IdnOper' THEN
	
		BEGIN
			DECLARE _oppoGUID VARCHAR(38);
			DECLARE done BOOL DEFAULT FALSE;
			DECLARE c_proc CURSOR FOR
				SELECT 
					p.GUID
				FROM `oppo_e` p
				WHERE
					p.IdnOper = _GUID
					AND 
					IF(_Param_B != '', p.Tag = 1, TRUE)	-- dla zaznaczonych
			;
			DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
			OPEN c_proc;
			loop1: LOOP
				FETCH c_proc INTO
					_oppoGUID
				;
				IF done THEN
					LEAVE loop1;
				ELSE
				--	kolejny rekord
					CALL _pozycje_cenyrabat_oppo_e('', _oppoGUID, _for_Tagged, _rabat_fixed, '', '');	
				END IF;
			END LOOP;
			CLOSE c_proc;
		END;
		
		LEAVE S_pozycje_cenyrabat_oppo_e;
	END IF;		--	_MODE = 'dla.IdnOper'
		
	IF _MODE = '' THEN
		CALL _pozycje_cenyrabat_xxpo_e_one_rec('OP', _GUID, _for_Tagged, _rabat_fixed, '', '');	
	END IF;		--	_MODE = ''
END$$

DROP PROCEDURE IF EXISTS `_pozycje_cenyrabat_zmpo_e`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_pozycje_cenyrabat_zmpo_e`(
	IN _MODE VARCHAR(150),
	IN _GUID VARCHAR(38),	--	GUID pozycji
	IN _for_Tagged BOOLEAN,	--	rob tylko dla zaznaczonych
	IN _rabat_fixed BOOLEAN,	--	nie ruszaj zwrotnie np. rabatu
	IN _Param_A VARCHAR(50),	--	
	IN _Param_B VARCHAR(50)	--	
)
/*
	CALL _pozycje_cenyrabat_zmpo_e('', _GUID, FALSE, FALSE, '', '');	--	dla pozycji _GUID
	CALL _pozycje_cenyrabat_zmpo_e('dla.IdnOper', @IdnOper, FALSE, FALSE, '', '');	--	dla wszystkich pozycji o IdnOper = _IdnOper
	CALL _pozycje_cenyrabat_zmpo_e('dla.IdnOper', @IdnOper, TRUE, FALSE, '', '');	--	dla wszystkich pozycji o IdnOper = _IdnOper ALE zaznaczonych
*/
S_pozycje_cenyrabat_zmpo_e: BEGIN

	IF _MODE = 'dla.IdnOper' THEN
	
		BEGIN
			DECLARE _zmpoGUID VARCHAR(38);
			DECLARE done BOOL DEFAULT FALSE;
			DECLARE c_proc CURSOR FOR
				SELECT 
					p.GUID
				FROM `zmpo_e` p
				WHERE
					p.IdnNg = _GUID
					AND 
					IF(_Param_B != '', p.Tag = 1, TRUE)	-- dla zaznaczonych
			;
			DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
			OPEN c_proc;
			loop1: LOOP
				FETCH c_proc INTO
					_zmpoGUID
				;
				IF done THEN
					LEAVE loop1;
				ELSE
				--	kolejny rekord
					CALL _pozycje_cenyrabat_zmpo_e('', _zmpoGUID, _for_Tagged, _rabat_fixed, '', '');	
				END IF;
			END LOOP;
			CLOSE c_proc;
		END;
		
		LEAVE S_pozycje_cenyrabat_zmpo_e;
	END IF;		--	_MODE = 'dla.IdnOper'
		
	IF _MODE = '' THEN
		CALL _pozycje_cenyrabat_xxpo_e_one_rec('ZM', _GUID, _for_Tagged, _rabat_fixed, '', '');	
	END IF;		--	_MODE = ''
END$$

-- !!! JUŻ nie uzywana w zasadzie
DROP PROCEDURE IF EXISTS `pozycje_cenyrabat_oppo_e`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pozycje_cenyrabat_oppo_e`(
	IN _MODE VARCHAR(150),
	IN _GUID VARCHAR(38),	--	GUID pozycji
	IN _IdnTowr VARCHAR(38),	--	nie konieczny
	IN _Param_A VARCHAR(50),	--	nie ruszaj zwrotnie np. rabatu
	IN _Param_B VARCHAR(50)	--	rob tylko dla zaznaczonych
)
/*
	CALL pozycje_cenyrabat_oppo_e('', _GUID, '', '', '');	--	dla pozycji _GUID
	CALL pozycje_cenyrabat_oppo_e('dla.IdnOper', _IdnOper, '', '', '');	--	dla wszystkich pozycji o IdnOper = _IdnOper
	CALL pozycje_cenyrabat_oppo_e('dla.IdnOper', _IdnOper, '', '', '1');	--	dla wszystkich pozycji o IdnOper = _IdnOper ALE zaznaczonych
*/
S_pozycje_cenyrabat_oppo_e: BEGIN

		/*
		_Param_A != '' = nie ruszaj zwrotnie np. rabatu
		_Param_B != '' = rob tylko dla zaznaczonych
		SET	@CzyCenaSprzedazy = _VarInt_NotNull(_Param_C);
		SET @Rodzaj = _VarInt_NotNull(_Param_B);
		SET _DataSprzed = DATE(_Param_E);
		SET _DataSprzed = IFNULL(_DataSprzed, current_date);
		IF _DataSprzed < '1900-01-01' THEN
			SET _DataSprzed = current_date;
		END IF;
		*/
		/*
		select max(datasprzed) as datasprzed, (katcol0 = 2) As IsKlatkowiec, kontrsymbol from opng where kontrguid = @kontrguid and rodzaj in (0,1,2) and datasprzed < current_date;
		klatkowiec to 
		katcol0 = 2 w kontrah
		*/
		
	--	standardowe przeliczenie cena net.->rabat->wart.wal.
		DECLARE _NB_CN_WN  INTEGER DEFAULT 0;	-- CRodzaj_Przeliczenia_CenaNet_NettoWal
	--	z wart.wal->(rabat nie ruszany)->cena net.	
		DECLARE _NB_WN_CN  INTEGER DEFAULT 1;	-- CRodzaj_Przeliczenia_NettoWal_CenaNet
	--	z wart.wal->rabat	
		DECLARE _NB_WN_R   INTEGER DEFAULT 2;	-- CRodzaj_Przeliczenia_NettoWal_Rabat
	--	fiskalne z brutto->netto  (fiskalne)	z ceny netto -> wrt brutto, -> ceny brutto (zaokr), -> i dalej jak dla _BN_CB_WN
		DECLARE _BN_CN_WN  INTEGER DEFAULT 3;	-- CRodzaj_Przeliczenia_Brutto_Netto
	--	z wart brutto->netto							
		DECLARE _BN_WB_WN  INTEGER DEFAULT 4;	-- CRodzaj_Przeliczenia_Brutto_Netto2
	--	z ceny brutto->netto	
		DECLARE _BN_CB_WN  INTEGER DEFAULT 5;	-- CRodzaj_Przeliczenia_CenaBrutto_Netto
	--	z wart.wal->(rabat nie ruszany)->cena net. wart vat edytowana	
		DECLARE _BN_WN_CNve  INTEGER DEFAULT 6;	-- CRodzaj_Przeliczenia_NettoWal_CenaNet_VatEdyt

		DECLARE _for_oppo  BOOLEAN DEFAULT TRUE;	-- domyslnie ceny dla oppo
		
	IF _MODE = 'dla.IdnOper' THEN
	
		BEGIN
			DECLARE _oppoGUID VARCHAR(38);
			DECLARE done BOOL DEFAULT FALSE;
			DECLARE c_proc CURSOR FOR
				SELECT 
					p.GUID
				FROM `oppo_e` p
				WHERE
					p.IdnOper = _GUID
					AND 
					IF(_Param_B != '', p.Tag = 1, TRUE)	-- dla zaznaczonych
			;
			DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
			OPEN c_proc;
			loop1: LOOP
				FETCH c_proc INTO
					_oppoGUID
				;
				IF done THEN
					LEAVE loop1;
				ELSE
				--	kolejny rekord
					CALL pozycje_cenyrabat_oppo_e('', _oppoGUID, '', _Param_A, _Param_B);		
				END IF;
			END LOOP;
			CLOSE c_proc;
		END;
		
		LEAVE S_pozycje_cenyrabat_oppo_e;
	END IF;		--	_MODE = 'dla.IdnOper'
		
	IF _MODE = '' THEN
		CALL cenyrabat_edit_info('INIT', '', '', '', '', '', '', '');		
		TRUNCATE `t_cenyrabat_edit_info`;
		INSERT INTO `t_cenyrabat_edit_info`
			(KontrGUID, Rodzaj, CzyCenaSprzedazy, CzyRabatyHierarchiczne, DataSprzed, Kontrah_KlasaRabatowa,
			IdnTowr, Kontrah_KlasaCenowa, Kontrah_Rabat, Waluta, AkwizytorGUID,
			Towar_TreeNode, Towar_KalasaRabatowa, Towar_CenaEwid, Towar_Cenazkpnet, Towar_nie_realizuje_zamow)
			SELECT
				n.KontrGUID,
				@Rodzaj := n.Rodzaj,
				0, --
				@session.HT.IR.RabatyHierarchiczne,
				n.DataSprzed,	--	zm.terminrealizacji
				IFNULL(k.KlasaRabatowa, 0),
				
				p.IdnTowr,
				IF(p.IdnCennik != 0, p.IdnCennik, n.kontrklasacenowa) AS Kontrah_KlasaCenowa,		-- lub klasacenowa
				n.kontrrabat,	-- zm.rabat
				n.Waluta,
				n.AkwizytorGUID,
				
				t.TreeNode,
				t.klasarabatowa,
				t.cenaewid,
				t.cenazkpnet,
				t.nie_realizuje_zamow
			FROM `oppo_e` p
			INNER JOIN `opng_e` n ON n.GUID = p.IdnOper
			INNER JOIN `kontrah` k ON k.GUID = n.KontrGUID
			INNER JOIN `TowrNg` t ON t.GUID = p.IdnTowr
			WHERE
				p.GUID = _GUID
				AND 
				IF(_Param_B != '', p.Tag = 1, TRUE)	-- dla zaznaczonych
		;	
		
		SET @_CzyPrzypisywacCenyEwid = 
			NOT @CzyCenaSprzedazy AND (
				(@session.HT.IR.PrzypisywacCenyEwidDoPW AND @Rodzaj IN (13, 15)) OR	--	PW i -PW
				(@session.HT.IR.PrzypisywacCenyEwidDoRW AND @Rodzaj IN (11, 14)) OR	--	RW i -RW
				(@session.HT.IR.PrzypisywacCenyEwidDoPW AND @Rodzaj IN (39, 67, 68)) 	--	Inwentaryzacja i inw. nadw, niedob. UWAGA czy tu nie powinno byc @session.HT.IR.PrzypisywacCenyEwidDoINWENT
			)
		;
		CALL ht_rodzaj_calc(@Rodzaj);
		IF @ht.doc.TwTyp = @ht.TwZm THEN
			SET @FCzyCenaSprzedazy := (@ht.doc.Rodzaj in (CZmOO, CZmEx, CZmZP, CZmOF));
		ELSEIF @ht.doc.Rodzaj IN (@ht.CRzRW, @ht.CRzKR, @ht.CPzKW) THEN
			SET @FCzyCenaSprzedazy := Kontrah_KlasaCenowa <> 0;
		ELSE	
			SET @FCzyCenaSprzedazy := (@ht.doc.TwTyp <> @ht.TwPz) or (@ht.doc.Rodzaj = @ht.CMGZW);
		END IF;	

		
		SET @Kurs = 1;
		SELECT 
			k.kurs INTO @Kurs
		FROM `t_cenyrabat_edit_info` tci
		LEFT JOIN `kursy` k ON k.idnwaluty = tci.Waluta AND k.idn_tab_kurs = tci.Idn_tab_kurs
		ORDER BY data DESC 
		LIMIT 1
		;
		UPDATE `t_cenyrabat_edit_info` tci
		SET
			tci.Last_Kurs_For_Waluta = IFNULL(@Kurs, 1),
			CzyCenaSprzedazy = @FCzyCenaSprzedazy
		;	
		
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_ALL', '', '', '', '', '', '', '1');		-- bez selecta
	--	tezraz zrób update oppo_e
		
		UPDATE `oppo_e` p, `t_cenyrabat_edit_result_k_x_t` t
		SET
			p.Rodzaj_Przeliczenia = 
				IF(NOT t.czy_ceny_brt,
					IF(p.Rodzaj_Przeliczenia != _BN_CN_WN,
						_NB_CN_WN,
						p.Rodzaj_Przeliczenia
					),	
					_BN_CB_WN
				),
					
			p.CenaNet = 
				IF(NOT t.czy_ceny_brt,
					t.Cena,
					p.CenaNet
				),	
			p.CenaBrt = 
				IF(NOT t.czy_ceny_brt,
					p.CenaBrt,
					t.Cena
				),	
			p.Rabat = IF(_Param_A != '', p.Rabat, t.Rabat),
			p.idncennik = 
				IF(t.RabatType != 8,	 -- nie jest to pozycja z oferty gdy RabatType <> 8 czyli <> CRT_OFERTA
					t.KlasaCenowa,
					p.idncennik
				),	
			p.wartnet = 
				IF((t.Towar_nie_realizuje_zamow <> 0) AND (@session.globals.Owner = 'PLISZKA'),
					0,
					p.wartnet
				)	
			
		WHERE
			p.GUID = _GUID
			AND 
			IF(_Param_B != '', p.Tag = 1, TRUE)	-- dla zaznaczonych
		;
		CALL cenyrabat_edit_info('CLEAR', '', '', '', '', '', '', '');		
		DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_result_k_x_t`;
	END IF;		--	_MODE = ''
END$$

/* ************************************************************************************************************************************************************************
	Naliczanie cen
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `cenyrabat_edit_info`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `cenyrabat_edit_info`(
	IN _MODE VARCHAR(150),
	IN _Param_A VARCHAR(250),	
	IN _Param_B VARCHAR(250),	
	IN _Param_C VARCHAR(250),	
	IN _Param_D VARCHAR(250),	
	IN _Param_E VARCHAR(250),	
	IN _Param_F VARCHAR(250),	
	IN _Param_G VARCHAR(250)	
)
S_cenyrabat_edit_info: BEGIN

	-- dla pola RabatType 
	DECLARE CRT_DEFAULT INTEGER DEFAULT 0;
	DECLARE CRT_AKWIZYTOR INTEGER DEFAULT 1;
	DECLARE CRT_TABRABAT INTEGER DEFAULT 2;
	DECLARE CRT_MATRAB INTEGER DEFAULT 4;
	DECLARE CRT_OFERTA INTEGER DEFAULT 8;

	IF _MODE = 'CLEAR' THEN
		SET @t_cenyrabat_edit_info.temporary.table = NULL;

		DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_info`;
		DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_result`;
		LEAVE S_cenyrabat_edit_info;
	END IF;	--	IF _MODE = 'CLEAR'
	
	IF _MODE = 'INIT' THEN
		SET @t_cenyrabat_edit_info.temporary.table = IFNULL(@t_cenyrabat_edit_info.temporary.table, FALSE);
		
		IF NOT @t_cenyrabat_edit_info.temporary.table THEN
			DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_info`;
			CREATE TEMPORARY TABLE `t_cenyrabat_edit_info`(
				KontrGUID VARCHAR(38) NOT NULL DEFAULT '',
				PlatnikGUID VARCHAR(38) NOT NULL DEFAULT '',
				IdnTowr VARCHAR(38) NOT NULL DEFAULT '',
				AkwizytorGUID VARCHAR(38) NOT NULL DEFAULT '',
				Rodzaj int(11),
				CzyCenaSprzedazy int(11),
				DataSprzed DATE,
				CzyRabatyHierarchiczne int(11),
				
				Kontrah_TreeNode VARCHAR(250) NOT NULL DEFAULT '',
				Kontrah_KlasaCenowa int(11) NOT NULL DEFAULT 0,
				Kontrah_KlasaRabatowa int(11) NOT NULL DEFAULT 0,
				Kontrah_Rabat DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				
				Towar_TreeNode VARCHAR(250) NOT NULL DEFAULT '',
				Towar_KalasaRabatowa int(11) NOT NULL DEFAULT 0,
				Towar_CenaEwid DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				Towar_Cenazkpnet DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				Towar_nie_realizuje_zamow int(11) NOT NULL DEFAULT 0,
				--  dla Pliszki??? sprawdzic!!!	Towar_nie_realizuje_zamow int(11),
				
				Default_KlasaCenowa int(11) NOT NULL DEFAULT 0,
				Default_Cena DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				Default_Waluta int(11) NOT NULL DEFAULT 0,
				
				Waluta int(11) NOT NULL DEFAULT 0,
				Idn_tab_kurs int(11) NOT NULL DEFAULT 0,
				Last_Kurs_For_Waluta DOUBLE(16,4) NOT NULL DEFAULT '1.0000',
				PRIMARY KEY (`IdnTowr`)
			);
			DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_result`;
			CREATE TEMPORARY TABLE `t_cenyrabat_edit_result`(
				RabatType int(11) NOT NULL DEFAULT 0,
				KlasaCenowa int(11) NOT NULL DEFAULT 0,
				Waluta int(11) NOT NULL DEFAULT 0,
				czy_ceny_brt int(11) NOT NULL DEFAULT 0,
				CenaWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				Cena DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				Rabat DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				-- CenaAddWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				-- CenaAdd DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				CenaObl DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
				AskExist int(11) NOT NULL DEFAULT 0,
				WarunekMsg VARCHAR(250) DEFAULT '',
				AskMsg TEXT,
				priorytet int(11) NOT NULL DEFAULT 0,
				internal_ord int(11) NOT NULL DEFAULT 0,
				Towar_nie_realizuje_zamow int(11) NOT NULL DEFAULT 0
			);
		END IF;
		LEAVE S_cenyrabat_edit_info;
	END IF;	--	IF _MODE = 'INIT'

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CALC_CENA_RABAT_CALC_ALL'
		Parametry brak
			_Param_G	!= '' to nie zwracam wyniku (selct)
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_ALL', '', '', '', '', '', '', '');		
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_ALL', '', '', '', '', '', '', '1');		-- bez selecta
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CALC_CENA_RABAT_CALC_ALL' THEN
		SET _Param_A = IFNULL(_Param_A, 0);
		IF @CzyCenaSprzedazy THEN
		-- S P R Z E D A Z
			CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_DEFAULT', '', '', '', '', '', '', '');		
			IF _Param_A = 0 THEN
				CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_OFERTA', '', '', '', '', '', '', '');		
				-- testuj bo gdy jest oferta to rezygnuj
				CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_MATRAB', '', '', '', '', '', '', '');		
				CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_TABRABAT', '', '', '', '', '', '', '');		
			END IF;
			
		ELSE
		-- Z A K U P Y
			CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_DEFAULT', '', '', '', '', '', '', '');		
			IF NOT @_CzyPrzypisywacCenyEwid THEN
				CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_OFERTA', '', '', '', '', '', '', '');		
			END IF;	
		
		END IF;
	--	Jeszcze przelicz	
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', '', '', '', '', '', '', '');		
		
		IF IFNULL(_Param_G, '') = '' THEN
		--	Select zwracany	
			SELECT 
				IF(RabatType = CRT_DEFAULT, 
					'DEFAULT',
					IF(RabatType = CRT_AKWIZYTOR,
						'AKWIZ',
						IF(RabatType = CRT_TABRABAT,
							'TABRABAT',
							IF(RabatType = CRT_MATRAB,
								'MATRAB',
								IF(RabatType = CRT_OFERTA,
									'OFERTA',
									'DEFAULT'
								)
							)
						)
					)
				) AS RabatTypeLevel,
				tcr.*
			FROM `t_cenyrabat_edit_result` tcr	
			ORDER BY tcr.RabatType DESC, internal_ord
			;
		ELSE
		--	Kreuj pomocnicza dla CALL cenyrabat_edit_info('KONTR_x_TOWR_CALC', ...
			DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_result_k_x_t`;
			CREATE TEMPORARY TABLE  `t_cenyrabat_edit_result_k_x_t`
				SELECT 
				IF(RabatType = CRT_DEFAULT, 
					'DEFAULT',
					IF(RabatType = CRT_AKWIZYTOR,
						'AKWIZ',
						IF(RabatType = CRT_TABRABAT,
							'TABRABAT',
							IF(RabatType = CRT_MATRAB,
								'MATRAB',
								IF(RabatType = CRT_OFERTA,
									'OFERTA',
									'DEFAULT'
								)
							)
						)
					)
				) AS RabatTypeLevel,
				tcr.*
				FROM `t_cenyrabat_edit_result` tcr	
				ORDER BY tcr.RabatType DESC, internal_ord
				LIMIT 1
			;
		END IF;
	END IF;	--	IF _MODE = 'CALC_CENA_RABAT_CALC_ALL'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CALC_CENA_RABAT_CALC_UPATE_AFTER'
		Parametry
			_Param_A	RabatType - gdy '' przeliczam dla wszystkiech
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', '', '', '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CALC_CENA_RABAT_CALC_UPATE_AFTER' THEN
		SET _Param_A = IFNULL(_Param_A, '');
		SELECT tci.Last_Kurs_For_Waluta INTO @Last_Kurs_For_Waluta FROM `t_cenyrabat_edit_info` tci;
		IF @Last_Kurs_For_Waluta != 1 AND @Last_Kurs_For_Waluta > 0 THEN
			SET @I_cenyPrecision = _VarInt(@session.HT.IR.CenyPrecisionWalutowe);
		ELSE
			SET @I_cenyPrecision = _VarInt(@session.HT.IR.CenyPrecisionPLN);
		END IF;
		
		UPDATE `t_cenyrabat_edit_result` tcr, `t_cenyrabat_edit_info` tci, `kursy_calc` ku
		SET
			tcr.Cena = 
				IF(tcr.Waluta <> tci.Waluta,
					Round(tcr.CenaWal*IFNULL(ku.kurs, 0), @I_cenyPrecision), 
					tcr.CenaWal
				)
			/*	,	
			tcr.CenaAdd = 
				IF(tcr.Waluta <> tci.Waluta,
					Round(tcr.CenaAddWal*IFNULL(ku.kurs, 0), @session.HT.IR.CenyPrecisionWalutowe),	
					tcr.CenaAddWal
				)	
			*/	
		WHERE
			IF(_Param_A = '', TRUE, tcr.RabatType = _Param_A)
			-- AND tcr.Waluta <> tci.Waluta
			AND ku.idnwaluty1 = tcr.waluta AND ku.idnwaluty2 = tci.Waluta
		;
		
		UPDATE `t_cenyrabat_edit_result` tcr, `t_cenyrabat_edit_info` tci	
		SET
			tcr.Towar_nie_realizuje_zamow = tci.Towar_nie_realizuje_zamow,
			tcr.Rabat = IF(tci.Towar_nie_realizuje_zamow, 100, tcr.Rabat)		--	warunek PLISZKA dla towarów z wlacz."nie_realizuje_zamow" dajemy rabat 100%
		;
		UPDATE `t_cenyrabat_edit_result` tcr
		SET
			tcr.CenaObl = 
					Round((1-tcr.Rabat/100)*tcr.Cena, @I_cenyPrecision)
		;	
		SET NAMES 'cp1250';
		UPDATE `t_cenyrabat_edit_result` tcr
		SET
			tcr.AskMsg = 
					CONCAT(
						IF(tcr.RabatType = CRT_OFERTA,
							'Warunek zastosowania ceny specjalnej:',
							'Warunek udzielenia rabatu:'),
						'\n', '"', tcr.WarunekMsg, '"', '\n',	
						'Czy przepisać następującą pozycję:', '\n',
						'Cena wej.: ', ROUND(tcr.Cena, @I_cenyPrecision), ' \n',
						IF(tcr.Rabat != 0,
							CONCAT('Rabat: ', ROUND(tcr.Rabat,2), '%\n'),
							''),
						'Cena nal.: ', ROUND(tcr.CenaObl, @I_cenyPrecision), ' ?'
					)
		WHERE 
			tcr.RabatType IN (CRT_OFERTA, CRT_MATRAB)	
			AND tcr.AskExist
		;	
		
	END IF;	--	IF _MODE = 'CALC_CENA_RABAT_CALC_UPATE_AFTER'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CALC_CENA_RABAT_CALC_DEFAULT'
		Parametry brak
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_DEFAULT', '', '', '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CALC_CENA_RABAT_CALC_DEFAULT' THEN
		DELETE FROM `t_cenyrabat_edit_result` WHERE RabatType IN (CRT_DEFAULT, CRT_AKWIZYTOR);
		
		INSERT INTO `t_cenyrabat_edit_result`
			(RabatType, Waluta, KlasaCenowa, CenaWal, Rabat, CenaObl, czy_ceny_brt)
			SELECT
				--	CRT_DEFAULT, tci.Waluta, tci.Kontrah_KlasaCenowa, tci.Towar_CenaEwid, 0, tci.Towar_CenaEwid
				CRT_DEFAULT, tci.Waluta, tci.Kontrah_KlasaCenowa, IF(tci.CzyCenaSprzedazy, 0, tci.Towar_CenaEwid), tci.Kontrah_Rabat, 0, kl.czy_ceny_brt
			FROM `t_cenyrabat_edit_info` tci 
			LEFT JOIN klasycen kl ON kl.Idn = tci.Kontrah_KlasaCenowa
		;	
		IF @_CzyPrzypisywacCenyEwid THEN
		--	Gdy zakup i RW, PW, INW i ustawione w regu to konczymy na cenie ewidencyjnej
			CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', CRT_DEFAULT, '', '', '', '', '', '');		
			LEAVE S_cenyrabat_edit_info;	--	wychodze bo nie mam nic do zapisywania
		END IF;
		
		INSERT INTO `t_cenyrabat_edit_result`
			(RabatType, Waluta, KlasaCenowa, Cena, Rabat, CenaObl, czy_ceny_brt)
			SELECT
				CRT_AKWIZYTOR, tci.Waluta, tci.Kontrah_KlasaCenowa, 0, k.rabat, 0, kl.czy_ceny_brt
			FROM `t_cenyrabat_edit_info` tci 
			INNER JOIN `kontrah` k ON k.GUID = tci.AkwizytorGUID
			LEFT JOIN `klasycen` kl ON kl.Idn = tci.Kontrah_KlasaCenowa
-- 			LEFT JOIN klasycen kl ON kl.Idn = tci.Kontrah_KlasaCenowa
			WHERE
				tci.AkwizytorGUID != ''
				AND k.rabat > 0		--	WIERSZ Akwizytora (CRT_AKWIZYTOR) ma znaczenie tylko gdy jest jakis rabat!!!
-- 				AND k.GUID = tci.AkwizytorGUID
				
		;	
		
		DROP TEMPORARY TABLE IF EXISTS `t_cennik_towaru`;
		CREATE TEMPORARY TABLE `t_cennik_towaru`
		
			SELECT 
				tci.DataSprzed,
				IF(tci.DataSprzed BETWEEN c.waznoscod AND c.waznoscdo, 
					IF( @session.HT.IR.Ceny_promocyjne_aktywne AND c.Cena_promocyjna != 0, 
						c.Cena_promocyjna, 
						c.cena
					),
					c.cena
				) AS Cena, 
				/*
				-- bylo IF((tci.DataSprzed between ifnull(c.waznoscod,'2000-01-01') and ifnull(c.waznoscdo,'2100-01-01')), 
				IF((tci.DataSprzed BETWEEN IFNULL(c.waznoscod,'2000-01-01') AND IF(IFNULL(c.waznoscdo, '0000-00-00') = '0000-00-00', '2100-01-01', c.waznoscdo)), 
					IF( @session.HT.IR.Ceny_promocyjne_aktywne AND c.Cena_promocyjna != 0, c.Cena_promocyjna, c.cena),
					0) AS Cena, 
				*/	
				c.waluta, 
				c.klasa, 
				IFNULL(kl.czy_ceny_brt, 0) AS czy_ceny_brt, 
				IF(tci.CzyCenaSprzedazy, 
					(c.klasa = tci.Kontrah_KlasaCenowa),
					1) AS Valid_Klasa
			FROM `t_cenyrabat_edit_info` tci	
			INNER JOIN cennik c ON c.idntowr = tci.idntowr
			LEFT JOIN klasycen kl ON kl.Idn = c.klasa
			WHERE
				c.czyzakup = IF(tci.CzyCenaSprzedazy, 0, 1)
			HAVING cena <> 0	
			ORDER BY c.klasa
			
		;
/*		
			SELECT 
				IF(((tci.DataSprzed between c.waznoscod and c.waznoscdo) and @session.HT.IR.Ceny_promocyjne_aktywne), 
					c.Cena_promocyjna, 
					c.cena) AS Cena, 
				c.waluta, 
				c.klasa, 
				IFNULL(kl.czy_ceny_brt, 0) AS czy_ceny_brt, 
				(c.klasa = tci.Kontrah_KlasaCenowa) AS Valid_Klasa
			FROM `t_cenyrabat_edit_info` tci	
			INNER JOIN cennik c ON c.idntowr = tci.idntowr
			LEFT JOIN klasycen kl ON kl.Idn = c.klasa
			WHERE
				c.czyzakup = IF(tci.CzyCenaSprzedazy, 0, 1)
			ORDER BY c.klasa
		;
*/
		
		SELECT COUNT(*) INTO @C_t_cennik_towaru FROM `t_cennik_towaru`;
		IF @C_t_cennik_towaru > 0 THEN

			SET @cena = NULL;
			--	szukam klasy i waluty
			SELECT 
				c.cena, c.waluta, c.klasa, c.czy_ceny_brt
			INTO 
				@cena, @waluta, @klasa, @czy_ceny_brt
			FROM `t_cennik_towaru` c, `t_cenyrabat_edit_info` tci
			WHERE
				c.Valid_Klasa
				AND c.Waluta = tci.Waluta
			LIMIT 1	
			;
			IF @cena IS NULL THEN
			--	gdy cena NULL to szukam tylko klasy
				SELECT 
					c.cena, c.waluta, c.klasa, c.czy_ceny_brt
				INTO 
					@cena, @waluta, @klasa, @czy_ceny_brt
				FROM `t_cennik_towaru` c
				WHERE
					c.Valid_Klasa
				LIMIT 1	
				;
			END IF;
			
			IF @cena IS NULL AND @session.HT.IR.Pobieraj_cene_z_najwyzszej_klasy_cen THEN
				SELECT 
					c.cena, c.waluta, c.klasa, c.czy_ceny_brt
				INTO 
					@cena, @waluta, @klasa, @czy_ceny_brt
				FROM `t_cennik_towaru` c
				ORDER BY c.klasa	
				LIMIT 1	
				;
			END IF;
			
			IF @cena IS NOT NULL THEN		--	JEST CENA
				--	Teraz przepisz uzyskana cenę domyślną i klasę domyślną do pól Cena i KlasaCenowa
				UPDATE `t_cenyrabat_edit_result` tcr
				SET
					tcr.CenaWal = IFNULL(@Cena, 0),
					tcr.Cena = IFNULL(@Cena, 0),
					tcr.CenaObl = IFNULL(@Cena, 0),
					tcr.KlasaCenowa = IFNULL(@klasa, 0),
					tcr.Waluta = IFNULL(@waluta, tcr.Waluta),
					tcr.czy_ceny_brt = IFNULL(@czy_ceny_brt, 0)
				WHERE
					tcr.RabatType IN (CRT_DEFAULT, CRT_AKWIZYTOR)
				;	
			END IF;
			
		END IF;
		
		DROP TEMPORARY TABLE IF EXISTS `t_cennik_towaru`;
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', CRT_DEFAULT, '', '', '', '', '', '');		
		
	END IF;	--	IF _MODE = 'CALC_CENA_RABAT_CALC_DEFAULT'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CALC_CENA_RABAT_CALC_OFERTA'
		dla CRT_OFERTA
		Parametry brak
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_OFERTA', '', '', '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CALC_CENA_RABAT_CALC_OFERTA' THEN
		DELETE FROM `t_cenyrabat_edit_result` WHERE RabatType = CRT_OFERTA;
		
		INSERT INTO `t_cenyrabat_edit_result`
			(RabatType, Waluta, CenaWal, Cena, Rabat, czy_ceny_brt, AskExist, WarunekMsg)
			SELECT
					CRT_OFERTA, O.waluta, 
					IF(O.cenazaile = 0, O.cena, O.cena/O.cenazaile), 
					ROUND((IF(O.cenazaile = 0, O.cena, O.cena/O.cenazaile))*IFNULL(ku.kurs, 0), @session.HT.IR.CenyPrecisionWalutowe), 
					IFNULL(O.rabat, 0), 
					O.czy_ceny_brt,
					(IFNULL(O.warunek, '') <> ''), O.warunek
			FROM `t_cenyrabat_edit_info` tci
--			INNER JOIN `oferty` O ON O.idntowr = tci.idntowr and O.kontrGUID = tci.kontrGUID
			INNER JOIN `oferty` O ON O.idntowr = tci.idntowr AND O.kontrGUID IN (tci.kontrGUID, tci.platnikGUID)
			LEFT JOIN `kursy_calc` ku ON ku.idnwaluty1 = O.waluta AND ku.idnwaluty2 = tci.Waluta
			WHERE
				O.dataoferty <= NOW() AND O.status = 0 AND cena <> 0 
				AND (NOT tci.CzyCenaSprzedazy OR tci.CzyRabatyHierarchiczne)		--	zawsze dla zakupu lub sprzedazy z wlaczonymi rabatami hierarch. 
		;	
		
		-- SET @CzyLiczyc = 2;
		UPDATE `t_cenyrabat_edit_result` tcr
		SET
			tcr.AskMsg = 
				CONCAT(
					'Warunek zastosowania ceny specjalnej:', '\n', '"', tcr.WarunekMsg, '"', '\n',
					'Czy przepisać następującą cenę:', '\n',
					'Cena: ', tcr.Cena, ' ?')
		WHERE 
			tcr.RabatType = CRT_OFERTA	
			AND tcr.AskExist
		;	

		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', CRT_OFERTA, '', '', '', '', '', '');		
		
	END IF;	--	IF _MODE = 'CALC_CENA_RABAT_CALC_OFERTA'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CALC_CENA_RABAT_CALC_MATRAB'
		dla CRT_MATRAB
		Parametry brak
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_MATRAB', '', '', '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CALC_CENA_RABAT_CALC_MATRAB' THEN
		DELETE FROM `t_cenyrabat_edit_result` WHERE RabatType = CRT_MATRAB;
		
-- 		SET @session.HT.IR.RabatyHierarchiczne_DataWaznosciUsed = TRUE; -- FALSE;
		
		SET @internal_ord = 0;
		INSERT INTO `t_cenyrabat_edit_result`
			(RabatType, Waluta, KlasaCenowa, CenaWal, Rabat, /*CenaObl,*/ AskExist, WarunekMsg, priorytet, internal_ord, czy_ceny_brt)
		
			SELECT 
				CRT_MATRAB,
				c.waluta, 
				c.klasa, 
				IF((tci.DataSprzed BETWEEN c.waznoscod AND c.waznoscdo) AND @session.HT.IR.Ceny_promocyjne_aktywne AND c.Cena_promocyjna != 0, 
					c.Cena_promocyjna, 
					IF(m.czy_rabat_kwotowy = 0, 
						c.cena, 
						c.cena - m.rabat_kwotowy
					)
				) AS cenawal, 
				/*
				IF(((tci.DataSprzed BETWEEN IFNULL(c.waznoscod,'2000-01-01') AND IF(IFNULL(c.waznoscdo, '0000-00-00') = '0000-00-00', '2100-01-01', c.waznoscdo)) AND 
					@session.HT.IR.Ceny_promocyjne_aktywne), 
				-- IF(((tci.DataSprzed between c.waznoscod and c.waznoscdo) and @session.HT.IR.Ceny_promocyjne_aktywne), 
					c.Cena_promocyjna, 
					IF(m.czy_rabat_kwotowy = 0, 
						c.cena, 
						c.cena - m.rabat_kwotowy
					)
				) AS cenawal, 
				*/
				IF(m.czy_rabat_kwotowy = 0, 
					m.procent, 
					0
				) AS Rabat,	
				
				/*
				(1-m.procent/100)*
				IF(((current_date between c.waznoscod and c.waznoscdo) and @session.HT.IR.Ceny_promocyjne_aktywne), 
					c.Cena_promocyjna, 
					IF(m.czy_rabat_kwotowy = 0, 
						c.cena, 
						tci.Default_Cena - m.rabat_kwotowy
					)
				) AS cenaobl, 
				*/
				(IFNULL(m.warunek, '') <> ''),
				m.warunek, 
				m.priorytet, 
				@internal_ord := @internal_ord + 1,
				kl.czy_ceny_brt
			FROM `t_cenyrabat_edit_info` tci, `matrab` m, `cennik` c 
			LEFT JOIN klasycen kl ON kl.Idn = c.Klasa
			WHERE 
				( 
				  ((tci.Towar_TreeNode LIKE CONCAT(towar, '%')) and towar <> '') OR 
				  (GuidT != '' AND (GuidT = tci.idntowr)) OR 
				  (klasarabattowar = tci.Towar_KalasaRabatowa and klasarabattowar <> 0) 
				) 
				AND 
				( 
				  ((tci.Kontrah_TreeNode LIKE CONCAT(kontrahent, '%')) and kontrahent <> '') OR 
				  (GuidK != '' AND (GuidK = tci.KontrGUID or GuidK = tci.AkwizytorGUID)) OR -- dla slon zadanie nr 004347 -> ten drugi %s to aAkwizytorGUID
				  (m.klasarabatkontrah = tci.Kontrah_KlasaRabatowa AND m.klasarabatkontrah <> 0) 
				) 
				AND 
				( 
				  c.czyzakup = 0 and (c.klasa=IF(m.cennik = 0, tci.Kontrah_KlasaCenowa, m.cennik)) and c.idntowr = tci.idntowr AND
				  (tci.DataSprzed BETWEEN IFNULL(c.waznoscod,'2000-01-01') AND IF(IFNULL(c.waznoscdo, '0000-00-00') = '0000-00-00', '2100-01-01', c.waznoscdo)) AND 
				  IF(@session.HT.IR.RabatyHierarchiczne_DataWaznosciUsed, m.waznosc >= CURDATE(), TRUE)
				) 
			 
			ORDER BY m.priorytet DESC
		;	
		/*
			--, cenaobl
		--;
		*/
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', CRT_MATRAB, '', '', '', '', '', '');		
		
		SET @internal_ord = 0;
		UPDATE `t_cenyrabat_edit_result` tcr
		SET
			tcr.internal_ord = @internal_ord := @internal_ord + 1
		WHERE 
			tcr.RabatType = CRT_MATRAB	
		ORDER BY tcr.priorytet DESC,  tcr.cenaobl	
		;	
		
		UPDATE `t_cenyrabat_edit_result` tcr
		SET
			tcr.AskMsg = 
				CONCAT(
					'Warunek udzielenia rabatu:', '\n', '"', tcr.WarunekMsg, '"', '\n',
					'Czy przepisać następującą pozycję:', '\n',
					'Rabat:', tcr.Rabat, '\n',
					'Cena: ', tcr.Cena, ' ?')
		WHERE 
			tcr.RabatType = CRT_MATRAB	
			AND tcr.AskExist
		;	

	
	END IF;	--	IF _MODE = 'CALC_CENA_RABAT_CALC_MATRAB'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'CALC_CENA_RABAT_CALC_TABRABAT'
		dla CRT_TABRABAT
		Parametry brak
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_TABRABAT', '', '', '', '', '', '', '');		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE = 'CALC_CENA_RABAT_CALC_TABRABAT' THEN
		DELETE FROM `t_cenyrabat_edit_result` WHERE RabatType = CRT_TABRABAT;
		
		SELECT cenawal, waluta INTO @tcenawal, @twaluta FROM `t_cenyrabat_edit_result` WHERE RabatType = CRT_DEFAULT;
		SET @tcenawal = IFNULL(@tcenawal, 0);
		IF @tcenawal = 0 THEN
			LEAVE S_cenyrabat_edit_info;	--	wychodze bo nie mam nic do zapisywania
		END IF;
		
		INSERT INTO `t_cenyrabat_edit_result`
			(RabatType, Waluta, KlasaCenowa, CenaWal, Rabat)
			SELECT 
				CRT_TABRABAT,
				@twaluta,
				tr.cennik, 
				-- tr.klasarabatkontrah, tr.klasarabattowar, 
				@tcenawal, 
				tr.procent 
				-- (1-tr.procent/100)*@tcenawal
				-- tr.waznosc  
			FROM `t_cenyrabat_edit_info` tci, `tabrabat` tr
			WHERE 
				tr.klasarabatkontrah = tci.Kontrah_KlasaRabatowa
				AND  tr.klasarabattowar = tci.Towar_KalasaRabatowa
		;
		CALL cenyrabat_edit_info('CALC_CENA_RABAT_CALC_UPATE_AFTER', CRT_TABRABAT, '', '', '', '', '', '');		
			
	END IF;	--	IF _MODE = 'CALC_CENA_RABAT_CALC_TABRABAT'
	

END$$


/* ************************************************************************************************************************************************************************
	inicjalne 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `CenyRabaty_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CenyRabaty_init`(
	IN _MODE VARCHAR(250)
)
BEGIN 
	SET @ht.CenyRabaty_init_init = TRUE;
	
	DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_info`;
	CREATE TEMPORARY TABLE `t_cenyrabat_edit_info`(
		KontrGUID VARCHAR(38) NOT NULL DEFAULT '',
		PlatnikGUID VARCHAR(38) NOT NULL DEFAULT '',
		IdnTowr VARCHAR(38) NOT NULL DEFAULT '',
		AkwizytorGUID VARCHAR(38) NOT NULL DEFAULT '',
		Rodzaj int(11),
		CzyCenaSprzedazy int(11),
		DataSprzed DATE,
		CzyRabatyHierarchiczne int(11),
		
		Kontrah_TreeNode VARCHAR(250) NOT NULL DEFAULT '',
		Kontrah_KlasaCenowa int(11) NOT NULL DEFAULT 0,
		Kontrah_KlasaRabatowa int(11) NOT NULL DEFAULT 0,
		Kontrah_Rabat DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		
		Towar_TreeNode VARCHAR(250) NOT NULL DEFAULT '',
		Towar_KalasaRabatowa int(11) NOT NULL DEFAULT 0,
		Towar_CenaEwid DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		Towar_Cenazkpnet DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		Towar_nie_realizuje_zamow int(11) NOT NULL DEFAULT 0,
		--  dla Pliszki??? sprawdzic!!!	Towar_nie_realizuje_zamow int(11),
		
		Default_KlasaCenowa int(11) NOT NULL DEFAULT 0,
		Default_Cena DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		Default_Waluta int(11) NOT NULL DEFAULT 0,
		
		Waluta int(11) NOT NULL DEFAULT 0,
		Idn_tab_kurs int(11) NOT NULL DEFAULT 0,
		Last_Kurs_For_Waluta DOUBLE(16,4) NOT NULL DEFAULT '1.0000',
		PRIMARY KEY (`IdnTowr`)
	);
	DROP TEMPORARY TABLE IF EXISTS `t_cenyrabat_edit_result`;
	CREATE TEMPORARY TABLE `t_cenyrabat_edit_result`(
		RabatType int(11) NOT NULL DEFAULT 0,
		KlasaCenowa int(11) NOT NULL DEFAULT 0,
		Waluta int(11) NOT NULL DEFAULT 0,
		czy_ceny_brt int(11) NOT NULL DEFAULT 0,
		CenaWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		Cena DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		Rabat DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		-- CenaAddWal DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		-- CenaAdd DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		CenaObl DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		AskExist int(11) NOT NULL DEFAULT 0,
		WarunekMsg VARCHAR(250) DEFAULT '',
		AskMsg TEXT,
		priorytet int(11) NOT NULL DEFAULT 0,
		internal_ord int(11) NOT NULL DEFAULT 0,
		Towar_nie_realizuje_zamow int(11) NOT NULL DEFAULT 0
	);
	
END$$

/* ************************************************************************************************************************************************************************
	Narzędzia 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `CalcXXPo`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CalcXXPo`(
	IN _MODE VARCHAR(250),
	IN _Algorytm INTEGER,	-- VARCHAR(250),
	IN _IdnVat INTEGER,
	IN _Ilosc DECIMAL(16,4),
	INOUT _Wspolplatnosc DECIMAL(16,4),
	INOUT _Rabat DECIMAL(16,4),
	INOUT _CenaNet DECIMAL(16,4),
	INOUT _CenaNetPL DECIMAL(16,4),
	INOUT _CenaNetzRab DECIMAL(16,4),
	INOUT _CenaBrt DECIMAL(16,4),
	INOUT _WartNet DECIMAL(16,4),
	INOUT _WartNetWal DECIMAL(16,4),
	INOUT _StawkaVat DECIMAL(16,4),
	INOUT _WartVat DECIMAL(16,4),
	INOUT _WartBrt DECIMAL(16,4),
	INOUT _WartBrtWal DECIMAL(16,4),
	INOUT _WartBrtEdit DECIMAL(16,4),
	INOUT _WartRabatNet DECIMAL(16,4),
	INOUT _WartRabatBrt DECIMAL(16,4),
	INOUT _Kurs DECIMAL(16,4),
	INOUT _Koszt_nabycia DECIMAL(16,4),
	INOUT _StawkaCla DECIMAL(16,4),
	INOUT _WartClo DECIMAL(16,4),
	INOUT _WartNetWalEdit DECIMAL(16,4),
	INOUT _Oplata_produktowa DECIMAL(16,4),
	IN _IsKorekta BOOLEAN,
	IN _IsWalutowa BOOLEAN,
	IN _Param_A VARCHAR(50),	
	IN _Param_B VARCHAR(50),	
	IN _Param_C VARCHAR(50),	
	IN _Param_D VARCHAR(50)	
)

/*
  var aWspolplatnosc, aRabat, aCenaNet, aCenaNetPL, aCenaNetzRab, aWartNet, aWartNetWal,
  aStawkaVat, aWartVat, aWartBrt, aCenaBrt, aWartBrtEdit, aWartRabatNet, aWartRabatBrt, aKurs, akoszt_nabycia,
  aStawkaCla, aWartClo, aWartNetWalEdit, aOplata_produktowa: Currency; aIsKorekta, aIsWalutowa: Boolean);
  
	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,
		'', '', '', '');
		

CALL _sys_connection_Tool('VERIFY LOGIN', 'LogOn', 'cf23fedf8f020ff365c0e164a6251d76', MD5('prezes'), 'SLON', '', '192.168.0.9', 'HT2003', '');
SET 
	@IdnOper = '{5B8BCBE9-C226-40F7-A61A-B82C986FB380}',
	@Rodzaj = 3
;
SET @session.oppo_e = FALSE;	
CALL opng_E_LetEdit('', @IdnOper, '', '', '', '');
		
SELECT 
p.towrsymb, p.rodzaj_przeliczenia,p.Kurs, p.cenanetWal, p.cenanet, p.rabat, p.ILosc, p.wartnetwal, p.WartBrtWal, p.wartnet, p.WartVat, p.WartBrt, cenaBrt,
p.* 
FROM oppo_e p
WHERE IdnOper = @IdnOper
ORDER BY rodzaj_przeliczenia
; 

SELECT 
p.towrsymb, p.rodzaj_przeliczenia,p.Kurs, p.cenanetWal, p.cenanet, p.rabat, p.ILosc, p.wartnetwal, p.WartBrtWal, p.wartnet, p.WartVat, p.WartBrt, cenaBrt,
p.* 
FROM oppo p
WHERE IdnOper = @IdnOper
ORDER BY rodzaj_przeliczenia
; 
		
*/
S_CalcXXPo: BEGIN 
--	standardowe przeliczenie cena net.->rabat->wart.wal.
	DECLARE _NB_CN_WN  INTEGER DEFAULT 0;	-- CRodzaj_Przeliczenia_CenaNet_NettoWal
--	z wart.wal->(rabat nie ruszany)->cena net.	
	DECLARE _NB_WN_CN  INTEGER DEFAULT 1;	-- CRodzaj_Przeliczenia_NettoWal_CenaNet
--	z wart.wal->rabat	
	DECLARE _NB_WN_R   INTEGER DEFAULT 2;	-- CRodzaj_Przeliczenia_NettoWal_Rabat
--	fiskalne z brutto->netto  (fiskalne)	z ceny netto -> wrt brutto, -> ceny brutto (zaokr), -> i dalej jak dla _BN_CB_WN
	DECLARE _BN_CN_WN  INTEGER DEFAULT 3;	-- CRodzaj_Przeliczenia_Brutto_Netto
--	z wart brutto->netto							
	DECLARE _BN_WB_WN  INTEGER DEFAULT 4;	-- CRodzaj_Przeliczenia_Brutto_Netto2
--	z ceny brutto->netto	
	DECLARE _BN_CB_WN  INTEGER DEFAULT 5;	-- CRodzaj_Przeliczenia_CenaBrutto_Netto
--	z wart.wal->(rabat nie ruszany)->cena net. wart vat edytowana	
	DECLARE _BN_WN_CNve  INTEGER DEFAULT 6;	-- CRodzaj_Przeliczenia_NettoWal_CenaNet_VatEdyt
--	z wart.wal->(rabat nie ruszany)->cena net. wart vat edytowana	
	DECLARE _BN_CB_WN_POS  INTEGER DEFAULT 7;	-- tak jak _BN_CB_WN ale z POS zatem CenaPoRabacie jest zaokraglana (gdy rabat = 0 liczy jak _BN_CB_WN
--	zmienna przelicznika
	DECLARE _Przelicznik  INTEGER DEFAULT _NB_CN_WN;	

	IF (_Ilosc = 0) OR (_Rabat >= 100) THEN
		SET
			_WartNet = 0,
			_WartNetWal = 0,
			_WartVat = 0,
			_WartBrt = 0,
			_WartBrtWal = 0
		;
		LEAVE S_CalcXXPo;
	END IF;	
	
	SET
		_Kurs = IF(IFNULL(_Kurs, 0) = 0, 1, _Kurs),
		_Koszt_nabycia = IFNULL(_Koszt_nabycia, 0),
		_StawkaCla = IFNULL(_StawkaCla, 0),
		_WartClo = IFNULL(_WartClo, 0), 
		_WartNetWalEdit = IFNULL(_WartNetWalEdit, 0),
		_Oplata_produktowa = IFNULL(_Oplata_produktowa, 0),
		@p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)
	;
	
	IF _Algorytm = _NB_CN_WN THEN
		/*	
		_NB_CN_WN	CRodzaj_Przeliczenia_CenaNet_NettoWal
		================================================================================
		  [NB]   CN - > WN - klasyczne od ceny netto
		  [NB CN-WN]
		================================================================================
		Dane są:
		-> CNetto
		-> Rabat
		Obliczamy (ilosc) -> wart.Netto.wal -> wart.Netto
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		Obliczamy -> cena.Brutto
		*/
		SET 
			_WartNetWal = @p.wartnetwal:=_Rnd2(_Ilosc * @p.cenanetZRab:=_Rnd(_Cenanet*(100-_Rabat)/100, @p.CenyPrecision)),
			_CenaNetzRab = @p.cenanetZRab,
		--	_WartNet = @p.wartnet := _Rnd2(@p.wartnetwal * kurs),																	-- wersja apro
			_WartNet = @p.wartnet := _Rnd2(@p.wartnetwal*_Kurs + _WartClo + _Koszt_nabycia),										-- wersja z C_CalcOppo.pas
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartvat + @p.wartnet,
			_WartBrtWal =  @p.WartBrtWal := _Rnd2(@p.wartnetwal*(1 + @p.StawkaVat)),
			_Cenabrt = IFNULL(_Rnd2(@p.WartBrtWal/_ilosc), _Cenabrt)																-- UWAGA Cenabrt zawiera wartosc w WALUCIE
		--	cenabrt = _Rnd2(@p.cenanetZRab*(1 + @p.StawkaVat))																		-- wersja z C_CalcOppo.pas
		;
	END IF;

	IF _Algorytm = _NB_WN_CN THEN
		/*	
		_NB_WN_CN	CRodzaj_Przeliczenia_NettoWal_CenaNet
		================================================================================
		  [NB] WN - > CN od wartości netto do ceny netto
		  [NB WN-CN]
		================================================================================
		Dane są:
		-> wart.Netto
		-> Rabat
		Obliczamy (ilosc) -> CNetto
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		*/
		SET 
			_CenaNet = _Rnd(100*(@p.cenanetZRab:= IFNULL(_WartNetWal/_Ilosc, 0))/(100-_Rabat), @p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)),
			_CenaNetzRab = @p.cenanetZRab, -- czy nie powinna byc zaokr wg regul z IReg-a?
			_WartNet = @p.wartnet := _Rnd2(_WartNetWal*_Kurs + _WartClo + _Koszt_nabycia),											-- wersja z C_CalcOppo.pas
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartvat + @p.wartnet,
			-- _Cenabrt = IFNULL(_Rnd2((@p.wartvat + @p.wartnet)/_Ilosc), _Cenabrt),													-- wersja apro - interpretacja cenabrt to PLNy
			_WartBrtWal = @p.WartBrtWal := _Rnd2(_WartNetWal*(1 + @p.StawkaVat)),
			_Cenabrt = IFNULL(_Rnd(@p.WartBrtWal/_ilosc, @p.CenyPrecision), _Cenabrt)																-- UWAGA Cenabrt zawiera wartosc w WALUCIE
		;
	END IF;
	
	IF _Algorytm = _NB_WN_R THEN
		/*	
		_NB_WN_R	CRodzaj_Przeliczenia_NettoWal_Rabat
		!!!!!!!!!!!!!!!!!!!  UWAGA Chyba nie obsługujemy tego !!!!!!!!!!!!!!!!!!!
		================================================================================
		  [NB] WN - > R od wartości netto do rabatu
		  [NB WN-R]
		================================================================================
		Dane są:
		-> wart.Netto
		-> CNetto
		Obliczamy (ilosc) -> Rabat
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		*/
		SET 
			_CenaNetzRab = @p.cenanetZRab := _Rnd(IFNULL(_WartNetWal/_Ilosc, 0), @p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)),
			-- _Rabat = _Rnd(_WartNetWal/_CenaNet*_Ilosc, 4),
			_Rabat = IFNULL(_Rnd(100*(1-@p.cenanetZRab/_CenaNet), 4), _Rabat),
			_WartNet = @p.wartnet := _Rnd2(_WartNetWal*_Kurs + _WartClo + _Koszt_nabycia),											-- wersja z C_CalcOppo.pas
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartvat + @p.wartnet,
			-- _Cenabrt = IFNULL(_Rnd2((@p.wartvat + @p.wartnet)/_Ilosc), _Cenabrt),													-- wersja apro - interpretacja cenabrt to PLNy
			_WartBrtWal = @p.WartBrtWal := _Rnd2(_WartNetWal*(1 + @p.StawkaVat)),
			_Cenabrt = IFNULL(_Rnd(@p.WartBrtWal/_Ilosc, @p.CenyPrecision), _Cenabrt)																-- UWAGA Cenabrt zawiera wartosc w WALUCIE
		;
	END IF;
	
	IF _Algorytm = _BN_CN_WN THEN
		/*	
		_BN_CN_WN	CRodzaj_Przeliczenia_Brutto_Netto
		================================================================================
		  [BN]   CN - > WB -> WN wychodzące od cen netto
		  [BN CN-WN]
		================================================================================
		CRodzaj_Przeliczenia_Brutto_Netto     = 3; // z brutto->netto
		Dane są:
		-> CNetto
		-> Rabat
		Obliczamy (ilosc) -> wart.Netto
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		Obliczamy -> CBrutto (zaokrąglamy do groszy)
		Obliczamy z CBrutto -> wart.Brutto
		Obliczamy z wart.Brutto -> wart.Vat
		Obliczamy z wart.Brutto - wart.Vat -> wart.Netto
		*/
		SET 
			_WartNetwal = @p.wartnetwal := _Rnd2(_Ilosc * @p.cenanetZRab := (_Cenanet*(100 - _Rabat)/100)),
			_CenaNetzRab = @p.cenanetZRab,
			_WartNet = @p.wartnet := _Rnd2(@p.wartnetwal*_Kurs + _WartClo + _Koszt_nabycia),
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartbrt := @p.wartvat + @p.wartnet,
			_Cenabrt = @p.cenabrt := IFNULL(_Rnd2((@p.wartbrt)/_Ilosc*1/_Kurs), _Cenabrt),
			_WartBrt = @p.wartbrt := _Rnd2(@p.cenabrt*_Ilosc*_Kurs),
			_WartBrtWal = _Rnd2(@p.wartbrt/_Kurs),
			_WartNet = @p.wartnet := _Rnd2(@p.wartbrt/(1 + @p.StawkaVat)),
			_WartVat = @p.wartbrt - @p.wartnet
		;
	END IF;
	
	IF _Algorytm = _BN_WB_WN THEN
		/*	
		_BN_WB_WN	CRodzaj_Przeliczenia_Brutto_Netto2
		================================================================================
		  [BN]   WB - > WN wychodzące od wart.Brutto (w PLN)
		  [BN WB-WN]
		================================================================================
		CRodzaj_Przeliczenia_Brutto_Netto2     = 4; // z brutto->netto
		Dane są:
		-> Rabat = 0
		-> wart.Brutto (PLN)
		Obliczamy z wart.Brutto -> CBrutto (stawka)
		Obliczamy z wart.Brutto -> wart.Vat (stawka)
		Obliczamy z wart.Brutto - wart.Vat -> wart.Netto
		Obliczamy z wart.Netto -> CNetto (Ilosc)
		*/
		SET 
			_Rabat = 0,
			_WartBrtWal = @p.WartBrtWal := _Rnd2(_WartBrt/_Kurs),
			_Cenabrt = @p.cenabrt := IFNULL(_Rnd2((@p.WartBrtWal)/_Ilosc), _Cenabrt),
			_WartNet = @p.wartnet := _Rnd2(_WartBrt/(1 + @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id))),
			_WartVat = _Wartbrt - @p.wartnet,
			_WartNetwal = @p.WartNetwal := _Rnd2(_WartNet/_Kurs),
			_CenaNetzRab = @p.cenanetZRab := _Rnd(IFNULL(@p.WartNetwal/_Ilosc, 0), @p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)),
			_CenaNet = IFNULL(@p.cenanetZRab, _CenaNet)
		;
		
	END IF;
	
	IF _Algorytm IN (_BN_CB_WN, _BN_CB_WN_POS) THEN
		/*	
		_BN_CB_WN	CRodzaj_Przeliczenia_CenaBrutto_Netto
		================================================================================
		  [BN]   CB - > WN wychodzące od ceny Brutto [CB_WN]
		  [BN CB-WN]
		================================================================================
		CRodzaj_Przeliczenia_CenaBrutto_Netto     = 5; // z brutto->netto
		Dane są:
		-> CBrutto ( cennik.cena interpretowana jako BRUTTO!) _CenaBrt interpretowana jako walutowa! - sprawdzić w Delphi
		-> Rabat
		-> wart.Brutto
		Obliczamy (ilosc) -> wart.Brutto
		Obliczamy z wart.Brutto -> wart.Vat (stawka)
		Obliczamy z wart.Brutto - wart.Vat -> wart.Netto
		Obliczamy z wart.Netto -> CNetto (Ilosc)
		*/
		SET 
			_WartBrtWal = IF(_Algorytm = _BN_CB_WN,
				@p.wartBrtWal :=_Rnd2(_Ilosc * _CenaBrt*(100 - _Rabat)/100),	--	_BN_CB_WN
				@p.wartBrtWal :=_Rnd2(_Ilosc * _Rnd2(_CenaBrt*(100 - _Rabat)/100))	--	_BN_CB_WN_POS dla POS
			),
			_WartBrt = @p.wartbrt := _Rnd2(@p.wartBrtWal * _Kurs),
			_WartNet = @p.wartnet := _Rnd2(@p.wartbrt/(1 + @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id))),
			_WartVat = @p.wartbrt - @p.wartnet,
			_WartNetwal = @p.WartNetwal := _Rnd2(@p.wartBrtWal/(1 + @p.StawkaVat)),
			_CenaNetzRab = @p.cenanetZRab := _Rnd(IFNULL(@p.WartNetwal/_Ilosc, 0), @p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)),
			_CenaNet = @p.WartNetwal * 100/ (100 - _Rabat)*1/_Ilosc
		;
		
	END IF;
	
	SET 
		_WartNet = IFNULL(_WartNet, 0),
		_WartBrtWal = IFNULL(_WartBrtWal, 0)
	;	

END$$

DROP PROCEDURE IF EXISTS `CalcPo`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CalcPo`(
	IN _MODE VARCHAR(250),
	IN _Algorytm INTEGER,	-- VARCHAR(250),
	IN _IdnVat INTEGER,
	IN _Ilosc DECIMAL(16,4),
	INOUT _Wspolplatnosc DECIMAL(16,4),
	INOUT _Rabat DECIMAL(16,4),
	INOUT _CenaNet DECIMAL(16,4),
	INOUT _CenaNetPL DECIMAL(16,4),
	INOUT _CenaNetzRab DECIMAL(16,4),
	INOUT _CenaBrt DECIMAL(16,4),
	INOUT _WartNet DECIMAL(16,4),
	INOUT _WartNetWal DECIMAL(16,4),
	INOUT _StawkaVat DECIMAL(16,4),
	INOUT _WartVat DECIMAL(16,4),
	INOUT _WartBrt DECIMAL(16,4),
	INOUT _WartBrtEdit DECIMAL(16,4),
	INOUT _WartRabatNet DECIMAL(16,4),
	INOUT _WartRabatBrt DECIMAL(16,4),
	INOUT _Kurs DECIMAL(16,4),
	INOUT _Koszt_nabycia DECIMAL(16,4),
	INOUT _StawkaCla DECIMAL(16,4),
	INOUT _WartClo DECIMAL(16,4),
	INOUT _WartNetWalEdit DECIMAL(16,4),
	INOUT _Oplata_produktowa DECIMAL(16,4),
	IN _IsKorekta BOOLEAN,
	IN _IsWalutowa BOOLEAN,
	IN _Param_A VARCHAR(50),	
	IN _Param_B VARCHAR(50),	
	IN _Param_C VARCHAR(50),	
	IN _Param_D VARCHAR(50)	
)

/*
  var aWspolplatnosc, aRabat, aCenaNet, aCenaNetPL, aCenaNetzRab, aWartNet, aWartNetWal,
  aStawkaVat, aWartVat, aWartBrt, aCenaBrt, aWartBrtEdit, aWartRabatNet, aWartRabatBrt, aKurs, akoszt_nabycia,
  aStawkaCla, aWartClo, aWartNetWalEdit, aOplata_produktowa: Currency; aIsKorekta, aIsWalutowa: Boolean);
  
	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,
		'', '', '', '');
*/
BEGIN 
--	standardowe przeliczenie cena net.->rabat->wart.wal.
	DECLARE _NB_CN_WN  INTEGER DEFAULT 0;	-- CRodzaj_Przeliczenia_CenaNet_NettoWal
--	z wart.wal->(rabat nie ruszany)->cena net.	
	DECLARE _NB_WN_CN  INTEGER DEFAULT 1;	-- CRodzaj_Przeliczenia_NettoWal_CenaNet
--	z wart.wal->rabat	
	DECLARE _NB_WN_R   INTEGER DEFAULT 2;	-- CRodzaj_Przeliczenia_NettoWal_Rabat
--	fiskalne z brutto->netto  (fiskalne)	z ceny netto -> wrt brutto, -> ceny brutto (zaokr), -> i dalej jak dla _BN_CB_WN
	DECLARE _BN_CN_WN  INTEGER DEFAULT 3;	-- CRodzaj_Przeliczenia_Brutto_Netto
--	z wart brutto->netto							
	DECLARE _BN_WB_WN  INTEGER DEFAULT 4;	-- CRodzaj_Przeliczenia_Brutto_Netto2
--	z ceny brutto->netto	
	DECLARE _BN_CB_WN  INTEGER DEFAULT 5;	-- CRodzaj_Przeliczenia_CenaBrutto_Netto
--	z wart.wal->(rabat nie ruszany)->cena net. wart vat edytowana	
	DECLARE _BN_WN_CNve  INTEGER DEFAULT 6;	-- CRodzaj_Przeliczenia_NettoWal_CenaNet_VatEdyt
--	zmienna przelicznika
	DECLARE _Przelicznik  INTEGER DEFAULT _NB_CN_WN;	
	
	SET
		_Koszt_nabycia = IFNULL(_Koszt_nabycia, 0),
		_StawkaCla = IFNULL(_StawkaCla, 0),
		_WartClo = IFNULL(_WartClo, 0), 
		_WartNetWalEdit = IFNULL(_WartNetWalEdit, 0),
		_Oplata_produktowa = IFNULL(_Oplata_produktowa, 0)
	;
	
	IF _Algorytm = _NB_CN_WN THEN
		/*	
		_NB_CN_WN	CRodzaj_Przeliczenia_CenaNet_NettoWal
		================================================================================
		  [NB]   CN - > WN - klasyczne od ceny netto
		  [NB CN-WN]
		================================================================================
		Dane są:
		-> CNetto
		-> Rabat
		Obliczamy (ilosc) -> wart.Netto.wal -> wart.Netto
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		Obliczamy -> cena.Brutto
		*/
		SET 
			_WartNetWal = @p.wartnetwal:=_Rnd2(_Ilosc * @p.cenanetZRab:=(_Cenanet*(100-_Rabat)/100)),
			_CenaNetzRab = @p.cenanetZRab,
		--	_WartNet = @p.wartnet := _Rnd2(@p.wartnetwal * kurs),																	-- wersja apro
			_WartNet = @p.wartnet := _Rnd2(@p.wartnetwal*_Kurs + _WartClo + _Koszt_nabycia),										-- wersja z C_CalcOppo.pas
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartvat + @p.wartnet,
			_Cenabrt = IFNULL(_Rnd2((@p.wartvat + @p.wartnet)/_ilosc), _Cenabrt)													-- wersja apro
		--	cenabrt = _Rnd2(@p.cenanetZRab*(1 + @p.StawkaVat))																		-- wersja z C_CalcOppo.pas
		;
	END IF;

	IF _Algorytm = _NB_WN_CN THEN
		/*	
		_NB_WN_CN	CRodzaj_Przeliczenia_NettoWal_CenaNet
		================================================================================
		  [NB] WN - > CN od wartości netto do ceny netto
		  [NB WN-CN]
		================================================================================
		Dane są:
		-> wart.Netto
		-> Rabat
		Obliczamy (ilosc) -> CNetto
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		*/
		SET 
			_CenaNet = _Rnd(100*(@p.cenanetZRab:= IFNULL(_WartNetWal/_Ilosc, 0))/(100-_Rabat), @p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)),
			_CenaNetzRab = @p.cenanetZRab,
			_WartNet = @p.wartnet := _Rnd2(_WartNetWal*_Kurs + _WartClo + _Koszt_nabycia),											-- wersja z C_CalcOppo.pas
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartvat + @p.wartnet,
			_Cenabrt = IFNULL(_Rnd2((@p.wartvat + @p.wartnet)/_Ilosc), _Cenabrt)													-- wersja apro - interpretacja cenabrt to PLNy
		;
	END IF;
	
	IF _Algorytm = _NB_WN_R THEN
		/*	
		_NB_WN_R	CRodzaj_Przeliczenia_NettoWal_Rabat
		!!!!!!!!!!!!!!!!!!!  UWAGA Chyba nie obsługujemy tego !!!!!!!!!!!!!!!!!!!
		================================================================================
		  [NB] WN - > R od wartości netto do rabatu
		  [NB WN-R]
		================================================================================
		Dane są:
		-> wart.Netto
		-> CNetto
		Obliczamy (ilosc) -> Rabat
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		*/
		SET 
			_CenaNet = _Rnd(100*(@p.cenanetZRab:= IFNULL(_WartNetWal/_Ilosc, 0))/(100-_Rabat), @p.CenyPrecision := IF(_Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN)),
			_CenaNetzRab = @p.cenanetZRab
		;
	END IF;
	
	IF _Algorytm = _BN_CN_WN THEN
		/*	
		_BN_CN_WN	CRodzaj_Przeliczenia_Brutto_Netto
		================================================================================
		  [BN]   CN - > WB -> WN wychodzące od cen netto
		  [BN CN-WN]
		================================================================================
		CRodzaj_Przeliczenia_Brutto_Netto     = 3; // z brutto->netto
		Dane są:
		-> CNetto
		-> Rabat
		Obliczamy (ilosc) -> wart.Netto
		Obliczamy -> wart.Vat
		Obliczamy -> wart.Brutto
		Obliczamy -> CBrutto (zaokrąglamy do groszy)
		Obliczamy z CBrutto -> wart.Brutto
		Obliczamy z wart.Brutto -> wart.Vat
		Obliczamy z wart.Brutto - wart.Vat -> wart.Netto
		*/
		SET 
			_WartNetwal = @p.wartnetwal:=_Rnd2(_ilosc * @p.cenanetZRab := (_Cenanet*(100 - _Rabat)/100)),
			_CenaNetzRab = @p.cenanetZRab,
			_WartNet = @p.wartnet := _Rnd2(@p.wartnetwal*_Kurs + _WartClo + _Koszt_nabycia),
			_WartVat = @p.wartvat := _Rnd2(@p.wartnet * @p.StawkaVat := (SELECT v.value FROM v_erp_vat v WHERE _idnvat=v.id)),
			_WartBrt = @p.wartbrt:=@p.wartvat + @p.wartnet,
			_Cenabrt = @p.cenabrt :=IFNULL(_Rnd2((@p.wartbrt)/_ilosc), _Cenabrt),
			_WartBrt = @p.wartbrt:=_Rnd2(@p.cenabrt*_ilosc),
			_WartNet = @p.wartnet := _Rnd2(@p.wartbrt/(1 + @p.StawkaVat)),
			_WartVat = @p.wartbrt - @p.wartnet
		;
	END IF;
	
	IF _Algorytm = _BN_WB_WN THEN
		/*	
		_BN_WB_WN	CRodzaj_Przeliczenia_Brutto_Netto2
		================================================================================
		  [BN]   WB - > WN wychodzące od wart.Brutto
		  [BN WB-WN]
		================================================================================
		CRodzaj_Przeliczenia_Brutto_Netto2     = 4; // z brutto->netto
		Dane są:
		-> Rabat = 0
		-> wart.Brutto
		Obliczamy z wart.Brutto -> CBrutto (stawka)
		Obliczamy z wart.Brutto -> wart.Vat (stawka)
		Obliczamy z wart.Brutto - wart.Vat -> wart.Netto
		Obliczamy z wart.Netto -> CNetto (Ilosc)
		*/
		SET 
			@X = 1
		;
	END IF;
	
	IF _Algorytm = _BN_CB_WN THEN
		/*	
		_BN_CB_WN	CRodzaj_Przeliczenia_CenaBrutto_Netto
		================================================================================
		  [BN]   CB - > WN wychodzące od ceny Brutto [CB_WN]
		  [BN CB-WN]
		================================================================================
		CRodzaj_Przeliczenia_CenaBrutto_Netto     = 5; // z brutto->netto
		Dane są:
		-> CBrutto ( cennik.cena interpretowana jako BRUTTO!)
		-> Rabat
		-> wart.Brutto
		Obliczamy (ilosc) -> wart.Brutto
		Obliczamy z wart.Brutto -> wart.Vat (stawka)
		Obliczamy z wart.Brutto - wart.Vat -> wart.Netto
		Obliczamy z wart.Netto -> CNetto (Ilosc)
		*/
		SET 
			@X = 1
		;
	END IF;
	
	SET 
		_WartNet = IFNULL(_WartNet, 0)
	;	

END$$


/* ************************************************************************************************************************************************************************
	inicjalne 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `oppo_calc_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_calc_init`(
	IN _MODE VARCHAR(250)
)
BEGIN 
	SET @ht._calc_init = TRUE;

END$$


/* ************************************************************************************************************************************************************************
	Narzędzia do `ng_e_rec`
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `_ng_e_rec_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_e_rec_init`(
	IN _MODE VARCHAR(250),	--	_handle_oper -- INSERT, EDIT, DELETE',
	IN _handle_FROM VARCHAR(250),	-- OP lub ZM ...?
	IN _Key VARCHAR(38),
	IN _handle_UserGUID VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL _ng_e_rec_init('INSERT', 'OP', 'x', 'jmam', '', '');
	CALL _ng_e_rec_init('EDIT', 'OP', '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}', 'jmam', '', '');
	CALL _ng_e_rec_init('Check.before.handle', 'OP', '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}', 'jmam', '', '');
	CALL _ng_e_rec_init('INSERT', 'ZM', 'x', 'jmam', '', '');
*/
S_ng_e_rec_init: BEGIN 
	DECLARE _Rec_Is_Locked BOOLEAN DEFAULT FALSE;
	DECLARE _Rec_Is_Locked_MSG TEXT;
	
	CALL ht_init_const('');
	SET @_ng_e_rec_init.Msg = '';

	CALL _ng_e_rec_msg_clear('', _Key, 'handle.init', '');
	
	IF _MODE = 'Check.before.handle' THEN
	--	Czy zablokowany?
		CALL _lock_inf_tool('Check.before.lock', _Key, IF(_handle_FROM != 'ZM', 'opng', 'zmng'), _handle_UserGUID, _Rec_Is_Locked, _Rec_Is_Locked_MSG, '', '1');
		/*
		SELECT
			@t_Check_before_lock.LockUserGUID,
			@t_Check_before_lock.LockSession,
			@t_Check_before_lock.Inf,
			@t_Check_before_lock.IsSameUser,
			@t_Check_before_lock.IsSameSession,
			@t_Check_before_lock.LockSession_Exist,
			@t_Check_before_lock.LockUserFullName,
			@t_Check_before_lock._State,
			@t_Check_before_lock._StateMsg
		;
		*/
		IF NOT (@t_Check_before_lock._State IN ('0.OK', '2.JA/Ta sesja')) THEN
		CALL _ng_e_rec_msg_ins('', '', _Key, 'handle.init', 
			@t_Check_before_lock._StateMsg,
			CASE @t_Check_before_lock._State
			WHEN '1.Blokada' THEN 'Error'
			WHEN '3.JA/inna sesja' THEN 'Ask'
			WHEN '4.JA/zamknieta sesja' THEN 'Ask'
			END, 
			CASE @t_Check_before_lock._State
			WHEN '1.Blokada' THEN 'Stop'
			WHEN '3.JA/inna sesja' THEN 'Stop'
			WHEN '4.JA/zamknieta sesja' THEN 'Clear'
			END, 
			'', '');
	
		END IF;
		LEAVE S_ng_e_rec_init;
	END IF;
	
	IF _MODE != 'INSERT' THEN
		
	--	Czy zablokowany?
		SET @_ng_e_rec_init._Rec_Is_Locked = 0, @_ng_e_rec_init.Msg = '';
		SET @ROW_COUNT = -1;

		CALL _lock_inf_tool('LOCK', _Key, IF(_handle_FROM != 'ZM', 'opng', 'zmng'), _handle_UserGUID, _Rec_Is_Locked, _Rec_Is_Locked_MSG, '', '1');
	END IF;
	
	
	-- IF @_ng_e_rec_init._Rec_Is_Locked = 0 THEN
	IF NOT _Rec_Is_Locked THEN
	--	NIE zablokowany
		INSERT IGNORE INTO `ng_e_rec`
		(GUID, handle_FROM, handle_oper, handle_UserGUID)
		VALUES
		(_Key, _handle_FROM, _MODE, _handle_UserGUID)
		;
		UPDATE `ng_e_rec` r
		SET
			r.Handle_Check = -1 --	sprawdz semafor
		WHERE
			r.GUID = _Key
		;
		
		/*
		IF _MODE != 'INSERT' THEN
		
			UPDATE `ng_e_rec` r, `opng` n
			SET
				r.Rodzaj = n.Rodzaj, 
				r.Rodzaj_Typ = n.Rodzaj_Typ, 
				r.i_Calc_Ver = n.Calc_Ver, 
				r.i_KontrGUID = n.KontrGUID, 
				r.i_Magazyn1_Kasa = n.Zmagazynu, 
				r.i_Magazyn2 = n.Domagazynu, 
				r.i_Tymczasowa = n.Tymczasowa, 
				r.i_Waluta = n.Waluta, 
				r.i_OsobaGUID = n.OsobaGUID, 
				r.i_AreaGUID = n.AreaGUID, 
				r.i_fvrudowz = n.fvrudowz 
			WHERE
				r.GUID = _Key
				AND
				n.GUID = _Key
			;	
		END IF;
		*/
		/*
		CALL _ng_e_rec_msg_ins('', '', _Key, 'handle.init', 
			CONCAT(@ROW_COUNT, 
						' @JakiUpdate ', @JakiUpdate,
						' @JakiUser ', @JakiUser,
						' - ',

			@ROW_COUNT, ' / ', _Rec_Is_Locked, ' / ', _Key, ' / ', _Rec_Is_Locked_MSG, ' / ', _handle_FROM, ' / ', _handle_UserGUID), 
			'Msg', '', '', '');
		*/
	ELSE
		CALL _ng_e_rec_msg_ins('', '', _Key, 'handle.init', 
			CONCAT(
				_Rec_Is_Locked_MSG
			),
			-- _res_str_get( 'Brak danych do zapisu - anuluj zmiany!!!', ''),
			'Error', 'Stop', '', '');
		
	END IF;
	IF _Param_A = '' THEN

		-- SELECT @_ng_e_rec_init._Rec_Is_Locked AS _Rec_Is_Locked, (@_ng_e_rec_init.Msg) AS _Rec_Is_Locked_MSG;
		SELECT _Rec_Is_Locked, _Rec_Is_Locked_MSG;
	END IF;
END$$

DROP PROCEDURE IF EXISTS `_ng_e_rec_do`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_e_rec_do`(
	IN _MODE VARCHAR(250),	-- 'check.semafor' semafor/ 'check.upr.1' sprawdz uprawnienie BEFORE	przed operacja/	'check.upr.2' sprawdz uprawnienie ON/AFTER	w trakcie operacji
	IN _Key VARCHAR(38),
	-- IN _handle_Check INTEGER,	-- -1 semafor/ 1 sprawdz uprawnienie BEFORE	przed operacja/	2 sprawdz uprawnienie ON/AFTER	w trakcie operacji
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL _ng_e_rec_do('check.semafor', 'x', '', '');	-- sprawdz semafor
	CALL _ng_e_rec_do('check.upr.1', 'x', '', '');		-- sprawdz uprawnienie BEFORE	przed operacja
	CALL _ng_e_rec_do('check.upr.2', 'x', '', '');		-- sprawdz uprawnienie ON/AFTER	w trakcie operacji
	
	CALL _ng_e_rec_do('create', 'x', '', '');	-- stworz rekord opng_e lub zmng_e (o ile jest to handle_oper = 'INSERT'

	CALL _ng_e_rec_do('select', '_Key', '', '');	-- zwróć wszystkie ustawienia (kolumny `ng_e_rec`, `operdoc` i `operdoc`
	CALL _ng_e_rec_do('select.into', _Key, '', '');	

	CALL _ng_e_rec_do('check.kontrahent', _Key, _KontrGUID, '');	--	zwraca informacje nt kontrahenta w tym także czy nie jest zablokowany
	CALL _ng_e_rec_do('check.kontrahent', @IdnOper, '{9F42245E-6AEB-4852-8E79-C52F186E01B6}', '');	--	zwraca informacje nt kontrahenta w tym także czy nie jest zablokowany
	CALL _ng_e_rec_do('check.kontrahent', @IdnOper, 'ABC', '');	--	zwraca informacje nt kontrahenta w tym także czy nie jest zablokowany
	
*/
S_ng_e_rec_do: BEGIN 
	IF _MODE LIKE 'check.%' THEN
	/**********************************************************************************************************************************
	Sprawdzanie: semafora, uprawnienia  (w triggerze `ng_e_rec`
	**********************************************************************************************************************************/
		IF _MODE = 'check.semafor' THEN
			UPDATE `ng_e_rec`
			SET
				Handle_Check = -1 --	sprawdz semafor (w triggerze `ng_e_rec`
			WHERE
				GUID = _Key
			;	
		END IF;	
		
		IF _MODE = 'check.upr.1' THEN
			UPDATE `ng_e_rec`
			SET
				Handle_Check = 1 --	sprawdz uprawnienie BEFORE	przed operacja (w triggerze `ng_e_rec`
			WHERE
				GUID = _Key
			;	
		END IF;	
		
		IF _MODE = 'check.upr.2' THEN
			UPDATE `ng_e_rec`
			SET
				Handle_Check = 2 --	sprawdz uprawnienie ON/AFTER	w trakcie operacji (w triggerze `ng_e_rec`
			WHERE
				GUID = _Key
			;	
		END IF;	
	END IF;	
	
	IF _MODE = 'select.into' THEN
	/**********************************************************************************************************************************
	zwróć wszystkie ustawienia w zmiennych
	**********************************************************************************************************************************/
		SELECT
			r.OpTyp, 
			r.i_KontrGUID,
			r.i_Calc_Ver, 
			r.i_fvrudowz,
			r.handle_oper,
			r.handle_FROM,
			i_MODE,
			i_Input_GUID,
			r.i_Magazyn1_Kasa, 
			r.i_Magazyn2 
			
		FROM `ng_e_rec` r
		WHERE
			r.GUID = _Key
		INTO
			@OpTyp,
			@i_KontrGUID,
			@i_Calc_Ver,
			@i_fvrudowz,
			@handle_oper,
			@handle_FROM,
			@i_MODE,
			@i_Input_GUID,
			@i_Magazyn1_Kasa, 
			@i_Magazyn2 
		;	
	END IF;	
	
	IF _MODE = 'select' THEN
	/**********************************************************************************************************************************
	zwróć wszystkie ustawienia (kolumny `ng_e_rec`, `operdoc` i `operdoc`
	**********************************************************************************************************************************/
		CALL _ng_e_rec_do('select.into', _Key, '', '');	
		
		IF @handle_FROM = 'OP' THEN
			SELECT
				n.Idn,
				n.Rodzaj,
				IFNULL(n.Rodzaj_Typ, u.Rodzaj_Typ) AS Rodzaj_Typ,
				o.MagTyp,
				_VarStr_NotNull(
				IF(u.Rodzaj IN (@ht.CKPKP, @ht.CKWKW, @ht.CRKBO), 
					n.nrdokkas,
					IF(u.Rodzaj IN (@ht.CBNWN, @ht.CBNMA),
						n.nrraportu,
						IF(u.Optyp = @ht.MG,
							n.NrDokMag,
							n.NrDokFin
						)
					)
				)) AS NrDok,
				n.NrDokMag,
				n.nrwewn,
				n.NrFvWewn,
				IF(IFNULL(u.i_Magazyn1_Kasa, 0) = 0, n.ZMagazynu, u.i_Magazyn1_Kasa) AS i_Magazyn1_Kasa,
				IF(IFNULL(u.i_Magazyn2, 0) = 0, n.DoMagazynu, u.i_Magazyn2) AS i_Magazyn2,
				m1.Opis AS i_Magazyn1_Kasa_Str,
				m2.Opis AS i_Magazyn2_Str,
				n.KontrGUID,
				n.Waluta,
				n.Kurs
			FROM `ng_e_rec` u
			LEFT JOIN `opng_e` n ON n.GUID = u.GUID
			LEFT JOIN `operdoc` o ON o.Rodzaj = IFNULL(n.Rodzaj, u.Rodzaj)
			-- LEFT JOIN `operdoc_typy` p ON p.Rodzaj = o.Rodzaj AND p.Typ = IFNULL(n.Rodzaj_Typ, u.Rodzaj_Typ)
			-- LEFT JOIN `kontrah` k ON k.GUID = n.KontrGUID
			-- LEFT JOIN `waluty` w ON w.Idn = n.Waluta
			LEFT JOIN `Magazyny` m1 ON m1.IdnMagazynu = IF(IFNULL(u.i_Magazyn1_Kasa, 0) = 0, n.ZMagazynu, u.i_Magazyn1_Kasa) 
			LEFT JOIN `Magazyny` m2 ON m2.IdnMagazynu = IF(IFNULL(u.i_Magazyn2, 0) = 0, n.DoMagazynu, u.i_Magazyn2) 
			WHERE
				u.GUID = _Key
			INTO
				@n.Idn,
				@n.Rodzaj,
				@n.Rodzaj_Typ,
				@o.MagTyp,
				@n.NrDok,
				@n.NrDokMag,
				@n.nrwewn,
				@n.NrFvWewn,
				@.i_Magazyn1_Kasa,
				@.i_Magazyn2,
				@.i_Magazyn1_Kasa_Str,
				@.i_Magazyn2_Str,
				@n.KontrGUID,
				@n.Waluta,
				@n.Kurs
			;

			
			IF @o.MagTyp = @ht.mtPZ THEN
				SET 
					@.FMagCommentA := _VarStr(REPLACE('Do magazynu "%s"', '%s', @.i_Magazyn2_Str)),
					@.FMagCommentB := _VarStr(REPLACE('-> %d', '%d', @.i_Magazyn2))
				;
			ELSEIF @o.MagTyp = @ht.mtRZ THEN
				SET 
					@.FMagCommentA := _VarStr(REPLACE('Z magazynu "%s"', '%s', @.i_Magazyn1_Kasa_Str)),
					@.FMagCommentB := _VarStr(REPLACE('%d ->', '%d', @.i_Magazyn1_Kasa))
				;
			ELSE
				SET 
					@.FMagCommentA := _VarStr(REPLACE(REPLACE('Z magazynu "%s1" do magazynu "%s2"', '%s1', @.i_Magazyn1_Kasa_Str), '%s2', @.i_Magazyn2_Str)),
					@.FMagCommentB := _VarStr(REPLACE(REPLACE('%d1 -> %d2', '%d1', @.i_Magazyn1_Kasa), '%d2', @.i_Magazyn2))
				;
			END IF;
			
			IF @session.globals.Owner = 'SKOK' THEN
				SET @.FMagCommentA := REPLACE(@.FMagCommentA, 'magazynu', 'zestawu');
			END IF;
			
		ELSE	--	ZM
		
			SELECT
				n.Idn,
				n.Rodzaj,
				IFNULL(n.Rodzaj_Typ, u.Rodzaj_Typ) AS Rodzaj_Typ,
				o.MagTyp,
				_VarStr_NotNull(n.nrzamw) AS NrDok,
				'' AS NrDokMag,
				'' AS nrwewn,
				'' AS NrFvWewn,
				IF(IFNULL(u.i_Magazyn1_Kasa, 0) = 0, n.idnmagazyn, u.i_Magazyn1_Kasa) AS i_Magazyn1_Kasa,
				IF(IFNULL(u.i_Magazyn2, 0) = 0, n.MagazynWys, u.i_Magazyn2) AS i_Magazyn2,
				m1.Opis AS i_Magazyn1_Kasa_Str,
				m2.Opis AS i_Magazyn2_Str,
				n.KontrGUID,
				n.Waluta,
				n.Kurs
			FROM `ng_e_rec` u
			LEFT JOIN `zmng_e` n ON n.GUID = u.GUID
			LEFT JOIN `operdoc` o ON o.Rodzaj = IFNULL(n.Rodzaj, u.Rodzaj)
			-- LEFT JOIN `operdoc_typy` p ON p.Rodzaj = o.Rodzaj AND p.Typ = IFNULL(n.Rodzaj_Typ, u.Rodzaj_Typ)
			-- LEFT JOIN `kontrah` k ON k.GUID = n.KontrGUID
			-- LEFT JOIN `waluty` w ON w.Idn = n.Waluta
			LEFT JOIN `Magazyny` m1 ON m1.IdnMagazynu = IF(IFNULL(u.i_Magazyn1_Kasa, 0) = 0, n.idnmagazyn, u.i_Magazyn1_Kasa) 
			LEFT JOIN `Magazyny` m2 ON m2.IdnMagazynu = IF(IFNULL(u.i_Magazyn2, 0) = 0, n.MagazynWys, u.i_Magazyn2) 
			WHERE
				u.GUID = _Key
			INTO
				@n.Idn,
				@n.Rodzaj,
				@n.Rodzaj_Typ,
				@o.MagTyp,
				@n.NrDok,
				@n.NrDokMag,
				@n.nrwewn,
				@n.NrFvWewn,
				@.i_Magazyn1_Kasa,
				@.i_Magazyn2,
				@.i_Magazyn1_Kasa_Str,
				@.i_Magazyn2_Str,
				@n.KontrGUID,
				@n.Waluta,
				@n.Kurs
			;
			--			@OpTyp,
			SET @.FMagCommentA := _VarStr(REPLACE('Na magazyn "%s"', '%s', @.i_Magazyn1_Kasa_Str));
			IF @n.Rodzaj IN (@ht.CZmOO, @ht.CZmEx, @ht.CZmZP, @ht.CZMWE) THEN
				IF @.i_Magazyn1_Kasa != @.i_Magazyn2 THEN
					CASE _Def_Obj
						WHEN @ht.CZmZP THEN 
							SET @.FMagCommentA = _VarStr(REPLACE(REPLACE('Materiały i surowce z "%s1", produkowany na "%s1"', '%s1', @.i_Magazyn1_Kasa_Str), '%s2', @.i_Magazyn2_Str));
						WHEN @ht.CZMWE THEN 
							SET @.FMagCommentA = _VarStr(REPLACE(REPLACE('Z magazynu "%s1", wysyłany na "%s2"', '%s1', @.i_Magazyn1_Kasa_Str), '%s2', @.i_Magazyn2_Str));
						ELSE
							SET @.FMagCommentA = _VarStr(REPLACE(REPLACE('Na magazyn "%s1", wysyłany z "%s2"', '%s1', @.i_Magazyn1_Kasa_Str), '%s2', @.i_Magazyn2_Str));
					END CASE;
				
				END IF;
				SET @.FMagCommentB = _VarStr(REPLACE('%d ->', '%d', @.i_Magazyn2));
			ELSE
				SET @.FMagCommentB = _VarStr(REPLACE('-> %d', '%d', @.i_Magazyn2));
			END IF;
		END IF;	--	ZM
		
		
		
		SELECT 
			u.*,
			o.antyrodzaj, o.grupa, o.Twtyp, o.MagTyp, o.Rztyp, o.Fntyp, IFNULL(o.wzordekr, '') AS wzordekr, o.rv_id, o.RodzajDowodu, o.ugrpGUID, 
			o.Nazwa, o.Opis, o.upr_optyp, o.upr_rodzaj,
			o.IsWaluta, o.IsRozrachunek, o.IsPozycjeVisible, o.MA_Magzyny, o.MA_Detale, o.MA_Kontrahenta, o.IsKorekta, o.IsPodlegaVAT, o.IsTabelkaVatEditable, o.IsSprzedazNieKrajowa, o.IsDostawa, o.IsWlasny,
			
			-- o.*,
			p.*,
			(status_before = -1 AND status_after = 0) AS Instancje_Kreowanie, 
			(status_before = 0 AND status_after = -1) AS Instancje_Likwidacja,
			IF(o.TwTyp = @ht.TwZm,
				u.i_Magazyn1_Kasa,
				IF(o.TwTyp = @ht.TwRZ,
					u.i_Magazyn1_Kasa,
					u.i_Magazyn2
				)
			) AS IdnMagazynuByTwTyp,
			IF(o.TwTyp = @ht.TwZm,
				_varInt(1),
				IF(o.TwTyp IN (@ht.TwRZ, @ht.TwMM),
					_varInt(1),
					_varInt(0)
				)
			) AS IsMag_1,
			IF(o.TwTyp = @ht.TwZm,
				_varInt(1),
				IF(o.TwTyp IN (@ht.TwPZ, @ht.TwMM),
					_varInt(1),
					_varInt(0)
				)
			) AS IsMag_2,
			o.FVdoWZPZ AND
				IF(o.TwTyp = @ht.TwPZ,
					IFNULL(@session.HT.IR.PytajoFVdoPZ, FALSE),
					IFNULL(@session.HT.IR.PytajoFVdoWZ, FALSE)
				)
			AS IsFVdoWZPZ,
			o.DefaultTymczasowa,
			
			m1.Opis AS i_Magazyn1_Kasa_Str,
			m2.Opis AS i_Magazyn2_Str,
			
			_VarStr(CONCAT(
				'Dok: ', o.Nazwa, ' (', o.Opis, ')',
				IF(@n.NrDok != '', CONCAT(' - Nr: ', @n.NrDok), '')
			)) AS LabelInfo1,
			
			_VarStr(CONCAT(
				@.FMagCommentA, ' (', @.FMagCommentB, ')'
			)) AS LabelInfo2,
			
			_VarStr(CONCAT('Id: ', 
				IF(@n.Idn = 0, '?', @n.Idn) 
			)) AS LabelInfo3,
			
			_VarStr(CONCAT(
				IF(k.GUID IS NOT NULL,
					CONCAT(
						IF(k.dostawca != 0,
							'Dostawca',
							'Odbiorca'
						),
						'(', k.Symbol, ') ', k.Nazwa
					),
					''
				)
			)) AS LabelInfo4,
			
			_VarStr(
				IF(o.IsWaluta AND (IFNULL(w.IDN, 0) != 0),
					CONCAT(
						w.NazwaWaluty,
						' (', 
						IF(NOT o.IsSprzedazNieKrajowa, 'kurs', 'rate'), 
						': ', @n.Kurs, ')'
					),
					''
				)
			) AS LabelInfo5,
			o.ZezwalajNaGrupowaniePozycji
			
			-- o.Ma_detale AS DefaultTymczasowa
/*			
(CRdzOper[FCRdzOperIdx{slon to co u gory FNgTransact.FRodzaj}].FVdoWZPZ=1) and
    ((FFVdoPZ and (CRdzOper[FCRdzOperIdx{slon to co u gory FNgTransact.FRodzaj}].twtyp=twPZ)) or
    (FFVdoWZ and (CRdzOper[FCRdzOperIdx{slon to co u gory FNgTransact.FRodzaj}].twtyp=twRZ))
    )
*/
		FROM `ng_e_rec` u
		-- LEFT JOIN `opng_e` n ON n.GUID = u.GUID
		LEFT JOIN `operdoc` o ON o.Rodzaj = @n.Rodzaj
		LEFT JOIN `operdoc_typy` p ON p.Rodzaj = o.Rodzaj AND p.Typ = @n.Rodzaj_Typ
		LEFT JOIN `kontrah` k ON k.GUID = @n.KontrGUID
		LEFT JOIN `waluty` w ON w.Idn = @n.Waluta
		LEFT JOIN `Magazyny` m1 ON m1.IdnMagazynu = u.i_Magazyn1_Kasa 
		LEFT JOIN `Magazyny` m2 ON m2.IdnMagazynu = u.i_Magazyn2 
		WHERE
			u.GUID = _Key
		;
	END IF;	
	
	IF _MODE = 'create' THEN
	/**********************************************************************************************************************************
	Kreowanie
	**********************************************************************************************************************************/
		SELECT
			r.handle_FROM,
			r.handle_oper,
			r.handle_status
		FROM `ng_e_rec` r
		WHERE
			r.GUID = _Key
		INTO 
			@_ng_e_rec_do.create.handle_FROM,
			@_ng_e_rec_do.create.handle_oper,
			@_ng_e_rec_do.create.handle_status
		;
		IF (@_ng_e_rec_do.create.handle_status != 0) OR (@_ng_e_rec_do.create.handle_oper != 'INSERT') THEN 
			LEAVE S_ng_e_rec_do;
		END IF;
		
		IF @_ng_e_rec_do.create.handle_FROM = 'OP' THEN
			/**********************************************************************************************************************************
			opng_e
			**********************************************************************************************************************************/
			INSERT IGNORE INTO `opng_e`
				(
				GUID, tag, Rodzaj, Rodzaj_typ, DataWystaw, idnuser, 
				Calc_Ver,
				fvrudowz,
					rozrachunek
				)
			SELECT
				r.GUID, -1, r.Rodzaj, r.Rodzaj_typ, CURRENT_DATE(), IFNULL(@session.Registration.IdnUser, @session.CheckLogonUserLogin), 
				r.i_Calc_Ver, 
				r.i_fvrudowz,
					0
			FROM `ng_e_rec` r
			WHERE
				r.GUID = _Key
			;
			
			UPDATE `opng_e` n, `ng_e_rec` r
			SET
				n.Tag = -1,	 -- Inicjowanie rekordu (potem Tag wraca na stara wartosc
				n.KontrGUID = r.i_KontrGUID, 
				n.zmagazynu = r.i_Magazyn1_Kasa, 
				n.domagazynu = r.i_Magazyn2, 
				n.tymczasowa = r.i_Tymczasowa,
				n.Waluta = r.i_Waluta, 
				n.Waluta_Rozliczen = r.i_Waluta, 
				n.OsobaGUID = IFNULL(r.i_OsobaGUID, ''),
				n.AreaGUID = IFNULL(r.i_AreaGUID, '')
			WHERE
				r.GUID = _Key
				AND
				n.GUID = r.GUID
			;	
			
			-- slon dodal to zeby ustawiac flage nettodorozrach nie wiem czy slusznie i czy tu chcesz miec to ustawiane
			-- mozesz odrazu w pozniejszym terminie dorobic dla nie walutowych 
			
			UPDATE `opng_e` oe, `operdoc` od 
			SET 
				oe.NettoDoRozrach = od.NettoDoRozrachWal 
			WHERE 
				oe.rodzaj = od.rodzaj 
				AND 
				oe.waluta_rozliczen > 0 
				AND 
				oe.guid = _Key;
	
			
		ELSE	
			/**********************************************************************************************************************************
			zmng_e
			**********************************************************************************************************************************/
			INSERT IGNORE INTO `zmng_e`
				(
				GUID, Rodzaj, Rodzaj_typ, DataWystaw, idnuser, 
				Calc_Ver
				)
			SELECT
				r.GUID, r.Rodzaj, r.Rodzaj_typ, CURRENT_DATE(), IFNULL(@session.Registration.IdnUser, @session.CheckLogonUserLogin), 
				r.i_Calc_Ver 
			FROM `ng_e_rec` r
			WHERE
				r.GUID = _Key
			;
			UPDATE `zmng_e` n, `ng_e_rec` r
			SET
				n.KontrGUID = r.i_KontrGUID, 
				n.IDNMagazyn = r.i_Magazyn1_Kasa, 
				n.MagazynWys = r.i_Magazyn2, 
				n.tymczasowa = r.i_Tymczasowa,
				n.Waluta = r.i_Waluta, 
				n.OsobaGUID = IFNULL(r.i_OsobaGUID, ''),
				n.AreaGUID = IFNULL(r.i_AreaGUID, '')
			WHERE
				r.GUID = _Key
				AND
				n.GUID = r.GUID
			;	
		END IF;
	END IF;	
	
	IF _MODE = 'check.kontrahent' THEN
	/**********************************************************************************************************************************
	Kontrahent - zwraca informacje nt kontrahenta w tym także czy nie jest zablokowany
	**********************************************************************************************************************************/
		SET
			@Kontrah_Invalid_Msg = '',
			@Kontrah_Msg = ''
		;
		SELECT 
			_VarInt(0) AS Kontrah_Is_not_OK,
			k.Blokujsprzedaz, 
			k.blokada_zwrotow,
			k.Nazwa,
			k.Symbol,
			r.Rodzaj,
			o.TwTyp,
			k.kredyt
		FROM `kontrah` k, `ng_e_rec` r, `operdoc` o
		
		WHERE
			r.GUID = _Key
			AND
			o.Rodzaj = r.Rodzaj
			AND
			k.GUID = _Param_A
		INTO
			@Kontrah_Is_not_OK,
			@k.Blokujsprzedaz, 
			@k.blokada_zwrotow,
			@k.Nazwa,
			@k.Symbol,
			@r.Rodzaj,
			@o.TwTyp,
			@k.kredyt
		;
		/**********************************************************************************************************************************
			Blokujsprzedaz
		**********************************************************************************************************************************/
		IF (@o.TwTyp = @ht.TwRZ) AND (@k.Blokujsprzedaz <> 0) THEN
			SET
				@Kontrah_Is_not_OK = @Kontrah_Is_not_OK OR 1,
				@Kontrah_Invalid_Msg = 
					_ConcatSTR(@Kontrah_Invalid_Msg,
						CONCAT(
							'Kontrahent: ', @k.Nazwa, '\n',
							'Symbol: "', @k.Symbol, '"\n',
							'Ma zablokowaną sprzedaż w systemie!\n',
							'W celu umożliwienia sprzedaży należy zdjąć blokadę w karcie tego kontrahenta.\n'
						),
						'\n ------------------------------------------------------------------\n'
					)
				;
		END IF;
			
		/**********************************************************************************************************************************
			blokada_zwrotow / JARZEBINSCY
		**********************************************************************************************************************************/
		IF (@session.globals.Owner = 'JARZEBINSCY') 
			AND (@r.Rodzaj = @ht.CMGZW) AND (@k.blokada_zwrotow <> 0) THEN
			SET
				@Kontrah_Is_not_OK = @Kontrah_Is_not_OK OR 1,
				@Kontrah_Invalid_Msg = 
					_ConcatSTR(@Kontrah_Invalid_Msg,
						CONCAT(
							'Kontrahent: ', @k.Nazwa, '\n',
							'Symbol: "', @k.Symbol, '"\n',
							'Wybrany kontrahent ma włączoną blokadę zwrotów!\n',
							'Proszę wybrać innego lub anulować operację.\n'
						),
						'\n ------------------------------------------------------------------\n'
					)
				;
		END IF;
		
		/**********************************************************************************************************************************
			Uwagi-Komunikat / Popraw uwagi kontrahenta
		**********************************************************************************************************************************/
		IF @session.HT.IR.KontrahAlert_ZMSTZTMG THEN
			SELECT
				k.uwagi AS Komunikat
			FROM `kontrah` k
			WHERE 
				k.GUID = _Param_A
			INTO
				@komunikat
			;
			SET @komunikat = IF(IFNULL(@komunikat, '') != '', @komunikat, 'Popraw uwagi kontrahenta');
			SET
				@Kontrah_Msg = 
					_ConcatSTR(@Kontrah_Msg,
						@komunikat,
						'\n ------------------------------------------------------------------\n'
					)
			;
		END IF;
		
		/**********************************************************************************************************************************
			Informuj_o_materialach_propagandowych
		**********************************************************************************************************************************/
		IF @session.HT.IR.Informuj_o_materialach_propagandowych THEN
			SELECT
				_VarStr('Należy wydać materialy propagandowe') AS Komunikat,
				IFNULL(max(o.datawystaw),'wcale') AS data_ost_wydania,
				to_days(current_date)-to_days(IFNULL(max(o.datawystaw),'2000-01-01'))>180 AS wydaj 
			FROM `oppo` o, `opng` n 
			WHERE 
				o.idnoper = n.guid 
				AND n.zmagazynu <> 0 
				AND n.kontrguid= _Param_A
			INTO
			@komunikat, @data_ost_wydania, @wydaj
			;
			IF @wydaj THEN
				SET
					@Kontrah_Msg = 
						_ConcatSTR(@Kontrah_Msg,
							@komunikat,
							'\n ------------------------------------------------------------------\n'
						)
				;
			END IF;
		END IF;
		
		SELECT
			_VarInt(@Kontrah_Is_not_OK) AS Kontrah_Is_not_OK,
			_VarStr(@Kontrah_Invalid_Msg) AS Kontrah_Invalid_Msg,
			_VarStr(@Kontrah_Msg) AS Kontrah_Msg,
			_VarStr('') AS Kontrah_Ask_Msg,
			_VarDouble(@k.kredyt) AS Kredyt
		FROM `kontrah` k
		WHERE
			k.GUID = _Param_A
		;
	END IF;	
	
	IF _MODE = 'check.kontrahent.new' THEN
	/**********************************************************************************************************************************
	Kontrahent - zwraca informacje nt kontrahenta w tym także czy nie jest zablokowany
	**********************************************************************************************************************************/
		CALL _ng_e_rec_msg_clear('', _Key, 'check.kontrahent', '');
		SET
			@Kontrah_Invalid_Msg = '',
			@Kontrah_Msg = ''
		;
		SELECT 
			_VarInt(0) AS Kontrah_Is_not_OK,
			k.Blokujsprzedaz, 
			k.blokada_zwrotow,
			k.Nazwa,
			k.Symbol,
			r.Rodzaj,
			o.TwTyp,
			k.kredyt
		FROM `kontrah` k, `ng_e_rec` r, `operdoc` o
		
		WHERE
			r.GUID = _Key
			AND
			o.Rodzaj = r.Rodzaj
			AND
			k.GUID = _Param_A
		INTO
			@Kontrah_Is_not_OK,
			@k.Blokujsprzedaz, 
			@k.blokada_zwrotow,
			@k.Nazwa,
			@k.Symbol,
			@r.Rodzaj,
			@o.TwTyp,
			@k.kredyt
		;
		/**********************************************************************************************************************************
			Blokujsprzedaz
		**********************************************************************************************************************************/
		IF (@o.TwTyp = @ht.TwRZ) AND (@k.Blokujsprzedaz <> 0) THEN
			SET
				@Kontrah_Is_not_OK = @Kontrah_Is_not_OK OR 1,
				@Kontrah_Invalid_Msg = 
					_ConcatSTR(@Kontrah_Invalid_Msg,
						CONCAT(
							'Kontrahent: ', @k.Nazwa, '\n',
							'Symbol: "', @k.Symbol, '"\n',
							'Ma zablokowaną sprzedaż w systemie!\n',
							'W celu umożliwienia sprzedaży należy zdjąć blokadę w karcie tego kontrahenta.\n'
						),
						'\n ------------------------------------------------------------------\n'
					)
				;
				CALL _ng_e_rec_msg_ins('', '', _Key, 'check.kontrahent', 
					REPLACE(REPLACE(_res_str_get('ng_msg_check.kontrahent.Blokujsprzedaz', ''), '#KontrNazwa#', @k.Nazwa), '#KontrSymbol#', @k.Symbol),
					'Error', 
					'Stop', '', ''
				);
		END IF;
			
		/**********************************************************************************************************************************
			blokada_zwrotow / JARZEBINSCY
		**********************************************************************************************************************************/
		IF (@session.globals.Owner = 'JARZEBINSCY') 
			AND (@r.Rodzaj = @ht.CMGZW) AND (@k.blokada_zwrotow <> 0) THEN
			SET
				@Kontrah_Is_not_OK = @Kontrah_Is_not_OK OR 1,
				@Kontrah_Invalid_Msg = 
					_ConcatSTR(@Kontrah_Invalid_Msg,
						CONCAT(
							'Kontrahent: ', @k.Nazwa, '\n',
							'Symbol: "', @k.Symbol, '"\n',
							'Wybrany kontrahent ma włączoną blokadę zwrotów!\n',
							'Proszę wybrać innego lub anulować operację.\n'
						),
						'\n ------------------------------------------------------------------\n'
					)
				;
				CALL _ng_e_rec_msg_ins('', '', _Key, 'check.kontrahent', 
					REPLACE(REPLACE(_res_str_get('ng_msg_check.kontrahent.blokada_zwrotow', ''), '#KontrNazwa#', @k.Nazwa), '#KontrSymbol#', @k.Symbol),
					'Error', 
					'Stop', '', ''
				);
		END IF;
		
		/**********************************************************************************************************************************
			Uwagi-Komunikat / Popraw uwagi kontrahenta
		**********************************************************************************************************************************/
		IF @session.HT.IR.KontrahAlert_ZMSTZTMG THEN
			SELECT
				k.uwagi AS Komunikat
			FROM `kontrah` k
			WHERE 
				k.GUID = _Param_A
			INTO
				@komunikat
			;
			SET @komunikat = IF(IFNULL(@komunikat, '') != '', @komunikat, _res_str_get('ng_msg_check.kontrahent.Uwagi-Komunikat', ''));
			SET
				@Kontrah_Msg = 
					_ConcatSTR(@Kontrah_Msg,
						@komunikat,
						'\n ------------------------------------------------------------------\n'
					)
			;
		END IF;
		
		/**********************************************************************************************************************************
			Informuj_o_materialach_propagandowych
		**********************************************************************************************************************************/
		IF @session.HT.IR.Informuj_o_materialach_propagandowych THEN
			SELECT
				_VarStr('Należy wydać materialy propagandowe') AS Komunikat,
				IFNULL(max(o.datawystaw),'wcale') AS data_ost_wydania,
				to_days(current_date)-to_days(IFNULL(max(o.datawystaw),'2000-01-01'))>180 AS wydaj 
			FROM `oppo` o, `opng` n 
			WHERE 
				o.idnoper = n.guid 
				AND n.zmagazynu <> 0 
				AND n.kontrguid= _Param_A
			INTO
			@komunikat, @data_ost_wydania, @wydaj
			;
			IF @wydaj THEN
				SET
					@Kontrah_Msg = 
						_ConcatSTR(@Kontrah_Msg,
							@komunikat,
							'\n ------------------------------------------------------------------\n'
						)
				;
			END IF;
		END IF;
		
		IF IFNULL(@Kontrah_Msg, '') != '' THEN
			CALL _ng_e_rec_msg_ins('', '', _Key, 'check.kontrahent', 
				@Kontrah_Msg,
				'Msg', 
				'', '', ''
			);
		END IF;

		CALL _ng_e_rec_msg_select('', _Key, 'check.kontrahent', '');
		
		/*
		SELECT
			_VarInt(@Kontrah_Is_not_OK) AS Kontrah_Is_not_OK,
			_VarStr(@Kontrah_Invalid_Msg) AS Kontrah_Invalid_Msg,
			_VarStr(@Kontrah_Msg) AS Kontrah_Msg,
			_VarStr('') AS Kontrah_Ask_Msg,
			_VarDouble(@k.kredyt) AS Kredyt
		FROM `kontrah` k
		WHERE
			k.GUID = _Param_A
		;
		*/
		
	END IF;	
END$$

DROP PROCEDURE IF EXISTS `_ng_e_rec_set`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_e_rec_set`(
	IN _MODE VARCHAR(250),	--	
	IN _Key VARCHAR(38),	
	IN _Rodzaj INTEGER,
	IN _Rodzaj_Typ INTEGER,
	IN i_MODE VARCHAR(255),
	IN i_Calc_Ver INTEGER,
	IN i_KontrGUID VARCHAR(38),
	IN i_Magazyn1_Kasa INTEGER,
	IN i_Magazyn2 INTEGER,
	IN i_Tymczasowa INTEGER,
	IN i_Waluta INTEGER,
	IN i_OsobaGUID VARCHAR(38),
	IN i_AreaGUID VARCHAR(38),
	IN i_Input_GUID VARCHAR(255),
	IN i_fvrudowz INTEGER,
	IN i_Param_A VARCHAR(255),
	IN i_Param_B VARCHAR(255),
	IN i_Param_C VARCHAR(255)
	
)
/*
	CALL _ng_e_rec_set('', 'x', 1, 0, '', 0, 'kontrGUID', 1, 0, 0, 0, 'OsobaGUID', 'AreaGUID', '', 0, '', '', '');
	CALL _ng_e_rec_set('', 'x', 10, 0, '', 0, 'kontrGUID', 1, 3, 0, 0, 'OsobaGUID', 'AreaGUID', '', 0, '', '', '');
*/
S_ng_e_rec_set: BEGIN 
	DECLARE _SQLText, _SQLText_NG_statement TEXT;
	
		UPDATE `ng_e_rec` r
		SET
			r.Rodzaj = _Rodzaj, 
			r.Rodzaj_Typ = _Rodzaj_Typ, 
			r.i_MODE = i_MODE, 
			r.i_Calc_Ver = i_Calc_Ver, 
			r.i_KontrGUID = IFNULL(i_KontrGUID, ''), 
			r.i_Magazyn1_Kasa = i_Magazyn1_Kasa, 
			r.i_Magazyn2 = i_Magazyn2, 
			r.i_Tymczasowa = i_Tymczasowa, 
			r.i_Waluta = i_Waluta, 
			r.i_OsobaGUID = IFNULL(i_OsobaGUID, ''), 
			r.i_AreaGUID = IFNULL(i_AreaGUID, ''), 
			r.i_Input_GUID = IFNULL(i_Input_GUID, ''), 
			r.i_fvrudowz = i_fvrudowz, 
			r.i_Param_A = i_Param_A, 
			r.i_Param_B = i_Param_B, 
			r.i_Param_C = i_Param_C
		WHERE
			r.GUID = _Key
		;	
	
	
END$$

DROP PROCEDURE IF EXISTS `_ng_e_rec_set_from_another_doc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_e_rec_set_from_another_doc`(
	IN i_MODE VARCHAR(250),	--	
	IN _Key VARCHAR(38),	
	IN _OtherKey VARCHAR(38),	
	IN i_Param_A VARCHAR(255),
	IN i_Param_B VARCHAR(255),
	IN i_Param_C VARCHAR(255)
	
)
/*
	CALL _ng_e_rec_set_from_another_doc('', 'Key', '_OtherKey', '', '', '');
*/
BEGIN 
	DECLARE _SQLText, _SQLText_NG_statement TEXT;
	
	UPDATE `ng_e_rec` r, `opng` n
	SET
		r.i_MODE = i_MODE,
	--	TU JEST CLUE sprawy -> (102) reszta w triggerze czyli zapoczatkowanie zmiennych z rekordu z opng dla opng_e i zmng dla zmng_e. Ale!!! dla opng_e z zmng (czyli realizacji zam. TO JUZ NIE!!!!)
		r.handle_check = 102,	
		r.i_Input_GUID = _OtherKey,
		r.i_Param_A = i_Param_A, 
		r.i_Param_B = i_Param_B, 
		r.i_Param_C = i_Param_C
	WHERE
		r.GUID = _Key
		AND
		r.handle_oper = 'Insert'
	;	
	
/*
		UPDATE `ng_e_rec` r, `opng` n
		SET
			r.Rodzaj = n.Rodzaj, 
			r.Rodzaj_Typ = n.Rodzaj_Typ, 
			r.i_Calc_Ver = n.Calc_Ver, 
			r.i_KontrGUID = n.KontrGUID, 
			r.i_Magazyn1_Kasa = n.Zmagazynu, 
			r.i_Magazyn2 = n.Domagazynu, 
			r.i_Tymczasowa = n.Tymczasowa, 
			r.i_Waluta = n.Waluta, 
			r.i_OsobaGUID = n.OsobaGUID, 
			r.i_AreaGUID = n.AreaGUID, 
			r.i_fvrudowz = n.fvrudowz, 
			r.i_Param_A = i_Param_A, 
			r.i_Param_B = i_Param_B, 
			r.i_Param_C = i_Param_C
		WHERE
			r.GUID = _Key
			AND
			r.handle_oper = 'Insert'
			AND
			n.GUID = _OtherKey
		;	
*/	
	
END$$

DROP PROCEDURE IF EXISTS `_ng_E_Run`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_Run`(
	IN _MODE VARCHAR(250),	 --	'before.run' 'after.run' ''
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
	CALL _ng_E_Run('before.run', 'x', '', '', '');
	CALL _ng_E_Run('', '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}', '', '', '');
	CALL _ng_E_Run('after.run', 'x', '', '', '');
	CALL _ng_E_Run('after.print', 'x', '', '', '');
*/
BEGIN 
	IF _MODE = 'before.run' THEN
	/**********************************************************************************************************************************
		przed operacją (Edit lub Insert)
	**********************************************************************************************************************************/
	
		CALL _ng_e_rec_do('check.semafor', _Key, '', '');	-- sprawdz semafor
		CALL _ng_e_rec_do('check.upr.1', _Key, '', '');	-- sprawdz uprawnienie BEFORE	przed operacja
		IF _Param_C != '' THEN
			CALL _ng_e_rec_do('select', _Key, '', '');	-- zwróć wszystkie ustawienia (kolumny `ng_e_rec`, `operdoc` i `operdoc`
		END IF;	
	END IF;	
	
	IF _MODE = '' THEN
	/**********************************************************************************************************************************
		RUN Czyli mamy juz załadowany lub skreowany rekord
	**********************************************************************************************************************************/
		
		SELECT
			handle_oper,
			handle_FROM,
			i_MODE,
			i_Input_GUID
		FROM `ng_e_rec` r
		WHERE
			r.GUID = _Key
		INTO
			@handle_oper,
			@handle_FROM,
			@i_MODE,
			@i_Input_GUID
		;	
		IF (@handle_oper = 'Insert') THEN
		/**********************************************************************************************************************************
			INSERT
		**********************************************************************************************************************************/
			CALL _ng_e_rec_do('create', _Key, '', '');	-- stworz rekord opng_e lub zmng_e (o ile jest to handle_oper = 'INSERT'
			
			CALL _ng_e_rec_do('select.into', _Key, '', '');	
			/**************************************************************************************************************************
				CZY FV do WZ/PZ
			**************************************************************************************************************************/
			IF @i_fvrudowz THEN
			
			--	Edycja podlaczonych WZ/PZ
				CALL _ng_E_Tools('real.WZPZ.to.e', _Key, @handle_FROM, '');
			END IF;
		END IF;
		
		IF (@handle_oper = 'Edit') THEN
		/**********************************************************************************************************************************
			Edycja
		**********************************************************************************************************************************/
			SET @zmpo.real.to.e = 0;
			CALL _ng_E_Tools('delete.e', _Key, @handle_FROM, '');
			CALL _ng_E_Tools('real.to.e', _Key, @handle_FROM, '');
			-- czyli CALL ng_E_LetEdit(_MODE, 'OP', _Key, _Param_A, _Param_B, _Param_C, _Param_D);
		END IF;
		
		
		
		
	END IF;	
	
	IF _MODE = 'after.run' THEN
	/**********************************************************************************************************************************
		ustala ReadOnly etc.
	**********************************************************************************************************************************/
		CALL _ng_e_rec_do('check.upr.2', _Key, '', '');	-- sprawdz uprawnienie ON/AFTER	w trakcie operacji
		IF _Param_C != '' THEN
			CALL _ng_e_rec_do('select', _Key, '', '');	-- zwróć wszystkie ustawienia (kolumny `ng_e_rec`, `operdoc` i `operdoc`
		END IF;	
	END IF;	
	
	IF _MODE = 'after.print' THEN
	/**********************************************************************************************************************************
		po wydruku
	**********************************************************************************************************************************/
		CALL _ng_e_rec_do('select.into', _Key, '', '');	
		IF @session.HT.IR.ZamknijWydrukowanaOperacje THEN
			CALL _ng_DoChangeStatusOnServer('', _Key, @COpngStatus_Zamknieta, @handle_FROM, '');
		ELSEIF @session.HT.IR.UstawPakowaniePoWydrukuOperacji THEN
			CALL _ng_DoChangeStatusOnServer('', _Key, @COpngStatus_PAKOWANA, @handle_FROM, '');
		END IF;
	END IF;	

END$$

DROP PROCEDURE IF EXISTS `_ng_E_LetPost`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_LetPost`(
	IN _MODE VARCHAR(250),	 
	IN _handle_FROM VARCHAR(250),
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL _ng_E_LetPost('', 'OP', @IdnOper, '', '');
*/
BEGIN 
	
	IF _MODE = '' THEN
		CALL _ng_E_LetPost('vat.to.ng', _handle_FROM, _Key, '', '');
		CALL _ng_E_LetPost('ng.to.po', _handle_FROM, _Key, '', '');
		CALL _ng_E_LetPost('po.to.ng', _handle_FROM, _Key, '', '');
	END IF; --  _MODE = '' 
	
	IF (_MODE = 'vat.to.ng') /* apro rzekl aby jednak bylo wypelniane AND @ht.doc.IsPodlegaVAT */ THEN
		CALL ng_vat_e_build_from_po('', _handle_FROM, _Key, '', '');
		-- CALL ng_vat_e_fill_delete('fill.brakujace.stawki', _handle_FROM, _Key);
	--	z tabelkivat do nagłówka	(-> najpierw jej naliczenie) CALL opng_vat_e('nalicz_opng_vat_e', _Key);
		CALL ng_vat_e_TO_ng_e('', _handle_FROM, _Key);
	END IF; --  _MODE = '' 
	
	IF (_MODE = 'ng.to.po') AND (@ht.doc.Twtyp != @ht.TwNN) THEN
	--	nagłówek do pozycji: rozrzucanie/ l.p. etc
		IF _handle_FROM != 'ZM' THEN
		--	Operacje
			CALL oppo_E_Let_Update('from_opng_e', '', _Key, '', '');
			CALL oppo_E_Let_Update('lp', '', _Key, '', '');
			CALL oppo_E_Let_Update('rozrzucanie', '', _Key, '', '');
		ELSE
		--	Zamowienia
			CALL zmpo_E_Let_Update('from_zmng_e', '', _Key, '', '');
			CALL zmpo_E_Let_Update('lp', '', _Key, '', '');
		END IF;
	END IF; --  _MODE = '' 
	
	IF (_MODE = 'po.to.ng') AND (@ht.doc.Twtyp != @ht.TwNN) THEN
	--	pozycje do nagłówka: liczba pozycji i inne agregaty
		IF _handle_FROM != 'ZM' THEN
		--	Operacje
			UPDATE `opng_e` n
			SET
				n.tag = 2,	--	faza oppo to nbg
				n.ilepoz = (SELECT COUNT(*) FROM `oppo_e` WHERE IdnOper = n.GUID),
				n.waga = (SELECT SUM(IFNULL(waga, 0)) FROM `oppo_e` WHERE IdnOper = n.GUID)
			WHERE
				n.GUID = _Key
			;	
		ELSE
		--	Zamowienia
			UPDATE `zmng_e` n
			SET
				-- n.tag = 2,	--	faza zmpo to nbg
				n.ilepoz = (SELECT COUNT(*) FROM `zmpo_e` WHERE idnNg = n.GUID),
				n.waga = (SELECT SUM(IFNULL(waga, 0)) FROM `zmpo_e` WHERE idnNg = n.GUID)
			WHERE
				n.GUID = _Key
			;	
		END IF;
	END IF; --  _MODE = '' 
	
	IF _MODE = 'vat.to.?' THEN
	--	?
		SET @X = '';
	END IF; --  _MODE = '' 
	
END$$

DROP PROCEDURE IF EXISTS `_ng_E_LetApply`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_LetApply`(
	IN _MODE VARCHAR(250),	 
	IN _handle_FROM VARCHAR(250),
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
S_ng_E_LetApply: BEGIN 
	CALL _ng_E_LetPost('', _handle_FROM, _Key, '', '');
	IF _handle_FROM != 'ZM' THEN
		IF NOT EXISTS (SELECT GUID FROM `opng_e` WHERE GUID = _Key) THEN
			LEAVE S_ng_E_LetApply;
		END IF;
	ELSE
		IF NOT EXISTS (SELECT GUID FROM `zmng_e` WHERE GUID = _Key) THEN
			LEAVE S_ng_E_LetApply;
		END IF;
	END IF;
	--	sprawdz deltę czy można
	--	delta
	CALL oper_Delta_Update('', _handle_FROM, _Key, '', '', '');		
	
	--	jesli tak to ...
	--	numeracja
	IF _Param_B != '' THEN
	--	na razie tylko dla `opng_e`
		IF _handle_FROM != 'ZM' THEN
			CALL opng_e_Numeracja_po_Apply('', _Key, '', '', '');
		END IF;
	END IF;
	-- ZAPIS DO LOG
	CALL _ng_E_SaveToLogBeforeApply('', _Key, _handle_FROM, '');
	
	CALL _ng_E_Tools('delete.real', _Key, _handle_FROM, '');
	CALL _ng_E_Tools('e.to.real', _Key, _handle_FROM, '');
	IF _handle_FROM != 'ZM' THEN
		--	oppo_mag
		CALL oppo_mag('UPDATE_OPNG_REC', _Key);
		--	rozlicz
		CALL ht_rozrach_rozlicz('ROZLICZ.CALC.OPNG', _Key, '', '', '', '');
		CALL ht_rozrach_rozlicz('ROZLICZ.CALC.OPNG.RELATED', _Key, '', '', '', '');

	END IF;
END$$

DROP PROCEDURE IF EXISTS `_ng_E_LetCancel`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_LetCancel`(
	IN _MODE VARCHAR(250),
	IN _handle_FROM VARCHAR(250),
	IN _Key VARCHAR(255),	
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
BEGIN 
	CALL _ng_E_LetEnd('', _handle_FROM, _Key, '', '');
END$$

DROP PROCEDURE IF EXISTS `_ng_E_LetEnd`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_LetEnd`(
	IN _MODE VARCHAR(250),
	IN _handle_FROM VARCHAR(250),
	IN _Key VARCHAR(255),	
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
BEGIN 
--	pobierz @_ng_e_rec_init.handle_UserGUID z `ng_e_rec` aby zdjąć Locka
	SELECT handle_UserGUID FROM `ng_e_rec` WHERE GUID = _Key INTO @_ng_e_rec_init.handle_UserGUID;
	CALL _ng_E_Tools('delete.e', _Key, _handle_FROM, 'LetEnd');
--	teraz - na koniec - trzeba zdjąć Locka
	CALL _lock_inf_tool('UNLOCK', _Key, IF(_handle_FROM != 'ZM', 'opng', 'zmng'), @_ng_e_rec_init.handle_UserGUID, @_ng_e_rec_init._Rec_Is_Locked, @_ng_e_rec_init.Msg, '', '1');

END$$


/* ************************************************************************************************************************************************************************
	Narzędzia 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `_ng_E_SaveToLogBeforeApply`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_SaveToLogBeforeApply`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(255),	
	IN _handle_FROM VARCHAR(255),
	IN _Param_A VARCHAR(255)
)
/*
	CALL _ng_E_SaveToLogBeforeApply('', _Key, _handle_FROM, '');
*/
S_ng_E_SaveToLogBeforeApply: BEGIN 
	CALL _ng_e_rec_do('select.into', _Key, '', '');
	SET @Miejsce = 
		CASE @OpTyp
			WHEN @ht.ZM THEN 4
			WHEN @ht.RO THEN 5
			WHEN @ht.KS THEN 6
			WHEN @ht.BN THEN 7
			ELSE 3
		END
	;
	
	CALL log_Insert_from_ng_e(
		'INSERT', @_IDN,
		@session.Registration.UserLogin, 
		@Miejsce,
		IF(@handle_oper = 'INSERT', 2, 3), 
		_Key, 
		@session.Registration.IP, 
		IF(@handle_oper = 'INSERT', 'wstawianie z `opng_e`', 'edycja w `opng_e`'), 
		IF(_handle_FROM != 'ZM', 'opng_e', 'zmng_e'),
		IF(_handle_FROM != 'ZM', 'opng', 'zmng'),
		'GUID', 
		''
	);		
END$$


DROP PROCEDURE IF EXISTS `_ng_DoChangeStatusOnServer`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_DoChangeStatusOnServer`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(255),	
	IN _Status INTEGER,
	IN _handle_FROM VARCHAR(255),
	IN _Param_A VARCHAR(255)
)
/*
	CALL _ng_DoChangeStatusOnServer('', IdnOper, 1, 'op', '')
*/
S_ng_DoChangeStatusOnServer: BEGIN 
	IF _handle_FROM IN ('', 'op') THEN
		UPDATE `opng` n SET n.status = _Status WHERE n.GUID = _Key;
		UPDATE `opng_e` n SET n.status = _Status WHERE n.GUID = _Key;
	ELSE
		UPDATE `zmng` n SET n.status = _Status WHERE n.GUID = _Key;
		UPDATE `zmng_e` n SET n.status = _Status WHERE n.GUID = _Key;
	END IF;
END$$


DROP PROCEDURE IF EXISTS `_ng_E_Tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_Tools`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(255),	
	IN _handle_FROM VARCHAR(255),
	IN _Param_A VARCHAR(255)
)
S_ng_E_Tools: BEGIN 
	DECLARE _SQLText TEXT;
	
	IF _handle_FROM IN ('', 'op') THEN
	--	OPERACJE
		IF _MODE = 'delete.e' THEN
			DELETE FROM `opng_e` WHERE GUID = _Key;
			DELETE FROM `opng_vat_e` WHERE IdnOper = _Key;
			CALL _ng_e_rec_do('select.into', _Key, '', '');
			IF NOT @i_fvrudowz THEN
			--	byla normalna edycja - usun zwyczajnie
				DELETE FROM `oppo_e` WHERE IdnOper = _Key;
				DELETE FROM `oppo_instancje_e` WHERE IdnOper = _Key;
				DELETE FROM `oppo_corr_e` WHERE IdnOper_corr = _Key;
			ELSE
			--	byla edycja podlaczonych WZ/PZ - usun laczac z oppo_e i pole IdnOper_e
				DELETE pe FROM `oppo_e` pe  WHERE pe.IdnOper_e = _Key AND IFNULL(pe.IdnOper_e, '') != '';
			END IF;
			IF _Param_A = 'LetEnd' THEN	-- Wolane w _ng_E_LetEnd
				DELETE FROM `ng_e_rec` WHERE GUID = _Key;
			END IF;
		END IF; 
		
		IF _MODE = 'delete.real' THEN
			DELETE FROM `opng` WHERE GUID = _Key;
			DELETE FROM `opng_vat` WHERE IdnOper = _Key;
			DELETE FROM `oppo` WHERE IdnOper = _Key;
			CALL _ng_e_rec_do('select.into', _Key, '', '');
			IF NOT @i_fvrudowz THEN
			--	byla normalna edycja - usun zwyczajnie
			--		dla poczepianych WZ/PZ nie usuwamy bo będzie update
				DELETE FROM `oppo_instancje` WHERE IdnOper = _Key;
				DELETE FROM `oppo_corr` WHERE IdnOper_corr = _Key;
			END IF;
		END IF; 

		IF _MODE = 'real.to.e' THEN
			INSERT INTO `opng_e` SELECT * FROM `opng` WHERE GUID = _Key;
			INSERT INTO `opng_vat_e` SELECT * FROM `opng_vat` WHERE IdnOper = _Key;
			CALL ng_vat_e_fill_delete('fill.brakujace.stawki', _handle_FROM, _Key);
			
			CALL _ng_e_rec_do('select.into', _Key, '', '');	

			/**************************************************************************************************************************
				CZY FV do WZ/PZ
			**************************************************************************************************************************/
			IF NOT @i_fvrudowz THEN
			--	Normalna edycja
				INSERT INTO `oppo_e` SELECT * FROM `oppo` WHERE IdnOper = _Key;
				UPDATE `oppo_e` p, `opng_e` n
				SET
					p.IdnOper_e = p.IdnOper
				WHERE
					n.GUID = _Key
					AND
					p.IdnOper = n.GUID
				;
				INSERT INTO `oppo_instancje_e` SELECT * FROM `oppo_instancje` WHERE IdnOper = _Key;
				INSERT INTO `oppo_corr_e` SELECT * FROM `oppo_corr` WHERE IdnOper_corr = _Key;
				UPDATE `oppo_corr_e` c
				SET
					`Temporary` = 0
				WHERE
					c.IdnOper_corr = _Key
				;
			ELSE
			--	Edycja podlaczonych WZ/PZ
				CALL _ng_E_Tools('real.WZPZ.to.e', _Key, _handle_FROM, _Param_A);
			END IF;
			
			
		END IF; 

		IF _MODE = 'real.WZPZ.to.e' THEN
			CALL _ng_e_rec_do('select.into', _Key, '', '');	
			/**************************************************************************************************************************
				CZY FV do WZ/PZ
			**************************************************************************************************************************/
			IF NOT @i_fvrudowz THEN
				LEAVE S_ng_E_Tools;
			END IF;

			IF @OpTyp = @ht.ST THEN
				SET
					@MagSQL = @i_Magazyn1_Kasa, 
					@aRodzaj = @ht.CRzWZ, -- sprzedaz zatem WZ-ka
					@aRodzaj2 = IF(@session.HT.IR.Lista_FV_z_dokmag_bez_zwrotow, @ht.CRzWZ, @ht.CMGZW)
				;
			ELSE
				SET
					@MagSQL = @i_Magazyn2, 
					@aRodzaj = @ht.CPzPZ, -- zakup zatem PZ-ka
					@aRodzaj2 = @ht.CPzPZ
				;
			END IF;
			
			DROP TEMPORARY TABLE IF EXISTS `t_real_to_e_oppo_Attach_WZPZ`;
			CREATE TEMPORARY TABLE `t_real_to_e_oppo_Attach_WZPZ`(
				GUID VARCHAR(38) NOT NULL DEFAULT '',
				IdnOper VARCHAR(38) NOT NULL DEFAULT '',
				IdnOperFin VARCHAR(38) NOT NULL DEFAULT '',
				IdnWZ VARCHAR(38) NOT NULL DEFAULT '',
				PRIMARY KEY (`GUID`),
				KEY IdnOper(IdnOper),
				KEY IdnOperFin(IdnOperFin),
				KEY IdnWZ(IdnWZ)
			)
			;

			INSERT IGNORE INTO `t_real_to_e_oppo_Attach_WZPZ`
			(GUID, IdnOper, IdnOperFin, IdnWZ)
				SELECT
					p.GUID, p.IdnOper, p.IdnOperFin, p.IdnWZ
				FROM `oppo` p
				INNER JOIN `TowrNg` t ON p.idntowr = t.GUID AND (t.opakowanie_zwrotne = 0)
				WHERE
					(p.rodzaj IN (@aRodzaj, @aRodzaj2)) 
					AND 
					(p.idnWZ = _Key)
					
					
			;
			--	dodaj pozycje wlasne nie atachmentowe czyli te z idnoper - np. gdy do FV do WZ dodajemy jeszcze usluge
			INSERT IGNORE INTO `t_real_to_e_oppo_Attach_WZPZ`
			(GUID, IdnOper, IdnOperFin, IdnWZ)
				SELECT
					p.GUID, p.IdnOper, p.IdnOperFin, p.IdnWZ
				FROM `oppo` p
				INNER JOIN `TowrNg` t ON p.idntowr = t.GUID AND (t.opakowanie_zwrotne = 0)
				WHERE
					(p.IdnOper = _Key)
					
					
			;
			INSERT IGNORE INTO `oppo_e` SELECT * FROM `oppo` WHERE IdnOper = _Key;
			
			SET _SQLText =
			"
			INSERT IGNORE INTO `t_real_to_e_oppo_Attach_WZPZ`
			(GUID, IdnOper, IdnOperFin, IdnWZ)
				SELECT
					p.GUID, p.IdnOper, p.IdnOperFin, p.IdnWZ
				FROM `oppo` p
				INNER JOIN `opng` n ON p.IdnOper = n.GUID
				INNER JOIN `TowrNg` t ON p.idntowr = t.GUID AND (t.opakowanie_zwrotne = 0)
				LEFT JOIN `oppo_e` pe ON pe.GUID = p.GUID
				WHERE
					(p.rodzaj IN (@aRodzaj, @aRodzaj2)) 
					AND 
					(p.idnWZ = '')
					AND
					(pe.GUID IS NULL)
					AND 
					#PlatnikKontrGUID#
					AND 
					#Magazyn#
			;
			";
			
			SET _SQLText = REPLACE(_SQLText, '@aRodzaj', @aRodzaj);
			SET _SQLText = REPLACE(_SQLText, '@aRodzaj2', @aRodzaj2);
			
			IF @session.HT.IR.FV_z_WZ_dla_Platnika THEN
				SET _SQLText = REPLACE(_SQLText, '#PlatnikKontrGUID#', "(n.PlatnikGUID = '@i_KontrGUID') AND (n.PlatnikGUID != '')");
			ELSE
				SET _SQLText = REPLACE(_SQLText, '#PlatnikKontrGUID#', "(n.KontrGUID  = '@i_KontrGUID') AND (n.KontrGUID  != '')");
			END IF;
			SET _SQLText = REPLACE(_SQLText, '@i_KontrGUID', @i_KontrGUID);
			
			IF @session.HT.IR.FVdoWZtylkoWybranyMag THEN
				SET _SQLText = REPLACE(_SQLText, '#Magazyn#', "(n.zmagazynu + n.domagazynu = @MagSQL)");
			ELSE
				SET _SQLText = REPLACE(_SQLText, '#Magazyn#', "TRUE");
			END IF;
			SET _SQLText = REPLACE(_SQLText, '@MagSQL', @MagSQL);
			
			SET @_SQLText = _SQLText;
			SET @_SQLTextXXX = _SQLText;
			-- 	LEAVE S_ng_E_Tools;
			CALL _ExecuteCmd(_SQLText, @Error);

			-- LEAVE S_ng_E_Tools;
			--	Na koniec wstaw wreszcie pozycje z `t_real_to_e_oppo_Attach_WZPZ` 
			INSERT IGNORE INTO `oppo_e` 
				SELECT p.* FROM `oppo` p, `t_real_to_e_oppo_Attach_WZPZ` t
				WHERE
					p.GUID = t.GUID
			;
			
			UPDATE `oppo_e` p, `t_real_to_e_oppo_Attach_WZPZ` t, `ng_e_rec` ng
			SET
				p.IdnOper_e = _Key,
				p.calc_ver = ng.I_calc_ver
			WHERE
				p.GUID = t.GUID
				AND
				ng.GUID = _Key
			;
			DROP TEMPORARY TABLE IF EXISTS `t_real_to_e_oppo_Attach_WZPZ`;
			
		END IF; 
		
		IF _MODE = 'e.to.real' THEN
		--	1. Naglowek
			UPDATE `opng_e` n SET n.tag = 0 WHERE n.GUID = _Key;	
			INSERT IGNORE INTO `opng` SELECT * FROM `opng_e` WHERE GUID = _Key;
			--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
			UPDATE `opng_e` e, `opng` n SET e.Idn = n.Idn WHERE e.GUID = _Key AND e.Idn = 0 AND n.GUID = e.GUID;	
		--	2. Vat	
			CALL ng_vat_e_fill_delete('delete.zerowe', _handle_FROM, _Key);
			INSERT INTO `opng_vat` SELECT * FROM `opng_vat_e` WHERE IdnOper = _Key;
			CALL ng_vat_e_fill_delete('fill.brakujace.stawki', _handle_FROM, _Key);

		--	3. pozycje dodaj zwyczajnie (I TYLKO ZWYCZAJNE GDY JEST fvrudowz)
			INSERT IGNORE INTO `oppo` SELECT * FROM `oppo_e` WHERE IdnOper = _Key;
			--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
			UPDATE `oppo_e` e, `oppo` n SET e.Idn = n.Idn WHERE e.IdnOper = _Key AND e.Idn = 0 AND n.GUID = e.GUID;	
			
			CALL _ng_e_rec_do('select.into', _Key, '', '');
			IF NOT @i_fvrudowz THEN
			--	byla normalna edycja - 
			--	4. instancje
				CALL oppo_instancje_E_Let_Tools('e.to.real', _Key, '', '');
				--	INSERT INTO `oppo_instancje` SELECT * FROM `oppo_instancje_e` WHERE IdnOper = _Key;
			--	5. korekty
				INSERT INTO `oppo_corr` SELECT * FROM `oppo_corr_e` WHERE IdnOper_corr = _Key;
				--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
				UPDATE `oppo_corr_e` e, `oppo_corr` n SET e.Idn = n.Idn WHERE e.IdnOper_corr = _Key AND e.Idn = 0 AND n.GUID = e.GUID;	
			ELSE
			--	byla edycja podlaczonych WZ/PZ - usun laczac z oppo_e i pole IdnOper_e 
				UPDATE `oppo` p, `oppo_e` pe 
				SET
					p.IdnWZ = pe.IdnWZ,
					p.IdnOperFin = pe.IdnOperFin,
					p.idnvat = IF(pe.IdnWZ != '', pe.idnvat, p.idnvat),
					p.Rabat = IF(pe.IdnWZ != '', pe.Rabat, p.Rabat),
					
					p.CenaNet = IF(pe.IdnWZ != '', pe.CenaNet, p.CenaNet),
					p.CenaNetWalzRab = IF(pe.IdnWZ != '', pe.CenaNetWalzRab, p.CenaNetWalzRab),
					p.cenabrt = IF(pe.IdnWZ != '', pe.cenabrt, p.cenabrt),
					
					p.wartnetwal = IF(pe.IdnWZ != '', pe.wartnetwal, p.wartnetwal),
					p.wartnet = IF(pe.IdnWZ != '', pe.wartnet, p.wartnet),
					p.wartbrt = IF(pe.IdnWZ != '', pe.wartbrt, p.wartbrt), 
					p.wartbrtwal = IF(pe.IdnWZ != '', pe.wartbrtwal, p.wartbrtwal),
					
					p.grp_GUID = IF(pe.IdnWZ != '', pe.grp_GUID, p.grp_GUID),
					p.grp_TowrSymb = IF(pe.IdnWZ != '', pe.grp_TowrSymb, p.grp_TowrSymb),
					p.grp_TowrNazwa = IF(pe.IdnWZ != '', pe.grp_TowrNazwa, p.grp_TowrNazwa),
					p.grp_Ilosc = IF(pe.IdnWZ != '', pe.grp_Ilosc, p.grp_Ilosc),
					p.grp_IdnTowr = IF(pe.IdnWZ != '', pe.grp_IdnTowr, p.grp_IdnTowr),
					p.grp_Jednostka = IF(pe.IdnWZ != '', pe.grp_Jednostka, p.grp_Jednostka),
					
					p.TowrNazwa2 = IF(pe.IdnWZ != '', pe.TowrNazwa2, p.TowrNazwa2),
					
					p.Calc_ver = pe.Calc_ver
				WHERE
					pe.IdnOper_e = _key
					AND
					p.GUID = pe.GUID
				;
			END IF;
			
		END IF; 

	ELSE
	--	ZAMOWIENIA
		IF _MODE = 'delete.e' THEN
			DELETE FROM `zmng_e` WHERE GUID = _Key;
			DELETE FROM `zmng_vat_e` WHERE IdnOper = _Key;
			DELETE FROM `zmpo_e` WHERE IdnNg = _Key;
			IF _Param_A = 'LetEnd' THEN	-- Wolane w _ng_E_LetEnd
				DELETE FROM `ng_e_rec` WHERE GUID = _Key;
			END IF;
		END IF; 
		
		IF _MODE = 'delete.real' THEN
			DELETE FROM `zmng` WHERE GUID = _Key;
			DELETE FROM `zmng_vat` WHERE IdnOper = _Key;
			DELETE FROM `zmpo` WHERE IdnNg = _Key;
		END IF; 

		IF _MODE = 'real.to.e' THEN
			SET @zmpo.real.to.e = 1;
			INSERT INTO `zmng_e` SELECT * FROM `zmng` WHERE GUID = _Key;
			INSERT INTO `zmng_vat_e` SELECT * FROM `zmng_vat` WHERE IdnOper = _Key;
			CALL ng_vat_e_fill_delete('fill.brakujace.stawki', _handle_FROM, _Key);
			INSERT INTO `zmpo_e` SELECT * FROM `zmpo` WHERE IdnNg = _Key;
		END IF; 
		
		IF _MODE = 'e.to.real' THEN
		--	1. Naglowek
			-- UPDATE `zmng_e` n SET n.tag = 0 WHERE n.GUID = _Key;	
			INSERT IGNORE INTO `zmng` SELECT * FROM `zmng_e` WHERE GUID = _Key;
			--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
			UPDATE `zmng_e` e, `zmng` n SET e.Idn = n.Idn WHERE e.GUID = _Key AND e.Idn = 0 AND n.GUID = e.GUID;	
		--	2. Vat	
			CALL ng_vat_e_fill_delete('delete.zerowe', _handle_FROM, _Key);
			INSERT INTO `zmng_vat` SELECT * FROM `zmng_vat_e` WHERE IdnOper = _Key;
			CALL ng_vat_e_fill_delete('fill.brakujace.stawki', _handle_FROM, _Key);
		--	3. pozycje dodaj zwyczajnie
			INSERT IGNORE INTO `zmpo` SELECT * FROM `zmpo_e` WHERE IdnNg = _Key;
			--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
			UPDATE `zmpo_e` e, `zmpo` n SET e.Idn = n.Idn WHERE e.IdnNg = _Key AND e.Idn = 0 AND n.GUID = e.GUID;	
		END IF; 
	END IF; 
	
END$$


DROP PROCEDURE IF EXISTS `_ng_E_Wizard`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ng_E_Wizard`(
	IN _MODE VARCHAR(250),
	IN _Key VARCHAR(255),	
	IN _Param_WE INTEGER,
	IN _Context VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
	CALL _ng_E_Wizard('Init.wizard', @IdnOper, 1, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.optypy', @IdnOper, 1, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.rodzaje', @IdnOper, 1, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.rodzaje_typ', @IdnOper, 1, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.magazyny', @IdnOper, 0, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.magazyny', @IdnOper, 1, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.kasy', @IdnOper, 1, 'STZTMG', '', '', '');
	CALL _ng_E_Wizard('select.waluty', @IdnOper, 1, 'STZTMG', '', '', '');
*/
S__ng_E_Wizard: BEGIN 
	IF _MODE = 'Init.wizard' THEN
		CALL _sys_upr_init('');
		/*********************************************************************
		Typy
		*********************************************************************/
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Optypy`;
		CREATE TEMPORARY TABLE `t_ng_E_Wizard_Optypy`
			SELECT 
				nr.Handle_UserGUID, 
				_VarInt(sp.Value) AS OpTyp,
				sp.DisplayValue AS Opis,
				_VarStr('') AS upr_optyp,
				_VarInt(0) AS u_optyp,
				_VarInt(1) AS Visible
			FROM `slowniki_pierwotne` sp, `ng_e_rec` nr
			WHERE 
				sp.slownik_GUID = 'optyp'
				AND
				nr.GUID = _Key
			ORDER BY OpTyp
		;
		UPDATE `t_ng_E_Wizard_Optypy` t
		SET 
			t.upr_optyp = 
				IFNULL((SELECT od.upr_optyp FROM `operdoc` od WHERE od.Grupa = t.OpTyp LIMIT 1), '')
		;
		UPDATE `t_ng_E_Wizard_Optypy` t
		SET 
			t.u_optyp = 
				_GetUprawnienie(t.upr_optyp, t.Handle_UserGUID)
		;
		UPDATE `t_ng_E_Wizard_Optypy` t
		SET 
			t.Visible = (t.u_optyp >= @uprDSInsert)
		;
		
		IF _Context = 'STZTMG' THEN
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = FALSE
			WHERE
				NOT(t.OpTyp IN (@ht.ST, @ht.ZT, @ht.MG, @ht.SI, @ht.ZP)) 
			;
		ELSEIF _Context = 'ZM' THEN
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = FALSE
			WHERE
				NOT(t.OpTyp IN (@ht.ZM)) 
			;
		ELSEIF _Context = 'KS' THEN
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = FALSE
			WHERE
				NOT(t.OpTyp IN (@ht.KS)) 
			;
		ELSEIF _Context = 'BN' THEN
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = FALSE
			WHERE
				NOT(t.OpTyp IN (@ht.BN)) 
			;
		ELSEIF _Context = 'R' THEN
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = FALSE
			WHERE
				NOT(t.OpTyp IN (@ht.RO, @ht.KS, @ht.BN)) 
			;
		END IF;
		/*********************************************************************
		Rodzaje
		*********************************************************************/
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Rodzaje`;
		CREATE TEMPORARY TABLE `t_ng_E_Wizard_Rodzaje`
			SELECT
				nr.Handle_UserGUID, 
				od.*,
				_VarInt(0) AS u_optyp,
				_VarInt(0) AS u_rodzaj,
				_VarInt(1) AS Visible,
				-- _VarInt(0) AS WP_GrupaOperacji,
				_VarInt(0) AS WP_RodzajTyp,
				_VarInt(0) AS WP_International,
				_VarInt(0) AS WP_Zalacznik,
				_VarInt(0) AS WP_MagFrom,
				_VarInt(0) AS WP_MagTo,
				_VarInt(0) AS WP_Kasy,
				_VarInt(0) AS WP_Kontrahent,
				_VarInt(0) AS Ile_RodzajTyp,
				_VarInt(0) AS Ile_MagFrom,
				_VarInt(0) AS Ile_MagTo,
				_VarInt(0) AS Ile_Kasy
				
			FROM `ng_e_rec` nr, `operdoc` od
			WHERE
				nr.GUID = _Key
		;
		UPDATE `t_ng_E_Wizard_Rodzaje` tr
		SET 
			tr.WP_International = tr.IsWaluta,	--	IFNULL(@session.HT.IR.PytajoWalutePrzyDokKrajowym, FALSE) !!!!!!!!!!!!! i co z tym
			tr.WP_Zalacznik = 
				tr.FVdoWZPZ AND
					IF(tr.TwTyp = @ht.TwPZ,
						IFNULL(@session.HT.IR.PytajoFVdoPZ, FALSE),
						IFNULL(@session.HT.IR.PytajoFVdoWZ, FALSE)
					),
			tr.WP_MagFrom = 
				IF(tr.TwTyp = @ht.TwZm,
					_varInt(1),
					IF(tr.TwTyp IN (@ht.TwRZ, @ht.TwMM),
						_varInt(1),
						_varInt(0)
					)
				),
			tr.WP_MagTo =
				IF(tr.TwTyp = @ht.TwZm,
					_varInt(1),
					IF(tr.TwTyp IN (@ht.TwPZ, @ht.TwMM),
						_varInt(1),
						_varInt(0)
					)
				),
			tr.WP_Kasy = 
				tr.Grupa = @ht.KS,
			tr.WP_Kontrahent = 
				MA_Kontrahenta,
			tr.u_optyp = 
				_GetUprawnienie(tr.upr_optyp, tr.Handle_UserGUID),
			tr.u_rodzaj =
				_GetUprawnienie(tr.upr_rodzaj, tr.Handle_UserGUID)
		;
		UPDATE `t_ng_E_Wizard_Rodzaje` tr
		SET 
			tr.Visible = tr.Visible AND(GREATEST(tr.u_optyp, tr.u_rodzaj) >= @uprDSInsert)
		;

		IF _Context LIKE 'Realizacja.ZM.%' THEN
			IF _Context = 'Realizacja.ZM.cTRANS_MM_FROMZamowienia' THEN
			--	TYLKO MM
				UPDATE `t_ng_E_Wizard_Rodzaje` tr
				SET 
					tr.Visible = (tr.Rodzaj = @ht.CMMMM)
				;
			ELSE
				UPDATE `t_ng_E_Wizard_Rodzaje` tr, `ng_e_rec` nr, `zmng` z, `operdoc` od 
				SET
					tr.Visible = 
						--  tr.Visible 
						--  AND
						(tr.MagTyp = od.MagTyp) 
						AND
						(tr.Grupa != od.Grupa) 
						AND
						(tr.IsPozycjeVisible) 
						AND 
						(tr.Grupa IN (0,1,2)) 
						AND
						(tr.MA_Kontrahenta) 
						AND
						NOT(tr.ISKorekta) 
				WHERE
					nr.GUID = _Key
				AND
					IFNULL(nr.i_Input_GUID, '') != ''
				AND
					z.GUID = nr.i_Input_GUID
				AND
					od.Rodzaj = z.Rodzaj
					AND TRUE
				;
			END IF;
			--	Teraz jeszcze sztucznie schowaj grupy Optyp z wyjatkiem 1 ej
			UPDATE `t_ng_E_Wizard_Optypy` t SET t.Visible = FALSE;
			UPDATE `t_ng_E_Wizard_Optypy` t, `t_ng_E_Wizard_Rodzaje` tr
			SET 
				t.Visible = 1
			WHERE
				t.OpTyp = tr.Grupa
				AND
				tr.Visible
				AND FALSE
			;
		END IF;
		
		IF _Context = 'REALIZUJ.WZ' THEN
			UPDATE `t_ng_E_Wizard_Rodzaje` tr, `operdoc` od
			SET 
				tr.Visible = 
					tr.Visible 
					AND
					(tr.grupa IN (@ht.ST, @ht.MG)) 
					AND
					(od.MagTyp = @ht.mtRZ) 
			WHERE
				od.Rodzaj = tr.Rodzaj
			;
			--	Teraz jeszcze sztucznie schowaj grupy Optyp z wyjatkiem 0 ej
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = (t.OpTyp = 0)
			;
		ELSEIF _Context = 'REALIZUJ.PZ' THEN
			UPDATE `t_ng_E_Wizard_Rodzaje` tr, `operdoc` od
			SET 
				tr.Visible = 
					tr.Visible 
					AND
					(tr.grupa IN (@ht.ZT, @ht.MG)) 
					AND
					(od.MagTyp = @ht.mtPZ) 
			WHERE
				od.Rodzaj = tr.Rodzaj
			;
			--	Teraz jeszcze sztucznie schowaj grupy Optyp z wyjatkiem 1 ej
			UPDATE `t_ng_E_Wizard_Optypy` t
			SET 
				t.Visible = (t.OpTyp = 1)
			;
		END IF;
		
		/*********************************************************************
		Magazyny
		*********************************************************************/
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Magazyny`;
		CREATE TEMPORARY TABLE `t_ng_E_Wizard_Magazyny`
			SELECT 
				nr.Handle_UserGUID, 
				m.*,
				_VarInt(0) AS u_przychod,
				_VarInt(0) AS u_rozchod,
				_VarInt(1) AS Visible
			FROM `Magazyny` m, `ng_e_rec` nr
			WHERE
				nr.GUID = _Key
		;
		UPDATE `t_ng_E_Wizard_Magazyny` tm
		SET 
			tm.u_przychod = 
				_GetUprawnienie(CONCAT('magazyny|', tm.IdnMagazynu, '|przychod'), tm.Handle_UserGUID),
			tm.u_rozchod =
				_GetUprawnienie(CONCAT('magazyny|', tm.IdnMagazynu, '|rozchod'), tm.Handle_UserGUID)
		;
		
		/*********************************************************************
		Kasy
		*********************************************************************/
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Kasy`;
		CREATE TEMPORARY TABLE `t_ng_E_Wizard_Kasy`
			SELECT 
				nr.Handle_UserGUID, 
				m.*,
				_VarInt(0) AS u_KP,
				_VarInt(0) AS u_KW,
				_VarInt(1) AS Visible
			FROM `kasy` m, `ng_e_rec` nr
			WHERE
				nr.GUID = _Key
		;
		UPDATE `t_ng_E_Wizard_Kasy` tk
		SET 
			tk.u_KP = 
				_GetUprawnienie(CONCAT('kasy|', tk.Idn, '|KP'), tk.Handle_UserGUID),
			tk.u_KW =
				_GetUprawnienie(CONCAT('kasy|', tk.Idn, '|KW'), tk.Handle_UserGUID)
		;
		
		/*********************************************************************
		Na koniec w rodzajach ustaw widocznosc magazynow i kas (gdy 1 rekord to zakladna niewidoczna
		*********************************************************************/
		UPDATE `t_ng_E_Wizard_Rodzaje` tr
		SET 
			tr.Ile_RodzajTyp = _VarInt(
				(SELECT COUNT(*) FROM `operdoc_typy` ot WHERE ot.Rodzaj = tr.Rodzaj)
			), 
			tr.Ile_MagFrom = _VarInt(
				(SELECT COUNT(*) FROM `t_ng_E_Wizard_Magazyny` m WHERE m.Visible AND m.u_rozchod >= @uprDSInsert)
			)
		;
		UPDATE `t_ng_E_Wizard_Rodzaje` tr
		SET 
			tr.Ile_MagTo = _VarInt(
				(SELECT COUNT(*) FROM `t_ng_E_Wizard_Magazyny` m WHERE m.Visible AND m.u_przychod >= @uprDSInsert)
			),
			tr.Ile_Kasy = _VarInt(
				(
				SELECT COUNT(*) FROM `t_ng_E_Wizard_Kasy` k 
				WHERE 
					IF(tr.Rodzaj IN (@ht.CKPKP, @ht.CRKBO),
						k.u_KP >= @uprDSInsert,
						IF(tr.Rodzaj IN (@ht.CKWKW),
							k.u_KW >= @uprDSInsert,
							FALSE
						)
					)
					
				)
			
			)
		;
		UPDATE `t_ng_E_Wizard_Rodzaje` tr
		SET 
			tr.WP_RodzajTyp = IF(tr.Ile_RodzajTyp > 0, IF(tr.Ile_RodzajTyp > 1, 1, 2), 0),
			tr.WP_MagFrom = IF(tr.WP_MagFrom AND (tr.Ile_MagFrom > 0), IF(tr.Ile_MagFrom > 1, 1, 2), 0),
			tr.WP_MagTo = IF(tr.WP_MagTo AND (tr.Ile_MagTo > 0), IF(tr.Ile_MagTo > 1, 1, 2), 0),
			tr.WP_Kasy = IF(tr.WP_Kasy AND (tr.Ile_Kasy > 0), IF(tr.Ile_Kasy > 1, 1, 2), 0)
		;
	END IF; 
	
	IF _MODE = 'Clear.wizard' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Optypy`;
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Rodzaje`;
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Magazyny`;
		DROP TEMPORARY TABLE IF EXISTS `t_ng_E_Wizard_Kasy`;
	END IF; 
	
	IF _MODE = 'select.optypy' THEN
		
		IF _Context LIKE 'Realizacja.ZM.%' THEN
			SELECT 
				`to`.*
			FROM `t_ng_E_Wizard_Optypy` `to`
			WHERE
				`to`.Visible
			;
		ELSE
			SELECT 
				`to`.*
			FROM `t_ng_E_Wizard_Optypy` `to`
			WHERE
				`to`.Visible
			;
		END IF;
	END IF; 
	
	IF _MODE = 'select.rodzaje' THEN
		IF _Context IN ('REALIZUJ.WZ', 'REALIZUJ.PZ') THEN
			SELECT 
				tr.* 
			FROM `t_ng_E_Wizard_Rodzaje` tr
			WHERE
				tr.Visible
			;
		ELSEIF _Context LIKE 'Realizacja.ZM.%' THEN
			SELECT 
				tr.* 
			FROM `t_ng_E_Wizard_Rodzaje` tr
			WHERE
				tr.Visible
			;
		ELSE
			SELECT 
				tr.* 
			FROM `t_ng_E_Wizard_Rodzaje` tr
			WHERE
				tr.Visible
				AND
				tr.grupa = _Param_WE
			;
		END IF; 
	END IF; 
	
	IF _MODE = 'select.rodzaje_typ' THEN
		SELECT 
			ot.* 
		FROM `t_ng_E_Wizard_Rodzaje` tr, `operdoc_typy` ot
		WHERE
			tr.Visible
			AND
			tr.Rodzaj = _Param_WE
			AND
			ot.Rodzaj = tr.Rodzaj
		;
	END IF; 
	
	IF _MODE = 'select.magazyny' THEN
		/*
		_Param_WE:
		0 zmagazynu
		1 do magazynu
		inne zawsze FALSE
		*/
		SELECT 
			m.* 
		FROM `t_ng_E_Wizard_Magazyny` m, `ng_e_rec` nr
		WHERE
			nr.GUID = _Key
			AND
			m.Visible
			AND
			/*	Mag typ	
				@ht.mtPZ = 0, 
				@ht.mtMM = 1, 
				@ht.mtRZ = 2, 
			*/	
			IF(_Param_WE = 0,
				m.u_przychod >= @uprDSInsert,
				IF(_Param_WE = 1,
					m.u_rozchod >= @uprDSInsert,
					FALSE
				)
			)
		;
	END IF; 
	
	IF _MODE = 'select.kasy' THEN
		/*
		*/
		SELECT 
			k.* 
		FROM `t_ng_E_Wizard_Kasy` k, `ng_e_rec` nr
		WHERE
			nr.GUID = _Key
			AND
			IF(nr.Rodzaj IN (@ht.CKPKP, @ht.CRKBO),
				k.u_KP >= @uprDSInsert,
				IF(nr.Rodzaj IN (@ht.CKWKW),
					k.u_KW >= @uprDSInsert,
					FALSE
				)
			)
		;
	END IF; 
	
	IF _MODE = 'select.Waluty' THEN
		SELECT 
			w.*,
			c.Name, Flag 
		FROM `waluty` w
		LEFT JOIN `geo_country` c ON c.Code = SUBSTR(w.Symbol, 1, 2)
		ORDER BY w.Idn
		;	
	END IF; 
	
END$$

/* ************************************************************************************************************************************************************************
	Edycja, Wstawianie, etc `ng_e_rec`
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `Opng_E_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Opng_E_init`(
	IN _MODE VARCHAR(250),	 --	_handle_oper INSERT, EDIT, DELETE,
	IN _Key VARCHAR(38),
	IN _handle_UserGUID VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL Opng_E_init('INSERT', 'x', 'jmam', '', '');
	CALL Opng_E_init('EDIT', '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}', 'jmam', '', '');
	CALL Opng_E_init('Check.before.handle', '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}', 'jmam', '', '');
	CALL Opng_E_init('INSERT', 'x', 'jmam', '', '');
*/
BEGIN 
	CALL _ng_e_rec_init(_MODE, 'OP', _Key, _handle_UserGUID, _Param_A, _Param_A);
END$$

DROP PROCEDURE IF EXISTS `Opng_E_init_set`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Opng_E_init_set`(
	IN _MODE VARCHAR(250),	--	
	IN _Key VARCHAR(38),	
	IN _Rodzaj INTEGER,
	IN _Rodzaj_Typ INTEGER,
	IN i_MODE VARCHAR(255),
	IN i_Calc_Ver INTEGER,
	IN i_KontrGUID VARCHAR(38),
	IN i_Magazyn1_Kasa INTEGER,
	IN i_Magazyn2 INTEGER,
	IN i_Tymczasowa INTEGER,
	IN i_Waluta INTEGER,
	IN i_OsobaGUID VARCHAR(38),
	IN i_AreaGUID VARCHAR(38),
	IN i_Input_GUID VARCHAR(255),
	IN i_fvrudowz INTEGER,
	IN i_Param_A VARCHAR(255),
	IN i_Param_B VARCHAR(255),
	IN i_Param_C VARCHAR(255)
	
)
/*
	CALL Opng_E_init_set('', 'x', 1, 0, '', 0, 'kontrGUID', 1, 0, 0, 0, 'OsobaGUID', 'AreaGUID', '', 0, '', '', '');
	CALL Opng_E_init_set('', 'x', 10, 0, '', 0, 'kontrGUID', 1, 3, 0, 0, 'OsobaGUID', 'AreaGUID', '', 0, '', '', '');
*/
BEGIN 
	CALL _ng_e_rec_set(
		_MODE, _Key, _Rodzaj, _Rodzaj_Typ, i_MODE, i_Calc_Ver, i_KontrGUID, i_Magazyn1_Kasa, i_Magazyn2, 
		i_Tymczasowa, i_Waluta, i_OsobaGUID, i_AreaGUID, i_Input_GUID, i_fvrudowz, i_Param_A, i_Param_B, i_Param_C
	);
	
	IF i_MODE = 'KOR' THEN
		UPDATE `ng_e_rec` r, `opng` n
		SET
			r.i_KontrGUID = n.KontrGUID, 
			r.i_Magazyn1_Kasa = n.Domagazynu, 
			r.i_Magazyn2 = n.Zmagazynu, 
			r.i_Tymczasowa = i_Tymczasowa, 
			r.i_Waluta = n.Waluta, 
			r.i_fvrudowz = 0 
		WHERE
			r.GUID = _Key
			AND
			n.GUID = i_Input_GUID
		;	
	END IF;
	
	IF i_MODE = 'KOR.from.t_oppo_corr_init_bi' THEN
		SET @t_oppo_corr_init_bi.GUID = NULL;
		SELECT GUID_Orig FROM `t_oppo_corr_init_bi` LIMIT 1 INTO @t_oppo_corr_init_bi.GUID;
		IF @t_oppo_corr_init_bi.GUID IS NOT NULL THEN
			SELECT p.IDNOper AS GUID FROM `oppo` p WHERE p.GUID = @t_oppo_corr_init_bi.GUID LIMIT 1 INTO i_Input_GUID;
			UPDATE `ng_e_rec` r, `opng` n
			SET
				r.i_KontrGUID = n.KontrGUID, 
				r.i_Magazyn1_Kasa = n.Domagazynu, 
				r.i_Magazyn2 = n.Zmagazynu, 
				r.i_Tymczasowa = i_Tymczasowa, 
				r.i_Waluta = n.Waluta, 
				r.i_fvrudowz = 0 
			WHERE
				r.GUID = _Key
				AND
				n.GUID = i_Input_GUID
			;	
		END IF;
	END IF;
	
END$$

DROP PROCEDURE IF EXISTS `Opng_E_init_set_from_another_doc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Opng_E_init_set_from_another_doc`(
	IN i_MODE VARCHAR(250),	--	
	IN _Key VARCHAR(38),	
	IN _OtherKey VARCHAR(38),	
	IN i_Param_A VARCHAR(255),
	IN i_Param_B VARCHAR(255),
	IN i_Param_C VARCHAR(255)
	
)
/*
	CALL Opng_E_init_set_from_another_doc('', 'Key', '_OtherKey', '', '', '');
*/

BEGIN 
	DECLARE _ZM_Key VARCHAR(38);
	DECLARE _SRC_Key VARCHAR(38);
	DECLARE _Rodzaj, _Rodzaj_typ, _Magazyn, _Magazyn2, _Waluta, _i_Waluta, _Typ_Przepisania_Cen INTEGER DEFAULT 0;  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	DECLARE _KontrGUID , _OsobaGUID, _AreaGUID VARCHAR(38);
	-- DECLARE _DataWystaw DATE;
	DECLARE _Tymczasowa BOOLEAN DEFAULT FALSE;
	-- IN _Input_GUID VARCHAR(255),
	
	CALL _ng_e_rec_set_from_another_doc(i_MODE, _Key, _OtherKey, i_Param_A, i_Param_B, i_Param_C);
	
	
	IF i_MODE LIKE 'Realizacja.ZM.%' THEN
		SET _ZM_Key = _OtherKey;
		
		SELECT
			z.rodzaj, z.rodzaj2, z.KontrGUID, z.osobaGUID, z.AreaGUID, z.Waluta, z.idnmagazyn, z.magazynwys, z.zamwpermn, z.terminrealizacji,
			r.Rodzaj, r.Rodzaj_Typ, i_Magazyn1_Kasa, i_Magazyn2, i_Waluta
		FROM `zmng` z, 	`ng_e_rec` r
		WHERE
			z.GUID = _ZM_Key
			AND
			r.GUID = _Key
		LIMIT 1	
		INTO
			@z.rodzaj, @z.rodzaj2, _KontrGUID, _osobaGUID, _AreaGUID, _Waluta, @z.idnmagazyn, @z.magazynwys, @z.zamwpermn, @z.terminrealizacji,
			_Rodzaj, _Rodzaj_Typ, _Magazyn, _Magazyn2, _i_Waluta
		;
		SELECT
			p.MagTyp
		FROM `zmpo` p
		WHERE
			p.IdnNG = _ZM_Key
		LIMIT 1	
		INTO
			@z.MagTyp
		;
		
		IF _i_Waluta >= 0 THEN
			SET _Waluta = _i_Waluta;
		END IF;
		IF i_MODE = 'Realizacja.ZM.cTRANS_MM_FROMZamowienia' THEN
			SET
				_Rodzaj = @ht.CMMMM,
				_Magazyn = @z.idnmagazyn,
				_Magazyn2 = @z.magazynwys 
			;	
		ELSEIF i_MODE = 'Realizacja.ZM.cTRANS_WZFVTemp_FROMZamowienia' THEN
			SET
				_Rodzaj = @ht.CSpFV,
				_Magazyn = @z.idnmagazyn,
				_Magazyn2 = @z.magazynwys,
				_Tymczasowa = 1
			;	
		ELSE
			IF @z.rodzaj IN (@ht.CZmOO, @ht.CZmZP, @ht.CZmEX) THEN
				SET
					_Rodzaj = IF(_Rodzaj >= 0, _Rodzaj, @z.rodzaj2),
					_Magazyn = 
					CASE 
						/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
						/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN 0
						/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.idnmagazyn
						/*NN*/	ELSE 0
					END,
					_Magazyn2 = 
					CASE 
						/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN 0
						/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
						/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.magazynwys
						/*NN*/	ELSE 0
					END	
				;	
				IF @z.rodzaj IN (@ht.CZmZP) THEN
					SET
						_Rodzaj = IF(@z.MagTyp = @ht.mtRZ, @ht.CRzRW, @ht.CPzPW),
						_Magazyn = IF(@z.MagTyp = @ht.mtRZ, @z.idnmagazyn, 0),
						_Magazyn2 = IF(@z.MagTyp = @ht.mtRZ, 0, @z.magazynwys)
					;	
				END IF;
			ELSEIF @z.rodzaj IN (@ht.CZMWE) THEN
				SET
					_Rodzaj = @ht.CMMMM,
					_Magazyn = @z.idnmagazyn,
					_Magazyn2 = @z.magazynwys
				;	
			ELSEIF @z.rodzaj IN (@ht.CZmDD, @ht.CZmIm) THEN
				SET
					_Rodzaj = IF(_Rodzaj IN (@ht.CZkFV, @ht.CPzPZ, @ht.CZkIm, @ht.CZTUE), _Rodzaj, @ht.CZkFV), 	--	fakturka zakup.
					_Magazyn = 0,
					_Magazyn2 = IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn)
				;	
			END IF;
		END IF;

		SET 
			_Waluta = IF(NOT _Rodzaj IN (@ht.CSpFE, @ht.CZkIm, @ht.CStUE, @ht.CZTUE), _Waluta, _Waluta)		-- !!!!!!!!!!??????? C_Sprzedarz.pas linia 1258 
		;
		
		SET 
			@KontrGUID = _KontrGUID
		;	
		CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, i_MODE, 3, _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _ZM_Key, 0, i_Param_A, i_Param_B, i_Param_C);
		
	END IF;
	
	IF i_MODE LIKE 'FV.DO.%' THEN
	--	FV.DO.WZ lub FV.DO.PZ lub FV.DO.WZ.temp lub FV.DO.PZ.temp
		IF NOT(i_MODE LIKE '%.temp') THEN
		--	NIE z `t_FV_DO_WZPZ_opng` zatem stworz `t_FV_DO_WZPZ_opng`
			DROP TEMPORARY TABLE IF EXISTS `t_FV_DO_WZPZ_opng`;
			CREATE TEMPORARY TABLE `t_FV_DO_WZPZ_opng` LIKE `opng_e`;
			SET _SRC_Key = _OtherKey;
			INSERT IGNORE INTO `t_FV_DO_WZPZ_opng` 
				SELECT * FROM `opng` WHERE GUID = _SRC_Key
			;
		END IF;
		
		--	w `t_FV_DO_WZPZ_opng` mamy WZ/PZ ki do podpiecia
		SELECT
			z.GUID, z.rodzaj, z.rodzaj2, z.KontrGUID, z.osobaGUID, z.AreaGUID, z.Waluta, z.ZMagazynu, z.DoMagazynu, 
			r.Rodzaj, r.Rodzaj_Typ, i_Magazyn1_Kasa, i_Magazyn2, i_Waluta
		FROM `t_FV_DO_WZPZ_opng` z, 	`ng_e_rec` r
		WHERE
			TRUE 	-- 	z.GUID = _ZM_Key
			AND
			r.GUID = _Key
		LIMIT 1	
		INTO
			_SRC_Key, @z.rodzaj, @z.rodzaj2, _KontrGUID, _osobaGUID, _AreaGUID, _Waluta, @z.ZMagazynu, @z.DoMagazynu, 
			_Rodzaj, _Rodzaj_Typ, _Magazyn, _Magazyn2, _i_Waluta
		;
	
		IF _i_Waluta >= 0 THEN
			SET _Waluta = _i_Waluta;
		END IF;
		
		SET
			_Magazyn = @z.ZMagazynu,
			_Magazyn2 = @z.DoMagazynu
		;	
		
		SET 
			_Waluta = IF(NOT _Rodzaj IN (@ht.CSpFE, @ht.CZkIm, @ht.CStUE, @ht.CZTUE), _Waluta, _Waluta)		-- !!!!!!!!!!??????? C_Sprzedarz.pas linia 1258 
		;
		SET 
			@KontrGUID = _KontrGUID
		;	
		CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, i_MODE, 3, _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _SRC_Key, 1, i_Param_A, i_Param_B, i_Param_C);
	END IF;
	
END$$

DROP PROCEDURE IF EXISTS `Opng_E_Run`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Opng_E_Run`(
	IN _MODE VARCHAR(250),	 --	'before.run' 'after.run' ''
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
	CALL Opng_E_Run('before.run', 'x', '', '', '');
	CALL Opng_E_Run('', '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}', '', '', '');
	CALL Opng_E_Run('after.run', 'IdnOper', '', '', '');
	CALL Opng_E_Run('after.print', 'IdnOper', '', '', '');
*/
BEGIN 
	CALL _ng_E_Run(_MODE, _Key, _Param_A, _Param_B, _Param_C);
	
	IF _MODE = '' THEN
	/**********************************************************************************************************************************
		RUN Czyli mamy juz załadowany lub skreowany rekord i znamy juz zmienne:
			@handle_oper,
			@handle_FROM,
			@i_MODE,
			@i_Input_GUID
	**********************************************************************************************************************************/
		
		IF (@handle_oper = 'Insert') THEN
		/**********************************************************************************************************************************
			INSERT
		**********************************************************************************************************************************/
			IF (@i_MODE LIKE 'KOR%') THEN
			/**********************************************************************************************************************************
				Korekty
				w _Input_GUID ID korekty oryginału
			**********************************************************************************************************************************/
				SET @jmamWashere = true;
				CALL opng_E_LetInsertCorr(@i_MODE, _Key, @i_Input_GUID, '', '', '', '');
			END IF;
			
			IF (@i_MODE LIKE 'Realizacja.ZM.%') THEN
			/**********************************************************************************************************************************
				Z Zamowienia REALIZACJA
				w _Input_GUID ID Zamowienia
			**********************************************************************************************************************************/
				SET @jmamWashere = true;
				CALL opng_E_LetInsertFromZM(@i_MODE, _Key, @i_Input_GUID, '', '');
			END IF;
			
			IF (@i_MODE LIKE 'FV.DO.%') THEN
			/**********************************************************************************************************************************
				FV.DO.WZ lub FV.DO.PZ lub FV.DO.WZ.temp lub FV.DO.PZ.temp
				w tabeli `t_FV_DO_WZPZ_opng` sa juz naglowki ktorych pozycje nalezy zaznaczyc (czyli podczepic)
			**********************************************************************************************************************************/
				SET @jmamWashere = true;
				UPDATE `oppo_e` p, `t_FV_DO_WZPZ_opng` t
				SET
					p.IDNWZ = _Key
				WHERE
					p.IDNOper = t.GUID
					AND
					p.IDNWZ = ''
					AND p.IdnOper_e = _Key		--	czy to jest konieczne? Niech zostanie bo ktos inny mogl to edytowac
				;
			END IF;
		END IF;
		
		IF (@handle_oper = 'Edit') THEN
		/**********************************************************************************************************************************
			Edycja
		**********************************************************************************************************************************/
			SET @X = '';
		END IF;
	END IF;	
	
END$$

DROP PROCEDURE IF EXISTS `opng_E_Let`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_Let`(
	IN _MODE VARCHAR(250),	 --	'before.run' 'after.run' ''
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL opng_E_Let('Post', @IdnOper, '', '');
		CALL opng_E_Let('CheckBeforeApply', @IdnOper, 'PozycjeZerowe', '');
			CALL opng_E_Let('DeletePozycjeZerowe', @IdnOper, '', '');
		CALL opng_E_Let('CheckBeforeApply', @IdnOper, '', '');
		
	CALL opng_E_Let('Apply', @IdnOper, '', '');
	CALL opng_E_Let('ApplyAndClear', @IdnOper, '', '');
		CALL opng_E_Let(''SetTymczasowa'', @IdnOper, %d, '');
		CALL opng_E_Let('ApplyTymczasowa', @IdnOper, '', '');
	CALL opng_E_Let('End', @IdnOper, '', '');
	-- to samo co
		CALL opng_E_Let('Clear', @IdnOper, '', '');
		i
		CALL opng_E_Let('Cancel', @IdnOper, '', '');
*/



S_opng_E_Let: BEGIN 
	IF _MODE = 'Post' THEN
		/**********************************************************************************************************************************
			Post
		**********************************************************************************************************************************/
		CALL _ng_E_LetPost('', 'OP', _Key, _Param_A, _Param_B);
	END IF;
	
	IF _MODE = 'Apply' THEN
		/**********************************************************************************************************************************
			Apply
		**********************************************************************************************************************************/
		CALL _ng_E_LetApply('', 'OP', _Key, _Param_A, _Param_B);
	END IF;
	
	IF _MODE = 'ApplyAndClear' THEN
		/**********************************************************************************************************************************
			Apply i czysc
		**********************************************************************************************************************************/
		CALL _ng_E_LetApply('', 'OP', _Key, _Param_A, _Param_B);
		CALL _ng_E_LetEnd('', 'OP', _Key, _Param_A, _Param_B);
	END IF;
	
	IF _MODE IN ('End', 'Cancel', 'Clear') THEN
		/**********************************************************************************************************************************
			Czysc
		**********************************************************************************************************************************/
		CALL _ng_E_LetEnd('', 'OP', _Key, _Param_A, _Param_B);
	END IF;
	
	IF _MODE = 'SetTymczasowa' THEN
		/**********************************************************************************************************************************
			Ustawia Tymczasowa
		**********************************************************************************************************************************/
		--	Ustaw `Tymczasowa` w naglowku E
		SET @_Tymczasowa = _VarInt(_Param_A);
		UPDATE `opng_e` n
		SET 
			n.Tymczasowa = @_Tymczasowa
		WHERE
			n.GUID = _Key
		;
		--	Ustaw `Tymczasowa` w pozycjach E
		UPDATE `oppo_e` p, `opng_e` n
		SET 
			p.Tymczasowa = n.Tymczasowa
		WHERE
			n.GUID = _Key
			AND
			p.IdnOper = n.GUID
		;
	END IF;
	
	IF _MODE = 'ApplyTymczasowa' THEN
		/**********************************************************************************************************************************
			Zapis zmian Tymczasowa
		**********************************************************************************************************************************/
		CALL oper_Delta_Update('', 'OP', _Key, '', '', '');		
		--	Ustaw `Tymczasowa` w naglowku 
		UPDATE `opng` n, `opng_e` ne
		SET 
			n.Tymczasowa = ne.Tymczasowa
		WHERE
			ne.GUID = _Key
			AND
			n.GUID = ne.GUID
		;
		--	Ustaw `Tymczasowa` w pozycjach 
		UPDATE `oppo` p, `oppo_e` pe
		SET 
			p.Tymczasowa = pe.Tymczasowa
		WHERE
			pe.IdnOper = _Key
			AND
			pe.GUID = p.GUID
		;
		--	czysc swiat E
		CALL opng_E_Let('End', _Key, '', '');
		--	oppo_mag
		CALL oppo_mag('UPDATE_OPNG_REC', _Key);
	END IF;
	
	IF _MODE = 'DeletePozycjeZerowe' THEN
		DELETE FROM `oppo_e` 
		WHERE 
			IdnOper = _Key 
			AND Ilosc = 0 AND WartBrt = 0 AND WartNet = 0 AND WartVat = 0
		;
	END IF;
	
	IF _MODE = 'CheckBeforeApply' THEN
		/**********************************************************************************************************************************
			CheckBeforeApply
		**********************************************************************************************************************************/
		
		
		DROP TEMPORARY TABLE IF EXISTS `t_CheckBeforeApply_opng_e`;
		CREATE TEMPORARY TABLE `t_CheckBeforeApply_opng_e` (
			`Typ` VARCHAR(20) NOT NULL DEFAULT '',
			`Blokuj` INTEGER NOT NULL DEFAULT 0,
			`Msg` TEXT
		)
		;
		SELECT 
			n.IDN, n.Rodzaj, n.grupaoper, IFNULL(n.nrdokfin, ''), IFNULL(n.wzordekr, ''), n.fvrudowz, n.brutto, op.IsDostawa, op.IsKorekta, ng.handle_ReadOnly
		FROM `opng_e` n, `operdoc` op, `ng_e_rec` ng
		WHERE
			n.GUID = _Key
			AND
			op.Rodzaj = n.Rodzaj
			AND
			ng.GUID = n.GUID
		INTO
			@n.IDN, @n.Rodzaj, @n.grupaoper, @n.nrdokfin, @n.wzordekr, @n.fvrudowz, @n.brutto, @op.IsDostawa, @op.IsKorekta, @ng.handle_ReadOnly
		;
		IF _Param_A = 'PozycjeZerowe' THEN
			CALL _ng_e_rec_msg_clear('', _Key, 'BeforeApply.PozycjeZerowe', '');
		/**********************************************************************************************************************************
			Same tylko pytanie o pozycje
		**********************************************************************************************************************************/
		--	Sprawdz pozycje zerowe
			IF (NOT @op.IsDostawa)
				AND NOT(@n.Rodzaj IN (@ht.CInND, @ht.CInNW)) 
				AND NOT @ng.handle_ReadOnly
				THEN
				SELECT COUNT(*) AS IlePozZerowe FROM `oppo_e` WHERE IdnOper = _Key AND Ilosc = 0 AND WartBrt = 0 AND WartNet = 0 AND WartVat = 0 INTO @n.IlePozZerowe;
				IF @n.IlePozZerowe > 0 THEN
					INSERT INTO `t_CheckBeforeApply_opng_e`
						(Msg, Typ)
						VALUES
						(REPLACE('W zestawie sa pozycje z zerowa iloscia (%d)\nCzy usunąć je ?', '%d', @n.IlePozZerowe), 'ASK')
					;
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply.PozycjeZerowe', 
						-- REPLACE('W zestawie sa pozycje z zerowa iloscia (%d)\nCzy usunąć je ?', '%d', @n.IlePozZerowe), 
						REPLACE(_res_str_get('ng_msg_BeforeApply.PozycjeZerowe', ''), '%d', @n.IlePozZerowe), 
						'Ask', '', '', '');
					-- ResID = 'ng_msg_BeforeApply.PozycjeZerowe'	
				END IF;
			END IF;
			
		END IF;

		IF _Param_A = '' THEN
			CALL _ng_e_rec_msg_clear('', _Key, 'BeforeApply', '');

			IF NOT EXISTS (SELECT GUID FROM `opng_e` WHERE GUID = _Key) THEN
				CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
					_res_str_get('ng_msg_BeforeApply.BrakDanych', ''),
					'Error', 'Stop', '', '');
				-- LEAVE S_opng_E_Let;
			END IF;
			/*
			IF NOT EXISTS (SELECT GUID FROM `zmng_e` WHERE GUID = _Key) THEN
				-- LEAVE S_zmng_E_Let;
			END IF;
			*/
		/**********************************************************************************************************************************
			Pozostale
		**********************************************************************************************************************************/
		--	Numer fin!!!!!!!!	
			IF @session.HT.IR.Kontroluj_wypelnienie_pola_nrdokfin 
				AND (@n.nrdokfin = '') 
				AND @n.Rodzaj IN (@ht.CZKFV, @ht.CKsFV, @ht.CZKKF, @ht.CKsKF, @ht.CZTUE, @ht.CZkIm, @ht.CZTKU) 
				THEN
				SET
					@CheckBeforeApply.Msg = 'Brak numeru dokumentu finansowego',
					@CheckBeforeApply.Blokuj = @session.HT.IR.UmozliwiajZapisBezWypelPolaNrDokFin
				;
				INSERT INTO `t_CheckBeforeApply_opng_e`
					(Msg, Blokuj)
					VALUES
					('Brak numeru dokumentu finansowego', NOT @session.HT.IR.UmozliwiajZapisBezWypelPolaNrDokFin)
				;
	
				CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
					-- 'Brak numeru dokumentu finansowego', 
					_res_str_get( 'ng_msg_BeforeApply.BrakNrDokFin', ''),
					'Warning', IF(NOT @session.HT.IR.UmozliwiajZapisBezWypelPolaNrDokFin, 'Stop', ''), '', '');
					-- ResID = 'ng_msg_BeforeApply.BrakNrDokFin'	
			END IF;
			
		--	Wzor dekr!!!!!!!!	
			IF @session.HT.IR.Kontroluj_wypelnienie_pola_wzordekr 
				AND (@n.wzordekr = '') 
				AND NOT(@n.Rodzaj IN (@ht.CZP_NN)) 
				AND IF(@session.globals.Owner = 'Matelbud', @n.Rodzaj IN (@ht.CRzRW, @ht.CPzPW, @ht.CZTUE, @ht.CZTKU), TRUE) 
				THEN
				SET
					@CheckBeforeApply.Msg = 'Brak wzorca dekretacji',
					@CheckBeforeApply.Blokuj = 1
				;
				INSERT INTO `t_CheckBeforeApply_opng_e`
					(Msg, Blokuj)
					VALUES
					('Brak wzorca dekretacji', 1)
				;
				CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
					-- 'Brak wzorca dekretacji', 
					_res_str_get('ng_msg_BeforeApply.BrakWzorDekr', ''),
					'Error', 'Stop', '', '');
					-- ResID = 'ng_msg_BeforeApply.BrakWzorDekr'	
				
			END IF;

			
		--	Gdy jest to WSTAWIANIE i Sprzedaż i NIE MA pozycji!!!!!!!!	
			IF (IFNULL(@n.IDN, 0) = 0)
				AND (@n.fvrudowz = 0) 
				AND (@n.grupaoper = @ht.ST)
				THEN
				SELECT COUNT(*) AS IlePoz FROM `oppo_e` WHERE IdnOper = _Key INTO @n.IlePoz;
				IF @n.IlePoz = 0 OR @n.brutto = 0 THEN
					SET
						@CheckBeforeApply.Msg = 'Nie można zapisywać dokumentu sprzedaży nie posiadającego pozycji!',
						@CheckBeforeApply.Blokuj = 1
					;
					INSERT INTO `t_CheckBeforeApply_opng_e`
						(Msg, Blokuj)
						VALUES
						('Nie można zapisywać dokumentu sprzedaży nie posiadającego pozycji!', 1)
					;
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
						-- 'Nie można zapisywać dokumentu sprzedaży nie posiadającego pozycji!', 
						_res_str_get('ng_msg_BeforeApply.BrakPozycji', ''),
						'Error', 'Stop', '', '');
					-- ResID = 'ng_msg_BeforeApply.BrakPozycji'	
				END IF;
			END IF;
			
		--	Gdy jest to WSTAWIANIE i Sprzedaż/Zakup do WZ/PZ i NIE MA zaznaczonych pozycji!!!!!!!!	
			IF (IFNULL(@n.IDN, 0) = 0)
				AND (@n.fvrudowz = 1) 
				THEN
				SELECT COUNT(*) AS IlePoz FROM `oppo_e` WHERE IdnOper_e = _Key AND IFNULL(IdnWZ, '') = _Key INTO @n.IlePoz;
				IF @n.IlePoz = 0 THEN
					SET
						@CheckBeforeApply.Msg = 'Nie można zapisywać dokumentu bez podczepionych pozycji!',
						@CheckBeforeApply.Blokuj = 1
					;
					INSERT INTO `t_CheckBeforeApply_opng_e`
						(Msg, Blokuj)
						VALUES
						('Nie można zapisywać dokumentu bez podczepionych pozycji!', 1)
					;
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
						-- 'Nie można zapisywać dokumentu bez podczepionych pozycji!', 
						_res_str_get('ng_msg_BeforeApply.BrakPodczepionychPozycji.WZPZ', ''),
						'Error', 'Stop', '', '');
					-- ResID = 'ng_msg_BeforeApply.BrakPodczepionychPozycji.WZPZ'	
				END IF;
			END IF;
			
		--	NrDokFin - powtorzony Gdy jest to WSTAWIANIE i Sprzedaż i NIE MA pozycji!!!!!!!!	
			IF NOT @n.nrdokfin IN ('', 'LOCKED') 
				-- AND (@n.grupaoper = @ht.ST)
			THEN
				SET @_Is_ZT_ZP = ((@n.grupaoper IN (@ht.ZT, @ht.ZP)) OR IF(@session.globals.Owner = 'PBUCH', @n.Rodzaj = @ht.CPzPZ, FALSE));
				CALL opng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'NrDokFin', @_Is_ZT_ZP, @Nr_ile, '');				
				IF @Nr_ile != 0 THEN
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
						-- Dokument %s o numerze "%s" już istnieje. Czy na pewno zapisać dokument ?
						CONCAT(
							REPLACE(REPLACE(
								-- 'Dokument #f# o numerze "#N#" już istnieje!', 
								_res_str_get('ng_msg_BeforeApply.PowtorzonyNrDokFin', ''),
								'#N#', @n.nrdokfin), '#f#', IF(@_Is_ZT_ZP, 'finansowy', '')),
							IF(@_Is_ZT_ZP,  
								-- CONCAT('\n', 'Czy na pewno zapisać dokument ?'),
								_res_str_get('ng_msg_BeforeApply.PowtorzonyNrDokFin.Ask', ''),
								''
							)
						),
						IF(@_Is_ZT_ZP, 'Ask', 'Error'), 
						'Stop', '', '');
					-- ResID = 'ng_msg_BeforeApply.PowtorzonyNrDokFin'	
					-- ResID = 'ng_msg_BeforeApply.PowtorzonyNrDokFin.Ask'	
				END IF;
			END IF;
			
			
			
/*			
    if not (OpTypForRdzOper(cds.FieldByName('rodzaj').AsInteger) in [ZT, ZP]) {$IFDEF PBUCH} and
        (RdzOperOpis(cds.FieldByName('rodzaj').AsInteger) <> 'PZ') {$ENDIF PBUCH} then
          Result := CheckNotRepeatedNumber(
             'opng', 'nrdokfin',
             cds.FieldByName('nrdokfin').AsString,
             cds.FieldByName('rodzaj').AsInteger,
             cds.FieldByName('grupaoper').AsInteger,
             cds.FieldByName('GUID').AsString,
             ExtractYear(cds.FieldByName('DataWystaw').AsDateTime)
             )
         else
           Result := CheckNotRepeatedNumberZTZP(
             'opng', 'nrdokfin',
             cds.FieldByName('nrdokfin').AsString,
             cds.FieldByName('rodzaj').AsInteger,
             cds.FieldByName('grupaoper').AsInteger,
             cds.FieldByName('GUID').AsString,
             ExtractYear(cds.FieldByName('DataWystaw').AsDateTime),
             cds.FieldByName('KontrGUID').AsString);
      end;
*/	  
		END IF;
		-- TUTAJ wolac ...
		IF _Param_B != '' THEN
			IF _Param_A = 'PozycjeZerowe' THEN
				CALL _ng_e_rec_msg_select('', _Key, 'BeforeApply.PozycjeZerowe', '');
			ELSE
				CALL _ng_e_rec_msg_select('', _Key, 'BeforeApply', '');
			END IF;
		ELSE
			SELECT
				t.*
			FROM `t_CheckBeforeApply_opng_e` t
			;
		END IF;
		DROP TEMPORARY TABLE IF EXISTS `t_CheckBeforeApply_opng_e`;
		
	END IF;
	
	IF _MODE = 'ChangeWaluta' THEN
		/**********************************************************************************************************************************
			ChangeWaluta
		**********************************************************************************************************************************/
		UPDATE `opng_e` ne
		SET 
			ne.Waluta = _Param_A,
			ne.Waluta_rozliczen = IF(_Param_B != 0, _Param_A, 0),
			ne.kurs_rozliczen = IF(_Param_B != 0, ne.kurs_rozliczen, 1)
		WHERE
			ne.GUID = _Key
		;
		CALL oppo_E_Let_Update('waluta.changed', '', _Key, '', '');
	END IF;
	
	IF _MODE = 'ChangeWalutaRozliczen' THEN
		/**********************************************************************************************************************************
			ChangeWalutaRozliczen
		**********************************************************************************************************************************/
		UPDATE `opng_e` ne
		SET 
			ne.Waluta_rozliczen = IF(_Param_B != 0, _Param_A, 0),
			ne.kurs_rozliczen = IF(_Param_B != 0, ne.kurs_rozliczen, 1)
		WHERE
			ne.GUID = _Key
		;
	END IF;
	
	IF _MODE = 'Update.kurs.z.zaglowka.i.przelicz' THEN
		/**********************************************************************************************************************************
			Wpisuje do pozycji kurs z naglowka i przelicza
		**********************************************************************************************************************************/
		UPDATE `oppo_e` pe, `opng_e` ne
		SET
			pe.Kurs = ne.Kurs
		WHERE
			ne.GUID = _Key
			AND
			pe.IdnOper = ne.GUID
		;
		CALL opng_E_Let('Post', _Key, '', '');
	END IF;
	
END$$


/* ************************************************************************************************************************************************************************
	Dodatkowe np. realizacja z ZM
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `opng_E_LetInsertFromZM`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_LetInsertFromZM`(
	IN _MODE VARCHAR(250),	 --	 to co w i_MODE np. 'Realizacja.ZM.%'
	IN _Key VARCHAR(38),
	IN _KeySrc VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL opng_E_LetInsertFromZM('', @IdnOper, _ZM_Key, '', '');
*/
BEGIN 
	DECLARE _ZM_Key VARCHAR(38);
	DECLARE _Rodzaj, _Rodzaj_typ, _Magazyn, _Magazyn2, _Waluta, _Typ_Przepisania_Cen INTEGER DEFAULT 0;  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IF _MODE LIKE 'Realizacja.ZM.%' THEN
		SET _ZM_Key = _KeySrc;
		/**********************************************************************************************************************************
			Naglowek
		**********************************************************************************************************************************/
		DROP TEMPORARY TABLE IF EXISTS `t_zmng_ZAM_Realizowane`;
		CREATE TEMPORARY TABLE `t_zmng_ZAM_Realizowane` LIKE `zmng_e`;
		INSERT INTO `t_zmng_ZAM_Realizowane` SELECT * FROM `zmng` WHERE GUID = _ZM_Key;
		
		IF IFNULL(_Key, '') = '' THEN
			SET _Key = NEWGUID();
		END IF;
		
		
		--	Ogólny Update z zamowienia
		UPDATE `opng_e` n, `t_zmng_ZAM_Realizowane` z
		SET
			n.Rodzaj2 = IF(n.Rodzaj = @ht.CRzWZ, 1, n.Rodzaj2),
			n.AkwizytorGUID = z.AkwizytorGUID,
			n.ZlecenieGUID = z.ZlecenieGUID,
			n.sposobplatn = z.sposobplatn,
			n.spedycja = z.spedycja,
			n.info1 = z.info1,
			n.info2 = z.info2,
			n.info3 = z.info3,
			n.info4 = z.info4,
			n.info5 = z.info5,
			n.info6 = z.info6,
			-- ??? n.RodzajDowodu = z.RodzajDowodu,	-- ?????
			n.transza_zamow = z.transza_zamow,	-- ?????
			n.uwagi = IF(@session.HT.IR.PrzepiszUwagiZZamowienia, z.uwagi, n.uwagi),
			n.Dotyczy = CONCAT(
				'Zam. nr: ', z.nrzamw,
				IF(z.nrzamwkontr != '', 
					CONCAT('Nr zam. odbiorcy: ', z.nrzamwkontr),
					''
				)	
			),	
			n.datawystaw = 
				IF(z.rodzaj IN (@ht.CZmOO, @ht.CZmEx) AND @z.zamwpermn,
				--	Gdy zam. jest perman. OO lub eksportowe to ustal dete jako pierwszy nastepny roboczy dzien
					_Get_Next_WorkDay(z.terminrealizacji),
					IF((IFNULL(n.DataWystaw, '') = '') OR ((n.Rodzaj = @ht.CMMMM) AND (@session.globals.Owner = 'CDG')),
					--	Gdy CDG i MM-ka to date jako termin realizacji
						z.terminrealizacji,
						n.datawystaw
					)
				),
			n.Wydzial =
				IF(@PrzepiszWydzial := ((z.rodzaj IN (@ht.CZmZP)) AND (n.Rodzaj IN (@ht.CRzRW, @ht.CPzPW))),
				--	Przepisz wydzial i ustaw Guid zlecenia gdy RW lub PW
					z.Wydzial,
					n.Wydzial
				),
			n.ZlecenieGUID =
				IF(@PrzepiszWydzial,
				--	i ustaw Guid zlecenia gdy RW lub PW
					IF(@session.HT.IR.PrzepiszGUIDZleceniaProd, z.GUID, n.ZlecenieGUID),
					n.ZlecenieGUID
				)
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	


		UPDATE `opng_e` n
		SET
			n.datasprzed = n.datawystaw,
			n.datawplywu = n.datawystaw
		WHERE
			n.GUID = _Key
		;	
		
		--	KatCol-e
		IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
			UPDATE `opng_e` n, `t_zmng_ZAM_Realizowane` z
			SET
				n.katcol0 = z.katcol0,
				n.katcol1 = z.katcol1,
				n.katcol2 = z.katcol2,
				n.katcol3 = z.katcol3,
				n.katcol4 = z.katcol4
			WHERE
				n.GUID = _Key
				AND
				z.GUID = _ZM_Key
			;	
		END IF;
		
		
		-- SELECT @IdnOper, @G;

		/**********************************************************************************************************************************
			Pozycje
		**********************************************************************************************************************************/
		SET _Typ_Przepisania_Cen = IFNULL(
			(SELECT IFNULL(i_Typ_Przepisania_Cen, 0) FROM `ng_e_rec` WHERE GUID = _Key LIMIT 0),
			0
		);
		SET @_Typ_Przepisania_Cen = _Typ_Przepisania_Cen;
		CALL oppo_E_Let_Insert('From.zmng', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
		
	-- ????		CALL oppo_E_Let_Update('from_opng_e', '', _IdnOper, '', '');
		
		CALL opng_E_Let('Post', _Key, '', '');
		
	-- LEAVE S__ZAM_Realizuj;
		
		/* TO PONIZEJ TO W jakims APPLY
		CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
		
		UPDATE `zmng` n
		SET
			n.ilepoz = _VarInt((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID)),
			n.IlepozZreal = _VarInt((SELECT SUM(IFNULL(p.zrealizowano = p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID))
		WHERE
			n.GUID = _ZM_Key
		;	
		UPDATE `zmng` n
		SET
			n.Status = IF(n.ilepoz = n.IlepozZreal, 2, n.Status),
			n.zrealizowane = (n.ilepoz = n.IlepozZreal)
		WHERE
			n.GUID = _ZM_Key
		;	
		*/
		
		DROP TEMPORARY TABLE IF EXISTS `t_zmng_ZAM_Realizowane`;
	END IF;
END$$

/* ************************************************************************************************************************************************************************
	Dodatkowe
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `opng_E_Tymczasowa_Set`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_Tymczasowa_Set`(
	IN _MODE VARCHAR(150),		-- 1 lub 0
	IN _Key VARCHAR(255),	
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL opng_E_Tymczasowa_Set('0', @IdnOper, '', '');		
	CALL opng_E_Tymczasowa_Set('1', @IdnOper, '', '');		
*/
opng_E_Tymczasowa_Set: BEGIN 
	SET @_Tymczasowa = (_MODE = '1');
	
	CALL Opng_E_init('EDIT', _Key, '', '', '');
	CALL Opng_E_Run('before.run', _Key, '', '', '');
	CALL Opng_E_Run('', _Key, '', '', '');
	CALL Opng_E_Run('after.run', _Key, '', '', '');
	
	--	Ustaw `Tymczasowa` w pozycjach E
	UPDATE `oppo_e` p
	SET 
		p.Tymczasowa = @_Tymczasowa
	WHERE
		p.IdnOper = _Key
	;
	--	delta
	CALL oper_Delta_Update('', 'OP', _Key, '', '', '');		
	--	czysc swiat E
	CALL opng_E_Let('End', _Key, '', '');
	
	--	Ustaw `Tymczasowa` w pozycjach 
	UPDATE `oppo` p
	SET 
		p.Tymczasowa = @_Tymczasowa
	WHERE
		p.IdnOper = _Key
	;
	--	oppo_mag
	CALL oppo_mag('UPDATE_OPNG_REC', _Key);
END$$


DROP PROCEDURE IF EXISTS `opng_e_Numeracja_po_Apply`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_e_Numeracja_po_Apply`(
	IN _MODE VARCHAR(250),
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
	CALL opng_e_Numeracja_po_Apply('', _Key, '', '', '');
*/
S_opng_e_Numeracja_po_Apply: BEGIN 
	SELECT
		n.rodzaj, n.Rodzaj_typ, IFNULL(n.NrDokFin, ''), IFNULL(n.NrDokMag, ''), IFNULL(n.NrDokKas, ''), IFNULL(n.NrWewn, ''), n.fvrudowz,
		n.KontrGUID, n.PlatnikGUID, n.ZMagazynu, n.DoMagazynu, n.NrKasy, n.RodzajDowodu, n.Rv_id, n.DataWystaw, n.DataWplywu, n.transza_zamow,
		n.tymczasowa,
		n.ugrpGUID,
		od.Grupa AS OpTyp, 
		od.TwTyp, od.MagTyp,
		od.MA_Magzyny
	FROM `opng_e` n
	INNER JOIN `operdoc` od ON od.Rodzaj = n.Rodzaj
	WHERE
		n.GUID = _Key
	INTO
		@n.rodzaj, @n.Rodzaj_typ, @n.NrDokFin, @n.NrDokMag, @n.NrDokKas, @n.NrWewn, @n.fvrudowz,
		@n.KontrGUID, @n.PlatnikGUID, @n.ZMagazynu, @n.DoMagazynu, @n.NrKasy, @n.RodzajDowodu, @n.Rv_id, @n.DataWystaw, @n.DataWplywu, @n.transza_zamow,
		@n.tymczasowa,
		@n.ugrpGUID,
		@od.OpTyp,
		@od.TwTyp, @od.MagTyp,
		@od.MA_Magzyny
	;
	
		
	/*
	Już chyba niepotrzebne
	CALL ht_rodzaj_update_zmienne(@n.rodzaj);
	*/
	IF @session.HT.IR.NieNadawajNumerowDlaTymczas AND @n.tymczasowa > 0 AND @n.rodzaj = @ht.CPzPZ THEN
		LEAVE S_opng_e_Numeracja_po_Apply;
	END IF;
	
	SET 
		@_Res1 = 
			IF(@od.OpTyp = 6, 	--	Czy KASA?
				@n.NrKasy,
				IF(@od.MagTyp IN (@ht.mtMM, @ht.mtRZ), 
					@n.ZMagazynu, 
					@n.DoMagazynu
				)
			),
		@_Res2 = 
			IF(@od.MagTyp IN (@ht.mtMM, @ht.mtPZ), 
				@n.DoMagazynu, 
				0
			)
	;	
				SET @opng_e_Numeracja_po_Apply = '_Scan_numdok_get_NumerText(_MODE, _Numer, _Rodzaj, _Mask, _Params)';
	SET
		@_Params =
		CONCAT(
			@_Res1, ';',
			@_Res2, ';',
			_VarStr(@n.DataWystaw), ';',
			@n.RodzajDowodu, ';', 
			@n.Rv_id, ';',
			@n.ugrpGUID, ';'
		)
	;
	IF IFNULL(@n.NrDokMag, '') = '' AND @od.MA_Magzyny AND @n.fvrudowz = 0 THEN
	-- NR DokMAG
		IF (@n.rodzaj = @ht.CRzWZ) AND (@session.globals.Owner = 'KONKOL') AND @n.PlatnikGUID = '{B3B597BB-72E1-473B-B972-33DA256FF062}' THEN
			CALL Auto_Biedronka_Get_NrDokMag('', @n.KontrGUID, @n.transza_zamow, @n.DataWystaw, @n.NrDokMag);
		ELSE
		/*
			IF(@od.MagTyp IN (@ht.mtPZ), @ht.CRzWZ, @ht.CPzPZ)
				@ht.mtPZ = 0, 
				@ht.mtMM = 1, 
				@ht.mtRZ = 2, 

				@ht.CRzWZ = 10,			--  WZ 
				@ht.CRzRW = 11,			--  RW 
				@ht.CPzPZ = 12,			--  PZ 
		*/
			CALL GetUniqNrForFieldAndUpdate('', 0, 
				IF(@od.MagTyp IN (@ht.mtRZ), @ht.CRzWZ, @ht.CPzPZ),  -- rodzaj mag.!!!
				IF(@od.MagTyp IN (@ht.mtRZ), @_Res1, @_Res2), 
				@_Params, @n.NrDokMag);
			-- CALL numdok_prapre_num('', @n.rodzaj, 0, '', @n.ZMagazynu, @n.DoMagazynu, @n.DataWystaw, @n.RodzajDowodu, @n.Rv_id, @n.NrDokMag);
		END IF;
		-- select @n.NrDokMag;
		/* */
		UPDATE `opng_e` n
		SET
			n.NrDokMag = @n.NrDokMag
		WHERE
			n.GUID = _Key
		;
		/* */
	END IF;
	
	/*
	@od.OpTyp = 2 -- MG		NrDokMag
	@od.OpTyp = 6 -- KS		NrDokKas
	ELSE	NrDokFin
	*/
	IF @od.OpTyp = 2 THEN -- MG		NrDokMag
		IF IFNULL(@n.NrDokMag, '') != '' THEN
			LEAVE S_opng_e_Numeracja_po_Apply;
		END IF;
		CALL GetUniqNrForFieldAndUpdate('', 0, @n.rodzaj, @_Res1, @_Params, @n.NrDokMag);
		UPDATE `opng_e` n
		SET
			n.NrDokMag = @n.NrDokMag
		WHERE
			n.GUID = _Key
		;
	ELSEIF @od.OpTyp = 6 THEN -- KS		NrDokKas
		IF IFNULL(@n.NrDokKas, '') != '' THEN
			LEAVE S_opng_e_Numeracja_po_Apply;
		END IF;
		CALL GetUniqNrForFieldAndUpdate('', 0, @n.rodzaj, @_Res1, @_Params, @n.NrDokKas);
		UPDATE `opng_e` n
		SET
			n.NrDokKas = @n.NrDokKas
		WHERE
			n.GUID = _Key
		;
	ELSE				 
	-- 		NrDokFin
		IF IFNULL(@n.NrDokFin, '') = '' THEN
			CALL GetUniqNrForFieldAndUpdate('', 0, @n.rodzaj, @_Res1, @_Params, @n.NrDokFin);
			UPDATE `opng_e` n
			SET
				n.NrDokFin = @n.NrDokFin
			WHERE
				n.GUID = _Key
			;
		END IF;
	-- 		NrWewn
		IF IFNULL(@n.NrWewn, '') = '' THEN
			CALL GetUniqNrForFieldAndUpdate('WEWN', 0, @n.rodzaj, @_Res1, @_Params, @n.NrWewn);
			UPDATE `opng_e` n
			SET
				n.NrWewn = @n.NrWewn
			WHERE
				n.GUID = _Key
			;
		END IF;
	END IF;

	
	
END$$

DROP PROCEDURE IF EXISTS `opng_E_CheckNotRepeatedNumber`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_CheckNotRepeatedNumber`(
	IN _MODE VARCHAR(150),		-- 1 lub 0
	IN _Key VARCHAR(255),	
	IN _TableName VARCHAR(255),
	IN _NrFieldName VARCHAR(255),
	IN _Is_ZT_ZP BOOLEAN,
	INOUT _Nr_Ile INTEGER,
	IN _Param_A VARCHAR(255)
)
/*
	CALL opng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'NrDokFin', @_Is_ZT_ZP, @Nr_ile, '');				
	
*/
BEGIN 
	DECLARE _SQLText TEXT;

		SET 
			@Nr_Ile = NULL,
			_SQLText = 
			"
				SELECT
					COUNT(*) AS ILE
				FROM `#table#` n, `#table#_e` ne
				WHERE
					ne.GUID = '#_Key#'
					AND IFNULL(ne.#FN_Number#, '') != ''
					AND n.GUID <> ne.GUID 
					AND n.#FN_Number# = ne.#FN_Number#
					AND Year(n.DataWystaw) = Year(ne.DataWystaw)
					AND n.deleted = 0 
					AND #GrupaOper# 
					AND #KontrGUID#
				INTO @Nr_Ile
				;
			"
		;
		SET _SQLText = REPLACE(_SQLText, '#table#', _TableName);
		SET _SQLText = REPLACE(_SQLText, '#_Key#', _Key);
		SET _SQLText = REPLACE(_SQLText, '#FN_Number#', _NrFieldName);
		SET _SQLText = REPLACE(_SQLText, '#GrupaOper#', IF(@session.globals.Owner != 'CRIST', 'n.rodzaj = ne.rodzaj', 'IF(ne.GrupaOper IN (1, 4), n.grupaoper IN (1, 4), n.rodzaj = ne.rodzaj)'));
		SET _SQLText = REPLACE(_SQLText, '#KontrGUID#', IF(NOT _Is_ZT_ZP, 'TRUE', 'n.KontrGUID = ne.KontrGUID'));
		SET @_SQLText = _SQLText;
		CALL _ExecuteCmd(_SQLText, @Error);
		SET _Nr_Ile = IFNULL(@Nr_Ile, 0);

END$$

/* ************************************************************************************************************************************************************************
	Wstawianie do, edycja `oppo_e` 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `oppo_E_Let_Insert`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_E_Let_Insert`(
	IN _MODE VARCHAR(250),
	IN _GUID VARCHAR(38),
	IN _IdnOper VARCHAR(38),
	IN _IdnTowr VARCHAR(38),
	IN _Ilosc DECIMAL(16,4),
	IN _CenaNet DECIMAL(16,4),
	IN _Param_A VARCHAR(50),	
	IN _Param_B VARCHAR(50),	
	IN _Param_C VARCHAR(50),	
	IN _Param_D VARCHAR(50)	
)
/* 
	
 */	
S_oppo_E_Let_Insert:BEGIN 
	DECLARE _ZM_Key VARCHAR(38);
	DECLARE _Typ_Przepisania_Cen INTEGER;
	
	DECLARE CZZ_Zamowienie INTEGER DEFAULT 0;
	DECLARE CZZ_KursDzis INTEGER DEFAULT 1;
	DECLARE CZZ_OdNowa INTEGER DEFAULT 2;
	
	SET _GUID = IF(IFNULL(_GUID, '') = '', NEWGUID(), _GUID);
	
	IF _MODE IN ('', 'IdnTowr') THEN
		INSERT IGNORE INTO `oppo_e` (GUID, IdnOper, IdnTowr, Ilosc, CenaNet)
			SELECT
				_GUID,
				_IdnOper,
				_IdnTowr,
				IFNULL(_Ilosc, 0.0),
				IFNULL(_CenaNet, 0.0)
		ON DUPLICATE KEY UPDATE
			IdnTowr = _IdnTowr,
			Ilosc = _Ilosc
			
		;
		CALL oppo_E_Let_Update('one_rec', _GUID, '', '', '');
		-- CALL pozycje_cenyrabat_oppo_e('', _GUID, '', '', '');
	END IF;		-- _MODE = 'IdnTowr' 
	
	IF _MODE = 'From.zmng' THEN
	/*
	np. w module C_HT_RealizacjaZM.SQL
		CALL oppo_E_Let_Insert('From.zmng', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
	*/
		SET 
			_ZM_Key = IFNULL(_Param_A, ''),
			_Typ_Przepisania_Cen = IFNULL(_Param_B, 0)
		;	
		-- test SET @oppo_E_Let_Insert = _ZM_Key;
		SELECT
			n.DataWystaw, 
			s.DisplayValue AS MonthLongName, 
			LPAD(MONTH(n.DataWystaw), 2, '0') AS MonthNo2, 
			LPAD(YEAR(n.DataWystaw), 4, '0') AS YearNo4, 
			LPAD(YEAR(n.DataWystaw) MOD 1000, 2, '0') AS YearNo2
		FROM `opng_e` n, `slowniki_pierwotne` s
		WHERE
			GUID = _IdnOper
			AND
			s.slownik_GUID = 'MIESIACE'
			AND
			s.Value = MONTH(n.DataWystaw)
		INTO
			@n.DataWystaw, @n.MonthLongName, @n.MonthNo2, @n.YearNo4, @n.YearNo2
		;
			
		CALL _IReg_Get('', 'Wymuszaj_zero_stawke_VAT_dla_STFE', 0, 'BOOLEAN', @session.HT.IR.Wymuszaj_zero_stawke_VAT_dla_STFE, FALSE);
		
		INSERT IGNORE INTO `oppo_e` 
		(GUID, IdnOper, GUIDzm, IdnTowr, Ilosc, CenaNet)
			SELECT
				NEWGUID(),
				_IdnOper,
				p.GUID,
				p.IdnTowr,
				(p.Ilosc - p.zrealizowano) AS DoRealizacji,
				p.CenaNet
			FROM `zmpo` p
			WHERE
				p.IdnNG = _ZM_Key
				AND
				(p.Ilosc - p.zrealizowano) > 0
			ORDER BY p.LP	
		;
		CALL oppo_E_Let_Update('from_opng_e', '', _IdnOper, '', '');
		-- juz nie teraz to ponizej CALL pozycje_cenyrabat_oppo_e('dla.IdnOper', _IdnOper, '', '', '');
		CALL _pozycje_cenyrabat_oppo_e('dla.IdnOper', _IdnOper, FALSE, FALSE, '', '');  	--	dla wszystkich pozycji o IdnOper = _IdnOper
		
		--	Teraz update pozycji szczegolowe
		UPDATE `oppo_e` p, `zmpo` z
		SET
			p.Lp = z.Lp,
			p.rabat = IF(_Typ_Przepisania_Cen != CZZ_OdNowa,  z.rabat, p.rabat),
			p.idnvat =
				IF(p.Rodzaj = @ht.CSpFE AND @session.HT.IR.Wymuszaj_zero_stawke_VAT_dla_STFE,
					2,	--	to stawka 0%
					IF(p.Rodzaj IN (@ht.CSTUE, @ht.CZkIm, @ht.CZTUE) AND (z.idnVat != 5),		--	<> od niepodlega
						2,	--	to stawka 0%
						IF(p.Rodzaj IN (@ht.CZkRU),		--	<> od niepodlega
							5,	--	to stawka niepodlega
							IF((p.idnvat != z.idnvat) AND (z.idnvat IN (2, 3, 5)),		--	<> od 0, zwolniony, niepodlega
								z.idnvat,
								p.idnvat
							)
						)	
					)	
				),
			p.usluga = z.usluga,
			p.towrsymb = z.towrsymb,
			
			p.towrnazwa = 
						-- UstawRokMsc(aSrcPo.FieldByName('towrnazwa').AsString, FNg.FieldByName('DataWystaw').AsDateTime);
					REPLACE(REPLACE(REPLACE(REPLACE(z.towrnazwa, '%WW', @n.MonthNo2), '%W', @n.MonthLongName), '%RRRR', @n.YearNo4), '%RR', @n.YearNo2),
			p.uwagi = z.uwagi,
			p.uwagi2 = z.uwagi2,
			p.ilosc_L_do_przeliczen = z.ilosc_L_do_przeliczen,
			p.ilosc_M_do_przeliczen = z.ilosc_M_do_przeliczen,
			p.id_przelicznika = z.id_przelicznika,
			-- p.przelicznik = z.przelicznik,
			p.opakowanie_zwrotne = z.opakowanie_zwrotne,
			
			p.Rodzaj_Przeliczenia = z.Rodzaj_Przeliczenia,
			p.WartnetWal = z.WartnetWal,
			p.OsobaGuid = z.OsobaGuid,
			p.jednostka = z.jednostka,
			p.RecepturaGuid = z.RecepturaGuid,
			p.oplata_produktowa = z.oplata_produktowa,
			p.info = z.info,	 -- ????
			p.info2 = z.info2,
			p.info3 = z.info3,
			p.info4 = z.info4,
			-- p.RcNgGuid = IF(p.Rodzaj IN (@ht.CZmOO, @ht.CZmEx, @ht.CZmZP, @ht.cZmWE), z.RcNgGuid, p.RcNgGuid), 
			p.RcNgGuid = IF(z.Rodzaj IN (@ht.CZmZP), z.RcNgGuid, p.RcNgGuid), 
			p.GUID_ZmPo_MM = z.GUID
			
		WHERE
			p.IdnOper = _IdnOper
			AND
			z.GUID = p.GUIDzm
		;

		IF (_Typ_Przepisania_Cen != CZZ_OdNowa) THEN
			UPDATE `oppo_e` p, `zmpo` z
			SET
				p.idncennik = p.idncennik,
				p.cenanet = 
					IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 -- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
						z.cenanet,
						z.cenanet
					),	
				p.cenabrt = 
					IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 -- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
						z.cenabrt,
						p.cenabrt
					)	
			WHERE
				p.IdnOper = _IdnOper
				AND
				z.GUID = p.GUIDzm
			;
		END IF;
		
		IF (_Typ_Przepisania_Cen = CZZ_Zamowienie) THEN
			UPDATE `oppo_e` p, `zmpo` z
			SET
				p.kurs = p.kurs,
				p.cenanet = 
					IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 -- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
						z.cenanet,
						z.cenanet
					),	
				p.cenabrt = 
					IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 -- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
						z.cenabrt,
						p.cenabrt
					)	
			WHERE
				p.IdnOper = _IdnOper
				AND
				z.GUID = p.GUIDzm
			;
		END IF;
		
		IF (@session.globals.Owner = 'PLISZKA') THEN
			UPDATE `oppo_e` p, `zmpo` z
			SET
				p.kat5 = p.kat5,
				p.kat6 = p.kat6,
				p.kat7 = p.kat7,
				p.kat8 = p.kat8,
				p.kat9 = p.kat9
			WHERE
				p.IdnOper = _IdnOper
				AND
				z.GUID = p.GUIDzm
			;
		END IF;
		
		IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
	-- UWAGA !!!!!!!!tu w Delphi jest {$IFDEF PrzepiszKatColeZPozycjiZM}
			UPDATE `oppo_e` p, `zmpo` z
			SET
				p.kat0 = p.kat0,
				p.kat1 = p.kat1,
				p.kat2 = p.kat2,
				p.kat3 = p.kat3,
				p.kat4 = p.kat4,
				p.kat5 = p.kat5,
				p.kat6 = p.kat6,
				p.kat7 = p.kat7,
				p.kat8 = p.kat8,
				p.kat9 = p.kat9
			WHERE
				p.IdnOper = _IdnOper
				AND
				z.GUID = p.GUIDzm
			;
		END IF;
		/* ******************************************************************************************************************************************************************************
		UWAGA na końcu GDY sa PERMANENTNE pozycje - musze wyczyscic je z zawartosci GUIDZm - bo pozycja oppo  nie moze realizowac pozycji zamowienia permanentnego
		****************************************************************************************************************************************************************************** */
			UPDATE `oppo_e` p, `zmpo` z
			SET
				p.GUIDZm = IF(z.permanentne, '', p.GUIDZm)
			WHERE
				p.IdnOper = _IdnOper
				AND
				z.GUID = p.GUIDzm
			;
		
	END IF;		-- _MODE = 'From.zmng' 
	
END$$ --	oppo_E_Let_Insert

DROP PROCEDURE IF EXISTS `oppo_E_Let_Edit`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_E_Let_Edit`(
	IN _MODE VARCHAR(250),
	IN _GUID VARCHAR(38),
	IN _IdnOper VARCHAR(38),
	IN _IdnTowr VARCHAR(38),
	IN _Ilosc DECIMAL(16,4),
	IN _CenaNet DECIMAL(16,4),
	IN _Param_A VARCHAR(50),	
	IN _Param_B VARCHAR(50),	
	IN _Param_C VARCHAR(50),	
	IN _Param_D VARCHAR(50)	
)
/*
*/
BEGIN 
	UPDATE `oppo_e` p
	SET
		p.IdnTowr = IFNULL(_IdnTowr, p.IdnTowr),
		p.Ilosc = IFNULL(_Ilosc, p.Ilosc),
		p.CenaNet = IFNULL(_CenaNet, p.CenaNet)
	WHERE
		p.GUID = _GUID
	;
	CALL oppo_E_Let_Update('one_rec', _GUID, '', '', '');
	-- CALL pozycje_cenyrabat_oppo_e('', _GUID, '', '', '');
END$$ 	--	oppo_E_Let_Edit

/* ************************************************************************************************************************************************************************
	Edycja pozycji, Wstawianie, etc 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `oppo_E_Let_Update`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_E_Let_Update`(
	IN _MODE VARCHAR(250),	 --	_handle_oper INSERT, EDIT, DELETE,
	IN _GUID VARCHAR(38),
	IN _IdnOper VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*

*/
S_oppo_E_Let_Update: BEGIN 

	DECLARE _IdnTowr VARCHAR(38);
	DECLARE _Ilosc, _CenaNet DECIMAL(16,4);
	DECLARE _SQLText TEXT;
	
	SET _GUID = IFNULL(_GUID, '');
	SET @oppo_e_Update_e_from_opng_e = 'TAK';
	
	IF _MODE IN ('one_rec', '') AND (_GUID != '') THEN
		CALL oppo_E_Let_Update('from_opng_e', _GUID, _IdnOper, '', '');
	END IF; --	_MODE = 'one_rec' 
	
	IF _MODE = 'from_opng_e' THEN
		SET @aDoIt = @session.HT.IR.Wymus_przepisywanie_katcol_do_poz;
		UPDATE `oppo_e` p, `opng_e` n
		SET
			p.Tymczasowa = n.Tymczasowa,
			p.kontridn = n.kontridn,
			p.rodzaj_typ = n.rodzaj_typ,
			p.datawystaw = n.datawystaw,
			p.datasprzed = n.datasprzed,
			p.datawplywu = n.datawplywu,
			p.ZMagazynu = IFNULL(p.ZMagazynu, n.ZMagazynu),
			p.DoMagazynu = IFNULL(p.DoMagazynu, n.DoMagazynu),
			p.kat0 = IF(n.KatCol0 != -1 AND @aDoIt, n.KatCol0, p.kat0),
			p.kat1 = IF(n.KatCol1 != -1 AND @aDoIt, n.KatCol1, p.kat1),
			p.kat2 = IF(n.KatCol2 != -1 AND @aDoIt, n.KatCol2, p.kat2),
			p.kat3 = IF(n.KatCol3 != -1 AND @aDoIt, n.KatCol3, p.kat3),
			p.kat4 = IF(n.KatCol4 != -1 AND @aDoIt, n.KatCol4, p.kat4),
			-- p.TypSymbolow = IF(n.rodzaj = 73, 0, IFNULL(@transact.TypSymbolow, 0)), 	--	CZmZP = 73;      { Zamówienie - zlecenie produkcyjne }
			p.kurs = n.kurs
		WHERE
			IF(_GUID != '', p.GUID = _GUID, p.IdnOper = _IdnOper)
			AND
			n.GUID = p.IdnOper
			AND
			n.fvrudowz = 0
		;	
	END IF; --	_MODE = 'from_opng_e' 
	
	IF _MODE = 'lp' THEN
		-- POBIERZ z oper_doc SortTyp !!!!!!!!!!!!!!!!!!
		SET @aSortTyp = 0;
		
		SET @LP = 0;
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_lp`;
		IF @aSortTyp = @ht.COpTypSortTyp_NONE THEN
			CREATE TEMPORARY TABLE `t_oppo_e_lp` AS
				SELECT
					p.GUID, 
					_VarInt(@LP := @LP + 1) AS LP
				FROM `oppo_e` p
				LEFT JOIN `TowrNg` t ON p.idntowr = t.GUID
				WHERE
					p.IdnOper = _IdnOper
				-- ORDER BY IF(p.Idn = 0, CONCAT('z', p.LOCALTIME), CONCAT('a', p.IDN))
				-- ORDER BY IF(p.Idn = 0, LPAD(p.LP, 8, '0'), CONCAT('a', p.IDN))
				ORDER BY IF(p.Idn = 0, CONCAT('Z', p.LP), CONCAT('A', p.IDN))
			;		
		ELSEIF @aSortTyp = @ht.COpTypSortTyp_Usluga_TreeNode_Symbol THEN
			CREATE TEMPORARY TABLE `t_oppo_e_lp` AS
				SELECT
					p.GUID, 
					_VarInt(@LP := @LP + 1) AS LP
				FROM `oppo_e` p
				LEFT JOIN `TowrNg` t ON p.idntowr = t.GUID
				WHERE
					p.IdnOper = _IdnOper
				ORDER BY p.usluga, t.Treenode, p.towrsymb
			;		
		ELSEIF @aSortTyp = @ht.COpTypSortTyp_Usluga_Symbol THEN
			CREATE TEMPORARY TABLE `t_oppo_e_lp` AS
				SELECT
					p.GUID, 
					_VarInt(@LP := @LP + 1) AS LP
				FROM `oppo_e` p
				WHERE
					p.IdnOper = _IdnOper
				ORDER BY IF(IFNULL(p.IdnTowr, '') = '', 'ZZZZZZ', ''), p.usluga, p.towrsymb	
				-- było ORDER BY p.usluga, p.towrsymb
			;		
		END IF;

		UPDATE `oppo_e` p, `t_oppo_e_lp` t
		SET
			p.lp = t.lp
		WHERE 
			p.GUID = t.GUID
		; 
		DROP TEMPORARY TABLE `t_oppo_e_lp`;
	END IF; --	_MODE = 'lp' 
	
	IF _MODE = 'rozrzucanie' THEN
		CALL t_oppo_rozrzuc('DROP', _IdnOper, 0, '', '');
		
		
		LEAVE S_oppo_E_Let_Update;	--	na razie
		
	--	koszt_nabycia	
		CALL t_oppo_rozrzuc('INIT', _IdnOper, 0, '', '');
		
		UPDATE `t_oppo_rozrzuc` t,  `oppo_e` p
		SET
			t.Waga = p.WartNet -- p.koszt_nabycia -- p.WartNet
		WHERE
			p.IdnOper = _IdnOper
			AND
			t.GUID = p.GUID
		;
	
		CALL t_oppo_rozrzuc('CALC', _IdnOper, 0, '', '');
		
		UPDATE `t_oppo_rozrzuc` t,  `oppo_e` p
		SET
			p.koszt_nabycia = p.RValue
		WHERE
			p.IdnOper = _IdnOper
			AND
			t.GUID = p.GUID
		;

	--	WartClo
		/*
		Bazuje to na koszcie, który jest dodawany do wartosciNet i zwiększa w ten
		sposób podstawę naliczenia cła}
		aWartNetTemp := Rnd2(DS.FieldByName('WartNetWal').AsCurrency*DS.FieldByName('Kurs').AsCurrency) +
		DS.FieldByName('koszt_nabycia').AsCurrency;
		Result := Rnd2(aWartNetTemp*DS.FieldByName('stawkacla').AsCurrency/100);
		*/
		CALL t_oppo_rozrzuc('INIT', _IdnOper, 0, '', '');
		
		UPDATE `t_oppo_rozrzuc` t,  `oppo_e` p
		SET
			t.Waga = _Rnd2(
				stawkacla*(WartNetWal * Kurs + koszt_nabycia)/100
			)
		WHERE
			p.IdnOper = _IdnOper
			AND
			t.GUID = p.GUID
		;
	
		CALL t_oppo_rozrzuc('CALC', _IdnOper, 0, '', '');
		
		UPDATE `t_oppo_rozrzuc` t,  `oppo_e` p
		SET
			p.WartClo = p.RValue
		WHERE
			p.IdnOper = _IdnOper
			AND
			t.GUID = p.GUID
		;

		CALL t_oppo_rozrzuc('DROP', _IdnOper, 0, '', '');
		
	END IF; --	_MODE = 'rozrzucanie' 
	
	IF _MODE = 'waluta.changed' THEN
	--	zmiana waluty czyli de facto kursu 
		SELECT p.Kurs FROM `oppo_e` p WHERE p.IdnOper = _IdnOper LIMIT 1 INTO @p.OLDKurs;
		UPDATE `opng_e` n,  `oppo_e` p
		SET
			p.Kurs = n.Kurs,
			p.cenanet =  _Rnd(p.cenanet*@p.OLDKurs/n.Kurs, IF(n.Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN))
		WHERE
			n.GUID = _IdnOper
			AND
			p.IdnOper = _IdnOper
			AND
			n.Kurs > 0
		;
	END IF; --	_MODE = 'waluta.changed'
END$$

DROP PROCEDURE IF EXISTS `oppo_E_Editor_WZPZ`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_E_Editor_WZPZ`(
	IN _MODE VARCHAR(250),	 --	_handle_oper INSERT, EDIT, DELETE,
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL oppo_E_Editor_WZPZ('Init', @IdnOper, '', '');
		SELECT t.* FROM `t_opng_e_wzpz` t;
		CALL oppo_E_Editor_WZPZ('select.detail', @IdnOper, '', '');
	CALL oppo_E_Editor_WZPZ('Apply', @IdnOper, '', '');
	CALL oppo_E_Editor_WZPZ('Cancel', @IdnOper, '', '');
*/
S_oppo_E_Editor_WZPZ: BEGIN 

	-- DECLARE _IdnTowr VARCHAR(38);
	
	IF _MODE = 'Init' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_opng_e_wzpz`;
		CREATE TEMPORARY TABLE `t_opng_e_wzpz`
			SELECT
				_VarInt(MAX(p.IdnWZ = _Key)) AS Checked,
				n.NrDokMag, n.DataWystaw, n.datasprzed,
				IF(n.Rodzaj = 10, n.ZMagazynu, n.DoMagazynu) AS Magazyn,
				m.Opis AS MagazynStr, 
				COUNT(*) AS IlePozycji, 
				n.Netto, -- SUM(WartNet) AS Netto, 
				n.Vat, -- SUM(WartVat) AS Vat, 
				n.Brutto, -- SUM(WartBrt) AS Brutto, 
				p.idnOper AS GUID,
				n.NrWewn, n.Wzordekr , n.Waluta, n.Kurs,
				w.Symbol AS SymbolWaluty
			FROM `oppo_e` p
			LEFT JOIN `opng` n ON n.GUID = p.IdnOper
			INNER JOIN `Magazyny` m ON m.IDNMagazynu = IF(n.Rodzaj = 10, n.ZMagazynu, n.DoMagazynu) 
			INNER JOIN `waluty` w ON w.IDN = n.Waluta 
			WHERE
				p.idnOper_e = _Key
				AND
				!(p.IdnOper <=> p.IdnOper_e)
				-- p.idnWZ = @_Key
			GROUP BY p.idnOper
		;
		ALTER TABLE `t_opng_e_wzpz` ADD PRIMARY KEY GUID(`GUID`);
	END IF; --	_MODE = 'Init' 
	
	IF _MODE = 'Apply' THEN
		UPDATE `t_opng_e_wzpz` t, `oppo_e` p
		SET
			p.IdnWZ = IF(t.Checked, _Key, '')
		WHERE
			p.idnOper_e = _Key
			AND
			p.idnOper = t.GUID
		;
		CALL opng_E_Let('Post', _Key, '', '');
		DROP TEMPORARY TABLE IF EXISTS `t_opng_e_wzpz`;
	END IF; --	_MODE = 'Apply' 
	
	IF _MODE = 'Cancel' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_opng_e_wzpz`;
	END IF; --	_MODE = 'Cancel' 
	
	IF _MODE = 'select.detail' THEN
			SELECT
				p.GUID,
				p.idnOper,
				p.TowrSymb,
				p.TowrNazwa,
				p.Ilosc, 
				p.CenaNet, 
				p.WartNetWal, 
				p.WartBrtWal, 
				p.WartNet, 
				p.WartBrt, 
				p.Kurs,
				v.shortName AS VatStr
			FROM `oppo_e` p
			LEFT JOIN `v_erp_vat` v ON v.ID = p.IdnVat
			WHERE
				p.idnOper_e = _Key
				AND
				!(p.IdnOper <=> p.IdnOper_e)
		;
	END IF; --	_MODE = 'Apply' 
	
END$$

/* ************************************************************************************************************************************************************************
	Rozrzucanie 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `t_oppo_rozrzuc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `t_oppo_rozrzuc`(
	IN _MODE VARCHAR(250),
	IN _IdnOper VARCHAR(38),
	IN _SValue DOUBLE,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL t_oppo_rozrzuc('INIT', _IdnOper, 0, '', '');
	CALL t_oppo_rozrzuc('CALC', _IdnOper, 0, '', '');
	CALL t_oppo_rozrzuc('DROP', _IdnOper, 0, '', '');
*/
S_t_oppo_rozrzuc: BEGIN 
	DECLARE _SWaga, _SRValue, _Nadw DECIMAL(16,6);
	DECLARE _LasLP INTEGER;

	IF _MODE = 'INIT' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_rozrzuc`;
		CREATE TEMPORARY TABLE `t_oppo_rozrzuc`
		SELECT 
			_VarInt(0) AS Lp,
			p.GUID,
			_VarDecimal(0) AS Waga,	
			_VarDecimal(0) AS RValue	--	recValue
		FROM `oppo_e` p
		WHERE
			p.IdnOper = _IdnOper
		;
	END IF; --	_MODE = 'INIT'

	IF _MODE = 'CALC' THEN
		
		DELETE FROM `t_oppo_rozrzuc` WHERE Waga = 0;
		
		SET @oppoLP = 0;
		UPDATE `t_oppo_rozrzuc`
		SET
			LP = _VarInt(@oppoLP := @oppoLP + 1)
		;
		SET _SWaga = IFNULL(_VarDecimal((SELECT SUM(Waga) FROM `t_oppo_rozrzuc`)), 0);
		-- SELECT _SValue, _SWaga;
		UPDATE `t_oppo_rozrzuc` t
		SET
			t.RValue = _Rnd2(IF(_SWaga = 0, 0, t.Waga*_SValue/_SWaga))
		;
		SELECT MAX(Lp), SUM(RValue) FROM `t_oppo_rozrzuc` INTO _LasLP, _SRValue;
		SET _Nadw = _SRValue - _SValue;
		UPDATE `t_oppo_rozrzuc`
		SET
			RValue = RValue - _Nadw
		WHERE
			LP = _LasLP
		;

	END IF; --	_MODE = 'CALC'
	
	IF _MODE = 'DROP' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_rozrzuc`;
	END IF; --	_MODE = 'DROP'
	
END$$

/* ************************************************************************************************************************************************************************
	Grupowanie po polach grp_ 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `oppo_grp_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_grp_tools`(
	IN _MODE VARCHAR(250),
	IN _IdnOper VARCHAR(38),
	IN _GRP_GUID VARCHAR(38),
--	DOUBLE,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL oppo_grp_tools('WIZ.Init', _IdnOper, 0, '', '');
	CALL oppo_grp_tools('WIZ.Init', _IdnOper, 0, '', '');
*/
S_oppo_grp_tools: BEGIN 
-- 	DECLARE _SWaga, _SRValue, _Nadw DECIMAL(16,6);
-- 	DECLARE _LasLP INTEGER;
	
	IF _MODE = 'WIZ.Init' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp_n`;
		CREATE TEMPORARY TABLE `t_oppo_e_grp_n`
			SELECT
				p.GUID,
				_VarInt(p.grp_GUID = _GRP_GUID) AS Checked,
				_VarStr(_GRP_GUID) AS `_GRP_GUID`,
				p.grp_TowrSymb,
				p.grp_TowrNazwa,
				IF(p.grp_Ilosc = 0, 1, p.grp_Ilosc) AS grp_Ilosc,
				p.grp_Jednostka,
				p.idnvat
			FROM `oppo_e` p
			WHERE
				p.GUID = _GRP_GUID
		;
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp_p`;
		CREATE TEMPORARY TABLE `t_oppo_e_grp_p`
			SELECT
				p.GUID,
				_VarInt((p.grp_GUID = _GRP_GUID) OR (p.GUID = _GRP_GUID)) AS Checked,
				p.towrsymb,
				IF(IFNULL(p.TowrNazwa2, '') != '', p.TowrNazwa2, p.TowrNazwa) AS TowrNazwa,
				-- p.towrnazwa,
				p.Ilosc,
				pn.idnvat,
				v.ShortName AS VatStr,
				J.Nazwa AS JednostkaStr,
				(p.idnvat = pn.idnvat) AS OK_idnvat,
				(p.GUID = _GRP_GUID) AS IS_BigBrother
			FROM `oppo_e` p
			LEFT JOIN `t_oppo_e_grp_n` pn ON pn.GUID = _GRP_GUID
			LEFT JOIN `v_erp_vat` v ON v.ID = p.idnvat
			LEFT JOIN Jednostki J ON J.idn = p.Jednostka 
			WHERE
				((p.idnOper = _IdnOper) OR (p.idnWZ = _IdnOper))
				AND
				p.grp_GUID IN ('', _GRP_GUID)
				-- AND p.GUID != _GRP_GUID
				
		;
		ALTER TABLE `t_oppo_e_grp_p` ADD PRIMARY KEY GUID(`GUID`);
	END IF; --	_MODE = 'WIZ.Init' 
	
	IF _MODE = 'WIZ.Apply' THEN
		UPDATE `t_oppo_e_grp_n` t, `oppo_e` p
		SET
			p.grp_GUID = p.GUID,
			p.grp_TowrSymb = t.grp_TowrSymb,
			p.grp_TowrNazwa = t.grp_TowrNazwa,
			p.grp_Jednostka = t.grp_Jednostka,
			p.grp_Ilosc = t.grp_Ilosc
		WHERE
			p.GUID = t.GUID
		;
		UPDATE `t_oppo_e_grp_p` t, `oppo_e` p
		SET
			p.grp_GUID = IF(t.Checked, _GRP_GUID, '')
		WHERE
			p.GUID = t.GUID
			AND
			t.OK_idnvat
		;
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp_n`;
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp_p`;
	END IF; --	_MODE = 'WIZ.Apply' 
	
	IF _MODE = 'WIZ.Cancel' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp_n`;
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp_p`;
	END IF; --	_MODE = 'WIZ.Cancel' 
	
	IF _MODE = 'Ungroup' THEN
		UPDATE `oppo_e` p
		SET
			p.grp_GUID = ''
		WHERE
			p.idnOper_e = _IdnOper
			AND
			p.grp_GUID = _GRP_GUID
		;
	END IF; --	_MODE = 'Ungroup' 
	
	IF _MODE = 'select.view' THEN
	
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp`;
		CREATE TEMPORARY TABLE `t_oppo_e_grp`
			SELECT
				IF(@IS.grp := (IFNULL(p.grp_GUID, '') != ''),  p.grp_GUID, p.GUID) AS GUID,
				IF(@IS.grp := (IFNULL(p.grp_GUID, '') != ''),  p.grp_GUID, p.GUID) AS GGUID,
				@IS.grp_Node := @IS.grp AND (p.grp_GUID = p.GUID) AS IS_Grp_Node,
				IF(@IS.grp, p.grp_GUID, '') AS grp_GUID,
				p.IdnTowr,
				p.towrsymb,
				-- p.towrnazwa,
				IF(IFNULL(p.TowrNazwa2, '') != '', p.TowrNazwa2, p.TowrNazwa) AS TowrNazwa,
				p.Jednostka,
				p.Ilosc,
				-- MAX(IF(@IS.grp, grp_TowrSymb, p.towrsymb)) AS towrsymb,
				-- MAX(IF(@IS.grp, grp_TowrNazwa, p.towrnazwa)) AS towrnazwa,
				-- IF(@IS.grp, grp_Ilosc, p.Ilosc) AS Ilosc,
				SUM(WartNet) AS WartNet,
				SUM(WartVat) AS WartVat,
				SUM(WartBrt) AS WartBrt,
				SUM(WartNetWal) AS WartNetWal,
				SUM(WartBrtWal) AS WartBrtWal,
				p.CenaNet,
				p.cenanetWal,
				p.CenaBrt
			FROM `oppo_e` p
			WHERE
				(p.idnOper = _IdnOper) OR (p.idnWZ = _IdnOper) 
			GROUP BY GGUID
		;
		ALTER TABLE `t_oppo_e_grp` ADD PRIMARY KEY GUID(`GUID`), ADD KEY grp_GUID(`grp_GUID`);
		
		IF _IdnOper = '' THEN 
			TRUNCATE `t_oppo_e_grp`;
		END IF;
		
		UPDATE `t_oppo_e_grp` tp, `oppo_e` p
		SET
			tp.towrsymb = p.grp_TowrSymb,
			tp.towrnazwa = p.grp_TowrNazwa,
			tp.Ilosc = p.grp_Ilosc,
			tp.Jednostka = IFNULL(p.grp_Jednostka, tp.Jednostka),
			tp.IdnTowr = p.grp_IdnTowr
		WHERE
			tp.grp_GUID != ''
			AND
			tp.GUID = p.GUID
		;
		UPDATE `t_oppo_e_grp` tp
		SET
			tp.CenaNet = IF(tp.Ilosc != 0, tp.WartNet/tp.Ilosc, 0),
			tp.CenaBrt = IF(tp.Ilosc != 0, tp.WartBrt/tp.Ilosc, 0),
			tp.CenaNetWal = IF(tp.Ilosc != 0, tp.WartNetWal/tp.Ilosc, 0)
		WHERE
			tp.grp_GUID != ''
		;

		SELECT
			tp.GUID,
			tp.IdnTowr,
			tp.TowrSymb,
			tp.TowrNazwa,
			tp.Ilosc, 
			tp.Jednostka,
		
			tp.CenaNet, 
			tp.CenaBrt,
			tp.CenaNetWal,
			tp.WartNet,
			tp.WartVat,
			tp.WartBrt,
			tp.WartNetWal,
			tp.WartBrtWal,
			
			v.shortName AS VatStr,
			J.Nazwa AS JednostkaStr, 
			(tp.grp_GUID != '') AS IS_Grp_Node,
			p.*
			FROM `t_oppo_e_grp` tp
			INNER JOIN `oppo_e` p ON p.GUID = tp.GUID
			LEFT JOIN `v_erp_vat` v ON v.ID = p.IdnVat
			LEFT JOIN Jednostki J ON J.idn = tp.Jednostka 
			WHERE
				TRUE
			ORDER BY IS_Grp_Node DESC, tp.TowrSymb 
		;
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_e_grp`;
	END IF; --	_MODE = 'select.view' 

	IF _MODE = 'select.view.detail' THEN
		SELECT
			p.GUID,
			p.grp_GUID,
			p.IdnTowr,
			p.TowrSymb,
			IF(IFNULL(p.TowrNazwa2, '') != '', p.TowrNazwa2, p.TowrNazwa) AS TowrNazwa,
			p.Ilosc, 
			p.CenaNet, 
			p.CenaBrt,
			p.CenaNetWal,
			p.WartNet,
			p.WartVat,
			p.WartBrt,
			p.WartNetWal,
			p.WartBrtWal,
			v.shortName AS VatStr,
			J.Nazwa AS JednostkaStr 
			FROM `oppo_e` p 
			LEFT JOIN `v_erp_vat` v ON v.ID = p.IdnVat
			LEFT JOIN Jednostki J ON J.idn = p.Jednostka 
			WHERE
				TRUE
				-- AND p.idnOper_e = _IdnOper
				AND (p.idnOper = _IdnOper) OR (p.idnWZ = _IdnOper) 

				AND p.grp_GUID != ''
			ORDER BY grp_GUID, TowrSymb
		;
	END IF; --	_MODE = 'select.view.detail' 

	
END$$

/* ************************************************************************************************************************************************************************
	
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `opng_E_LetInsertCorr`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_LetInsertCorr`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(38),
	IN _Ng_GUID_orig VARCHAR(38),	--	GUID opng oryginału
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255)
)
/*
	Wolany gdy :
	wystawiamy korektę ze znanym GUID-em oryginału
		CALL opng_E_LetInsertCorr('KOR', _Key, _Ng_GUID_orig, '', '', '', '');
	lub gdy mamy listę pozycji do skorygowania (nie znamy konkretnego/jednego dokumentu oryginalnego) 3 pozycje są w temp.tabeli `t_oppo_corr_init_bi`
		CALL opng_E_LetInsertCorr('KOR.from.t_oppo_corr_init_bi', _Key, '', '', '', '', '');
*/
S_opng_E_LetInsertCorr: BEGIN
	IF _MODE = 'KOR' THEN
		--	pola aKorektaIdn, KorektaGUID, korektaDokFin, korektaData, dotyczy := 'korekta dokumentu: ST FV z dnia: 2013-01-10, Nr X1'
		CALL oppo_corr_e_prepare_After_Insert('Prepare.sql', _Key, '');
		CALL oppo_corr_e_prepare_After_Insert('fill.t_oppo_corr_init_bi.form.orig', '', _Ng_GUID_orig);	
		CALL oppo_corr_e_prepare_After_Insert('insert.to.oppo_corr_e.from.t_oppo_corr_init_bi', _Key, _Ng_GUID_orig);
		/*
		CALL opng_E_LetInsertCorr('NG', _Key, _Ng_GUID_orig, '', '', '', '');
		INSERT INTO `oppo_corr_e` 
			(GUID, GUID_orig, IdnOper_Corr, b_idnTowr)  
			SELECT 
				NewGUID(), p.GUID, _Key, '' 
			FROM `oppo` p
			WHERE 
				p.IdnOper = _Ng_GUID_orig
		; 
		*/
		CALL oppo_corr_e_prepare_After_Insert('', _Key, '');
	END IF;	
	
	IF _MODE = 'KOR.from.t_oppo_corr_init_bi' THEN
		CALL oppo_corr_e_prepare_After_Insert('Prepare.sql', _Key, '');
		CALL oppo_corr_e_prepare_After_Insert('insert.to.oppo_corr_e.from.t_oppo_corr_init_bi', _Key, _Ng_GUID_orig);
		/*
		SET @_Ng_GUID_orig = '';
		SELECT 
			p.IdnOper 
		FROM `t_oppo_corr_init_bi` i
		INNER JOIN `oppo` p ON p.GUID = i.GUID_orig
		LIMIT 1
		INTO 
			@_Ng_GUID_orig
		;
		SET @_Ng_GUID_orig = IFNULL(@_Ng_GUID_orig, '');
		CALL opng_E_LetInsertCorr('NG', _Key, @_Ng_GUID_orig, '', '', '', '');
		-- ktoś juz to zrobił np. INSERT INTO `t_oppo_corr_init_bi` (GUID_orig) SELECT p.GUID FROM `oppo` p WHERE p.IdnOper = 'xxx'; 
		INSERT INTO `oppo_corr_e` 
			(GUID, GUID_orig, IdnOper_Corr, b_idnTowr) 
			SELECT 
				NewGUID(), i.GUID_orig, _Key, '' 
			FROM `t_oppo_corr_init_bi` i
			-- INNER JOIN `oppo` p ON p.GUID = i.GUID_orig
		; 
		/*
		to musi dać error bo nie ma  i.GUID i i.j_ilosc
		UPDATE `t_oppo_corr_init_bi` i, `oppo_corr_e` p
		SET
			p.j_ilosc = i.j_ilosc
		WHERE 
			i.GUID = p.GUID	
		;
		*/
		CALL oppo_corr_e_prepare_After_Insert('', _Key, '');
	END IF;
	
	IF _MODE = 'NG' THEN
		UPDATE `opng_e` e, `opng` o -- potem `v_opng_all` o
		SET
			e.KontrGUID = o.KontrGUID,
			e.OsobaGUID = o.OsobaGUID,
			e.AreaGUID = o.AreaGUID,
			e.Waluta = o.Waluta,
			e.zmagazynu = o.zmagazynu,
			e.domagazynu = o.domagazynu
		WHERE
			o.GUID = _Ng_GUID_orig
			AND
			e.GUID = _Key
		;	
	END IF;
	
END$$

DROP PROCEDURE IF EXISTS `opng_E_LetPostCorr`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_LetPostCorr`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)

)
BEGIN
	IF _MODE = '' THEN
		DELETE o FROM `oppo_e` o, `oppo_corr_e` oc	
			WHERE
				o.IdnOper = _Key
				AND o.GUID = oc.GUID
				AND NOT (oc.Changed = 1)
		;
		SET _Param_B = IFNULL(_Param_B, '');	
	--	WSTAW nieistniejace wpisy
		INSERT IGNORE INTO `oppo_e` 
			(
				GUID, idnoper, idnoperfin, GUIDKorPo, -- rodzaj, -- aidnkr, 
				zmagazynu, domagazynu, 
				-- datasprzed, datawystaw, datawplywu, 
			--	symboper, grupaoper, 
				kontridn, 
				idntowr, towrsymb, towrnazwa, usluga, towrnazwa2, 
				ilosc, idncennik, cenanet, rabat, wartnet, idnvat, wartvat, wartbrt, cenabrt, lp, 
			--	grupuj, 
				Jednostka, wspolplatnosc, 
				kat0, kat1, kat2, kat3, kat4, kat5, kat6, kat7, kat8, kat9, 
				kurs, 
				-- tymczasowa, -- iloscdo, 
				-- cenanetWal, cenanetzRabWal, 
				wartnetWal, 
				CenaNetWalzRab, 
				rodzaj_przeliczenia, pkwiu, 
				uwagi, 
				uwagi2 
			)
			
			SELECT
				oc.GUID, oc.IdnOper_corr, oc.IdnOper_corr, oc.GUID_orig, -- n.rodzaj, -- aidnkr, 
				orig.domagazynu, orig.zmagazynu, 
				-- n.datasprzed, n.datawystaw, n.datawplywu, 
			--	symboper, grupaoper, 
				orig.kontridn, 
				oc.j_idnTowr, oc.j_towrsymb, oc.j_towrnazwa, orig.usluga, oc.j_towrnazwa2, 
				oc.j_ilosc, orig.idncennik, oc.j_cenanet, oc.j_rabat, oc.j_wartnet, oc.j_idnvat, oc.j_wartvat, oc.j_wartbrt, oc.j_cenabrt, orig.lp, 
			--	grupuj, 
				oc.j_Jednostka, orig.wspolplatnosc, 
				orig.kat0, orig.kat1, orig.kat2, orig.kat3, orig.kat4, orig.kat5, orig.kat6, orig.kat7, orig.kat8, orig.kat9, 
				oc.j_kurs, 
				-- n.tymczasowa,			--	IF(_Param_B != '', 1, orig.tymczasowa), 
				-- orig.iloscdo, 
				-- orig.cenanetWal, orig.cenanetzRabWal, 
				oc.j_wartnetWal, 
				orig.CenaNetWalzRab, 
				oc.j_rodzaj_przeliczenia, oc.j_pkwiu, 
				oc.j_uwagi, 
				oc.j_uwagi2 
				
			FROM `oppo_corr_e` oc	
			-- INNER JOIN `opng_e` n ON n.GUID = oc.IdnOper_corr
			INNER JOIN `oppo` orig ON orig.GUID = oc.GUID_orig
			WHERE
				oc.IdnOper_corr = _Key
				AND (oc.Changed = 1)
		;
		
		DROP TEMPORARY TABLE IF EXISTS `t_final_oppo_corr_e`;
		CREATE TEMPORARY TABLE `t_final_oppo_corr_e` 
			SELECT
				oc.*,
				n.Rodzaj AS RodzajNg,
				od.AntyRodzaj AS AntyRodzajNg,
				n.zmagazynu AS zmagazynuNg, 
				n.domagazynu AS domagazynuNg, 
				n.Rodzaj,
				n.zmagazynu, 
				n.domagazynu, 
				_VarDouble(j_ilosc - b_ilosc) AS Ilosc_Diff,
				_VarDouble(j_wartnet - b_wartnet) AS Wartnet_Diff,
				((j_ilosc - b_ilosc) > 0) AS Is_AntyRodzaj
			FROM `oppo_corr_e` oc
			INNER JOIN `opng_e` n ON n.GUID = oc.IdnOper_corr
			INNER JOIN `operdoc` od ON od.Rodzaj = n.Rodzaj
			WHERE
				oc.IdnOper_corr = _Key
				AND (oc.Changed = 1)
		;	
		
		UPDATE `t_final_oppo_corr_e`  
		SET
			Rodzaj = 
				IF(Is_AntyRodzaj,
					AntyRodzajNg,
					RodzajNg
				),
			zmagazynu =	
				IF(Is_AntyRodzaj OR (Wartnet_Diff > 0),
					domagazynuNg,
					zmagazynuNg
				),
			domagazynu =	
				IF(Is_AntyRodzaj OR (Wartnet_Diff > 0),
					zmagazynuNg,
					domagazynuNg
				)
		;
		  
		UPDATE `oppo_e` o, `t_final_oppo_corr_e` oc
		SET
			-- o.Rodzaj = oc.Rodzaj,	
			-- o.zmagazynu = oc.zmagazynu,
			-- o.domagazynu = oc.domagazynu,
			
			o.Ilosc = (j_ilosc - b_ilosc),
			o.wartnet = (j_wartnet - b_wartnet),
			o.wartnetWal = (j_wartnetWal - b_wartnetWal),
			o.wartvat = (j_wartvat - b_wartvat),
			o.wartbrt = (j_wartbrt - b_wartbrt),
			
			o.rodzaj_przeliczenia = (j_rodzaj_przeliczenia),
			o.cenanet = (j_cenanet),
			o.cenabrt = (j_cenabrt),
			o.rabat = (j_rabat),
			o.idnvat = (j_idnvat),
			o.kurs = (j_kurs),
			o.pkwiu = (j_pkwiu),
			o.TowrSymb = (j_TowrSymb),
			o.TowrNazwa = (j_TowrNazwa),
			o.TowrNazwa2 = (j_TowrNazwa2),
			o.uwagi = (j_uwagi),
			o.uwagi2 = (j_uwagi2),
			o.Jednostka = (j_Jednostka)
			
		WHERE
			o.GUID = oc.GUID
		;
		DROP TEMPORARY TABLE IF EXISTS `t_final_oppo_corr_e`;
		
	
	
	
	END IF;
	
END$$

/* ************************************************************************************************************************************************************************
	Narzędzia	
************************************************************************************************************************************************************************ */	
-- WON NIE UŻYWANA
DROP PROCEDURE IF EXISTS `oppo_corr_init_bi`$$

-- WON NIE UŻYWANA
DROP PROCEDURE IF EXISTS `oppo_corr_find_bi`$$

DROP PROCEDURE IF EXISTS `oppo_corr_e_prepare_After_Insert`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_corr_e_prepare_After_Insert`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(38),
	IN _Ng_GUID_orig VARCHAR(38)	--	GUID opng oryginału

)
/*
	Wołany w kilku trybach
	1. inicjując sql-ki na lata ubiegłe i terażniejszy
		CALL oppo_corr_e_prepare_After_Insert('Prepare.sql', _Key, '');
	2. aby przepiać z oryginału pozycje do tabeli `t_oppo_corr_init_bi`
		CALL oppo_corr_e_prepare_After_Insert('fill.t_oppo_corr_init_bi.form.orig', '', '_Ng_GUID_orig');
	3. aby przepisac pozycje z tabeli `t_oppo_corr_init_bi` do `oppo_corr_e`
		CALL oppo_corr_e_prepare_After_Insert('insert.to.oppo_corr_e.from.t_oppo_corr_init_bi', _Key, _Ng_GUID_orig);
	4. Wolany gdy zasilimy tabele oppo_corr_e np. z oryginalu lub jakiegos tempa
		CALL oppo_corr_e_prepare_After_Insert('', _Key, _Ng_GUID_orig);
	
	
	'fill.t_oppo_corr_init_bi.form.orig'
*/
S_oppo_corr_e_prepare_After_Insert: BEGIN
	DECLARE _SQLText_Update, _SQLText_SELECT_Ng_GUID_orig, _SQLText_Update_opng_e, _SQLText_t_FIND_PREV_CORR_IN_OPPO, _SQLText_insert_from_orig, _SQLText, _SQLFullText TEXT;
	DECLARE _oppo_corr_e_bi_ilekorekt INTEGER;
	DECLARE _oppo_corr_e_bi_idn INTEGER;
	DECLARE _oppo_corr_e_bi_Rok_Str VARCHAR(10);

	

	--	Przygotowanie SQL-ek z lat poprzednich
	SET @i = 0;
	SET @_Ng_GUID_orig = '';

	IF _MODE = 'Prepare.sql' THEN
		SET _SQLText_insert_from_orig = 
		"
			INSERT IGNORE INTO `t_oppo_corr_init_bi` 
				SELECT 
					p.GUID 
				FROM `#oppo#` p 
				WHERE 
					p.IdnOperFin = '#_Ng_GUID_orig#'
				ORDER BY p.LP	
			; 
		";
		SET _SQLText_Update = 
		"
			UPDATE `oppo_corr_e` c, `#oppo#` o, `#opng#` ng_oryg, `operdoc` od 
			SET
				c.b_idnTowr = o.idnTowr, 
				c.b_towrsymb = o.towrsymb, 
				c.b_towrnazwa = o.towrnazwa, 
				c.b_towrnazwa2 = o.towrnazwa2, 
				c.b_rodzaj_przeliczenia = o.rodzaj_przeliczenia,
				c.b_ilosc = o.ilosc, 
				c.b_cenanet = o.cenanet, 
				c.b_cenabrt = o.cenabrt, 
				c.b_rabat = o.rabat, 
				c.b_idnvat = o.idnvat, 
				c.b_wartnet = o.wartnet, 
				c.b_kurs = o.kurs,
				c.b_wartnetWal = o.wartnetWal, 
				c.b_wartvat = o.wartvat, 
				c.b_wartbrt = o.wartbrt, 
				c.b_pkwiu = o.pkwiu, 
				c.b_uwagi = o.uwagi, 
				c.b_uwagi2 = o.uwagi2, 
				c.b_Jednostka = o.Jednostka,
				c.KorektaDotyczy = 
					_VarStr(IFNULL(CONCAT('korekta dokumentu: ', IFNULL(od.Opis, ''), '  Nr ', ng_oryg.NrDOkFin, ' wyst. ', ng_oryg.DataWystaw), ''))
			WHERE
				c.IdnOper_corr = '#_Key#'
				AND
				o.GUID = c.GUID_orig
				AND
				ng_oryg.GUID = o.IdnOperFin
				AND
				od.Rodzaj = ng_oryg.Rodzaj
			;	
		";
		SET 
			_SQLText_Update = REPLACE(_SQLText_Update, '#_Key#', _Key
			);


		SET _SQLText_SELECT_Ng_GUID_orig = 
		"
			SELECT 
				o.IdnOperFin 
			FROM `oppo_corr_e` c
			INNER JOIN `#oppo#` o ON o.GUID = c.GUID_orig
			WHERE
				c.IdnOper_corr = '#_Key#'
			LIMIT 1
			INTO 
				@_Ng_GUID_orig
			;
		";
		SET 
			_SQLText_SELECT_Ng_GUID_orig = REPLACE(_SQLText_SELECT_Ng_GUID_orig, '#_Key#', _Key
			);
		
		SET _SQLText_Update_opng_e = 
		"
			UPDATE `opng_e` e, `#opng#` o, `operdoc` od 
			SET
				e.rodzaj_typ = 1,
				e.calc_ver = 1,
				e.KontrGUID = o.KontrGUID,
				e.OsobaGUID = o.OsobaGUID,
				e.AreaGUID = o.AreaGUID,
				e.Waluta = o.Waluta,
				e.Kurs = o.Kurs,
				e.Waluta_Rozliczen = o.Waluta_Rozliczen,
				e.Kurs_Rozliczen = o.Kurs_Rozliczen,
				e.zmagazynu = o.domagazynu,
				e.domagazynu = o.zmagazynu,
				e.aKorektaIdn = o.IDN, 
				e.KorektaGUID = o.GUID, 
				e.korektanrdokfin = o.NrDokFin, 
				e.korektaData = o.DataWystaw, 
				e.dotyczy = CONCAT('korekta dokumentu: ', od.Nazwa,' z dnia: ', o.Datawystaw, ' Nr ', o.NrDokFin),
				e.kolumnaKPR = o.kolumnaKPR
			WHERE
				o.GUID = '#_Ng_GUID_orig#'
				AND
				e.GUID = '#_Key#'
				AND
				od.Rodzaj = o.Rodzaj
			;	
		";
		SET 
			_SQLText_Update_opng_e = REPLACE(_SQLText_Update_opng_e, '#_Key#', _Key
			);

		SET _SQLText_t_FIND_PREV_CORR_IN_OPPO = 
		"
		INSERT IGNORE INTO `t_FIND_PREV_CORR_IN_OPPO`
				SELECT 
					t.GUID AS ID,
					o.IDN,
					o.GUIDKorPo,
					o.idnTowr, 
					o.towrsymb, 
					o.towrnazwa, 
					o.towrnazwa2, 
					o.rodzaj_przeliczenia,
					o.ilosc, 
					o.cenanet, 
					o.cenabrt, 
					o.CenaNetWalzRab,
					o.rabat, 
					o.idnvat, 
					o.wartnet, 
					o.kurs,
					o.wartnetWal, 
					o.wartvat, 
					o.wartbrt, 
					o.pkwiu, 
					o.uwagi, 
					o.uwagi2, 
					o.Jednostka
					-- o.*
				FROM `t_FIND_PREV_in_oppo_corr` t, `#oppo#` o	
				WHERE
					t.PrevGUID = ''
					AND
					o.GUIDKorPo = t.GUID_orig
					AND 
					NOT(o.rodzaj IN (65, 66, 70))  --  //bez CDoND i CDoNW        APRO ?? TEST and O.rodzaj <> 70 ) nie uwzgledniamy zwrotow gdyz je pobieramy do korekty
		"
		;
			
			
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_def_SQLs`;
		CREATE TEMPORARY TABLE `t_oppo_def_SQLs`
			SELECT
				lp, n.table_name, n.table_name_NG, 
				_SQLText_insert_from_orig AS SQLText_insert_from_orig,
				_SQLText_Update AS SQLText_Update,
				_SQLText_SELECT_Ng_GUID_orig AS SQLText_SELECT_Ng_GUID_orig,
				_SQLText_Update_opng_e AS SQLText_Update_opng_e,
				_SQLText_t_FIND_PREV_CORR_IN_OPPO AS SQLText_t_FIND_PREV_CORR_IN_OPPO
			FROM `v_oppo_def` n
			ORDER BY lp DESC
		;
		UPDATE `t_oppo_def_SQLs` n
		SET
			SQLText_insert_from_orig = REPLACE(REPLACE(SQLText_insert_from_orig, '#oppo#', n.table_name), '#opng#', n.table_name_NG),
			SQLText_Update = REPLACE(REPLACE(SQLText_Update, '#oppo#', n.table_name), '#opng#', n.table_name_NG),
			SQLText_SELECT_Ng_GUID_orig = REPLACE(REPLACE(SQLText_SELECT_Ng_GUID_orig, '#oppo#', n.table_name), '#opng#', n.table_name_NG),
			SQLText_Update_opng_e = REPLACE(REPLACE(SQLText_Update_opng_e, '#oppo#', n.table_name), '#opng#', n.table_name_NG),
			SQLText_t_FIND_PREV_CORR_IN_OPPO = REPLACE(REPLACE(SQLText_t_FIND_PREV_CORR_IN_OPPO, '#oppo#', n.table_name), '#opng#', n.table_name_NG)
		;	
	END IF;

	IF _MODE = 'fill.t_oppo_corr_init_bi.form.orig' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_corr_init_bi`;
		CREATE TEMPORARY TABLE `t_oppo_corr_init_bi` (	
			`GUID_orig` VARCHAR(38) NOT NULL COMMENT 'oppo guid oryginału'	-- ,
		)	
		;
		
		SET @Test = 'fill.t_oppo_corr_init_bi.form.orig';
		SET _Ng_GUID_orig = IFNULL(_Ng_GUID_orig, '');
		IF  _Ng_GUID_orig = '' THEN
			LEAVE S_oppo_corr_e_prepare_After_Insert;	
		END IF;
		--	czyszczę `t_oppo_corr_init_bi`
		TRUNCATE `t_oppo_corr_init_bi`;
			BEGIN
				DECLARE done BOOL DEFAULT FALSE;
				DECLARE _Table_Name, _Table_Name_NG VARCHAR(250);
				DECLARE c_proc CURSOR FOR
					SELECT
						n.table_name, 
						SQLText_insert_from_orig
					FROM `t_oppo_def_SQLs` n
					ORDER BY lp DESC
					;
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
				OPEN c_proc;
				loop_fill_t_oppo_corr_init_bi: LOOP
					FETCH c_proc INTO _Table_Name, _SQLText_insert_from_orig;
					IF done THEN LEAVE loop_fill_t_oppo_corr_init_bi;END IF;
				--	wstawiam do `t_oppo_corr_init_bi` z oryginalu
					SET _SQLText = REPLACE(_SQLText_insert_from_orig, '#_Ng_GUID_orig#', _Ng_GUID_orig);
					SET @_SQLText = _SQLText;
					CALL _ExecuteCmd(_SQLText, @Error);
				END LOOP;
				CLOSE c_proc;
			END;
	
	END IF;	--	_MODE = 'fill.t_oppo_corr_init_bi.form.orig'
	
	IF _MODE = 'insert.to.oppo_corr_e.from.t_oppo_corr_init_bi' THEN
		INSERT INTO `oppo_corr_e` 
			(GUID, GUID_orig, IdnOper_Corr, b_idnTowr, Temporary) 
			SELECT 
				NewGUID(), i.GUID_orig, _Key, '', True 
			FROM `t_oppo_corr_init_bi` i
		; 
	
	END IF;	--	_MODE = 'insert.to.oppo_corr_e.from.t_oppo_corr_init_bi'
	
	IF _MODE = '' THEN
		SET @_SQLText = '';
		--	0 	Gdy _Ng_GUID_orig PUSTY to szukaj dokumenu-oryginalu w opng lub opngXXXX
		IF _Ng_GUID_orig = '' THEN
			BEGIN
				DECLARE done BOOL DEFAULT FALSE;
				DECLARE _Table_Name, _Table_Name_NG VARCHAR(250);
				DECLARE c_proc CURSOR FOR
					SELECT
						n.table_name, n.table_name_NG,
						SQLText_SELECT_Ng_GUID_orig,
						SQLText_Update_opng_e
					FROM `t_oppo_def_SQLs` n
					ORDER BY lp DESC
					;
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
				OPEN c_proc;
				loop_upd_ng: LOOP
					FETCH c_proc INTO _Table_Name, _Table_Name_NG, _SQLText_SELECT_Ng_GUID_orig, _SQLText_Update_opng_e;
					IF done THEN LEAVE loop_upd_ng;END IF;
					SET 
						@_Ng_GUID_orig = '',
						_SQLText = _SQLText_SELECT_Ng_GUID_orig
					;
					-- SET @_SQLText_SELECT_Ng_GUID_orig = _SQLText;
					CALL _ExecuteCmd(_SQLText, @Error);
					SET _Ng_GUID_orig = IFNULL(@_Ng_GUID_orig, '');
					IF _Ng_GUID_orig != '' THEN
						SET _SQLText = _SQLText_Update_opng_e;
						SET 
							_SQLText = REPLACE(_SQLText, '#_Ng_GUID_orig#', _Ng_GUID_orig
							);
						SET @_SQLText = _SQLText;
						SET @_SQLText_Ng_GUID_orig = @_SQLText;
						CALL _ExecuteCmd(_SQLText, @Error);
						LEAVE loop_upd_ng;
					END IF;	
				END LOOP;
				CLOSE c_proc;
			END;
		END IF;

		--	1 	Tutaj mam na pewno GUID oryg. oppo -> ALE CZY MAM już wypełnione ceny, towar etc. ? JEŚLI NIE to wstaw z oryginału
			BEGIN
				DECLARE done BOOL DEFAULT FALSE;
				DECLARE _Table_Name, _Table_Name_NG VARCHAR(250);
				DECLARE c_proc CURSOR FOR
					SELECT
						n.table_name, n.table_name_NG,
						SQLText_Update
					FROM `t_oppo_def_SQLs` n
					ORDER BY lp DESC
					;
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
				OPEN c_proc;
				loop1_init: LOOP
					FETCH c_proc INTO _Table_Name, _Table_Name_NG, _SQLText_Update;
					IF done THEN
						LEAVE loop1_init;
					END IF;
					SET @i = @i + 1;
					SET _SQLText = _SQLText_Update;
					SET @_SQLText = _SQLText;
					SET @_SQLText_1 = @_SQLText;
					CALL _ExecuteCmd(_SQLText, @Error);
				END LOOP;
				CLOSE c_proc;
			END;

	-- leave S_oppo_corr_e_prepare_After_Insert;	


		--	2 	Szukaj poprzednich korekt pośród `oppo_corr`
		--		A) najpierw z `oppo_corr`
					SET @Test = 'CREATE TEMPORARY TABLE `t_FIND_PREV_in_oppo_corr`';
					DROP TEMPORARY TABLE IF EXISTS `t_FIND_PREV_in_oppo_corr`;
					CREATE TEMPORARY TABLE `t_FIND_PREV_in_oppo_corr`
						SELECT
							c.GUID,
							c.GUID_orig,
							IFNULL(
								(
								SELECT oc.GUID FROM `oppo_corr` oc WHERE oc.GUID != c.GUID AND oc.GUID_orig = c.GUID_orig ORDER BY oc.datawystaw DESC, oc.IDN DESC LIMIT 1
								),
								''
							) AS PrevGUID
						FROM `oppo_corr_e` c
						WHERE
							c.IdnOper_corr = _Key
						
					;
					
					UPDATE `t_FIND_PREV_in_oppo_corr` t, `oppo_corr_e` c, `oppo_corr` cprev
					SET
						c.GUID_corr_prev = t.PrevGUID,
						
						c.b_idnTowr = cprev.j_idnTowr, 
						c.b_towrsymb = cprev.j_towrsymb, 
						c.b_towrnazwa = cprev.j_towrnazwa, 
						c.b_towrnazwa2 = cprev.j_towrnazwa2, 
						c.b_rodzaj_przeliczenia = cprev.j_rodzaj_przeliczenia,
						c.b_ilosc = cprev.j_ilosc, 
						c.b_cenanet = cprev.j_cenanet, 
						c.b_cenabrt = cprev.j_cenabrt, 
						c.b_rabat = cprev.j_rabat, 
						c.b_idnvat = cprev.j_idnvat, 
						c.b_wartnet = cprev.j_wartnet, 
						c.b_kurs = cprev.j_kurs,
						c.b_wartnetWal = cprev.j_wartnetWal, 
						c.b_wartvat = cprev.j_wartvat, 
						c.b_wartbrt = cprev.j_wartbrt, 
						c.b_pkwiu = cprev.j_pkwiu, 
						c.b_uwagi = cprev.j_uwagi, 
						c.b_uwagi2 = cprev.j_uwagi2, 
						c.b_Jednostka = cprev.j_Jednostka,
						c.Changed = 0
					WHERE
						t.PrevGUID != ''
						AND
						c.GUID = t.GUID
						AND
						cprev.GUID = t.PrevGUID
					;	


		--		B) pozostałe moga jeszcze byc korygowane z dawnych guid_korpo!!!
			
				SET @i = 0;
				DROP TEMPORARY TABLE IF EXISTS `t_FIND_PREV_CORR_IN_OPPO`;
				CREATE TEMPORARY TABLE `t_FIND_PREV_CORR_IN_OPPO`
					SELECT 
						_varStr('') AS ID,
						o.IDN,
						o.GUIDKorPo,
						o.idnTowr, 
						o.towrsymb, 
						o.towrnazwa, 
						o.towrnazwa2, 
						o.rodzaj_przeliczenia,
						o.ilosc, 
						o.cenanet, 
						o.cenabrt, 
						o.CenaNetWalzRab,
						o.rabat, 
						o.idnvat, 
						o.wartnet, 
						o.kurs,
						o.wartnetWal, 
						o.wartvat, 
						o.wartbrt, 
						o.pkwiu, 
						o.uwagi, 
						o.uwagi2, 
						o.Jednostka
					FROM `oppo` o
					WHERE
						FALSE
				;
				BEGIN
					DECLARE done BOOL DEFAULT FALSE;
					DECLARE _Table_Name VARCHAR(250);
					DECLARE c_proc CURSOR FOR
						SELECT
							n.table_name,
							SQLText_t_FIND_PREV_CORR_IN_OPPO
						FROM `t_oppo_def_SQLs` n
						ORDER BY lp DESC
						;
					DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
					OPEN c_proc;
					loop2: LOOP
						FETCH c_proc INTO _Table_Name, _SQLText_t_FIND_PREV_CORR_IN_OPPO;
						IF done THEN LEAVE loop2; END IF;
							
						SET _SQLText = _SQLText_t_FIND_PREV_CORR_IN_OPPO;
						SET @_SQLText = _SQLText;
						CALL _ExecuteCmd(_SQLText, @Error);
						
					END LOOP;
					CLOSE c_proc;
				END;
				
			--	NIE MA poprzednich korekt pośród `oppo_corr`
			--	stary sposób szukania czy pozycje były korygowane
			--	3. Najpierw idnmax
			
			/* 
				select * `t_FIND_PREV_CORR_IN_OPPO`; 
				SELECT MAX(IDN) FROM `oppo` INTO @ht.oppo.max.idn;
			*/
				DROP TEMPORARY TABLE IF EXISTS `t_oppo_corr_init_bi_sum`;
				CREATE TEMPORARY TABLE `t_oppo_corr_init_bi_sum`	
				SELECT 
					o.GUIDKorPo,
					SUM(1) AS ilekorekt,
					SUM(o.ilosc) AS Ilosc,  -- ilosc sumarycz. koryg. pozycji wcześn moich UWAGA wart sa (-)
					SUM(o.wartnet) AS wartnet, 
					SUM(o.wartnetwal) AS wartnetwal, 
					SUM(o.wartvat) AS wartvat, 
					SUM(o.wartbrt) AS wartbrt, 
					SUM(o.CenaNetWalzRab) AS CenaNetWalzRab,  -- slon added
					(SUM(-o.ilosc)) AS bylowszystkich,  -- ABS - po uzgodnieniu z apro i dodalem jeszcze "-"
					MAX(o.idn) AS idn 
				FROM `t_FIND_PREV_CORR_IN_OPPO` o
				GROUP BY o.GUIDKorPo
				;

				UPDATE `t_FIND_PREV_in_oppo_corr` t, `oppo_corr_e` c, `t_FIND_PREV_CORR_IN_OPPO` o, `t_oppo_corr_init_bi_sum` s 
				SET
					c.b_idnTowr = o.idnTowr, 
					c.b_towrsymb = o.towrsymb, 
					c.b_towrnazwa = o.towrnazwa, 
					c.b_towrnazwa2 = o.towrnazwa2, 
					c.b_rodzaj_przeliczenia = o.rodzaj_przeliczenia,
					
					c.b_ilosc = c.b_ilosc + s.ilosc, 
					c.b_cenanet = o.cenanet, 
					c.b_cenabrt = o.cenabrt, 
					c.b_rabat = o.rabat, 
					c.b_idnvat = o.idnvat, 
					c.b_wartnet = c.b_wartnet + s.wartnet, 
					c.b_kurs = o.kurs,
					c.b_wartnetWal = c.b_wartnetWal + s.wartnetWal, 
					c.b_wartvat = c.b_wartvat + s.wartvat, 
					c.b_wartbrt = c.b_wartbrt + s.wartbrt, 
					c.b_pkwiu = o.pkwiu, 
					c.b_uwagi = o.uwagi, 
					c.b_uwagi2 = o.uwagi2, 
					c.b_Jednostka = o.Jednostka
					,
					j_uwagi2 = CONCAT(o.IDN, ' ', o.towrsymb),
					c.Changed = 0
				WHERE
					c.IdnOper_corr = _Key
					AND
					s.GUIDKorPo = c.GUID_orig
					AND
					o.IDN = s.IDN
				;	

				
				DROP TEMPORARY TABLE IF EXISTS `t_oppo_corr_init_bi_sum`;
				DROP TEMPORARY TABLE IF EXISTS `t_FIND_PREV_CORR_IN_OPPO`;
				/* */
	-- LEAVE S_oppo_corr_e_prepare_After_Insert;		
			

				UPDATE `oppo_corr_e` c
				SET
					j_idnTowr = b_idnTowr, 
					j_towrsymb = b_towrsymb, 
					j_towrnazwa = b_towrnazwa, 
					j_towrnazwa2 = b_towrnazwa2, 
					j_rodzaj_przeliczenia = b_rodzaj_przeliczenia,
					j_ilosc = b_ilosc, 
					j_cenanet = b_cenanet, 
					j_cenabrt = b_cenabrt, 
					j_rabat = b_rabat, 
					j_idnvat = b_idnvat, 
					j_wartnet = b_wartnet, 
					j_kurs = b_kurs,
					j_wartnetWal = b_wartnetWal, 
					j_wartvat = b_wartvat, 
					j_wartbrt = b_wartbrt, 
					j_pkwiu = b_pkwiu, 
					j_uwagi = b_uwagi, 
					j_uwagi2 = b_uwagi2, 
					j_Jednostka = b_Jednostka,
					Temporary = 0,
					c.Changed = 0
				WHERE
					c.IdnOper_corr = _Key
				;
			
	END IF;
		
END$$

DROP PROCEDURE IF EXISTS `oppo_corr_check_doc_is_disabled`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_corr_check_doc_is_disabled`(
	IN _MODE VARCHAR(150),
	IN _IdnOper VARCHAR(38)	--	GUID dokumentu (korekty)
)
/*
	CALL oppo_corr_check_doc_is_disabled('', @IdnOper);
*/
BEGIN
	DROP TEMPORARY TABLE IF EXISTS `t_oppo_corr_check_doc_is_disabled`;
	CREATE TEMPORARY TABLE `t_oppo_corr_check_doc_is_disabled`
		SELECT
			DISTINCT c.GUID_corr_prev
		FROM `oppo_corr` c
		WHERE 
			c.IdnOper_corr = _IdnOper
			AND
			IFNULL(c.GUID_corr_prev, '') != '' 
	;
	SELECT
	--	COUNT(*) AS X, 
		n.GUID, 
		_VarStr(CONCAT('dok.: ', n.NrdokFin, ' wyst. dnia ', n.Datawystaw)) AS Opis
	FROM `t_oppo_corr_check_doc_is_disabled` c, `oppo_corr` cc, `opng` n
	WHERE
		c.GUID_corr_prev = cc.GUID
		AND
		n.GUID = cc.IdnOper_corr 
	LIMIT 1	
	;	
	DROP TEMPORARY TABLE IF EXISTS `t_oppo_corr_check_doc_is_disabled`;
END$$


/* ************************************************************************************************************************************************************************
	inicjalne 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `t_oppo_corr_init_bi_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `t_oppo_corr_init_bi_init`(
	IN _MODE VARCHAR(250)
)
BEGIN 
	IF NOT IFNULL(@ht.t_oppo_corr_init_bi_init, FALSE)    OR    TRUE  THEN
		DROP TEMPORARY TABLE IF EXISTS `t_oppo_corr_init_bi`;
		CREATE TEMPORARY TABLE `t_oppo_corr_init_bi` (	
			`GUID_orig` VARCHAR(38) NOT NULL COMMENT 'oppo guid oryginału'	-- ,
			/*
			`b_idnTowr` VARCHAR(38) NOT NULL COMMENT 'Towar',
			`b_towrsymb` VARCHAR(38) NOT NULL DEFAULT '',
			`b_towrnazwa` VARCHAR(150) DEFAULT NULL,
			`b_towrnazwa2` VARCHAR(150) DEFAULT NULL,
			`b_rodzaj_przeliczenia` INT(11) DEFAULT NULL,
			`b_ilosc` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`b_cenanet` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`b_cenabrt` DOUBLE(16,4) DEFAULT NULL,
			`b_rabat` DOUBLE(16,4) DEFAULT '0.0000',
			`b_idnvat` INT(11) DEFAULT NULL,
			`b_wartnet` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`b_kurs` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`b_wartnetWal` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`b_wartvat` DOUBLE(16,4) DEFAULT NULL,
			`b_wartbrt` DOUBLE(16,4) DEFAULT NULL,
			`b_pkwiu` VARCHAR(15) NOT NULL DEFAULT '',
			`b_uwagi` TEXT,
			`b_uwagi2` TEXT,
			`b_Jednostka` INT(11) DEFAULT NULL
			*/
		)	
		;
	END IF;
	SET @ht.t_oppo_corr_init_bi_init = FALSE;
	TRUNCATE `t_oppo_corr_init_bi`;
	SET @ht.t_oppo_corr_init_bi_init = TRUE;
--	SET
--	;
END$$

DROP PROCEDURE IF EXISTS `oppo_corr_init`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `oppo_corr_init`(
	IN _MODE VARCHAR(250)
)
BEGIN 
	SET @ht.oppo_corr_init_init = TRUE;
	CALL t_oppo_corr_init_bi_init('');
END$$

DELIMITER ;
