DELIMITER $$

/* ************************************************************************************************************************************************************************
	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 
set @Deb.1 = "CALL _ng_e_rec_init();";
	CALL _ng_e_rec_init(_MODE, 'OP', _Key, _handle_UserGUID, _Param_A, _Param_B);
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, '', '', '');
*/
S_Opng_E_init_set: BEGIN 
set @.1.i_Tymczasowa = i_Tymczasowa;
	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
	);
/*
Korekty
teraz jest ...
*/	
	IF i_MODE LIKE 'KOR%' THEN
		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;
			ELSE
				LEAVE S_Opng_E_init_set;
			END IF;
		END IF;
		
		SET
			i_Magazyn1_Kasa = NULL,
			i_Magazyn2 = NULL
		;

	--	Uwaga ustaw zawsze magazyny z pozycji oryginalu
		SELECT 
			p.Domagazynu, 	--	tu na odwrot
			p.Zmagazynu 	--	tu tez na odwrot
		FROM `oppo` p
		WHERE
			p.IdnOperFin = i_Input_GUID
		LIMIT 1
		INTO
			i_Magazyn1_Kasa,
			i_Magazyn2
		;
		/* 
		ALE ALE
				if (User60.GetUprawnienie('Korekta_z_innego_magazynu') > 0) and
				 (SubOper_Operacje.MA_Magzyny) and (self.TrybAutomatyczny = 0) then
				begin
				if (cds.FieldByName('ZMagazynu').AsInteger <> 0) and Assigned(DBPlacesMagazyny) then
				  DBPlacesMagazyny.GUI_ChoiceForField(cds.FieldByName('ZMagazynu'), 'Wybierz magazyn pobrania');
				if (cds.FieldByName('DoMagazynu').AsInteger <> 0) and Assigned(DBPlacesMagazyny) then
				  DBPlacesMagazyny.GUI_ChoiceForField(cds.FieldByName('DoMagazynu'), 'Wybierz magazyn docelowy-');
				end;
		PATRZ WIZARD C_HT_ng_e.sql
		*/
		
		UPDATE `ng_e_rec` r, `opng` n
		SET
			r.i_KontrGUID = n.KontrGUID, 
			r.i_Magazyn1_Kasa = IFNULL(i_Magazyn1_Kasa, n.Domagazynu), 	--	tu na odwrot
			r.i_Magazyn2 = IFNULL(i_Magazyn2, n.Zmagazynu), 	--	tu tez na odwrot
			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;
	
/*
... a bylo (dwa ify)
	
	IF i_MODE = 'KOR' THEN
		UPDATE `ng_e_rec` r, `opng` n
		SET
			r.i_KontrGUID = n.KontrGUID, 
			r.i_Magazyn1_Kasa = n.Domagazynu, 	--	tu na odwrot
			r.i_Magazyn2 = n.Zmagazynu, 	--	tu tez na odwrot
			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, 	--	tu na odwrot
				r.i_Magazyn2 = n.Zmagazynu, 	--	tu tez na odwrot
				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),
	
	SET @watch = '_ng_e_rec_set_from_another_doc.x';
	CALL _ng_e_rec_set_from_another_doc(i_MODE, _Key, _OtherKey, i_Param_A, i_Param_B, i_Param_C);
	
	SET @watch = '_ng_e_rec_set_from_another_doc';
	
	IF i_MODE LIKE 'Realizacja.ZM.%' THEN
		SET _ZM_Key = _OtherKey;
		
											SET @watch = 'select into';
		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;
set @xxxx.Realizacja.ZM = 'Realizuj.1';		
		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
		;	
set @xxxx.Realizacja.ZM = 'Realizuj.2';		
	--	BEZPIECZNIK!!!!!!!!!!
		SET 
			_Rodzaj = IF(_Rodzaj < 0, 1, _Rodzaj)
		;	
				SET @watch = 'CALL Opng_E_init_set';
	--	nawet jesli ju zwolano to Opng_E_init_set to i tak teraz raz jeszcze. Np. wola sie to w  _zmng_Realizuj ale potem Opng_E_init_set_from_another_doc wiec tu gdzie jestesmy
	
set @xxxx.Realizacja.ZM = 'Realizuj.3';		
		CALL t_CShowRealizowalnosc_Tools('Before.Realizacja', _Key, _ZM_Key, '', '', '', '');	
set @xxxx.Realizacja.ZM = 'Realizuj.4';		

set 
@_Magazyn = _Magazyn, @_Magazyn2 = _Magazyn2
;
		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.PlatnikGUID, 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, @z.PlatnikGUID, _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', '', '', '');
	lub
	CALL Opng_E_Run('all', 'IdnOper', '', '', '');
*/
S_Opng_E_Run: BEGIN 

	IF _MODE = 'all' THEN
		CALL Opng_E_Run('before.run', _Key, _Param_A, _Param_B, _Param_C);
		CALL Opng_E_Run('', _Key, _Param_A, _Param_B, _Param_C);
		CALL Opng_E_Run('after.run', _Key, _Param_A, _Param_B, _Param_C);
		LEAVE S_Opng_E_Run;
	END IF;

					SET @_POS_POS_2_INT = "CALL _ng_E_Run(_MODE, _Key, _Param_A, _Param_B, _Param_C);";		
	
	CALL _ng_E_Run(_MODE, _Key, _Param_A, _Param_B, _Param_C);
	
	
	IF _MODE = '' THEN
SET @XXX = 'Opng_E_Run.1';	
	/**********************************************************************************************************************************
		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
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "Opng_E_Run", '', '', '');
		
		/**********************************************************************************************************************************
			INSERT
		**********************************************************************************************************************************/
SET @XXX = 'Opng_E_Run.2';	
			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 _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL opng_E_LetInsertFromZM", '', '', '');
				CALL opng_E_LetInsertFromZM(@i_MODE, _Key, @i_Input_GUID, '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL opng_E_LetInsertFromZM", '', '', '');
			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
				;
			--	Przepisz platnika z WZ-ki (pierwszej z brzegu)	
			--	mozemy tak zrobic bo to jest faza inicjacji gdy wskazyjemy konkretna np. WZ i mówimy ze z niej wlasnie ma byc FV
				UPDATE `opng_e` n
				SET 
					n.PlatnikGUID = IFNULL((SELECT t.PlatnikGUID FROM `t_FV_DO_WZPZ_opng` t LIMIT 1), n.PlatnikGUID) 
				WHERE
					n.GUID = _Key
				;
			END IF;
			CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "Opng_E_Run", '', '', '');

		END IF;
		
		IF (@handle_oper = 'Edit') THEN
		/**********************************************************************************************************************************
			Edycja
		**********************************************************************************************************************************/
			SET @X = '';
		END IF;
