 DELIMITER $$

/* ************************************************************************************************************************************************************************
	Wstawianie do, edycja `zmpo_e` 
************************************************************************************************************************************************************************ */	

DROP PROCEDURE IF EXISTS `zmpo_E_Let_Insert`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `zmpo_E_Let_Insert`(
	IN _MODE VARCHAR(250),
	IN _GUID VARCHAR(38),
	IN _IdnNg VARCHAR(38),
	IN _IdnTowr VARCHAR(38),
	IN _Ilosc DECIMAL(16,4),
	IN _CenaNet DECIMAL(16,4),
	IN _Param_A VARCHAR(50),	
	IN _Param_B VARCHAR(50),	
	IN _Param_C VARCHAR(50),	
	IN _Param_D VARCHAR(50)	
)
/* 
	
 */	
S_zmpo_E_Let_Insert:BEGIN 
	DECLARE _ZM_Key VARCHAR(38);
	DECLARE _Typ_Przepisania_Cen, _rodzaj_przeliczenia INTEGER;
	
	DECLARE CZZ_Zamowienie INTEGER DEFAULT 0;
	DECLARE CZZ_KursDzis INTEGER DEFAULT 1;
	DECLARE CZZ_OdNowa INTEGER DEFAULT 2;
	
	SET _MODE = IF(_MODE = '', 'IdnTowr', _MODE);

	SET _GUID = IF(IFNULL(_GUID, '') = '', NEWGUID(), _GUID);
	
	IF _MODE LIKE 'IdnTowr%' THEN
		SET 
			_rodzaj_przeliczenia = IF(_Param_A = '', NULL, _Param_A),
			@.GUID.rec.bez.towaru = NULL
		;
		IF _MODE = 'IdnTowr.E' AND IFNULL(_IdnTowr, '') = '' THEN
		--	czyli wstawiamy z okna xxxE rekord bez towaru - ZATEM sprawdz czy nie istnieje juz rekord z towarem pustym ktory byl zakladany w tej edycji
			SELECT 
				p.GUID
			INTO
				@.GUID.rec.bez.towaru
			FROM `zmpo_e` p
			WHERE
				p.IdnNg = _IdnNg
				AND IFNULL(p.IdnTowr, '') = ''
				AND p.IDN = 0
			;
			IF @.GUID.rec.bez.towaru IS NOT NULL THEN
			--	Jest rekord z towarem pustym ktory byl zakladany w tej edycji
				SET _GUID = @.GUID.rec.bez.towaru;
			END IF;
			
		END IF;
		set @XXX = '2';
		
		IF @.GUID.rec.bez.towaru IS NULL THEN
		set @XXX = '2.1';
			INSERT IGNORE INTO `zmpo_e` (GUID, IdnNg, IdnTowr, Ilosc, CenaNet, rodzaj_przeliczenia)
				SELECT
					_GUID,
					_IdnNg,
					_IdnTowr,
					IFNULL(_Ilosc, 0.0),
					IFNULL(_CenaNet, 0.0),
					IFNULL(_rodzaj_przeliczenia, 0)
			ON DUPLICATE KEY UPDATE
				IdnTowr = _IdnTowr,
				Ilosc = _Ilosc,
				rodzaj_przeliczenia = IFNULL(_rodzaj_przeliczenia, 0)
			;
		set @XXX = '2.2';
			IF _MODE = 'IdnTowr.Cena' THEN
				IF _CenaNet IS NULL THEN
					CALL _pozycje_cenyrabat_xxpo_e_one_rec('ZM', _GUID, FALSE, FALSE, '', '');	
				ELSE
					UPDATE `zmpo_e` p 
					SET
						p.CenaNet = IF(p.rodzaj_przeliczenia IN (0, 1, 2), _CenaNet, p.CenaNet),
						p.CenaBrt = IF(p.rodzaj_przeliczenia IN (0, 1, 2), p.CenaBrt + 100, _CenaNet),
						p.Tag = -1
					WHERE
						p.GUID = _GUID
					;
					
				END IF;
				
			END IF;

			IF _MODE = 'IdnTowr.Cena.BRUTTO.Fiskalnie' THEN
					UPDATE `zmpo_e` p 
					SET
						p.rodzaj_przeliczenia = 5,		--	_BN_CB_WN z ceny brutto->netto	
						p.CenaBrt = IFNULL(_CenaNet, p.CenaBrt)
					WHERE
						p.GUID = _GUID
					;
					UPDATE `zmpo_e` p 
					SET
						p.rodzaj_przeliczenia = 3,		--	_BN_CN_WN fiskalne z brutto->netto  (fiskalne)	z ceny netto -> wrt brutto, -> ceny brutto (zaokr), -> i dalej jak dla _BN_CB_WN
						p.Tag = -1
					WHERE
						p.GUID = _GUID
					;
			END IF;
			
			CALL zmpo_E_Let_Update('one_rec', _GUID, '', '', _Param_D);
		set @XXX = '2.3';
			SET @X = 'Po insercie';
		-- dawniej CALL zmpo_e_Update('one_rec', _GUID, '');
		END IF;
		set @XXX = '3';
		IF _MODE = 'IdnTowr.E' THEN
		--	zwroc _GUID bo wstawiamy z okna xxxE
			SELECT _GUID AS GUID;
		END IF;
	END IF;		-- _MODE = 'IdnTowr' 
	
	-- IF _MODE = 'From.zmng' THEN
	IF(_MODE LIKE 'CLONE%') THEN
		SET 
			_ZM_Key = IFNULL(_Param_A, ''),
			_Typ_Przepisania_Cen = IFNULL(_Param_B, 0)
		;	
		SET @From.ZM = '???';
		/*
		... i dalej wstaw etc.
		*/
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_ZAM_Kopiuj`;
		CREATE TEMPORARY TABLE `t_zmpo_ZAM_Kopiuj` LIKE `zmpo_e`;
		IF _MODE != 'CLONE.AS.ZAM.FROM.OFERTA' THEN
		--	wszystkie pozycje
			INSERT INTO `t_zmpo_ZAM_Kopiuj` 
				SELECT 
					p.* 
				FROM `zmpo` p 
				WHERE 
					p.IdnNG = _ZM_Key
				;
		ELSE
		--	(zam z oferty) czyli pozycje wersji nagloewka 'CLONE.AS.ZAM.FROM.OFERTA'
			INSERT INTO `t_zmpo_ZAM_Kopiuj` 
				SELECT 
					p.* 
				FROM `zmng` n, `zmpo` p 
				WHERE 
					n.GUID = _ZM_Key 
					AND p.IdnNG = _ZM_Key 
					AND p.wersja = n.wersja
					AND p.zrealizowano < p.Ilosc	--	dodano dla oferty
				;
		END IF;
		
		IF _MODE LIKE 'CLONE.AS.ZAM.FROM.%' THEN
		--	(zam z oferty) czyli pozycje wersji nagloewka 'CLONE.AS.ZAM.FROM.OFERTA' LUB
		--	(zam z zapotrz)  'CLONE.AS.ZAM.FROM.ZAPOTRZEBOWANIE'
			UPDATE `t_zmpo_ZAM_Kopiuj` p, `ng_e_rec` nr
			SET
				p.Rodzaj = IF(_MODE = 'CLONE.AS.ZAM.FROM.OFERTA', @ht.CZmOO, @ht.CZmDD),
				p.zamowienieGUID = p.guid,
				p.Rodzaj = nr.Rodzaj,
				p.Rodzaj_Typ = nr.Rodzaj_Typ,
				p.idnmagazyn = nr.i_Magazyn1_Kasa,
				p.MagazynWys = nr.i_Magazyn2,
				p.Ilosc = IF(_MODE = 'CLONE.AS.ZAM.FROM.OFERTA', GREATEST(p.Ilosc - p.zrealizowano, 0), p.Ilosc),
				p.TerminRealizacji = IF(_MODE = 'CLONE.AS.ZAM.FROM.OFERTA' AND @session.globals.Owner = 'IZOHAN', NULL, p.TerminRealizacji), 	--	dla IZOHANU TerminRealizacji ustawiaj na NULL
				p.ilosc_pierwotna = p.Ilosc
			WHERE
				nr.GUID = _IdnNg
			;
		END IF;
		
	--	Dla czystego klonowania TEGO NIE ROB!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ale juz dla depozytu tak mimo ze jest to CLONE
		IF (_MODE != 'CLONE') OR (_IdnNg LIKE 'DEPZ:%') THEN
		--	dla klonowan realizacyjnych np, oferta - > zam
			UPDATE `t_zmpo_ZAM_Kopiuj` p
			SET
				p.zamowienieGUID = p.guid
			;	
		END IF;
		
		UPDATE `t_zmpo_ZAM_Kopiuj` p
		SET
			p.IDN = 0,
			p.guid = CONCAT('HT', uuid()),
			-- p.GUID = NEWGUID(),
			p.IdnNG = _IdnNg,
			
			-- p.tymczasowa = 1, 
			p.zrealizowano = 0, p.zlecono = 0, p.spakowano = 0, p.commision_guid = '',
			p.localtime = now(), p.remotetime = NULL,
			p.wersja = IF(p.Rodzaj = @ht.CZmOF, p.wersja, 0),
			p.create_AT = NOW(),
			p.grp_GUID = '',
			p.grp_TowrSymb = DEFAULT(p.grp_TowrSymb),
			p.grp_TowrNazwa = DEFAULT(p.grp_TowrNazwa),
			p.grp_Jednostka = DEFAULT(p.grp_Jednostka),
			p.grp_Ilosc = DEFAULT(p.grp_Ilosc)
		;	
	--	Usun	
		DELETE FROM `zmpo_e` WHERE IdnNG = _IdnNg;
	--	Wstaw
		INSERT INTO `zmpo_e` 
			SELECT 
				* 
			FROM `t_zmpo_ZAM_Kopiuj`
		;
		
	--	grupowanie klonowania - przeniesienie grupowania z zmpo do zmpo_e
		DROP TEMPORARY TABLE IF EXISTS `t_update_grp_GUID`;
		CREATE TEMPORARY TABLE IF NOT EXISTS `t_update_grp_GUID`
			SELECT
				p.GUID, 
				NULLIF(p.GUID, p.GUID) AS pgrp_GUID,
				-- p.GUIDzm, 
				zp.grp_GUID, 
				zp.grp_TowrSymb,
				zp.grp_TowrNazwa,
				zp.grp_Jednostka,
				zp.grp_Ilosc
			-- FROM `t_oppo_e_insert` p, `t_zmpo_e_insert` z
			-- FROM `zmpo_e` p, `t_zmpo_ZAM_Kopiuj` zp
			FROM `zmpo_e` p, `zmpo` zp
			WHERE
				TRUE
				AND p.IdnNg = _IdnNg
				AND	zp.GUID = p.zamowienieGUID
				AND IFNULL(zp.grp_GUID, '') <> ''
		;
					--	SELECT * FROM `t_update_grp_GUID`;
		UPDATE `t_update_grp_GUID` tg, `zmpo_e` p
		SET
			tg.pgrp_GUID = p.GUID
		WHERE
			TRUE
			AND p.zamowienieGUID = tg.grp_GUID
		;
		UPDATE `zmpo_e` p, `t_update_grp_GUID` tg
		SET
			p.grp_GUID = tg.pgrp_GUID,
			p.grp_TowrSymb = tg.grp_TowrSymb,
			p.grp_TowrNazwa = tg.grp_TowrNazwa,
			p.grp_Jednostka = tg.grp_Jednostka,
			p.grp_Ilosc = tg.grp_Ilosc
		WHERE
			TRUE
			AND p.GUID = tg.GUID
		;
		
		IF NOT IFNULL(@session.Delfinek, FALSE) THEN
			DROP TEMPORARY TABLE IF EXISTS `t_update_grp_GUID`;
		END IF;
	--	koniec grupowania
		
		
	--	Zmien np. wersje (bo ustawiana jest w AI na naglowkowa wartosc)
		UPDATE `zmpo_e` p, `t_zmpo_ZAM_Kopiuj` t
		SET
			p.wersja = t.wersja
		WHERE
			p.IdnNG = _IdnNg
			AND
			p.GUID = t.GUID
		;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_ZAM_Kopiuj`;
	--	Na koniec przelicz	
		UPDATE `zmpo_e` p
		SET
			p.Tag = -1
		WHERE
			p.IdnNG = _IdnNg
		;
		
		IF @session.globals.Owner IN ('COMEX') THEN	-- zad 57289	- musze tutaj bo na poziomie nagłówka jest za wcześnie - zmiana po kontrahencie przywraca domyslne
			UPDATE `zmng_e` n, `zmng` src
			SET
				n.ugrpguid = src.ugrpguid,
				n.lang_id = src.lang_id
			WHERE
				src.GUID = _ZM_Key
				AND n.GUID = _IdnNg
			;
		END IF;
	END IF;		-- _MODE = 'From.zmng'

	IF(_MODE = 'Kopiuj.1.pozycje') THEN
	
	/*
		Sklonuj 1 pozycję zamowienia
		parametry
		_GUID		GUID NOWEJ pozycji
		_Ilosc		Ilosc
		_Param_A	GUID pozycji do sklonowania
		CALL zmpo_E_Let_Insert('Kopiuj.1.pozycje', @_oppo_GUID, '', '', Ilosc, 0, 'GUID do sklonowania', '', '', '');  -- multiplikowanie pozycji
		_Ilosc jet tu liczb calk. i mowi na ile wierszy rozbic wiersz o GUID = _GUID
	*/
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_ZAM_Kopiuj`;
		CREATE TEMPORARY TABLE `t_zmpo_ZAM_Kopiuj` LIKE `zmpo_e`;
		INSERT INTO `t_zmpo_ZAM_Kopiuj` SELECT * FROM `zmpo_e` WHERE guid = _Param_A;

		UPDATE `t_zmpo_ZAM_Kopiuj` p
		SET
			p.IDN = 0,
			p.GUID = _GUID,	
			p.Ilosc = IFNULL(_Ilosc, 0.0),
			p.zrealizowano = 0, 
			-- p.zlecono = 0, 
			p.localtime = now(), p.remotetime = NULL,
			p.wersja = IF(p.Rodzaj = @ht.CZmOF, p.wersja, 0),
			p.Spakowano = 0
		;	
	--	Wstaw do `zmpo_e`
		INSERT IGNORE INTO `zmpo_e` 
			SELECT * FROM `t_zmpo_ZAM_Kopiuj`
		;

		CALL zmpo_E_Let_Update('one_rec', _GUID, '', '', '');
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_ZAM_Kopiuj`;
	END IF;		-- _MODE = 'From.zmng' 
	
	IF(_MODE LIKE 'Multiplikuj%') THEN
	/*
		CALL zmpo_E_Let_Insert('Multiplikuj', @_oppo_GUID, '', '', 3, 0, '', '', '', '');  -- multiplikowanie pozycji
		_Ilosc jet tu liczb calk. i mowi na ile wierszy rozbic wiersz o GUID = _GUID
	*/
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_ZAM_Kopiuj`;
		CREATE TEMPORARY TABLE `t_zmpo_ZAM_Kopiuj` LIKE `zmpo_e`;
		INSERT INTO `t_zmpo_ZAM_Kopiuj` SELECT * FROM `zmpo_e` WHERE guid = _guid;
		
		SELECT 
			Ilosc,
			IdnNg
		INTO
			@zm.Multiplikuj.Prev.Ilosc,
			@zm.Multiplikuj.Prev.IdnNg
		FROM `t_zmpo_ZAM_Kopiuj` 
		WHERE 
			GUID = _GUID 
		;
		
		SET 
			@zm.Multiplikuj.Count = FLOOR(_Ilosc),
			@zm.I = 1
		;
		
		CALL _IReg_Get('', 'PodzialPozycjiPrecyzja', 0, 'INTEGER', @session.HT.PodzialPozycjiPrecyzja, 0);  

		SET
			@zm.Multiplikuj.1_Ilosc = _Rnd((@zm.Multiplikuj.Prev.Ilosc / @zm.Multiplikuj.Count), @session.HT.PodzialPozycjiPrecyzja)
--			@zm.Multiplikuj.1_Ilosc = @zm.Multiplikuj.Prev.Ilosc DIV @zm.Multiplikuj.Count
		;
		SET
			@zm.Multiplikuj.Last_Ilosc = @zm.Multiplikuj.Prev.Ilosc - (@zm.Multiplikuj.1_Ilosc * @zm.Multiplikuj.Count) + @zm.Multiplikuj.1_Ilosc
		;
		-- SELECT
		-- @zm.Multiplikuj.Count, @zm.Multiplikuj.Prev.Ilosc, @zm.Multiplikuj.1_Ilosc, @zm.Multiplikuj.Last_Ilosc
		-- ;		
		WHILE @zm.I <= @zm.Multiplikuj.Count DO
		--	Ustal ILOSC
			SET @zm.Multiplikuj.Ilosc = 
				IF(@zm.I < @zm.Multiplikuj.Count,
					@zm.Multiplikuj.1_Ilosc,
					@zm.Multiplikuj.Last_Ilosc
				)
			;
			IF @zm.I = 1 THEN
			--	dla pierwzej pozycji nie zmieniam GUIDa bo to ta sama wyjsciowa pozycja , dopiero od 2 czyli 2 3 ... zmieniamy GUIDy
				UPDATE `zmpo_e` p
				SET
					p.Ilosc = @zm.Multiplikuj.Ilosc
				WHERE 
					p.GUID = _GUID
				;	
			ELSE
			--	dla 2-ej pozycji czyli 2 3 ... zmieniamy GUIDy
			
			--	Uzupelnij klucze i  ILOSC
				UPDATE `t_zmpo_ZAM_Kopiuj` p
				SET
					p.IDN = 0,
					p.GUID = NEWGUID(),	
					p.Ilosc = @zm.Multiplikuj.Ilosc
				;	
			--	Wstaw do `zmpo_e`
				INSERT IGNORE INTO `zmpo_e` 
					SELECT * FROM `t_zmpo_ZAM_Kopiuj`
				;
			END IF;
			
			SET @zm.I = @zm.I + 1;
		END WHILE;
		
		--	na koniec przelicz pozycje
		UPDATE `zmpo_e` p 
		SET 
			p.Tag = -1
		WHERE
			p.IdnNg = @zm.Multiplikuj.Prev.IdnNg
		;
		--	na koniec wyczysc wyjsciowy/pierwotny rekord	
		-- DELETE FROM `zmpo_e` WHERE GUID = _GUID;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_ZAM_Kopiuj`;
		
	END IF;		-- IF(_MODE LIKE 'Multiplikuj%') THEN
	
