 /*
$Log: C_HT_RealizacjaZM.sql,v $
Revision 1.71  2025/02/18 15:43:37  jmam
$send$ Zmiany po TK

*/
DELIMITER $$

/* ************************************************************************************************************************************************************************
	Realizacja zamówień 
************************************************************************************************************************************************************************ */	
		DROP PROCEDURE IF EXISTS `_ZM_Update_Realizacja`$$
		CREATE DEFINER=`root`@`localhost` PROCEDURE `_ZM_Update_Realizacja`(
			IN _MODE VARCHAR(250),
			IN _Key VARCHAR(38),
			IN _Param_A VARCHAR(255),
			IN _Param_B MEDIUMTEXT
		)
		/*
			CALL _ZM_Update_Realizacja('UPDATE.for.zmng', '{07F091B8-0085-4C7C-806C-7B414D02B8C2}', '', '');
		*/
		
		BEGIN 
			DECLARE _SQLText MEDIUMTEXT;
			IF _MODE LIKE 'Selekcja.POZ.ZAM.%' THEN
				IF _MODE LIKE 'Selekcja.POZ.ZAM.PREPARE' THEN
					CALL _Setting_Variables('INIT.Variables.FULL', '', '');
					SET @_Params = _Param_B;
					SET 
						@.real.poz.WHERE.RodzajRealiz = IFNULL(NULLIF(_Params2('_FetchParams', '', @_Params, 'RodzajRealiz', ''), ''), '10'),
						@.real.poz.WHERE.KontrGUID = NULLIF(_Params2('_FetchParams', '', @_Params, 'KontrGUID', ''), ''),
						@.real.poz.WHERE.idnmagazyn = NULLIF(_Params2('_FetchParams', '', @_Params, 'idnmagazyn', ''), ''),
						@.real.poz.WHERE.magazynwys = NULLIF(_Params2('_FetchParams', '', @_Params, 'magazynwys', ''), ''),
						@.real.poz.WHERE.usluga = NULLIF(_Params2('_FetchParams', '', @_Params, 'usluga', ''), ''),
						@.real.poz.WHERE.ListaIdnNg = NULLIF(_Params2('_FetchParams', '', @_Params, 'ListaIdnNg', ''), '')
					;
				--	Na poczatek 1 wazna UWAGA - kluczowy jest KontrGUID i ListaIdnNg bo 
				--	albo szukamy po kontrahencie albo po liscie IdnNg gdzie KontrGUID juz nie gra roli - zatem ...
				--	jeśli oba te parametry są puste to zabijemy serwer wyszukiwanie - musimy wtedy to obejść
				--	czyli gdy ListaIdnNg IS NULL to dbamy by KontrGUID NIE BYŁ NULL a gdy jest dajemy "???"
					SET
						@.real.poz.Realizacja =
							IF(@.real.poz.WHERE.ListaIdnNg IS NULL AND @.real.poz.WHERE.KontrGUID IS NULL,
							--	nie zabijajmy czasu :)
								'ERR',
								IF(@.real.poz.WHERE.RodzajRealiz IN (@ht.CSpBR, @ht.CSpRU, @ht.CSpFV, @ht.CRzWZ, @ht.CSpFE, @ht.CSTUE, IF(@session.globals.Owner = 'MATELBUD', @ht.CRzRW, @ht.CSTUE)), -- jeszcze {$IFDEF Matelbud},CRzRW{$ENDIF} na POTEM
									'OO',
									IF(@.real.poz.WHERE.RodzajRealiz IN (@ht.CZkFV, @ht.CPzPZ, @ht.CZkIm, @ht.CZTUE),
										'DD',
										IF(@.real.poz.WHERE.RodzajRealiz IN (@ht.CMMMM),
											'ZmWe',
											'ERR'
										)
									)
								)
							)
					;	
					DROP TEMPORARY TABLE IF EXISTS `t_zmpo_update_status`;
					
					IF @.real.poz.Realizacja <> 'ERR' THEN
					--	Nie ERR to ZACZYNAMY!!!
						SET
							@.Selekcja.POZ.ZAM.SQL = 
							"
							CREATE TEMPORARY TABLE `t_zmpo_update_status`
							SELECT
								zp.GUID, zp.IdnNg
							FROM `zmng` zn
							INNER JOIN `zmpo` zp ON zp.idnNG = zn.GUID
							WHERE
								(zp.rodzaj IN (#WHERE.Rodzaje#))
								AND (zn.lockGUID = '') 
								AND zn.zamwpermn <> 1 -- = 0  ask jmam
								AND #WHERE.KontrGUID#
								AND #WHERE.idnmagazyn#
								AND #WHERE.magazynwys#
								AND #WHERE.usluga#
								AND #WHERE.ListaIdnNg#
								AND #WHERE.EXT1#
							GROUP BY zp.GUID
							;	
							"
						;
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.Rodzaje#',
							CASE @.real.poz.Realizacja
							WHEN 'OO' THEN '@ht.CZmOO, @ht.CZmEx'
							WHEN 'DD' THEN '@ht.CZmDD, @ht.CZmIm'
							WHEN 'ZmWe' THEN '@ht.CZmWe'
							ELSE ''
							END
						)
						;
						IF @.real.poz.Realizacja = 'OO' AND @session.globals.Owner = 'PLISZKA' THEN
						--	Dla PLISZKA zawsze usluga=0
							SET @.real.poz.WHERE.usluga = 0; 
							SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.EXT1#',
								'IF(zp.rodzaj IN (@ht.CZmOO, @ht.CZmEx), zp.wartnet <> 0.00, TRUE)'
							)
							;
						END IF;
						
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.KontrGUID#',
							IFNULL(CONCAT('zn.KontrGUID = ', QUOTE(@.real.poz.WHERE.KontrGUID)), 'TRUE')
						)
						;
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.idnmagazyn#',
							IFNULL(CONCAT('zp.idnmagazyn = ', @.real.poz.WHERE.idnmagazyn), 'TRUE')
						)
						;
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.magazynwys#',
							IFNULL(CONCAT('zp.magazynwys = ', @.real.poz.WHERE.magazynwys), 'TRUE')
						)
						;
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.usluga#',
							IFNULL(CONCAT('zp.usluga = ', @.real.poz.WHERE.usluga), 'TRUE')
						)
						;
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.ListaIdnNg#',
							IFNULL(CONCAT('zn.GUID IN (', @.real.poz.WHERE.ListaIdnNg, ')'), 'TRUE')
						)
						;
					--	jesli fraza #WHERE.EXT1# nie została juz zastąpiona to tu zastepujemy ją fraza TRUE 
						SET @.Selekcja.POZ.ZAM.SQL = REPLACE(@.Selekcja.POZ.ZAM.SQL, '#WHERE.EXT1#', 'TRUE');
					--	WYKONAJ
						SET @SQLText = @.Selekcja.POZ.ZAM.SQL;
						CALL _ExecuteCmd(@.Selekcja.POZ.ZAM.SQL, @Error);
						ALTER TABLE `t_zmpo_update_status` ADD PRIMARY KEY GUID(GUID);
					--	uaktualnie zamowienia z zestawu ...
						CALL _ZM_Update_Realizacja('UPDATE.for.`t_zmpo_update_status`', '', '', '');
					ELSE
					--	ERR zatem tylko stworz pusty zestaw (kadlubek)
						CREATE TEMPORARY TABLE `t_zmpo_update_status` SELECT zp.GUID, zp.IdnNg FROM `zmpo` zp WHERE FALSE;
					END IF;
				--	Zwracany SELECT	
					SELECT 
						'0' AS Selected, zp.terminrealizacji, zn.NrZamw, zn.NrZamwKontr ,zp.idn, zp.IdnNG, zp.idntowr, zp.towrsymb,
						IF(zp.towrnazwa<>'', zp.towrnazwa, ' ') AS towrnazwa, 
						zp.ilosc, zp.wartbrt, zp.idncennik, zp.waga, zp.waga_jedn,
						(zp.Ilosc - zp.zrealizowano) AS DoRealizacji, zp.zrealizowano, zp.RecepturaGuid,
						zn.datawystaw, zp.zlecono, zp.cenanet, zp.cenabrt, zp.idn_kontrah, zp.kontrguid, zp.reserve, zp.idnmagazyn, zp.usluga, zp.kurs,
						zp.Rodzaj_Przeliczenia, zp.WartnetWal, zp.rabat, zp.idnvat, zp.rodzaj, zp.GUID, zp.jednostka, zp.magtyp, zp.magazynwys,
						zp.kat0,zp.kat1, zp.kat2,zp.kat3,zp.kat4,zp.kat5,zp.kat6,zp.kat7,zp.kat8,zp.kat9,               
						zp.TypSymbolow, zp.uwagi, 
						zp.info, zp.info2, zp.info3, zp.info4, 
						zn.idnuser
					FROM `t_zmpo_update_status` tzp
					INNER JOIN `zmng` zn ON zn.GUID = tzp.IdnNg
					-- INNER JOIN `zmpo` zp ON zp.idnNG = zn.GUID
					INNER JOIN `zmpo` zp ON zp.GUID = tzp.GUID
					WHERE 
						TRUE
						AND (ABS(zp.zrealizowano) < ABS(zp.ilosc))
					;
				END IF;
			END IF;

			IF _MODE LIKE 'UPDATE.%' THEN
			/* *******************************************************************************************************************************************************
				Rozliczanie...
				-- zamowienie 
				CALL _ZM_Update_Realizacja('UPDATE.for.zmng', 'IdnNg', '', '');
				-- zamowienie o danej pozycji
				CALL _ZM_Update_Realizacja('UPDATE.for.zmpo', 'zmpo.GUID', '', '');
				-- np. dla zamowien ktore maja powiazane zlecenia produkcyjne albo dla ofert ktore maja powiazane zamowienia
				CALL _ZM_Update_Realizacja('UPDATE.for.zmpo.zamowienieGUID', 'zmpo.zamowienieGUID', '', '');
				-- wszystkie zamowienia ktre ten dokument realizuje (co do pozycji oppo -> zmpo -> zmng)
				CALL _ZM_Update_Realizacja('UPDATE.for.opng', 'IdnOper', '');
				-- wszystkie zamowienia ktre dokument o tej pozycji realizuje (co do pozycji oppo -> zmpo -> zmng)
				CALL _ZM_Update_Realizacja('UPDATE.for.oppo', 'oppo.GUID', '');
				-- wszystkie zamowienia których pozycje sa w `t_zmpo_to_delta``
				CALL _ZM_Update_Realizacja('UPDATE.for.`t_zmpo_to_delta`', '', '');
				-- wszystkie zamowienia których GUIDy są w `t_zmng_update_status` (uzywane np. w operdelta)`
				CALL _ZM_Update_Realizacja('UPDATE.for.`t_zmng_update_status`', '', '', '');
				-- wszystkie zamowienia których pozycje są w `t_zmpo_update_status` (uzywane np. w operdelta)`
				CALL _ZM_Update_Realizacja('UPDATE.for.`t_zmpo_update_status`', '', '', '');
			********************************************************************************************************************************************************/
			
				CALL _ZM_Update_Realizacja(REPLACE(_MODE, 'UPDATE', 'PREPARE'), _Key, _Param_A, _Param_B);
				SET @Z = '1';
			--	popzycje	
				SET @session.HT.IR.tymczasowosc_blokuje_realizowanie_poz_zam = IFNULL(@session.HT.IR.tymczasowosc_blokuje_realizowanie_poz_zam, FALSE);
				UPDATE `t_realizacja_zmpo` tp
				SET
				--	Ile (Ilosc w oppo) realizuje te pozycje (w GUIDzm) ALE NIE TYMCZASOWE!!! - NO CHYBA!!! ze sa to: SECURITY, POLASZEK 
				--	UWAGA(jmam) 19 X 2020 wprowadzilem flage w IRegu tymczasowosc_blokuje_realizowanie_poz_zam
					-- warunek na sumowanie ilosci pozycji (realizację) -> bylo ... AND NOT p.Tymczasowa a teraz
					-- 	tymcz.		0		1
					-- flaga IReg 	0	TAK		TAK (bo flaga = 0)
					-- 		1 	TAK		NIE
					-- czyli teraz warunek brzmi ... AND NOT(p.Tymczasowa AND @session.HT.IR.tymczasowosc_blokuje_realizowanie_poz_zam)
				
					tp.zrealizowano = LEAST(tp.Ilosc, 
						IFNULL(
							(
								SELECT 
									SUM(p.ilosc) 
								FROM `oppo` p 
								WHERE 
									p.GUIDzm = tp.GUID 
									AND NOT tp.zamwpermn
									AND 
									/* 
									bylo do 2020-10-19 ...
									IF(@session.globals.Owner IN ('SECURITY', 'POLASZEK'), 
										TRUE, 
										NOT p.Tymczasowa
									) 
									*/
								--	... teraz - blokujemy tylko gdy poz. jest Tymczasowa i flaga tymczasowosc_blokuje_realizowanie_poz_zam = 1
									NOT(p.Tymczasowa AND @session.HT.IR.tymczasowosc_blokuje_realizowanie_poz_zam) 
							)
						, 0)
						),
				--	Ile (Ilosc w oppo) realizuje te pozycje (w GUIDzm)
					tp.pr_ilosc_in = LEAST(tp.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = tp.GUID), 0)),
				--	Ile spakowano
					tp.spakowano = 
						IF(@session.globals.Owner = 'IZOHAN',
							GREATEST(
								tp.zrealizowano,
								IF((@.spakowano := (SELECT SUM(p.Spakowano) FROM `oppo` p WHERE p.GUIDzm = tp.GUID AND p.Tymczasowa)) > 0, 
									@.spakowano, 
									LEAST(tp.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo_e` p WHERE p.GUIDzm = tp.GUID AND NOT p.Tymczasowa), 0))
								)
							),
							tp.spakowano
						),
				--	Do status wstaw 32 gdy istnieją juz pozycje realizujace bedace TYMCZASOWE!!! (ale nie dla SECURITY) inczej mówiąc
				--	gdy sa TYMCZASOWE pozycje realizujące to z wyjatkiem SECURITY wstaw 32 !!!!
					tp.Status = 
						IF(IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = tp.GUID AND IF(@session.globals.Owner IN ('SECURITY'), FALSE, p.Tymczasowa)), 0) > 0, 
							32, 
							0
						),
					tp.zlecono = 
						IF(NOT (@session.globals.Owner IN ('JARZEBINSCY', 'KONKOL')),
							-- bylo ale przenioslem nizej do samego juz zapisu LEAST(tp.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `zmpo` p WHERE p.zamowienieGUID = tp.GUID AND NOT tp.zamwpermn), 0)),
							IFNULL((SELECT SUM(p.ilosc) FROM `zmpo` p WHERE p.zamowienieGUID = tp.GUID AND NOT tp.zamwpermn), 0),
							tp.zlecono
						)
				;
				UPDATE `t_realizacja_zmpo` tp
				SET
					tp.pozycja_zrealizowana = 
						IF(tp.Typ != 'OF',
							(tp.zrealizowano >= tp.ilosc),
							(tp.zlecono >= tp.ilosc)
						),
					tp.pozycja_pakowana = 
						tp.Status = 32 OR 
						(tp.Zlecono > 0)
				;
			--	naglowek	
			--	1. Ile zrealizowano pozycji ...
			/*	było do 12 III 2024
				UPDATE `t_realizacja_zmng` tn
				SET
					-- n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
					tn.IlepozZreal = 
						IFNULL((SELECT SUM(IFNULL(tp.pozycja_zrealizowana, 0)) FROM `t_realizacja_zmpo` tp WHERE tp.IdnNg = tn.GUID AND tp.wersja = tn.wersja), 0)
				WHERE
					tn.zamwpermn = 0	--	 A co z mieszanymi pozycjami zmpo perman i nieperm. ????
				;	
			*/
				UPDATE `t_realizacja_zmng` tn,
				(
				SELECT 
					tp.IdnNg, tp.wersja,
					SUM(IFNULL(tp.pozycja_zrealizowana, 0)) AS IlepozZreal,
					SUM(tp.pozycja_pakowana = 1) AS ilepozpakowane
					
				FROM `t_realizacja_zmpo` tp 
				--	WHERE 
					--	tp.IdnNg = tn.GUID AND tp.wersja = tn.wersja), 0
				GROUP BY tp.IdnNg, tp.wersja
				) tp
				SET
					-- n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
					tn.IlepozZreal = 
						tp.IlepozZreal,
					tn.ilepozpakowane = 
						tp.ilepozpakowane
				WHERE
					tn.zamwpermn = 0	--	 A co z mieszanymi pozycjami zmpo perman i nieperm. ????
					AND tp.IdnNg = tn.GUID
					AND tp.wersja = tn.wersja
				;	
			--	2. ... ateraz status i czy zrealizowane
			/*	było do 12 III 2024
				UPDATE `t_realizacja_zmng` tn
				SET
					-- n.Status = IF(n.ilepoz = n.IlepozZreal, 2, n.Status),
					tn.Status = 
						IF(tn.Nie_zmieniac_statusu,
							tn.Status,
							IF((tn.IlepozZreal >= tn.ilepoz), 
							--	Zrealizowane, anulowane, zamkniete ...
								IF(tn.Status IN (2, 4, 8), tn.Status, 2), 
							--	nie zrealizowane ...	
								IF(tn.Status = 2, 0, tn.Status)
							)
						),
					-- bylo (zad 42318) n.Status = IF(n.ilepoz = n.IlepozZreal, IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
					tn.zrealizowane = (tn.IlepozZreal >= tn.ilepoz)
				;
			*/
				UPDATE `t_realizacja_zmng` tn
				LEFT JOIN `slowniki_pierwotne` sp ON sp.Slownik_GUID = 'zamwstatus' AND sp.Value = tn.Status
				SET
					tn.zrealizowane = (@.tn.zrealizowane := (tn.IlepozZreal >= tn.ilepoz)),
					tn.Status = 
						IF(tn.Nie_zmieniac_statusu,
							tn.Status,
							IF(@.tn.zrealizowane, 
							--	Zrealizowane, anulowane, zamkniete (2, 4, 8)...
							
							--	IV 2024	IF(tn.Status IN (2, 4, 8), tn.Status, 2), 
								IF(tn.Status IN (2, 4, 8) OR sp.ParamExtra LIKE '%Completed%', 
									tn.Status, 
									2
								), 
							--	nie zrealizowane ... np 16 wysłane, 32 Pakowane, 64 Spakowane (dla 16 i 64 zam. do wszelkich edycji)
								--	IV 2024	IF(tn.Status IN (16, 32, 64), 
								IF(sp.ParamExtra LIKE '%InProgress%', -- tn.Status IN (16, 32, 64), 
									tn.Status,	--	np. 16 wysłane, 32 Pakowane, 64 Spakowane (na pewno???)
									IF(tn.ilepozpakowane > 0,
										32,	--	32 Pakowane	- (na pewno???)
										IF(tn.ilepozpakowane >= tn.ilepoz,
											64,	--	64 Spakowane	- (na pewno???)
											0	--	0 Aktywne
										)
									)
								) 
							)
						)
					-- bylo (zad 42318) n.Status = IF(n.ilepoz = n.IlepozZreal, IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
				;
			--	Na koniec rzeczywisty update
				UPDATE `zmpo` p, `t_realizacja_zmpo` tp
				SET
					p.zrealizowano = 
						IF(tp.Typ != 'OF',
							tp.zrealizowano,
							LEAST(tp.Ilosc, tp.zlecono)	--	dla ofert ilosc powiazanych zam. ale nie wiecej niz sama ilosc
						),
					p.pr_ilosc_in = 
						IF(tp.Typ != 'OF',
							tp.pr_ilosc_in,
							p.pr_ilosc_in
						),
					p.zlecono = 
						IF(tp.Typ != 'OF',
							tp.zlecono,
							p.zlecono
						),
					p.Status = 
						IF(tp.Typ != 'OF',
							tp.Status,
							p.Status
						),
					p.spakowano = 
						IF(tp.Typ != 'OF',
							tp.spakowano,
							p.spakowano
						)
				WHERE
					p.GUID = tp.GUID
				;	
				IF @session.globals.Owner IN ('CDG', 'MPGK') THEN
				--	TO DO powinni wszyscy to mieć - 
				--	spr. czy v_zm_powody_nierealiz istniej i ustaw pole MasterKey na odp. status zam.
				UPDATE `zmng` n, `t_realizacja_zmng` tn, `slowniki_pierwotne` s 
				SET
					n.ilepoz = tn.ilepoz,
					n.IlepozZreal = tn.IlepozZreal,
					n.zrealizowane = tn.zrealizowane,
					-- n.Status = tn.Status
					n.status = 
						-- IF(@session.globals.Owner IN ('CDG', 'MPGK'),
						IF(tn.zrealizowane,
						--	czyli nie jest juz w trakcie, nowem etc. ale zrealizowane
							IF(s.MasterKey = 0, IF(tn.Status = 0, 2, tn.Status), s.MasterKey), 
						--	zostaw naliczony status chyba że jest to Anulowanie albo zamkn.
							IF(tn.Status IN (4, 8), 0, tn.Status)
						) 
				WHERE
					n.GUID = tn.GUID
					AND s.slownik_guid="ZM_POWODY_NIEREALIZ" AND s.Value = IFNULL(n.powod_niezrealizowania, 0)
				;	
				ELSE	--	po staremu
				UPDATE `zmng` n, `t_realizacja_zmng` tn
				SET
					n.ilepoz = tn.ilepoz,
					n.IlepozZreal = tn.IlepozZreal,
					n.zrealizowane = tn.zrealizowane,
					n.Status = tn.Status
				WHERE
					n.GUID = tn.GUID
				;	
				END IF;	--	TO DO powinni wszyscy to mieć - to co przed ELSE!!!
				IF _Param_A = 'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji' THEN
					SET
						@_zmng_Realizuj.n.ilepoz = 0,
						@_zmng_Realizuj.n.IlepozZreal = 0,
						@_zmng_Realizuj.IlePozDoRealizacji = 0
					;
					SELECT 
						tn.ilepoz,
						tn.IlepozZreal,
						_VarInt(GREATEST(tn.ilepoz - tn.IlepozZreal, 0)) AS IlePozDoRealizacji 
					INTO
						@_zmng_Realizuj.n.ilepoz,
						@_zmng_Realizuj.n.IlepozZreal,
						@_zmng_Realizuj.IlePozDoRealizacji
					FROM `t_realizacja_zmng` tn
					WHERE 
						-- p.IdnNG = _ZM_Key 
						tn.GUID = _Key 
					;
				END IF;
				
			END IF;
		
							IF _MODE LIKE 'PREPARE.%' THEN
								IF @session.globals.Owner IS NULL THEN
										CALL _Globals_Get('Owner', @session.globals.Owner, NULL);
								END IF;
								DROP TEMPORARY TABLE IF EXISTS `t_realizacja_zmng`;
								CREATE TEMPORARY TABLE `t_realizacja_zmng` (
								  `GUID` VARCHAR(38) NOT NULL DEFAULT '' COMMENT 'GUID zamowienia/oferty/zlecenia prod.',
								  `typ` VARCHAR(38) DEFAULT 'ZM',
								  `rodzaj` INT(11) NOT NULL DEFAULT '0',
								  `zrealizowane` TINYINT(4) DEFAULT NULL,
								  `Status` INT(11) DEFAULT NULL COMMENT '0, 1, 2, 3, 4, 30 etc',
								  `ilepoz` INT(11) NOT NULL DEFAULT '0',
								  `ilepozzreal` INT(11) NOT NULL DEFAULT '0',
								  `ilepozpakowane` INT(11) NOT NULL DEFAULT '0',
								  `zamwpermn` INT(11) DEFAULT '0',
								  `wersja` INT(11) NOT NULL DEFAULT '0',
								  `Nie_zmieniac_statusu` BOOLEAN DEFAULT FALSE,
								  PRIMARY KEY (`GUID`)
								) 
								;
								
								DROP TEMPORARY TABLE IF EXISTS `t_realizacja_zmpo`;
								CREATE TEMPORARY TABLE `t_realizacja_zmpo` (
								  `GUID` VARCHAR(38) NOT NULL DEFAULT '' COMMENT 'GUID pozycji zamowienia/oferty/zlecenia prod.',
								  `idnNG` VARCHAR(38) NOT NULL DEFAULT '',
								  `typ` VARCHAR(38) DEFAULT 'ZM',
								  `rodzaj` INT(11) NOT NULL DEFAULT '0',
								  `ilosc` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
								  `zrealizowano` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
								  `spakowano` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
								  `zlecono` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
								  `Status` INT(11) NOT NULL DEFAULT '0',
								  `zamowienieGUID` VARCHAR(38) NOT NULL DEFAULT '',
								  `tymczasowa` INT(11) NOT NULL DEFAULT '0',
								  `pr_ilosc_in` DOUBLE(16,4) DEFAULT '0.0000',
								  `pozycja_zrealizowana` INT(11) NOT NULL DEFAULT '0' COMMENT '0 nie, 1 tak (w naglowku robimy sum',
								  `pozycja_pakowana` INT(11) NOT NULL DEFAULT '0' COMMENT '0 nie, 1 tak - zlecono (w naglowku robimy sum',
								  `zamwpermn` INT(11) DEFAULT '0',
								  `wersja` INT(11) NOT NULL DEFAULT '0',
								  PRIMARY KEY (`GUID`),
								  KEY `idnNG` (`idnNG`),
								  KEY `zamowienieGUID` (`zamowienieGUID`)
								) 
								;
								DROP TEMPORARY TABLE IF EXISTS `t_realizacja_zmng_Init`;
								CREATE TEMPORARY TABLE `t_realizacja_zmng_Init` (
								  `GUID` VARCHAR(38) NOT NULL DEFAULT '' COMMENT 'GUID zamowienia/oferty/zlecenia prod.',
								  PRIMARY KEY (`GUID`)
								) 
								;
								IF _MODE = 'PREPARE.for.zmng' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										n.GUID
									FROM `zmng` n
									WHERE
									TRUE
										AND n.GUID = _Key
									;
								END IF;
								
								IF _MODE = 'PREPARE.for.zmpo' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT zp.IdnNg AS GUID
									FROM `zmpo` zp
									WHERE
										zp.GUID = _Key
									;
								END IF;

								IF _MODE = 'PREPARE.for.zmpo.zamowienieGUID' THEN
								--	np. dla zamowien ktore maja powiazane zlecenia produkcyjne albo dla ofert ktore maja powiazane zamowienia
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT zp.IdnNg AS GUID
									FROM `zmpo` zp, `zmpo` zp_we
									WHERE
										zp_we.IdnNg = _Key
										AND zp.GUID = zp_we.zamowienieGUID
									GROUP BY zp.IdnNg
									;
								END IF;

								IF _MODE = 'PREPARE.for.opng' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT zp.IdnNg AS GUID
									FROM `oppo` p, `zmpo` zp
									WHERE
										p.IdnOper = _Key
										AND IFNULL(p.GUIDZM, '') != ''
										AND zp.GUID = p.GUIDZM 
									GROUP BY zp.IdnNg
									;
								END IF;

								IF _MODE = 'PREPARE.for.oppo' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT zp.IdnNg AS GUID
									FROM `oppo` p, `zmpo` zp
									WHERE
										p.GUID = _Key
										AND IFNULL(p.GUIDZM, '') != ''
										AND zp.GUID = p.GUIDZM 
									GROUP BY zp.IdnNg
									;
								END IF;

								IF _MODE = 'PREPARE.for.`t_zmpo_to_delta`' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT zp.IdnNg AS GUID
									FROM `t_zmpo_to_delta` t, `zmpo` zp
									WHERE
										zp.GUID = t.GUID
									GROUP BY zp.IdnNg
									;
								END IF;
								
								IF _MODE = 'PREPARE.for.`t_zmng_update_status`' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT t.GUID
									FROM `t_zmng_update_status` t
									;
								END IF;

								IF _MODE = 'PREPARE.for.`t_zmpo_update_status`' THEN
									INSERT IGNORE INTO `t_realizacja_zmng_Init`
									SELECT
										DISTINCT t.IdnNg AS GUID
									FROM `t_zmpo_update_status` t
									;
								END IF;



								INSERT IGNORE INTO `t_realizacja_zmng`
								SELECT
									n.GUID, 
									NULL AS typ,
									n.Rodzaj,
									zrealizowane,
									n.Status,
									n.ilepoz,
									n.ilepozzreal,
									0 AS ilepozpakowane,
									n.zamwpermn,
									n.wersja,
									FALSE
									-- ,od.*
								FROM `t_realizacja_zmng_Init` t, `zmng` n
								WHERE
									t.GUID = n.GUID
								ORDER BY n.idn
								;
								
								UPDATE `t_realizacja_zmng` tn
								SET
									tn.typ = 
										CASE 
										WHEN tn.rodzaj IN (@ht.CZmZP) THEN 'ZP'		-- @ht.CZmZP = 73  Zamówienie - zlecenie produkcyjne 
										WHEN tn.rodzaj IN (@ht.CZmOF) THEN 'OF'		-- @ht.CZmOF = 87  Oferty w zamowieniach 
										ELSE 'ZM'
										END,
									tn.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = tn.GUID AND p.wersja = tn.wersja)),
									tn.IlepozZreal = tn.IlepozZreal * (tn.zamwpermn = 0),
									tn.Nie_zmieniac_statusu = (@session.globals.Owner = 'COMEX' OR NOT @session.HT.IR.Zmiana_statusu_zm_po_zrealizowaniu_pozycji)
								;
								INSERT IGNORE INTO `t_realizacja_zmpo`
								SELECT
									p.GUID,
									p.idnNG,
									tn.typ,
									p.Rodzaj,
									p.Ilosc,
									p.zrealizowano,
									p.spakowano,
									p.zlecono,
									p.Status,
									p.zamowienieGUID,
									p.tymczasowa,
									p.pr_ilosc_in,
									0 AS pozycja_zrealizowana,
									0 AS pozycja_pakowana,
									IF(@session.globals.Owner = 'SECURITY',
										p.permanentne = 1, --	nie zmieniamy - to powinno byc powszechne !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
										tn.zamwpermn
									) AS zamwpermn,
									p.wersja
								FROM `t_realizacja_zmng` tn, `zmpo` p
								WHERE
								TRUE
									AND p.IdnNg = tn.GUID
								;
							END IF;
					
					
					
		END$$


		DROP PROCEDURE IF EXISTS `_zmng_Update_zrealizowane`$$
		CREATE DEFINER=`root`@`localhost` PROCEDURE `_zmng_Update_zrealizowane`(
			IN _MODE VARCHAR(250),
			IN _ZM_Key VARCHAR(38),
			IN _Param_A VARCHAR(255),
			IN _Param_B VARCHAR(255)
		)
		/*
			_Param_A <> '' oznacza ze odswiez pozycje
		*/
		BEGIN 
			DECLARE _oppo_GUID, _zmpo_GUID, _IdnNg, _IdnOper  VARCHAR(38);
			
			IF _MODE = '?' THEN
				SET	_MODE = IF(IFNULL((SELECT n.Rodzaj FROM `zmng` n WHERE n.GUID = _ZM_Key), @ht.CZmOO) != @ht.CZmOF, 'zmng', 'oferta');
				set @_MODE = _MODE;
			END IF;

			IF _MODE = 'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji' THEN
				CALL _zmng_Update_zrealizowane('', _ZM_Key, '1', '');	--	 Param_A ustawuiam aby naliczyl pozycje
				SELECT 
					n.ilepoz,
					n.IlepozZreal,
					_VarInt(IFNULL(SUM((p.Ilosc - p.zrealizowano) > 0), 0)) AS IlePozDoRealizacji
				INTO
					@_zmng_Realizuj.n.ilepoz,
					@_zmng_Realizuj.n.IlepozZreal,
					@_zmng_Realizuj.IlePozDoRealizacji
				FROM `zmng` n, `zmpo` p 
				WHERE 
					-- p.IdnNG = _ZM_Key 
					n.GUID = _ZM_Key 
					AND p.IdnNg = n.GUID 
					AND p.wersja = n.wersja
				;
			END IF;
			
			IF _MODE IN ('', 'zmng', 'oferta') THEN
			/*
				CALL _zmng_Update_zrealizowane('', _ZM_Key, '', '');
				CALL _zmng_Update_zrealizowane('', _ZM_Key, '1', '');	--	z pozycjami
				to samo
				CALL _zmng_Update_zrealizowane('zmng', _ZM_Key, '1', '');
				CALL _zmng_Update_zrealizowane('oferta', _ZM_Key, '', '');
					
			*/
				IF _Param_A <> '' THEN
				--	_Param_A <> '' oznacza ze odswiez pozycje
				-- 	POZYCJE
				set @teraz = 1;
				--	Najpierw temp do innych `zmpo` powiazanych 
					DROP TEMPORARY TABLE IF EXISTS `t_of_zmpo`;
					CREATE TEMPORARY TABLE `t_of_zmpo`
					SELECT
						z.GUID,
						LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `zmpo` p WHERE p.zamowienieGUID = z.GUID AND NOT n.zamwpermn), 0)) AS zrealizowano
					FROM `zmpo` z, `zmng` n
					WHERE
						z.IdnNg = _ZM_Key
						AND
						n.GUID = _ZM_Key
					;	
				
					IF _MODE IN ('', 'zmng') THEN
					--	zamowienia
				set @teraz = 2;
						UPDATE `zmpo` z, `zmng` n
						SET
						--	Ile (Ilosc w oppo) realizuje te pozycje (w GUIDzm ALE NIE TYMCZASOWE!!! )
							-- 2019 XII 10 z.zrealizowano = LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND NOT p.Tymczasowa AND NOT n.zamwpermn), 0)),
							z.zrealizowano = LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND IF(@session.globals.Owner IN ('SECURITY', 'POLASZEK'), TRUE, NOT p.Tymczasowa) AND NOT n.zamwpermn), 0)),
						--	Ile (Ilosc w oppo) realizuje te pozycje (w GUIDzm)
							z.pr_ilosc_in = LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID), 0)),
							-- 2019 XII 11 z.Status = IF(IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND p.Tymczasowa), 0) > 0, 32, 0)
							z.Status = IF(IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND IF(@session.globals.Owner IN ('SECURITY'), FALSE, p.Tymczasowa)), 0) > 0, 32, 0)
							
						WHERE
							z.IdnNg = _ZM_Key
							AND
							n.GUID = _ZM_Key
						;	
						IF NOT (@session.globals.Owner IN ('JARZEBINSCY', 'KONKOL')) THEN
						--	ALE NIE!!! dla baker droidowcow az do czasu przejscia u nich z pola zlecono na spakowano
							UPDATE `zmpo` z, `t_of_zmpo` t
							SET
								z.zlecono = t.zrealizowano
							WHERE
								-- z.IdnNg = _ZM_Key
								-- AND
								z.GUID = t.GUID
							;	
						END IF;
						
						set @AX = '2.1';
						IF @session.globals.Owner = 'IZOHAN' THEN
							CALL _zmng_Update_zrealizowane('Update.zlecono.spakowano.N', _ZM_Key, '', '');
						
						END IF;
					ELSEIF _MODE = 'oferta' THEN
					--	oferta
						/* juz robimy to wyzej
						DROP TEMPORARY TABLE IF EXISTS `t_of_zmpo`;
						CREATE TEMPORARY TABLE `t_of_zmpo`
						SELECT
							z.GUID,
							LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `zmpo` p WHERE p.zamowienieGUID = z.GUID AND NOT n.zamwpermn), 0)) AS zrealizowano
						FROM `zmpo` z, `zmng` n
						WHERE
							z.IdnNg = _ZM_Key
							AND
							n.GUID = _ZM_Key
						;	
						*/
						UPDATE `zmpo` z, `t_of_zmpo` t
						SET
							z.zrealizowano = t.zrealizowano
						WHERE
							-- z.IdnNg = _ZM_Key
							-- AND
							z.GUID = t.GUID
						;	
						-- DROP TEMPORARY TABLE IF EXISTS `t_of_zmpo`;
					
						set @AX = '2.2';
					END IF;
				END IF;	--	pozycji
				
			--	naglowek	
				UPDATE `zmng` n
				SET
					n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
					n.IlepozZreal = 
						IFNULL((SELECT SUM(IFNULL(p.zrealizowano >= p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja), 0)*(n.zamwpermn = 0)
				WHERE
					n.GUID = _ZM_Key
					/* było ale przenioslem wyzej do linii update  
					AND n.zamwpermn = 0	
					*/
				;	
				IF _MODE IN ('', 'zmng') THEN
				--	zamowienia
					UPDATE `zmng` n
					SET
						-- n.Status = IF(n.ilepoz = n.IlepozZreal, 2, n.Status),
						n.Status = 
							IF(@session.globals.Owner != 'COMEX' AND @session.HT.IR.Zmiana_statusu_zm_po_zrealizowaniu_pozycji,
								IF((n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0), IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
								n.Status
							),
						-- bylo (zad 42318) n.Status = IF(n.ilepoz = n.IlepozZreal, IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
						n.zrealizowane = (n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0)
					WHERE
						n.GUID = _ZM_Key
					/* było ale przenioslem wyzej do linii update  
						AND n.zamwpermn = 0	
					*/
					;	
				ELSEIF _MODE = 'oferta' THEN
				--	oferta
				--	UWAGA ponizszy update powinien byc w tej postaci uzyty wyzej (w zamowieniach) bo gdy nie sa pozycje wszystskie zrealizowana a ma status zrealizowany (1) to powinien wrocic do niezrealizowanego (0) no chyba ze status aktualny jest wyzszy
					UPDATE `zmng` n
					SET
						n.Status = IF((n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0), IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
						n.zrealizowane = (n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0)
					WHERE
						n.GUID = _ZM_Key
					/* było ale przenioslem wyzej do linii update  
						AND n.zamwpermn = 0	
					*/
					;	
				END IF;
			END IF;

					--	UWAGA dla obu t_zmpo_update_status  zam. i ofert buduj link z pozycjami zam.	
						IF _MODE = 'for.`t_zmpo_update_status`-`t_of_zmpo`' THEN
							DROP TEMPORARY TABLE IF EXISTS `t_of_zmpo`;
							CREATE TEMPORARY TABLE `t_of_zmpo`
							SELECT
								z.GUID,
								LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `zmpo` p WHERE p.zamowienieGUID = z.GUID AND NOT n.zamwpermn), 0)) AS zrealizowano
							FROM `zmpo` z, `t_zmng_update_status` t, `zmng` n
							WHERE
								z.IdnNg = t.GUID
								AND
								n.GUID = t.GUID
							;	
						END IF;
			
			IF _MODE IN ('for.`t_zmng_update_status`') THEN
			--	naglowek	
				UPDATE `zmng` n, `t_zmng_update_status` t
				SET
					n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
					n.IlepozZreal = 
						IFNULL((SELECT SUM(IFNULL(p.zrealizowano >= p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja), 0)*(n.zamwpermn = 0)
				WHERE
					n.GUID = t.GUID
					/* było ale przenioslem wyzej do linii update  
					AND n.zamwpermn = 0	
					*/
				;	
				UPDATE `zmng` n, `t_zmng_update_status` t
				SET
					n.Status = 
						IF(@session.globals.Owner != 'COMEX' AND @session.HT.IR.Zmiana_statusu_zm_po_zrealizowaniu_pozycji,
							IF((n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0), IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
							n.Status
						),
					-- n.Status = IF((n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0), 2, n.Status),
					n.zrealizowane = (n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0)
				WHERE
					n.GUID = t.GUID
					/* było ale przenioslem wyzej do linii update  
					AND n.zamwpermn = 0	
					*/
				;	
			END IF;

			
			
			IF _MODE IN ('for.`t_zmpo_update_status`') THEN
			--	naglowek	
				DROP TEMPORARY TABLE IF EXISTS `t_zmng_update_status`;
				CREATE TEMPORARY TABLE `t_zmng_update_status` SELECT p.IdnNg AS GUID FROM `t_zmpo_update_status` p GROUP BY p.IdnNg;
				ALTER TABLE `t_zmng_update_status` ADD PRIMARY KEY GUID (GUID);

				
				UPDATE `zmpo` z, `t_zmng_update_status` t, `zmng` n
				SET
				--	Ile (Ilosc w oppo) realizuje te pozycje (w GUIDzm ALE NIE TYMCZASOWE!!! )
					z.zrealizowano = LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND NOT p.Tymczasowa AND NOT n.zamwpermn), 0)),
				--	Ile (Ilosc w oppo) realizuje te pozycje (w GUIDzm)
					z.pr_ilosc_in = LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID), 0)),
					z.Status = IF(IFNULL((SELECT SUM(p.ilosc) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND p.Tymczasowa), 0) > 0, 32, 0)
				WHERE
					z.IdnNg = t.GUID
					AND
					n.GUID = t.GUID
				;	

				CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`-`t_of_zmpo`', '', '', '');
				IF NOT (@session.globals.Owner IN ('JARZEBINSCY', 'KONKOL')) THEN
					UPDATE `zmpo` z, `t_of_zmpo` t
					SET
						z.zlecono = t.zrealizowano
					WHERE
						z.GUID = t.GUID
					;	
				END IF;
				
				CALL _zmng_Update_zrealizowane('for.`t_zmng_update_status`', '', '', '');
				
			END IF;
			
			IF _MODE IN ('for.`t_zmng_update_status`.oferty') THEN
			--	naglowek	
				UPDATE `zmng` n, `t_zmng_update_status` t
				SET
					n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
					n.IlepozZreal = 
						IFNULL((SELECT SUM(IFNULL(p.zrealizowano >= p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja), 0)*(n.zamwpermn = 0)
				WHERE
					n.GUID = t.GUID
					/* było ale przenioslem wyzej do linii update  
					AND n.zamwpermn = 0	
					*/
				;	
				UPDATE `zmng` n, `t_zmng_update_status` t
				SET
					n.Status = IF((n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0), IF(n.Status IN (2, 4, 8), n.Status, 2), IF(n.Status = 2, 0, n.Status)),
					n.zrealizowane = (n.ilepoz = n.IlepozZreal)AND(n.zamwpermn = 0)
				WHERE
					n.GUID = t.GUID
					/* było ale przenioslem wyzej do linii update  
					AND n.zamwpermn = 0	
					*/
				;	
			END IF;
			
			
			IF _MODE IN ('for.`t_zmpo_update_status`.oferty') THEN
set @AX = '5.1';			
			--	naglowek	
				DROP TEMPORARY TABLE IF EXISTS `t_zmng_update_status`;
				CREATE TEMPORARY TABLE `t_zmng_update_status` SELECT p.IdnNg AS GUID FROM `t_zmpo_update_status` p GROUP BY p.IdnNg;
				ALTER TABLE `t_zmng_update_status` ADD PRIMARY KEY GUID (GUID);
				

				
set @AX = '5.2';			
				/*
				DROP TEMPORARY TABLE IF EXISTS `t_of_zmpo`;
				CREATE TEMPORARY TABLE `t_of_zmpo`
				SELECT
					z.GUID,
					LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `zmpo` p WHERE p.zamowienieGUID = z.GUID AND NOT n.zamwpermn), 0)) AS zrealizowano
				FROM `zmpo` z, `t_zmng_update_status` t, `zmng` n
				WHERE
					z.IdnNg = t.GUID
					AND
					n.GUID = t.GUID
				;	
				*/
set @AX = '5.3';			
				CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`-`t_of_zmpo`', '', '', '');
				UPDATE `zmpo` z, `t_of_zmpo` t
				SET
					z.zrealizowano = t.zrealizowano
				WHERE
					-- z.IdnNg = _ZM_Key
					-- AND
					z.GUID = t.GUID
				;	
				-- DROP TEMPORARY TABLE IF EXISTS `t_of_zmpo`;
				
				
set @AX = '5.4';			
				CALL _zmng_Update_zrealizowane('for.`t_zmng_update_status`.oferty', '', '', '');
set @AX = '5.5';			
			END IF;

			IF _MODE IN ('Update.zlecono.spakowano.N') THEN
				UPDATE `zmpo` z
				SET
					z.zlecono = 
						IF(GREATEST(z.Ilosc - z.zrealizowano, 0) = 0, 
							IF(IFNULL(z.commision_guid, '') != '', z.zrealizowano, z.zlecono),	--	dla zrealizowanych nie zmieniaj `zlecono`
							-- bylo IF(z.zlecono > 0 AND IFNULL(z.commision_guid, '') != '', 
							IF(z.zlecono >= 0 AND IFNULL(z.commision_guid, '') != '', 
								GREATEST(z.Ilosc - z.zrealizowano, 0), 
								z.zlecono
							)
						),
					z.spakowano = 
						IF(@session.globals.Owner = 'IZOHAN',
							GREATEST(
								z.zrealizowano,
								IF((@.spakowano := (SELECT SUM(p.Spakowano) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND p.Tymczasowa)) > 0, 
									@.spakowano, 
									LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo_e` p WHERE p.GUIDzm = z.GUID AND NOT p.Tymczasowa), 0))
								)
							),
							z.spakowano
						)
					
				WHERE
					z.IdnNg = _ZM_Key
				;	
			END IF;

			IF _MODE IN ('Update.zlecono.spakowano.P') THEN
			/*
			
			*/
				UPDATE `zmpo` z
				SET
					z.zlecono = 
						IF(GREATEST(z.Ilosc - z.zrealizowano, 0) = 0, 
							IF(IFNULL(z.commision_guid, '') != '', z.zrealizowano, z.zlecono),	--	dla zrealizowanych nie zmieniaj `zlecono`
							-- bylo IF(z.zlecono > 0 AND IFNULL(z.commision_guid, '') != '', 
							IF(z.zlecono >= 0 AND IFNULL(z.commision_guid, '') != '', 
								GREATEST(z.Ilosc - z.zrealizowano, 0), 
								z.zlecono
							)
						),
					z.spakowano = 
						IF(@session.globals.Owner = 'IZOHAN',
							GREATEST(
								z.zrealizowano,
								IF((@.spakowano := (SELECT SUM(p.Spakowano) FROM `oppo` p WHERE p.GUIDzm = z.GUID AND p.Tymczasowa)) > 0, 
									@.spakowano, 
									LEAST(z.Ilosc, IFNULL((SELECT SUM(p.ilosc) FROM `oppo_e` p WHERE p.GUIDzm = z.GUID AND NOT p.Tymczasowa), 0))
								)
							),
							z.spakowano
						)
				WHERE
					z.GUID = _ZM_Key
				;	
			END IF;

			IF _MODE LIKE 'Apply.E.insert.into.t_zmpo_update_status.%' THEN
			/*
				CALL _zmng_Update_zrealizowane('Apply.E.insert.into.t_zmpo_update_status.BEFORE.Apply', 'IdnOper', '', '');
				CALL _zmng_Update_zrealizowane('Apply.E.insert.into.t_zmpo_update_status.AFTER.Apply', 'IdnOper', '', '');
			*/
				SET _IdnOper = _ZM_Key;
				IF _MODE = 'Apply.E.insert.into.t_zmpo_update_status.BEFORE.Apply' THEN
				--	Inicjalnie stworz tabele 
					DROP TEMPORARY TABLE IF EXISTS `t_zmpo_update_status`;
					CREATE TEMPORARY TABLE `t_zmpo_update_status` SELECT zp.GUID, zp.IdnNg FROM `zmpo` zp  WHERE FALSE;
					ALTER TABLE `t_zmpo_update_status` ADD PRIMARY KEY GUID(GUID);
				END IF;
			--	Dodaj pozycje `zmpo` dla ktorych bedzie update
				INSERT IGNORE INTO `t_zmpo_update_status`
					SELECT zp.GUID, zp.IdnNg 
					FROM `oppo` p, `zmpo` zp 
					WHERE 
						p.IdnOper = _IdnOper
						AND IFNULL(p.GUIDZM, '') != ''
						AND zp.GUID = p.GUIDZM 
					GROUP BY zp.IdnNg
				;
				IF _MODE = 'Apply.E.insert.into.t_zmpo_update_status.AFTER.Apply' THEN
				--	dla AFTER zrob update
					CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`', '', '', '');
				END IF;
			END IF;


			IF _MODE IN ('Update.zm.for.oppo.GUID') THEN
			/*
				CALL _zmng_Update_zrealizowane('Update.zm.for.oppo.GUID', '_oppo_GUID', '', '');
			*/
				SET _oppo_GUID = _ZM_Key;
				DROP TEMPORARY TABLE IF EXISTS `t_zmpo_update_status`;
				CREATE TEMPORARY TABLE `t_zmpo_update_status` 
				SELECT zp.GUID, zp.IdnNg 
				FROM `oppo` p, `zmpo` zp 
				WHERE 
					p.GUID = _oppo_GUID
					AND IFNULL(p.GUIDZM, '') != ''
					AND zp.GUID = p.GUIDZM 
				GROUP BY zp.IdnNg
				;
				CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`', '', '', '');
			END IF;

			IF _MODE IN ('Update.zm.for.oppo.IdnOper') THEN
			/*
				CALL _zmng_Update_zrealizowane('Update.zm.for.oppo.IdnOper', 'IdnOper', '', '');
			*/
				SET _IdnOper = _ZM_Key;
				DROP TEMPORARY TABLE IF EXISTS `t_zmpo_update_status`;
				CREATE TEMPORARY TABLE `t_zmpo_update_status` 
				SELECT zp.GUID, zp.IdnNg 
				FROM `oppo` p, `zmpo` zp 
				WHERE 
					p.IdnOper = _IdnOper
					AND IFNULL(p.GUIDZM, '') != ''
					AND zp.GUID = p.GUIDZM 
				GROUP BY zp.IdnNg
				;
				CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`', '', '', '');
			END IF;
			
			IF _MODE IN ('Update.zm.for.zmpo.GUID') THEN
			/*
				CALL _zmng_Update_zrealizowane('Update.zm.for.zmpo.GUID', '_zmpo_GUID', '', '');
			*/
				SET _zmpo_GUID = _ZM_Key;
				DROP TEMPORARY TABLE IF EXISTS `t_zmpo_update_status`;
				CREATE TEMPORARY TABLE `t_zmpo_update_status` 
				SELECT zp.GUID, zp.IdnNg 
				FROM `zmpo` zp 
				WHERE 
					zp.GUID = _zmpo_GUID
				GROUP BY zp.IdnNg
				;
				CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`', '', '', '');
			END IF;

			IF _MODE IN ('Update.zm.for.zmng.zlecenie.GUID') THEN
			/*
				CALL _zmng_Update_zrealizowane('Update.zm.for.zmng.zlecenie.GUID', '_zmpo_GUID', '', '');
			*/
				SET _IdnNg = _ZM_Key;
				DROP TEMPORARY TABLE IF EXISTS `t_zmpo_update_status`;
				CREATE TEMPORARY TABLE `t_zmpo_update_status` 
				SELECT zp.GUID, zp.IdnNg 
				FROM `zmpo` zp_we, `zmpo` zp
				WHERE 
					zp_we.IdnNg = _IdnNg
					AND
					zp.GUID = zp_we.zamowienieGUID
				GROUP BY zp.IdnNg
				;
				CALL _zmng_Update_zrealizowane('for.`t_zmpo_update_status`', '', '', '');
			END IF;
			
		END$$

		
		DROP PROCEDURE IF EXISTS `_oppoX_Update_from_zmpo`$$
		CREATE DEFINER=`root`@`localhost` PROCEDURE `_oppoX_Update_from_zmpo`(
			IN _MODE VARCHAR(250),
			IN _Key VARCHAR(38),	--	IdnOper/GUID
			IN _Param_A VARCHAR(255),
			IN _Param_B VARCHAR(255),
			IN _Param_C VARCHAR(255),
			IN _Param_D VARCHAR(255),
			IN _Param_E MEDIUMTEXT
		)
		/*
			CALL _oppoX_Update_from_zmpo('oppo_e.IdnOper', IdnOper, '', Typ_Przepisania_Cen = 0.1.2, '', '', '');
			CALL _oppoX_Update_from_zmpo('oppo_e.GUID', GUID, '', Typ_Przepisania_Cen = 0.1.2, '', '', '');
			lub rzadziej dl;a oppo
			CALL _oppoX_Update_from_zmpo('oppo.IdnOper', IdnOper, '', Typ_Przepisania_Cen = 0.1.2, '', '', '');
			CALL _oppoX_Update_from_zmpo('oppo.GUID', GUID, '', Typ_Przepisania_Cen = 0.1.2, '', '', '');
			
		*/
		_S_oppoX_Update_from_zmpo: BEGIN 
		
			DECLARE _ZM_Key VARCHAR(38);
			DECLARE _Typ_Przepisania_Cen INTEGER;
			
			DECLARE CZZ_Zamowienie INTEGER DEFAULT 0;
			DECLARE CZZ_KursDzis INTEGER DEFAULT 1;
			DECLARE CZZ_OdNowa INTEGER DEFAULT 2;
			DECLARE	_SQL_By_GUID, _SQL_oppo_e, _Przelicz BOOLEAN;
			DECLARE _SQLText MEDIUMTEXT;
			

			SET 
				_SQL_By_GUID = _MODE LIKE '%.GUID',
				_SQL_oppo_e = _MODE LIKE '%.oppo_e.%'
			;
			SET 
				_Typ_Przepisania_Cen = IFNULL(_Param_B, 0)
			;
			
			IF _MODE LIKE 'EXE.%' THEN
				SET _SQLText = _Param_E;
				-- SET _Przelicz = _SQL_oppo_e AND _Param_E
				SET _SQLText = REPLACE(_SQLText, '#IdnOper#', IF(_SQL_By_GUID, 'GUID', 'IdnOper'));
				SET _SQLText = REPLACE(_SQLText, '#_IdnOper#', QUOTE(_Key));
				SET _SQLText = REPLACE(_SQLText, '`oppo_e`', IF(_SQL_oppo_e, '`oppo_e`', '`oppo`'));
				SET _SQLText = REPLACE(_SQLText, '#-1#', IF(_SQL_oppo_e, IF(_Typ_Przepisania_Cen = CZZ_Zamowienie, 'IF(p.Ilosc != z.Ilosc, -1, p.Tag)', ' -1'), 'p.Tag'));
				SET _SQLText = REPLACE(_SQLText, '#_Typ_Przepisania_Cen != CZZ_OdNowa#', IF(_Typ_Przepisania_Cen != CZZ_OdNowa, 'TRUE', 'FALSE'));
				-- SET _SQLText = REPLACE(_SQLText, '#_Typ_Przepisania_Cen != CZZ_OdNowa#', 'FALSE');
				SET @SQLText = _SQLText;
				CALL _ExecuteCmd(_SQLText, @Error);
				
				-- set @typC = (_Typ_Przepisania_Cen != CZZ_OdNowa);
				LEAVE _S_oppoX_Update_from_zmpo;
				
				
			END IF;
			
			
			SET _SQLText = 
			"
			UPDATE `oppo_e` p, `zmpo` z
			SET
				p.Lp = z.Lp,
				p.rabat = IF(#_Typ_Przepisania_Cen != CZZ_OdNowa#,  z.rabat, p.rabat),
				p.idnvat =
					IF(p.Rodzaj = @ht.CSpFE AND @session.HT.IR.Wymuszaj_zero_stawke_VAT_dla_STFE,
						2,	--	to stawka 0%
						IF(p.Rodzaj IN (@ht.CSTUE, @ht.CZkIm, @ht.CZTUE) AND (z.idnVat != 5),		--	<> od niepodlega
							2,	--	to stawka 0%
							IF(p.Rodzaj IN (@ht.CZkRU),		--	<> od niepodlega
								5,	--	to stawka niepodlega
								IF((p.idnvat != z.idnvat) AND (z.idnvat IN (2, 3, 5)),		--	<> od 0, zwolniony, niepodlega
									z.idnvat,
									p.idnvat
								)
							)	
						)	
					),
				p.usluga = z.usluga,
				p.towrsymb = z.towrsymb,
				
				p.towrnazwa = 
							-- UstawRokMsc(aSrcPo.FieldByName('towrnazwa').AsString, FNg.FieldByName('DataWystaw').AsDateTime);
						REPLACE(REPLACE(REPLACE(REPLACE(z.towrnazwa, '%WW', _VArStr(@n.MonthNo2)), '%W', _VarStr(@n.MonthLongName)), '%RRRR', _VarStr(@n.YearNo4)), '%RR', _VarStr(@n.YearNo2)),
				p.uwagi = IFNULL(z.uwagi, p.uwagi),
				p.uwagi2 = IFNULL(z.uwagi2, p.uwagi2),
				p.ilosc_L_do_przeliczen = z.ilosc_L_do_przeliczen,
				p.ilosc_M_do_przeliczen = z.ilosc_M_do_przeliczen,
				p.id_przelicznika = z.id_przelicznika,
				-- p.przelicznik = z.przelicznik,
				p.opakowanie_zwrotne = IF(IFNULL(@session.HT.IR.PrzeniesOpakZwZmpoDoOppo, TRUE), z.opakowanie_zwrotne, p.opakowanie_zwrotne),
				
				p.Rodzaj_Przeliczenia = z.Rodzaj_Przeliczenia,
				p.WartnetWal = z.WartnetWal,
				p.OsobaGuid = z.OsobaGuid,
				p.jednostka = z.jednostka,
				p.RecepturaGuid = z.RecepturaGuid,
				p.oplata_produktowa = z.oplata_produktowa,
				p.info = z.info,	 -- ????
				p.info2 = z.info2,
				p.info3 = z.info3,
				p.info4 = z.info4,
				p.ilewopakowaniu = z.ilewopakowaniu,
				-- 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.tag = #-1#	--	aby przeliczyl
				
			WHERE
				p.#IdnOper# = #_IdnOper#
				AND
				z.GUID = p.GUIDzm
			;
			"
			;		
			
			CALL _oppoX_Update_from_zmpo(CONCAT('EXE.', _MODE), _Key, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			
			SET @_SQLText_2 = @_SQLText;
			SET _SQLText = 
			"
			UPDATE `oppo_e` p
			SET
				p.Rodzaj_Przeliczenia = 
				--	Gdy drukarka fiskalna i realizujemy tu paragon lub Fakt. imienna (uproszcz.) to ustaw rodzaj przeliczenia na 3 (Fiskalny)
					IF(IFNULL(@session.HT.IR.DrukarkaFiskalna, FALSE) AND @n.Rodzaj IN (0, 2),
						3,	--	_BN_CN_WN - fiskalne z brutto->netto  (fiskalne)
						p.Rodzaj_Przeliczenia
					)
			WHERE
				p.#IdnOper# = #_IdnOper#
			;
			"
			;		
			CALL _oppoX_Update_from_zmpo(CONCAT('EXE.', _MODE), _Key, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			
			IF (_Typ_Przepisania_Cen != CZZ_OdNowa) THEN
				SET _SQLText = 
				"
				UPDATE `oppo_e` p, `zmpo` z
				SET
					p.idncennik = p.idncennik,
					p.cenanet = 
						IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 	-- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
							z.cenanet,
							z.cenanet
						),	
					p.cenabrt = 
						IF(p.Rodzaj_Przeliczenia IN (3,4,5,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
						),
					p.tag = #-1#	--	aby przeliczyl
				WHERE
					p.#IdnOper# = #_IdnOper#
					AND
					z.GUID = p.GUIDzm
				;
				"
				;		
				CALL _oppoX_Update_from_zmpo(CONCAT('EXE.', _MODE), _Key, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			
			END IF;
				
			IF (_Typ_Przepisania_Cen = CZZ_Zamowienie) THEN
				SET _SQLText = 
				"
				UPDATE `oppo_e` p, `zmpo` z
				SET
					p.kurs = p.kurs,
					p.cenanet = 
						IF(p.Rodzaj_Przeliczenia IN (3,4,5),	 -- CRodzaj_Przeliczenia_Brutto_Netto, CRodzaj_Przeliczenia_Brutto_Netto2, CRodzaj_Przeliczenia_CenaBrutto_Netto
							z.cenanet,
							z.cenanet
						),	
					p.cenabrt = 
						IF(p.Rodzaj_Przeliczenia IN (3,4,5,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
						),
					p.tag = #-1#	--	aby przeliczyl
				WHERE
					p.#IdnOper# = #_IdnOper#
					AND
					z.GUID = p.GUIDzm
				;
				"
				;		
				CALL _oppoX_Update_from_zmpo(CONCAT('EXE.', _MODE), _Key, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
			
			END IF;

			IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
		-- UWAGA !!!!!!!!tu w Delphi jest {$IFDEF PrzepiszKatColeZPozycjiZM}
				SET _SQLText = 
				"
				UPDATE `oppo_e` p, `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.tag = #-1#	--	aby przeliczyl
				WHERE
					p.#IdnOper# = #_IdnOper#
					AND
					z.GUID = p.GUIDzm
				;
				"
				;		
				CALL _oppoX_Update_from_zmpo(CONCAT('EXE.', _MODE), _Key, _Param_A, _Param_B, _Param_C, _Param_D, _SQLText);
				
			END IF;
			
		END$$
		
DROP PROCEDURE IF EXISTS `_ZAM_Zamknij`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ZAM_Zamknij`(
	IN _MODE VARCHAR(250),
	IN _Key VARCHAR(38),
	IN _Param_A VARCHAR(255),	--	dla np. CDG to powod_niezrealizowania
	IN _Param_B VARCHAR(255),	
	IN _Param_C VARCHAR(255)
)
/*
	CALL _ZAM_Zamknij('', IdnNg, '', '', '');
	
wychodzi na to że tak to idzie:
  CZM_Status_NONE             = $0000; // 'Aktywne'
  CZM_Status_ZREALIZOWANE     = $0002;
  CZM_Status_ANULOWANA        = $0004;
  CZM_Status_ZAMKNIETE        = $0008;
  CZM_Status_WYSLANE          = $0010; 
  CZM_Status_PAKOWANE         = $0020;	
*/
S__ZAM_Zamknij: BEGIN
	IF _Param_C = 'NEW' THEN
	--	dla np. CDG _Param_A to powod_niezrealizowania
		SET 
			@.n.powod_niezrealizowania = _VarInt(NULLIF(_Param_A, ''))
		;
	--	wstępne Update zm	
		CALL _ZM_Update_Realizacja('UPDATE.for.zmng', _Key, '', '');
	--	zgrupowane twoary z poz. tego zam.	
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_towrpo`;
		CREATE TEMPORARY TABLE `t_zmpo_towrpo` (
			`idn` INT(11) NOT NULL,
			`idntowr` VARCHAR(38) NOT NULL DEFAULT '',
			`magazyn` INT(11) NOT NULL DEFAULT '0',
			`d_zamowiono_oo` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`d_zamowiono` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`d_zarezerwowano` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			PRIMARY KEY (`idn`),
			UNIQUE KEY `idntowr_2` (`idntowr`,`magazyn`)
		)
		;
		INSERT IGNORE INTO `t_zmpo_towrpo`
		SELECT
			-- COUNT(*),
			MAX(t.IDN) AS Idn,
			p.idntowr, p.idnmagazyn,
			SUM(IF(p.magtyp = 2, p.ilosc - p.zrealizowano, 0)) AS d_zamowiono_oo,
			SUM(IF(p.magtyp = 0, p.ilosc - p.zrealizowano, 0)) AS d_zamowiono,
			SUM(IF(p.magtyp = 2 AND p.reserve, p.ilosc - p.zrealizowano, 0)) AS d_zarezerwowano
		FROM `zmpo` p, `TowrPo` t 
		WHERE
			p.idnng = _Key
			AND p.ilosc > p.zrealizowano
			AND p.idnmagazyn = t.magazyn 
			AND p.idntowr = t.idntowr 
		GROUP BY p.idntowr, p.idnmagazyn
		ORDER BY Idn
		;
		--	SELECT * FROM `t_zmpo_towrpo`;
		UPDATE `TowrPo` t, `t_zmpo_towrpo` tt 
		SET 
			t.zamowiono_oo = t.zamowiono_oo - tt.d_zamowiono_oo,
			t.zamowiono = t.zamowiono - tt.d_zamowiono,
			t.zarezerwowano = t.zarezerwowano - tt.d_zarezerwowano
		WHERE 
			t.IDN = tt.IDN
		;
		UPDATE `zmpo` p
		SET 
			p.ilosc = GREATEST(p.zrealizowano, 0)
		WHERE 
			p.idnng = _Key
			AND p.ilosc <> p.zrealizowano
		;
		/*
		UPDATE `zmng` n
		SET
			n.createdfrom_GUID = (@.n.createdfrom_GUID := n.createdfrom_GUID),
			n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
			n.IlepozZreal = IFNULL((SELECT SUM(IFNULL(p.zrealizowano >= p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja), 0)
		WHERE
			n.GUID = _Key
			AND n.zamwpermn = 0
		;	
		*/
		--	Update zm	
		--	CALL _ZM_Update_Realizacja('UPDATE.for.zmng', _Key, '', '');
		SET @.n.createdfrom_GUID = NULL;
		UPDATE `zmng` n 
		SET 
			n.powod_niezrealizowania = (@.n.powod_niezrealizowania := 
				IFNULL(@.n.powod_niezrealizowania, n.powod_niezrealizowania)
			),
			n.createdfrom_GUID = (@.n.createdfrom_GUID := NULLIF(n.createdfrom_GUID, '')),
			/*
			n.status = 
				IF(@session.globals.Owner IN ('CDG', 'MPGK'),
					IF(_MODE != 'ANULUJ', 8, 4), 
					-- było	IF(@.n.powod_niezrealizowania = 0, 8, 4), 
					IF(_MODE != 'ANULUJ', 8, 4)
				), 
			-- n.uwagi = CONCAT(IF(_MODE != 'ANULUJ', 'ZAMKNIETO ', 'ANULOWANO '), LEFT(NOW(), 20), ' ', (n.uwagi)) 
			*/
			n.uwagi =
    CASE WHEN @session.globals.Owner IN ('MARINE') THEN n.uwagi
    ELSE
    CONCAT_WS(' ',
				IF(_MODE != 'ANULUJ', 'ZAMKNIĘTO', 'ANULOWANO'), 
				LEFT(NOW(), 20), 
				n.uwagi
			 )
			 END
		WHERE 
			n.GUID = _Key
			-- AND n.IlepozZreal >= n.ilepoz
		;
	--	Update zm	
		CALL _ZM_Update_Realizacja('UPDATE.for.zmng', _Key, '', '');
	--	Byc moze to zamowienie dotyczy oferty (czyli realizuje oferte)
		IF @.n.createdfrom_GUID IS NOT NULL THEN
			CALL oper_Delta_Oferty_Update('update.from.zmng', '', _Key, '', '', '');
		END IF;	
		LEAVE S__ZAM_Zamknij;
	END IF;
	
	
	
	UPDATE `TowrPo` t, `zmpo` p 
	SET 
		t.zamowiono_oo = t.zamowiono_oo - IF(p.magtyp = 2, p.ilosc - p.zrealizowano, 0),
		t.zamowiono = t.zamowiono - IF(p.magtyp = 0, p.ilosc - p.zrealizowano, 0),
		t.zarezerwowano = t.zarezerwowano - IF(p.magtyp = 2 AND p.reserve, p.ilosc - p.zrealizowano, 0)
	WHERE 
		p.idnng = _Key
		AND p.idnmagazyn = t.magazyn 
		AND p.idntowr = t.idntowr 
		AND p.ilosc > p.zrealizowano
	;

	UPDATE `zmpo` p
	SET 
		p.ilosc = p.zrealizowano 
	WHERE 
		p.idnng = _Key
		AND p.ilosc <> p.zrealizowano
	;
	SET @.n.createdfrom_GUID = NULL;
	UPDATE `zmng` n
	SET
		n.createdfrom_GUID = (@.n.createdfrom_GUID := n.createdfrom_GUID),
		n.ilepoz = ((SELECT COUNT(*) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja)),
		n.IlepozZreal = IFNULL((SELECT SUM(IFNULL(p.zrealizowano >= p.ilosc, 0)) FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.wersja = n.wersja), 0)
	WHERE
		n.GUID = _Key
		AND n.zamwpermn = 0
	;	
	
	UPDATE `zmng` z 
	SET 
		z.status = 
			IF(@session.globals.Owner IN ('CDG', 'MPGK'),
				IF(z.powod_niezrealizowania = 0, 8, 4), 
				IF(_MODE != 'ANULUJ', 8, 4)
			), 
		-- z.uwagi = CONCAT(IF(_MODE != 'ANULUJ', 'ZAMKNIETO ', 'ANULOWANO '), LEFT(NOW(), 20), ' ', (z.uwagi)) 
		z.uwagi =
   CASE WHEN @session.globals.Owner IN ('MARINE') THEN z.uwagi
   ELSE
   CONCAT_WS(' ',
			IF(_MODE != 'ANULUJ', 'ZAMKNIETO', 'ANULOWANO'), 
			LEFT(NOW(), 20), 
			z.uwagi
		 )
		 END
	WHERE 
		z.guid = _Key
	;
--	Byc moze to zamowienie dotyczy oferty (czyli realizuje oferte)
	IF @.n.createdfrom_GUID IS NOT NULL THEN
		CALL oper_Delta_Oferty_Update('update.from.zmng', '', _Key, '', '', '');
	END IF;
	

END$$


DROP PROCEDURE IF EXISTS `_zmng_Realizuj_skaner`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_zmng_Realizuj_skaner`(
-- 'Realizacja.ZM.from.skaner'
	IN _MODE VARCHAR(250),
	IN _wyjazdGUID VARCHAR(250),
	IN _ZM_Key VARCHAR(38),
	IN _IdnOper VARCHAR(38),
	IN _Rodzaj INTEGER,
	IN _Rodzaj_typ INTEGER,		
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,		
	IN _Magazyn2 INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
	IN _Input_GUID VARCHAR(255),
	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _DataWystaw VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
S_zmng_Realizuj_skaner: BEGIN 
/*
	CALL _zmng_Realizuj_skaner('', )
*/

--	Czy jest juz dok. realizujacy?? Jesli tak to wychodzimy
	DECLARE _IdnNg VARCHAR(38);
	DECLARE _Typ_Przepisania_Cen INTEGER DEFAULT 0;  	
	SET
		_IdnNg = _ZM_Key
	;
/*	
	IF _IdnOper = '' THEN
		SET _IdnOper = CONCAT('WZ', MD5(CONCAT(_wyjazdGUID, _IdnNg)));
	END IF;
	SET
		@.EXISTS.Doc.Realizujacy = EXISTS(SELECT IDN FROM `opng` WHERE GUID = _IdnOper)
	;
	
	DROP TEMPORARY TABLE IF EXISTS `t_skaner.zmpo`;
	CREATE TEMPORARY TABLE  `t_skaner.zmpo`
		SELECT 
			p.* 
		FROM `zmpo` p
		WHERE
			p.IdnNG = _IdnNg
			AND
			(p.Ilosc - p.zrealizowano) > 0
			AND
			IFNULL(p.IdnTowr, '') != ''
			AND
			p.Usluga = 0
			AND
			p.commision_guid = _wyjazdGUID
		ORDER BY p.LP	
	;
	SELECT 
		COUNT(*) FROM `t_skaner.zmpo` 
	INTO 
		@.Count.t_skaner.zmpo
	;
	IF @.Count.t_skaner.zmpo = 0 THEN
		LEAVE S_zmng_Realizuj_skaner;
	END IF;

--	Tutaj na pewno mamy `t_skaner.zmpo`  niepusta!!!!	
--	Zatem Gdy ... nie istnieje to wstaw a gdy istnieje to edit
	IF NOT @.EXISTS.Doc.Realizujacy THEN
	--	nie istnieje to wstaw a gdy istnieje to edit
		SELECT
			z.KontrGUID, z.MagazynWys, z.nrzamw
		FROM zmng z
		WHERE
			z.GUID = _IdnNg
		INTO 
			_KontrGUID, _ZMagazynu, @.z.nrzamw
		;
	
		CALL _zmng_Realizuj('', _IdnNg, _IdnOper, _Rodzaj, _Rodzaj_typ, 
			_KontrGUID,
			_Magazyn, _Magazyn2, 
			_Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, 0, _Param_A, _Param_B, _Param_C)
		;
		aaaa
		UPDATE `opng_e` n 
		SET 
			n.NrDokMag = 'PAKOWANIE do ZAM',
			n.Tymczasowa = @_Tymczasowa,
			n.ZMagazynu = _ZMagazynu,
			n.wyjazdGUID = _wyjazdGUID,
			n.info1 = @.z.nrzamw
		WHERE 
			n.GUID = _IdnOper
		;
		
	ELSE
	--	istnieje to wstaw brakujace ... ale...
	--	usun z listy wejsciowej istniejace
		DELETE tp FROM `oppo` p, `t_skaner.zmpo` tp
		WHERE
			p.IdnOper = _IdnOper
			AND p.GUIDZM = tp.GUID
		;
		DELETE tp FROM `oppo` p, `t_skaner.zmpo` tp
		WHERE
			p.IdnOper = _IdnOper
			AND p.GUID = CONCAT('WZ', MD5(CONCAT(_IdnOper, tp.GUID)))
			-- AND p.GUIDZM = tp.GUID
		;
	
		SELECT 
			COUNT(*) FROM `t_skaner.zmpo` 
		INTO 
			@.Count.t_skaner.zmpo
		;
		IF @.Count.t_skaner.zmpo = 0 THEN
			LEAVE S_zmng_Realizuj_skaner;
		END IF;

		CALL Opng_E_init('EDIT', _IdnOper, @session.Registration.UserGUID, '', '');
		CALL Opng_E_Run('ALL', _IdnOper, '', '', '');
		SET _Typ_Przepisania_Cen = IFNULL(
			(SELECT IFNULL(i_Typ_Przepisania_Cen, 0) FROM `ng_e_rec` WHERE GUID = _IdnOper LIMIT 0),
			0
		);
		CALL oppo_E_Let_Insert('From.zmng.skaner', '', _IdnOper, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
		CALL opng_E_Let('ApplyAndClear', _IdnOper, '', '1');
	END IF;
*/	
END$$


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

rozne: 
datasprzed, datawystaw, datawplywu (roznica 5 dni)
dataplatnosci (roznica 14 dni)
dataplatnosci_oczekiwana (roznica 14 dni)	
dzial ( 0 a jest 1)
dotyczy ( inne )
data_vat (0000-00-00)
kolumnaKPR (0 - 7)
	
	
pozycje luzik
datasprzed 	
grupuj
iloscdo
*/
S_zmng_Realizuj: BEGIN 
	SET @watch = 'IN';

	CALL _Session_Refresh_Variables('', '', '');
	CALL _Globals_Get('Realizuj_ZM_w_TE', @session.globals.Realizuj_ZM_w_TE, IF(@session.globals.Owner IN ('KONKOL'), TRUE, FALSE));

	IF _MODE LIKE 'WIZ.%' THEN
		IF _MODE LIKE 'WIZ.A.%' THEN
			IF _MODE = 'WIZ.A.INIT' THEN
				SET @Params = 
					CONCAT_WS('&', 
						'&', 
						IF(_Rodzaj < 0, NULL, CONCAT('Rodzaj=', _Rodzaj)), 
						IF(_Rodzaj_typ < 0, NULL, CONCAT('Rodzaj_typ=', _Rodzaj_typ)), 
						CONCAT('KontrGUID=', NULLIF(_KontrGUID, '')), 
						IF(_Magazyn <= 0, NULL, CONCAT('zmagazynu=', _Magazyn)), 
						IF(_Magazyn2 <= 0, NULL, CONCAT('domagazynu=', _Magazyn2)), 
						CONCAT('Tymczasowa=', _Tymczasowa), 
						CONCAT('Waluta=', _Waluta), 
						CONCAT('AreaGUID=', NULLIF(_AreaGUID, '')), 
						CONCAT('datawystaw=', NULLIF(_DataWystaw, '')), 
						CONCAT('Typ_Przepisania_Cen=', _Typ_Przepisania_Cen), 
			-- IN _OsobaGUID VARCHAR(38), 
						'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji',
						'AutoNum=1', 
						'&'
					)
				;
				CALL C_HT_OPZM_Proc('NEW', 'Realizacja.ZM.From.zmng', 'OP', 'M', _Key, _ZM_Key, '', '', '', '' , @Params);
				SET _Key = @_IdnOper;	-- do zwrotki
				UPDATE `oppo_m` p
				SET
					p.Tag = 1
				WHERE
					p.IdnOper = @_IdnOper
				;
			END IF;
			
		-- a na koniec ... 'WIZ.A.APPLY' albo 'WIZ.A.APPLY.and.CLEAR'
			IF _MODE = 'WIZ.A.WORLD.M->E' THEN
				SET @_IdnOper = _Key;
			--	wrzuć do świata E zatem
			--	najpierw wyczysc to co tam jest
				DELETE p FROM `oppo_e` p 
				WHERE
					p.IdnOper = @_IdnOper
					AND p.IDN = 0	--	na wszekli wypadak sie zabezpieczam gdyby były tu pozycje wczytane ze swiata real 
				;
			--	teraz przepisz do świata E - ale tylko zaznaczone (Tag = 0)
				INSERT IGNORE INTO `oppo_e`
				SELECT	
					p.*
				FROM `oppo_m` p
				WHERE
					p.IdnOper = @_IdnOper
					AND p.Tag = 0
				;
			--	na koniec wyczyść
				CALL C_HT_OPZM('CLEAR', '', 'OP', 'M', @_IdnOper, '', '', '', '' ,'', '');
			END IF;
		
			IF _MODE LIKE 'WIZ.A.APPLY%' THEN
				SET @_IdnOper = _Key;
				DELETE p FROM `oppo_m` p
				WHERE
					p.IdnOper = @_IdnOper
					AND p.Tag = 1
				;
				CALL C_HT_OPZM('APPLY', '', 'OP', 'M', @_IdnOper, '', '', '', '' ,'', '');
			END IF;
			
		-- albo 'WIZ.A.CLEAR' albo 'WIZ.A.CANCEL'
			IF _MODE LIKE 'WIZ.A.%CLEAR' OR _MODE LIKE 'WIZ.A.%CANCEL' THEN
				SET @_IdnOper = _Key;
				CALL C_HT_OPZM('CLEAR', '', 'OP', 'M', @_IdnOper, '', '', '', '' ,'', '');
			END IF;
		END IF;

		IF _MODE LIKE 'WIZ.B.%' THEN
		/* ***********************************************************************************************************************
			WIZARD do 2-3 etapowej realizacji (np. TRANSBUD)
			1. otwarcie listy pozycji do zacheckowania w 2 wariantach
				- niezrealizowane pozycje z IdnNg 'WIZ.B.WE.INIT.zmpo<-1.IdnNg', 
				- wszystkie niezrealizowane pozycje kontrahenta z IdnNg 'WIZ.B.WE.INIT.zmpo<-n.IdnNg'
				CALL _zmng_Realizuj('WIZ.B.WE.INIT.`t_GUI_WE_zmpo`<-1.IdnNg', @IdnGUID, @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', @Params);
				UWAGA w @Params możesz ustawic inicjalny Tag np. "tag=1&"
			2. pobieramy sobie zestaw do cds-a jako 
				SELECT tp.* FROM `t_GUI_WE_zmpo` tp
				albo lepiej!!!!
				CALL _zmng_Realizuj('WIZ.B.WE.SELECT.`t_GUI_WE_zmpo`', '', @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', @Params);
			3. w wizardzie gdy juz zacheck-ujemy co trzeba mamy DWIE możliwości
				a) w EXE mozna pominac ustawiane kazdego rekordu jesli!!! robimy APPLY wprost z cdsa z selectem z `t_GUI_WE_zmpo` na polu tag 
				ale gdy zestaw danych pobierany jest call-em z  `t_GUI_WE_zmpo` 
				to 
				b) musimy uzyc sekwencyjnego checkowania (pole GUID = xxx, pole tag = 0/1
				UWAGA w sekwencyjnym przed sekwencja musimy rekreowac tymczasówke która nie istnieje czyli
				zawolac ponownie CALL _zmng_Realizuj('WIZ.B.WE.INIT.`t_GUI_WE_zmpo`<-1.IdnNg', @IdnGUID, @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
				a wtedy N x wołamy
				CALL _zmng_Realizuj('WIZ.B.WE.UPDATE.`t_GUI_WE_zmpo`.SET.Tag', '', @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', @Params);
				UWAGA w @Params musimy podać GUID i wartośc tag-a 
				"GUID=xxx&tag=1&"
					Przykład - po zaczekowaniu
					CALL _zmng_Realizuj('WIZ.B.WE.INIT.`t_GUI_WE_zmpo`<-1.IdnNg', @IdnGUID, @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
					while not eof 
						...
						Params = format("GUID=%s&tag=%d&", [...]
						CALL _zmng_Realizuj('WIZ.B.WE.UPDATE.`t_GUI_WE_zmpo`.SET.Tag', '', @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', Params);
			4. realizacja pozycji (nie pisze zamowienia bo to moze byc wiele zamowien!!!)
				CALL _zmng_Realizuj('WIZ.B.WE.Realizuj.`t_GUI_WE_zmpo`', ..jak dotychczas...);
				lub
				CALL _zmng_Realizuj('WIZ.B.WE.Realizuj.`t_GUI_WE_zmpo_EDIT`', ..jak dotychczas...);
			KONIEC	
		************************************************************************************************************************/
set @.watch = '000';		
		
			IF _MODE IN ('WIZ.B.WE.INIT.`t_GUI_WE_zmpo`<-1.IdnNg', 'WIZ.B.WE.INIT.`t_GUI_WE_zmpo`<-n.IdnNg') THEN
			/* ***********************************************************************************************************************
				Pobieranie `t_GUI_WE_zmpo`
				otwarcie listy pozycji do zacheckowania w 2 wariantach
					- niezrealizowane pozycje z IdnNg 'WIZ.B.WE.INIT.zmpo<-1.IdnNg', 
					- wszystkie niezrealizowane pozycje kontrahenta z IdnNg 'WIZ.B.WE.INIT.zmpo<-n.IdnNg'
				Patrz 
					CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'INIT.`t_GUI_WE_zmpo`<-1.IdnNg', 'OP', 'TE', '', @_IdnNg, '', '', '', '' , @Params);
					CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'INIT.`t_GUI_WE_zmpo`<-n.IdnNg', 'OP', 'TE', '', @_IdnNg, '', '', '', '' , @Params);
				
			************************************************************************************************************************/
				CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', REPLACE(_MODE, 'WIZ.B.WE.', ''), 'OP', 'TE', '', _ZM_Key, '', '', '', '' , @Params);
				-- CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'INIT.`t_GUI_WE_zmpo`<-N.IdnNg', 'OP', 'TE', '', _ZM_Key, '', '', '', '' , @Params);
			END IF;
			
			IF _MODE IN ('WIZ.B.WE.SELECT.`t_GUI_WE_zmpo`') THEN
				CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'SELECT.`t_GUI_WE_zmpo`', 'OP', 'TE', '', '', '', '', '', '' , @Params);
			END IF;
			
			IF _MODE IN ('WIZ.B.WE.UPDATE.`t_GUI_WE_zmpo`.SET.Tag') THEN
			/* ***********************************************************************************************************************
				Checkowanie pozycji do realizacji w `t_GUI_WE_zmpo` ...
				W EXE mozna to pominac jesli!!! robimy APPLY wprost z cdsa z selectem z `t_GUI_WE_zmpo` 
				ale gdy zestaw danych pobierany jest call-em z  `t_GUI_WE_zmpo` 
				to musimy uzyc sekwencyjnego checkowania (pole GUID = xxx, pole tag = 0/1
				UWAGA w sekwencyjnym przed sekwencja musimy rekreowac tymczasówke która nie istnieje czyli
				zawolac ponownie CALL _zmng_Realizuj('WIZ.B.WE.INIT.`t_GUI_WE_zmpo`<-1.IdnNg', @IdnGUID, '', -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
			************************************************************************************************************************/
				SET @Params = _Param_C;
				SET @Params.x = _Param_C;
				CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'UPDATE.`t_GUI_WE_zmpo`.1.rec', 'OP', 'TE', '', '', '', '', '', '' , @Params);
			END IF;
			
			IF _MODE IN ('WIZ.B.WE.Realizuj.`t_GUI_WE_zmpo`', 'WIZ.B.WE.Realizuj.`t_GUI_WE_zmpo_EDIT`') THEN
				SET @Params.x = _Param_C;
				SET @Params = IFNULL(NULLIF(_Param_C, ''),
					CONCAT_WS('&', 
						'&', 
						IF(_Rodzaj < 0, NULL, CONCAT('Rodzaj=', _Rodzaj)), 
						IF(_Rodzaj_typ < 0, NULL, CONCAT('Rodzaj_typ=', _Rodzaj_typ)), 
						CONCAT('KontrGUID=', NULLIF(_KontrGUID, '')), 
						IF(_Magazyn <= 0, NULL, CONCAT('zmagazynu=', _Magazyn)), 
						IF(_Magazyn2 <= 0, NULL, CONCAT('domagazynu=', _Magazyn2)), 
						CONCAT('Tymczasowa=', _Tymczasowa), 
						CONCAT('Waluta=', _Waluta), 
						CONCAT('AreaGUID=', NULLIF(_AreaGUID, '')), 
						CONCAT('datawystaw=', NULLIF(_DataWystaw, '')), 
						CONCAT('Typ_Przepisania_Cen=', _Typ_Przepisania_Cen), 
			-- IN _OsobaGUID VARCHAR(38), 
						'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji',
						'AutoNum=1', 
						'&'
					)
				)
				;
				IF _MODE = 'WIZ.B.WE.Realizuj.`t_GUI_WE_zmpo_EDIT`' THEN
				--	przepisz do `t_GUI_WE_zmpo` z `t_GUI_WE_zmpo_EDIT` 
					UPDATE `t_GUI_WE_zmpo` tp, `t_GUI_WE_zmpo_EDIT` t
					SET 
						tp.Tag = t.Tag
					WHERE
						tp.GUID = t.GUID
					;
				END IF;
				
				-- LEAVE S_zmng_Realizuj;
				-- SET _Key = _Get_GUID_xxx('IdnOper<-NxIdnNg', '', '', '', '', '', '')
				
				CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'Realizacja.`t_GUI_WE_zmpo`', 'OP', 'TE', _Key, '', '', '', '', '' , @Params);
				LEAVE S_zmng_Realizuj;
				SET _Key = @_IdnOper;	-- do zwrotki
			END IF;

			IF _MODE IN ('WIZ.B.WE.UPDATE.`t_GUI_WE_zmpo`.SET.ANY') THEN
			/* ***********************************************************************************************************************
				Edycja przed realizacja
				W ost. param. jest @Params
				"GUID=????&nrseryjny_lista=NNN&info=infoxx&info2=infoxx&info3=infoxx&info4=infoxx&nr_zmiany=AAA&"
				CALL _zmng_Realizuj('WIZ.B.WE.UPDATE.`t_GUI_WE_zmpo`.SET.ANY', '', @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', Params);
			************************************************************************************************************************/
				SET @Params = _Param_C;
				SET @Params.x = _Param_C;
				-- CALL C_HT_OPZM_Proc('GUI.Realizacja.ZM', 'UPDATE.`t_GUI_WE_zmpo`.1.rec', 'OP', 'TE', '', '', '', '', '', '' , @Params);
				SET
					@.t_GUI_WE_zmpo.GUID = IFNULL(_Params2('_FetchParams', '&', @Params, 'GUID', ''), 0),
					@.t_GUI_WE_zmpo.Ilosc = IFNULL(_Params2('_FetchParams', '&', @Params, 'Ilosc', ''), 0),
					@.t_GUI_WE_zmpo.nrseryjny_lista = IFNULL(_Params2('_FetchParams', '&', @Params, 'nrseryjny_lista', ''), 0),
					@.t_GUI_WE_zmpo.info = IFNULL(_Params2('_FetchParams', '&', @Params, 'info', ''), 0),
					@.t_GUI_WE_zmpo.info2 = IFNULL(_Params2('_FetchParams', '&', @Params, 'info2', ''), 0),
					@.t_GUI_WE_zmpo.info3 = IFNULL(_Params2('_FetchParams', '&', @Params, 'info3', ''), 0),
					@.t_GUI_WE_zmpo.info4 = IFNULL(_Params2('_FetchParams', '&', @Params, 'info4', ''), 0),
					@.t_GUI_WE_zmpo.nr_zmiany = IFNULL(_Params2('_FetchParams', '&', @Params, 'nr_zmiany', ''), 0),
					@.t_GUI_WE_zmpo.komentarz = IFNULL(_Params2('_FetchParams', '&', @Params, 'komentarz', ''), 0)
				; -- Nr seryjny lista ,Nrzmiany ,info,info2,info3,info4,
				-- UPDATE `t_GUI_WE_zmpo` tp
				UPDATE `zmpo` tp
				SET 
				-- 	tp.Ilosc = @.t_GUI_WE_zmpo.Ilosc,
					tp.nrseryjny_lista = @.t_GUI_WE_zmpo.nrseryjny_lista,
					p.data_dod_1 = IFNULL(@.t_GUI_WE_zmpo, '0000-00-00 00:00:00'),
					p.data_dod_2 = IFNULL(@.t_GUI_WE_zmpo, '0000-00-00 00:00:00'),
					p.info = IFNULL(@.t_GUI_WE_zmpo.info, ''),
					p.info2 = IFNULL(@.t_GUI_WE_zmpo.info2, ''),
					p.info3 = IFNULL(@.t_GUI_WE_zmpo.info3, ''),
					p.info4 = IFNULL(@.t_GUI_WE_zmpo.info4, ''),
					p.nr_zmiany = @.t_GUI_WE_zmpo.nr_zmiany,
					p.komentarz = @.t_GUI_WE_zmpo.komentarz
				WHERE
					tp.GUID = @.t_GUI_WE_zmpo.GUID
				;
			END IF;
			
			IF _MODE IN ('WIZ.B.WE.UPDATE.`zmpo`<-`t_GUI_WE_zmpo`') THEN
			/* ***********************************************************************************************************************
				Apply polegajacy na przepisaniu do `zmpo`<-`t_GUI_WE_zmpo`
				CALL _zmng_Realizuj('WIZ.B.WE.UPDATE.`zmpo`<-`t_GUI_WE_zmpo`', '', @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', Params);
			************************************************************************************************************************/
				UPDATE `zmpo` p, `t_GUI_WE_zmpo` twe
				SET 
				-- 	tp.Ilosc = @.t_GUI_WE_zmpo.Ilosc,
					p.nrseryjny_lista = twe.nrseryjny_lista,
					p.data_dod_1 = IFNULL(twe.data_dod_1, '0000-00-00 00:00:00'),
					p.data_dod_2 = IFNULL(twe.data_dod_2, '0000-00-00 00:00:00'),
					p.data_dod_3 = IFNULL(twe.data_dod_3, '0000-00-00 00:00:00'),
					p.info = IFNULL(twe.info, ''),
					p.info2 = IFNULL(twe.info2, ''),
					p.info3 = IFNULL(twe.info3, ''),
					p.info4 = IFNULL(twe.info4, ''),
					p.nr_zmiany = twe.nr_zmiany,
					p.komentarz = twe.komentarz
				WHERE
					p.GUID = twe.GUID
				;
			END IF;
			
			IF _MODE IN ('WIZ.B.WE.UPDATE.`zmpo`<-`t_GUI_WE_zmpo_EDIT`') THEN
			/* ***********************************************************************************************************************
				Apply polegajacy na przepisaniu do `zmpo`<-`t_GUI_WE_zmpo_EDIT`
				CALL _zmng_Realizuj('WIZ.B.WE.UPDATE.`zmpo`<-`t_GUI_WE_zmpo_EDIT`', '', @nothing, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', Params);
			************************************************************************************************************************/
				UPDATE `zmpo` p, `t_GUI_WE_zmpo_EDIT` twe
				SET 
				-- 	tp.Ilosc = @.t_GUI_WE_zmpo.Ilosc,
					p.nrseryjny_lista = twe.nrseryjny_lista,
					p.data_dod_1 = IFNULL(twe.data_dod_1, '0000-00-00 00:00:00'),
					p.data_dod_2 = IFNULL(twe.data_dod_2, '0000-00-00 00:00:00'),
					p.data_dod_3 = IFNULL(twe.data_dod_3, '0000-00-00 00:00:00'),
					p.info = IFNULL(twe.info, ''),
					p.info2 = IFNULL(twe.info2, ''),
					p.info3 = IFNULL(twe.info3, ''),
					p.info4 = IFNULL(twe.info4, ''),
					p.nr_zmiany = twe.nr_zmiany,
					p.komentarz = twe.komentarz
				WHERE
					p.GUID = twe.GUID
				;
			END IF;
			


		END IF;
		
		
		LEAVE S_zmng_Realizuj;
	END IF;
	
	IF _MODE LIKE '%.ZLEC%' THEN
	/* ***********************************************************************************************************************
		ZLECENIA PROD. Calkowicie po nowemu w TE
	************************************************************************************************************************/
		SET 
			@.OPZM._MODE = SUBSTR(_MODE, 1, LOCATE('.ZLEC', _MODE) - 1),
			_Rodzaj = IF(_MODE LIKE '%ZLEC->RW%', 11, 13), -- 11: MG RW, 13: MG PW
			@.ZLEC.magtyp = IF(_MODE LIKE '%ZLEC->RW%', 2, 0), -- dla RW rozch.(2) dla PW przych. (0)
			/*
			@.OPZM.IN_MODE =	
				IF(_MODE LIKE '%ZLEC->%.From.%`t_GUI_WE_zmpo`', 'Realizacja.ZM.From.zmng.`t_GUI_WE_zmpo`',
				IF(_MODE LIKE '%ZLEC->%.From.%zmng.skaner', 'Realizacja.ZM.From.zmng.skaner', 
				IF(_MODE LIKE '%ZLEC->%.From.%`t_zlecprod.zmpo`', 'Realizacja.ZM.From.`t_zlecprod.zmpo`'
				IF(_MODE LIKE '%ZLEC->%.From.%`t_GUI_WE_zmpo', 'Realizacja.ZM.From.`t_GUI_WE_zmpo`,
				'Realizacja.ZM.From.zmng',
			*/
			@.OPZM._MODE.Ex =	
				IF(_MODE LIKE '%ZLEC->%.From.%`t_zlecprod.zmpo`',
					'`t_zlecprod.zmpo`',
					'`zmng`'
				)
		;
		IF @.OPZM._MODE.Ex = '`zmng`' THEN
		--	Utwórz `t_zlecprod.zmpo` bo tylko poz. zgodne do MagTyp ida do realizacji
			DROP TEMPORARY TABLE IF EXISTS `t_zlecprod.zmpo`;
			CREATE TEMPORARY TABLE `t_zlecprod.zmpo`
				SELECT 
					-- zp.GUID, zp.magtyp, zp.ilosc, zp.`zrealizowano`, 
					zp.*
				FROM zmpo zp
				WHERE
					zp.IdnNg = _ZM_Key
					AND zp.Rodzaj = 73
					AND zp.magtyp = @.ZLEC.magtyp
			;
		END IF;
		SET @Params = 
			CONCAT_WS('&', 
				'&', 
				IF(_Rodzaj < 0, NULL, CONCAT('Rodzaj=', _Rodzaj)), 
				IF(_Rodzaj_typ < 0, NULL, CONCAT('Rodzaj_typ=', _Rodzaj_typ)), 
				CONCAT('KontrGUID=', NULLIF(_KontrGUID, '')), 
				IF(_Magazyn <= 0, NULL, CONCAT('zmagazynu=', _Magazyn)), 
				IF(_Magazyn2 <= 0, NULL, CONCAT('domagazynu=', _Magazyn2)), 
				CONCAT('Tymczasowa=', _Tymczasowa), 
				CONCAT('Waluta=', _Waluta), 
				CONCAT('AreaGUID=', NULLIF(_AreaGUID, '')), 
				CONCAT('datawystaw=', NULLIF(_DataWystaw, '')), 
				CONCAT('Typ_Przepisania_Cen=', _Typ_Przepisania_Cen), 
	-- IN _OsobaGUID VARCHAR(38), 
				'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji',
				'AutoNum=1', 
				'&'
			)
		;
		/*
		było - a i tak wewn. wołana jest ta poniższa
		CALL C_HT_TE_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', _Key, _ZM_Key, '', '', '', '' , @Params);
		*/
		LEAVE S_zmng_Realizuj;
		CALL C_HT_OPZM_Proc(@.OPZM._MODE, 'Realizacja.ZM.From.`t_zlecprod.zmpo`', 'OP', 'TE', _Key, _ZM_Key, '', '', '', '' , @Params);
		SET _Key = @_IdnOper;	-- do zwrotki
		LEAVE S_zmng_Realizuj;
	END IF;
	
	IF IFNULL(@session.globals.Realizuj_ZM_w_TE, FALSE) THEN
	/* ***********************************************************************************************************************
		Calkowicie po nowemu w TE
	************************************************************************************************************************/
		SET @Params = 
			CONCAT_WS('&', 
				'&', 
				IF(_Rodzaj < 0, NULL, CONCAT('Rodzaj=', _Rodzaj)), 
				IF(_Rodzaj_typ < 0, NULL, CONCAT('Rodzaj_typ=', _Rodzaj_typ)), 
				CONCAT('KontrGUID=', NULLIF(_KontrGUID, '')), 
				IF(_Magazyn <= 0, NULL, CONCAT('zmagazynu=', _Magazyn)), 
				IF(_Magazyn2 <= 0, NULL, CONCAT('domagazynu=', _Magazyn2)), 
				CONCAT('Tymczasowa=', _Tymczasowa), 
				CONCAT('Waluta=', _Waluta), 
				CONCAT('AreaGUID=', NULLIF(_AreaGUID, '')), 
				CONCAT('datawystaw=', NULLIF(_DataWystaw, '')), 
				CONCAT('Typ_Przepisania_Cen=', _Typ_Przepisania_Cen), 
	-- IN _OsobaGUID VARCHAR(38), 
				'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji',
				'AutoNum=1', 
				'&'
			)
		;
		/*
		było - a i tak wewn. wołana jest ta poniższa
		CALL C_HT_TE_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', _Key, _ZM_Key, '', '', '', '' , @Params);
		*/
		CALL C_HT_OPZM_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', 'TE', _Key, _ZM_Key, '', '', '', '' , @Params);
		SET _Key = @_IdnOper;	-- do zwrotki
		LEAVE S_zmng_Realizuj;
	END IF;
	
	
	
	
	
	IF @session.globals.Owner = 'KONKOL' THEN
		SET @Params = CONCAT_WS('&', '&', 'AutoNum=1', 'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji');
		/*
		było - a i tak wewn. wołana jest ta poniższa
		CALL C_HT_TE_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', _Key, _ZM_Key, '', '', '', '' , @Params);
		*/
		CALL C_HT_OPZM_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', 'TE', _Key, _ZM_Key, '', '', '', '' , @Params);
		LEAVE S_zmng_Realizuj;
	END IF;
	
	IF IFNULL(_MODE, '') = '' THEN
		SET _MODE = 'Realizacja.ZM.Edit';
	END IF;
	
	CALL _zmng_Update_zrealizowane('Ustaw.@_zmng_Realizuj.IlePozDoRealizacji', _ZM_Key, '', '');
	IF @_zmng_Realizuj.IlePozDoRealizacji = 0 THEN
		LEAVE S_zmng_Realizuj;
	END IF;
	
	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	END IF;
		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_init('INSERT";		
			SET @watch = 'Opng_E_init';
	
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_init('INSERT'", '', '', '');
	CALL Opng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init
CALL _WatchTimeLogs_Tools('Stop', "_zmng_Realizuj", "CALL Opng_E_init('INSERT'", '', '', '');

		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_init_set('', _Key, _Rodzaj";		
			SET @watch = 'Opng_E_init_set';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_init_set", '', '', '');
	CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, '', '3', _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, 0, _Param_A, _Param_B, _Param_C);
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_init_set", '', '', '');
	
		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_init_set_from_another_doc('Realizacja.ZM.Edit";		
	/*
	'Realizacja.ZM.Edit'
	ALBO
	'Realizacja.ZM.from.`t_zlecprod.zmpo`'
	*/
			SET @watch = 'Opng_E_init_set_from_another_doc';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_init_set_from_another_doc", '', '', '');
	CALL Opng_E_init_set_from_another_doc(_MODE, _Key, _ZM_Key, '', '', '');	
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_init_set_from_another_doc", '', '', '');
	
	
		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_Run('before.run";		
		--	SET @watch = 'CALL Opng_E_Run before.run';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_Run('before.run'", '', '', '');
	CALL Opng_E_Run('before.run', _Key, '', '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_Run('before.run'", '', '', '');

		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_Run('', _Key, '', '', '');";		
		--	SET @watch = 'CALL Opng_E_Run ';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_Run(''", '', '', '');
	CALL Opng_E_Run('', _Key, '', '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_Run(''", '', '', '');

		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_Run('after.run', _Key, '', '', '');";		
		-- 	SET @watch = 'CALL Opng_E_Run after.run';
		
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_Run('after.run'", '', '', '');
	CALL Opng_E_Run('after.run', _Key, '', '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_Run('after.run'", '', '', '');

--	RESZTA!!!!!!!!!!!! dzieje sie w CALL opng_E_LetInsertFromZM(@i_MODE, _Key, @i_Input_GUID, '', '');
-- 	SET @_POS_POS_2_INT = "LEAVE S_zmng_Realizuj";		
		-- LEAVE S_zmng_Realizuj;
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL opng_E_Let('ApplyAndClear'", '', '', '');
	CALL _ng_E_LetApply_2('', 'OP', _Key, '', '1');
	-- na razie CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL opng_E_Let('ApplyAndClear'", '', '', '');

	
	
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "Final", '', '', '');
	SELECT n.zamwpermn INTO @n.zamwpermn FROM `zmng` n WHERE n.GUID = _ZM_Key;

	IF @session.globals.Owner = 'BALTIMA' THEN
		UPDATE `oppo` p, `zmpo` z
		SET
			p.Lp = z.Lp
		WHERE
			p.IdnOper = _Key
			AND
			z.GUID = p.GUIDzm
		;
	END IF;
	
	IF @n.zamwpermn = 0 THEN
		CALL _zmng_Update_zrealizowane('', _ZM_Key, '1', '');	--	 Param_A ustawuiam aby naliczyl pozycje
	ELSE
		IF @session.HT.IR.Permanentne_Przesuwac_Termin_Realizacji_o_Cykl THEN
			UPDATE `zmng` n
			SET
				n.TerminRealizacji = DATE_ADD(n.TerminRealizacji, INTERVAL n.permanentne_cykl MONTH)
			WHERE
				n.GUID = _ZM_Key
				AND n.zamwpermn = 1
			;
		END IF;
	END IF;
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "Final", '', '', '');

END$$



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

rozne: 
datasprzed, datawystaw, datawplywu (roznica 5 dni)
dataplatnosci (roznica 14 dni)
dataplatnosci_oczekiwana (roznica 14 dni)	
dzial ( 0 a jest 1)
dotyczy ( inne )
data_vat (0000-00-00)
kolumnaKPR (0 - 7)
	
	
pozycje luzik
datasprzed 	
grupuj
iloscdo
*/
S_zmng_Realizuj_2018: BEGIN 
	SET @watch = 'IN';
	
	IF IFNULL(_MODE, '') = '' THEN
		SET _MODE = 'Realizacja.ZM.Edit';
	END IF;
	
	CALL _zmng_Update_zrealizowane('Ustaw.@_zmng_Realizuj.IlePozDoRealizacji', _ZM_Key, '', '');
	IF @_zmng_Realizuj.IlePozDoRealizacji = 0 THEN
		LEAVE S_zmng_Realizuj_2018;
	END IF;
	
	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	END IF;
		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_init('INSERT";		
			SET @watch = 'Opng_E_init';
	
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_init('INSERT'", '', '', '');
	CALL Opng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init
CALL _WatchTimeLogs_Tools('Stop', "_zmng_Realizuj", "CALL Opng_E_init('INSERT'", '', '', '');

		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_init_set('', _Key, _Rodzaj";		
			SET @watch = 'Opng_E_init_set';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_init_set", '', '', '');
	CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, '', '3', _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, 0, _Param_A, _Param_B, _Param_C);
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_init_set", '', '', '');
	
		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_init_set_from_another_doc('Realizacja.ZM.Edit";		
	/*
	'Realizacja.ZM.Edit'
	ALBO
	'Realizacja.ZM.from.`t_zlecprod.zmpo`'
	*/
			SET @watch = 'Opng_E_init_set_from_another_doc';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_init_set_from_another_doc", '', '', '');
	CALL Opng_E_init_set_from_another_doc(_MODE, _Key, _ZM_Key, '', '', '');	
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_init_set_from_another_doc", '', '', '');
	
	
		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_Run('before.run";		
		--	SET @watch = 'CALL Opng_E_Run before.run';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_Run('before.run'", '', '', '');
	CALL Opng_E_Run('before.run', _Key, '', '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_Run('before.run'", '', '', '');

		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_Run('', _Key, '', '', '');";		
		--	SET @watch = 'CALL Opng_E_Run ';
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_Run(''", '', '', '');
	CALL Opng_E_Run('', _Key, '', '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_Run(''", '', '', '');

		-- 	SET @_POS_POS_2_INT = "CALL Opng_E_Run('after.run', _Key, '', '', '');";		
		-- 	SET @watch = 'CALL Opng_E_Run after.run';
		
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL Opng_E_Run('after.run'", '', '', '');
	CALL Opng_E_Run('after.run', _Key, '', '', '');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL Opng_E_Run('after.run'", '', '', '');

--	RESZTA!!!!!!!!!!!! dzieje sie w CALL opng_E_LetInsertFromZM(@i_MODE, _Key, @i_Input_GUID, '', '');
-- 	SET @_POS_POS_2_INT = "LEAVE S_zmng_Realizuj_2018";		
		-- LEAVE S_zmng_Realizuj_2018;
	CALL _OP_ET_Let('POST', '', 'NG->PO', 'OP', _Key, '', '', '', '', '');	--	POST ale bez aktualizacji pozycji z naglowka
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "CALL opng_E_Let('ApplyAndClear'", '', '', '');
	CALL _ng_E_LetApply_2('', 'OP', _Key, '', '1');
	-- na razie CALL opng_E_Let('ApplyAndClear', _Key, '', '1');
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "CALL opng_E_Let('ApplyAndClear'", '', '', '');

	
	
CALL _WatchTimeLogs_Tools('start', "_zmng_Realizuj", "Final", '', '', '');
	SELECT n.zamwpermn INTO @n.zamwpermn FROM `zmng` n WHERE n.GUID = _ZM_Key;

	IF @session.globals.Owner = 'BALTIMA' THEN
		UPDATE `oppo` p, `zmpo` z
		SET
			p.Lp = z.Lp
		WHERE
			p.IdnOper = _Key
			AND
			z.GUID = p.GUIDzm
		;
	END IF;
	
	IF @n.zamwpermn = 0 THEN
		CALL _zmng_Update_zrealizowane('', _ZM_Key, '1', '');	--	 Param_A ustawuiam aby naliczyl pozycje
	ELSE
		IF @session.HT.IR.Permanentne_Przesuwac_Termin_Realizacji_o_Cykl THEN
			UPDATE `zmng` n
			SET
				n.TerminRealizacji = DATE_ADD(n.TerminRealizacji, INTERVAL n.permanentne_cykl MONTH)
			WHERE
				n.GUID = _ZM_Key
				AND n.zamwpermn = 1
			;
		END IF;
		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 = _ZM_Key
				AND n.zamwpermn = 1
				AND n.TerminRealizacji <= IFNULL(n.DataZakonczUmowy, '2100-12-31')
			;		
		END IF;
	END IF;
CALL _WatchTimeLogs_Tools('stop', "_zmng_Realizuj", "Final", '', '', '');

END$$


DROP PROCEDURE IF EXISTS `_ZAM_Realizuj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ZAM_Realizuj`(
	IN _MODE VARCHAR(250),
	IN _ZM_Key VARCHAR(38),
	INOUT _Key VARCHAR(38),
	IN _Rodzaj INTEGER,
	IN _Rodzaj_typ INTEGER,		
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,		
	IN _Magazyn2 INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
	IN _Input_GUID VARCHAR(255),
	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _DataWystaw VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
POPRAWNA nowa procedura !!!!!!!!!!!!!!!!
	SET 
		@IdnGUID = '{3B06DED6-D911-4E06-93ED-126253C6C282}',
		@IdnOperRealiz = '3_IdnOperRealiz'
	;
	CALL _ZAM_Realizuj('', @IdnGUID, @IdnOperRealiz, -1, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
	tu jest -1 zatem rodzaj docelowy dok. realizacuyjnego wzięty będzie z pola Rodzaj2 zamówienia - WERSJA po bożemu

	CALL _ZAM_Realizuj('', @IdnGUID, @IdnOperRealiz, 10, 0, NULL, 0, 0, FALSE, 0, '', '', '', 0, '', '', '', '');
	tu przykładowo jest 10 zatem dokumentem realizującym będzie WZka bez względu co będzie w polu Rodzaj2 zamówienia - WERSJA z wymuszonym rodzajem
	
	
	UWAGA!!!!!!!!!!!!!!!!!!
	GP porownal  naglowki 2 dokumentow (realizujacych takie samo zamowienie) 1 z delhi a drugi z swiata e
	OTO wynik:
	
Samo OPNG
wartosci NULL:
zrealizowano
symboper
platnik
niekrajowa 
data_nast_kontaktu
ugrpguid

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

*/
S__ZAM_Realizuj: BEGIN 
	CALL _Session_Refresh_Variables('', '', '');
	CALL _Globals_Get('Realizuj_ZM_w_TE', @session.globals.Realizuj_ZM_w_TE, IF(@session.globals.Owner IN ('KONKOL'), TRUE, FALSE));

	IF IFNULL(@session.globals.Realizuj_ZM_w_TE, FALSE) THEN
	/* ***********************************************************************************************************************
		Calkowicie po nowemu w TE
	************************************************************************************************************************/
		DO _counters_tools('INC', '_ZAM_Realizuj.Realizuj_ZM_w_TE', '', '');		-- to tylko Licznik!!!!
		SET @Params = 
			CONCAT_WS('&', 
				'&', 
				IF(_Rodzaj < 0, NULL, CONCAT('Rodzaj=', _Rodzaj)), 
				IF(_Rodzaj_typ < 0, NULL, CONCAT('Rodzaj_typ=', _Rodzaj_typ)), 
				CONCAT('KontrGUID=', NULLIF(_KontrGUID, '')), 
				IF(_Magazyn <= 0, NULL, CONCAT('zmagazynu=', _Magazyn)), 
				IF(_Magazyn2 <= 0, NULL, CONCAT('domagazynu=', _Magazyn2)), 
				CONCAT('Tymczasowa=', _Tymczasowa), 
				CONCAT('Waluta=', _Waluta), 
				CONCAT('AreaGUID=', NULLIF(_AreaGUID, '')), 
				CONCAT('datawystaw=', NULLIF(_DataWystaw, '')), 
				CONCAT('Typ_Przepisania_Cen=', _Typ_Przepisania_Cen), 
	-- IN _OsobaGUID VARCHAR(38), 
				'Ustaw.@_zmng_Realizuj.IlePozDoRealizacji',
				'AutoNum=1', 
				'&'
			)
		;
		/*
		było - a i tak wewn. wołana jest ta poniższa
		CALL C_HT_TE_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', _Key, _ZM_Key, '', '', '', '' , @Params);
		*/
		CALL C_HT_OPZM_Proc('CREATE', 'Realizacja.ZM.From.zmng', 'OP', 'TE', _Key, _ZM_Key, '', '', '', '' , @Params);
		SET _Key = @_IdnOper;	-- do zwrotki
		LEAVE S__ZAM_Realizuj;
	END IF;
	

	CALL _zmng_Update_zrealizowane('Ustaw.@_zmng_Realizuj.IlePozDoRealizacji', _ZM_Key, '', '');
	IF @_zmng_Realizuj.IlePozDoRealizacji = 0 THEN
		LEAVE S__ZAM_Realizuj;
	END IF;

	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	END IF;
	
	SET @_Key = _Key;
	
	SELECT
		z.rodzaj, z.rodzaj2, z.KontrGUID, z.Waluta, z.idnmagazyn, z.magazynwys, z.zamwpermn, z.terminrealizacji
	INTO
		@z.rodzaj, @z.rodzaj2, @z.KontrGUID, @z.Waluta, @z.idnmagazyn, @z.magazynwys, @z.zamwpermn, @z.terminrealizacji
	FROM `zmng` z
	WHERE
		z.GUID = _ZM_Key
	LIMIT 1
	;
	SELECT
		p.MagTyp
	INTO
		@z.MagTyp
	FROM `zmpo` p
	WHERE
		p.IdnNG = _ZM_Key
	LIMIT 1	
	;
	
	IF _MODE = 'cTRANS_MM_FROMZamowienia' THEN
		SET
			_Rodzaj = @ht.CMMMM,
			_Magazyn = @z.idnmagazyn,
			_Magazyn2 = @z.magazynwys 
		;	
	ELSEIF _MODE = 'cTRANS_WZFVTemp_FROMZamowienia' THEN
		SET
			_Rodzaj = @ht.CSpFV,
			_Magazyn = @z.idnmagazyn,
			_Magazyn2 = @z.magazynwys,
			_Tymczasowa = 1
		;	
	ELSE
		IF @z.rodzaj IN (@ht.CZmOO, @ht.CZmZP, @ht.CZmEX) THEN
			SET
				_Rodzaj = IF(_Rodzaj >= 0, _Rodzaj, @z.rodzaj2),
				_Magazyn = 
				CASE 
					/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
					/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN 0
					/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.idnmagazyn
					/*NN*/	ELSE 0
				END,
				_Magazyn2 = 
				CASE 
					/*RZ*/	WHEN @z.MagTyp = @ht.mtRZ THEN 0
					/*PZ*/	WHEN @z.MagTyp = @ht.mtPZ THEN IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn) 
					/*MM*/	WHEN @z.MagTyp = @ht.mtMM THEN @z.magazynwys
					/*NN*/	ELSE 0
				END	
			;	
			IF @z.rodzaj IN (@ht.CZmZP) THEN
				SET
					_Rodzaj = IF(@z.MagTyp = @ht.mtRZ, @ht.CRzRW, @ht.CPzPW),
					_Magazyn = IF(@z.MagTyp = @ht.mtRZ, @z.idnmagazyn, 0),
					_Magazyn2 = IF(@z.MagTyp = @ht.mtRZ, 0, @z.magazynwys)
				;	
			END IF;
		ELSEIF @z.rodzaj IN (@ht.CZMWE) THEN
			SET
				_Rodzaj = @ht.CMMMM,
				_Magazyn = @z.idnmagazyn,
				_Magazyn2 = @z.magazynwys
			;	
		ELSEIF @z.rodzaj IN (@ht.CZmDD, @ht.CZmIm) THEN
			SET
				_Rodzaj = IF(_Rodzaj IN (@ht.CZkFV, @ht.CPzPZ, @ht.CZkIm, @ht.CZTUE), _Rodzaj, @ht.CZkFV), 	--	fakturka zakup.
				_Magazyn = 0,
				_Magazyn2 = IF(@z.magazynwys > 0, @z.magazynwys, @z.idnmagazyn)
			;	
		END IF;
	END IF;
	
	SET 
		_KontrGUID = @z.KontrGUID,
		_Waluta = IF(NOT _Rodzaj IN (@ht.CSpFE, @ht.CZkIm, @ht.CStUE, @ht.CZTUE), @z.Waluta, _Waluta)		-- !!!??????? C_Sprzedarz.pas linia 1258 
	;
	
	SET 
		@KontrGUID = _KontrGUID
	;	
--	BEZPIECZNIK!!!!!!!!!!
	SET 
		_Rodzaj = IF(_Rodzaj < 0, 1, _Rodzaj)
	;	
	
	/*
	juz nie
	CALL opng_E_LetInsert('', _Key, _Rodzaj, _Rodzaj_typ, _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, _Param_A, _Param_B, _Param_C);
	*/
	CALL Opng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init
	
	CALL Opng_E_init_set('', _Key, _Rodzaj, _Rodzaj_typ, '', '3', _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, 0, _Param_A, _Param_B, _Param_C);

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

	SET @_Key = _Key;
	-- SET _Get_Last_Kurs_For_Waluta(_Waluta, 0);
	
	--	Adresacja!!!
	/* jeszcze nie (29 III 2017 ale za 2-3 dni juz tak
	IF IFNULL(@session.globals.DOC_with_AdrLink, FALSE) THEN
		CALL geo_int_adr_link_NED('REC.DELETE', '', _Key, '*', '*', '', '', '', '', '', '');
		CALL geo_int_adr_link_NED('REC.CLONE', '', _ZM_Key, 'zmng', '*', '', _Key, 'opng', '*', '', '');  -- klonowanie adresow zam X do dokumentumentu _Key (realizacja)
	END IF;
	*/
		
	--	Ogólny Update z zamowienia
	UPDATE `opng_e` n, `zmng` z
	SET
		n.Rodzaj2 = IF(n.Rodzaj = @ht.CRzWZ, 1, n.Rodzaj2),
		n.PlatnikGUID = z.PlatnikGUID,
		n.AkwizytorGUID = z.AkwizytorGUID,
		n.ZlecenieGUID = z.ZlecenieGUID,
		n.sposobplatn = z.sposobplatn,
		n.spedycja = z.spedycja,
		n.info1 = z.info1,
		n.info2 = z.info2,
		n.info3 = z.info3,
		n.info4 = z.info4,
		n.info5 = z.info5,
		n.info6 = z.info6,
		n.RodzajDowodu = z.RodzajDowodu,	-- ?????
		n.transza_zamow = z.transza_zamow,	-- ?????
		n.uwagi = IF(@session.HT.IR.PrzepiszUwagiZZamowienia, z.uwagi, n.uwagi),
		n.Dotyczy = CONCAT(
			'Zam. nr: ', z.nrzamw,
			IF(z.nrzamwkontr != '', 
				CONCAT('Nr zam. odbiorcy: ', z.nrzamwkontr),
				''
			)	
		)	
		
	WHERE
		n.GUID = _Key
		AND
		z.GUID = _ZM_Key
	;	
	--	Gdy zam. jest perman. OO lub eksportowe to ustal dete jako pierwszy nastepny roboczy dzien
	IF (@z.rodzaj IN (@ht.CZmOO, @ht.CZmEx)) AND @z.zamwpermn THEN
		SET
			@z.terminrealizacji = DATE(@z.terminrealizacji)
		;	
		SET
			@z.PierwszyNastepnyRoboczy = _Get_Next_WorkDay(@z.terminrealizacji)
		;
		SET _DataWystaw = @z.PierwszyNastepnyRoboczy;
	ELSE
		--	Gdy CDG i MM-ka to date jako termin realizacji
		IF (IFNULL(_DataWystaw, '') = '') OR ((_Rodzaj = @ht.CMMMM) AND (@session.globals.Owner IN ('CDG','MPGK'))) THEN
			SET _DataWystaw = @z.terminrealizacji;
		END IF;	
		
	END IF;

	UPDATE `opng_e` n
	SET
		n.datawystaw = _DataWystaw,
		n.datasprzed = _DataWystaw,
		n.datawplywu = _DataWystaw,
		n.Data_Vat = _DataWystaw -- IF(@session.HT.IR.DataVAT_inicjuj_z_datasprzed, _DataWystaw
	WHERE
		n.GUID = _Key
	;	
	
	--	Przepisz wydzial i ustaw Guid zlecenia gdy RW lub PW
	IF (@z.rodzaj IN (@ht.CZmZP)) AND (_Rodzaj IN (@ht.CRzRW, @ht.CPzPW)) THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.Wydzial = z.Wydzial,
			n.ZlecenieGUID = IF(@session.HT.IR.PrzepiszGUIDZleceniaProd, z.GUID, n.ZlecenieGUID)
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;
	
	--	KatCol-e
	IF @session.HT.IR.PrzepiszKatColZZamowienia THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.katcol0 = z.katcol0,
			n.katcol1 = z.katcol1,
			n.katcol2 = z.katcol2,
			n.katcol3 = z.katcol3,
			n.katcol4 = z.katcol4
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;
	
	
	-- SELECT @IdnOper, @G;
--	JARZEBINSCY	- chodzi o to by przepisac n.Rodzaj_Przeliczenia - POTEM musimy to zrobic uniwersalnie np. via `operdoc`
	IF @session.globals.Owner = 'JARZEBINSCY' THEN
		UPDATE `opng_e` n, `zmng` z
		SET
			n.Rodzaj_Przeliczenia = z.Rodzaj_Przeliczenia
		WHERE
			n.GUID = _Key
			AND
			z.GUID = _ZM_Key
		;	
	END IF;

	SET @G = '';
	CALL oppo_E_Let_Insert('From.zmng', '', _Key, '', 0, 0, _ZM_Key, _Typ_Przepisania_Cen, '', '');
	
	
-- ????		CALL oppo_E_Let_Update('from_opng_e', '', _IdnOper, '', '');
	
	CALL opng_E_Let('Post', _Key, '', '');
	
-- LEAVE S__ZAM_Realizuj;

IF IFNULL(@.jmam.watch, FALSE) THEN LEAVE S__ZAM_Realizuj; END IF;
	
	CALL opng_E_Let('ApplyAndClear', _Key, '', '1');

	CALL _zmng_Update_zrealizowane('', _ZM_Key, '1', '');	--	 Param_A ustawuiam aby naliczyl pozycje
	
	-- !!!!! CALL opng_Numeracja_po_Apply('', _Key, '', '', '');
	
	-- SET @G = '';
END$$

DROP PROCEDURE IF EXISTS `ZAM_Realizuj`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ZAM_Realizuj`(
	IN _MODE VARCHAR(250),
	IN _ZM_Key VARCHAR(38),
	INOUT _Key VARCHAR(38),
	IN _Rodzaj INTEGER,
	IN _Rodzaj_typ INTEGER,		
	IN _KontrGUID VARCHAR(38), 
	IN _Magazyn INTEGER,		
	IN _Magazyn2 INTEGER,
	IN _Tymczasowa BOOLEAN,
	IN _Waluta INTEGER,
	IN _OsobaGUID VARCHAR(38), 
	IN _AreaGUID VARCHAR(38), 
	IN _Input_GUID VARCHAR(255),
	IN _Typ_Przepisania_Cen INTEGER,  	--  TCenyZZm = (CZZ_Zamowienie, CZZ_KursDzis, CZZ_OdNowa);
	IN _DataWystaw VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255)
)
/*
Schyłkowa procedura !!!!!!!!!!!!!!!!
	CALL ZAM_Realizuj('', @IdnGUID, @IdnOper, @Rodzaj, 0, @KontrGUID, 2, 2, @_Tymczasowa, 0, '', '', '', 0, '', '', '', '');
*/
S_ZAM_Realizuj: BEGIN 
	CALL _ZAM_Realizuj('', _ZM_Key, _Key, _Rodzaj, _Rodzaj_typ, _KontrGUID, _Magazyn, _Magazyn2, _Tymczasowa, _Waluta, _OsobaGUID, _AreaGUID, _Input_GUID, _Typ_Przepisania_Cen, _DataWystaw, _Param_A, _Param_B, _Param_C);
	
	IF IFNULL(@session.globals.Realizuj_ZM_w_TE, FALSE) THEN
		LEAVE S_ZAM_Realizuj;
	END IF;
	
	CALL opng_Numeracja_po_Apply('', _Key, '', '', '');
	
	LEAVE S_ZAM_Realizuj;
END$$

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

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

	CALL _Session_Refresh_Variables('', '', '');
	
	IF _Param_A = 'DEPOZYT' THEN
		-- SET _Key = CONCAT('DEPZ:', MD5(CONCAT('DEPOZYT', _ZM_Key)));
		SET _Key = CONCAT('DEPZ:', MD5(_ZM_Key));
	END IF;
	
	IF IFNULL(_Key, '') = '' THEN
		SET _Key = NEWGUID();
	ELSE
		IF EXISTS(SELECT GUID FROM `zmng` WHERE GUID = _Key) THEN
			LEAVE S__ZAM_Kopiuj;
		END IF;
	END IF;
	SET @_Key = _Key;
	
	SET
		_Rodzaj = IFNULL(_Rodzaj, -1)
	;
	
	CALL Zmng_E_init('INSERT', _Key, '', '1', '');	-- _Param_A jest tu != '' aby nie wywoływać selecta wewn. innej proc. _ng_e_rec_init
	
	CALL Zmng_E_init_set_from_another_doc('CLONE', _Key, _ZM_Key, '', '', '');	 -- kluczowe slowo 'CLONE'
	
	-- CALL Zmng_E_init_set('', _Key, @z.Rodzaj, @z.Rodzaj_typ, _MODE, '3', @z.KontrGUID, @z.idnmagazyn, @z.magazynwys, , @z.Tymczasowa, @z.Waluta, @z.OsobaGUID, @z.AreaGUID, _ZM_Key, 0, _Param_A, _Param_B, _Param_C);

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


	
	IF NOT _CzyOferta THEN
	SET @ULALA = '1';
		UPDATE `zmng_e` n
		SET
			n.Waluta = IF(IFNULL(_Waluta, -1) = -1, n.Waluta, _Waluta),
			n.Tymczasowa = IF(_CzyOferta AND _Rodzaj = -1, 1, IFNULL(_Tymczasowa, 0)),
			n.Uwagi = IF(_Rodzaj = -1 AND @session.HT.IR.Klonuj_uwagi_zamowien, n.Uwagi, ''),
			n.nrzamw = 
				IF(_Rodzaj = @ht.CZmZP,
					n.nrzamwkontr,
					CONCAT(@session.HT.IR.Prefiks_klonowanego_num_zam, n.nrzamw)
				)
			/*
		{$IFDEF DOMAX_CZECHY}
			n.nrzamwkontr = n.kontrsymbol
		{$ENDIF}
		{$IFDEF DOMAX_SLOWACJA}
			n.nrzamwkontr = n.kontrsymbol
		{$ENDIF}
			*/						
						
			
		WHERE
			n.GUID = _Key
		;	
	END IF;
	
	
--	UWAGA dla POLAMU zawsze nadawaj numer !!!!
	IF _MODE = '' AND (@session.globals.Owner = 'POLAM') THEN
		UPDATE `zmng_e` n
		SET
			n.nrzamw = ''
		WHERE
			n.GUID = _Key
		;	
	END IF;
	
	IF _Param_A = 'DEPOZYT' THEN
		UPDATE `zmng_e` n
		SET
			n.nrzamw = CONCAT(n.nrzamw, ' DEPOZYT'),
			n.MagazynWys = n.idnmagazyn
		WHERE
			n.GUID = _Key
		;	
		UPDATE `zmpo_e` p, `zmng_e` n
		SET
			p.IdnMagazyn = n.IdnMagazyn,
			p.MagazynWys = n.MagazynWys
		WHERE
			n.GUID = _Key
			AND
			p.IdnNG = n.GUID
		;
	--	I jeszcze po0bierz USERGUID do pozniejszego PZ depozytowego
		SELECT 
			handle_UserGUID, handle_UserLogin
		INTO
			@.handle_UserGUID, @.handle_UserLogin
		FROM `ng_e_rec`
		WHERE
			GUID = _Key
		;
	END IF;
	
	IF @z.KontrGUID_Changed THEN
		UPDATE `zmpo_e` p, `zmng_e` n
		SET
			p.KontrGUID = n.KontrGUID
		WHERE
			n.GUID = _Key
			AND
			p.IdnNG = n.GUID
		;
	--	a ceny?????????????????????	
	END IF;
	
	IF @z.WalutaGUID_Changed THEN
		SET @Cos = 'x';
		/*
		w Delphi!!! gdy zmieniamy walute
      { Gdy chcemy innej waluty to przelicz pozycje (kurs)}
      if Self.CDS.FieldByName('waluta').AsInteger <> aWaluta then
        ChangeWaluteInPo(aWaluta, aKurs);
		*/
	END IF;
	
	SET 
		@KontrGUID = @z.KontrGUID
	;	

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

	SET @G = '';
	
			SET @.Depozyt.X = '0';	
	CALL zmng_E_Let('Post', _Key, '', '');
	
	SET @._Key = _Key;
--	LEAVE S__ZAM_Kopiuj;
	
--	np. dla NO.Apply nie zapisuj tylko daj do edycji
	IF _MODE = '' THEN
		CALL zmng_E_Let('ApplyAndClear', _Key, '', '1');
	END IF;
	
					SET @.Depozyt.X = '1';
	IF _Param_A = 'DEPOZYT' AND _MODE = '' THEN
	--	HA i jeszce PW na magazyn depozytowy
		SET @.GUIDWZ = NULL;
					SET @.Depozyt.X = '2';
		SELECT 
			p.IdnOper AS GUIDWZ
		INTO
			@.GUIDWZ	--	pobierz GUID dokumentu (WZ/FV) realizujacego zamowienie zrodlowe
		FROM `zmpo` zp, `oppo` p
		WHERE
			zp.IdnNg = _ZM_Key
			AND p.GUIDZM = zp.GUID
		LIMIT 1
		;
		
		
		IF @.GUIDWZ IS NOT NULL THEN
					SET @.Depozyt.X = '3';
			UPDATE `zmng` n
			SET
				n.info1 = CONCAT('DEPOZYT dotyczy WZ: ', IFNULL((SELECT nrdokmag FROM `opng` WHERE GUID = @.GUIDWZ), ''))
			WHERE
				n.GUID = _Key
			;	
		
SET @.Depozyt.X = '4';
		-- 	CALL ht_clone_tools('CLONE_TO_MGPZ', @.GUIDWZ, '', _Magazyn, '', ''); -- klonuj dokument realizujacy jako PW na mag. _Magazyn (ten depozytowy)
			CALL ht_clone_tools('CLONE_TO_MGPZ_DEPOZYT', _ZM_Key, '', _Magazyn, '', ''); -- klonuj dokument realizujacy jako PW na mag. _Magazyn (ten depozytowy)
			SET @.GUIDPZ = NULL;
SET @.Depozyt.X = '5';
			SELECT guid
			INTO @.GUIDPZ -- pobierz GUID PW
			FROM t_opng
			;
			
			IF @.GUIDPZ IS NOT NULL THEN
SET @.Depozyt.X = '5';
			--	Tymczasowa na 0	
				CALL opng_E_Tymczasowa_Set('0', @.GUIDPZ, '', '');	--	Tymczasowa PW na 0 (odtymczasowienie PW)
				-- @.handle_UserGUID, @.handle_UserLogin
			--	LOG
				CALL log_Insert('INSERT', @Idn, @.handle_UserLogin, '100', 3, @.GUIDPZ, '127.0.0.1', 'PZ depozytowy do zam. depozytowego', '');		
		/*
		To ponize juz w sobie zawiera 	CALL ht_clone_tools('CLONE_TO_MGPZ_DEPOZYT' ...
				UPDATE `opng` n  
				SET 
					n.NrDokFin = 'DEPOZYT', 
					n.RodzajDowodu = 'POZABILANSOWY', 
					n.idnuser = IF(IFNULL(@.handle_UserLogin , '') != '', @.handle_UserLogin , @session.CheckLogonUserLogin)
				WHERE 
					n.GUID = @.GUIDPZ
				; 
				UPDATE `oppo` p  
				SET 
					p.IdnWZ = 'POZABILANSOWY'
				WHERE 
					p.IdnOper = @.GUIDPZ
				; 
		*/
			END IF;
		END IF;
		
	END IF;
	
END$$

/* ************************************************************************************************************************************************************************
	Operacje dot. zamówień (dla zaznaczonych w shell-u)
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `_ZAM_Make_for_temp_checked_zmng`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `_ZAM_Make_for_temp_checked_zmng`(
	IN _MODE VARCHAR(250),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255),
	IN _Param_E MEDIUMTEXT
)
/*
	CALL _ZAM_Make_for_temp_checked_zmng('Konkol.swieta.transze', '', '', '', '', '');
*/
S__ZAM_Make_for_temp_checked_zmng: BEGIN 

	CALL _Session_Refresh_Variables('', '', '');
	
	IF _MODE = 'Konkol.swieta.transze' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_zmng_k_tr`;
		CREATE TEMPORARY TABLE IF NOT EXISTS `t_zmng_k_tr` LIKE `zmng_e`;
		INSERT INTO `t_zmng_k_tr` 
			SELECT 
				n.* 
			FROM `temp_checked_zmng` t, `zmng` n	--	z zaznaczonych w EXE
			WHERE
				n.GUID = t.GUID 
				AND n.transza_zamow = 10	--	tylko
				AND n.rodzaj = 27	--	na wszelki wypadek
				AND EXISTS(SELECT p.Idn FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.Zlecono > 0)
				AND EXISTS(SELECT p.Idn FROM `zmpo` p WHERE p.IdnNg = n.GUID AND p.Zlecono = 0)
		;
	--	Przelacz pozycje do nowego  naglowka	
		UPDATE `t_zmng_k_tr` tn, zmpo p 
		SET 
			p.idnng = CONCAT('SW', MID(p.idnng, 3, 38)),
			p.transza_zamow = 12,
			p.Info = tn.guid
		WHERE 
			p.idnng = tn.guid 
			AND p.zlecono = 0
		;
		UPDATE `t_zmng_k_tr` tn
		SET 
			tn.idn = 0,
			tn.guid = CONCAT('SW', MID(guid, 3, 38)),
			tn.transza_zamow = 12,
			tn.nrzamw = CONCAT('SW-', tn.nrzamw),
			tn.idnuser = IFNULL(@session.INFO.User_Login, tn.idnuser)
		;
		INSERT IGNORE INTO `zmng` 
			SELECT 
				tn.* 
			FROM `t_zmng_k_tr` tn
		;
	END IF;
	
END$$


DELIMITER ;

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

CALL _Session_Refresh_Variables('', '', '');



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