SET @XXX = 'Opng_E_Run.3';	
	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('DeletePozycjeZPustymIdnTowr', @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 = 'refresh.real.to.e' THEN
		CALL _ng_E_Tools('refresh.real.to.e', _Key, 'OP', _Param_A);
	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 = 'DeletePozycjeZPustymIdnTowr' THEN
		DELETE FROM `oppo_e` 
		WHERE 
			IdnOper = _Key 
			AND IFNULL(IdnTowr, '') = ''
		;
	END IF;
	
	IF _MODE = 'CheckBeforeApply' THEN
		/**********************************************************************************************************************************
			CheckBeforeApply
		**********************************************************************************************************************************/
		set @YYYY = 1;
		
		SELECT 
			n.IDN, n.Rodzaj, n.grupaoper, IFNULL(n.nrdokfin, ''), IFNULL(n.NrWewn, ''), IFNULL(n.nrdokmag, ''), IFNULL(n.wzordekr, ''), 
			n.datawplywu,
			n.fvrudowz, n.brutto,  
			-- NIE !!! bo NULL musi byc zbadana ponizej !!!!! IFNULL(n.ZMagazynu, 0), IFNULL(n.DoMagazynu, 0),
			n.ZMagazynu, n.DoMagazynu,
			op.MA_Kontrahenta,
			op.IsDostawa, op.IsKorekta, op.MA_Magzyny, op.MA_Detale,
			op.Grupa AS OpTyp,
			ng.handle_ReadOnly,
			n.korektatytulem,
			n.kontrnip
		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.NrWewn, @n.nrdokmag, @n.wzordekr, 
			@n.datawplywu,
			@n.fvrudowz, @n.brutto, @n.ZMagazynu, @n.DoMagazynu, 
			@op.MA_Kontrahenta,
			@op.IsDostawa, @op.IsKorekta, @op.MA_Magzyny, @op.MA_Detale,
			@op.OpTyp,
			@ng.handle_ReadOnly,
			@n.korektatytulem,
			@n.kontrnip
		;
		
		
		IF @session.globals.HT.erp_obj_counters_values_e_1_rec THEN
		--	$DEFINE SetNewUniqueNumber
			CALL erp_obj_counters_values_e_1_rec_tools('APPLY.from.e', 'OP', _Key, '', '', '', '');		
			SET 
				@n.nrdokfin = '?', @n.NrWewn = '?', @n.nrdokmag = ''
			;
			SELECT 
			(
			CASE 
			WHEN 1r.ObjType_1 = 'opng.nrdokfin' THEN 1r.NUMBER_Text_1 
			WHEN 1r.ObjType_2 = 'opng.nrdokfin' THEN 1r.NUMBER_Text_2
			WHEN 1r.ObjType_3 = 'opng.nrdokfin' THEN 1r.NUMBER_Text_3
			WHEN 1r.ObjType_4 = 'opng.nrdokfin' THEN 1r.NUMBER_Text_4
			WHEN 1r.ObjType_5 = 'opng.nrdokfin' THEN 1r.NUMBER_Text_5
			ELSE ''
			END 
			) AS NrDokFin,
			(
			CASE 
			WHEN 1r.ObjType_1 = 'opng.nrwewn' THEN 1r.NUMBER_Text_1 
			WHEN 1r.ObjType_2 = 'opng.nrwewn' THEN 1r.NUMBER_Text_2
			WHEN 1r.ObjType_3 = 'opng.nrwewn' THEN 1r.NUMBER_Text_3
			WHEN 1r.ObjType_4 = 'opng.nrwewn' THEN 1r.NUMBER_Text_4
			WHEN 1r.ObjType_5 = 'opng.nrwewn' THEN 1r.NUMBER_Text_5
			ELSE ''
			END
			) AS NrWewn,
			(
			CASE 
			WHEN 1r.ObjType_1 = 'opng.nrdokmag' THEN 1r.NUMBER_Text_1 
			WHEN 1r.ObjType_2 = 'opng.nrdokmag' THEN 1r.NUMBER_Text_2
			WHEN 1r.ObjType_3 = 'opng.nrdokmag' THEN 1r.NUMBER_Text_3
			WHEN 1r.ObjType_4 = 'opng.nrdokmag' THEN 1r.NUMBER_Text_4
			WHEN 1r.ObjType_5 = 'opng.nrdokmag' THEN 1r.NUMBER_Text_5
			ELSE ''
			END
			) AS nrdokmag

			FROM `erp_obj_counters_values_e_1_rec` 1r
			WHERE
				1r.ID = _Key
			INTO
				@n.nrdokfin, @n.NrWewn, @n.nrdokmag		
			;
			/*
			Gdy usuwam spacje to nie wyszukuje starych numerów (np. nr dok fin) które taka spacje posiadaly. zatem jek jet to jet - zostawiamy.
			SET
				@n.nrdokfin = REPLACE(@n.nrdokfin, ' ', ''), 
				@n.NrWewn = REPLACE(@n.NrWewn, ' ', ''), 
				@n.nrdokmag = REPLACE(@n.nrdokmag, ' ', '')	
			;
			*/
		END IF;
		
		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.CInwn, @ht.CInND, @ht.CInNW)) 
				AND NOT @ng.handle_ReadOnly
				THEN
				SELECT COUNT(*) AS IlePozZerowe FROM `oppo_e` WHERE IdnOperFin = _Key AND Ilosc = 0 AND WartBrt = 0 AND WartNet = 0 AND WartVat = 0 INTO @n.IlePozZerowe;
				IF @n.IlePozZerowe > 0 THEN
					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', _VarStr(@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
		**********************************************************************************************************************************/
		--	Ceny zerowe
			IF @op.MA_Kontrahenta AND @op.MA_Detale AND NOT @op.IsKorekta THEN
				SET @.CenyZerowe.Sprawdzaj = TRUE;
	--	potem wywal	
		CALL _IReg_Get('OPNGINFOPATH\\Ceny_i_Rabaty', 'Akceptuj ceny zerowe dok.sprzed', 0, 'BOOLEAN', @session.HT.IR.Akceptuj_ceny_zerowe_dok.sprzed, FALSE);
		CALL _IReg_Get('OPNGINFOPATH\\Ceny_i_Rabaty', 'Akceptuj ceny zerowe dok.zakupu', 0, 'BOOLEAN', @session.HT.IR.Akceptuj_ceny_zerowe_dok.zakupu, FALSE);
				
				IF @session.HT.IR.Akceptuj_ceny_zerowe_dok.zakupu
				AND ((@op.OpTyp = @ht.ZT) OR @n.Rodzaj IN (@ht.CPZPZ, @ht.CPzKP))
				THEN
					SET @.CenyZerowe.Sprawdzaj = FALSE;
				ELSEIF @session.HT.IR.Akceptuj_ceny_zerowe_dok.sprzed
				AND ((@op.OpTyp = @ht.ST) OR @n.Rodzaj IN (@ht.CRZWZ))
				THEN
					SET @.CenyZerowe.Sprawdzaj = FALSE;
				ELSEIF @n.Rodzaj IN (@ht.CMMMM, @ht.CInwn, @ht.CInNW, @ht.CInND)
				THEN
					SET @.CenyZerowe.Sprawdzaj = FALSE;
				END IF;
				/*
				dodatkowo dla cdg
					@.CenyZerowe.Sprawdzaj := @.CenyZerowe.Sprawdzaj
				   {$IFDEF CDG}
					   and (((cds.FieldByName('rodzajdowodu').AsString<>'BP') and  (aRodzaj = CRZWZ)) or (aRodzaj <> CRZWZ))
				   {$ENDIF}
				   ;
				*/
				IF @.CenyZerowe.Sprawdzaj THEN
					SET @.CenyZerowe.Ile.Zerowych.Count = 
						IFNULL(
							(SELECT COUNT(*) FROM `oppo_e` p WHERE p.IdnOperFin = _Key AND p.opakowanie_zwrotne = 0 AND p.cenanet = 0  AND p.ilosc <> 0)
						, 0)
					;
					IF @.CenyZerowe.Ile.Zerowych.Count > 0 THEN
						CALL _ng_e_rec_msg_ins('', 	'', _Key, 'BeforeApply', 
							'Niektóre pozycje zawierają ceny zerowe!',
							'Error', 'Stop', '', ''
						);
					END IF;
					
				END IF;
			END IF;
			
		--	Blokada gotówkowa na FV
			IF @session.HT.IR.LimitFVDlaGotowka > 0 AND @n.Rodzaj IN (0, 1, 2) THEN
				SELECT 
					-- n.GUID, 
					-- n.Brutto, n.sposobplatn, p.rodzaj,
					n.Brutto, 
					IFNULL(p.rodzaj = 0 AND n.Brutto > @session.HT.IR.LimitFVDlaGotowka, FALSE) AS Blokada
				FROM `opng_e` n
				LEFT JOIN `platnosc` p ON p.IDN = n.sposobplatn
				WHERE
					n.GUID = _Key
				INTO
					@.LimitFVDlaGotowka.Brutto,
					@.LimitFVDlaGotowka.Blokada
				;
				IF @.LimitFVDlaGotowka.Blokada THEN


					CALL _ng_e_rec_msg_ins('', 	'', _Key, 'BeforeApply', 
						REPLACE(REPLACE(_res_str_get('ng_msg_BeforeApply.LimitFVDlaGotowka', ''), 
							'#LimitFVDlaGotowka#', @session.HT.IR.LimitFVDlaGotowka), 
							'#Brutto#', @.LimitFVDlaGotowka.Brutto),
						'Error', 'Stop', '', ''
					);
					-- LEAVE S_opng_E_Let;
				END IF;
			END IF;
			
		--	NIP (kontrnip)
			IF @n.kontrnip = '' AND @n.Rodzaj IN (1) THEN
				CALL _ng_e_rec_msg_ins('', 	'', _Key, 'BeforeApply', 
					'Brak w dokumencie numeru NIP.',
					'Error', 'Stop', '', ''
				);
			END IF;
		
		
		--	Czy magazyny sa zerowe ???
		--	o ile magazyny maja sens
			IF @op.MA_Magzyny THEN
				IF @session.globals.Owner IN ('TRANSBUD') AND @n.IDN = 0 THEN
				--	dla nowego rekordu.. sprawdz czy zmagazynu nie jest NULL!!! (TRANSBUD)
					IF @n.ZMagazynu IS NULL THEN
						UPDATE `opng_e` n, `ng_e_rec` r
						SET
							n.Tag = -1,	 -- Inicjowanie rekordu (potem Tag wraca na stara wartosc
							n.zmagazynu = r.i_Magazyn1_Kasa, 
							n.domagazynu = r.i_Magazyn2
						WHERE
							r.GUID = _Key
							AND
							n.GUID = r.GUID
						;	
						CALL opng_E_Let('Post', _Key, '', '');
					--	Raz jeszcze pobiez magazyny	
						SELECT 
							n.ZMagazynu, n.DoMagazynu
						FROM `opng_e` n
						WHERE
							n.GUID = _Key
						INTO
							@n.ZMagazynu, @n.DoMagazynu
						;
					--	Dodatkowo dodaj do LOGa		
						SET 
							@Miejsce = 3,
							@.Info = CONCAT(
								'BEFORE APPLY `opng_e`\nW ZMagazynu byl NULL !!! \nPobralem z pola i_Magazyn1_Kasa z `ng_e_rec` i\n',
								'teraz ZMagazynu =', _VarStr(IFNULL(@n.ZMagazynu, 'NULL'))
							)
						;
						CALL log_Insert('INSERT', @Idn, 
							'', 
							@Miejsce,
							2, -- IF(@handle_oper = 'INSERT', 2, IF(@handle_oper = 'DELETE', 4, 3)), 
							_Key, 
							@session.Registration.IP, 
							@.Info, 
							'opng_e'
						);
						
					END IF;
				END IF;
			
				IF IFNULL(@n.ZMagazynu, 0) <= 0 AND IFNULL(@n.DoMagazynu, 0) <= 0 THEN
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
						'Magazyny nie zostały określone (są zerowe)!',
						'Error', 
						'Stop', '', ''
					);
						-- ResID = 'ng_msg_BeforeApply.BrakNrDokFin'	
				--	Dodatkowo dodaj do LOGa		
					SET 
						@Miejsce = 3,
						@.Info = CONCAT(
							'BEFORE APPLY `opng_e`\nMagazyny nie zostały określone (są zerowe)!\n',
							''
						)
					;
					CALL log_Insert('INSERT', @Idn, 
						'', 
						@Miejsce,
						2, -- IF(@handle_oper = 'INSERT', 2, IF(@handle_oper = 'DELETE', 4, 3)), 
						_Key, 
						@session.Registration.IP, 
						@.Info, 
						'opng_e'
					);
					
				END IF;
			END IF;
		      
		--	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
				;
	
				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.CKsNN)) 
				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
				;
				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 ma detale i jest tam realizacja zamowienia i jest to dokument nowy (IDN zerowe) to sprawdz czy nie realizujesz za duzo
			IF (IFNULL(@n.IDN, 0) = 0)
				AND (@n.fvrudowz = 0) 
				AND @op.MA_Detale
				AND NOT(@op.IsKorekta)
				AND EXISTS(SELECT IDN FROM `oppo_e` p WHERE p.IdnOper = _Key AND p.GUIDZM != '' AND p.Ilosc != 0 LIMIT 1)
				AND FALSE
			THEN
				IF EXISTS(SELECT IDN FROM `oppo_e` p, `zmpo` zp WHERE p.IdnOper = _Key AND p.GUIDZM = zp.GUID AND p.Ilosc > (zp.Ilosc - zp.zrealizowano)) THEN
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
						'Są pozycje które reralizują więcej niż jest w zamowieniu!\n. Sprawdź i spróbuj ponownie.',
						'Warning', 
						'', '', ''
					);
						
				END IF;
			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)
				AND NOT(@op.IsKorekta)
				THEN
				SELECT COUNT(*) AS IlePoz FROM `oppo_e` WHERE IdnOper = _Key INTO @n.IlePoz;
				-- IF @n.IlePoz = 0 OR (@n.brutto = 0 THEN
				IF @n.IlePoz = 0 THEN
					SET
						@CheckBeforeApply.Msg = 'Nie można zapisywać dokumentu sprzedaży nie posiadającego pozycji!',
						@CheckBeforeApply.Blokuj = 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
					;
					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ż, zakup etc
			IF NOT @n.nrdokfin IN ('', 'LOCKED') 
				AND @session.HT.IR.Ostrzeganie_o_powtorzeniu_numeru_dokfin
				-- AND (@n.Rodzaj != @ht.CPzPZ)
				AND @n.grupaoper IN (@ht.ST, @ht.ZT, @ht.ZP)
				-- 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 ng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'NrDokFin', 'DataWystaw', @_Is_ZT_ZP, FALSE, @Nr_ile, @n.nrdokfin);
				-- test set @.SQL.Repeat.Nrdokfin = @_SQLText;
				-- test UPDATE `opng_e` set uwagi = concat('@Nr_ile: ', @Nr_ile, '\n', @_SQLText) where GUID = _Key;
				-- test SET @Nr_ile.nrdokfin = @Nr_ile;
				
				-- bylo 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#', _VarStr(@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;
			
		--	NrWewn - powtorzony Gdy jest to WSTAWIANIE
			IF NOT @n.NrWewn IN ('', 'LOCKED') 
				AND @session.HT.IR.Ostrzeganie_o_powtorzeniu_numeru_wewnetrznego
				-- AND (@n.Rodzaj != @ht.CPzPZ)
				AND @n.grupaoper IN (@ht.ST, @ht.ZT, @ht.ZP, @ht.MG)
				-- AND (@n.grupaoper = @ht.ST)
			THEN
				SET @_Is_ZT_ZP = FALSE;
				CALL ng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'NrWewn', 
					IF(@n.grupaoper IN (@ht.ST, @ht.ZT, @ht.ZP), 'DataWplywu', 'DataWystaw'),
					@_Is_ZT_ZP, FALSE, @Nr_ile, @n.NrWewn);				
				-- bylo CALL opng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'NrWewn', FALSE, @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#', _VarStr(@n.NrWewn)), '#f#', 'wewn.'),
							IF(NOT @session.HT.IR.Ostrzeganie_restrykcyjne_o_powtorzeniu_numeru_wewn,  
								-- CONCAT('\n', 'Czy na pewno zapisać dokument ?'),
								_res_str_get('ng_msg_BeforeApply.PowtorzonyNrDokFin.Ask', ''),
								''
							)
						),
						IF(NOT @session.HT.IR.Ostrzeganie_restrykcyjne_o_powtorzeniu_numeru_wewn, 'Ask', 'Error'), 
						'Stop', '', '');
					-- ResID = 'ng_msg_BeforeApply.PowtorzonyNrDokFin'	
					-- ResID = 'ng_msg_BeforeApply.PowtorzonyNrDokFin.Ask'	
				END IF;
			END IF;
			
		--	nrdokmag - powtorzony Gdy jest to WSTAWIANIE
			IF NOT @n.nrdokmag IN ('', 'LOCKED') 
				AND @session.HT.IR.Ostrzeganie_o_powtorzeniu_numeru_magazynowego
				AND @n.grupaoper IN (@ht.ST, @ht.ZT, @ht.ZP, @ht.MG)
				AND IF(@session.globals.Owner = 'CDG', @n.Rodzaj = @ht.CZkFV, TRUE)
			THEN
				SET @_Is_ZT_ZP = FALSE;
				CALL ng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'nrdokmag', 'DataWystaw', @_Is_ZT_ZP, TRUE, @Nr_ile, @n.nrdokmag);				
				-- bylo CALL opng_E_CheckNotRepeatedNumber('', _Key, 'opng', 'nrdokmag', FALSE, @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#', _VarStr(@n.nrdokmag)), '#f#', 'magazyn.'),
							IF(TRUE,  
								-- CONCAT('\n', 'Czy na pewno zapisać dokument ?'),
								_res_str_get('ng_msg_BeforeApply.PowtorzonyNrDokFin.Ask', ''),
								''
							)
						),
						IF(TRUE, 'Ask', 'Error'), 
						'Stop', '', '');
					-- ResID = 'ng_msg_BeforeApply.PowtorzonyNrDokFin'	
					-- ResID = 'ng_msg_BeforeApply.PowtorzonyNrDokFin.Ask'	
				END IF;
			END IF;

		--	Powod Korekty!!!!!!!!!!!!!!!!!!!!!! zad.40175
		--	korektatytulem
			IF @op.IsKorekta 
				AND @session.HT.IR.KorektaBlokadaWystawieniaBezWskazaniaPowodu
				AND (@n.korektatytulem = '') 
				-- and wyjatki
				AND NOT @n.Rodzaj IN (@ht.CKsKF)
				-- AND @n.Rodzaj IN (@ht.CZKFV, @ht.CKsFV, @ht.CZKKF, @ht.CKsKF, @ht.CZTUE, @ht.CZkIm, @ht.CZTKU) 
				THEN
	
				CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
					'Podaj powód korekty zanim zapiszesz dokument.',
					'Error', 
					'Stop', '', ''
				);
					-- ResID = 'ng_msg_BeforeApply.BrakNrDokFin'	
			END IF;
			
		--	Kontrola daty granicznej dok	
			IF (@session.HT.IR.Kontrola_daty_granicznej_dok) THEN
				IF DATE(@n.datawplywu) <= DATE(@session.HT.IR.cDataZabrOper) THEN
	set @Rafal.byl = '1';
					SET @aUp_EditPoCzasie = _GetUprawnienie('opng|EditPoCzasie', '');
					IF (@aUp_EditPoCzasie < @uprDSView) THEN
					--	STOP
						CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
							REPLACE(_res_str_get('ng_msg_DataZabrOper_stop', ''), '#D', @session.HT.IR.cDataZabrOper),
							'Error', 
							'Stop', '', ''
						);
					ELSE
					--	MSG
						CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
							REPLACE(_res_str_get('ng_msg_DataZabrOper_warrning', ''), '#D', @session.HT.IR.cDataZabrOper),
							'Warning', 
							'', '', ''
						);
					END IF;
				END IF;
			END IF;
			
		--	NUREK / SprzedPonizejCenyZakupLubCenyMin	
			IF 
			(
				(@op.OpTyp = @ht.ST) OR 
				(@n.Rodzaj IN (@ht.CRzWZ, @ht.CRzRW, @ht.CRzKR, @ht.CZmEX, @ht.CZMOO))		
			)
			AND
			(
				NOT @session.HT.IR.Sprzedaz_ponizej_ceny_min
				OR
				NOT @session.HT.IR.Sprzedaz_ponizej_ceny_zakupu
			)
			AND
			NOT
			EXISTS(
				SELECT 
					a.OsobaGUID
				FROM `ng_e_rec` n, `_user_accounts` a
				WHERE 
					n.GUID = _Key
					AND a.OsobaGUID = n.Handle_UserGUID 
					AND _GetUprawnienie('HT_SprzedPonizejCenyZakupLubCenyMin', n.Handle_UserGUID) > 0	--	i NIE Admin
			)
			
		--	NUREK !!!	
			THEN
			
				SET @.Msg = '';
				SELECT 
					_VarText(
					CONCAT(
						'!!!!!!!!!!!!!!!!!!!Uwaga sa ceny sprzedazy po rabacie ktore sa mniejsza od ceny zakupu lub od ceny minimalnej. \rPozycje dla nast. towarow: \r',
						GROUP_CONCAT(CONCAT(p.TowrSymb, ' - cena po rabacie: ', _VarStr(p.CenaNetWalzRab * p.Kurs)) SEPARATOR '\r') 
					)) AS Msg
				FROM `oppo_e` p 
				WHERE 
					p.IdnOper = _Key
					AND
					p.ExtFlags LIKE '%<NUREK>%'
				INTO
					@.Msg
				;
				IF IFNULL(@.Msg, '') != '' THEN
					CALL _ng_e_rec_msg_ins('', '', _Key, 'BeforeApply', 
						@.Msg,
						'Error', 
						'Stop', '', ''
					);
				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;
		END IF;
		
		
		
	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
		**********************************************************************************************************************************/
		SELECT 
			n.Rodzaj, IFNULL(n.ZMagazynu, 0), IFNULL(n.DoMagazynu, 0), n.fvrudowz, od.IsKorekta 
		FROM `opng_e` n, `operdoc` od
		WHERE 
			n.GUID = _Key
			AND od.Rodzaj = n.Rodzaj
		INTO 
			@n.Rodzaj, @n.ZMagazynu, @n.DoMagazynu, @n.fvrudowz, @n.IsKorekta
		;
		IF NOT @n.IsKorekta THEN
			UPDATE `oppo_e` pe, `opng_e` ne
			SET
				pe.Kurs = ne.Kurs
			WHERE
				ne.GUID = _Key
				AND 
				ne.fvrudowz = 0
				-- AND (pe.IdnOper <=> pe.IdnOper_e)
				AND
				pe.IdnOper = ne.GUID
			;
		ELSE
			UPDATE `oppo_corr_e` ce, `opng_e` ne
			SET
				ce.j_kurs = ne.Kurs
				
			WHERE
				ne.GUID = _Key
				AND
				ce.idnoper_corr = ne.GUID
			;
			CALL opng_E_LetPostCorr('', _Key, '', '');
		END IF;
		
		CALL opng_E_Let('Post', _Key, '', '');
	END IF;

	IF _MODE LIKE 'Change.Magazyny.%' THEN
		/**********************************************************************************************************************************
			Change.Magazyny.ZMagazynu lub
			Change.Magazyny.DoMgazynu 
			_Param_A nowy magazyn
			CALL opng_E_Let('Change.Magazyny.ZMagazynu', '{B14AAE18-A57D-4AD6-B423-7E46E5A7F593}', '201', ''); -- zmien z mag na 201
			CALL opng_E_Let('Change.Magazyny.DoMagazynu', '{B14AAE18-A57D-4AD6-B423-7E46E5A7F593}', '101', ''); -- zmien do mag na 101
		**********************************************************************************************************************************/
		
		UPDATE `opng_e` ne
		SET 
			ne.ZMagazynu = IF(_MODE = 'Change.Magazyny.ZMagazynu', _Param_A, ne.ZMagazynu),
			ne.DoMagazynu = IF(_MODE = 'Change.Magazyny.DoMagazynu', _Param_A, ne.DoMagazynu)
		WHERE
			ne.GUID = _Key
		;
		UPDATE `oppo_e` p
		SET
			p.ZMagazynu = IF(_MODE = 'Change.Magazyny.ZMagazynu', -100, p.ZMagazynu),
			p.DoMagazynu = IF(_MODE = 'Change.Magazyny.DoMagazynu', -100, p.DoMagazynu)
		WHERE
			p.IdnOper = _Key
		;
		
		CALL _ng_e_rec_do('update.from.xxng_e', _Key, '', '');	-- update ng_rec_e
		
	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 @test.d =	 '1';
		SET _ZM_Key = _KeySrc;
		/**********************************************************************************************************************************
			Naglowek
		**********************************************************************************************************************************/
							SET @_POS_POS_2_INT = "IF _MODE LIKE 'Realizacja.ZM.%' THEN";		
		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;

CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL ht_clone_tools('CLONE.ADDR'", '', '', '');
		--	Adresacja!!!
		CALL ht_clone_tools('CLONE.ADDR', _ZM_Key, _Key, 'zmng', 'opng', 'CLEAR.before'); -- Realizacja ZAM
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL ht_clone_tools('CLONE.ADDR'", '', '', '');
		
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "UPDATE `opng_e` n, `t_zmng_ZAM_Realizowane` z", '', '', '');
		--	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.PlatnikGUID = IF(IFNULL(z.PlatnikGUID, '') = '', n.PlatnikGUID, z.PlatnikGUID),
			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.Nrdokfin = IF(z.info1 LIKE 'DEPOZYT%', 'DEPOZYT', n.Nrdokfin),
			n.Dotyczy = 
				IF(z.info1 LIKE 'DEPOZYT%',
					REPLACE(z.info1, 'DEPOZYT ', 'Jest to dok. depozyt. i '),
					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 IN ('CDG','MPGK'))),
					--	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
		;	
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "UPDATE `opng_e` n, `t_zmng_ZAM_Realizowane` z", '', '', '');


CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "UPDATE daty, katcole...", '', '', '');
		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;
		
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "UPDATE daty, katcole...", '', '', '');

		-- 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;
													SET @_POS_POS_2_INT = "CALL oppo_E_Let_Insert('From.zmng', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');";		