END$$ 
-- zmpo_E_Let_Insert

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

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

*/
S_zmpo_E_Let_Update: BEGIN 

	DECLARE _IdnTowr VARCHAR(38);
	DECLARE _Ilosc, _CenaNet DECIMAL(16,4);
	DECLARE _SQLText TEXT;
	
	SET _GUID = IFNULL(_GUID, '');
	SET @aDoIt = @session.HT.IR.Wymus_przepisywanie_katcol_do_poz;
	SET @zmpo_e_Update_e_from_zmng_e = 'TAK';
	IF _MODE IN ('one_rec', '') AND (_GUID != '') THEN
		CALL zmpo_E_Let_Update('from_zmng_e', _GUID, _IdnNg, _Param_A, _Param_B);
	END IF; --	_MODE = 'one_rec' 
	
	IF _MODE = 'from_zmng_e' THEN
		UPDATE `zmpo_e` p, `zmng_e` n
		SET
			p.Tymczasowa = n.Tymczasowa,
			p.KontrGUID = n.KontrGUID,
			p.idn_kontrah = n.idn_kontrah,
			p.rodzaj = n.rodzaj,
			p.rodzaj_typ = n.rodzaj_typ,
			p.terminrealizacji = IFNULL(p.terminrealizacji, n.terminrealizacji),
			p.idnmagazyn = IF(IFNULL(p.idnmagazyn, 0) = 0, n.idnmagazyn, p.idnmagazyn),
			p.MagazynWys = IF(IFNULL(p.MagazynWys, 0) = 0, n.MagazynWys, p.MagazynWys),
			p.kat0 = IF(n.KatCol0 != -1 AND @aDoIt, n.KatCol0, p.kat0),
			p.kat1 = IF(n.KatCol1 != -1 AND @aDoIt, n.KatCol1, p.kat1),
			p.kat2 = IF(n.KatCol2 != -1 AND @aDoIt, n.KatCol2, p.kat2),
			p.kat3 = IF(n.KatCol3 != -1 AND @aDoIt, n.KatCol3, p.kat3),
			p.kat4 = IF(n.KatCol4 != -1 AND @aDoIt, n.KatCol4, p.kat4),
			p.kurs = n.kurs,
			p.Tag = IF(_Param_B = 'CalcXXPo', -1, p.Tag)
		WHERE
			IF(_GUID != '', p.GUID = _GUID, p.IdnNg = _IdnNg)
			AND
			n.GUID = p.IdnNg
		;	
		IF @ht.ZezwalajNaGrupowaniePozycji  THEN
			CALL C_HT_xxNgPo_GRP('P.Ungroup.Zombie', 'ZM', 'E', _IdnNg, '', '', '', '', '');		
		END IF;
	END IF; --	_MODE = 'from_zmng_e' 
	
	IF _MODE = 'from_zmng_e.after.insert' THEN
		UPDATE `zmpo_e` p, `zmng_e` n
		SET
			p.Tymczasowa = n.Tymczasowa,
			p.idn_kontrah = n.idn_kontrah,
			p.rodzaj = n.rodzaj,
			p.rodzaj_typ = n.rodzaj_typ,
			p.terminrealizacji = IFNULL(n.terminrealizacji, p.terminrealizacji),
			p.idnmagazyn = IFNULL(n.idnmagazyn, p.idnmagazyn),
			p.MagazynWys = IFNULL(n.MagazynWys, p.MagazynWys),
			p.kat0 = IF(n.KatCol0 != -1 AND @aDoIt, n.KatCol0, p.kat0),
			p.kat1 = IF(n.KatCol1 != -1 AND @aDoIt, n.KatCol1, p.kat1),
			p.kat2 = IF(n.KatCol2 != -1 AND @aDoIt, n.KatCol2, p.kat2),
			p.kat3 = IF(n.KatCol3 != -1 AND @aDoIt, n.KatCol3, p.kat3),
			p.kat4 = IF(n.KatCol4 != -1 AND @aDoIt, n.KatCol4, p.kat4),
			p.kurs = n.kurs
		WHERE
			IF(_GUID != '', p.GUID = _GUID, p.IdnNg = _IdnNg)
			AND
			n.GUID = p.IdnNg
		;	
	END IF; --	_MODE = 'from_zmng_e.after.insert'
	
	IF _MODE = 'when.kontrguid.changed.from_opng_e' THEN
	SET @aDoIt = @session.HT.IR.Wymus_przepisywanie_katcol_do_poz;
	SET @zmpo_e_Update_e_from_zmng_e = 'TAK';
		UPDATE `zmpo_e` p, `zmng_e` n
		SET
			p.idn_kontrah = n.idn_kontrah,
			p.rabat = IFNULL(n.rabat, 0),
			p.idncennik = n.klasacenowa,
			p.kurs = n.kurs
		WHERE
			IF(_GUID != '', p.GUID = _GUID, p.IdnNg = _IdnNg)
			AND
			n.GUID = p.IdnNg
		;	
		CALL _pozycje_cenyrabat_zmpo_e('dla.IdnOper', _IdnNg, FALSE, FALSE, '', '');  --	dla wszystkich pozycji o IdnOper = _IdnOper 
	END IF; --	_MODE = 'from_opng_e' 
	
	IF _MODE = 'lp' THEN
		-- POBIERZ z oper_doc SortTyp !!!!!!!!!!!!!!!!!!
		/*	było
		
		IF _Param_A = '' THEN
			SET @aSortTyp = 0;
		ELSE
			SET @aSortTyp = _VarInt(_Param_A);
		END IF;
		
		
		SET @LP = 0;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_lp`;
		IF @aSortTyp = @ht.COpTypSortTyp_NONE THEN
			CREATE TEMPORARY TABLE `t_zmpo_e_lp` AS
				SELECT
					p.GUID, 
					-- _VarInt(@LP := @LP + 1) AS LP
					_VarInt(0) AS LP
				FROM `zmpo_e` p
				LEFT JOIN `TowrNg` t ON p.idntowr = t.GUID
				WHERE
					p.IdnNg = _IdnNg
				-- ORDER BY IF(p.Idn = 0, LPAD(p.LP, 8, '0'), CONCAT('a', p.IDN))
				-- ORDER BY IF(p.Idn = 0, CONCAT('Z', p.LP), CONCAT('A', p.IDN))
				ORDER BY p.LP, p.Idn
			;		
		ELSEIF @aSortTyp = @ht.COpTypSortTyp_Usluga_TreeNode_Symbol THEN
			CREATE TEMPORARY TABLE `t_zmpo_e_lp` AS
				SELECT
					p.GUID, 
					-- _VarInt(@LP := @LP + 1) AS LP
					_VarInt(0) AS LP
				FROM `zmpo_e` p
				LEFT JOIN `TowrNg` t ON p.idntowr = t.GUID
				WHERE
					p.IdnNg = _IdnNg
				ORDER BY p.usluga, t.Treenode, p.towrsymb
			;		
		ELSEIF @aSortTyp = @ht.COpTypSortTyp_Usluga_Symbol THEN
			CREATE TEMPORARY TABLE `t_zmpo_e_lp` AS
				SELECT
					p.GUID, 
					-- _VarInt(@LP := @LP + 1) AS LP
					_VarInt(0) AS LP
				FROM `zmpo_e` p
				WHERE
					p.IdnNg = _IdnNg
				ORDER BY IF(IFNULL(p.IdnTowr, '') = '', 'ZZZZZZ', ''), p.usluga, p.towrsymb	
			;		
		END IF;

		SET @LP = 0;
		UPDATE `t_zmpo_e_lp` t
		SET 
			t.LP = _VarInt(@LP := @LP + 1)
		;
		
		UPDATE `zmpo_e` p, `t_zmpo_e_lp` t
		SET
			p.lp = t.lp
		WHERE 
			p.GUID = t.GUID
		; 
		DROP TEMPORARY TABLE `t_zmpo_e_lp`;
		jest	*/
		CALL C_HT_xxNgPo_DO('CHECK.NgPO.INF', 'ZM', 'E', _IdnNg, '', NULL, NULL, NULL, NULL, NULL);
		CALL C_HT_xxNgPo_DO('PO.CALC_LP', 'ZM', 'E', _IdnNg, '', NULL, NULL, NULL, NULL, NULL);
		
		CALL _ng_E_Tools('update.LP', _IdnNg, 'ZM', '');
	END IF; --	_MODE = 'lp' 
	
	IF _MODE = 'waluta.changed' THEN
	--	zmiana waluty czyli de facto kursu 
		SELECT p.Kurs INTO @p.OLDKurs FROM `zmpo_e` p WHERE p.IdnNg = _IdnNg LIMIT 1;
		UPDATE `zmng_e` n,  `zmpo_e` p
		SET
			p.Kurs = n.Kurs,
			p.cenanet =  _Rnd(p.cenanet*@p.OLDKurs/n.Kurs, IF(n.Kurs != 1, @session.HT.IR.CenyPrecisionWalutowe, @session.HT.IR.CenyPrecisionPLN))
		WHERE
			n.GUID = _IdnNg
			AND
			p.IdnNg = _IdnNg
			AND
			n.Kurs > 0
		;
	END IF; --	_MODE = 'waluta.changed'
	
	IF _MODE = 'przenumeruj.wersje' THEN
	--	zmiana waluty czyli de facto kursu 
		DROP TEMPORARY TABLE IF EXISTS `t_wersje_zm`;
		CREATE TEMPORARY TABLE `t_wersje_zm` SELECT Wersja, Wersja AS New_Wersja FROM `zmpo_e` p WHERE p.IdnNg = _IdnNg GROUP BY p.Wersja ORDER BY Wersja; 
		SET @LP = 0;
		UPDATE `t_wersje_zm` t
		SET
			t.New_Wersja = _VarInt(@LP := @LP + 1)
		;
		UPDATE `zmpo_e` p
		SET
			p.wersja = 
				IFNULL(
					(SELECT t.New_Wersja FROM `t_wersje_zm` t WHERE p.wersja = t.wersja), 
					p.wersja
				)
		WHERE 
			p.IdnNg = _IdnNg
		;
		UPDATE `zmng_e` n
		SET
			n.wersja = 
				IFNULL(
					(SELECT t.New_Wersja FROM `t_wersje_zm` t WHERE n.wersja = t.wersja), 
					n.wersja
				)
		WHERE 
			n.GUID = _IdnNg
		;
	END IF; --	_MODE = 'przenumeruj.wersje' THEN
	
