 DELIMITER $$

DROP PROCEDURE IF EXISTS `op_instancje_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `op_instancje_tools`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(255),	
	IN _Key2 VARCHAR(255),	
	-- IN _Param_A VARCHAR(255),
	IN _Param_A VARCHAR(255),
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255),
	IN _Param_E TEXT
) 
S_op_instancje_tools: BEGIN 

	DECLARE _IdnOper, _IdnOper_2, _ID_op, _GUID_Inst, _IdnTowr, _KontrGUID, _OsobaGUID, _AreaGUID VARCHAR(38);
	DECLARE _SearchKey VARCHAR(250);
	DECLARE _rodzaj, _rodzaj_typ, _Ilosc, _Magazyn INTEGER;
	DECLARE _is_multi_instancje BOOLEAN DEFAULT FALSE;
	
	IF _MODE LIKE 'WWW.SELECT%' THEN
	/* *************************************************************************************************************************************************************
		Selecty
		CALL op_instancje_tools('WWW.SELECT', '2016-04-20', '', '', '', '', '');		
		CALL op_instancje_tools('WWW.SELECT.Archiwum', 'Akwiz', '', '2016-04-20', '', '', '');		
		CALL op_instancje_tools('WWW.SELECT.DETAL', 'ID', '', '', '', '', '');		
		CALL op_instancje_tools('WWW.SELECT.Archiwum.DETAL', 'ID', '', '', '', '', '');		
		CALL op_instancje_tools('WWW.SELECT.DETAL.oppo.zwroty', 'ID detalu', '', '', '', '', '');		
		CALL op_instancje_tools('WWW.SELECT.DETAL.oppo.korekty', 'ID detalu', '', '', '', '', '');		
		_Key		AkwizytorGUID
		_Param_B	Data do
		_Param_C	Typ klientów "" i "7" oznacza 7 dniwoych "30" 30 dniwoych.
	**************************************************************************************************************************************************************/
		SET
			_IdnOper = _Key
		;
	END IF;
	
	IF _MODE LIKE 'OPER.%' THEN
	/* *************************************************************************************************************************************************************
		Selecty
		CALL op_instancje_tools('OPER.NEW', 'IdnOper', @_G_I, 46, 0, 'pan Janusz', 'pokoik', '');		
		_Key		IdnOper
		_Key2		GUID_Inst
		_Param_A	rodzaj
		_Param_B	rodzaj_typ
		_Param_C	Osoba
		_Param_D	Miejsce

		CALL op_instancje_tools('OPER.Insert.rec', 'IdnOper', @_G_I, 46, 0, 'pan Janusz', 'pokoik', '');		
		_Key		IdnOper
		_Key2		GUID_Inst
		_Param_A	rodzaj
		_Param_B	rodzaj_typ
		_Param_C	Osoba
		_Param_D	Miejsce
		
		Zapis - czyli de facto zmiana statusu i update w towrng_instancje
		CALL op_instancje_tools('OPER.APPLY', @IdnOper, _KontrGUID, _Magazyn, '', '', '', 'UWAGI');					
		_Key		IdnOper
		_Key2		KontrGUID
		_Param_A	Magazyn
		...
		_Param_E	UWAGI

		Cancel - czyli de facto wycofanie statusu EDIT na '' lub usuniecie NEW
		CALL op_instancje_tools('OPER.CANCEL', 'IdnOper', '', 46, 0, '', '', '');		
		_Key		IdnOper
		_Param_A	rodzaj
		_Param_B	rodzaj_typ
		
	**************************************************************************************************************************************************************/
		SET
			_IdnOper = _Key,	
			_GUID_Inst = _Key2,
			_rodzaj = _Param_A,
			_rodzaj_typ = _Param_B,
			_OsobaGUID = _Param_C,
			_AreaGUID = _Param_D		
		;
			
		IF _MODE LIKE 'OPER.NEW%' THEN
			/*
			INSERT IGNORE INTO `op_instancje` 
			(Id, idnoper, guid_oppo, rodzaj, rodzaj_typ, guid_instancji, ilosc, osobaGUID, AreaGUID)
			VALUES (
			'?', _IdnOper, '?',
			_rodzaj, _rodzaj_typ,
			_GUID_Inst,
			1,
			_OsobaGUID, _AreaGUID
			)
			;
			*/
			CALL ht_op_instancje_rec('Insert', '', _IdnOper, _GUID_Inst, _rodzaj, _rodzaj_typ, _OsobaGUID, _AreaGUID, 1);			
			CALL op_instancje_tools('OPER.APPLY', _IdnOper, '', -1, '', '', '', '');		
			
			/*
			UPDATE `op_instancje` op
			SET
				op.E_status = ''
			WHERE
				op.IdnOper = _IdnOper
			;
			CALL op_instancje_tools('towrng_instancje.update_from_last_OP', '', '', 0, 0, '', '', '');
			*/
		END IF;

		
								IF _MODE LIKE 'OPER.Get.@.Info' THEN
									SELECT 
										op.Rodzaj, op.rodzaj_typ, od.grupa AS MagTyp, od.MA_Detale, ot.Is_Instancje,
										op.OsobaGUID, op.AreaGUID,
										EXISTS(SELECT GUID FROM `opng` n WHERE n.GUID = op.IdnOper) AS Exists_opng
									INTO
										@.op.Rodzaj, @.op.rodzaj_typ, @.od.MagTyp, @.od.MA_Detale, @.ot.Is_Instancje, @.op.OsobaGUID, @.op.AreaGUID, @.Exists_opng
									FROM `op_instancje` op, `operdoc` od,`operdoc_typy` ot
									WHERE
										op.IdnOper = _IdnOper
										AND
										od.Rodzaj = op.Rodzaj
										AND
										ot.Rodzaj = op.Rodzaj
										AND
										ot.typ = op.rodzaj_typ
									LIMIT 1
									;
								END IF;
		
		IF _MODE LIKE 'OPER.APPLY%' THEN
			SET
				_KontrGUID = _Key2,
				_Magazyn = _Param_A
			;
			CALL ht_op_instancje_rec('POST.IdnOper', '', _IdnOper, '', 0, 0, '', '', '');			
		--	teraz ponizej - gdy nie ma opweracji w `opng` to w zaleznosci czy ma detale czy nie odp. tworze sam naglowek lub rowniez pozycji
			CALL op_instancje_tools('OPER.Stworz.operacje.do.op_instancje.w.opng.LUB.opng_e', _IdnOper, _KontrGUID, _Magazyn, 0, '', '', _Param_E);
			CALL op_instancje_tools('towrng_instancje.update_from_last_OP', '', '', 0, 0, '', '', '');
			
		--	teraz ewentualne zlecony wyd. do serwisu
			CALL op_instancje_tools('OPER.dodaj.powiazana.operacje', _IdnOper, _Key2, _Param_A, _Param_B, _Param_C, _Param_D, '+SERW');
			
		END IF;
		
		IF _MODE LIKE 'OPER.CANCEL%' THEN
			CALL ht_op_instancje_rec('CANCEL.IdnOper', '', _IdnOper, '', 0, 0, '', '', '');			
		END IF;

		IF _MODE LIKE 'OPER.dodaj.powiazana.operacje' THEN
		--	w _Param_E szukana - decydujaca szukana fraza w polu ExtInf
			IF _Param_E = '+SERW' THEN
				SET 
					_IdnOper_2 = CONCAT('SRW', MD5(CONCAT(_VarStr(_rodzaj), _VarStr(_rodzaj_typ), _IdnOper))),
					_rodzaj = 47, 
					_rodzaj_typ = 101
				;
			-- ELSEIF ?????
			--	?????
			ELSE
				LEAVE S_op_instancje_tools;
			END IF;
				
			INSERT IGNORE INTO `op_instancje` 
			(Id, idnoper, guid_oppo, rodzaj, rodzaj_typ, guid_instancji, ilosc, osobaGUID, AreaGUID)
			SELECT
				'?', _IdnOper_2, '?',
				_rodzaj, _rodzaj_typ,
				op.guid_instancji,
				1,
				'', op.AreaGUID
			FROM `op_instancje` op
			WHERE
				op.IdnOper = _IdnOper
				AND
				LOCATE(_Param_E, op.ExtInf) > 0
			;
			CALL ht_op_instancje_rec('POST.IdnOper', '', _IdnOper_2, '', 0, 0, '', '', '');			
		--	teraz ponizej - gdy nie ma opweracji w `opng` to w zaleznosci czy ma detale czy nie odp. tworze sam naglowek lub rowniez pozycji
			CALL op_instancje_tools('OPER.Stworz.operacje.do.op_instancje.w.opng.LUB.opng_e', _IdnOper_2, _Key2, _Param_A, _Param_B, _Param_C, _Param_D, _Param_E);
			CALL op_instancje_tools('towrng_instancje.update_from_last_OP', '', '', 0, 0, '', '', '');
		
		END IF;
					IF _MODE LIKE 'OPER.Stworz.operacje.do.op_instancje.w.opng.LUB.opng_e' THEN
						CALL op_instancje_tools('OPER.Get.@.Info', _IdnOper, '', 0, 0, '', '', '');		
					--	mam juz @.op.Rodzaj, @.op.rodzaj_typ, @.od.MA_Detale, @.ot.Is_Instancje, @.op.OsobaGUID, @.op.AreaGUID, @.Exists_opng	
						IF NOT @.Exists_opng AND @.ot.Is_Instancje THEN
						--	Nie ma jeszcze rekordu w `opng`
							IF NOT @.od.MA_Detale THEN
							--	Nie ma jeszcze rekordu w `opng`
							--	No i ta operacja nie ma własnych detali - BO GDY MA detale to zostaje nam tworzenie via swiat E :(
								INSERT IGNORE INTO `opng` 
								(
									GUID, Rodzaj, Rodzaj_typ, OsobaGUID, AreaGUID, 
									Datawystaw, Uwagi, NrdokMag
								)
								SELECT
									op.IdnOper, op.Rodzaj, op.Rodzaj_typ, op.OsobaGUID, op.AreaGUID, 
									CURRENT_DATE() AS Datawystaw, IFNULL(_Param_E, '') AS Uwagi, '<Brak>' AS NrdokMag
								FROM `op_instancje` op
								WHERE
									op.IdnOper = _IdnOper
									
								LIMIT 1
								;
							ELSE
							--	Nie ma jeszcze rekordu w `opng` ani w `opng_e`
							--	No i ta operacja MA DETALE - BO GDY NIE MA detali to nie tworzymy przez oppo_e
								SET
									_KontrGUID = _Key2,
									_Magazyn = _Param_A
								;
								CALL ht_rodzaj_update_zmienne(@.op.Rodzaj);
								SET
									@_KontrGUID = _KontrGUID,  
									@_Magazyn1 = IF(@ht.doc.MagTyp = @ht.mtPZ, 0, _Magazyn),
									@_Magazyn2 = IF(@ht.doc.MagTyp = @ht.mtRZ, 0, _Magazyn),
									@_Tymczasowa = 0, @_Waluta = 0, 
									@_Input_GUID = ''
								;
											set @instancje.testy = '1';
								CALL Opng_E_init('INSERT', _IdnOper, '', '', 'Server');
											set @instancje.testy = '2';
								CALL Opng_E_init_set('', _IdnOper, @.op.Rodzaj, @.op.rodzaj_typ, '', 4, @_KontrGUID, @_Magazyn1, @_Magazyn2, @_Tymczasowa, @_Waluta, @.op.OsobaGUID, @.op.AreaGUID, @_Input_GUID, 0, '', '', '');
											set @instancje.testy = '3';

								CALL Opng_E_Run('all', _IdnOper, '', '', '');
											set @instancje.testy = '4';
								
								CALL oppo_E_Let_Insert('FROM.op_instancje', '', _IdnOper, '', 1, 0, '', '', '', '');  -- dodawanie pozycji
											set @instancje.testy = '5';
								UPDATE `opng_e` n
								SET
									n.Uwagi = IFNULL(_Param_E, ''),
									n.NrdokMag = '<Brak>'
								WHERE
									n.GUID = _IdnOper
								;
								CALL opng_E_Let('Post', _IdnOper, '', '');
											set @instancje.testy = '6';
								CALL opng_E_Let('ApplyAndClear', _IdnOper, '', '1');
											set @instancje.testy = '7';
							END IF;
						END IF;
					END IF;
		
	END IF;

	IF _MODE LIKE 'GUI.EDIT.%' THEN
	/* *************************************************************************************************************************************************************
		Pobranie do grida górnego i dolnego
		CALL op_instancje_tools('GUI.EDIT.Grid.select', @IdnOper_P, '', 46, 0, '', '', '');		
		CALL op_instancje_tools('GUI.EDIT.Grid.select', @IdnOper_W, '', 47, 0, '', '', '');		
		_Key		IdnOper
					_Param_A	rodzaj
					_Param_B	rodzaj_typ

		DODAWANIE egzemplarzy ...
		Wyszukaj egzempl. by _SearchKey potem robisz select z 
		`WIZ_egzemplarze_choice_edit` do cds-a 
		uwzgledniajac ID_Session - aby miec sesje ustawiaj
		SET @SYSTEM.Client.Session.GUID = 'sesg';
		1. inicjuj
		CALL op_instancje_tools('GUI.EDIT.CHOICE.prepate', @IdnOper_W, 'wiert', 46, 0, '', '', '');	
		CALL op_instancje_tools('GUI.EDIT.CHOICE.prepate', @IdnOper_W, 'Młot pneumatyczny', 46, 0, '', '', '');	
		CALL op_instancje_tools('GUI.EDIT.CHOICE.prepate', @IdnOper_W, 'kask ochronn', 46, 0, '', '', '1');		--	tutaj pobierasz osobomloty czyli is_multi_instancje
		_Key		IdnOper
		_Key2		_SearchKey
		_Param_A	rodzaj
		_Param_B	rodzaj_typ
		_Param_E	'' lub 0 to instancje, <> '' to osobo
		2. Teraz do cds-a pobierasz 
			SELECT * FROM `WIZ_egzemplarze_choice_edit` WHERE is_ok; -- tu ustaw Ilosc na 1	a potem ....
		Zmieniasz pole Ilosc na 1 lub inna wartosc
		Po ApplyUpdates - w cds-ie w HT lub www - możesz wołac to ponizej aby dodac operacje op_instancje
		3. Dodanie rekordu
		CALL op_instancje_tools('GUI.EDIT.CHOICE.Insert.op', @IdnOper_P, '', 46, 0, 'pan Janusz', 'pokoik', '');		
		_Key		IdnOper
		_Param_A	rodzaj
		_Param_B	rodzaj_typ
		_Param_C	Osoba
		_Param_D	Miejsce
		
		Przykład
			CALL op_instancje_tools('GUI.EDIT.CHOICE.prepate', 'IdnOper', 'wiert', 46, 0, '', '', '');	
			SELECT * FROM `WIZ_egzemplarze_choice_edit`; -- tu ustaw Ilosc na 1	a po czym cds.ApplyChanges a potem ...  
			CALL op_instancje_tools('GUI.EDIT.CHOICE.Insert.op', 'IdnOper', '', 46, 0, 'pan Janusz', 'pokoik', '');		

		Zmien ilosc w istniejacym rekordzie na inna wartosc
		CALL op_instancje_tools('GUI.EDIT.Grid.Update.one', 'IdnOper', 'ID', 46, 0, '1', '', '');		
		_Key2		_ID_op ID pozycji
		_Param_C	Ilosc
		
		Na koniec 
		Apply lub Cancel
			Scenariusz
			na koniec Apply czyli
				CALL op_instancje_tools('OPER.APPLY', @IdnOper, _KontrGUID, _Magazyn, '', '', '', 'UWAGI');					
			lub usun
				CALL op_instancje_tools('OPER.CANCEL', @IdnOper, '', '', '', '', '', '');					
		
	**************************************************************************************************************************************************************/
		SET
			_IdnOper = _Key,	
			_rodzaj = _Param_A,
			_rodzaj_typ = _Param_B
		;
		IF _MODE = 'GUI.EDIT.Grid.select' THEN
		-- DAWNE IF _MODE = 'modify.before.select.insert.into.t_oppo_instancje_edit' THEN
			SELECT 	
				oe.*,
				/*
				oe.id, 
				oe.guid_oppo, 
				oe.guid_instancji, 
				*/
				ABS(oe.Ilosc) AS IloscView,
				/*
				oe.ilosc, 
				oe.osobaguid, 
				oe.areaGUID, 
				oe.rodzaj, 
				oe.rodzaj_typ, 
				oe.dataoper, 
				oe.deleted, 
				-- oe.lastOplustGUID, 
				oe.Prev_Op_GUID, 
				oe.idnoper,
				*/
				i.idntowr,
				i.kod_kreskowy,
				i.nr_seryjny,
				i.nrinwentarz,
				i.opis,
				i.status,
				i.status_biblioteczny,
				i.is_multi_instancje,
				IF(i.is_multi_instancje,
					-- CONCAT_WS(' - ', t.nazwa, oe.ExtInf),
					t.nazwa,
					t.nazwa
				) AS nazwa,
				n.Uwagi,
				_VarInt(LOCATE('+SERW', oe.ExtInf)) AS IleSerwisowych
				/*
				wywalamay
				_VarInt((
				SELECT COUNT(*) FROM `op_instancje` oi2 WHERE oi2.guid_instancji = oe.guid_instancji AND oi2.IdnOper = CONCAT('SRW', MD5(CONCAT(_VarStr(47), _VarStr(101), oe.IdnOper)))
				)) AS IleSerwisowych
				*/
				 
			FROM `op_instancje` oe
			LEFT JOIN `towrng_instancje` i ON i.GUID = oe.guid_instancji
			LEFT JOIN `TowrNg` t ON t.GUID = i.idntowr		
			LEFT JOIN `opng_e` n ON n.GUID = oe.idnoper
			WHERE
				oe.IdnOper = _IdnOper
			;
		
		END IF;
		
		IF _MODE = 'GUI.EDIT.Grid.Update.one' THEN
			SET 
				_ID_op = _Key2,
				_Ilosc = _Param_C
			;
			UPDATE `op_instancje` op
			SET
				op.Ilosc = _Ilosc
			WHERE
				op.ID = _ID_op
			;
		END IF;
		
		IF _MODE = 'GUI.EDIT.CHOICE.prepate' THEN
			SET
				_SearchKey = IF(IFNULL(_Key2, '') = '', '  ', _Key2),
				_is_multi_instancje = (_Param_E != '')
			;
			SET @X = '1';
		--	Zastap dwie space procentem dla wyszukiwania modulowego
			SET _SearchKey = REPLACE(_SearchKey, '  ', '%');
			SET @_SearchKey = _SearchKey;
			IF NOT _is_multi_instancje THEN
				CALL erp_instancje_tools('instancje.search.for.edit', _SearchKey, IF(LOCATE(' ', _SearchKey) > 0, '1', ''), '', '1', '1'); 
			ELSE
			SET @X = '2';
				CALL erp_instancje_tools('instancje.search.for.edit', _SearchKey, '', '1', '1', '1'); -- osobo mloty
			SET @X = '3';
			END IF;
			
			DELETE FROM `WIZ_egzemplarze_choice_edit` WHERE ID_Session = @SYSTEM.Client.Session.GUID;
			-- SET @X = '4';
			INSERT IGNORE INTO `WIZ_egzemplarze_choice_edit`
			/*
			BYŁO - bo przechodze na `v_instancje`
				SELECT
					@SYSTEM.Client.Session.GUID AS ID_Session,
					t.GUID AS ID_WIZ,
					t.*,
					i.kod_kreskowy,
					i.nr_seryjny,
					i.nrinwentarz,
					i.opis,
					i.status,
					i.status_biblioteczny,
					i.substatus_biblioteczny,
					i.serwis_data,
					i.serwis_cykl_dni,
					i.serwis_alert_dni,
					@Osoba_Majaca_Nastanie := _VarStr(CONCAT(o.Nazwisko, ' ', o.Imiona)) AS Osoba,
					_VarInt(@Dni_do_serwisu := IF(i.serwis_data IS NOT NULL, TIMESTAMPDIFF(DAY, NOW(), i.serwis_data), 0)) AS Dni_do_serwisu,
					_VarInt(@IsSerwisAlert := (@Dni_do_serwisu < i.serwis_alert_dni)) AS IsAlert,
					_VarInt(@serwis_alert_OK := (NOT @IsSerwisAlert OR NOT i.serwis_alert_blokuj)) AS Serwis_alert_OK,
					-- _VarStr(@IsAlertMsg := IF(@IsSerwisAlert, CONCAT('Do przeglądu pozostało dni: ', @Dni_do_serwisu), '')) AS IsAlertMsg,
					_VarStr(@IsAlertMsg := IF(@IsSerwisAlert, CONCAT(_res_str_get('oppo_e_instancje.AlertMsg', ''), @Dni_do_serwisu), '')) AS IsAlertMsg,
					_VarInt(
					@status_biblioteczny_OK := 
						(i.is_multi_instancje != 0) OR --	Multiinstancje lub...
						(
							(i.status_biblioteczny IN (ot.Status_Before, -100)) AND 	--	zgodny status before ale ZARAZEM...
							(LOCATE(CONCAT(i.substatus_biblioteczny, ','), CONCAT(ot.SubStatuses_Before, ',')) > 0)
						) 
					-- OR (ot.Status_After < 1)
					) AS status_biblioteczny_OK,
					(CONCAT(
						IF(NOT @status_biblioteczny_OK, 
							CONCAT(
							-- _res_str_get('oppo_e_instancje.Status_biblioteczny_Msg', ''), ' - ',
							'Dopuszczalne statusy dla operacji "', ot.Opis, '" to:\n',
							IFNULL((SELECT GROUP_CONCAT(CONCAT('"', sb.descr, '"')) FROM `erp_statusy_biblioteczne` sb WHERE sb.Status = ot.Status_Before AND (LOCATE(CONCAT(sb.SubStatus, ','), CONCAT(ot.SubStatuses_Before, ',')) > 0)), ''),
							'\n'
							'podczas gdy aktualnie egzemplarz ma status: ',
							IFNULL((SELECT CONCAT('"', sb.descr, '"') FROM `erp_statusy_biblioteczne` sb WHERE sb.Status = i.status_biblioteczny AND sb.SubStatus = i.Substatus_biblioteczny), ''),
							'\n'
							),
							''
						),
						IF(NOT @status_biblioteczny_OK AND i.status_biblioteczny = 1,
							CONCAT(' u osoby: ', @Osoba_Majaca_Nastanie),
							''
						),
						IF(NOT @serwis_alert_OK, 
							@IsAlertMsg, 
							''
						)
						)
					) AS Status_biblioteczny_Msg,
					_VarInt(@serwis_alert_OK AND @status_biblioteczny_OK) AS IS_OK,
					_VarDouble(0) AS Ilosc,
					i.opis AS Nazwa
				FROM `t_search_instancje` t 
				INNER JOIN `towrng_instancje` i ON i.GUID = t.GUID
				LEFT JOIN `operdoc_typy` ot ON ot.rodzaj = _rodzaj AND ot.typ = _rodzaj_typ
				-- LEFT JOIN `slowniki_pierwotne` sp_Expected ON sp_Expected.Slownik_GUID = 'STATUSY_BIBLIOTECZNE_INSTANCJI' AND sp_Expected.Value = ot.Status_Before
				-- LEFT JOIN `slowniki_pierwotne` sp_Real ON sp_Real.Slownik_GUID = 'STATUSY_BIBLIOTECZNE_INSTANCJI' AND sp_Real.Value = i.status_biblioteczny
				LEFT JOIN `osoby` o ON o.GUID = i.OsobaGUID
			;
			*/
				SELECT
					@SYSTEM.Client.Session.GUID AS ID_Session,
					t.GUID AS ID_WIZ,
					-- A MOZE to t.* zakomentowac? POCO to???
					t.*,	--	w t jest m.in. pole is_multi_instancje !!!
					i.kod_kreskowy,
					i.nr_seryjny,
					i.nrinwentarz,
					--	Id=59082 tutaj robimy myk i opis bedzie późniejszym ExtInf ale tylko dla osobo młotów ...
					IF(NOT _is_multi_instancje,
						i.opis,
						''
					) AS opis,	--	... to będzie do edycji i póżniej jako ExtInf ale tylko dla osobo młotów ...
					i.status,
					i.status_biblioteczny,
					i.substatus_biblioteczny,
					i.serwis_data,
					i.serwis_cykl_dni,
					i.serwis_alert_dni,
					(@Osoba_Majaca_Nastanie := i.osoba) AS Osoba,
					-- @Osoba_Majaca_Nastanie := _VarStr(CONCAT(o.Nazwisko, ' ', o.Imiona)) AS Osoba,
					_VarInt(@Dni_do_serwisu := _VarInt(i.Dni_do_serwisu)) AS Dni_do_serwisu,
					-- _VarInt(@Dni_do_serwisu := IF(i.serwis_data IS NOT NULL, TIMESTAMPDIFF(DAY, NOW(), i.serwis_data), 0)) AS Dni_do_serwisu,
					_VarInt(@IsSerwisAlert := i.IsAlert) AS IsAlert,
					-- _VarInt(@IsSerwisAlert := (@Dni_do_serwisu < i.serwis_alert_dni)) AS IsAlert,
					_VarInt(@serwis_alert_OK := (NOT @IsSerwisAlert OR NOT i.serwis_alert_blokuj)) AS Serwis_alert_OK,
					-- _VarStr(@IsAlertMsg := IF(@IsSerwisAlert, CONCAT('Do przeglądu pozostało dni: ', @Dni_do_serwisu), '')) AS IsAlertMsg,
					(@IsAlertMsg := i.IsAlertMsg) AS IsAlertMsg,
					-- i.IsAlert_deadline,
					-- _VarStr(@IsAlertMsg := IF(@IsSerwisAlert, CONCAT(_res_str_get('oppo_e_instancje.AlertMsg', ''), @Dni_do_serwisu), '')) AS IsAlertMsg,
					_VarInt(
					@status_biblioteczny_OK := 
						(i.is_multi_instancje != 0) OR --	Multiinstancje lub...
						(
							(i.status_biblioteczny IN (ot.Status_Before, -100)) AND 	--	zgodny status before ale ZARAZEM...
							(LOCATE(CONCAT(i.substatus_biblioteczny, ','), CONCAT(ot.SubStatuses_Before, ',')) > 0)
						) 
					-- OR (ot.Status_After < 1)
					) AS status_biblioteczny_OK,
					(CONCAT(
						IF(NOT @status_biblioteczny_OK, 
							CONCAT(
							-- _res_str_get('oppo_e_instancje.Status_biblioteczny_Msg', ''), ' - ',
							'Dopuszczalne statusy dla operacji "', ot.Opis, '" to:\n',
							IFNULL((SELECT GROUP_CONCAT(CONCAT('"', sb.descr, '"')) FROM `erp_statusy_biblioteczne` sb WHERE sb.Status = ot.Status_Before AND (LOCATE(CONCAT(sb.SubStatus, ','), CONCAT(ot.SubStatuses_Before, ',')) > 0)), ''),
							'\n'
							'podczas gdy aktualnie egzemplarz ma status: ',
							IFNULL((SELECT CONCAT('"', sb.descr, '"') FROM `erp_statusy_biblioteczne` sb WHERE sb.Status = i.status_biblioteczny AND sb.SubStatus = i.Substatus_biblioteczny), ''),
							'\n'
							),
							''
						),
						IF(NOT @status_biblioteczny_OK AND i.status_biblioteczny = 1,
							CONCAT(' u osoby: ', @Osoba_Majaca_Nastanie),
							''
						),
						IF(i.ISAlert_DeadLine,
							i.IsAlertMsg,
							IF(NOT @serwis_alert_OK, 
								@IsAlertMsg, 
								''
							)
						)
						)
					) AS Status_biblioteczny_Msg,
					_VarInt(@serwis_alert_OK AND @status_biblioteczny_OK AND NOT IsAlert_deadline) AS IS_OK,
					_VarDouble(0) AS Ilosc,
					IFNULL(i.opis, t.InstancjaSearch) AS Nazwa
				FROM `t_search_instancje` t 
				LEFT JOIN `v_instancje` i ON i.GUID = t.GUID
				LEFT JOIN `operdoc_typy` ot ON ot.rodzaj = 47 AND ot.typ = 0
			;
			
		--	Dropuje otrzymanego tempa z CALL erp_instancje_tools('instancje.search.for.edit',  ....
			DROP TEMPORARY TABLE IF EXISTS `t_search_instancje`;
			
		END IF;
		
		IF _MODE = 'GUI.EDIT.CHOICE.Insert.op' THEN
			SET
				_OsobaGUID = _Param_C,
				_AreaGUID = _Param_D		
			;
			-- najpierw dla osobomlotow zaloz instancje is_multi_instancje
			UPDATE `WIZ_egzemplarze_choice_edit` w
			SET
				w.GUID := MD5(CONCAT(w.IdnTowr, _OsobaGUID))
			WHERE
				w.ID_Session = @SYSTEM.Client.Session.GUID
				AND
				w.Ilosc > 0
				AND
				w.is_multi_instancje > 0
			;
			INSERT IGNORE INTO `towrng_instancje` 
				(GUID, IdnTowr, osobaGUID_przypisana, kod_kreskowy, opis, status_biblioteczny, is_multi_instancje)
				SELECT
					w.GUID,
					w.IdnTowr, 
					o.GUID AS osobaGUID_przypisana, 
					t.kod_kreskowy, 
					--	CONCAT(t.Symbol, '/', t.Nazwa) AS opis, 
					CONCAT_WS(' - ',
						IF(LOCATE(t.Symbol, t.Nazwa) > 0, t.Nazwa, IF(LOCATE(t.Nazwa, t.Symbol) > 0, t.Symbol, CONCAT_WS('/', t.Symbol, t.Nazwa)))
						-- w.opis
					) AS opis, 
					0 AS status_biblioteczny, 
					1 AS is_multi_instancje
				FROM `WIZ_egzemplarze_choice_edit` w, `TowrNg` t, `osoby` o 
				WHERE
					w.ID_Session = @SYSTEM.Client.Session.GUID
					AND
					w.Ilosc > 0
					AND
					w.is_multi_instancje > 0
					AND
					t.GUID = w.IdnTowr
					AND
					o.GUID = _OsobaGUID
			;
			
			
			INSERT IGNORE INTO `op_instancje` 
			(Id, idnoper, guid_oppo, rodzaj, rodzaj_typ, guid_instancji, ilosc, osobaGUID, AreaGUID, ExtInf)
			SELECT
				'?', _IdnOper, '?', 
				_rodzaj, _rodzaj_typ, 
				w.GUID AS guid_instancji, 
				w.ilosc, _OsobaGUID, _AreaGUID, 
				IF(w.is_multi_instancje > 0,
					w.opis,
					NULL
				) AS ExtInf
			FROM `WIZ_egzemplarze_choice_edit` w
			WHERE
				w.ID_Session = @SYSTEM.Client.Session.GUID
				AND
				w.Ilosc > 0
			;
		
		END	 IF;
		
	END IF;
	
	
	IF _MODE = 'towrng_instancje.update_from_last_OP' THEN
	/* *************************************************************************************************************************************************************
		Selecty
		CALL op_instancje_tools('towrng_instancje.update_from_last_OP', '', '', 0, 0, '', '', '');		
		_Key		IdnOper
		_Key2		GUID_Inst
		_Param_A	rodzaj
		_Param_B	rodzaj_typ
		_Param_C	Osoba
		_Param_D	Miejsce
	**************************************************************************************************************************************************************/
	--	Gdy update_from_last_OP != 0 to ...
	--	pobierz z TowrNg wszystkie dane )
set @opinst	= '1';

		DROP TEMPORARY TABLE IF EXISTS `t_update_from_last_OP`;
		CREATE TEMPORARY TABLE `t_update_from_last_OP` LIKE `towrng_instancje`;
		INSERT IGNORE INTO `t_update_from_last_OP` 
			SELECT 
				i.*
			FROM `towrng_instancje` i
			WHERE
				IFNULL(i.update_from_last_OP, 0) != 0
		;
			
		UPDATE `TowrNg` t, `t_update_from_last_OP` i
		SET
			i.opis = 
				IF(i.opis = '', 
					CONCAT('Egzemplarz - ', t.Nazwa), 
					i.opis
				),
			i.Kod_Kreskowy = 
				IF(i.Kod_Kreskowy IN ('???', ''), 
					LPAD(CONCAT(i.IDN, '0'), 10, '0'),
					i.Kod_Kreskowy
				),
			-- -1 AS `Status`,
			-- uwagi_inwentaryzacji
			-- data_inw_my
			-- data_inw_klient
			i.nr_seryjny = 
				IF(i.nr_seryjny = '', 
					t.NumerSeryjny,
					i.nr_seryjny
				),
			i.nrinwentarz = 
				IF(i.nrinwentarz IS NULL, 
					t.pop_nrinwet,
					i.nrinwentarz
				),
			i.datawystaw = 
				IF(i.datawystaw = '0000-00-00', 
					LEAST(IFNULL(t.st_datawdrozenia, CURRENT_DATE()), IFNULL(t.st_datanabycia, CURRENT_DATE())),
					i.datawystaw
				),
			i.DeadLine = 
				IF(i.DeadLine IS NULL, 
					t.st_datalikwidacji,
					i.DeadLine
				)
		WHERE
			t.GUID = i.IdnTowr
			AND 
			IFNULL(i.update_from_last_OP, 0) != 0
		;	
		
set @opinst	= '2';
	--	Teraz wstawiamy to co nie ma jescze operacji - ale robimy toi via temporary aby nie wzbudzac triggerow
		DROP TEMPORARY TABLE IF EXISTS `t_towrng_instancje_init_2_op_instancje`;
		CREATE TEMPORARY TABLE `t_towrng_instancje_init_2_op_instancje` 
			SELECT
				'?' AS ID, 
				CONCAT('init-', t.Idn) AS IdnOper, '?' AS guid_oppo,
				39 AS rodzaj, 1 AS rodzaj_typ,
				ti.GUID AS guid_instancji,
				1 AS Ilosc,
				t.st_datanabycia AS dataoper,
				t.osobaGUID AS OsobaGUID, 
				an.GUID AS AreaGUID


			FROM `t_update_from_last_OP` ti 
			LEFT JOIN `TowrNg` t ON ti.IdnTowr = t.GUID
			LEFT JOIN `erp_area_nodes` an ON an.GUID = CONCAT('S_TRW.', LPAD(t.st_miejsce, 6, '0'))
			WHERE 
			TRUE
			AND IFNULL(ti.update_from_last_OP, 0) = -5	--	Tylko dla nowych instancji jest -5 (srodek trwaly) (patrz trigger w TowrNg)
			AND t.deleted = 0
			AND t.st_nieaktywny = 0
			AND ti.Status_Biblioteczny = -1
			-- AND t.st_datanabycia IS NOT NULL
			-- and t.osobaGUID IS NOT NULL
			-- Po co???  AND ti.status = -1
			-- AND ti.GUID LIKE 'STRW-%'
			LIMIT 500
		;
		SET @.t_towrng_instancje_init_2_op_instancje.COUNT = ROW_COUNT();
		-- SELECT @.t_towrng_instancje_init_2_op_instancje.COUNT;
		IF @.t_towrng_instancje_init_2_op_instancje.COUNT > 0 THEN
			INSERT IGNORE INTO `op_instancje` 
			(Id, idnoper, guid_oppo, rodzaj, rodzaj_typ, guid_instancji, ilosc, dataoper, osobaGUID, AreaGUID)
			SELECT
				t.*
			FROM `t_towrng_instancje_init_2_op_instancje` t
			;
			UPDATE `op_instancje` op
			SET
				op.E_status = ''
			WHERE
				op.E_status = 'NEW'
			;
		--	po tym wstawianiu trzeba by ponownie wstawic do tempa bo moze nie byc tam tych egzemplarzy	
			INSERT IGNORE INTO `t_update_from_last_OP` 
				SELECT 
					i.*
				FROM `towrng_instancje` i
				WHERE
					IFNULL(i.update_from_last_OP, 0) != 0
			;
			
		END IF;
set @opinst	= '3';
		
		UPDATE `TowrNg` t, `t_update_from_last_OP` i
		SET
			t.st_miejsce = 
				IF(i.AreaGUID LIKE 'S_TRW.%',
					REPLACE(i.AreaGUID, 'S_TRW.', ''),
					t.st_miejsce
				),
			-- t.Opis = i.Opis,
			t.st_nowy_nr_inwent = i.nrinwentarz,
			t.Kod_Kreskowy = i.Kod_Kreskowy,
			-- ??? t.sww = i.nrinwentarz,
			t.NumerSeryjny = i.nr_seryjny
		WHERE
			t.GUID = i.IdnTowr
			AND 
			IFNULL(i.update_from_last_OP, 0) = -100
		;	
set @opinst	= '4';
		
		UPDATE `t_update_from_last_OP` i
		SET
			i.Ilosc_Wydana = 
				IF(i.is_Multi_instancje = 0,
					-1,
					0
				) +
				IFNULL(
				(SELECT SUM(IFNULL(d.Ilosc, 0)) FROM `op_instancje_det` d WHERE d.GUID_Instancji = i.GUID)
				, 0),
			i.Last_OP_IDN = (SELECT MAX(oid.IDN) FROM `op_instancje_det` oid WHERE oid.guid_instancji = i.GUID)
		WHERE
			IFNULL(i.update_from_last_OP, 0) != 0
		;
set @opinst	= '5';
		
		UPDATE `t_update_from_last_OP` i, `op_instancje_det` oid, `op_instancje` oi
		SET
			i.status_biblioteczny = 
				IFNULL(
					IF(i.is_Multi_instancje = 0,
					--	Zwykle egzemplarze
						oid.Status_After,
					--	multi
						IF(i.ilosc_wydana > 0,	--	
							1,
							0
						)
					),
					i.status_biblioteczny
				),
			i.substatus_biblioteczny = 
				IF(i.is_Multi_instancje = 0,
				--	Zwykle egzemplarze
					oid.SubStatus_After,
					0
				),
			i.OsobaGUID = 		
				IF(i.is_Multi_instancje = 0,
					IF(IFNULL(oid.Status_After, i.status_biblioteczny) > 0, 
						oid.OsobaGUID,
						''
					),
					i.osobaGUID_przypisana
				),
			i.osobaGUID_przypisana = 
				IF(oi.Rodzaj = 95 AND oi.Rodzaj_typ = 1 AND IFNULL(oi.OsobaGUID, '') != '', 
					oi.OsobaGUID,
					i.osobaGUID_przypisana
				),
			i.AreaGUID = oid.AreaGUID,
			i.datawystaw = 
			--	gdy jest to z -1 na 0 lub 1 czyli np,. jakies PW PZ etc i nie jest to osobomlot to wstaw data oper
				IF(i.is_Multi_instancje = 0 AND IFNULL(oid.Status_Before, 0) = -1 AND IFNULL(oid.Status_After, -1) <> -1,
					oi.dataoper,
					i.datawystaw
				),
			i.data_inw_my = 
			--	gdy jest to inwentaryzacja to ustaw date
				IF(i.is_Multi_instancje = 0 AND oi.Rodzaj = 96 AND oi.Rodzaj_typ = 1,
					oi.dataoper,
					i.data_inw_my
				)
		WHERE
			IFNULL(i.update_from_last_OP, 0) != 0
			AND
			i.Last_OP_IDN = oid.IDN
			AND
			oi.ID = oid.ID_ng
		;
set @opinst	= '6';
		UPDATE `t_update_from_last_OP` i, `op_instancje_det` oid, `op_instancje` oi
		SET
			i.Uwagi = 
					IFNULL((SELECT n.Uwagi FROM `opng` n WHERE n.GUID = oi.IdnOper), i.Uwagi)
		WHERE
			IFNULL(i.update_from_last_OP, 0) != 0
			AND
			i.Last_OP_IDN = oid.IDN
			AND
			oi.ID = oid.ID_ng
			AND
			oi.Rodzaj = 11 AND oi.rodzaj_typ IN (0, 1)
		;	
set @opinst	= '7';
		IF FALSE AND @session.globals.Owner = 'KONKOL' THEN	--	WON !!!! wzbudz atriggery
set @opinst	= '7.1';
			UPDATE `TowrNg` t, `towrng_instancje` i
			SET
				t.st_miejsce = REPLACE(i.AreaGUID, 'S_TRW.', '')
			WHERE
				t.GUID = i.IdnTowr
				AND 
				i.AreaGUID LIKE 'S_TRW.%'
				AND
				IFNULL(i.update_from_last_OP, 0) != 0
			;	
			UPDATE `TowrNg` t, `towrng_instancje` i
			SET
				t.osobaGUID = i.osobaGUID_przypisana
			WHERE
				t.GUID = i.IdnTowr
				AND 
				IFNULL(i.update_from_last_OP, 0) != 0
				AND
				IFNULL(i.osobaGUID_przypisana, '') != ''
			;	
		END IF;
		
set @opinst	= '8';
		UPDATE `t_update_from_last_OP` i
		SET
			i.update_from_last_OP = 0,	--	teraz juz kiedy wszytsko przeliczylismy -> kasuj na ZERO
			i.Status = IF(i.status_biblioteczny = 0 AND i.Status = -2, i.status_biblioteczny, i.Status)
		WHERE
			IFNULL(i.update_from_last_OP, 0) != 0
		;	
		
		
		UPDATE `towrng_instancje` i, `t_update_from_last_OP` t
		SET
			i.opis = t.opis,
			i.Kod_Kreskowy = t.Kod_Kreskowy,
			i.nr_seryjny = t.nr_seryjny,
			i.nrinwentarz = t.nrinwentarz,
			i.datawystaw = t.datawystaw,
			i.DeadLine = t.DeadLine,
			
			i.Ilosc_Wydana = t.Ilosc_Wydana,
			i.Last_OP_IDN = t.Last_OP_IDN,
			
			i.status_biblioteczny = t.status_biblioteczny,
			i.substatus_biblioteczny = t.substatus_biblioteczny,
			i.OsobaGUID = t.OsobaGUID,
			i.osobaGUID_przypisana = t.osobaGUID_przypisana,
			i.AreaGUID = t.AreaGUID,
			i.datawystaw = t.datawystaw,
			i.data_inw_my = t.data_inw_my,
			i.Uwagi = t.Uwagi,
			
			i.update_from_last_OP = 0,	--	teraz juz kiedy wszytsko przeliczylismy -> kasuj na ZERO
			i.Status = t.Status
		WHERE
			i.IDN = t.IDN
		;
		
	END IF;
	
	
	IF _MODE = 'select.valid.Rodzaj_typy.for.idnoper' THEN
	/* ********************************************************************************************************************
		Zwroci rodzaj_typ-y (podrodzaje) operacji mozliwych dla danej instancji i dokumentu
		CALL op_instancje_tools('select.valid.Rodzaj_typy.for.idnoper', @IdnOper_P, 'Instancje', 0, 0, '', '', '');		
	******************************************************************************************************************** */
		SELECT
			ot.*
		FROM `operdoc_typy` ot
		INNER JOIN `op_instancje` n ON n.IdnOper = _Key
		INNER JOIN `towrng_instancje` i ON i.GUID = _Key2
		WHERE
			ot.Rodzaj = n.Rodzaj
		AND (LOCATE(CONCAT(i.substatus_biblioteczny, ','), CONCAT(ot.SubStatuses_Before, ',')) > 0) 
		GROUP BY ot.Rodzaj, ot.typ
		;
	END IF;
	
END$$

DELIMITER ;

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

*/
 
/*
$Log$
*/