set @test.d = concat(_MODE, ' / ', _Key, ' / ', _ZM_Key);
		IF _MODE = 'Realizacja.ZM.from.skaner' THEN
		--	'Realizacja.ZM.Skanery' - dla wyjazdu z zamowienia
			CALL oppo_E_Let_Insert('From.zmng.skaner', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
		ELSEIF _MODE != 'Realizacja.ZM.from.`t_zlecprod.zmpo`' THEN
		--	np. 'Realizacja.ZM.Edit' - Normalnie z zamowienia A NIE ze zlecenia prod z tabeli `t_zlecprod.zmpo` 
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL oppo_E_Let_Insert", '', '', '');
			CALL oppo_E_Let_Insert(IF(_Key LIKE 'WZ_z_PPT_%' and ifnull(@jmam.malpa, true), 'From.zmng.NEW', 'From.zmng'), '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL oppo_E_Let_Insert", '', '', '');
			-- CALL oppo_E_Let_Insert(IF(@session.globals.Owner = 'KONKOL', 'From.zmng.NEW', 'From.zmng'), '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
		ELSEIF _MODE = 'Realizacja.ZM.from.`t_zlecprod.zmpo`' THEN
		--	Z zamowienia ALE z zlecenia prod z tabeli `t_zlecprod.zmpo`
			CALL oppo_E_Let_Insert('From.zmng.`t_zlecprod.zmpo`', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
		END IF;
	-- ????		CALL oppo_E_Let_Update('from_opng_e', '', _IdnOper, '', '');
		
													SET @_POS_POS_2_INT = "Jestem po CALL oppo_E_Let_Insert('From.zmng', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');";		
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL opng_E_Let('Post'", '', '', '');
		CALL opng_E_Let('Post', _Key, '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL opng_E_Let('Post'", '', '', '');
		
	-- LEAVE S__ZAM_Realizuj;
		
		/* TO PONIZEJ TO W jakims APPLY
		CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
			
		*/
													SET @_POS_POS_2_INT = "Jestem po CALL oppo_E_Let_Insert('From.zmng', .. i po POST";		
											
		DROP TEMPORARY TABLE IF EXISTS `t_zmng_ZAM_Realizowane`;
		
	END IF;
END$$


/* ************************************************************************************************************************************************************************
	Dodatkowe np. realizacja z ZM
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `opng_E_LetInsertInwentaryzacja`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_LetInsertInwentaryzacja`(
	IN _MODE VARCHAR(250),	 --	 to co w i_MODE np. 'Realizacja.ZM.%'
	IN _Key VARCHAR(38),
	IN _DataWplywu_DO DATE,
	IN _ZMagazynu INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D TEXT
)
/*
	CALL opng_E_LetInsertInwentaryzacja('Inwentaryzacja', @IdnOper, _DataWplywu_DO, ZMagazynu, _Tymczasowa, '', '', '', 'WHERE');
*/
BEGIN 
	-- DECLARE _Rodzaj, _Rodzaj_typ, _Magazyn, _Magazyn2, _Waluta, _Typ_Przepisania_Cen INTEGER DEFAULT 0;  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	DECLARE _SQLText, _SQLText_WHERE MEDIUMTEXT;
	IF _MODE LIKE '%Inwentaryzacja%' THEN
		UPDATE `opng_e` n
		SET
			n.Tymczasowa = _Tymczasowa
			-- n.zmagazynu = _ZMagazynu,
			-- n.domagazynu = _DoMagazynu
		WHERE
			n.GUID = _Key
		;
		SET _SQLText_WHERE = IF(IFNULL(_Param_D, '') = '', 'TRUE', _Param_D);
		
		IF IFNULL(_ZMagazynu, 0) <= 0 THEN
			SELECT GREATEST(ZMagazynu, DoMagazynu) FROM `opng_e` WHERE GUID = _Key INTO _ZMagazynu;
		END IF;
		
		SET _SQLText_WHERE = CONCAT(_SQLText_WHERE, ' AND o.magazyn = #magazyn#');
		IF(@session.globals.Owner = 'IZOHAN') THEN
			SET _SQLText_WHERE = CONCAT(_SQLText_WHERE, ' AND (t.promocja_status != 2)');
		
		END IF; 
		SET _SQLText_WHERE = REPLACE(_SQLText_WHERE, ' #magazyn#', _ZMagazynu);
		SET @_DoMagazynu2 = _ZMagazynu, @_SQLText_WHERE = _SQLText_WHERE;
		CALL oppo_E_Let_Insert('Init.Inwentaryzacja', '', _Key, '',  0, 0, '', '', _DataWplywu_DO, _SQLText_WHERE);
		
	--	tak na wszelki wypadek	
		UPDATE `opng_e` n
		SET
			n.Status = 0,
			n.DataWplywu = _DataWplywu_DO
		WHERE
			n.GUID = _Key
		;
		UPDATE `oppo_e` pinw
		SET
			pinw.DataWplywu = _DataWplywu_DO,
			pinw.transza_zamow = 
				IF(pinw.Rodzaj_typ != 0,
					1, 	--	1 oznacza że pozycja nie bierze udzialu w inwentaryzacji (domyslnie wszystkie sa wykluczone dla inwentaryzacji z lista 
					0	--	dla pełanej (od sciany do sciany) wszystkie sa wlaczone
				)
		WHERE
			pinw.IdnOper = _Key
		;
		
		CALL opng_E_Let('Post', _Key, '', '');
		IF _MODE LIKE '%.ApplyAndClear' THEN
		-- np. 'Inwentaryzacja.ApplyAndClear'
			CALL opng_E_Let('ApplyAndClear', _Key, '', '');
		ELSEIF _MODE LIKE '%.Apply%' THEN
			CALL opng_E_Let('Apply', _Key, '', '');
		END IF;
		
	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),	--	gdy <> '' to badaj niedobory - dla zad. 41610
	IN _Param_B VARCHAR(255)
)
/*
	CALL opng_E_Tymczasowa_Set('0', @IdnOper, '', '');		
	CALL opng_E_Tymczasowa_Set('1', @IdnOper, '', '');		
	CALL opng_E_Tymczasowa_Set('0', @IdnOper, '1', '');		
*/
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, '', '', '');
	
	IF _Param_A != '' THEN
	-- ale zanim delta to spr. czy nie brak niedoborow - dla zad. 41610
		UPDATE `oppo_e` p
		SET 
			p.Tymczasowa = @_Tymczasowa
		WHERE
			p.IdnOper = _Key
		;
		--	delta check
		CALL oper_Delta('opng.check', _Key, 'Get.Msg', '', '');
		IF @.oper_Delta.Blokuj THEN
			--	czysc swiat E
			CALL opng_E_Let('End', _Key, '', '');
			--	WYCHODZIMY
			LEAVE opng_E_Tymczasowa_Set;
		END IF;
		
		--	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
		;

		UPDATE `opng` n
		SET 
			n.Tymczasowa = @_Tymczasowa
		WHERE
			n.GUID = _Key
		;
		
	ELSE
	
		--	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
		;
		UPDATE `opng` n
		SET 
			n.Tymczasowa = @_Tymczasowa
		WHERE
			n.GUID = _Key
		;
	END IF;
	--	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,
		n.tymczasowa
	FROM `opng_e` n
	INNER JOIN `operdoc` od ON od.Rodzaj = n.Rodzaj
	WHERE
		n.GUID = _Key
	INTO
		@n.rodzaj, @n.Rodzaj_typ,
		@n.tymczasowa
	;

	/*
	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;

	-- CALL erp_obj_counters_values_SetNumber('ponumeruj.mnie', @_Numer, @_NumerText, 'opng', @n.rodzaj, '0', _Key, 'opng_e', '', '');
	-- CALL erp_obj_counters_values_SetNumber('prepare.t_erp_obj_counters_inputs', @_Numer, @_NumerText, 'opng.', @n.rodzaj, '0', _Key, 'opng_e', '', ';exit.if.old.field.not.empty;');
	
	IF @session.globals.HT.erp_obj_counters_values_e_1_rec AND FALSE THEN
	--	$DEFINE erp_obj_counters_values_e_1_rec
		CALL erp_obj_counters_values_SetNumber('prepare.t_erp_obj_counters_inputs', @_Numer, @_NumerText, 'opng.', @n.rodzaj, '0', _Key, 'opng_e', '', '');
	END IF;
	
	SELECT
		n.rodzaj, n.Rodzaj_typ, IFNULL(n.NrDokFin, ''), IFNULL(n.NrDokMag, ''), IFNULL(n.NrDokKas, ''), IFNULL(n.NrWewn, ''), IFNULL(n.lp_ks_podawcza_str, ''), 
		n.fvrudowz,
		n.KontrGUID, n.PlatnikGUID, 
		n.ZMagazynu, 
		n.DoMagazynu, 
		-- IFNULL((SELECT Grupa FROM`Magazyny` WHERE IdnMagazynu = n.ZMagazynu), 0) AS ZMagazynu_grupa,
		-- IFNULL((SELECT Grupa FROM`Magazyny` WHERE IdnMagazynu = n.DoMagazynu), 0) AS DoMagazynu_grupa,
		n.NrKasy, n.RodzajDowodu, n.Rv_id, n.datasprzed, n.DataWystaw, n.DataWplywu, n.transza_zamow,
		n.tymczasowa,
		n.ugrpGUID,
		n.Calc_ver,
		od.Grupa AS OpTyp, 
		od.TwTyp, od.MagTyp,
		od.MA_Magzyny,
		od.numdok_automat,
		od.numwewn_automat,
		od.IsKorekta,
		od.DocMagPrint
	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.lp_ks_podawcza_str,  
		@n.fvrudowz,
		@n.KontrGUID, @n.PlatnikGUID, 
		-- @n.ZMagazynu_n, @n.DoMagazynu_n, 
		@n.ZMagazynu, @n.DoMagazynu, 
		
		@n.NrKasy, @n.RodzajDowodu, @n.Rv_id, @n.datasprzed, @n.DataWystaw, @n.DataWplywu, @n.transza_zamow,
		@n.tymczasowa,
		@n.ugrpGUID,
		@n.Calc_ver,
		@od.OpTyp,
		@od.TwTyp, @od.MagTyp,
		@od.MA_Magzyny,
		@od.numdok_automat,
		@od.numwewn_automat,
		@od.IsKorekta,
		@od.DocMagPrint
	;
	
	
		
	
	SET 
		@_Res1_mask = 
			IF(@od.OpTyp = 6, 	--	Czy KASA?
				@n.NrKasy,
				IF(@od.MagTyp IN (@ht.mtMM, @ht.mtRZ), 
					@n.ZMagazynu, 
					@n.DoMagazynu
				)
			),
		@_Res2_mask = 
			IF(@od.MagTyp IN (@ht.mtMM, @ht.mtPZ), 
				@n.DoMagazynu, 
				0
			)
	;	
	
	SET 
		@_Res1 =
			IFNULL((SELECT Grupa FROM`Magazyny` WHERE IdnMagazynu = @_Res1_mask), @_Res1_mask),
		@_Res2 =
			IFNULL((SELECT Grupa FROM`Magazyny` WHERE IdnMagazynu = @_Res2_mask), @_Res2_mask)
	;
	
				SET @opng_e_Numeracja_po_Apply = '_Scan_numdok_get_NumerText(_MODE, _Numer, _Rodzaj, _Mask, _Params)';
	SET
		@_Params =
		CONCAT(
			_VarStr(@_Res1_mask), ';',
			_VarStr(@_Res2_mask), ';',
			_VarStr(@n.DataWystaw), ';',
			_VarStr(@n.RodzajDowodu), ';', 
			_VarStr(@n.Rv_id), ';',
			_VarStr(@n.ugrpGUID), ';'
		)
	;
	
	SET	@_ParamsMag = @_Params; -- dla wszystkich to samo co dla dokfin
		
	IF (@session.globals.Owner = 'SEVENET') THEN
		SET
			@_ParamsMag =
			CONCAT(
				_VarStr(@_Res1_mask), ';',
				_VarStr(@_Res2_mask), ';',
				_VarStr(@n.datasprzed), ';',
				_VarStr(@n.RodzajDowodu), ';', 
				_VarStr(@n.Rv_id), ';',
				_VarStr(@n.ugrpGUID), ';'
			)
		;		
	END IF;
	
	
	IF IFNULL(@n.NrDokMag, '') = '' AND @od.MA_Magzyny AND @n.fvrudowz = 0 THEN
	-- NR DokMAG dla Faktur etc
		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 
		*/
			IF @od.OpTyp = 2 THEN 	-- MG		NrDokMag
				CALL GetUniqNrForFieldAndUpdate('', 0, @n.rodzaj, @_Res1, @_ParamsMag, @n.NrDokMag);
			ELSE					-- Inne operacje nie magazynowe ale na magazynach np. FV
				IF @session.globals.Owner != 'LACZPOL' THEN	--	DODATKOWO!!! laczpol zazyczyl sobie aby nie numerowac faktur i innych magazynowatych 
					CALL GetUniqNrForFieldAndUpdate('', 0, 
						IFNULL(@od.DocMagPrint, IF(@od.MagTyp IN (@ht.mtRZ), @ht.CRzWZ, @ht.CPzPZ)),  -- rodzaj mag.!!!
						IF(@od.MagTyp IN (@ht.mtRZ), @_Res1, @_Res2), 
						@_ParamsMag, @n.NrDokMag);
				END IF;
			END IF;
			-- 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, '') = '') AND @od.numdok_automat THEN
		--	UWAGA dla SEVENETU?
			IF (@session.globals.Owner = 'SEVENET') THEN
				CALL AutoNum_GetNumberText_OperDoc('', @_Numer, @n.NrDokFin, '', 'nrdokfin', @n.rodzaj, 0, @n.ZMagazynu, @n.DoMagazynu,  @n.DataWplywu, @n.RodzajDowodu, @n.Rv_id, @n.ugrpGUID);
			ELSE
				CALL GetUniqNrForFieldAndUpdate('', 0, @n.rodzaj, @_Res1, @_Params, @n.NrDokFin);
			END IF;
			UPDATE `opng_e` n
			SET
				n.NrDokFin = @n.NrDokFin
			WHERE
				n.GUID = _Key
			;
		END IF;
	-- 		NrWewn
		IF (IFNULL(@n.NrWewn, '') = '') AND @od.numwewn_automat 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;

--	Ksiazka podawcza - dla @ht.CSPLI, @ht.CKsNN czyli dla 61 Sprzedaż nie podlegająca VAT (licencje) i 104 Zakup KANCELARIA
	IF @n.rodzaj IN (@ht.CSPLI, @ht.CKsNN) AND @n.lp_ks_podawcza_str = '' THEN	--	
		IF @n.Calc_ver >= 5 THEN
		--	Licznik opng.lp_ks_podawcza_str (po Bozemu)
			CALL erp_obj_counters_values_tools('EXECUTE', 'opng.lp_ks_podawcza_str', @n.rodzaj, '0', _Key, 'opng_e', '', '', '');		
		ELSE
		--	Licznik oper_wewn 
			CALL erp_obj_counters_values_tools('EXECUTE', 'oper_wewn', @n.rodzaj, '0', _Key, 'opng_e', '', '', '');		
		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)	--	 Year All
)
/*
	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#', _VarStr(_TableName));
		SET _SQLText = REPLACE(_SQLText, '#_Key#', _VarStr(_Key));
		SET _SQLText = REPLACE(_SQLText, '#FN_Number#', _VarStr(_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$$

DROP PROCEDURE IF EXISTS `opng_UPDATE_Tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_UPDATE_Tools`(
	IN _MODE VARCHAR(150),		-- 1 lub 0
	IN _Key VARCHAR(255),	
	IN _Key_2 VARCHAR(255),	
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)	--	 Year All
)
_S_opng_UPDATE_Tools: BEGIN 
	DECLARE _SQLText TEXT;
	IF _MODE LIKE 'UPDATE.oppo.init.from.towar.%' THEN
		/*
		CALL opng_UPDATE_Tools('UPDATE.oppo.init.from.towar.1', GUID, '', '', '', '');
		CALL opng_UPDATE_Tools('UPDATE.oppo.init.from.towar.n', IdnOper, '', '', '', '');
		*/
		
		SET
			@aDoIt = @session.HT.IR.Wymus_przepisywanie_katcol_do_poz
		;
		SET
			_SQLText = 
			"
			UPDATE `oppo` p, `opng` n, `TowrNg` t
			SET
				-- p.Tag = -1,
				p.IdnOper_e = n.GUID,
				p.Tymczasowa = n.Tymczasowa,
				p.kontridn = n.kontridn,
				p.rodzaj_typ = n.rodzaj_typ,
				p.rodzaj = n.rodzaj,
				p.datawystaw = n.datawystaw,
				p.datasprzed = n.datasprzed,
				p.datawplywu = n.datawplywu,
				-- p.Ilosc = IFNULL(p.Ilosc, 1),
				p.rabat = IFNULL(n.kontrrabat, 0),
				p.idncennik = n.kontrklasacenowa,
				-- ?? p.cenanet = IFNULL(p.cenanet, 0),

				p.kurs = n.kurs,
				p.ZMagazynu = n.ZMagazynu,
				p.DoMagazynu = n.DoMagazynu,
				p.Calc_Ver = n.Calc_Ver,
				
				p.TypSymbolow = IF(n.rodzaj = 73, 0, IFNULL(@tr.oppo_e.TypSymbolow, 0)), 	-- 	CZmZP = 73;      { Zamówienie - zlecenie produkcyjne }
				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),
			--	Towar	
				p.TowrSymb = t.Symbol, 
				p.TowrNazwa = t.Nazwa, 
				p.IdnVat = IFNULL(IF((t.VatPrevYear > 0) AND (@session.vat.edityear <= t.VatPrevYear), t.VatPrevId, t.Vat), 0),
				p.Jednostka = t.Jednostka,
				p.Usluga = t.Usluga,
				p.ilewopakowaniu = t.ilewopakowaniu,
				p.kat5 = t.katcol0,
				p.kat6 = t.katcol1,
				p.kat7 = t.katcol2,
				p.kat8 = t.katcol3,
				p.kat9 = t.katcol4,
				p.cena_minimalna = t.cena_minimalna,
				p.opakowanie_zwrotne = t.opakowanie_zwrotne,
				p.info = t.info,
				p.info2 = t.info2,
				p.info3 = t.info3,
				p.info4 = t.info4,
				p.oplata_produktowa = t.oplata_produktowa,
				p.min_ord_quant = t.min_ord_quant,
				p.CzasOczekiwania = t.CzasOczekiwania,
				p.waga_jedn = t.waga,
				p.pkwiu = t.pkwiu,
				p.termin_waznosci = DATE_ADD(CURRENT_DATE(), INTERVAL t.dni_waznosci DAY),
				p.CenaNet = IF(p.Rodzaj IN (@ht.CInwn, @ht.CInNW, @ht.CInND), t.CenaZkpNet, p.CenaNet)
				
			WHERE
				#FIELD_KEY# = '#KEY#'
				AND
				n.GUID = p.IdnOper
				AND
				n.fvrudowz = 0
				AND
				t.GUID = p.IdnTowr
			;	
			"
		;
		IF _MODE = 'UPDATE.oppo.init.from.towar.1' THEN
			SET _SQLText = REPLACE(_SQLText, '#FIELD_KEY#', 'p.GUID');
		ELSEIF _MODE = 'UPDATE.oppo.init.from.towar.n' THEN
			SET _SQLText = REPLACE(_SQLText, '#FIELD_KEY#', 'p.IdnOper');
		END IF;
		
		SET _SQLText = REPLACE(_SQLText, '#KEY#', _Key);
		
		SET @_SQLText = _SQLText;
		CALL _ExecuteCmd(_SQLText, @Error);
		
	END IF;
	
	IF _MODE = 'opng.ZatwierdzMM.w.drodze' THEN
	/*
	CALL opng_UPDATE_Tools('opng.ZatwierdzMM.w.drodze', GUID mm, 'DoMagazyny', '', '', '');
	*/
	
		CALL oper_Delta_Tools('Init', '', '', '', '', '', '');
		CALL oper_Delta_Tools('OP.delta.prepare.from.oppo.Before', _Key, '', '', '', '', '');
	
		UPDATE `opng` n
		SET
			n.domagazynu = _Key_2,
			n.status = 3 --	[crm:33487]
		WHERE
			n.GUID = _Key
		;
		UPDATE `oppo` p
		SET
			p.domagazynu = _Key_2
		WHERE
			p.IdnOper = _Key
		;
		CALL oper_Delta_Tools('OP.delta.prepare.from.oppo.After', _Key, '', '', '', '', '');
		CALL oper_Delta_Tools('OP.delta.Update', '', '', '', '', '', '');		
		CALL oppo_mag('UPDATE_OPNG_REC', _Key);
	END IF;
	