END$$

/* ************************************************************************************************************************************************************************
	Grupowanie po polach grp_ 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `zmpo_grp_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `zmpo_grp_tools`(
	IN _MODE VARCHAR(250),
	IN _IdnNg VARCHAR(38),
	IN _GRP_GUID VARCHAR(38),
--	DOUBLE,
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255)
)
/*
	CALL zmpo_grp_tools('WIZ.Init', _IdnNg, 0, '', '');
	CALL zmpo_grp_tools('WIZ.Init', _IdnNg, 0, '', '');
	UWAGA od VII 2023 wołane jest NEW.xxx i wtedy całkowicie pomijamy stare temporarki!!!
*/
S_zmpo_grp_tools: BEGIN 
	
--	Dla WIZ.Apply dla starych wywołań (nie 'NEW.WIZ.Apply') zczytaj dane z starych temporarek z EXE-ca
	IF _MODE = 'WIZ.Apply' THEN
		UPDATE `t_zmpo_e_grp_p` t1, `t_xxpo_grp_p` t2
		SET
			t2.Checked = t1.Checked
		WHERE
			t2.GUID = t1.GUID
		;
		UPDATE `t_zmpo_e_grp_n` t1, `t_xxpo_grp_n` t2
		SET
			t2.Checked = t1.Checked,
			-- t2.grp_GUID = t1.GUID,
			t2.grp_TowrSymb = t1.grp_TowrSymb,
			t2.grp_TowrNazwa = t1.grp_TowrNazwa,
			t2.grp_Jednostka = t1.grp_Jednostka,
			t2.grp_Ilosc = t1.grp_Ilosc
		WHERE
			t2.GUID = t1.GUID
		;
	END IF;
