 DELIMITER $$

/* ************************************************************************************************************************************************************************
	Edycja pozycji, Wstawianie, etc
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `C_HT_OPZM`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `C_HT_OPZM`(
	IN _MODE VARCHAR(250),
	IN _IN_MODE VARCHAR(250),
	IN _FROM VARCHAR(250),
	IN _WORLD VARCHAR(250),
	IN _IdnOper VARCHAR(38),	--	IdnOper/IdnNg
	IN _GUID VARCHAR(38),		--	GUID pozycji ALBO!!! IdnNg realizowanego zamowienia w INIT _GUID wedruje do @.OPZM.INPUT_Key
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255),
	IN _Param_E TEXT
)
SC_HT_OPZM: BEGIN 
	DECLARE _SQLText, _Params TEXT;
	DECLARE _IdnTowr, _ModeParam, _ZM_Key, _zmpo_GUID VARCHAR(38);
	DECLARE _Ilosc, _CenaNet DOUBLE(16,4);
	DECLARE _rodzaj_przeliczenia INTEGER;
	DECLARE CZZ_Zamowienie INTEGER DEFAULT 0;
	DECLARE CZZ_KursDzis INTEGER DEFAULT 1;
	DECLARE CZZ_OdNowa INTEGER DEFAULT 2;

	DECLARE _Limit INTEGER;
	DECLARE _WyjazdGUID, _IdnNg, _KontrGUID VARCHAR(38);

	SET @.My.WORLD = _WORLD;

					/************************************************************************************************************************************
						W _MODE moze byc ...(CLEAR) albo wperost CLEAR !!! Wtedy musimy wyczyścić tabele
					************************************************************************************************************************************/
					IF _MODE LIKE '%Clear%' THEN
						IF _MODE = 'Clear' OR _MODE LIKE '%(CLEAR)%' THEN
							SET @.OPZM.Proc.Inf = NULL, @.OPZM.Proc.Inf.Ext = NULL;
							IF _WORLD = 'TE' THEN
								IF _FROM = 'OP' THEN
									TRUNCATE `TE_opng`;
									TRUNCATE `TE_oppo`;
									TRUNCATE `TE_oppo_corr`;
									TRUNCATE `TE_opng_vat`;
								ELSE
									TRUNCATE `TE_zmng`;
									TRUNCATE `TE_zmpo`;
									TRUNCATE `TE_zmng_vat`;
								END IF;
							END IF;
						/*
							Wyczyść adresy 	
							mp gdy anulujemy educje a rekord byl nowy to w `geo_int_adr_link` mógł powstac > 0 rekordów - 
							musimy je usunac jesli nie istnie w realnym świecie doku,ent (operacja.zamówienie)
						*/
							CALL geo_int_adr_link_NED('REC.CANCEL.DELETE', '', _IdnOper, _FROM, '', '', '', '', '', '', '');

						--	teraz CLEAR ogólny !!!!	
							CALL C_HT_xxNgPo_DO(CONCAT(_WORLD, '.Clear'), _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						
							SET _MODE  = REPLACE(UPPER(_MODE), '(CLEAR)', '');
						END IF;
					END IF;


					/************************************************************************************************************************************
						Dla swiat TE - rekreacja
					************************************************************************************************************************************/
					IF _MODE LIKE 'recreate.%' THEN
						IF _MODE IN ('recreate.`TE_xxpo`', 'recreate.`TE_xxxx`', 'recreate.TE_xxpo', 'recreate.TE_xxxx') THEN
							IF _FROM = 'OP' THEN
								DROP TEMPORARY TABLE IF EXISTS `TE_oppo`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_oppo` LIKE `oppo_e`;
							ELSE
								DROP TEMPORARY TABLE IF EXISTS `TE_zmpo`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_zmpo` LIKE `zmpo_e`;
							END IF;
						
						END IF;
						
						IF _MODE IN ('recreate.`TE_oppo_corr`', 'recreate.`TE_xxxx`', 'recreate.TE_oppo_corr', 'recreate.TE_xxxx') THEN
							IF _FROM = 'OP' THEN
								DROP TEMPORARY TABLE IF EXISTS `TE_oppo_corr`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_oppo_corr` LIKE `oppo_corr_e`;
							END IF;
						END IF;
						
						IF _MODE IN ('recreate.`TE_xxng`', 'recreate.`TE_xxxx`', 'recreate.TE_xxng', 'recreate.TE_xxxx') THEN
							IF _FROM = 'OP' THEN
								DROP TEMPORARY TABLE IF EXISTS `TE_opng`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_opng` LIKE `opng_e`;
							ELSE
								DROP TEMPORARY TABLE IF EXISTS `TE_zmng`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_zmng` LIKE `zmng_e`;
							END IF;
						
						END IF;
						
						IF _MODE IN ('recreate.`TE_xxng_vat`', 'recreate.`TE_xxxx`', 'recreate.TE_xxng_vat', 'recreate.TE_xxxx') THEN
							IF _FROM = 'OP' THEN
								DROP TEMPORARY TABLE IF EXISTS `TE_opng_vat`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_opng_vat` LIKE `opng_vat_e`;
							ELSE
								DROP TEMPORARY TABLE IF EXISTS `TE_zmng_vat`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_zmng_vat` LIKE `zmng_vat_e`;
							END IF;
						
						END IF;
					END IF;


	IF _MODE IN ('NEW', 'INSERT', 'EDIT') THEN
		SET _MODE = REPLACE(_MODE, 'INSERT', 'NEW');
		CALL C_HT_OPZM(CONCAT('INIT.', _MODE), _IN_MODE, _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		-- SET @.OPZM.OPER = _MODE;
		CALL C_HT_OPZM('START', _IN_MODE, _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		LEAVE SC_HT_OPZM;
	END IF;


	-- SET @_FROM = 'OP: ZM.skaner'; SELECT LOCATE(':', @_FROM);
	IF _MODE LIKE 'INIT%' THEN
	--	!!! Wejsciowo
		SET 
			-- @.OPZM.IN_MODE = '',
			@.OPZM.IN_MODE = _IN_MODE,
			@.OPZM.IN_Params = '',
			@.OPZM.GUI = 0,
			@.DEST.Rodzaj = NULL,
			@.DEST.OpTyp = NULL,
			@.OPZM.INPUT_Key = _GUID,
			@.OPZM.ON.START.Ng.R.Existed = FALSE,		-- Istnienie nagłowek w R (dawna zmienna @.OPZM.N.Exists jest też ustawiana dla kompatybilność - jest używana w innych miejscach
			@.OPZM.ON.START.Ng.world.Existed = FALSE,	-- Instnieje nagłowek w `TE_xxng`, `xxng_m`, `xxng_e`
			@.OPZM.N.Exists = FALSE,
			@.OPZM.AutoNum.Before.Apply = NULL,			--	Ta zmienna poczodzi ze sznurka
			@.NgPO.INF.Default_AutoNum_Before_Apply = NULL,	--	Ta zmienna zastępuje @.OPZM.AutoNum.Before.Apply gdy ta jest null i pochodzi z `operdoc` - CALL C_HT_xxNgPo_DO('CHECK.NgPO.INF' ...
			@.OPZM.APPLY.Result = NULL	-- inicjalnie
		;
	END IF;
	SET @_MODE.X = _MODE;
		CALL _ExecuteCmd_xxNgPo('MODE', '', '', '', '', '', '', '', '', _MODE);
	SET _MODE = @_MODE.X;
	
	
	SET @SepFROM := LOCATE(':', _FROM);
	IF @SepFROM > 0 THEN
		SET 
			@.OPZM.IN_MODE = TRIM(SUBSTR(_FROM, @SepFROM + 1, 255)),
			_FROM = SUBSTR(_FROM, 1, @SepFROM - 1)
		;
	END IF;
	-- SET @.OPZM.IN_MODE = TRIM(IF(@SepFROM = 0, '', SUBSTR(_FROM, @SepFROM + 1, 255)));
	-- SET _FROM = IF(@SepFROM > 0, SUBSTR(_FROM, 1, @SepFROM - 1), _FROM);


	IF _MODE LIKE 'INIT.%' THEN
		SET @.OPZM.OPER = REPLACE(_MODE, 'INIT.', '');
		
		SET @.OPZM.INSERT.Need.POST = TRUE;
		/*	Nie wiem po co to było!!! zakomentowałem jmam 20 XII 2023
		IF IFNULL(@session.INFO.User_GUID, '') = '' THEN
			CALL _sys_db_logons_rec_tools('CLOSE', _GUID, 0, '', '', '', '', '');
		END IF;
		*/

		IF _WORLD = 'TE' THEN
			CALL C_HT_OPZM('recreate.`TE_xxxx`', '', _FROM, _WORLD, '', '', '', '', '' ,'', '');
		END IF;
		
		CALL _Cmd_xxNgPo_Tools('_FetchParams', _FROM, _WORLD, '', '', '', '', '', '', '', _Param_E);
		SET @.OPZM.IN_Params = _Param_E;
	/***********************************************************************
		Gdy w Params mamy @.OPZM.GUI = 1 to musimy wstawic msg sterujace
	***********************************************************************/
		IF _MODE LIKE 'INIT.NEW%' OR _MODE LIKE 'INIT.INSERT%' THEN
			SET @.OPZM.OPER = 'INSERT';
			
			IF @.OPZM.IN_MODE LIKE 'Realizacja.ZM.%' THEN  -- np 'Realizacja.ZM.From.zmng' etc
				set @xyz = ''; -- Tutaj byc moze cos trzebaby zrobic ???
			END IF;
		END IF;
		
		IF _MODE LIKE 'INIT.EDIT%' OR _MODE LIKE 'INIT.MODIFY%' THEN
			SET @.OPZM.OPER = 'EDIT';
		END IF;
	END IF;
	
		
		
	IF _MODE LIKE 'START%' THEN
		IF _IdnOper IS NULL THEN 
			LEAVE SC_HT_OPZM;
		END IF;

		
		IF _MODE = 'START' THEN --	START oznacza zawolanie Start dla naglowka N, pozycji P, i reszty
		set @.x.x = '1';
			CALL C_HT_OPZM(CONCAT(@.OPZM.OPER, '.START.begin'), '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		set @.x.x = '2';
			CALL C_HT_OPZM(CONCAT(@.OPZM.OPER, '.START.NG'), '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		set @.x.x = '3';
			CALL C_HT_OPZM(CONCAT(@.OPZM.OPER, '.START.PO'), '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		set @.x.x = '4';
			CALL C_HT_OPZM(CONCAT(@.OPZM.OPER, '.START.end'), '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		set @.x.x = '...';
			
		--	UWAGA flagę @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear czyścimy na NULL zaraz po inicjacji - zatem programista zawsze musi 
		--	ja ustawiac jeśli chce zachowania to co jest w destynacyjnej tabeli np `zmng_m`
			SET @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear = NULL;
			
			LEAVE SC_HT_OPZM;
		END IF;	
	END IF;	
		
		
		

						IF _MODE LIKE 'NG<-DEFAULT' 
						OR
						_MODE LIKE 'TE.xxng<-DEFAULT%'	--	konieczna pozostałosć - tak wołamy w dawnym TE (Na razie)
						THEN
							SET @X = 1;
							CALL C_HT_xxNgPo_DO('NG<-DEFAULT', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						ELSE
							IF _MODE LIKE 'NG<-%' THEN
								CALL C_HT_xxNgPo_DO(_MODE, _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
							END IF;
						END IF;
					
						IF _MODE = 'NG.POST' 
						OR 						
						_MODE = 'TE.NG.POST'	--	konieczna pozostałosć - tak wołamy w dawnym TE (Na razie)
						OR
						_MODE = 'TE.xxng.POST'	--	konieczna pozostałosć - tak wołamy w dawnym TE (Na razie)
						THEN
							CALL C_HT_xxNgPo_DO('NG.POST', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						END IF;
					
						-- IF _MODE = 'TE.xxpo<-POZYCJE_CENYRABAT' THEN
						IF _MODE = 'PO<-POZYCJE_CENYRABAT' 
						OR
						_MODE = 'TE.xxpo<-POZYCJE_CENYRABAT'	--	konieczna pozostałosć - tak wołamy w dawnym TE (Na razie)
						THEN
							CALL C_HT_xxNgPo_DO('PO<-POZYCJE_CENYRABAT', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
							/*
							bylo
							CALL C_HT_xxNgPo_CenyRabaty('TE.PO<-pozycje_cenyrabat', _FROM, _WORLD, _IdnOper, '', FALSE, FALSE, FALSE, '', _Param_E);
							-- CALL C_HT_NgPo_cenyrabat('TE.PO<-pozycje_cenyrabat', _FROM, _WORLD, _IdnOper, '', FALSE, FALSE, FALSE, '', '');
							CALL C_HT_xxNgPo_DO('PO.CALC_ROWS', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
							*/
						END IF;
						
						-- IF _MODE LIKE 'TE.xxpo.POST%' THEN
						IF _MODE LIKE 'PO.POST%' 
						OR 						
						_MODE = 'TE.PO.POST'	--	konieczna pozostałosć - tak wołamy w dawnym TE (Na razie)
						OR 						
						_MODE LIKE 'TE.xxpo.POST%'	--	konieczna pozostałosć - tak wołamy w dawnym TE (Na razie)
						THEN
							CALL C_HT_xxNgPo_DO('PO.POST', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						END IF;
						
					--	UWAGA to na zabezpierczenie - wiele kodu ma takie wywołanie dla swiarta TE zatem umieszczam jes tutaj
						IF _MODE IN ('N.xxpo->TE.xxpo', 'N->TE', 'TE.xxpo<-N.xxpo') AND _WORLD = 'TE' THEN	
							CALL C_HT_xxNgPo_DO('R.p->.p', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						END IF;
						
						-- IF _MODE = 'TE.xxpo<-Realizacja.ZM' AND @.OPZM.IN_MODE LIKE 'Realizacja.ZM.%' AND _FROM = 'OP' THEN
						IF _MODE = 'PO<-Realizacja.ZM' AND @.OPZM.IN_MODE LIKE 'Realizacja.ZM.%' AND _FROM = 'OP' THEN
						/*******************************************************
							Realizacja zamowien, zlecen, etc
							POZYCJE z zamowien - tylko OP
							Czy Realizacja zamowien, zlecen, etc ??????????????
							PO<-Realizacja.ZM.
							_IdnOper i/lub _GUID pozycji zamowienia
							CALL C_HT_OPZM('PO<-Realizacja.ZM', 'Realizacja.ZM.From.zmng', 'OP', _WORLD, @_IdnOper, @_IdnNg, zmpo_GUID lub null, '', '', '' , @Params);
						*******************************************************/
						
							--	UWAGA tutaj nie jest świat TE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
							--	może to byc M, TE - zatem gdy M to musimy na wtepie przerzucic dane do M->TE  a na komniec spowrotrm M<-TE
							--	ZATEM
								IF _WORLD = 'M' THEN
								--	1. Przygotuj tabel `TE_xxxx`	
									DROP TEMPORARY TABLE IF EXISTS `TE_oppo`;
									CREATE TEMPORARY TABLE IF NOT EXISTS `TE_oppo` LIKE `oppo_e`;
									DROP TEMPORARY TABLE IF EXISTS `TE_opng`;
									CREATE TEMPORARY TABLE IF NOT EXISTS `TE_opng` LIKE `opng_e`;
								--	2. przerzucic dane do M->TE
									CALL C_HT_xxNgPo_DO('M.n->clear->TE.n', 'OP', '', _IdnOper, '', '', '', '', '', @P);
									CALL C_HT_xxNgPo_DO('M.p->clear->TE.p', 'OP', '', _IdnOper, '', '', '', '', '', @P);
								END IF;
						--	Czy Realizacja zamowien, zlecen, etc ??????????????
								SET 
									_ZM_Key = _GUID,	--	IdnNg realizowanego zamowienia (@.OPZM.INPUT_Key !!!!)
									_zmpo_GUID = NULLIF(_Param_A, '')
								;
							--	Tworze `TE_zmpo` w ktorych bede mial pozycje realizacji
								DROP TEMPORARY TABLE IF EXISTS `t_zmpo_realizuj`;
								CREATE TEMPORARY TABLE `t_zmpo_realizuj` (
								  `GUID` VARCHAR(38) NOT NULL DEFAULT '',
								  `DoRealizacji` DOUBLE(16,4) DEFAULT NULL,
								  PRIMARY KEY (`GUID`)
								  
								) ENGINE=MYISAM
								;
								-- CALL t_CShowRealizowalnosc_Tools('temp.Init', _IdnOper, _ZM_Key, IF(@.DEST.Tymczasowa, '1', ''), '', '', '');
								SET @.t_CShowRealizowalnosc.COUNT = 0;
												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "Realizowalnosc", '', '', '');
								-- bylo do 26 Xi 2021 
								--	IF @.OPZM.IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`' THEN
								-- jest z like	
								IF @.OPZM.IN_MODE LIKE 'Realizacja.ZM.From.%`t_GUI_WE_zmpo`%' THEN
									INSERT IGNORE INTO `t_zmpo_realizuj`
										SELECT
											t.GUID,
											(t.Ilosc - t.zrealizowano)
										FROM `t_GUI_WE_zmpo` t
										WHERE
											TRUE
									;
								ELSEIF IFNULL(@.t_CShowRealizowalnosc.COUNT, 0) > 0 THEN
									INSERT IGNORE INTO `t_zmpo_realizuj`
										SELECT
											t.GUID,
											t.MogeZrealizowac AS DoRealizacji
										FROM `t_CShowRealizowalnosc` t
										WHERE
											t.MogeZrealizowac > 0
									;
								ELSE
									SET _SQLText = 
									"
									INSERT IGNORE INTO `t_zmpo_realizuj`
										SELECT
											p.GUID,
											(p.Ilosc - p.zrealizowano)
										FROM #`zmpo`# p
										WHERE
											p.IdnNG = #_IdnOper#
											AND 
											#p.GUID#
											AND 
											(p.Ilosc - p.zrealizowano) > 0
											AND
											IFNULL(p.IdnTowr, '') != ''
										ORDER BY p.LP	
									;	
									"
									;
									SET @.SQL.OPZM.ins_Realizacja = REPLACE(_SQLText, '#`zmpo`#', 
											IF(@.OPZM.IN_MODE = 'Realizacja.ZM.From.zmng', 
												'`zmpo`',
												IF(@.OPZM.IN_MODE = 'Realizacja.ZM.From.zmng.skaner', 
													'`t_skaner.zmpo`',
													IF(@.OPZM.IN_MODE LIKE 'Realizacja.ZM.From.%`t_zlecprod.zmpo`%', 
														'`t_zlecprod.zmpo`',
														'`zmpo`'
													)
												)
											)		
										);
										
									CALL _ExecuteCmd_xxNgPo('', 'ZM', 'TE', _ZM_Key, _zmpo_GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.ins_Realizacja);
									
								END IF;
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "Realizowalnosc", '', '', '');

												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "wstaw do `TE_zmpo`", '', '', '');

							--	Przygotuj `TE_zmpo`	
								DROP TEMPORARY TABLE IF EXISTS `TE_zmpo`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `TE_zmpo` LIKE `zmpo_e`;
							--  zamiast ...
							--	CALL C_HT_OPZM('recreate.`TE_xxpo`', '', 'ZM', _WORLD, '' ,'', '', '', '' ,'', '');
							
							--	`TE_zmpo` <- to co jest do realizacji	
								INSERT IGNORE INTO `TE_zmpo` 
									SELECT
										p.*
									FROM `t_zmpo_realizuj` tr, `zmpo` p
									WHERE
										p.GUID = tr.GUID
									ORDER BY p.LP	
								;
							--	ALE GDY Permanentne!!!!!
								UPDATE `TE_zmpo` p, `zmng` n
								SET
									p.ExtFlags = NULLIF(CONCAT_WS('', p.ExtFlags, IF(n.zamwpermn = 1, '<Z_ZM_PERMN>', NULL)), ''),
									p.permanentne = 
										IF(@session.globals.Owner = 'SECURITY',
											p.permanentne, --	nie zmieniamy - to powinno byc powszechne !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
											n.zamwpermn
										)
									
								WHERE
									n.GUID = p.IdnNg
								-- and p.idn < 80333669
								;
								
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "wstaw do `TE_zmpo`", '', '', '');
							--	Teraz do pozycji a la oppo_e			
							--	`TE_oppo` <- `TE_zmpo`
												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "wstaw do `TE_oppo`", '', '', '');
								INSERT IGNORE INTO `TE_oppo` 
								(GUID, IdnOper, GUIDzm, IdnTowr, Ilosc, CenaNet, TypSymbolow, Rodzaj_Przeliczenia, ExtFlags)
									SELECT
										IF(_MODE = 'From.zmng.skaner.NEW',
											CONCAT('WZ', MD5(CONCAT(_IdnOper, tp.GUID))),
											UUID()	--	NEWGUID()
										) AS GUID,
										_IdnOper,
										tp.GUID,
										tp.IdnTowr,
										tr.DoRealizacji,
										tp.CenaNet,
										tp.TypSymbolow,
										tp.Rodzaj_Przeliczenia,
										IF(tp.ExtFlags LIKE '%<Z_ZM_PERMN>%', '<Z_ZM_PERMN>', DEFAULT(tp.ExtFlags))

									FROM `TE_zmpo` tp, `t_zmpo_realizuj` tr, `TE_opng` n, `operdoc` od 
									WHERE
										tr.GUID = tp.GUID
									--	A teraz warunek na magtyp !!!! czyli 
									--	gdy dok. typu Rz to pozycje z zam. tylko o magTyp = 2 a (OO, zlec.prod. rw)  ...
									--	gdy dok. typu Pz to pozycje z zam. tylko o magTyp = 0 (DD zlec. prod. pw)
										AND n.GUID = _IdnOper
										AND od.Rodzaj = n.Rodzaj
									/*	było ...  ale ze wzgl. na Oferty które mają @ht.mtNN musimy przepuscić
										AND od.MagTyp = tp.MagTyp
									*/
										AND tp.MagTyp IN (od.MagTyp, @ht.mtNN)
									ORDER BY tp.LP	
								;			
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "wstaw do `TE_oppo`", '', '', '');

												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "NG->PO", '', '', '');
								CALL C_HT_xxNgPo_DO('NG->PO', 'OP', 'TE', _IdnOper, '', _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
								CALL C_HT_xxNgPo_DO('TowrNg->PO', 'OP', 'TE', _IdnOper, '', _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "NG->PO", '', '', '');
								
												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "UPDATE `TE_oppo` p, `TE_zmpo` z", '', '', '');
							/*	TO.DO grupowanie - na razie komentuje - przeniesione z C_HT_oppo_e.SQL na tabeli oppo_e -> do przerobienia na TE_oppo
							--	grupowanie - przeniesienie grupowania z zmpo do oppo_e
								DROP TEMPORARY TABLE IF EXISTS `t_update_grp_GUID`;
								CREATE TEMPORARY TABLE IF NOT EXISTS `t_update_grp_GUID`
									SELECT
										p.GUID, 
										NULLIF(p.GUID, p.GUID) AS pgrp_GUID,
										p.GUIDzm, 
										zp.grp_GUID, 
										zp.grp_TowrSymb,
										zp.grp_TowrNazwa,
										zp.grp_Jednostka,
										zp.grp_Ilosc
									FROM `oppo_e` p, `zmpo` zp
									WHERE
										TRUE
										AND p.IdnOper = _IdnOper
										AND	zp.GUID = p.GUIDzm
										AND IFNULL(zp.grp_GUID, '') <> ''
								;
											--	SELECT * FROM `t_update_grp_GUID`;
								UPDATE `t_update_grp_GUID` tg, `oppo_e` p
								SET
									tg.pgrp_GUID = p.GUID
								WHERE
									TRUE
									AND p.GUIDzm = tg.grp_GUID
								;
								UPDATE `oppo_e` p, `t_update_grp_GUID` tg
								SET
									p.grp_GUID = tg.pgrp_GUID,
									p.grp_TowrSymb = tg.grp_TowrSymb,
									p.grp_TowrNazwa = tg.grp_TowrNazwa,
									p.grp_Jednostka = tg.grp_Jednostka,
									p.grp_Ilosc = tg.grp_Ilosc
								WHERE
									TRUE
									AND p.GUID = tg.GUID
								;
								IF NOT IFNULL(@session.Delfinek, FALSE) THEN
									DROP TEMPORARY TABLE IF EXISTS `t_update_grp_GUID`;
								END IF;
							--	koniec grupowania
						TO.DO  */	
												
												
							--	Teraz update pozycji szczegolowe
								UPDATE `TE_oppo` p, `TE_zmpo` z
								--	dodałem X 2024
								, `TE_opng` n, `operdoc` od
								SET
									p.Lp = z.Lp,
									p.rabat = IF(@.DEST.Typ_Przepisania_Cen != CZZ_OdNowa,  z.rabat, p.rabat),
									p.idnvat =
										/*	do X 2024
										IF(p.Rodzaj = @ht.CSpFE AND @session.HT.IR.Wymuszaj_zero_stawke_VAT_dla_STFE,
											2,	--	to stawka 0%
											IF(p.Rodzaj IN (@ht.CSTUE, @ht.CZkIm, @ht.CZTUE) AND (z.idnVat != 5),		--	<> od niepodlega
												2,	--	to stawka 0%
												IF(p.Rodzaj IN (@ht.CZkRU),		--	<> od niepodlega
													5,	--	to stawka niepodlega
													IFNULL(NULLIF(z.idnvat, 0), p.idnvat)
												)	
											)	
										),
									... teraz dodałem X 2024 */
										_Get_IdnVat('', 'OP', z.idnVat, p.Rodzaj, n.Rodzaj2, n.RV_Id, od.ZerowaStawkaVat, ''),
									p.usluga = z.usluga,
									p.TypSymbolow = z.TypSymbolow,
									p.towrsymb = z.towrsymb,
									
									p.towrnazwa = z.towrnazwa,
									/*
									p.towrnazwa = 
												-- UstawRokMsc(aSrcPo.FieldByName('towrnazwa').AsString, FNg.FieldByName('DataWystaw').AsDateTime);
											REPLACE(REPLACE(REPLACE(REPLACE(z.towrnazwa, '%WW', _VArStr(@n.MonthNo2)), '%W', _VarStr(@n.MonthLongName)), '%RRRR', _VarStr(@n.YearNo4)), '%RR', _VarStr(@n.YearNo2)),
									*/
									p.uwagi = z.uwagi,
									p.uwagi2 = z.uwagi2,
									p.ilosc_L_do_przeliczen = z.ilosc_L_do_przeliczen,
									p.ilosc_M_do_przeliczen = z.ilosc_M_do_przeliczen,
									p.id_przelicznika = z.id_przelicznika,
									-- p.przelicznik = z.przelicznik,
									-- bylo p.opakowanie_zwrotne = z.opakowanie_zwrotne,
									p.opakowanie_zwrotne = IF(IFNULL(@session.HT.IR.PrzeniesOpakZwZmpoDoOppo, TRUE), z.opakowanie_zwrotne, p.opakowanie_zwrotne),
									
									p.WartnetWal = z.WartnetWal,
									p.OsobaGuid = z.OsobaGuid,
									p.jednostka = z.jednostka,
									p.RecepturaGuid = z.RecepturaGuid,
									p.AreaGUID = z.AreaGUID,
									p.oplata_produktowa = z.oplata_produktowa,
									p.info = z.info,	 -- ????
									p.info2 = z.info2,
									p.info3 = z.info3,
									p.info4 = z.info4,
									p.ilewopakowaniu = z.ilewopakowaniu,
									p.waga = z.waga,
									p.waga_jedn = z.waga_jedn,
									p.spakowano = z.spakowano,
									-- p.RcNgGuid = IF(p.Rodzaj IN (@ht.CZmOO, @ht.CZmEx, @ht.CZmZP, @ht.cZmWE), z.RcNgGuid, p.RcNgGuid), 
									p.RcNgGuid = IF(z.Rodzaj IN (@ht.CZmZP), z.RcNgGuid, p.RcNgGuid), 
									p.GUID_ZmPo_MM = z.GUID,
									p.ExtFlags = CONCAT_WS('', p.ExtFlags, '<from.zmpo>')
								WHERE
									TRUE
									AND p.IdnOper = _IdnOper
									AND	z.GUID = p.GUIDzm
								--	dodałem X 2024
									AND n.GUID = p.IdnOper
									AND od.Rodzaj = n.Rodzaj
								;
							--	towrnazwa uwazgledniajac :  %WW, %W etc	
								UPDATE `TE_oppo` p, `TE_opng` n, `slowniki_pierwotne` s
								SET
									p.towrnazwa = 
												-- UstawRokMsc(aSrcPo.FieldByName('towrnazwa').AsString, FNg.FieldByName('DataWystaw').AsDateTime);
											REPLACE(REPLACE(REPLACE(REPLACE(p.towrnazwa, 
												'%WW', _VarStr(LPAD(MONTH(n.DataWystaw), 2, '0'))), 
												'%W', _VarStr(IFNULL(s.DisplayValue, ''))), 
												'%RRRR', _VarStr(LPAD(YEAR(n.DataWystaw), 4, '0'))), 
												'%RR', _VarStr(LPAD(YEAR(n.DataWystaw) MOD 1000, 2, '0')))
								WHERE
									TRUE
									-- AND p.IdnOper = _IdnOper
									-- AND n.GUID = p.IdnOper
									AND n.GUID = _IdnOper
									AND p.IdnOper = n.GUID
									AND	s.slownik_GUID = 'MIESIACE'
									AND s.Value = MONTH(n.DataWystaw)
								;

								IF (@.DEST.Typ_Przepisania_Cen != CZZ_OdNowa) THEN
									UPDATE `TE_oppo` p, `TE_zmpo` z
									SET
										p.idncennik = p.idncennik,
										p.cenanet = 
											IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 	-- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
												z.cenanet,
												z.cenanet
											),	
										p.cenabrt = 
											IF(p.Rodzaj_Przeliczenia IN (3,4,5,7), 		-- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
												z.cenabrt,
												p.cenabrt
											),
										p.WartNetWal = 
											IF(p.Rodzaj_Przeliczenia IN (1, 2),	 		-- CRodzaj_Przeliczenia_NettoWal_CenaNet, CRodzaj_Przeliczenia_NettoWal_Rabat
												z.WartNetWal,
												p.WartNetWal
											),
										p.WartBrt = 
											IF(p.Rodzaj_Przeliczenia IN (4),	 		-- CRodzaj_Przeliczenia_Brutto_Netto2 
												z.WartBrt,
												p.WartBrt
											)
									WHERE
										TRUE
										AND p.IdnOper = _IdnOper
										AND	z.GUID = p.GUIDzm
									;
								END IF;
								
								IF (@.DEST.Typ_Przepisania_Cen = CZZ_Zamowienie) THEN
									UPDATE `TE_oppo` p, `TE_zmpo` z
									SET
										p.kurs = p.kurs,
										p.cenanet = 
											IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 -- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
												z.cenanet,
												z.cenanet
											),	
										p.cenabrt = 
											IF(p.Rodzaj_Przeliczenia IN (3,4,5,7), 		-- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
												z.cenabrt,
												p.cenabrt
											),
										p.WartNetWal = 
											IF(p.Rodzaj_Przeliczenia IN (1, 2),	 		-- CRodzaj_Przeliczenia_NettoWal_CenaNet, CRodzaj_Przeliczenia_NettoWal_Rabat
												z.WartNetWal,
												p.WartNetWal
											),
										p.WartBrt = 
											IF(p.Rodzaj_Przeliczenia IN (4),	 		-- CRodzaj_Przeliczenia_Brutto_Netto2 
												z.WartBrt,
												p.WartBrt
											)
									WHERE
										TRUE
										AND p.IdnOper = _IdnOper
										AND	z.GUID = p.GUIDzm
									;
								END IF;
								
								IF (@session.globals.Owner = 'PLISZKA') THEN
									UPDATE `TE_oppo` p, `TE_zmpo` z
									SET
										p.kat5 = z.kat5,
										p.kat6 = z.kat6,
										p.kat7 = z.kat7,
										p.kat8 = z.kat8,
										p.kat9 = z.kat9,
										p.ExtFlags = CONCAT_WS('', p.ExtFlags, '<kat.from.zmpo>')
									
									WHERE
										TRUE
										AND p.IdnOper = _IdnOper
										AND	z.GUID = p.GUIDzm
									;
								END IF;
								
								IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
							-- UWAGA !!!!!!!!tu w Delphi jest {$IFDEF PrzepiszKatColeZPozycjiZM}
									UPDATE `TE_oppo` p, `TE_zmpo` z
									SET
										p.kat0 = z.kat0,
										p.kat1 = z.kat1,
										p.kat2 = z.kat2,
										p.kat3 = z.kat3,
										p.kat4 = z.kat4,
										p.kat5 = z.kat5,
										p.kat6 = z.kat6,
										p.kat7 = z.kat7,
										p.kat8 = z.kat8,
										p.kat9 = z.kat9,
										p.ExtFlags = CONCAT_WS('', p.ExtFlags, '<kat.from.zmpo>')
									WHERE
										TRUE
										AND p.IdnOper = _IdnOper
										AND	z.GUID = p.GUIDzm
									;
								END IF;
								
							/* ******************************************************************************************************************************************************************************
								UWAGA na końcu GDY sa PERMANENTNE pozycje - musze wyczyscic je z zawartosci GUIDZm - bo pozycja oppo  nie moze realizowac pozycji zamowienia permanentnego
							****************************************************************************************************************************************************************************** */

								UPDATE `TE_oppo` p, `TE_zmpo` z
								SET
									p.GUIDZm = 
										IF(@session.globals.Owner = 'SECURITY',
											IF(z.permanentne = 1, '', p.GUIDZm), --	to powinno byc powszechne !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
											IF(z.permanentne = 1 OR (p.ExtFlags LIKE '%<Z_ZM_PERMN>%'), '', p.GUIDZm)
										)
								WHERE
									TRUE
									AND p.IdnOper = _IdnOper
									AND	z.GUID = p.GUIDzm
								;
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "UPDATE `TE_oppo` p, `TE_zmpo` z", '', '', '');
								
								
								IF _WORLD = 'M' THEN
								--	3. a na komniec spowrotrm M<-TE (czy z Clear ??????????? - zastanowię się!!!!)
									CALL C_HT_xxNgPo_DO('M.n<-clear<-TE.n', 'OP', '', _IdnOper, '', '', '', '', '', @P);
									CALL C_HT_xxNgPo_DO('M.p<-clear<-TE.p', 'OP', '', _IdnOper, '', '', '', '', '', @P);
								END IF;
								
							/* ******************************************************************************************************************************************************************************
							UWAGA !!!! NOWOSC - NALICZANIE pozycji w `t_oppo_e_insert` takie calc_po ale w temp
							****************************************************************************************************************************************************************************** */
												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "PO.CALC_ROWS", '', '', '');
								CALL C_HT_xxNgPo_DO('PO.CALC_ROWS', 'OP', _WORLD, _IdnOper, '', _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "PO.CALC_ROWS", '', '', '');
												CALL _WatchTimeLogs_Tools('start', "TE.Realizuj", "PO.CALC_LP", '', '', '');
					-- hna razie nie ma zadnego LP 			CALL C_HT_xxNgPo_DO('PO.CALC_LP', 'OP', _WORLD, _IdnOper, '', _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
												CALL _WatchTimeLogs_Tools('stop', "TE.Realizuj", "PO.CALC_LP", '', '', '');
								
						--	!!!!!!!!! DOROBIC  i zdjac FALSE
								IF FALSE AND @.DEST.Typ_Przepisania_Cen = CZZ_OdNowa THEN
									CALL _pozycje_cenyrabat_oppo_e('dla.IdnOper', _IdnOper, FALSE, FALSE, '', '');  	--	dla wszystkich pozycji o IdnOper = _IdnOper
								END IF;
								
								CALL C_HT_OPZM('NG.POST', '', 'OP', _WORLD, _IdnOper, '', '', '', '' ,'', '');
								
						END IF;
						
						IF _MODE LIKE 'adr_link<-%' THEN
						/***************************************************************************************************************************************************
							Inicjowanie/zmiana adresów
						***************************************************************************************************************************************************/
							SET @.SQL.init.v.n = 
							"
							SELECT 
								n.GUID, n.KontrGUID, n.PlatnikGUID, n.AreaGUID, '#R.xxng#' AS IN_ObjTable
							INTO
								@.n.GUID, @.n.KontrGUID, @.n.PlatnikGUID, @.n.AreaGUID, @.IN_ObjTable
							FROM `#xxng#` n
							WHERE 
								n.GUID = #_IdnOper#
							;
							"
							;
							SET @.n.GUID := NULL, @.n.KontrGUID := NULL, @.n.PlatnikGUID := NULL, @.n.AreaGUID := NULL, @.IN_ObjTable := NULL;
							CALL _Cmd_xxNgPo_Tools('EXE.SQL', _FROM, _WORLD, '', _IdnOper, '', '', '', '', '', @.SQL.init.v.n);
							-- SELECT @.n.GUID, @.n.KontrGUID, @.n.PlatnikGUID, @.n.AreaGUID;
							IF _MODE = 'adr_link<-Init' THEN
							--	Usun adresy kontrahenta
								CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'KontrPlatDost', '', '', '', '', 'Only.no.midified', '');
							--	Usun adres platnika
								CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'Plat', '', '', '', '', 'Only.no.midified', '');
							--	Usun adres dostawy kontrahenta
								CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'Dost', '', '', '', '', 'Only.no.midified', '');
								
							--	klonuj adresy kontrahenta
								CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.KontrGUID, 'kontrah', '', '', _IdnOper, @.IN_ObjTable, 'KontrPlatDost', 'Only.no.midified', '');
							--	a gdyby nie bylo w ogole to dodaj pusty	
								CALL geo_int_adr_link_NED('REC.CLONE', 'DEFAULT', '', '', '', '', _IdnOper, @.IN_ObjTable, 'KontrPlatDost', '', '');				
							--	dodaj ewent. adres dostawy kontrahenta
								CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.KontrGUID, 'kontrah_wys', '', '', _IdnOper, @.IN_ObjTable, 'Dost', 'Only.no.midified', '');
								
							--	Adres Platnika o ile rozny od kontrah	
								IF @.n.PlatnikGUID != @.n.KontrGUID THEN
									CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.PlatnikGUID, 'kontrah', '', '', _IdnOper, @.IN_ObjTable, 'Plat', 'Only.no.midified', '');
								END IF;
							--	Adres dostawy	
								IF IFNULL(@.n.AreaGUID, '') != ''  THEN
									CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.AreaGUID, 'erp_area_nodes', '', '', _IdnOper, @.IN_ObjTable, 'Dost', 'Only.no.midified', '');
								ELSE
									CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.KontrGUID, 'kontrah_wys', '', '', _IdnOper, @.IN_ObjTable, 'Dost', 'Only.no.midified', '');
								END IF;
								
							END IF;
							
							IF _MODE = 'adr_link<-RESET.Kontr' THEN
							--	Usun adresy kontrahenta
								CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'KontrPlatDost', '', '', '', '', 'Only.no.midified', '');
								CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.KontrGUID, 'kontrah', '', '', _IdnOper, @.IN_ObjTable, 'KontrPlatDost', 'Only.no.midified', '');
							--	a gdyby nie bylo w ogole to dodaj pusty	
								CALL geo_int_adr_link_NED('REC.CLONE', 'DEFAULT', '', '', '', '', _IdnOper, @.IN_ObjTable, 'KontrPlatDost', '', '');				
							--	Usun adres dostawy kontrahenta
								CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'Dost', '', '', '', '', 'Only.no.midified', '');
								CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.KontrGUID, 'kontrah_wys', '', '', _IdnOper, @.IN_ObjTable, 'Dost', 'Only.no.midified', '');
							END IF;
							
						--	PlatnikGUIDChanged ????	
							IF _MODE = 'adr_link<-RESET.Plat' THEN

								-- IF IFNULL(OLD.PlatnikGUID, '') != ''  THEN
								--	Usun adres platnika
									CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'Plat', '', '', '', '', 'Only.no.midified', '');
								-- END IF;
							--	Adres Platnika o ile rozny od kontrah	
								IF @.n.PlatnikGUID != @.n.KontrGUID THEN
									CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.PlatnikGUID, 'kontrah', '', '', _IdnOper, @.IN_ObjTable, 'Plat', 'Only.no.midified', '');
								END IF;
							END IF;
						--	AreaGUIDChanged ????	
							IF _MODE = 'adr_link<-RESET.Dost' THEN
								-- IF IFNULL(OLD.AreaGUID, '') != ''  THEN
								--	Usun adres dostawy
									CALL geo_int_adr_link_NED('REC.DELETE', '', _IdnOper, @.IN_ObjTable, 'Dost', '', '', '', '', 'Only.no.midified', '');
								-- END IF;
								
								
							--	Adres dostawy	
								IF IFNULL(@.n.AreaGUID, '') != ''  THEN
									CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.AreaGUID, 'erp_area_nodes', '', '', _IdnOper, @.IN_ObjTable, 'Dost', 'Only.no.midified', '');
								ELSE
									CALL geo_int_adr_link_NED('REC.CLONE', '', @.n.KontrGUID, 'kontrah_wys', '', '', _IdnOper, @.IN_ObjTable, 'Dost', 'Only.no.midified', '');
								END IF;
								/*
								IF IFNULL(NEW.AreaGUID, '') != ''  THEN
									CALL geo_int_adr_link_NED('REC.CLONE', '', NEW.AreaGUID, 'erp_area_nodes,kontrah', '', '', NEW.GUID, 'zmng', 'Dost', 'Only.no.midified', '');
								ELSE
									CALL geo_int_adr_link_NED('REC.CLONE', '', NEW.KontrGUID, 'kontrah_wys', '', '', NEW.GUID, 'zmng', 'Dost', 'Only.no.midified', '');
								END IF;
								*/
							END IF;
						END IF;
						
						
	
		IF _MODE LIKE 'INSERT.START%' THEN
		/*******************************************************
			START NOWY - inicjacja pozycji OP i ZM
		*******************************************************/
			IF _MODE = 'INSERT.START.begin' THEN
			/*******************************************************
				START.begin start wstepny inicjalny OP i ZM w INSERT
			*******************************************************/
			--	Czy Realizacja zamowien, zlecen, etc ??????????????
				IF _FROM = 'OP' AND @.OPZM.IN_MODE LIKE 'Realizacja.ZM.%' THEN
				/*******************************************************
					Realizacja zamowien, zlecen, etc
				*******************************************************/
					SET _ZM_Key = @.OPZM.INPUT_Key;	--	IdnNg realizowanego zamowienia
					DROP TEMPORARY TABLE IF EXISTS `TE_ng_e_rec_ZM_2_OP`;
					CREATE TEMPORARY TABLE IF NOT EXISTS `TE_ng_e_rec_ZM_2_OP`
						SELECT
							_IdnOper AS _IdnOper,
							_ZM_Key AS _ZM_Key,
							@.OPZM.IN_Params AS _Param_E,
							
							IFNULL(@.DEST.Rodzaj, -1) AS Rodzaj,
							IFNULL(@.DEST.Rodzaj_typ, 0) AS Rodzaj_typ,
							
							IF(@.OPZM.IN_MODE IN ('Realizacja.ZM.cTRANS_MM_FROMZamowienia', 'Realizacja.ZM.cTRANS_WZFVTemp_FROMZamowienia'),
								z.idnmagazyn,	-- wtedy zawsze
								IFNULL(@.DEST.zmagazynu, -1)
							) AS ZMagazynu,
							
							IF(@.OPZM.IN_MODE IN ('Realizacja.ZM.cTRANS_MM_FROMZamowienia', 'Realizacja.ZM.cTRANS_WZFVTemp_FROMZamowienia'),
								z.magazynwys,	-- wtedy zawsze
								IFNULL(@.DEST.domagazynu, -1)
							) AS DoMagazynu,
							
							IFNULL(@.DEST.Waluta, z.Waluta) AS Waluta,
							IF(@.OPZM.IN_MODE = 'Realizacja.ZM.cTRANS_WZFVTemp_FROMZamowienia',
								1,	 -- wtedy zawsze
								IFNULL(@.DEST.Tymczasowa, 0)
							) AS Tymczasowa,
							-- IF(IFNULL(@.DEST.Waluta, -1) >= 0, @.DEST.Waluta, z.Waluta)  AS Waluta,
							
							z.rodzaj AS ZM_rodzaj, 
							z.rodzaj2 AS ZM_rodzaj2, 
							IFNULL(@.DEST.terminrealizacji, z.terminrealizacji) AS TerminRealizacji,
							z.terminrealizacji AS ZM_TerminRealizacji,
							z.KontrGUID AS KontrGUID, 
							z.osobaGUID AS OsobaGUID, 
							IFNULL(@.DEST.z.AkwizytorGUID, z.AkwizytorGUID) AS AkwizytorGUID, 
							z.PlatnikGUID AS PlatnikGUID, 
							z.AreaGUID AS AreaGUID, 
							z.WyjazdGUID,
							z.idnmagazyn AS zm_idnmagazyn, 
							IF(z.magazynwys > 0, z.magazynwys, idnmagazyn) AS zm_magazynwys, 
							z.zamwpermn AS ZM_zamwpermn,
							IFNULL((SELECT p.MagTyp FROM `zmpo` p WHERE p.IdnNG = z.GUID LIMIT 1), @ht.mtNN) AS zm_MagTyp

						FROM `zmng` z
						WHERE
							z.GUID = _ZM_Key
					;
					UPDATE `TE_ng_e_rec_ZM_2_OP` t
					SET
						t.Rodzaj = 
							IF(@.OPZM.IN_MODE = 'Realizacja.ZM.cTRANS_MM_FROMZamowienia',
								@ht.CMMMM,	 -- wtedy zawsze
								IF(@.OPZM.IN_MODE = 'Realizacja.ZM.cTRANS_WZFVTemp_FROMZamowienia',
									@ht.CSpFV,	-- wtedy zawsze
									IF(t.zm_rodzaj IN (@ht.CZMWE),
										@ht.CMMMM,
										IF(@.OPZM.IN_MODE = 'Realizacja.ZM.ZLEC',
											@.DEST.Rodzaj,
											IF(@.OPZM.IN_MODE = 'Realizacja.ZM.ZLEC.RW',
												@ht.CRzRW,
												IF(@.OPZM.IN_MODE = 'Realizacja.ZM.ZLEC.PW',
													@ht.CPzPW,
													-- i jeszcze dla RW/PW - ale to wg mnie gluota
													IF(t.zm_rodzaj IN (@ht.CZmZP),
														IF(zm_MagTyp = @ht.mtRZ, @ht.CRzRW, @ht.CPzPW),
														IF(t.zm_rodzaj IN (@ht.CZmDD, @ht.CZmIm),
															IF(t.Rodzaj IN (@ht.CZkFV, @ht.CPzPZ, @ht.CZkIm, @ht.CZTUE), t.Rodzaj, @ht.CZkFV),
															IF(t.Rodzaj < 0, t.zm_rodzaj2, t.Rodzaj)
														)
													)
												)
											)
										)
									)
								)
							),
						t.ZMagazynu = 
							IF(t.ZMagazynu >= 0,
								t.ZMagazynu,
								IF(t.zm_rodzaj IN (@ht.CZMWE),
									t.zm_idnmagazyn,
									IF(t.zm_rodzaj IN (@ht.CZmDD, @ht.CZmIm),
										0,
										IF(t.zm_rodzaj IN (@ht.CZmZP),
											IF(t.zm_MagTyp = @ht.mtRZ, t.zm_idnmagazyn, 0),
											IF(t.zm_MagTyp = @ht.mtRZ, t.zm_magazynwys, IF(t.zm_MagTyp = @ht.mtMM, t.zm_idnmagazyn, 0))
										)
									)
								)
							),
						
						t.DoMagazynu = 
							IF(t.DoMagazynu >= 0,
								t.DoMagazynu,
								IF(t.zm_rodzaj IN (@ht.CZMWE),
									t.zm_magazynwys,
									IF(t.zm_rodzaj IN (@ht.CZmDD, @ht.CZmIm),
										t.zm_magazynwys,
										IF(t.zm_rodzaj IN (@ht.CZmZP),
											IF(t.zm_MagTyp = @ht.mtRZ, 0, t.zm_magazynwys),
											IF(t.zm_MagTyp = @ht.mtPZ, t.zm_magazynwys, IF(t.zm_MagTyp = @ht.mtMM, t.zm_magazynwys, 0))
										)
									)
								)
							)
						
					;
				--	Powrotka -> do zmiennych	
				--	UWAGA DataWystaw!!!!!!!!!!!!!! 
				--	istnieje cos takiego jak wymuszona datawystaw ze zmiennej @.DEST.datawystaw 
				--	i to ona obowiazuje ale NIE dla PLISZKI i SECURITY!!!
					SET @.DEST.datawystaw  = IF(@session.globals.Owner IN ('SECURITY', 'PLISZKA'), NULL, @.DEST.datawystaw);
					SELECT
						t.Rodzaj, t.Rodzaj_Typ, 
						t.ZMagazynu, t.DoMagazynu,
					--	DataWystaw ... powazna sprawa :)  -> patrz funkcja `_Get_Default_DataWystaw_Realizacji_ZM`
						IFNULL(
							@.DEST.datawystaw,
							_Get_Default_DataWystaw_Realizacji_ZM('', t.Rodzaj, t.ZM_rodzaj, t.ZM_zamwpermn, t.ZM_TerminRealizacji)
						) AS datawystaw,
						
						t.Tymczasowa,
						t.KontrGUID, t.PlatnikGUID, t.AkwizytorGUID, t.AreaGUID,
						t.Waluta,
						IFNULL(@.DEST.WyjazdGUID, t.WyjazdGUID) AS WyjazdGUID,
						IFNULL(@.DEST.Typ_Przepisania_Cen, 0) AS Typ_Przepisania_Cen	--	UWAGA trzeba to jakos ujednolicic
					INTO
						@.DEST.Rodzaj, @.DEST.Rodzaj_Typ,
						@.DEST.ZMagazynu, @.DEST.DoMagazynu,
						@.DEST.datawystaw,
						@.DEST.Tymczasowa,
						@.DEST.KontrGUID, @.DEST.PlatnikGUID, @.DEST.AkwizytorGUID, @.DEST.AreaGUID,
						@.DEST.Waluta,
						@.DEST.WyjazdGUID,
						@.DEST.Typ_Przepisania_Cen
					FROM `TE_ng_e_rec_ZM_2_OP` t
					;
				--	DataWplywu rowniez czyli z @ht.Init_doc_date	
				--	teraz moge tworzyc
					
				END IF;
			set @jmam = '1';
				IF _FROM = 'OP' AND @.OPZM.IN_MODE LIKE 'Korekta.Do.%' THEN
				/*******************************************************
					Tworzenie korekty
				*******************************************************/
					IF @.OPZM.IN_MODE = 'Korekta.Do.`t_oppo_corr_init_bi`' THEN
						SET @t_oppo_corr_init_bi.GUID = NULL;
						SELECT 
							GUID_Orig
						INTO
							@t_oppo_corr_init_bi.GUID
						FROM `t_oppo_corr_init_bi` 
						LIMIT 1 
						;
						IF @t_oppo_corr_init_bi.GUID IS NOT NULL THEN
							SELECT p.IDNOper AS GUID INTO @.IdnOper.Orig FROM `oppo` p WHERE p.GUID = @t_oppo_corr_init_bi.GUID LIMIT 1;
						ELSE
							SET @.IdnOper.Orig = NULL;
						END IF;
					ELSE
						SET @.IdnOper.Orig = @.OPZM.INPUT_Key;
					END IF;
					
					IF IFNULL(@.IdnOper.Orig, '') = '' THEN LEAVE SC_HT_OPZM; END IF;
					
				--	Powrotka -> do zmiennych	
				--	Uwaga ustaw zawsze magazyny z pozycji oryginalu
					SELECT 
						p.Domagazynu, 	--	tu na odwrot
						p.Zmagazynu 	--	tu tez na odwrot
					INTO
						@.DEST.ZMagazynu, @.DEST.DoMagazynu
					FROM `oppo` p
					WHERE
						p.IdnOperFin = @.IdnOper.Orig
					LIMIT 1
					;
				
					SELECT
						-- ??? t.Rodzaj, t.Rodzaj_Typ, 
						@.DEST.Rodzaj, @.DEST.Rodzaj_Typ, 
						-- ??? n.Tymczasowa,
						@.DEST.Tymczasowa,
						n.KontrGUID, n.PlatnikGUID, n.AkwizytorGUID, n.AreaGUID,
						IFNULL(@.DEST.Typ_Przepisania_Cen, 0) AS Typ_Przepisania_Cen,	--	UWAGA trzeba to jakos ujednolicic
						n.Waluta
					INTO
						@.DEST.Rodzaj, @.DEST.Rodzaj_Typ,
						@.DEST.Tymczasowa,
						@.DEST.KontrGUID, @.DEST.PlatnikGUID, @.DEST.AkwizytorGUID, @.DEST.AreaGUID,
						@.DEST.Typ_Przepisania_Cen,
						@.DEST.Waluta
					FROM `opng` n
					WHERE
						n.GUID = @.IdnOper.Orig
					;
					
				END IF;	--	Tworzenie korekty
				
			ELSEIF _MODE = 'INSERT.START.NG' THEN
			/**************************************************************************************************************************
				START.NG start naglowka OP i ZM w INSERT
				Zmienne sterujące od teraz (2020-12-22 trzymamy w @.OPZM.ON.START....
				Istnienie nagłowek w R (dawna zmienna @.OPZM.N.Exists jest też ustawiana dla kompatybilność - jest używana w innych miejscach
					@.OPZM.ON.START.Ng.R.Existed
				Instnieje nagłowek w `TE_xxng`, `xxng_m`, `xxng_e`
					@.OPZM.ON.START.Ng.world.Existed	
				Zmienna sterująca która zabrania zmian nagłówka gdy rekord juz jest w `TE_xxng`, `xxng_m`, `xxng_e` (@.OPZM.ON.START.Ng.world.Existed = 1)
					@.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear
					zmienna dotyczy sytuacji gdy @.OPZM.ON.START.Ng.world.Existed = TRUE czyli jest tam rekord (może zerwało połaczenie) teraz...
					badamy czy programista nie ustawił @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear na TRUE? 
					A jeśli nie to do @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear wstaw False zamiast NULL
					UWAGA ponizsza zmienna ustawiana jest na zewnatrz przez programistę i kasowana na NULL po INIT - zatem programista zawsze musi 
					ja ustawiac jeśli chce zachowania to co jest w destynacyjnej tabeli np `zmng_m`
					UWAGA gdy @.OPZM.ON.START.Ng.world.Existed = FALSE  ta zmienna tez ustawiana jest na FALSE
			**************************************************************************************************************************/
			--	WSTEP - sprawdz czy juz nie istnieje taki dokument
			--	czy istnieje w R ? -> zmienne od teraz (2020-12-22 trzymamy w @.OPZM.ON.START....
				SET @.SQL.OPZM.ON.START.Ng.R.Existed = "SET @.OPZM.ON.START.Ng.R.Existed = EXISTS(SELECT n.* FROM `#REAL.xxng#` n WHERE n.GUID = #_IdnOper#);";
				CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.ON.START.Ng.R.Existed);
			--	dawna zmienna @.OPZM.N.Exists jest też ustawiana dla kompatybilność - jest używana w innych miejscach	
				SET @.OPZM.N.Exists = @.OPZM.ON.START.Ng.R.Existed;
				IF @.OPZM.ON.START.Ng.R.Existed THEN
			--	instnieje nagłowek w R	
				--	Ustaw zmienna dot. `TE_xxng`, `xxng_m`, `xxng_e` na FALSE
					SET @.OPZM.ON.START.Ng.world.Existed = FALSE;
					SET @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear = FALSE;
				ELSE
			--	nie instnieje nagłowek w R 
				--	sprawdz czy instnieje nagłowek w `TE_xxng`, `xxng_m`, `xxng_e`
					SET @.SQL.OPZM.ON.START.Ng.world.Existed = "SET @.OPZM.ON.START.Ng.world.Existed = EXISTS(SELECT n.* FROM `#xxng#` n WHERE n.GUID = #_IdnOper#);";
					CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.ON.START.Ng.world.Existed);
					SET @.OPZM.ON.START.Ng.world.Existed = IFNULL(@.OPZM.ON.START.Ng.world.Existed, FALSE);
				--	ustaw zmienna decydujaca czy mozna zmieniac isniejący nagłowek w w `TE_xxng`, `xxng_m`, `xxng_e` 
				--	nawet jeśli programista ustawił @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear na TRUE to gdy 
				--	@.OPZM.ON.START.Ng.world.Existed = FALSE ta zmienna tez musi byc FALSE (oczywistość)
					SET 
						@.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear = 
							IFNULL(@.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear, FALSE) -- ustawienie programisty lub FALSE gdy NULL
							AND 
							@.OPZM.ON.START.Ng.world.Existed		--	ale musi  istnieć w `TE_xxng`, `xxng_m`, `xxng_e` 
					;
				END IF;
			/*
				wyłączone
				SET @.SQL.OPZM.N.Exists = "SET @.OPZM.N.Exists = EXISTS(SELECT n.* FROM `#REAL.xxng#` n WHERE n.GUID = #_IdnOper#);";
				CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.N.Exists);
			--	czy istnieje w TE/M/ etc ?
				SET @.SQL.OPZM.N.Dest.Exists = "SET @.OPZM.N.Dest.Exists = EXISTS(SELECT n.* FROM `#xxng#` n WHERE n.GUID = #_IdnOper#);";
				CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.N.Dest.Exists);
				SET @.OPZM.N.Dest.Exists = IFNULL(@.OPZM.N.Dest.Exists, FALSE);
			--	Co jak juz istnieje np. w `xxng_m` ? - wstaw do @.OPZM.N.Dest.Exists 1 gdy w destynacyjnej tabeli istnieje rekord (np w `xxng_m`)
			--	Teraz w @.OPZM.N.Dest.Exists mamy 0: jest czysto albo 1: jest tam rekord (może zerwało połaczenie) teraz...
			--	badamy czy programista nie ustawił @.OPZM.ON.START.If.N.Dest.Exists.Then.Keep.No.Clear ? A jeśli nie to do 
			--	@.OPZM.ON.START.If.N.Dest.Exists.Then.Keep.No.Clear wstaw False (Gdy jest TRUE to dodatkowo zrob koniunkcję z @.OPZM.N.Dest.Exists)
			--	UWAGA tę flagę @.OPZM.ON.START.If.N.Dest.Exists.Then.Keep.No.Clear czyścimyna NULL zaraz po inicjacji - zatem programista zawsze musi 
			--	ja ustawiac jeśli chce zachowania to co jest w destynacyjnej tabeli np `zmng_m`
				SET @.OPZM.ON.START.If.N.Dest.Exists.Then.Keep.No.Clear = IFNULL(@.OPZM.ON.START.If.N.Dest.Exists.Then.Keep.No.Clear, FALSE) AND @.OPZM.N.Dest.Exists;
			*/	
			--	ale najpierw user z sesji może być potrzebny
			--	przepisany z poniżej 
					SET @.DEST.CreatorGUID = IFNULL(NULLIF(@.DEST.CreatorGUID, ''), @session.INFO.User_GUID);
					IF IFNULL(@.DEST.CreatorGUID, '') = '' AND NULLIF(@SYSTEM.Client.Session.GUID, '') IS NOT NULL THEN
						-- CALL _sys_authorization('SESSION.SETUP.VAR', '', '', '', '', '', 'GO');
						CALL _sessions_APP('SET.VAR', @SYSTEM.Client.Session.GUID, '', '', '', '', '');	--	pobiera wartosci do małp
						SET @.DEST.CreatorGUID = @SYSTEM.Client.Session.log_USER_GUID; -- to samo co @session.INFO.User_GUID;
					END IF;
					IF IFNULL(@.DEST.CreatorGUID, '') = '' THEN
						-- CALL _sys_db_logons_rec_tools('CHECK.Log.Ver', '', 0, '1', '', '', '', '');	--	pobiera wartosci do małp
						CALL _sessions_APP('SET.VAR', @SYSTEM.Client.Session.GUID, '', '', '', '', '');	--	pobiera wartosci do małp
						SET @.DEST.CreatorGUID = @session.INFO.User_GUID;
					END IF;
					SET @.DEST.idnuser = IFNULL(NULLIF(@.DEST.idnuser, ''), @session.INFO.User_Login);
					IF _WORLD = 'TE' AND _FROM = 'OP'AND @session.globals.Owner IN ('JARZEBINSCY') THEN
						SET @.l.Log_ID = 'TE.INSERT.START.NG', @.l.Key = _IdnOper;
						SET @.CreatorGUID.TE = (SELECT n.CreatorGUID FROM `TE_opng` n WHERE n.GUID = _IdnOper);
						SET @.CreatorGUID.R = (SELECT n.CreatorGUID FROM `opng` n WHERE n.GUID = _IdnOper);
						SET @.logInf = CONCAT_WS(', ',
							CONCAT_WS('=', '@.DEST.CreatorGUID', IFNULL(@.DEST.CreatorGUID, '""')),
							CONCAT_WS('=', '@.scSG', IFNULL(@SYSTEM.Client.Session.GUID, '""')),
							CONCAT_WS('=', '@.scSUG', IFNULL(@SYSTEM.Client.Session.log_USER_GUID, '""')),
							CONCAT_WS('=', '@.si.User_GUID', IFNULL(@session.INFO.User_GUID, '""')),
							CONCAT_WS('=', 'CreatorGUID.TE', IFNULL(@.CreatorGUID.TE, '""')),
							CONCAT_WS('=', 'CreatorGUID.R', IFNULL(@.CreatorGUID.R, '""')),
							NULL
						);
						CALL _sys_app_logtxt('LOG.Session.Add', NULL, @.l.Log_ID, '', '', '', '', @.l.Key, 
							@.logInf
						);
					END IF;
			
			--	Gdy istnieje w R ...
				-- była zmienna IF @.OPZM.N.Exists THEN -- Uwaga ta zmienna jest też ustawiana dla kompatybilność - jest używana w innych miejscach
				IF @.OPZM.ON.START.Ng.R.Existed THEN 
				--	Wstawiamy cos co istnieje!!! .. zatem ...
				--	Wstaw istniejacy naglowek do TE.xxng
					CALL C_HT_xxNgPo_DO('R.n->clear->.n', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
					-- CALL C_HT_OPZM('N.xxng->TE.xxng', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				ELSE
				--	NOWY REKORD!!!	
					-- w @.DEST.CreatorGUID mamy kreatora lub NULL
					SET @.DEST.CreatorGUID = IFNULL(NULLIF(@.DEST.CreatorGUID, ''), @session.INFO.User_GUID);
					IF IFNULL(@.DEST.CreatorGUID, '') = '' AND NULLIF(@SYSTEM.Client.Session.GUID, '') IS NOT NULL THEN
						-- CALL _sys_authorization('SESSION.SETUP.VAR', '', '', '', '', '', 'GO');
						CALL _sessions_APP('SET.VAR.?', @SYSTEM.Client.Session.GUID, '', '', '', '', '');	--	pobiera wartosci do małp
						SET @.DEST.CreatorGUID = @SYSTEM.Client.Session.log_USER_GUID; -- to samo co @session.INFO.User_GUID;
					END IF;
					IF IFNULL(@.DEST.CreatorGUID, '') = '' THEN
						-- CALL _sys_db_logons_rec_tools('CHECK.Log.Ver', '', 0, '1', '', '', '', '');	--	pobiera wartosci do małp
						CALL _sessions_APP('SET.VAR.?', @SYSTEM.Client.Session.GUID, '', '', '', '', '');	--	pobiera wartosci do małp
						SET @.DEST.CreatorGUID = @session.INFO.User_GUID;
					END IF;
					SET @.DEST.idnuser = IFNULL(NULLIF(@.DEST.idnuser, ''), @session.INFO.User_Login);
					
					IF 
				--	Nie zmieniaj JEDNAK naglowka juz istniejacego w `TE_xxng`, `xxng_m`, `xxng_e` gdy sobie tego nie życzę!!!!
					NOT @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear
					THEN
						SET @.SQL.OPZM.N.NEW = 
						"
						REPLACE `#xxng#` 
						SET 
							GUID = #_IdnOper#, 
							-- bylo CreatorGUID = @session.INFO.User_GUID,
							CreatorGUID = @.DEST.CreatorGUID,
							-- bylo idnuser = IFNULL(@session.INFO.User_Login, '')
							idnuser = IFNULL(@.DEST.idnuser, '')
						;
						"
						;
						CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.N.NEW);
					END IF;
				END IF;
				
				/*******************************************************
					Wstawianie zmiennych inicjalnych do naglowka OP i ZM
				*******************************************************/
			--	Nie zmieniaj JEDNAK naglowka GDY 
				IF 
				--	juz istnieje w R i właśnie wczytaliśmy go
					-- było NOT @.OPZM.N.Exists -- Uwaga ta zmienna jest też ustawiana dla kompatybilność - jest używana w innych miejscach
					NOT @.OPZM.ON.START.Ng.R.Existed
					AND
				--	juz istniejacego w destynacyjnej tabeli gdy sobie tego nie życzę	!!!!
					NOT @.OPZM.ON.START.If.Ng.world.Existed.Then.Keep.No.Clear
					AND 
				--	jest podstawa do zmian czyli rodzaj lub zestaw parametrów
					(IFNULL(@.DEST.Rodzaj, '') <> '' OR IFNULL(@.OPZM.IN_Params, '') <> '') 
				THEN
					CALL C_HT_xxNgPo_DO('NG<-@.Params.I', _FROM, @.My.WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
					SET @.SQL.OPZM.N.INIT = @.SQL.N.INIT;
					
					CALL C_HT_xxNgPo_DO('NG<-operdoc', _FROM, @.My.WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
					CALL C_HT_xxNgPo_DO('NG<-@.Params.II', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
					
					IF @.DEST.Rodzaj IS NOT NULL OR IFNULL(@.DEST.KontrGUID, '') != '' THEN
									set @xyz = '1';

						-- CALL C_HT_OPZM('NG<-DEFAULT', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						CALL C_HT_xxNgPo_DO('NG<-DEFAULT', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
									set @xyz = '2.3';
					END IF;
						
				END IF;
	
			--	Czy Realizacja zamowien, zlecen, etc ??????????????
				IF 
					_FROM = 'OP' 
					AND 
					-- było NOT @.OPZM.N.Exists -- Uwaga ta zmienna jest też ustawiana dla kompatybilność - jest używana w innych miejscach
					NOT @.OPZM.ON.START.Ng.R.Existed
					AND 
					@.OPZM.IN_MODE LIKE 'Realizacja.ZM.%' 
				THEN
				/*******************************************************
					Realizacja zamowien, zlecen, etc
					NAGLOWEK po Insercie - tylko OP
				*******************************************************/
					SET _ZM_Key = @.OPZM.INPUT_Key;	--	IdnNg realizowanego zamowienia
					CALL C_HT_xxNgPo_DO('SPEC.Realizacja.ZM.Init.Ng', _FROM, _WORLD, _IdnOper, _ZM_Key, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
					/*
					zamiast...
					--	Temp z zamowienie.zlecenie
						DROP TEMPORARY TABLE IF EXISTS `t_zmng_ZAM_Realizowane`;
						CREATE TEMPORARY TABLE `t_zmng_ZAM_Realizowane` SELECT * FROM `zmng` WHERE GUID = _ZM_Key;
					--	Adresacja!!!
						CALL ht_clone_tools('CLONE.ADDR', _ZM_Key, _IdnOper, 'zmng', 'opng', 'CLEAR.before'); -- Realizacja ZAM
					--	Ogólny Update z zamowienia
						UPDATE `TE_opng` n, `t_zmng_ZAM_Realizowane` z
						SET
							n.datasprzed = n.datawystaw,
							n.datawplywu = n.datawystaw,
						
							n.Rodzaj2 = IF(n.Rodzaj = @ht.CRzWZ, 1, n.Rodzaj2),
							-- ????????
							n.PlatnikGUID = IF(IFNULL(z.PlatnikGUID, '') = '', n.PlatnikGUID, z.PlatnikGUID),
							n.AkwizytorGUID = IFNULL(n.AkwizytorGUID, z.AkwizytorGUID),
							n.ZlecenieGUID = z.ZlecenieGUID,
							n.wyjazdGUID = IF(IFNULL(n.wyjazdGUID, '') != '', n.wyjazdGUID, z.wyjazdGUID),
							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
									IF(@session.globals.Owner = 'SECURITY',
										DATE(_Get_Next_Prev_Working_Day('NewDoc', z.terminrealizacji, -3)),
									-- 	bylo _Get_Next_WorkDay(z.terminrealizacji),
										DATE(_Get_Next_Prev_Working_Day(NULL, z.terminrealizacji, NULL))
									),
									IF(@session.globals.Owner = 'SECURITY',
										DATE(_Get_Next_Prev_Working_Day('NewDoc', z.terminrealizacji, -3)),
										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
								),
							n.opis = IF(n.guid LIKE 'WZ_z_PPT_%', 'z PPT', n.opis)
						WHERE
							n.GUID = _IdnOper
							AND
							z.GUID = _ZM_Key
						;	
					--	katcol-e	
						IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
							UPDATE `TE_opng` 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 = _IdnOper
								AND
								z.GUID = _ZM_Key
							;	
						END IF;
					--	Mam juz KontrGUID i Platnik oraz sposoby platnosci i inne  z ZAMOWIENIA - zatem ...
					--	ustaw to co z Platnika i ...
						CALL C_HT_xxNgPo_DO('NG<-platnik', _FROM, 'n:TE;p:TE', _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
					--	ustaw reszte parametrow
						CALL C_HT_xxNgPo_DO('NG<-Set.Other', _FROM, 'n:TE;p:TE', _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
						
				*/		
					
				END IF;
				
				IF _FROM = 'OP' AND @.OPZM.IN_MODE LIKE 'Korekta.Do.%' THEN
				/*******************************************************
					Tworzenie korekty
				*******************************************************/
				--	w @.OPZM.INPUT_Key GUID korygowanego dok.
					SET @.OPZM.INPUT_Key.2 = @.OPZM.INPUT_Key, @IN = CONCAT('SPEC.', @.OPZM.IN_MODE);
					CALL C_HT_xxNgPo_DO(CONCAT('SPEC.', @.OPZM.IN_MODE), _FROM, _WORLD, _IdnOper, @.OPZM.INPUT_Key, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
					
				END IF;
				
			ELSEIF _MODE = 'INSERT.START.PO' THEN
			/*******************************************************
				START.PO start pozycji w INSERT
			*******************************************************/
				-- była zmienna IF @.OPZM.N.Exists THEN -- Uwaga ta zmienna jest też ustawiana dla kompatybilność - jest używana w innych miejscach
				IF @.OPZM.ON.START.Ng.R.Existed THEN 
			--	Wstaw/zamien pozycje
					CALL C_HT_xxNgPo_DO('R.p->.p', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
				-- 	bylo CALL C_HT_OPZM('N.xxpo->TE.xxpo', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
					IF _FROM = 'OP' THEN
					--	I jeszcze korekty
						CALL C_HT_xxNgPo_DO('R.corr->.corr', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
						-- bylo CALL C_HT_OPZM('N.xxpo_corr->TE.xxpo_corr', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
					END IF;
				END IF;
				
			--	Czy Realizacja zamowien, zlecen, etc ??????????????
				IF _FROM = 'OP' AND @.OPZM.IN_MODE LIKE 'Realizacja.ZM.%' THEN
				/*******************************************************
					Realizacja zamowien, zlecen, etc
					POZYCJE z zamowien - tylko OP
				*******************************************************/
					SET _ZM_Key = @.OPZM.INPUT_Key;	--	IdnNg realizowanego zamowienia
					CALL C_HT_OPZM('PO<-Realizacja.ZM', 'Realizacja.ZM.From.zmng', 'OP', _WORLD, _IdnOper, _ZM_Key, NULL, '', '', '', _Param_E);
						
				END IF;

				IF _FROM = 'OP' AND @.OPZM.IN_MODE LIKE 'Korekta.Do.%' THEN
				/*******************************************************
					Tworzenie korekty
				*******************************************************/
					SET @.IdnOper.Orig = @.OPZM.INPUT_Key;
					set @.IdnOper.Orig.X = @.OPZM.INPUT_Key;

					CALL C_HT_xxNgPo_Corr('E.`#oppo_corr#`.RESET', _FROM, _WORLD, _IdnOper, '', '', '', '', '', '');		
				END IF;
				
			ELSEIF _MODE = 'INSERT.START.end' THEN
			/*******************************************************
				START.end start koncowy w INSERT
			*******************************************************/
				set @xyz = '';
			END IF;
		END IF;

		
		IF _MODE LIKE 'EDIT.START%' THEN
		-- IF @.OPZM.OPER = 'EDIT' THEN
		/*******************************************************
			START EDYCJA - inicjacja pozycji OP i ZM
		*******************************************************/
			IF _MODE = 'EDIT.START.begin' THEN
				set @xyz = '1';
			ELSEIF _MODE = 'EDIT.START.NG' THEN
			--	Wstaw/zamien naglowek
				set @xyz = '1.sdfasdf';
				set @.EDIT.START.NG = '1';
				CALL C_HT_xxNgPo_DO('R.n->clear->.n', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @SQL.x);
				SET @.EDIT.START.NG._SQLText = @SQL.x;
				-- CALL C_HT_OPZM('N.xxng->TE.xxng', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			ELSEIF _MODE = 'EDIT.START.PO' THEN
			--	Wstaw/zamien pozycje
				set @.EDIT.START.PO = '1';
				CALL C_HT_xxNgPo_DO('R.p->.p', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				SET @.EDIT.START.PO._SQLText = _SQLText;
			-- 	bylo CALL C_HT_OPZM('N.xxpo->TE.xxpo', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				IF _FROM = 'OP' THEN
				--	I jeszcze korekty
					CALL C_HT_xxNgPo_DO('R.corr->.corr', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
					-- bylo CALL C_HT_OPZM('N.xxpo_corr->TE.xxpo_corr', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				END IF;
			ELSEIF _MODE = 'EDIT.START.end' THEN
			--	Wstaw/zamien inne np VAT
				CALL C_HT_xxNgPo_DO('R.vat->.vat', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			--	bylo CALL C_HT_OPZM('N.xxng_vat->TE.xxng_vat', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			END IF;
		END IF;
	
	
	IF 
	_MODE LIKE 'APPLY%' 
	OR
	_MODE LIKE 'MOVE.TO.E%'
	THEN
	OPZM_Apply: BEGIN
	/* ************************************************************************************************************************************************************************
		APPLY oraz MOVE.TO.E
		APPLY ma wersję nową i starą - nowa w paramsach ma >= <APPLY.ver.2022>
		UWAGA od sty 2022 zwraca (raczej ustawia zmienną)
			@.OPZM.APPLY.Result na 'OK'/'FAIL'
	************************************************************************************************************************************************************************ */	
		
		SET 
			@Params = _Param_E,
			@.IS.APPLY = (_MODE LIKE 'APPLY%' )
		; 
		IF @.IS.APPLY THEN
								SET @.debug.OPZM = 'xxx.APPLY';		
				--	LOG na jakis czas (brak CreatorGUID)						
					IF _WORLD = 'TE' AND _FROM = 'OP'AND @session.globals.Owner IN ('JARZEBINSCY') THEN
						SET @.l.Log_ID = 'TE.APPLY.Start', @.l.Key = _IdnOper;
						SET @.CreatorGUID.TE = (SELECT n.CreatorGUID FROM `TE_opng` n WHERE n.GUID = _IdnOper);
						SET @.CreatorGUID.R = (SELECT n.CreatorGUID FROM `opng` n WHERE n.GUID = _IdnOper);
						SET @.logInf = CONCAT_WS(', ',
							CONCAT_WS('=', '@.DEST.CreatorGUID', IFNULL(@.DEST.CreatorGUID, '""')),
							CONCAT_WS('=', '@.scSG', IFNULL(@SYSTEM.Client.Session.GUID, '""')),
							CONCAT_WS('=', '@.scSUG', IFNULL(@SYSTEM.Client.Session.log_USER_GUID, '""')),
							CONCAT_WS('=', '@.si.User_GUID', IFNULL(@session.INFO.User_GUID, '""')),
							CONCAT_WS('=', 'CreatorGUID.TE', IFNULL(@.CreatorGUID.TE, '""')),
							CONCAT_WS('=', 'CreatorGUID.R', IFNULL(@.CreatorGUID.R, '""')),
							NULL
						);
						CALL _sys_app_logtxt('LOG.Session.Add', NULL, @.l.Log_ID, '', '', '', '', @.l.Key, 
							@.logInf
						);
					END IF;
	--	APPLY 
		--	wersja APPLY 
			SET @Params = _Param_E;
			SET 
				@.OPZM.APPLY.ver = IFNULL(NULLIF(_Params2('_FetchParams', '&', @Params, 'APPLY.ver', ''), ''), '0'),
				@.OPZM.APPLY.Result = 'OK'	-- inicjalnie
			;
		--	ZAPIS DO LOG
		--	a gdy EDIT to zapis w logu delty	
			-- juz nie CALL log_Insert_from_TE_xxng('', @_IDN, @.OPZM.OPER, _FROM, _IdnOper, _WORLD);		
			CALL _log_tools_new('log_Insert_from_TE_M_xxng', @_IDN, 'jmam', @.OPZM.OPER, _FROM, _IdnOper, _WORLD, '', '');		
		--	numeracja
			-- było IF IFNULL(IFNULL(@.OPZM.AutoNum.Before.Apply, False) THEN
			IF IFNULL(IFNULL(@.OPZM.AutoNum.Before.Apply, @.NgPO.INF.Default_AutoNum_Before_Apply), False) THEN
				-- CALL _ng_e_Numeracja_przed_Apply('Do.Apply', _Key, _handle_FROM, _Param_A, _Param_B);
				CALL C_HT_xxNgPo_DO('NG<-Numeracja', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			END IF;
											--	SET @MMM = 'xxx.APPLY.1';		
			DO _counters_tools('SET', CONCAT_WS('.', _WORLD, _FROM, _MODE, @session.globals.OPER.DELTA.Ver), '', '');		-- to tylko Licznik!!!!
		--	Dla APPLY w wersji >= 2022 koniecznie spr. czy OperDelta zezwala na zapis
			IF @.OPZM.APPLY.ver >= '2022' AND @session.globals.OPER.DELTA.Ver >= '2022' THEN
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'APPLY.ver>2022');		
				-- jeśli potem INIT to nie trzeba Clear
				-- CALL OPZM_Delta_Tools('Clear', _FROM, _WORLD, _IdnOper, _Param_A, _Param_B, _Param_C, _Param_D, '<GUI>');
											--	SET @MMM = 'xxx.APPLY.1.1';		
				CALL OPZM_Delta_Tools('OP.Delta.Init.Prepare.Calc.Info', _FROM, _WORLD, _IdnOper, _Param_A, _Param_B, _Param_C, _Param_D, '<GUI>');
			--	Teraz w @.tpinf.C_IS_NOT_OK jest wybnik gdy = 0 jest OK gdy > 0 to deficyt!!!	
				IF @.tpinf.C_IS_NOT_OK > 0 THEN
											--	SET @MMM = 'xxx.APPLY.1.1.1';		
				--	Jest deficyt!!! WYCHODZIMY BEZ ZAPISU ... ale z posłaniem informacji o deficycie	
					SET @.OPZM.APPLY.Result = 'FAIL';
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, @.OPZM.APPLY.Result);		
					CALL _sessions_APP('SET.VAR', @SYSTEM.Current.Session.GUID, '', '', '', '', '');
					IF IFNULL(@SYSTEM.Client.Session.IS.System, TRUE) THEN
					--	sesja systemowa (alg. serwerowy/eventy czuli bez uzytkownika=osoby) ... wyslij mail
						CALL OPZM_Delta_Tools('OP.Delta.Report.com_msg', _FROM, _WORLD, _IdnOper, _Param_A, _Param_B, _Param_C, _Param_D, '');
					ELSE
												-- SET @MMM = 'xxx.APPLY.1.1.1.s';		
					--	sesja użytkownika wyslij do tabeli `_sys_msg` z jednym z wielu do wyboru trybów 
						IF @.OPZM.IN_MODE LIKE 'Realizacja.ZM%' THEN
											--	SET @MMM = 'xxx.APPLY.1.1.1.s.zm.1';		
						--	podobny do tego w BeforeApply ale moga to byc seryjnie realizowane zam. -> wtedy tabela n >= 1 rekordów z towarami defic
							CALL OPZM_Delta_Tools('OP.Delta.Report.GUI.Realizacja.ZM', _FROM, _WORLD, _IdnOper, 'Realizacja.ZM', '', '', '', '');		
											--	SET @MMM = 'xxx.APPLY.1.1.1.s.zm.2';		
						ELSE
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'OP.Delta.Report.GUI.BeforeApply');		
						--	tak jak w BeforeApply -> 1 rekord z towarami defic.
							CALL OPZM_Delta_Tools('OP.Delta.Report.GUI.BeforeApply', _FROM, _WORLD, _IdnOper, 'BeforeApply', '', '', '', '');		
						END IF;
					END IF;
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'LEAVE OPZM_Apply');		
					LEAVE OPZM_Apply;
				END IF;
											--	SET @MMM = 'xxx.APPLY.1.2';		
			END IF;
		END IF;
			/*
			--	zapis do logu aplikacji
				SET @.log.inf = (select concat_WS('/', n.Idn, n.GUID) as inf from `opng` n where n.GUID = 'GDa48e21fcff404d32836e412dbad4f034');
				CALL _sys_app_logtxt('LOG.Session.Add', @SYSTEM.Client.Session.GUID, 'watch', 'M.MOB.GASDROID2', '', '', '', '', 
					concat('przed R.n<-.n: ', IFNULL(@.log.inf, 'brak!!! '), 'KP: ', _IdnOper)
				);
			*/
	--	Wstaw/zamien naglowek
		IF @.IS.APPLY THEN
				--	LOG na jakis czas (brak CreatorGUID)						
					IF _WORLD = 'TE' AND _FROM = 'OP'AND @session.globals.Owner IN ('JARZEBINSCY') THEN
						SET @.l.Log_ID = 'TE.APPLY.Before.R.n<-.n', @.l.Key = _IdnOper;
						SET @.CreatorGUID.TE = (SELECT n.CreatorGUID FROM `TE_opng` n WHERE n.GUID = _IdnOper);
						SET @.CreatorGUID.R = (SELECT n.CreatorGUID FROM `opng` n WHERE n.GUID = _IdnOper);
						SET @.logInf = CONCAT_WS(', ',
							CONCAT_WS('=', '@.DEST.CreatorGUID', IFNULL(@.DEST.CreatorGUID, '""')),
							CONCAT_WS('=', '@.scSG', IFNULL(@SYSTEM.Client.Session.GUID, '""')),
							CONCAT_WS('=', '@.scSUG', IFNULL(@SYSTEM.Client.Session.log_USER_GUID, '""')),
							CONCAT_WS('=', '@.si.User_GUID', IFNULL(@session.INFO.User_GUID, '""')),
							CONCAT_WS('=', 'CreatorGUID.TE', IFNULL(@.CreatorGUID.TE, '""')),
							CONCAT_WS('=', 'CreatorGUID.R', IFNULL(@.CreatorGUID.R, '""')),
							NULL
						);
						CALL _sys_app_logtxt('LOG.Session.Add', NULL, @.l.Log_ID, '', '', '', '', @.l.Key, 
							@.logInf
						);
					END IF;
		
			CALL C_HT_xxNgPo_DO('R.n<-.n', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			-- bylo CALL C_HT_OPZM('N.xxng<-TE.xxng', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				--	LOG na jakis czas (brak CreatorGUID)						
					IF _WORLD = 'TE' AND _FROM = 'OP'AND @session.globals.Owner IN ('JARZEBINSCY') THEN
						SET @.l.Log_ID = 'TE.APPLY.After.R.n<-.n', @.l.Key = _IdnOper;
						SET @.CreatorGUID.TE = (SELECT n.CreatorGUID FROM `TE_opng` n WHERE n.GUID = _IdnOper);
						SET @.CreatorGUID.R = (SELECT n.CreatorGUID FROM `opng` n WHERE n.GUID = _IdnOper);
						SET @.logInf = CONCAT_WS(', ',
							CONCAT_WS('=', '@.DEST.CreatorGUID', IFNULL(@.DEST.CreatorGUID, '""')),
							CONCAT_WS('=', '@.scSG', IFNULL(@SYSTEM.Client.Session.GUID, '""')),
							CONCAT_WS('=', '@.scSUG', IFNULL(@SYSTEM.Client.Session.log_USER_GUID, '""')),
							CONCAT_WS('=', '@.si.User_GUID', IFNULL(@session.INFO.User_GUID, '""')),
							CONCAT_WS('=', 'CreatorGUID.TE', IFNULL(@.CreatorGUID.TE, '""')),
							CONCAT_WS('=', 'CreatorGUID.R', IFNULL(@.CreatorGUID.R, '""')),
							NULL
						);
						CALL _sys_app_logtxt('LOG.Session.Add', NULL, @.l.Log_ID, '', '', '', '', @.l.Key, 
							@.logInf
						);
					END IF;
		ELSE
			CALL C_HT_xxNgPo_DO('E.n<-.n', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			-- bylo CALL C_HT_OPZM('E.xxng<-TE.xxng', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			IF _MODE LIKE 'MOVE.TO.E%' THEN
				/*	wstaw jeszcze do `ng_e_rec`	*/
				SET @.SQL.TEXT = 
				"
				INSERT IGNORE INTO `ng_e_rec`
				(
					GUID, handle_FROM, handle_oper, 
					handle_TableName, handle_UserGUID, handle_UserLogin, 
					Rodzaj, Rodzaj_typ)
				SELECT
					n.GUID, 
					-- '#_FROM#' AS handle_FROM, 'INSERT' AS handle_oper, 
					'OP' AS handle_FROM, 'INSERT' AS handle_oper, 
					'opng_e' AS handle_TableName, n.CreatorGUID, n.idnuser,
					n.Rodzaj, n.Rodzaj_typ
				FROM `#opng#` n
				WHERE
					n.GUID = #_IdnOper#
				;
				"
				;
				--	SET @.SQL.TEXT = REPLACE(@.SQL.TEXT, '#_FROM#', _FROM);
				CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, '', '', '', '', '', @.SQL.TEXT);
				SET @handle_FROM = _FROM; -- Konieczne :(  !!!
				CALL _ng_e_rec_do('update.from.xxng_e', _IdnOper, '', '');	-- update ng_rec_e
			END IF;
			
		END IF;
		
			/*
			--	zapis do logu aplikacji
				SET @.log.inf = (select concat_WS('/', n.Idn, n.GUID) as inf from `opng` n where n.GUID = 'GDa48e21fcff404d32836e412dbad4f034');
				CALL _sys_app_logtxt('LOG.Session.Add', @SYSTEM.Client.Session.GUID, 'watch', 'M.MOB.GASDROID2', '', '', '', '', 
					concat('po R.n<-.n: ', IFNULL(@.log.inf, 'brak!!! '), 'KP: ', _IdnOper)
				);
			*/
		--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
		IF @.IS.APPLY THEN
				--	LOG na jakis czas (brak CreatorGUID)						
					IF _WORLD = 'TE' AND _FROM = 'OP'AND @session.globals.Owner IN ('JARZEBINSCY') THEN
						SET @.l.Log_ID = 'TE.APPLY.n.Zwrotne.idn', @.l.Key = _IdnOper;
						SET @.CreatorGUID.TE = (SELECT n.CreatorGUID FROM `TE_opng` n WHERE n.GUID = _IdnOper);
						SET @.CreatorGUID.R = (SELECT n.CreatorGUID FROM `opng` n WHERE n.GUID = _IdnOper);
						SET @.logInf = CONCAT_WS(', ',
							CONCAT_WS('=', '@.DEST.CreatorGUID', IFNULL(@.DEST.CreatorGUID, '""')),
							CONCAT_WS('=', '@.scSG', IFNULL(@SYSTEM.Client.Session.GUID, '""')),
							CONCAT_WS('=', '@.scSUG', IFNULL(@SYSTEM.Client.Session.log_USER_GUID, '""')),
							CONCAT_WS('=', '@.si.User_GUID', IFNULL(@session.INFO.User_GUID, '""')),
							CONCAT_WS('=', 'CreatorGUID.TE', IFNULL(@.CreatorGUID.TE, '""')),
							CONCAT_WS('=', 'CreatorGUID.R', IFNULL(@.CreatorGUID.R, '""')),
							NULL
						);
						CALL _sys_app_logtxt('LOG.Session.Add', NULL, @.l.Log_ID, '', '', '', '', @.l.Key, 
							@.logInf
						);
					END IF;
			SET @.SQL.OPZM.N.Zwrotnie = "UPDATE `#xxng#` e, `#REAL.xxng#` n SET e.Idn = n.Idn WHERE e.GUID = #_IdnOper# AND e.Idn = 0 AND n.GUID = e.GUID;";	
			CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, '', _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.N.Zwrotnie);
		END IF;
		
											--	SET @MMM = 'xxx.APPLY.1.3';		
	--	oper_Delta	
		IF @.IS.APPLY THEN
			IF @.OPZM.APPLY.ver >= '2022' THEN
											--	SET @MMM = 'xxx.APPLY.1.3.1';		
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, '2022.OP.Delta.Apply');		
				CALL OPZM_Delta_Tools('OP.Delta.Apply', _FROM, _WORLD, _IdnOper, _Param_A, _Param_B, _Param_C, _Param_D, '<GUI>');
											--	SET @MMM = 'xxx.APPLY.1.3.2';		
			ELSE
				IF _FROM IN ('OP') THEN
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'OP.Delta.Apply');		
				--	OP inicjuj i wpisz z oppo przed
					CALL oper_Delta_Tools('OP.BEFORE.Apply', _IdnOper, '', '', '', '', '');
				ELSE
				--	ZM inicjuj i wpisz z oppo przed
					CALL oper_Delta_Tools('ZM.BEFORE.Apply', _IdnOper, '', '', '', '', '');
				END IF;
			END IF;
		END IF;
											--	SET @MMM = 'xxx.APPLY.1.4';		
		
		/*
	--	Usun pozycje
		SET @.SQL.OPZM.P.Usun = 
		"
			DELETE p FROM `#xxpo#` p
			WHERE
				p.#IdnOper# = #_IdnOper#
			;
		"
		;
		CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.P.Usun);
		*/
	--	Usun, Wstaw pozycje
		IF @.IS.APPLY THEN
			CALL C_HT_xxNgPo_DO('R.p<-clear<-.p', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			-- CALL C_HT_OPZM('N.p<-clear<-.p', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
		ELSE
			CALL C_HT_xxNgPo_DO('E.p<-clear<-.p', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			-- CALL C_HT_OPZM('E.p<-Delete<-TE.p', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
		END IF;
											--	SET @MMM = 'xxx.APPLY.1.5';		
		
		--	zwrotnie nadaj IDN w E -> jesli kreowalismy dokument to po pierwszym apply swiat E juz powinien miec idn-y
		IF @.IS.APPLY THEN
			SET @.SQL.OPZM.P.Zwrotnie = "UPDATE `#xxpo#` e, `#REAL.xxpo#` p SET e.Idn = p.Idn WHERE e.#IdnOper# = #_IdnOper# AND e.Idn = 0 AND p.GUID = e.GUID;";	
			CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, '', _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.P.Zwrotnie);
		END IF;

											--	SET @MMM = 'xxx.APPLY.1.6';		
	--	oper_Delta	
		IF @.IS.APPLY 
		AND @.OPZM.APPLY.ver < '2022' 
		THEN
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'Oper_Delta..After.Apply');		
			IF _FROM IN ('OP') THEN
			--	Update po
				CALL oper_Delta_Tools('OP.After.Apply', _IdnOper, '', '', '', '', '');
			ELSE
			--	Update po
				CALL oper_Delta_Tools('ZM.After.Apply', _IdnOper, '', '', '', '', '');
			END IF;
		
			IF _FROM IN ('ZM') THEN

				CALL oper_Delta_Oferty_Update('update', _FROM, _IdnOper, '', '', '');
				CALL _ZM_Update_Realizacja('UPDATE.for.zmng', _IdnOper, '', '');
			END IF;
		END IF;
											--	SET @MMM = 'xxx.APPLY.1.7';		
		
		IF _FROM IN ('OP') THEN
		--	Wstaw oppo_corr do N
			IF @.IS.APPLY THEN
				-- CALL C_HT_OPZM('N.xxpo_corr<-TE.xxpo_corr', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				CALL C_HT_xxNgPo_DO('R.corr<-clear<-.corr', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			ELSE
				-- CALL C_HT_OPZM('E.xxpo_corr<-TE.xxpo_corr', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				CALL C_HT_xxNgPo_DO('E.corr<-clear<-.corr', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			END IF;
		END IF;
		
		/*
	--	Usun VAT
		SET @.SQL.OPZM.V.Usun = 
		"
			DELETE v FROM `#xxng_vat#` v
			WHERE
				v.IdnOper = #_IdnOper#
			;
		"
		;
		CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, @.SQL.OPZM.V.Usun);
		*/
	--	Wstaw Vat
		IF @.IS.APPLY THEN
			-- CALL C_HT_OPZM('N.xxng_vat<-Delete<-TE.xxng_vat', '', _FROM, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			CALL C_HT_xxNgPo_DO('R.vat<-clear<-.vat', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		ELSE
			-- CALL C_HT_OPZM('E.xxng_vat<-Delete<-TE.xxng_vat', '', _FROM, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			CALL C_HT_xxNgPo_DO('E.vat<-clear<-.vat', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		END IF;
		
		
		IF @.IS.APPLY THEN
			IF _FROM != 'ZM' THEN
				--	oppo_mag
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'UPDATE_OPNG_REC');		
				CALL oppo_mag('UPDATE_OPNG_REC', _IdnOper);
				--	rozlicz
				CALL ht_rozrach_rozlicz('ROZLICZ.CALC.OPNG', _IdnOper, '', '', '', '');
				CALL ht_rozrach_rozlicz('ROZLICZ.CALC.OPNG.RELATED', _IdnOper, '', '', '', '');
				
				IF FALSE AND IFNULL(@.OPZM.INPUT_Key, '') <> '' THEN	--	dalem FALSE bo juz w operdelta ustawiam WIEC PO CO ????????????????????
					CALL _ZM_Update_Realizacja('UPDATE.for.zmng', @i_Input_GUID, '', '');
				END IF;

			END IF;
			
			IF _FROM = 'OP' 
			AND (@session.globals.Owner = 'IZOHAN')
			THEN
			--	IZOHAN
			--	Ustaw wszystkim WZ-kom (`opng` n) numerdokfin z biezacego dokumentu (_Key) o ile!! : 
			--	jest numer <> '', jest to nowy dokument FV (idn=0) i WZ-ki maja pusty numer
				UPDATE `opng` dest, `opng` n, `oppo` p
				SET
					dest.Nrdokfin = n.Nrdokfin
				WHERE
					TRUE
					-- AND IFNULL(@.n.Handle_oper, '') = 'INSERT'	-- Jest to nowa ...
					AND n.GUID = _IdnOper
					AND IFNULL(n.Rodzaj, 0) = 1		-- FV ...
					AND IFNULL(n.fvrudowz, 0) = 1		-- ... do WZ
					AND IFNULL(n.Nrdokfin, '') != ''	-- z numerem <> ''
					AND p.IdnWZ = n.GUID
					AND dest.GUID = p.IdnOper
					AND IFNULL(dest.Nrdokfin, '') = ''	-- a same WZki nie maja numery
				;		
			END IF;
			
		END IF;
		
		
		IF _FROM = 'OP' THEN
			set @xyz = '';
				--	LOG na jakis czas (brak CreatorGUID)						
					IF _WORLD = 'TE' AND _FROM = 'OP'AND @session.globals.Owner IN ('JARZEBINSCY') THEN
						SET @.l.Log_ID = 'TE.APPLY.END', @.l.Key = _IdnOper;
						SET @.CreatorGUID.TE = (SELECT n.CreatorGUID FROM `TE_opng` n WHERE n.GUID = _IdnOper);
						SET @.CreatorGUID.R = (SELECT n.CreatorGUID FROM `opng` n WHERE n.GUID = _IdnOper);
						SET @.logInf = CONCAT_WS(', ',
							CONCAT_WS('=', '@.DEST.CreatorGUID', IFNULL(@.DEST.CreatorGUID, '""')),
							CONCAT_WS('=', '@.scSG', IFNULL(@SYSTEM.Client.Session.GUID, '""')),
							CONCAT_WS('=', '@.scSUG', IFNULL(@SYSTEM.Client.Session.log_USER_GUID, '""')),
							CONCAT_WS('=', '@.si.User_GUID', IFNULL(@session.INFO.User_GUID, '""')),
							CONCAT_WS('=', 'CreatorGUID.TE', IFNULL(@.CreatorGUID.TE, '""')),
							CONCAT_WS('=', 'CreatorGUID.R', IFNULL(@.CreatorGUID.R, '""')),
							NULL
						);
						CALL _sys_app_logtxt('LOG.Session.Add', NULL, @.l.Log_ID, '', '', '', '', @.l.Key, 
							@.logInf
						);
					END IF;
		END IF;

		IF _FROM = 'ZM' THEN
			set @xyz = '';
		END IF;
	END;
	END IF;
	
	
	IF 
	_MODE LIKE 'APPLY_END' 
	OR
	_MODE LIKE 'APPLY_CLEAR'
	THEN
								SET @.debug.OPZM = CONCAT_WS('/', @.debug.OPZM, 'APPLY_CLEAR');		
		/* zauwazylem to 13 V 2021
		APPLY juz sie wykonało wyżej (jest tam like 'APPLY%'!!! 
		CALL C_HT_OPZM('APPLY', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		*/
		CALL C_HT_OPZM('Clear', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
	END IF;
	
	IF _MODE LIKE 'END%' THEN
			set @xyz = '';
		CALL C_HT_OPZM('Clear', '', _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
	END IF;
	
	
	IF _MODE IN ('NEW', 'INSERT', 'EDIT') AND _IN_MODE = '' THEN
		SET _MODE = REPLACE(_MODE, 'INSERT', 'NEW');
		CALL C_HT_OPZM(CONCAT('INIT.', _MODE), _IN_MODE, _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		CALL C_HT_OPZM('START', _IN_MODE, _FROM, _WORLD, _IdnOper, _GUID, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
		LEAVE SC_HT_OPZM;
	END IF;
	
	
	-- IF _MODE IN ('MSG.INS') AND (@.OPZM.GUI = 1) THEN
	IF _MODE IN ('GUI.MSG.CHECK.%') AND (@.OPZM.GUI = 1) THEN
	/***********************************************************************
		GUI.MSG.CHECK.BEFORE.INSERT	- OK/NO
		GUI.MSG.CHECK.BEFORE.EDIT	- OK/NO/READONLY
		GUI.MSG.CHECK.BEFORE.DETETE	- OK/NO
		-- GUI.MSG.CHECK.ON.EDIT		- OK/READONLY
		Gdy w Params mamy @.OPZM.GUI = 1 to musimy wstawic msg sterujace
			IN _MODE VARCHAR(250),	 --	PUSTY ale moze oznacza RES_ID stringu
			IN _ID VARCHAR(255),			--	ID komunikatu
			IN _GUID VARCHAR(38),			--	GUID dokumentu
			IN _Kind VARCHAR(255),			--	np. "Init", "BeforeApply"
			IN _Msg TEXT,
			IN _MsgDlg VARCHAR(255), 		--	np. "Msg", "Warning", "Error", "Ask"',
			IN _Effect VARCHAR(255),		--	np. "", "ReadOnly", "Stop", "?"',
			IN _Lang VARCHAR(255),		--	Lang
			IN _Param_A VARCHAR(255)
		
	***********************************************************************/
		SET @_extCaption = IF(_IN_MODE IN ('INS', 'INSERT'), 'Wstawianie danych ', IF(_IN_MODE = 'Edit', 'Edycja danych ', 'Usuwanie danych '));
		IF _IN_MODE IN ('GUI.MSG.CHECK.BEFORE.INSERT') THEN
			-- @.DEST.KontrGUID i @.DEST.Rodzaj
		--	Uprawnienie	
			SET 
				@.OPZM.GUI.UPR = 
					GREATEST(_GetUprawnienie(@.DEST.OpTyp, ''), _GetUprawnienie(@.DEST.Rodzaj, ''))
			;
			SET @.OPZM.GUI.UPR.IS_OK = _Get_Upr_IS_OK('AFTER+MSG', 'INSERT', @.OPZM.GUI.UPR, FALSE, FALSE, @.DEST.Rodzaj, @_extCaption);
			-- CALL _sys_upr_DefaultUprIsOK('BEFORE', _IN_MODE, FALSE, FALSE, @.OPZM.GUI.UPR, @.DEST.Rodzaj, @_extCaption, @.OPZM.GUI.UPR.OK, @.OPZM.GUI.UPR.Msg);		
			IF NOT @.OPZM.GUI.UPR.IS_OK THEN
				CALL _ng_e_rec_msg_ins('ng_msg_upr', 'B1', _IdnOper, 'handle.BEFORE', 
					'',
					'Error', 
					'Stop', '', ''
				);
			END IF;
		--	KONTRAHENT	
			INSERT IGNORE INTO `ng_e_rec_msg`
			(`ID`, `GUID`, `Kind`, `Msg`, `MsgDlg`, `Effect`) 
			SELECT
				'' AS ID,
				_IdnOper AS GUID,
				'handle.BEFORE' AS Kind,
				'Nie wybrano kontrahenta !!!' AS Msg,
				'Warning' AS MsgDlg, 
				'Msg' AS Effect
			FROM `operdoc` od 
			WHERE
				od.MA_Kontrahenta = 1
				AND
				IFNULL(@.DEST.KontrGUID , '') = ''
			;
		END IF;
		
		IF _IN_MODE IN ('GUI.MSG.CHECK.BEFORE.EDIT', 'GUI.MSG.CHECK.BEFORE.DELETE') THEN
			CALL C_HT_xxNgPo_DO('CHECK.NgPO.INF', _FROM, _WORLD, _IdnOper, '', '', '', '', '', '');
			CALL _ng_e_rec_msg_clear('', _IdnOper, 'handle.AFTER', '');
			SET 
				@.OPZM.GUI.ReadOnly = FALSE,
				@.OPZM.GUI.UPR = 
					GREATEST(_GetUprawnienie(@.NgPO.INF.OpTyp, ''), _GetUprawnienie(@.NgPO.INF.Rodzaj, ''))
			;
			IF _IN_MODE IN ('GUI.MSG.CHECK.BEFORE.EDIT') THEN
				
				IF _FROM IN ('OP') THEN
					/**********************************************************************************************************************************
						Sprawdzam date zabr. operacji
					**********************************************************************************************************************************/
					IF (@session.HT.IR.Kontrola_daty_granicznej_dok) THEN -- _MODE = 'DataZabrOper' THEN
						-- SET @.NgPO.INF.kancelaria_kierunek = (SELECT kancelaria_kierunek FROM opng WHERE guid=_IdnOper);
						IF 
						(@.NgPO.INF.datawplywu <= @session.HT.IR.cDataZabrOper) 
						AND NOT (@.NgPO.INF.optyp IN (@ht.ZM)) 
						AND NOT (@.NgPO.INF.Rodzaj IN (@ht.CKsNN) AND @.NgPO.INF.kancelaria_kierunek = 4)  
						THEN
							SET @aUp = _GetUprawnienie('opng|EditPoCzasie', '');
							-- SET @aUp_EditPoCzasie = @aUp;
							SET @.OPZM.GUI.ReadOnly = (@aUp < @uprDSView);
							
							CALL _ng_e_rec_msg_ins('', 'A1', _IdnOper, 'handle.AFTER', 
								IF(@.OPZM.GUI.ReadOnly, 
									REPLACE(_res_str_get('ng_msg_DataZabrOper_stop', ''), '#D', @session.HT.IR.cDataZabrOper),
									REPLACE(_res_str_get('ng_msg_DataZabrOper_warrning', ''), '#D', @session.HT.IR.cDataZabrOper)
								),
								IF(@.OPZM.GUI.ReadOnly, 
									'Warning', 
									'Msg'
								),
								IF(@.OPZM.GUI.ReadOnly, 
									'ReadOnly', 
									''
								),
								'', ''
							);
						END IF;
					END IF;
					
					/**********************************************************************************************************************************
						WZ lub PZ gdy ma juz podczepione pozycje
					**********************************************************************************************************************************/
					IF @.NgPO.INF.ExistAttachPoz THEN
						IF IFNULL(@session.HT.IR.ZakazEdycjiWZPZPodczepionych, TRUE) THEN
						--	NIE wolno edytowac dok. gdy jest podczepiony do finansowego
							SET @.OPZM.GUI.ReadOnly = TRUE; -- @.OPZM.GUI.ReadOnly OR @NEW.Status.handle_ReadOnly;
							CALL _ng_e_rec_msg_ins('', 'A2', _IdnOper, 'handle.AFTER', 
								_res_str_get('ng_msg_Podczepione_poz_WZPZ__warrning', ''),
								-- 'Nie mozna edytowac dokumentow (WZ/PZ) ktorych pozycje sa juz podczepione do dokumentu finansowego!',
								'Warning', 
								'ReadOnly', '', ''
							);
						ELSE
						--	Wolno edytowac dok. gdy jest podczepiony do finansowego - ALE SPRAWDZ czy nie jest zafiskalizowany ????
							IF @.NgPO.INF.ExistAttachPozFisk THEN
							--	NIE wolno edytowac dok. gdy jest podczepiony do ZAFISKALIZOWANEGO finansowego (paragon_printed)
								SET @.OPZM.GUI.ReadOnly = TRUE; -- @.OPZM.GUI.ReadOnly OR @NEW.Status.handle_ReadOnly;
								CALL _ng_e_rec_msg_ins('', 'A2', _IdnOper, 'handle.AFTER', 
									CONCAT(
									'OSTRZEŻENIE!\nNie można edytować dokumentu (WZ/PZ) którego pozycje są już podczepione do ZAFISKALIZOWANEGO! dokumentu finansowego.'
									),
									'Warning', 
									'ReadOnly', '', ''
								);
							END IF;
						END IF;
					END IF;
				
					/**********************************************************************************************************************************
						Czy paragon zafiskalizowany ?
					**********************************************************************************************************************************/
					IF @.NgPO.INF.paragon_printed THEN
						SET @.OPZM.GUI.ReadOnly = TRUE; -- @.OPZM.GUI.ReadOnly OR @NEW.Status.handle_ReadOnly;
						CALL _ng_e_rec_msg_ins('', 'A2', _IdnOper, 'handle.AFTER', 
							-- _res_str_get('ng_msg_Podczepione_poz_WZPZ__warrning', ''),
							'Dokument ten został już zafiskalizowany i nie podlega edycji!',
							'Warning', 
							'ReadOnly', '', ''
						);
					END IF;
					
					/**********************************************************************************************************************************
						Zadekretowana operacja /zaksiegowana (@.NgPO.INF.zaksiegowana)
					**********************************************************************************************************************************/
					IF @.NgPO.INF.zaksiegowana != 0 THEN 
						IF NOT @.OPZM.GUI.ReadOnly THEN	-- gdy nie mamy ReadOnly
							SET @aUp = _GetUprawnienie('Mozliwosc_edycji_po_zadekr', '');
							-- SET @aUp_Mozliwosc_edycji_po_zadekr = @aUp;
						/*********************************************************************************************************
							Z ustaleń z ok. 16 Xi 2021
							@session.FK.IR.MozliwoscEdycjiDokZadekretowanego
							ma znaczenie "wykluczające" czyli 
							gdy = 0 to TYLKO DO ODCZYTU!!!!
							a gdy = 1 to sprawdzamy uprawnienia etc.
						*********************************************************************************************************/
							/* było SET @.OPZM.GUI.ReadOnly = (@aUp = 0); */
							SET 
								@.OPZM.GUI.ReadOnly = 
								--	gdy = 0 to TYLKO DO ODCZYTU!!!!
									NOT @session.FK.IR.MozliwoscEdycjiDokZadekretowanego
								--	gdy = 1 to decyduje  uprawnienie
									OR (@aUp = 0) 
							; 
							CALL _ng_e_rec_msg_ins('', 'A2', _IdnOper, 'handle.AFTER', 
								IF(@.OPZM.GUI.ReadOnly, 
									CONCAT(
										-- patrz nizej _res_str_get('ng_msg_doc_ReadOnly', ''),
										_res_str_get('ng_msg_Zadekretowana_operacja_warrning', '')
									),
									/* było
									IF(@session.FK.IR.MozliwoscEdycjiDokZadekretowanego, 
										_res_str_get('ng_msg_Zadekretowana_operacja_warrning2', ''),
										_res_str_get('ng_msg_Zadekretowana_operacja_warrning', '')
									)
									jest ... */
									CONCAT_WS('\n',
									_res_str_get('ng_msg_Zadekretowana_operacja_warrning', ''),
									-- _res_str_get('ng_msg_Zadekretowana_operacja_warrning', ''),
									_res_str_get('ng_msg_Zadekretowana_operacja_warrning2', '')
									)
								),
								IF(@.OPZM.GUI.ReadOnly, 
									'Warning', 
									'Msg'
								),
								IF(@.OPZM.GUI.ReadOnly, 
									'ReadOnly', 
									''
								),
								'', ''
							);
						ELSE
							CALL _ng_e_rec_msg_ins('', 'A2.1', _IdnOper, 'handle.AFTER', 
								_res_str_get('ng_msg_Zadekretowana_operacja_warrning', ''),
								'Msg',
								'', 
								'', ''
							);
						END IF;
						
					END IF;
					
					/**********************************************************************************************************************************
						Czy mam pozycje korygowane czyli czy pozycje dok. były korygowane?
					**********************************************************************************************************************************/
					IF (@.NgPO.INF.Poz.korygowanych > 0) THEN
						IF (@session.globals.Owner IN ('BALTIMA')) AND (IFNULL(@session.Registration.Admin, IFNULL(@session.user.Admin, 0)))  --	gdy NIE ADMIN (dla Baltimy - tymczasowo bo docelowo musimy dać edycję i zapisywać wybiórczo kilka pól
						THEN
							SET 
								@.OPZM.GUI.ReadOnly = FALSE
							;						
							CALL _ng_e_rec_msg_ins('', 'A5', _IdnOper, 'handle.AFTER', 
								_res_str_get('ng_msg_dokument_korygowany_Admin', ''),
								'Warning',
								'',  -- ReadOnly
								'', ''
							);												
						ELSE	
							SET 
								@.OPZM.GUI.ReadOnly = TRUE
							;
							
							CALL _ng_e_rec_msg_ins('', 'A5', _IdnOper, 'handle.AFTER', 
								_res_str_get('ng_msg_dokument_korygowany_ReadOnly', ''),
								'Warning',
								'ReadOnly',  
								'', ''
							);
						END IF;
					END IF;

					/**********************************************************************************************************************************
						Gdy sam jako dokument byłem korygowany - czy mam mlodsze pozycje korygujace ten sam oryginal?
					**********************************************************************************************************************************/
					IF (@.NgPO.INF.Poz.korygowanych.Pre > 0) THEN
						IF (IFNULL(@session.Registration.Admin, IFNULL(@session.user.Admin, 0)))  --	gdy NIE ADMIN (dla Baltimy - tymczasowo bo docelowo musimy dać edycję i zapisywać wybiórczo kilka pól
						THEN
							SET 
								@.OPZM.GUI.ReadOnly = FALSE
							;						
							CALL _ng_e_rec_msg_ins('', 'A5', _IdnOper, 'handle.AFTER', 
								-- na razie _res_str_get('ng_msg_dokument_korygowany_Admin', ''),
								@.OPZM.GUI.ReadOnly_Msg,
								'Warning',
								'',  -- ReadOnly
								'', ''
							);												
						ELSE	
							SET 
								@.OPZM.GUI.ReadOnly = TRUE
							;
							
							CALL _ng_e_rec_msg_ins('', 'A5', _IdnOper, 'handle.AFTER', 
								-- na razie _res_str_get('ng_msg_dokument_korygowany_ReadOnly', ''),
								@.OPZM.GUI.ReadOnly_Msg,
								'Warning',
								'ReadOnly',  
								'', ''
							);
						END IF;
					END IF;
				END IF;

				/**********************************************************************************************************************************
					ReadOnly <- z Status
				**********************************************************************************************************************************/
				SET
					@.OPZM.GUI.ReadOnly = @.OPZM.GUI.ReadOnly OR	-- gdy juz wczesniej ustaw. @.OPZM.GUI.ReadOnly to za OR juz nie ma znaczenia
					IFNULL(
					(
						SELECT 
							(s.ParamExtra = 'NoEdit') 
						FROM `slowniki_pierwotne` s 
						WHERE 
							s.Slownik_GUID = 
								IF(@.NgPO.INF.Rodzaj IN (@ht.CZmZP),
									'ZmZPStatus',
									IF(@.NgPO.INF.Rodzaj IN (@ht.ZM),
										'zamwstatus', 
										'OperStatus' 
									)
								)
							AND s.VALUE = @.NgPO.INF.oper.Status 
						
					), 0
					)
				;					
				IF @.OPZM.GUI.ReadOnly THEN
					CALL _ng_e_rec_msg_ins('', 'A4', _IdnOper, 'handle.AFTER', 
						_res_str_get('ng_msg_Status_ReadOnly', ''),
						'Warning',
						'ReadOnly', 
						'', ''
					);
				END IF;

			END IF;	-- tylko EDIT
			
		-- 	c.d, EDIT/DELETE
			/**********************************************************************************************************************************
				Sprawdz UPR
			**********************************************************************************************************************************/
			SET @.OPZM.GUI.UPR.IS_OK = _Get_Upr_IS_OK('AFTER+MSG', 
				REPLACE(_IN_MODE, 'GUI.MSG.CHECK.BEFORE.', ''), 
				@.OPZM.GUI.UPR, @.OPZM.GUI.ReadOnly, @.NgPO.INF.ThisIsUserRecord, @.NgPO.INF.Rodzaj, @_extCaption);
			-- redundancja IF NOT NEW.u_OK AND NEW.handle_oper = 'EDIT' THEN
			IF NOT @.OPZM.GUI.UPR.IS_OK THEN
			--	nie wpuszcza w Edycje - SPRAWDZ czy moze wpusci na ReadOnly
				SET 
					@.OPZM.GUI.ReadOnly = 1,
					@NEW.handle_ReadOnly = 1
				;
				-- CALL _sys_upr_DefaultUprIsOK('AFTER', NEW.handle_oper, NEW.handle_ReadOnly, NEW.u_ThisIsUserRecord, @UpGREATEST, NEW.u_rodzaj, @_extCaption, NEW.u_OK, NEW.u_Msg);		
				SET @.OPZM.GUI.UPR.IS_OK = _Get_Upr_IS_OK('AFTER+MSG', 
					REPLACE(_IN_MODE, 'GUI.MSG.CHECK.BEFORE.', ''), 
					@.OPZM.GUI.UPR, @.OPZM.GUI.ReadOnly, @.NgPO.INF.ThisIsUserRecord, @.NgPO.INF.Rodzaj, @_extCaption);
				IF @.OPZM.GUI.UPR.IS_OK THEN
				--	Wpuszcza (ale jako ReadOnly)
					CALL _ng_e_rec_msg_ins('', 'A6', _IdnOper, 'handle.AFTER', 
						_res_str_get('ng_msg_upr_edit', ''),
						'Warning',
						'ReadOnly', 
						'', ''
					);
				END IF;
			END IF;
			-- 	@ht.doc.UprOK AS UprOK,
			-- 	@ht.doc.Upr_Msg AS Upr_Msg,
			IF @.OPZM.GUI.ReadOnly THEN
				CALL _ng_e_rec_msg_ins('', 'A7', _IdnOper, 'handle.AFTER', 
					_res_str_get('ng_msg_doc_ReadOnly', ''),
					'Warning',
					'ReadOnly', 
					'', ''
				);
			END IF;	
			
			IF NOT @.OPZM.GUI.UPR.IS_OK THEN
				SET @X := '';
				CALL _ng_e_rec_msg_ins('ng_msg_upr', 'A8', _IdnOper, 'handle.AFTER', 
					'',
					'Error', 
					'Stop', '', ''
				);

			END IF;
		END IF;
		
								
	END IF;
		
END$$



DROP PROCEDURE IF EXISTS `C_HT_OPZM_Proc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `C_HT_OPZM_Proc`(
	IN _MODE VARCHAR(250),
	IN _IN_MODE VARCHAR(250),
	IN _FROM VARCHAR(250),
	IN _WORLD VARCHAR(250),
	IN _IdnOper VARCHAR(38),	--	IdnOper/IdnNg
	IN _GUID VARCHAR(38),		--	GUID pozycji ALBO!!! IdnNg realizowanego zamowienia w INIT _GUID wedruje do @.OPZM.INPUT_Key
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255),
	IN _Param_E TEXT
)
/******************************************************************************************************************************************************
	Procedury ogólne np. realizacja zam. realizacja wstępna i przeniesienie do E, etc.
	oczywiście korzysta z proc. C_HT_OPZM() czyli z TE
	_MODE najczesciej to
	'CREATE'		oznacza kreowanie od początku do konca w TE i zapis w rzeczywistych tabelach (UWAGA synionim 'NEW.APPLY')
	'NEW.APPLY'		to samo co 'CREATE' patrz wyżej 
	'NEW'			oznacza kreowanie w TE ale bez zapisu do rzeczywistych tabel - dane pozostaja w tabelach TE
	'NEW.EDIT.E'	oznacza kreowanie w TE ale bez zapisu do rzeczywistych tabel, nastepnie dane są kopiowane do tabel E i tam przetwarzane 
					w świecie E natomiast w tabelach TE dane są usuwane
******************************************************************************************************************************************************/
SC_HT_OPZM_Proc: BEGIN 
	DECLARE _Limit INTEGER;
	DECLARE _WyjazdGUID, _IdnNg, _KontrGUID VARCHAR(38);
	DECLARE _SQLText, _Params TEXT;
	DECLARE _IdnTowr, _ModeParam, _ZM_Key VARCHAR(38);
	DECLARE _Ilosc, _CenaNet DOUBLE(16,4);
	DECLARE _rodzaj_przeliczenia INTEGER;
	
	SET
		@.OPZM_Proc._IN_MODE = _IN_MODE,
		@.OPZM_Proc._FROM = _FROM,
		@.OPZM_Proc._WORLD = _WORLD,
		@.OPZM_Proc.IdnOper = _IdnOper,
		@.OPZM_Proc.GUID = _GUID,
		@.OPZM_Proc.Params = _Param_E
	;
	
	IF _MODE IN ('CREATE', 'NEW.APPLY', 'NEW', 'NEW.EDIT.E') AND _IN_MODE LIKE 'Realizacja.ZM.%' THEN
	/*************************************************************************************************************************************************
		Realizacja zamówień i ??? zleceń ????
		CALL C_HT_OPZM_Proc('NEW', 'Realizacja.ZM.From.zmng', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
	*************************************************************************************************************************************************/
	--	w @.OPZM.Proc.Inf.Ext może byc dodatkowy opis obszaru z którego wołamy tę procedue np. 'WMS import' / 'REalizacja trasy' etc
	--	@.OPZM.Proc.Inf.Ext jest czyszczony w Clear/End
		SET @.OPZM.Proc.Inf.Ext = IFNULL(NULLIF(_Params2('_FetchParams', '', @_Params, 'Proc.Inf.Ext', ''), ''), @.OPZM.Proc.Inf.Ext);
		SET @.OPZM.Proc.Inf = CONCAT_WS(', ', 
			CONCAT('Wątek: "', NULLIF(@.OPZM.Proc.Inf, ''),'"'),
			CONCAT('Proc.: "', _MODE, '"'), 
			CONCAT('Tryb: "', NULLIF(_IN_MODE, ''),'"')
		);
		DO _counters_tools('SET', CONCAT_WS('.', 'C_HT_OPZM_Proc', _MODE, _IN_MODE), '', '');		-- to tylko Licznik!!!!
set @MMM = '00';	
		IF _WORLD = 'TE' THEN
			CALL C_HT_OPZM('recreate.`TE_xxxx`', '', _FROM, 'TE', '', '', '', '', '' ,'', '');
		END IF;
	--	na pocz. spr. czy masz GUID zam. - choc 1 zamowienia dla wej. listy `t_GUI_WE_zmpo`  
		IF IFNULL(_GUID, '') = '' AND _IN_MODE LIKE 'Realizacja.ZM.From.%`t_GUI_WE_zmpo`%' THEN	
			SET _GUID = (
				SELECT t.IdnNg AS GUID FROM `t_GUI_WE_zmpo` t LIMIT 1
			);
		END IF;
		
		SET
			_FROM = (@.OPZM_Proc._FROM := 'OP'),
			@.OPZM_Proc.IdnOper = NULLIF(_IdnOper, ''),
			@.OPZM_Proc.Realizacja.IdnNg = _GUID, @.OPZM_Proc.INPUT_Key = _GUID, @_IdnNg = _GUID, 	--  @.OPZM.INPUT_Key = @.OPZM_Proc.INPUT_Key - to to samo
			@Params = @.OPZM_Proc.Params
		;
		SET _FROM = 'OP', @_IdnOper = NULLIF(_IdnOper, ''), @_IdnNg = _GUID, @Params = _Param_E;
	--	Gdy w Parametrze jest sekwencja "Ustaw.@_zmng_Realizuj.IlePozDoRealizacji" to sprawdz realizowalnosc ...
		IF IFNULL(@.OPZM_Proc.Params, '') LIKE '%Ustaw.@_zmng_Realizuj.IlePozDoRealizacji%' THEN
			CALL _ZM_Update_Realizacja('UPDATE.for.zmng', _GUID, 'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji', '');	
			IF @_zmng_Realizuj.IlePozDoRealizacji = 0 THEN
				LEAVE SC_HT_OPZM_Proc;
			END IF;
		ELSE
		--	czy w ogole istnieje zamowienie ?
			IF NOT EXISTS(SELECT GUID FROM `zmng` WHERE GUID = @.OPZM_Proc.Realizacja.IdnNg) THEN
				LEAVE SC_HT_OPZM_Proc;
			END IF;
		END IF;
set @MMM = '01';		
		
		-- SET @_IdnOper = NULLIF(_IdnOper, '');
		--	Finalny IdnOper moze wynikac z NrdokMag w zamowieniu (moze miec WZ/FV in blanco z jej numerem
		SELECT
			IF(NULLIF(zn.NrdokMag, '') IS NULL,
			--	Gdy (zazwyczaj) NrdokMag pusty to...wstaw 
				IFNULL(
					@.OPZM_Proc.IdnOper, 
					IF(_IN_MODE LIKE 'Realizacja.ZM.From.%`t_GUI_WE_zmpo`%', 
						IF((@.Ctx.IdnOper.From.Rodzaj.ZM := _Params2('_FetchParams', '', @_Params, 'Ctx.IdnOper.From.Rodzaj.ZM', '')) <> '',
							_Get_GUID_xxx('IdnOper<-SHORT.Ctx.Rodzaj', @.Ctx.IdnOper.From.Rodzaj.ZM, zn.Rodzaj2, '', '', '', ''),
							_Get_GUID_xxx('IdnOper<-NxIdnNg', '', '', '', '', '', '')
						),	
						UUID()
						/*
						_Get_GUID_xxx('IdnOper<-NxIdnNg', '', '', '', '', '', ''), 
						IF(_IN_MODE LIKE '%Ctx.IdnOper.From.Rodzaj.ZM%' AND (@.Ctx.IdnOper.From.Rodzaj.ZM := _Params2('_FetchParams', '', @_Params, 'Ctx.IdnOper.From.Rodzaj.ZM', '')) <> '',
							_Get_GUID_xxx('IdnOper<-SHORT.Ctx.Rodzaj', @.Ctx.IdnOper.From.Rodzaj.ZM, zn.Rodzaj2, '', '', '', ''),
							UUID()
						)
						*/
					)
				), 	-- @.OPZM_Proc.IdnOper/newGUID
			--	ale gdy NrdokMag <> pusty to szukaj w `opng` po GUIDzie deterministycznym lub po NrdokMag
				IFNULL(
					(SELECT n.GUID FROM `opng` n WHERE n.GUID = _Get_GUID_xxx('IdnOper<-IdnNg', zn.GUID, '', '', '', '', '')),
					IFNULL(
						(SELECT n.GUID FROM `opng` n WHERE n.Rodzaj IN (zn.Rodzaj2) AND n.Datawystaw >= zn.TerminRealizacji AND n.NrdokMag = zn.NrdokMag),
						IFNULL(@.OPZM_Proc.IdnOper, UUID())
					)
				)
			) AS NEW_GUID
		INTO
			@.OPZM_Proc.IdnOper
		FROM `zmng` zn
		WHERE
			zn.GUID = _GUID	--	IdnNg
		;
		SET _IdnOper = @.OPZM_Proc.IdnOper, @_IdnOper = @.OPZM_Proc.IdnOper;
set @MMM = '20';		
		SET _FROM = 'OP', @_IN_MODE = _IN_MODE, @_IdnOper = _IdnOper, @_IdnNg = _GUID, @Params = _Param_E;
		-- było CALL C_HT_OPZM('INIT.NEW', 'Realizacja.ZM.From.zmng', _FROM, _WORLD, @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM('INIT.NEW', _IN_MODE, _FROM, _WORLD, @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM('START', _IN_MODE, _FROM, _WORLD, _IdnOper, '', '', '', '' ,'', '');
		-- z ....CALL C_HT_OPZM('TE.NG.POST', '', 'OP', _IdnOper, '', '', '', '' ,'', '');
		-- na ...
		CALL C_HT_OPZM('NG.POST', '', _FROM, _WORLD, _IdnOper, '', '', '', '', '', '');
set @MMM = '25';		
		
		SET @.SQL.TEXT = 
		"
		UPDATE `#opng#` n
		SET
			n.data_vat = n.datawplywu
		WHERE
			n.GUID = #_IdnOper#
		;		
		"
		;
		CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, '', '', '', '', '', @.SQL.TEXT);
		-- była zmienna IF @.OPZM.N.Exists THEN -- Uwaga ta zmienna jest też ustawiana dla kompatybilność - jest używana w innych miejscach
		IF @.OPZM.ON.START.Ng.R.Existed THEN 
			SET @.SQL.TEXT = 
			"
			UPDATE `#opng#` n
			SET
				n.Deleted = 0
			WHERE
				n.GUID = #_IdnOper#
			;		
			"
			;
			CALL _ExecuteCmd_xxNgPo('', _FROM, _WORLD, _IdnOper, '', '', '', '', '', @.SQL.TEXT);
		END IF;
		
		IF _MODE IN ('CREATE', 'NEW.APPLY') THEN
											--	set @MMM = '26.APPLY';		
			CALL C_HT_OPZM('APPLY', '', _FROM, _WORLD, _IdnOper, '', '', '', '' ,'', @Params);
											--	set @MMM = '26.po.APPLY';		
			IF IFNULL(@.OPZM.APPLY.Result, 'OK') <> 'OK' THEN -- = 'FAIL'
				LEAVE SC_HT_OPZM_Proc;
			END IF;

			IF @session.globals.Owner = 'BALTIMA' THEN
				UPDATE `oppo` p, `zmpo` z
				SET
					p.Lp = z.Lp
				WHERE
					p.IdnOper = @_IdnOper
					AND
					z.GUID = p.GUIDzm
				;
			END IF;

			IF @session.HT.IR.Permanentne_Przesuwac_Termin_Realizacji_o_Cykl THEN	
			--	UWAGA jesli realizowalismy zam. permanentne to [przesun termin realizacji	
				UPDATE `zmng` n
				SET
				--	jesli termin jest ustawiony na ost. dzien miesiaca  to  przestawiamy na kolejny ost. dzien
					n.TerminRealizacji = 
						IF(n.TerminRealizacji = LAST_DAY(n.TerminRealizacji),
						      LAST_DAY(n.TerminRealizacji + INTERVAL n.permanentne_cykl MONTH),
						      n.TerminRealizacji + INTERVAL n.permanentne_cykl MONTH
						)
				WHERE
					n.GUID = @_IdnNg
					AND n.zamwpermn
				;		
				UPDATE `zmpo` p, `zmng` n
				SET
					p.TerminRealizacji = n.TerminRealizacji
				WHERE
					n.GUID = @_IdnNg
					AND n.zamwpermn
					AND p.IdnNg = n.GUID
					AND p.permanentne
				;	
			END IF;
			IF @session.globals.Owner = 'PLISZKA' THEN
			--	jesli DataZakonczUmowy is null or < od TerminRealizacji to Status <- 0
				UPDATE `zmng` n
				SET
					n.Status = 0
				WHERE
					n.GUID = @_IdnNg
					AND n.zamwpermn
					AND n.TerminRealizacji <= IFNULL(n.DataZakonczUmowy, '2100-12-31')
				;		
			END IF;
		--	Ustaw finalna realizowalnosc wejsciowego zamowienia	
			IF _IN_MODE LIKE 'Realizacja.ZM.From.%`t_GUI_WE_zmpo`%' THEN
			--	tutaj mamy ciąg
				CALL _ZM_Update_Realizacja('UPDATE.for.opng', @_IdnOper, '', '');
			ELSE
				CALL _ZM_Update_Realizacja('UPDATE.for.zmng', @_IdnNg, '', '');
			END IF;
		END IF;

		IF _MODE IN ('NEW.EDIT.E') THEN
			--	przenosimy do świata E
			CALL C_HT_OPZM('MOVE.TO.E', '', _FROM, _WORLD, _IdnOper, '', '', '', '' ,'', '');
		END IF;
		
	END IF;

	
	IF _MODE IN ('GUI.Realizacja.ZM') THEN
	/*************************************************************************************************************************************************
		
		Realizacja w edycja wstepna pozycji zamówień `t_GUI_WE_zmpo`
		CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'INIT.`t_GUI_WE_zmpo`<-1.IdnNg', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'INIT.`t_GUI_WE_zmpo`<-n.IdnNg', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
			1. otwarcie listy pozycji do zacheckowania w 2 wariantach
				- niezrealizowane pozycje z IdnNg - _IN_MODE = 'INIT.`t_GUI_WE_zmpo`<-1.IdnNg', 
				- wszystkie niezrealizowane pozycje kontrahenta z IdnNg - _IN_MODE = 'INIT.`t_GUI_WE_zmpo`<-n.IdnNg'
		
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.skaner', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.`t_zlecprod.zmpo`', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
	*************************************************************************************************************************************************/
set @.watch = '1';		
		SET _FROM = 'OP', @_IdnOper = NULLIF(_IdnOper, ''), @_IdnNg = _GUID, @_zmpo_GUID = NULLIF(_Param_A, ''), @Params = _Param_E;
		IF _IN_MODE LIKE 'INIT.`t_GUI_WE_zmpo`<-%.IdnNg' THEN
			SET
				@.t_GUI_WE_zmpo.Tag = IFNULL(NULLIF(_Params2('_FetchParams', '&', @Params, 'Tag', ''), ''), 0),
				@.t_GUI_WE_zmpo.Mode = IFNULL(NULLIF(_Params2('_FetchParams', '&', @Params, 'Typ', ''), ''), 0)
			;
			DROP TEMPORARY TABLE IF EXISTS `t_GUI_WE_zmpo`;
			-- cos nie tak ze zmiennymi
			-- SET @_GUID_ZM_WE = _GUID;
			CREATE TEMPORARY TABLE `t_GUI_WE_zmpo` LIKE `zmpo_m`;
			INSERT IGNORE INTO `t_GUI_WE_zmpo`
				SELECT
					-- p.GUID,
					-- (p.Ilosc - p.zrealizowano) AS DoRealizacji,
					p.*
				FROM `zmng` nwe, `zmng` n, `zmpo` p
				WHERE
					nwe.GUID = @_IdnNg
					AND IF(_IN_MODE = 'INIT.`t_GUI_WE_zmpo`<-1.IdnNg', n.GUID = nwe.GUID, TRUE)
					AND IF(@.t_GUI_WE_zmpo.Mode <> 'Edit', n.KontrGUID = nwe.KontrGUID , n.guid LIKE 'IM_W%' )
				--	AND n.KontrGUID = nwe.KontrGUID 
					AND n.rodzaj = nwe.rodzaj
					AND IF(@.t_GUI_WE_zmpo.Mode <> 'Edit', n.zrealizowane = 0, TRUE)
				--	AND n.zrealizowane = 0
					AND p.IdnNG = n.GUID
					AND IF(@.t_GUI_WE_zmpo.Mode <> 'Edit', (p.Ilosc - p.zrealizowano) > 0, TRUE)
				-- AND (p.Ilosc - p.zrealizowano) > 0
					AND
					IFNULL(p.IdnTowr, '') != ''
				ORDER BY p.LP	
			;	
			UPDATE `t_GUI_WE_zmpo` tp, `zmng` nwe, `zmng` n
			SET 
				tp.ExtFlags = CONCAT_WS('', tp.ExtFlags, 
					IF(n.waluta <=> nwe.waluta, NULL, '<WALUTA.WRONG>'),
					IF(n.magazynwys <=> nwe.magazynwys, NULL, '<MAGAZYN.WRONG>')
				),
				tp.ExtFlags_Inf = CONCAT_WS(', ', tp.ExtFlags_Inf, 
					IF(n.waluta <=> nwe.waluta, NULL, 'Niezgodna waluta'),
					IF(n.magazynwys <=> nwe.magazynwys, NULL, 'niezgodny magazyn')
				),
				tp.Tag = IFNULL(@.t_GUI_WE_zmpo.Tag, 1)
			WHERE
				nwe.GUID = @_IdnNg
				AND n.GUID = tp.IdnNg
			;
			DROP TEMPORARY TABLE IF EXISTS `t_GUI_WE_zmpo_EDIT`;
			CREATE TEMPORARY TABLE `t_GUI_WE_zmpo_EDIT`
			SELECT 
				tp.Idn,
				tp.GUID,
				tp.IdnNg,
				n.Nrzamw,
				n.nrzamwkontr,
				(tp.ExtFlags LIKE '%WRONG%') AS IsWrong,
				tp.tag,
				tp.ExtFlags,
				tp.ExtFlags_Inf,
				tp.TowrSymb,
				tp.TowrNazwa,
				tp.TerminRealizacji,
				_Fmt_DateTime(tp.TerminRealizacji, 'ddd d mmm yyyy@Y') AS TerminRealizacji_Str,
				(@.DoRealizacji := GREATEST(0, tp.Ilosc - tp.zrealizowano)) AS DoRealizacji,
				tp.ilosc, 
				_VarStr(CONCAT_WS('', 
					IF(tp.zrealizowano = 0, 'poz. nierealizowana (', 'zrealizowano: '),
					IF(tp.zrealizowano = 0, '0', _DisplayFmt_PL(tp.zrealizowano, 2, TRUE, ' ')),
					' z ', 
					_DisplayFmt_PL(tp.Ilosc, 2, TRUE, ' '),
					IF(tp.zrealizowano = 0, ')', NULL)
				)) AS IloscInf, 
				CONCAT_WS(' ', _DisplayFmt_PL(tp.wartnet, 2, TRUE, ' '), w.Symbol) AS WartNetStr,
				CONCAT_WS('', 'mag: ', tp.magazynwys, ' - ', m.Opis) AS Magazyn,
				tp.zrealizowano,
				tp.ilosc_pierwotna,
				tp.iloscdo, tp.spakowano, tp.status, tp.status_pakowania, 
				tp.info, tp.info2, tp.info3, tp.info4,
				tp.nrseryjny_lista,
				tp.nr_zmiany,
				tp.wartnet,
				tp.magazynwys,
				tp.data_dod_1,
				tp.data_dod_2,
				tp.data_dod_3,
				tp.komentarz,
				_Fmt_DateTime(tp.data_dod_1, 'ddd d mmm yyyy hh:nn @Y') AS Data_Dod_1_Str,
				_Fmt_DateTime(tp.data_dod_2, 'ddd d mmm yyyy hh:nn @Y') AS Data_Dod_2_Str
				-- ,tp.* 
			FROM `t_GUI_WE_zmpo` tp
			INNER JOIN `zmng` n ON n.GUID = tp.IdnNg
			LEFT JOIN `Magazyny` m ON m.IdnMagazynu = tp.MagazynWys
			LEFT JOIN `waluty` w ON w.Idn = n.waluta
			;
			
			LEAVE SC_HT_OPZM_Proc;
			
			
		END IF;
		
		IF _IN_MODE LIKE 'SELECT.`t_GUI_WE_zmpo`' THEN
			SELECT t.* FROM `t_GUI_WE_zmpo_EDIT` t;
		END IF;
		
		IF _IN_MODE LIKE 'UPDATE.`t_GUI_WE_zmpo`.1.rec' THEN
			SET
				@.t_GUI_WE_zmpo.GUID = IFNULL(_Params2('_FetchParams', '&', @Params, 'GUID', ''), 0),
				@.t_GUI_WE_zmpo.Tag = IFNULL(_Params2('_FetchParams', '&', @Params, 'Tag', ''), 0)
			;
			UPDATE `t_GUI_WE_zmpo` tp
			SET 
				tp.Tag = IFNULL(@.t_GUI_WE_zmpo.Tag, 0)
			WHERE
				tp.GUID = @.t_GUI_WE_zmpo.GUID
			;
		END IF;
		
		IF _IN_MODE LIKE 'Realizacja.`t_GUI_WE_zmpo`' THEN
			DELETE tp FROM `t_GUI_WE_zmpo` tp 
			WHERE
				tp.Tag = 0
			;
			CALL C_HT_OPZM_Proc('CREATE', 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`', 'OP', 'TE', _IdnOper, '', '', '', '', '' , @Params);
		
		END IF;
		
		
		IF _IN_MODE LIKE 'Realizacja.ZM.From.%`t_GUI_WE_zmpo`.%' THEN
			
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.INS_NEXT' THEN
				IF @_zmpo_GUID IS NOT NULL THEN
					INSERT IGNORE INTO `t_GUI_WE_zmpo`
						SELECT
							p.*
						FROM `zmpo` p
						WHERE
							p.GUID = @_zmpo_GUID
					;
				ELSE
					INSERT IGNORE INTO `t_GUI_WE_zmpo`
						SELECT
							p.*
						FROM `zmpo` p
						WHERE
							p.IdnNg = @_IdnNg
					;
				END IF;
			END IF;
			
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.EXECUTE' THEN
				CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`', 'OP', @_IdnOper, '', '', '', '', '' , @Params);
			END IF;
			
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.END' THEN
				DROP TEMPORARY TABLE IF EXISTS `t_GUI_WE_zmpo`;
			END IF;
			
		ELSE
		--	zaladuj TE_oppo z E
			CALL C_HT_xxNgPo_DO('E.p->TE.p', 'OP', 'TE', _IdnOper, '', '', '', '', '', @Params);
			CALL C_HT_OPZM('PO<-Realizacja.ZM', _IN_MODE, 'OP', 'TE', _IdnOper, @_IdnNg, @_zmpo_GUID, '', '', '' , @Params);
		--	spowrotem oddaj TE_oppo do E
			CALL C_HT_xxNgPo_DO('E.p<-TE.p', 'OP', 'TE', _IdnOper, '', '', '', '', '', @Params);
			-- CALL C_HT_OPZM('END', '', 'OP', _WORLD, _IdnOper, '', '', '', '', '' , @Params);		
		END IF;
	END IF;	
	
	IF _MODE IN ('E<-TE.Realizacja.ZM') AND _IN_MODE LIKE 'CREATE.ZM.FROM.ZM%' THEN
	/*************************************************************************************************************************************************
		
		CO TO JEST ?????
		PO CO ???????????????????
		
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.skaner', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.`t_zlecprod.zmpo`', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
		CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`', 'OP', 'TE', @_IdnOper, @_IdnNg, '', '', '', '' , @Params);
	*************************************************************************************************************************************************/
		SET _FROM = 'OP', @_IdnOper = NULLIF(_IdnOper, ''), @_IdnNg = _GUID, @_zmpo_GUID = NULLIF(_Param_A, ''), @Params = _Param_E;
		IF _IN_MODE LIKE 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.%' THEN
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.INIT' THEN
				DROP TEMPORARY TABLE IF EXISTS `t_GUI_WE_zmpo`;
				CREATE TEMPORARY TABLE `t_GUI_WE_zmpo` LIKE `zmpo_e`;
			END IF;
			
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.INS_NEXT' THEN
				IF @_zmpo_GUID IS NOT NULL THEN
					INSERT IGNORE INTO `t_GUI_WE_zmpo`
						SELECT
							p.*
						FROM `zmpo` p
						WHERE
							p.GUID = @_zmpo_GUID
					;
				ELSE
					INSERT IGNORE INTO `t_GUI_WE_zmpo`
						SELECT
							p.*
						FROM `zmpo` p
						WHERE
							p.IdnNg = @_IdnNg
					;
				END IF;
			END IF;
			
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.EXECUTE' THEN
				CALL C_HT_OPZM_Proc('E<-TE.Realizacja.ZM', 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`', 'OP', @_IdnOper, '', '', '', '', '' , @Params);
			END IF;
			
			IF _IN_MODE = 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`.END' THEN
				DROP TEMPORARY TABLE IF EXISTS `t_GUI_WE_zmpo`;
			END IF;
			
		ELSE
		--	zaladuj TE_oppo z E
			CALL C_HT_xxNgPo_DO('E.p->TE.p', 'OP', 'TE', _IdnOper, '', '', '', '', '', @Params);
			CALL C_HT_OPZM('PO<-Realizacja.ZM', _IN_MODE, 'OP', 'TE', _IdnOper, @_IdnNg, @_zmpo_GUID, '', '', '' , @Params);
		--	spowrotem oddaj TE_oppo do E
			CALL C_HT_xxNgPo_DO('E.p<-TE.p', 'OP', 'TE', _IdnOper, '', '', '', '', '', @Params);
			-- CALL C_HT_OPZM('END', '', 'OP', _WORLD, _IdnOper, '', '', '', '', '' , @Params);		
		END IF;
	END IF;	
	
	
	
	IF _MODE IN ('ODREALIZUJ') AND _IN_MODE IN ('ZAM.cale', 'ZAM<-usun.poz.z.Doc.MAG') THEN
	/*************************************************************************************************************************************************
		DO DOKONCZENIA -> patrz nizej
		Odrealizacja zamówień poprzez ...
		usuwanie pozycji z dok. mag. `oppo` - InnOper  czyli _FROM = 'OP'
		CALL C_HT_OPZM_Proc('ODREALIZUJ', 'ZAM<-usun.poz.z.Doc.MAG', 'OP', @_IdnOper, '', '', '', '', '' , @Params);
		cale odrealizowanie zamowienia - usuwanie pozycji wszystkich dokumentow z dok. mag. `oppo` - UWAGA tutaj _IdnOper to IdnNg  
		CALL C_HT_OPZM_Proc('ODREALIZUJ', 'ZAM.cale', 'ZM', @_IdnNg, '', '', '', '', '' , @Params);
	*************************************************************************************************************************************************/
		CALL C_HT_OPZM('recreate.`TE_xxxx`', '', _FROM, 'TE' ,'', '', '', '' ,'', '');
		IF _IN_MODE = 'Doc.MAG' THEN
			CALL C_HT_OPZM('INIT.EDIT(CLEAR)', '', _FROM, _WORLD, _IdnOper, '', '', '', '', '' , @Params);
			CALL C_HT_OPZM('START', '', _FROM, _WORLD, _IdnOper, '', '', '', '', '' , @Params);
			DELETE p FROM `TE_oppo` p WHERE p.IdnOper = _IdnOper;
			CALL C_HT_OPZM('NG.POST', '', _FROM, _WORLD, @_IdnOper, '', '', '', '' ,'', '');
			CALL C_HT_OPZM('APPLY', '', _FROM, _WORLD, _IdnOper, '', '', '', '' ,'', '');			
		-- 	nie potrzebne bo Apply jest uwzgl. :) CALL _ZM_Update_Realizacja('UPDATE.for.zmng', @_IdnNg, '', '');
		END IF;
		
		IF _IN_MODE = 'ZAM' THEN
			--	Tutaj konieczna petla dok. mag. aby je wyedytowac - na kiedys
			SET @costam = '';
		END IF;
		
	END IF;	
	

	IF _MODE LIKE 'Sys_Msg%' THEN
	/*************************************************************************************************************************************************
		DO DOKONCZENIA -> patrz nizej
		Odrealizacja zamówień poprzez ...
		usuwanie pozycji z dok. mag. `oppo` - InnOper  czyli _FROM = 'OP'
		CALL C_HT_OPZM_Proc('Sys_Msg.SELECT.RealizacjaZM', '', '', '', '', '', '', '', '' , @Params);
		cale odrealizowanie zamowienia - usuwanie pozycji wszystkich dokumentow z dok. mag. `oppo` - UWAGA tutaj _IdnOper to IdnNg  
		CALL C_HT_OPZM_Proc('ODREALIZUJ', 'ZAM.cale', 'ZM', @_IdnNg, '', '', '', '', '' , @Params);
	*************************************************************************************************************************************************/
		IF _MODE LIKE 'Sys_Msg._sys_msg->%' THEN
		/*************************************************************************************************************************************************
			np.
			CALL C_HT_OPZM_Proc('Sys_Msg._sys_msg->CHECK', 'BeforeApply', 'OP', 'M', @_IdnOper, '', '', '', '', '' , @Params);
			w _IN_MODE	mamy DestCtx
		*************************************************************************************************************************************************/
			SET @.sm.SendStatus = IF(_MODE = 'Sys_Msg._sys_msg->CHECK', 'CHECK', 'READ');
			UPDATE `_sys_msg` sm	-- , `ng_e_rec` ngr 
			SET 
				-- sm.SendStatusInf = CONCAT_WS('->', sm.SendStatusInf, IF(sm.SendStatusInf LIKE @.sm.SendStatus.LIKE, NULL, @.sm.SendStatus))
				sm.SendStatusInf = CONCAT_WS('->', sm.SendStatusInf, IF(sm.SendStatus = @.sm.SendStatus, NULL, @.sm.SendStatus)), 
				sm.SendStatus = @.sm.SendStatus,
				sm.ReadAt = IF(@.sm.SendStatus = 'READ', NOW(), sm.ReadAt)
			WHERE
				sm.DestCtxID = _IdnOper
				AND sm.DestLevel = 'SESSION'
				AND sm.Dest = @SYSTEM.Client.Session.GUID
				AND sm.DestCtx = _IN_MODE
				AND sm.SendStatus != 'READ'
			;
			IF _MODE = 'Sys_Msg._sys_msg->DELETE' THEN
				DELETE sm FROM `_sys_msg` sm
				WHERE
					sm.DestCtxID = _IdnOper
					AND sm.DestLevel = 'SESSION'
					AND sm.Dest = @SYSTEM.Client.Session.GUID
					AND sm.DestCtx = _IN_MODE
					AND sm.SendStatus = 'READ'
				;
			END IF;
		END IF;
		
		IF _MODE LIKE 'Sys_Msg.%.Msg%' THEN
		/*************************************************************************************************************************************************
			CALL C_HT_OPZM_Proc('Sys_Msg.SELECT.Msg', 'BeforeApply', 'OP', 'M', @_IdnOper, '', '', '', '', '' , @Params);
			CALL C_HT_OPZM_Proc('Sys_Msg.GET.Msg', 'BeforeApply', 'OP', 'M', @_IdnOper, '', '', '', '', '' , @Params);
			w _IN_MODE	mamy DestCtx
		*************************************************************************************************************************************************/
			CALL C_HT_OPZM_Proc('Sys_Msg._sys_msg->CHECK', _IN_MODE, _FROM, _WORLD, _IdnOper, '', '', '', '', '' , _Param_E);
			IF _MODE LIKE 'Sys_Msg.GET.Msg%' THEN
			--	Sys_Msg.GET.Msg
				SELECT 
					sm.Msg
				INTO
					@.sm.Msg
				FROM `_sys_msg` sm	-- , `ng_e_rec` ngr 
				WHERE
					sm.DestCtxID = _IdnOper
					AND sm.DestLevel = 'SESSION'
					AND sm.Dest = @SYSTEM.Client.Session.GUID
					AND 
						IF(_MODE != 'Sys_Msg.Get.Msg.ALL', 
							sm.DestCtx = _IN_MODE,
							TRUE
						)
					AND sm.SendStatus != 'READ'
				;
			ELSE
			--	Sys_Msg.SELECT.Msg
				SELECT 
					sm.ID AS ID, sm.DestCtxID AS GUID, 'INFO' AS Kind, sm.Msg, sm.MsgDlg, sm.MsgEffect, sm.Response
				FROM `_sys_msg` sm	-- , `ng_e_rec` ngr 
				WHERE
					sm.DestCtxID = _IdnOper
					AND sm.DestLevel = 'SESSION'
					AND sm.Dest = @SYSTEM.Client.Session.GUID
					AND 
						IF(_MODE != 'Sys_Msg.Get.Msg.ALL', 
							sm.DestCtx = _IN_MODE,
							TRUE
						)
					AND sm.SendStatus != 'READ'
				;
			END IF;
			IF _MODE LIKE 'Sys_Msg.%.Msg.and.Delete%' THEN
				CALL C_HT_OPZM_Proc('Sys_Msg._sys_msg->DELETE', _IN_MODE, _FROM, _WORLD, _IdnOper, '', '', '', '', '' , _Param_E);
			ELSE
				CALL C_HT_OPZM_Proc('Sys_Msg._sys_msg->READ', _IN_MODE, _FROM, _WORLD, _IdnOper, '', '', '', '', '' , _Param_E);
			END IF;
		END IF;	
		
		IF _MODE LIKE 'Sys_Msg.SELECT.RealizacjaZM%' THEN
			SELECT
				t.Src,
				t.Dest,
				t.DestCtx, 
				t.DestCtxID,
				t.GUID,
				CONCAT_WS('\n',
					'------------------------------------------------------------------------------------------------------------------------',
					'  Nie powstał(y) dok. realizujące zamówienia z powodu braków na magazynie',
					'........................................................................................................................',
					t.msg
				) AS Msg
			FROM
			(
				SELECT
					sm.Src,
					sm.Dest,
					sm.DestCtx, 
					sm.DestCtxID,
					sm.DestCtxID AS GUID,
					/*
					było
					CONCAT_WS('\n',
						'......................................................................................................',
						'  Nie powstał(y) dok. realizujące zamówienia z powodu braków na magazynie',
						'......................................................................................................',
						GROUP_CONCAT(
							sm.Msg
							SEPARATOR '\n......................................................................................................\n'
						)	
					) AS Msg
					*/
					GROUP_CONCAT(
						sm.Msg
						SEPARATOR '\n........................................................................................................................\n'
					) AS Msg
				FROM `_sys_msg` sm
				WHERE
					TRUE
					AND sm.DestCtx  = 'Realizacja.ZM'
					AND sm.Dest = @SYSTEM.Client.Session.GUID
					AND sm.ReadAt = '0000-00-00 00:00:00'
				-- ON DUPLICATE KEY UPDATE 
				-- 	Msg = @.MSG, SendAt = NOW(), con_ID = CONNECTION_ID(), SendStatusInf = CONCAT_WS('->', SendStatusInf, IF(SendStatus = 'SEND', NULL, 'SEND')), SendStatus = 'SEND'
				) t
			WHERE
				t.GUID IS NOT NULL
			;
		END IF;	
	END IF;	
END$$


DELIMITER ;

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

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/

/*  Zmiany CVS
$Log$
*/