END$$

DROP PROCEDURE IF EXISTS `opng_Kancelaria_Zmien_Rodzaj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_Kancelaria_Zmien_Rodzaj`(
	IN _MODE VARCHAR(150),		-- 1 lub 0
	IN _Key VARCHAR(255),	
	IN _Key_2 VARCHAR(255),	
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)	--	 Year All
)
/*
	CALL opng_Kancelaria_Zmien_Rodzaj('init', @IdnOper, '', '', '', '');				
	
*/


_S_opng_Kancelaria_Zmien_Rodzaj: BEGIN 
	DECLARE _SQLText TEXT;
	DECLARE _Magazyn INTEGER;
	
	IF _MODE = 'INIT' THEN
	/* *************************************************************************************************************************************************************
		Zwraca Rodzaje
		CALL opng_Kancelaria_Zmien_Rodzaj('init', @IdnOper, '', '', '', '');				
	**************************************************************************************************************************************************************/
		CALL _Session_Refresh_Variables('', '', '');

		DROP TEMPORARY TABLE IF EXISTS `t_opng_Kancelaria_Zmien_Rodzaj`;
		CREATE TEMPORARY TABLE `t_opng_Kancelaria_Zmien_Rodzaj`(
			GUID VARCHAR(38) NOT NULL DEFAULT '',
			KontrGUID VARCHAR(38) NOT NULL DEFAULT '',
			Old_Rodzaj INTEGER NOT NULL DEFAULT 0,
			lp_ks_podawcza_str  VARCHAR(50) NOT NULL DEFAULT '',
			MozliwaZmiana VARCHAR(50) NOT NULL DEFAULT 'OK',
			MozliwaZmiana_Ask_Msg VARCHAR(250) NOT NULL DEFAULT '',
			New_Rodzaj INTEGER NOT NULL DEFAULT 0,
			ASK_o_FVdoPZ_IR INTEGER NOT NULL DEFAULT 0,
			ASK_o_FVdoPZ_fvrudowz INTEGER NOT NULL DEFAULT 0,
			ASK_o_FVdoPZ_Ask_Msg VARCHAR(250) NOT NULL DEFAULT '',
			KOR_RokKorekty INTEGER NOT NULL DEFAULT 0,
			KOR_Is_Korekta INTEGER,
			Calc_Ver INTEGER,
			PRIMARY KEY (`GUID`)
		)
		;
		CALL _IReg_Get('', 'Kancelaria_pytanie_o_FVdoPZ', 0, 'INTEGER', @session.ASK_o_FVdoPZ_IR, FALSE);
		INSERT INTO `t_opng_Kancelaria_Zmien_Rodzaj`
		(GUID, KontrGUID, Old_Rodzaj, lp_ks_podawcza_str, MozliwaZmiana, New_Rodzaj, ASK_o_FVdoPZ_IR, KOR_RokKorekty, Calc_Ver)
		SELECT
			n.GUID,
			n.KontrGUID,
			n.Rodzaj AS Old_Rodzaj,
			n.lp_ks_podawcza_str,
			IF(n.Rodzaj = @ht.CKsNN, 'OK', '?') AS MozliwaZmiana,
			n.Rodzaj AS New_Rodzaj,
			_VarInt(@session.ASK_o_FVdoPZ_IR) AS ASK_o_FVdoPZ_IR,
			Year(n.datawystaw) AS KOR_RokKorekty,
			n.Calc_Ver
		FROM `opng` n
		WHERE
			n.GUID = _Key
		;	
		
	
		SELECT
			od.nazwa 
		FROM `opng` n
		INNER JOIN `operdoc` od ON od.Rodzaj = n.Rodzaj
		WHERE
			n.GUID = _Key
		INTO
			@n.rodzajStr;
		
		
		
		UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET
			t.MozliwaZmiana = 
				IF(lp_ks_podawcza_str != '',
					'CZY_NA_PEWNO',
					'MIE_POCHODZI_CZY_NA_PEWNO'
				)
			WHERE
				MozliwaZmiana = '?'
		;
		UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET
			t.MozliwaZmiana_Ask_Msg = 
				IF(t.MozliwaZmiana = 'CZY_NA_PEWNO',
					concat('Czy napewno chesz zmienić rodzaj dla dokumentu ',@n.rodzajStr,' ?'),
					IF(t.MozliwaZmiana = 'MIE_POCHODZI_CZY_NA_PEWNO',
						concat('Dokument ten nie pochodzi z Kancelarii! \nCzy na pewno chcesz zmienić rodzaj dokumentu ', @n.rodzajStr,' ?'),
						''
					)
				)
		;
		UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET
			t.ASK_o_FVdoPZ_fvrudowz = 
				IF(ASK_o_FVdoPZ_IR = 1,
					1,
					IF(ASK_o_FVdoPZ_IR = 2,
						0,
						-1
					)
				)
		;
		UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET
			t.ASK_o_FVdoPZ_Ask_Msg = 
				IF(t.ASK_o_FVdoPZ_fvrudowz = -1,
					'Czy dokument samodzielny (TAK),\nczy do wczesniej wystawionego dokumentu PZ (NIE) ?',
					''
				)
		;
		SELECT * FROM `t_opng_Kancelaria_Zmien_Rodzaj`;
	END IF;

	IF _MODE = 'CLEAR' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_opng_Kancelaria_Zmien_Rodzaj`;
	END IF;

	IF _MODE = 'SELECT.rodzaje' THEN
	/* *************************************************************************************************************************************************************
		Zwraca Rodzaje
		CALL opng_Kancelaria_Zmien_Rodzaj('SELECT.rodzaje', @IdnOper, '', '', '', '');				
	**************************************************************************************************************************************************************/
	
		SELECT 
			rodzaj, grupa, nazwa, opis,
			MA_Magzyny, 
			(od.MagTyp = @ht.mtRZ) IS_Rozchod,
			od.FVdoWZPZ
		FROM `operdoc` od
		WHERE 
			(od.valid = 1) AND 
			( 
				(od.grupa IN (1, 4) )  
				OR 
				IF(@session.globals.Owner IN ('KONKOL', 'KONKOL_ZOO'), ( grupa = 5 AND rodzaj IN (@ht.CWeDW, @ht.CWeDK)), FALSE)
			)
		ORDER BY grupa, rodzaj
		;
	END IF;

	IF _MODE = 'UPDATE.rodzaj' THEN
	/* *************************************************************************************************************************************************************
		Zwraca Rodzaje
		CALL opng_Kancelaria_Zmien_Rodzaj('UPDATE.rodzaj', @IdnOper, '', '5', '0', '');				
		_Param_A	jest Rodzaj nowy
		_Param_B	jest fvrudowz
		_Param_C	Magazyn
	**************************************************************************************************************************************************************/
		UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET 
			t.New_Rodzaj = _VarInt(_Param_A),
			t.KOR_Is_Korekta = (_VarInt(_Param_A) IN (7,8,86)),
			t.ASK_o_FVdoPZ_fvrudowz = _VarInt(_Param_B)
		;
		SET _Magazyn = IF(IFNULL(_Param_C, '') = '', 1, _Param_C);
		UPDATE `opng` n, `t_opng_Kancelaria_Zmien_Rodzaj` t, `operdoc` d 
		SET 
			n.rozrachunek = d.IsRozrachunek,
			n.nrwewn = IF(NOT(@session.globals.Owner IN ('KONKOL', 'KONKOL_ZOO')), '', n.nrwewn),
			n.rodzaj = t.New_Rodzaj, 
			n.fvrudowz = IF(d.FVdoWZPZ, IF(NOT t.KOR_Is_Korekta, GREATEST(t.ASK_o_FVdoPZ_fvrudowz, 0), n.fvrudowz), 0),
			-- bylo n.domagazynu = 1, 
			n.domagazynu = IF(d.MagTyp = @ht.mtPZ, _Magazyn, 0),
			n.zmagazynu = IF(d.MagTyp = @ht.mtRZ, _Magazyn, 0),
			n.status = 18, -- ,  rv_id=2020 ' + //18= przekazana, 2020= Tomek Sawicki powiedzial ze zawsze taki ma byc [crm:25114] //datasprzed=datawystaw,
			-- n.rv_id = (SELECT rv_id FROM `operdoc` WHERE rodzaj = t.New_Rodzaj)
			n.rv_id = d.rv_id,
			-- n.Calc_Ver = 3,
			n.gruparozrach = d.rztyp,
			n.grupaoper = d.grupa
		WHERE 
			n.GUID = t.GUID
			AND
			d.rodzaj = t.New_Rodzaj
		;
	--	ustaw walutowke jesli jest zerowa dla starych dok. (Calc_Ver < 2)
		UPDATE `opng_vat` v, `t_opng_Kancelaria_Zmien_Rodzaj` t, `opng` n
		SET
			v.NettoWal = v.Netto * n.Kurs,
			v.BruttoWal = v.Brutto * n.Kurs,
			v.VatWal = v.Vat * n.Kurs
		WHERE
			v.IdnOper = t.GUID
			AND
			n.GUID = t.GUID
			AND
			t.Calc_Ver < 2
			AND
			v.NettoWal = 0
		;
	--	ustaw Fixed dla pozycji
		UPDATE `opng_vat` v, `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET
			v.Fixed = 1
		WHERE
			v.IdnOper = t.GUID
			AND @session.globals.Owner != 'CRIST'	--	doceklowo takze dla CRISTa ale po przeszkoleniu
			-- AND t.Calc_Ver < 2
			-- AND v.NettoWal != 0
		;
	--	UWAGA dla CRIST ustawiam w NG ponownie calc_ver na 0 :(
		UPDATE `opng` n, `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET 
			n.Calc_Ver = 0
		WHERE 
			n.GUID = t.GUID
			AND @session.globals.Owner = 'CRIST'
		;
	--	UWAGA dla CRIST ustawiam w pozycjach ponownie calc_ver na 0 :(
		UPDATE `oppo` p, `t_opng_Kancelaria_Zmien_Rodzaj` t
		SET 
			p.Calc_Ver = 0
		WHERE 
			p.IdnOper = t.GUID
			AND @session.globals.Owner = 'CRIST'
		;
		
	--	Teraz LOG	
		SELECT
			CONCAT('Zmiana rodzaju z ', t.Old_Rodzaj, ' na ', t.NEW_Rodzaj) AS Log_Msg,
			t.GUID AS Log_GUID
		FROM `t_opng_Kancelaria_Zmien_Rodzaj` t
		INTO
			@.opng_Kancelaria_Zmien_Rodzaj.Log_Msg, @.opng_Kancelaria_Zmien_Rodzaj.Log_GUID
		;
		CALL log_Insert('INSERT', @Idn, '', '100', 3, @.opng_Kancelaria_Zmien_Rodzaj.Log_GUID, @session.Registration.IP, @.opng_Kancelaria_Zmien_Rodzaj.Log_Msg, '');		
		
		IF @session.globals.Owner IN ('KONKOL', 'KONKOL_ZOO') THEN
		--	Dla Konkola przepisz aktualny dla rodzaju wzor dekretacji
			UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t, `operdoc` od, `opng` n
			SET
				n.wzordekr = od.wzordekr
			WHERE
				n.GUID = t.GUID
				AND
				od.Rodzaj = n.Rodzaj
			;	
		END IF;
	--	Zeruj ckwota dla 104
		UPDATE `t_opng_Kancelaria_Zmien_Rodzaj` t, `opng` n
		SET
			n.ckwota = 0
		WHERE
			n.GUID = t.GUID
			AND
			n.Rodzaj = @ht.CKsNN
		;	
		SELECT * FROM `t_opng_Kancelaria_Zmien_Rodzaj`;
	END IF;

	IF _MODE = 'KOR.init' THEN
	/* *************************************************************************************************************************************************************
		
		CALL opng_Kancelaria_Zmien_Rodzaj('KOR.init', @IdnOper, '', 'GUID_oryginalu', '', '');				
		_Param_A	jest oryginal korekty
	**************************************************************************************************************************************************************/
		CALL Opng_E_init('EDIT', _Key, @session.Registration.UserGUID, '', 'Server');
		CALL Opng_E_init_set('', _Key, 7, 0, 'KOR', 3, NULL, 1, 0, 0, 0, '', '', _Param_A, 0, '', '', '');
		CALL Opng_E_Run('before.run', _Key, '', '', '');
		CALL Opng_E_Run('', _Key, '', '', '');
		CALL Opng_E_Run('after.run', _Key, '', '', '');
		/*
		UPDATE `opng_e` n, `ng_e_rec` r
		SET
			n.zmagazynu = r.i_Magazyn1_Kasa, 
			n.domagazynu = r.i_Magazyn2
		WHERE
			r.GUID = _Key
			AND
			n.GUID = r.GUID
		;	
		*/
		CALL opng_E_LetInsertCorr('KOR', _Key, _Param_A, '', '', '', '');
		CALL opng_E_LetPostCorr('', _Key, '', '');
		CALL opng_E_Let('Post', _Key, '', '');
		CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
		
		SELECT * FROM `t_opng_Kancelaria_Zmien_Rodzaj`;
	END IF;
	
END$$


DROP PROCEDURE IF EXISTS `opng_Make_Paragon_to_STRU`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_Make_Paragon_to_STRU`(
	IN _MODE VARCHAR(150),		-- 1 lub 0
	IN _Key VARCHAR(255),	
	IN _NEW_KontrGUID VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)	--	 Year All
)
/*
	CALL opng_Make_Paragon_to_STRU('init', @IdnOper, '', '', '', '');				
	
*/