--	Wołanie globalne uniwersalne	
	CALL C_HT_xxNgPo_GRP(REPLACE(_MODE, 'NEW.', ''), 'ZM', 'E', _IdnNg, _GRP_GUID, _Param_A, '', '', '');				
--	Dla WIZ.Init dla starych wywołań (nie 'NEW.WIZ.Init') powołaj do życia stare temporarki dla EXE-ca
	IF _MODE = 'WIZ.Init' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_p`;
		CREATE TEMPORARY TABLE `t_zmpo_e_grp_p`
			SELECT * FROM `t_xxpo_grp_p`
		;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_n`;
		CREATE TEMPORARY TABLE `t_zmpo_e_grp_n`
			SELECT * FROM `t_xxpo_grp_n`
		;
	END IF;
	
	LEAVE S_zmpo_grp_tools;






	
	IF _MODE = 'WIZ.Init' THEN
		
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_n`;
		CREATE TEMPORARY TABLE `t_zmpo_e_grp_n`
			SELECT
				p.GUID,
				_VarInt(p.grp_GUID = _GRP_GUID) AS Checked,
				_VarStr(_GRP_GUID) AS `_GRP_GUID`,
				p.grp_TowrSymb,
				p.grp_TowrNazwa,
				IF(p.grp_Ilosc = 0, 1, p.grp_Ilosc) AS grp_Ilosc,
				p.grp_Jednostka,
				p.idnvat
			FROM `zmpo_e` p
			WHERE
				p.GUID = _GRP_GUID
		;
		IF @session.globals.Owner IN ('SEVENET','TRANSBUD','COMEX') THEN
			SET _Param_A = '1';
		END IF;
		IF _Param_A != '' THEN
			UPDATE `t_zmpo_e_grp_n` t, `zmpo_e` p
			SET
				t.grp_TowrSymb = p.TowrSymb,
				t.grp_TowrNazwa = 
					IF(@session.globals.Owner != 'TRANSBUD',
						p.TowrNazwa,
						CONCAT(p.TowrNazwa, ' ', IFNULL((SELECT v.Valuex FROM `v_ktw0` v WHERE v.klucz = p.kat5), ''))
					),
				t.grp_Jednostka = p.Jednostka,
				t.grp_Ilosc = p.Ilosc
			WHERE
				t.GUID = _GRP_GUID
				AND IF(@session.globals.Owner != 'TRANSBUD',p.grp_GUID='',TRUE)
				AND p.GUID = t.GUID
			;
		END IF;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_p`;
		CREATE TEMPORARY TABLE `t_zmpo_e_grp_p`
			SELECT
				p.GUID,
				_VarInt((p.grp_GUID = _GRP_GUID) OR (p.GUID = _GRP_GUID)) AS Checked,
				p.towrsymb,
				IF(IFNULL(p.TowrNazwa2, '') != '', p.TowrNazwa2, p.TowrNazwa) AS TowrNazwa,
				-- p.towrnazwa,
				p.Ilosc,
				pn.idnvat,
				v.ShortName AS VatStr,
				J.Nazwa AS JednostkaStr,
				(p.idnvat = pn.idnvat) AS OK_idnvat,
				IFNULL(n.nrdokmag,'') AS nrdokmag,
				n.datawystaw AS data_wz, 
				(p.GUID = _GRP_GUID) AS IS_BigBrother
			FROM `zmpo_e` p
			LEFT JOIN `t_zmpo_e_grp_n` pn ON pn.GUID = _GRP_GUID
			LEFT JOIN `v_erp_vat` v ON v.ID = p.idnvat
			LEFT JOIN Jednostki J ON J.idn = p.Jednostka 
			LEFT JOIN  `zmng` n ON p.IdnNg=n.guid
			WHERE
				(p.IdnNg = _IdnNg)
				AND
				p.grp_GUID IN ('', _GRP_GUID)
				-- AND p.GUID != _GRP_GUID
				
		;
		ALTER TABLE `t_zmpo_e_grp_p` ADD PRIMARY KEY GUID(`GUID`);
	END IF; --	_MODE = 'WIZ.Init' 
	
	IF _MODE = 'WIZ.Apply' THEN
		CALL C_HT_xxNgPo_GRP(_MODE, 'ZM', 'E', _IdnNg, _GRP_GUID, _Param_A, '', '', '');				
		LEAVE S_zmpo_grp_tools;





		
		UPDATE `t_zmpo_e_grp_n` t, `zmpo_e` p
		SET
			p.grp_GUID = p.GUID,
			p.grp_TowrSymb = t.grp_TowrSymb,
			p.grp_TowrNazwa = t.grp_TowrNazwa,
			p.grp_Jednostka = t.grp_Jednostka,
			p.grp_Ilosc = t.grp_Ilosc
		WHERE
			p.GUID = t.GUID
		;
		UPDATE `t_zmpo_e_grp_p` t, `zmpo_e` p
		SET
			p.grp_GUID = IF(t.Checked, _GRP_GUID, '')
		WHERE
			p.GUID = t.GUID
			AND
			t.OK_idnvat
		;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_n`;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_p`;
	END IF; --	_MODE = 'WIZ.Apply' 
	
	IF _MODE = 'WIZ.Cancel' THEN
		CALL C_HT_xxNgPo_GRP(_MODE, 'ZM', 'E', _IdnNg, _GRP_GUID, _Param_A, '', '', '');				
		LEAVE S_zmpo_grp_tools;


		
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_n`;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp_p`;
	END IF; --	_MODE = 'WIZ.Cancel' 
	
	IF _MODE = 'Ungroup' THEN
		CALL C_HT_xxNgPo_GRP(_MODE, 'ZM', 'E', _IdnNg, _GRP_GUID, _Param_A, '', '', '');				
		LEAVE S_zmpo_grp_tools;


		
		UPDATE `zmpo_e` p
		SET
			p.grp_GUID = '',
			
			p.grp_TowrSymb = DEFAULT(p.grp_TowrSymb),
			p.grp_TowrNazwa = DEFAULT(p.grp_TowrNazwa),
			p.grp_Jednostka = DEFAULT(p.grp_Jednostka),
			p.grp_Ilosc = DEFAULT(p.grp_Ilosc)
		WHERE
			p.IdnNg = _IdnNg
			AND
			p.grp_GUID = _GRP_GUID
		;
	END IF; --	_MODE = 'Ungroup' 
	
	IF _MODE = 'select.view' THEN
		CALL C_HT_xxNgPo_GRP(_MODE, 'ZM', 'E', _IdnNg, _GRP_GUID, _Param_A, '', '', '');				
		LEAVE S_zmpo_grp_tools;


		
	
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp`;
		CREATE TEMPORARY TABLE `t_zmpo_e_grp`
			SELECT
				IF(@IS.grp := (IFNULL(p.grp_GUID, '') != ''),  p.grp_GUID, p.GUID) AS GUID,
				IF(@IS.grp := (IFNULL(p.grp_GUID, '') != ''),  p.grp_GUID, p.GUID) AS GGUID,
				@IS.grp_Node := @IS.grp AND (p.grp_GUID = p.GUID) AS IS_Grp_Node,
				IF(@IS.grp, p.grp_GUID, '') AS grp_GUID,
				p.IdnTowr,
				p.towrsymb,
				-- p.towrnazwa,
				IF(IFNULL(p.TowrNazwa2, '') != '', p.TowrNazwa2, p.TowrNazwa) AS TowrNazwa,
				p.Jednostka,
				p.Ilosc,
				-- MAX(IF(@IS.grp, grp_TowrSymb, p.towrsymb)) AS towrsymb,
				-- MAX(IF(@IS.grp, grp_TowrNazwa, p.towrnazwa)) AS towrnazwa,
				-- IF(@IS.grp, grp_Ilosc, p.Ilosc) AS Ilosc,
				SUM(WartNet) AS WartNet,
				SUM(WartVat) AS WartVat,
				SUM(WartBrt) AS WartBrt,
				SUM(WartNetWal) AS WartNetWal,
				SUM(WartBrtWal) AS WartBrtWal,
				p.CenaNet,
			-- 	nie ma takiego pola w zmpo 
				-- p.cenanetWal,
				IF(p.Ilosc != 0, p.WartNetWal/p.Ilosc, 0) AS CenaNetWal,
				p.CenaBrt
			FROM `zmpo_e` p
			WHERE
				(p.IdnNg = _IdnNg)
			GROUP BY GGUID
		;
		ALTER TABLE `t_zmpo_e_grp` ADD PRIMARY KEY GUID(`GUID`), ADD KEY grp_GUID(`grp_GUID`);
		
		IF _IdnNg = '' THEN 
			TRUNCATE `t_zmpo_e_grp`;
		END IF;
		
		UPDATE `t_zmpo_e_grp` tp, `zmpo_e` p
		SET
			tp.towrsymb = p.grp_TowrSymb,
			tp.towrnazwa = p.grp_TowrNazwa,
			tp.Ilosc = p.grp_Ilosc,
			tp.Jednostka = IFNULL(p.grp_Jednostka, tp.Jednostka),
			tp.IdnTowr = p.grp_IdnTowr
		WHERE
			tp.grp_GUID != ''
			AND
			tp.GUID = p.GUID
		;
		UPDATE `t_zmpo_e_grp` tp
		SET
			tp.CenaNet = IF(tp.Ilosc != 0, tp.WartNet/tp.Ilosc, 0),
			tp.CenaBrt = IF(tp.Ilosc != 0, tp.WartBrt/tp.Ilosc, 0)
			-- 	nie ma takiego pola w zmpo 
			-- tp.CenaNetWal = IF(tp.Ilosc != 0, tp.WartNetWal/tp.Ilosc, 0)
		WHERE
			tp.grp_GUID != ''
		;

		SELECT
			tp.GUID,
			tp.IdnTowr,
			tp.TowrSymb,
			tp.TowrNazwa,
			tp.Ilosc, 
			tp.Jednostka,
		
			tp.CenaNet, 
			tp.CenaBrt,
		-- 	nie ma takiego pola w zmpo 
			-- tp.CenaNetWal,
			IF(tp.Ilosc != 0, tp.WartNetWal/tp.Ilosc, 0) AS CenaNetWal,
			tp.WartNet,
			tp.WartVat,
			tp.WartBrt,
			tp.WartNetWal,
			tp.WartBrtWal,
			
			v.shortName AS VatStr,
			J.Nazwa AS JednostkaStr, 
			(tp.grp_GUID != '') AS IS_Grp_Node,
			IFNULL(n.nrdokmag,'') AS nrdokmag,
			n.datawystaw AS data_wz,
			p.*
		FROM `t_zmpo_e_grp` tp
		INNER JOIN `zmpo_e` p ON p.GUID = tp.GUID
		LEFT JOIN  `zmng` n ON p.IdnNg=n.guid
		LEFT JOIN `v_erp_vat` v ON v.ID = p.IdnVat
		LEFT JOIN Jednostki J ON J.idn = tp.Jednostka 
		WHERE
			TRUE
		ORDER BY IS_Grp_Node DESC, tp.TowrSymb 
		;
		DROP TEMPORARY TABLE IF EXISTS `t_zmpo_e_grp`;
	END IF; --	_MODE = 'select.view' 

	IF _MODE = 'select.view.detail' THEN
		CALL C_HT_xxNgPo_GRP(_MODE, 'ZM', 'E', _IdnNg, _GRP_GUID, _Param_A, '', '', '');				
		LEAVE S_zmpo_grp_tools;


		
		
		SELECT
			p.GUID,
			p.grp_GUID,
			p.IdnTowr,
			p.TowrSymb,
			IF(IFNULL(p.TowrNazwa2, '') != '', p.TowrNazwa2, p.TowrNazwa) AS TowrNazwa,
			p.Ilosc, 
			p.CenaNet, 
			p.CenaBrt,
		-- 	nie ma takiego pola w zmpo 
			-- p.CenaNetWal,
			IF(p.Ilosc != 0, p.WartNetWal/p.Ilosc, 0) AS CenaNetWal,
			p.WartNet,
			p.WartVat,
			p.WartBrt,
			p.WartNetWal,
			p.WartBrtWal,
			v.shortName AS VatStr,
			J.Nazwa AS JednostkaStr,
			IFNULL(n.nrdokmag,'') AS nrdokmag,
			n.datawystaw AS data_wz			
			FROM `zmpo_e` p 
			LEFT JOIN `v_erp_vat` v ON v.ID = p.IdnVat
			LEFT JOIN Jednostki J ON J.idn = p.Jednostka 
			LEFT JOIN `zmng` n ON p.IdnNg=n.guid 
			WHERE
				TRUE
				-- AND p.IdnNg_e = _IdnNg
				AND (p.IdnNg = _IdnNg)

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

	
END$$


DELIMITER ;

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


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

/*  Zmiany CVS
$Log$
*/