_S_opng_Make_Paragon_to_STRU: BEGIN 
	DECLARE _SQLText TEXT;
	
	IF _MODE = 'UPDATE' THEN
	/* *************************************************************************************************************************************************************
		CALL opng_Make_Paragon_to_STRU('UPDATE', @IdnOper, @KontrGUID, '', '', '');				
	**************************************************************************************************************************************************************/
		IF EXISTS(SELECT n.GUID FROM `opng` n WHERE n.GUID = _Key AND n.Rodzaj = 2) THEN
			LEAVE _S_opng_Make_Paragon_to_STRU;
		END IF;
		
		SET _NEW_KontrGUID = IF(IFNULL(_NEW_KontrGUID, '') = '', NULL, _NEW_KontrGUID);
		CALL _Session_Refresh_Variables('', '', '');
		/*
		SET @.opng_Make_Paragon_to_STRU.COUNT = ROW_COUNT();
		IF @.opng_Make_Paragon_to_STRU.COUNT = 0 THEN
			LEAVE _S_opng_Make_Paragon_to_STRU;
		END IF;
		*/
	--	Teraz czy nowy numer ?
		
		SET @.opng_Make_Paragon_to_STRU.Need.changr.numer = 
			IF(@session.globals.Owner = 'XXX' OR @session.globals.Owner = 'YYY', 
				FALSE,
				TRUE
			)
		;
		IF @.opng_Make_Paragon_to_STRU.Need.changr.numer THEN
			IF @session.HT.IR.FV_do_ZS_ze_zmiana_numeracji THEN
				UPDATE `opng` n 
				SET
					n.Rodzaj = 2,
					n.uwagi = _ConcatStr(n.uwagi, CONCAT('Faktura do paragonu nr "', n.NrdokFin, '"'), ' '),
					n.NrdokFin = ''
				WHERE
					n.GUID = _Key
					AND
					n.Rodzaj = 0
				;
			END IF;
			
			SELECT
				n.PlatnikGUID, n.sposobplatn, n.dataplatnosci, n.CKwota
			FROM `opng` n
			WHERE
				n.GUID = _Key
			INTO
				@.opng_Make_Paragon_to_STRU.n.PlatnikGUID, @.opng_Make_Paragon_to_STRU.n.sposobplatn, @.opng_Make_Paragon_to_STRU.n.dataplatnosci, @.opng_Make_Paragon_to_STRU.n.CKwota
			;
			
			CALL Opng_E_init('EDIT', _Key, @session.Registration.UserGUID, '', '');
			CALL Opng_E_Run('before.run', @IdnOper, '', '', '');
			CALL Opng_E_Run('', _Key, '', '', '');
			CALL Opng_E_Run('after.run', _Key, '', '', '');
			
			UPDATE `opng_e` n 
			SET
				n.KontrGUID = IFNULL(_NEW_KontrGUID, n.KontrGUID),
				n.PlatnikGUID = @.opng_Make_Paragon_to_STRU.n.PlatnikGUID
			WHERE
				n.GUID = _Key
			;
			
			IF @session.HT.IR.FV_do_paragonu_zostaw_sposoby_platnosci THEN
				UPDATE `opng_e` n 
				SET
					n.sposobplatn = @.opng_Make_Paragon_to_STRU.n.sposobplatn,
					n.dataplatnosci = @.opng_Make_Paragon_to_STRU.n.dataplatnosci
				WHERE
					n.GUID = _Key
				;
			END IF;
			
			IF @session.HT.IR.FV_do_ZS_ze_zmiana_numeracji THEN
		--	Nadaj Numer	
				CALL erp_obj_counters_values_e_1_rec_tools('Set.semi.auto.number', 'OP', _Key, '1', '', '', '');
			END IF;
			
			CALL opng_E_Let('ApplyAndClear', _Key, '', '');
			
			
			SET @.opng_Make_Paragon_to_STRU.n.idnoper2 = NULL;
			
			SELECT 
				r.idnoper2 
			FROM rozrach r 
			WHERE 
				r.idnoper = _Key AND r.kwota = @.opng_Make_Paragon_to_STRU.n.CKwota limit 1
			INTO
				@.opng_Make_Paragon_to_STRU.n.idnoper2;

			SELECT
				n.PlatnikGUID, n.CKwota
			FROM `opng` n
			WHERE
				n.GUID = _Key
			INTO
				@.opng_Make_Paragon_to_STRU.n.PlatnikGUID, @.opng_Make_Paragon_to_STRU.n.CKwota
			;
				
			IF(IFNULL(@.opng_Make_Paragon_to_STRU.n.idnoper2, '') != '') THEN
				UPDATE opng 
				SET	
					PlatnikGUID = @.opng_Make_Paragon_to_STRU.n.PlatnikGUID 
				WHERE 
					guid = @.opng_Make_Paragon_to_STRU.n.idnoper2;
				
				UPDATE rozrach 
				SET 
					PlatnikGUID = @.opng_Make_Paragon_to_STRU.n.PlatnikGUID 
				WHERE  
					(idnoper = _Key AND idnoper2 = @.opng_Make_Paragon_to_STRU.n.idnoper2) OR
					(idnoper =  @.opng_Make_Paragon_to_STRU.n.idnoper2 AND idnoper2 = _Key);			
			END IF;			
			
		END IF;
	END IF;
	
END$$


DROP PROCEDURE IF EXISTS `opng_E_DeleteKorekta`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_E_DeleteKorekta`(
    IN _MODE VARCHAR(250),     --     to co w i_MODE np. 'Realizacja.ZM.%'
    IN _Key VARCHAR(38),
    IN _handle_UserGUID VARCHAR(38),
    IN _Param_A VARCHAR(255),
    IN _Param_B VARCHAR(255)
)
/*
    CALL opng_E_DeleteKorekta('', @IdnOper, '_handle_UserGUID', '', '');
	CALL opng_E_DeleteKorekta('', @IdnOper, @session.Registration.UserGUID, '', '');
	dla wypelnionej temp tabeli 'for.`t_opng_kor_to_delete`'
	CALL opng_E_DeleteKorekta('for.`t_opng_kor_to_delete`', '', '_handle_UserGUID', '', '');
*/
BEGIN 
	DECLARE _MSG VARCHAR(255);

	IF _MODE = '' THEN
		SET @_IsKorekta =NULL;
		SELECT 
			od.IsKorekta,
			n.zaksiegowana,
			n.status
		FROM `opng` n, `operdoc` od 
		WHERE 
			n.GUID = _Key
			AND od.rodzaj = n.Rodzaj 
		INTO 
			@_IsKorekta,
			@n.zaksiegowana,
			@n.status
		;
		SET @_IsKorekta = IFNULL(@_IsKorekta, -1);
		IF @_IsKorekta >= 0 THEN
		--    Czy nie bylo pozniejszych korekt ???
			SELECT 
				COUNT(cprev.idn) AS cPosLater 
			FROM `oppo_corr` c 
			INNER JOIN `oppo_corr` cprev ON cprev.GUID_corr_prev = c.guid AND cprev.Changed > 0
			WHERE  
				c.IdnOper_corr = _Key
			INTO @cPosLater
			;
			SET @cPosLater = IFNULL(@cPosLater, 0);
			IF (@cPosLater > 0) 
			THEN
				SET
					_MSG = 'Ta korekta posiada pozycje, których oryginaly były pozniej już korygowane.'
				;
			ELSEIF @n.zaksiegowana != 0 THEN
				SET
					_MSG = 'Ta korekta jest zaksięgowana i nie można jej usunąć!'
				;
			ELSE
				SET
					_MSG = 'OK'
				;
				DELETE FROM `_lock_inf` WHERE RecId = _Key;
				CALL Opng_E_init('DELETE', _Key, @session.Registration.UserGUID, '', '');
				CALL _ng_e_rec_do('select.into', _Key, '', '');
				CALL Opng_E_Run('before.run', _Key, '', '', '');
				CALL Opng_E_Run('', _Key, '', '', '');
				CALL Opng_E_Run('after.run', _Key, '', '', '');
				DELETE FROM `oppo_corr_e` WHERE IdnOper_corr = _Key;
				DELETE FROM `oppo_e` WHERE IdnOper = _Key;
				CALL opng_E_LetPostCorr('', _Key, '', '');
				CALL opng_E_Let('Post', _Key, '', '');
				CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
				UPDATE `opng` n SET n.Deleted = 1 WHERE n.GUID = _Key;
				
		
				CALL _ng_E_SaveToLogBeforeApply('', _Key, @handle_FROM, '');
				
			END IF;
		ELSEIF @_IsKorekta < 0 THEN
			SET
				_MSG = 'Brak takiego dokumentu!'
			;
		ELSE
			SET
				_MSG = 'Dokument nie jest korektą!'
			;
		END IF;    --    Czy mam pozycje korygowane

		SELECT _MSG AS MSG;
	END IF;    -- IF _MODE = '' THEN
	
	IF _MODE = 'for.`t_opng_kor_to_delete`' THEN
	BEGIN
		DECLARE _Idnoper VARCHAR(38) DEFAULT '';    
		DECLARE done BOOL DEFAULT FALSE;        
		DECLARE c_proc CURSOR FOR
		SELECT GUID FROM `t_opng_kor_to_delete` GROUP BY GUID; 
		
		DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

		CALL _Session_Refresh_Variables('', '', '');
		IF IFNULL(_handle_UserGUID, '')  = '' THEN
			IF IFNULL(@session.Registration.UserGUID, '')  = '' THEN
				SELECT guid FROM osoby WHERE idnuser = 'jmam' INTO @session.Registration.UserGUID;
			END IF;
			SET _handle_UserGUID = @session.Registration.UserGUID;
		END IF;

		OPEN c_proc;
			loop2: LOOP
				FETCH c_proc INTO _Idnoper;
					IF done THEN
						LEAVE loop2;
					ELSE
						CALL opng_E_DeleteKorekta('', _Idnoper, _handle_UserGUID, '', '');
				END IF;
			END LOOP;
		CLOSE c_proc;
				
	END;
	END IF;    -- IF _MODE = 'for.`t_opng_kor_to_delete`' THEN
	
END$$

DROP PROCEDURE IF EXISTS `opng_przepinanie_poz_WIZARD`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_przepinanie_poz_WIZARD`(
	IN _MODE VARCHAR(150),
	IN _IdnOper VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C MEDIUMTEXT
)
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
		Inkrementowanie licznika
		CALL opng_przepinanie_poz_WIZARD('init', '{9234A546-1902-4971-948D-E043D53A98CB}', '', '', '');
		
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
S_opng_przepinanie_poz_WIZARD: BEGIN
	IF _MODE = 'INIT' THEN
	/********************************************************************************************************************************
		CALL opng_przepinanie_poz_WIZARD('init', '{787F3BD5-FC19-4E17-8006-6E7EEF3782B7}', '', '', '');
		_IdnOper	to źrodlowy dok.  skad wezmiemy kontrahenta
	********************************************************************************************************************************/
		DROP TEMPORARY TABLE IF EXISTS `t_opng_przepinanie_poz_WIZARD`;
		CREATE TEMPORARY TABLE `t_opng_przepinanie_poz_WIZARD` (
		  `GUID` VARCHAR(38) NOT NULL DEFAULT '',
		  `LP` INT(11) DEFAULT 0,
		  `Checked` INT(11) DEFAULT NULL,
		  -- `lp` int(11) NOT NULL DEFAULT '0',
		  `Header` VARCHAR(200) DEFAULT NULL,
		  -- `Zrealizowano` double(16,4) NOT NULL DEFAULT '0.0000',
		  `DataWplywu` DATE DEFAULT NULL,
		  `TowrSymb` VARCHAR(38) NOT NULL DEFAULT '',
		  `TowrNazwa` VARCHAR(150) NOT NULL DEFAULT '',
		  `Ilosc` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
		  `Cena` DOUBLE DEFAULT NULL,
		  `IdnOper` VARCHAR(38) NOT NULL DEFAULT '',
		  `IdnOper_NEW` VARCHAR(38) NOT NULL DEFAULT '',
		  PRIMARY KEY GUID(GUID), 
		  KEY IdnOper(IdnOper)
		)
		;
		SELECT 
			n.waluta, n.kontrguid, IF(n.ZMagazynu = 0, n.DoMagazynu, n.ZMagazynu) AS Magazyn, n.rodzaj
		FROM `opng` n
		WHERE
			n.GUID = _IdnOper
		INTO 
			@_waluta, @_kontrguid, @_Magazyn, @_rodzaj
		;		

		TRUNCATE `t_opng_przepinanie_poz_WIZARD`;
		INSERT INTO `t_opng_przepinanie_poz_WIZARD`
			SELECT
				p.GUID, 
				0 AS LP,
				_VarInt(0) AS Checked,
				CONCAT('nr mag.:', n.NrDokMag) AS Header,
				-- p.Zrealizowano, 
				p.DataWplywu, 
				p.TowrSymb, p.TowrNazwa, p.Ilosc, _VarDouble(p.cenanet*p.Kurs) AS Cena,
				p.IdnOper, 
				p.IdnOper AS IdnOper_NEW
			FROM `oppo` p
			INNER JOIN `opng` n ON n.GUID = p.IdnOper
			WHERE
				TRUE
				-- AND p.Ilosc > p.Zrealizowano
				AND n.Status IN (0, 1)
				AND n.KontrGUID = @_kontrguid
				-- AND n.Waluta = @_waluta
				AND (n.ZMagazynu = @_Magazyn OR n.DoMagazynu = @_Magazyn)
				AND n.rodzaj = @_rodzaj				
			ORDER BY n.DataWplywu
		;
		
		
		DROP TEMPORARY TABLE IF EXISTS `t_opng_przepinanie_poz_WIZARD_lp`;
		CREATE TEMPORARY TABLE `t_opng_przepinanie_poz_WIZARD_lp` 
			SELECT 
				_varInt(0) AS LP, IdnOper, DataWplywu 
			FROM `t_opng_przepinanie_poz_WIZARD` 
			GROUP BY IdnOper 
			ORDER BY DataWplywu
		;
		SET @LP := 0;
		UPDATE `t_opng_przepinanie_poz_WIZARD_lp` SET LP := (@LP := @LP + 1);
		UPDATE `t_opng_przepinanie_poz_WIZARD_lp` tlp, `t_opng_przepinanie_poz_WIZARD` t 
		SET 
			t.LP = tlp.LP,
			t.Header := CONCAT(tlp.LP, ' - ', t.Header) 
		WHERE 
			t.IdnOper = tlp.IdnOper
		;
		DROP TEMPORARY TABLE IF EXISTS `t_opng_przepinanie_poz_WIZARD_lp`;
		
		
	END IF;	--	_MODE = 'init' 
	
	IF _MODE = 'END' THEN
		TRUNCATE `t_opng_przepinanie_poz_WIZARD`;
		-- DROP TEMPORARY TABLE IF EXISTS `t_opng_przepinanie_poz_WIZARD`;
	END IF;	--	_MODE = 'fin' 
	
	IF _MODE = 'select.dest.doc' THEN
	/********************************************************************************************************************************
		CALL opng_przepinanie_poz_WIZARD('select.dest.doc', '', '', '', '');
	********************************************************************************************************************************/
		SELECT 
			n.GUID, p.LP, p.Header, p.DataWplywu
		FROM `t_opng_przepinanie_poz_WIZARD` p
		INNER JOIN `opng` n ON n.GUID = p.IdnOper
		GROUP BY n.GUID
		ORDER BY p.LP -- , p.DataWplywu, p.Header
		;
	END IF;	--	_MODE = 'select.dest.doc' 
	
	IF _MODE = 'przepnij' THEN
	/********************************************************************************************************************************
		CALL opng_przepinanie_poz_WIZARD('przepnij', '{E8AB3E5E-56D6-40F7-9F13-483587BCE0FA}', '', '', '');
		_IdnOper	to GUID to docelowego naglowka do ktorego dopniemy zazn. pozycje
	********************************************************************************************************************************/
		SELECT COUNT(*) FROM `t_opng_przepinanie_poz_WIZARD` p WHERE p.Checked 
		INTO @Count.p.Checked; 
		IF IFNULL(@Count.p.Checked, 0) != 0 THEN
			
		--	Ustaw
			UPDATE `t_opng_przepinanie_poz_WIZARD` p
			SET
				p.IdnOper_NEW = _IdnOper
			WHERE
				p.Checked
			;
		--	przepnij rekord `oppo` do nowego _IdnOper
			UPDATE `oppo` p, `t_opng_przepinanie_poz_WIZARD` tp
			SET
				p.IdnOper = tp.IdnOper_NEW
			WHERE
				tp.Checked
				AND
				p.GUID = tp.GUID
			;
			DROP TEMPORARY TABLE IF EXISTS `t_opng_do_przeliczenia`;
			CREATE TEMPORARY TABLE `t_opng_do_przeliczenia` (
				`GUID` VARCHAR(38) NOT NULL DEFAULT '' COMMENT 'GUID dokumentu',
				PRIMARY KEY GUID (GUID)
			);
		--	W `t_opng_do_przeliczenia` bede mial wszystkie guidy opng ktore sa przepinane (stare i nowe)	
			INSERT IGNORE INTO `t_opng_do_przeliczenia`
				SELECT _IdnOper
			;
		--	pozostale ktore zaczekowalismy	
			INSERT IGNORE INTO `t_opng_do_przeliczenia`
				SELECT p.IdnOper FROM `t_opng_przepinanie_poz_WIZARD` p WHERE p.Checked GROUP BY p.IdnOper
			;
		--	Teraz petla dokumentow
			BEGIN
				DECLARE done BOOL DEFAULT FALSE;
				DECLARE _GUID VARCHAR(38);
			--	3.1 Kursor	
				DECLARE c_t_opng_do_przeliczenia CURSOR FOR
					SELECT
						z.GUID
					FROM `t_opng_do_przeliczenia` z
				;	
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
							/* ---------------------------------------------------------------------------------------------------------------------------------------
								ERORR 
							--------------------------------------------------------------------------------------------------------------------------------------- */	
							DECLARE continue HANDLER FOR SQLEXCEPTION BEGIN
								SET @_Process = CONCAT("CALL opng_przepinanie_poz_WIZARD()", ' ZM:', _GUID);
								CALL _Report_Error(@_Process, 'Exec', 'stat', '', '');
							END;
				OPEN c_t_opng_do_przeliczenia;
				loop_c_t_opng_do_przeliczenia: LOOP
					SET done = FALSE;
					FETCH c_t_opng_do_przeliczenia INTO 
						_GUID
					;
					IF done THEN
						LEAVE loop_c_t_opng_do_przeliczenia;
					END IF;
				--	Wykonaj przepiecie
					CALL opng_przepinanie_poz_WIZARD('przepnij.jednen.doc', _GUID, _Param_A, '', '');
				END LOOP;
				CLOSE c_t_opng_do_przeliczenia;
							
			END;
			
		END IF;
						
	END IF;	--	_MODE = 'przepnij' 
	
	IF _MODE = 'przepnij.jednen.doc' THEN
	/********************************************************************************************************************************
		CALL opng_przepinanie_poz_WIZARD('przepnij.jednen.doc', _GUID, '', '', '');
		CALL opng_przepinanie_poz_WIZARD('przepnij.jednen.doc', _GUID, 'Keep_Calc_Ver', '', '');
		_IdnOper	to GUID naglowka ktory w swiecie E bede przeliczal
		_Param_A	moze zawierac "Keep_Calc_Ver"i wtedy zapalamy na chwile Calc_Ver = 3 a po wszystkim wracamy do poprzedniego Calc_Ver
	********************************************************************************************************************************/
		/*
		UPDATE `zmpo` p, `t_opng_przepinanie_poz_WIZARD` tp
		SET
			p.IdnNg = tp.IdnOper_NEW
		WHERE
			tp.IdnOper_NEW = _IdnOper
			AND
			p.GUID = tp.GUID
		;
		*/
		
		SET @.Keep_Calc_Ver = (_Param_A LIKE '%Keep_Calc_Ver%');
		IF @.Keep_Calc_Ver THEN
			SELECT
				n.Calc_Ver
			FROM `opng` n
			WHERE
				n.GUID = _IdnOper
			INTO 
				@_OLD_Calc_Ver
			;
			IF @_OLD_Calc_Ver < 3 THEN
				CALL opng_przepinanie_poz_WIZARD('Set.Calc_Ver', _IdnOper, '', '3', '');
			END IF;
		END IF;
		
		SET @IdnOper = _IdnOper;
		CALL _Session_Refresh_Variables('', '', '');
		
		CALL opng_E_init('EDIT', _IdnOper, 'jmam', '', '');
		CALL opng_E_Run('all', _IdnOper, '', '', '');
		
		CALL opng_E_Let('Post', _IdnOper, '', '');
		-- CALL zmng_E_Let('Apply', _IdnOper, '', '');
		CALL opng_E_Let('ApplyAndClear', _IdnOper, '', '');
		-- CALL zmng_E_Let('End', _IdnOper, '', '');
		DELETE FROM `_lock_inf` WHERE RecId = _IdnOper;

		IF @.Keep_Calc_Ver THEN
			IF @_OLD_Calc_Ver < 3 THEN
				CALL opng_przepinanie_poz_WIZARD('Set.Calc_Ver', _IdnOper, '', @_OLD_Calc_Ver, '');
			END IF;
		END IF;
		
	END IF;	--	_MODE = 'przepnij.jednen.doc' 
	
				IF _MODE = 'Set.Calc_Ver' THEN
				/********************************************************************************************************************************
					CALL opng_przepinanie_poz_WIZARD('Set.Calc_Ver', _GUID, '', '3', '');
					_IdnOper	to GUID naglowka
					_Param_B	to ustawiane Calc_Ver
				********************************************************************************************************************************/
					SET @.Calc_Ver = _Param_B;
					
					UPDATE `opng` n
					SET
						n.Calc_Ver = @.Calc_Ver
					WHERE
						n.GUID = _IdnOper
					;
					UPDATE `oppo` p
					SET
						p.Calc_Ver = @.Calc_Ver
					WHERE
						p.IdnOper = _IdnOper
					;
				END IF;

END$$

DROP PROCEDURE IF EXISTS `opng_Calc_ver_Change`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `opng_Calc_ver_Change`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C MEDIUMTEXT
)
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
		Zmiana Calc_ver na 3 gdzy < 3
		CALL opng_Calc_ver_Change('', '{9234A546-1902-4971-948D-E043D53A98CB}', '', '', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
S_opng_Calc_ver_Change: BEGIN
	IF EXISTS((SELECT n.Idn FROM `opng` n WHERE n.GUID = _Key AND n.Calc_ver < 3)) THEN
	--	zmien Calc_ver
		UPDATE `opng` n SET n.Calc_ver = 3 WHERE  n.GUID = _Key;
		UPDATE `oppo` p SET p.Calc_ver = 3 WHERE  p.IdnOper = _Key;
	--	do LOG
		CALL log_Insert('INSERT', @Idn, 
			'', @Miejsce := 3, 2, 
			_Key, 
			@session.Registration.IP, 'Zmiana Calc_ver na 3 do edycji w "E".', 'opng'
		);
	END IF;
END$$

DELIMITER ;

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

CALL _Session_Refresh_Variables('SYS', '', '');
SET @session.Registration.UserGUID = '{E14EB4A3-D9DD-4C0E-8C04-E4259F3090BE}';

--	NOWY
SET 
	@IdnOper = 'X',
	@KontrGUID = 'INT',
	@_Tymczasowa = TRUE,
	@G = ''
;
CALL Opng_E_init('INSERT', @IdnOper, 'jmam', '', '');
CALL Opng_E_init_set('', @IdnOper, 1, 0, '', 0, @KontrGUID, 1, 0, 0, 0, 'OsobaGUID', 'AreaGUID', '', 0, '', '', '');

--	EDYCJA
SET 
	@IdnOper = '{4367FDA9-1EF9-4117-B768-BCD4D91C6DE1}'
;
CALL Opng_E_init('EDIT', @IdnOper, 'jmam', '', '');

--	DALEJ
CALL Opng_E_Run('before.run', @IdnOper, '', '', '');
CALL Opng_E_Run('', @IdnOper, '', '', '');
CALL Opng_E_Run('after.run', @IdnOper, '', '', '');
SELECT n.rozrachunek, n.grupaoper, n.wzordekr, n.ugrpGUID, n.* FROM opng_e n WHERE GUID = @IdnOper;
SELECT p.* FROM oppo_e p WHERE IdnOper = @IdnOper;
	CALL opng_E_Let('Post', @IdnOper, '', '');
	CALL opng_E_Let('Apply', @IdnOper, '', '');
	CALL opng_E_Let('ApplyAndClear', @IdnOper, '', '');
	CALL opng_E_Let('End', @IdnOper, '', '');
	-- to samo co
		CALL opng_E_Let('Clear', @IdnOper, '', '');
		-- i to samo co
		CALL opng_E_Let('Cancel', @IdnOper, '', '');


ID naglowka w trakcie edycji (IDNOperFin zawsze lub IdnOper gdy WZ-ka podpieta jest edytowana w WZ

CALL opng_E_LetInsertCorr(@i_MODE, _Key, @i_Input_GUID, '', '', '', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
