 DELIMITER $$

/* ************************************************************************************************************************************************************************
	MODYFIKACJE
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `towrng_instancje_UPDATE_from_last_OP`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `towrng_instancje_UPDATE_from_last_OP`(
	IN _MODE VARCHAR(150),
	IN _Param_A VARCHAR(50),
	IN _Param_B VARCHAR(50)
)
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	Zmienila sie Last_Op_GUID w `towrg_instancje` zatem zmieniła się update_from_last_OP
	Teraz na podstawie Last_Op_GUID zmien osobe, miejsce etc
		Parametry
	CALL towrng_instancje_UPDATE_from_last_OP('', '', '');		 
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
BEGIN
	UPDATE `towrng_instancje` i
	SET
		i.Ilosc_Wydana = (SELECT SUM(Ilosc) FROM `oppo_instancje` oi WHERE oi.guid_instancji = i.GUID AND oi.Rodzaj != 12)
	WHERE
		IFNULL(i.update_from_last_OP, 0) != 0
	;
	UPDATE `towrng_instancje` i, `oppo_instancje` p, `operdoc_typy` ot
	SET
		i.OsobaGUID = p.OsobaGUID,
		i.AreaGUID = p.AreaGUID,
		
		i.status_biblioteczny = 
			IF(i.is_Multi_instancje = 0,
			--	Zwykle egzemplarze
				IF(p.Ilosc != 0,
					ot.status_after,
					ot.status_before		--	oznacza ze i.ilosc_wydana bedzie po tej operacji = 0 zatem status musimy cofnac do takiego z przed operacji
				),
			--	multi
				IF(i.ilosc_wydana > 0,	--	
					1,
					0
				)
			),	
		i.substatus_biblioteczny = 
			IF(i.is_Multi_instancje = 0,
			--	Zwykle egzemplarze
				IF(p.Ilosc != 0,
					ot.substatus_after,
					0  --   ???? ot.status_before		--	oznacza ze i.ilosc_wydana bedzie po tej operacji = 0 zatem status musimy cofnac do takiego z przed operacji
				),
			--	multi
				0
			),	
		i.Status = 		--	Malo juz istotne pole!!!!! wazniejsze sa te powyzej: status_biblioteczny i substatus_biblioteczny
			IF(p.rodzaj  = 47 AND p.rodzaj_typ = 101, 
				-2, 	--	-2 to SERWIS	
				i.Status
			),
		i.Uwagi = 
			IF(p.Rodzaj = 11 AND p.rodzaj_typ IN (0, 1),
				IFNULL((SELECT n.Uwagi FROM `opng` n WHERE n.GUID = p.IdnOper), i.Uwagi),
				i.Uwagi
			)
	WHERE
		IFNULL(i.update_from_last_OP, 0) != 0
		AND
		i.Last_Op_GUID = p.GUID
		AND
		ot.rodzaj = p.rodzaj AND ot.typ = p.rodzaj_typ
	;	
	UPDATE `towrng_instancje` i
	SET
		i.OsobaGUID = IF(i.status_biblioteczny > 0, i.OsobaGUID, ''),
		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
	;	
END$$

/* ************************************************************************************************************************************************************************
	SERWIS - Instancje związane z SERWISEM 
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `towrng_instancje_serwis`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `towrng_instancje_serwis`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(38),
	IN _Key2 VARCHAR(38),
	IN _Param_A VARCHAR(50),
	IN _Param_B VARCHAR(50),
	IN _Param_C VARCHAR(50),
	IN _Param_D VARCHAR(50),
	IN _Param_E VARCHAR(50),	
	IN _Param_F VARCHAR(50)	
)
S_towrng_instancje_serwis: BEGIN
	DECLARE _SQLText MEDIUMTEXT;
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'modify.before.select'
		Pobierz rekord danych towaru
		Parametry
			_Key		Osoba (ID Operacji)
		CALL towrng_instancje_serwis('select.egzemplarze.osoby', 'osoba', '', '', '', '', '', '', '');
			_Key2 		Jesli <> ''  to jest to idnoper wlasnie wystawiany i nalezy egzemplarze eleiminowac w Where gdy sa w op_instacje ze statusem E_Status = 'NEW' czyli wlasnie wystawiane
		CALL towrng_instancje_serwis('select.do.serwisu', '', '', '', '', '', '', '', '');
		CALL towrng_instancje_serwis('select.w.serwisie', '', '', '', '', '', '', '', '');
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE LIKE 'select%' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_select_egzempl`;
		SET _SQLText = 
		"
		CREATE TEMPORARY TABLE `t_select_egzempl`	
			SELECT
				i.GUID
            FROM towrng_instancje i #USE_KEY#
			WHERE
				#WHERE#
				#IDNOPER#
			;
        "
        ;
		IF _Key2 != '' THEN
			SET _SQLText = REPLACE(_SQLText, '#IDNOPER#', 'AND NOT EXISTS(SELECT p.ID FROM `op_instancje` p WHERE p.IdnOper = #_Key2# AND p.guid_instancji = i.GUID)');
			SET _SQLText = REPLACE(_SQLText, '#_Key2#', QUOTE(_Key2));
		ELSE
			SET _SQLText = REPLACE(_SQLText, '#IDNOPER#', '');
		END IF;
		
		IF _MODE LIKE '%select.egzemplarze.osoby%' THEN
			SET _SQLText = REPLACE(_SQLText, '#USE_KEY#', 'USE KEY (`OsobaGUID`)');
			SET _SQLText = REPLACE(_SQLText, '#WHERE#', 
				"
				i.OsobaGUID = #_Key#
				AND status_biblioteczny != 0
				"
			);
			SET _SQLText = REPLACE(_SQLText, '#_Key#', QUOTE(_Key));
		ELSEIF _MODE LIKE '%select.w.serwisie' THEN
			SET _SQLText = REPLACE(_SQLText, '#USE_KEY#', 'USE KEY (`status_biblioteczny_2`)');
			SET _SQLText = REPLACE(_SQLText, '#WHERE#', 
				"
				i.status_biblioteczny = 1 AND i.substatus_biblioteczny = 101
				AND
				#IS_IN_op_instance#
				"
			);
			IF _Param_F != '' THEN
				SET _SQLText = REPLACE(_SQLText, '#IS_IN_op_instance#', 
					'NOT EXISTS(SELECT oi.idn FROM `op_instancje` oi WHERE oi.GUID_Instancji = i.GUID AND oi.E_STatus = "NEW" LIMIT 1)'
				);
            END IF;
		ELSE
			SET _SQLText = REPLACE(_SQLText, '#USE_KEY#', 'USE KEY (`status_biblioteczny_2`)');
			SET _SQLText = REPLACE(_SQLText, '#WHERE#', 
				"
                NOT(i.status_biblioteczny = 1 AND i.substatus_biblioteczny = 101)
				-- AND i.IsAlert
                AND IFNULL(TIMESTAMPDIFF(DAY,CURRENT_TIMESTAMP(),i.serwis_data), 0) < i.serwis_alert_dni
				AND
				#IS_IN_op_instance#
				"
			);
		END IF;
    --  gdyby pozostał tag: #IS_IN_op_instance# to go ignoruj (powinien być zast. wyżej )
        SET _SQLText = REPLACE(_SQLText, '#IS_IN_op_instance#', 'TRUE');
		SET @_SQLText.1 := _SQLText;
        SET @_SQLText = _SQLText;
        CALL _ExecuteCmd(_SQLText, @Error);
        SET @.Select.Ile.Egz = FALSE;
		IF _MODE LIKE '%select.egzemplarze.osoby%' THEN
            IF NOT _MODE LIKE '%select.egzemplarze.osoby' THEN
                SET @.Select.Ile.Egz = TRUE;
            END IF;
        END IF;
		IF @.Select.Ile.Egz THEN
            SELECT _VarInt(COUNT(*)) AS Ile_Egz  FROM `t_select_egzempl`;
        ELSE
			SELECT
				i.GUID,
				i.idntowr,
				i.kod_kreskowy,
				i.nr_seryjny,
				i.nrinwentarz,
				i.Opis2 AS Opis,
				-- i.opis,
				i.status,
				i.status_biblioteczny,
				i.is_multi_instancje,
				i.serwis_data,
				i.serwis_cykl_dni,
				i.serwis_alert_dni,
				i.Ilosc_wydana,
				-- i.nazwa AS towrnazwa,
				IF(i.is_multi_instancje,
					CONCAT_WS(' - ', i.nazwa, NULLIF(oi.ExtInf, '')),
					i.nazwa
				) AS towrnazwa,
				-- _VarInt(@Dni_do_serwisu := IF(i.serwis_data IS NOT NULL, TIMESTAMPDIFF(DAY, NOW(), i.serwis_data), 0)) AS Dni_do_serwisu,
				i.Dni_do_serwisu,
				-- _VarInt(@IsAlert := (@Dni_do_serwisu < i.serwis_alert_dni)) AS IsAlert,
				i.IsAlert,
				--	i.IsAlertMsg,
				_VarStr(
					-- IF(IFNULL(ti.Dni_do_likwidacji, 9999) < 7,
					IF(i.IsAlert_deadline,
						CONCAT(IF(i.Dni_do_likwidacji > 0, 'Do likwidacji pozostało: ', 'Jest już po terminie likwidacji: '), _varSTR_1_N_Liczebnikowo(ABS(i.Dni_do_likwidacji), 'dzień', 'dni')),
						IF(i.IsAlert AND i.Status != -2, 
							CONCAT(IF(i.Dni_do_serwisu > 0, 'Do przeglądu pozostało: ', 'Jest już po terminie: '), _varSTR_1_N_Liczebnikowo(ABS(i.Dni_do_serwisu), 'dzień', 'dni')), 
							IF(i.Status = -2, 
								'        W serwisie', 
								''
							)
						)
					)
				) AS IsAlertMsg,
				
				i.AreaSymbolNazwa AS AreaSymbolNazwa,
				n.KontrGUID,
				(
					SELECT 
						IFNULL(vhc.ID, '')  
					FROM ht.hr_cards vhc 
					WHERE 
						IFNULL(vhc.OsobaGUID ,'') <> '' AND 
						vhc.OsobaGUID = oi.OsobaGUID AND 
						LENGTH(vhc.ID) < 6 
					ORDER BY LENGTH(vhc.ID) LIMIT 1
				) AS nr_karty_RCP,
				(
					SELECT 
						IFNULL(vhc.Info,'')  
					FROM ht.hr_cards vhc 
					WHERE 
						IFNULL(vhc.OsobaGUID ,'') <> '' AND 
						vhc.OsobaGUID = i.OsobaGUID AND 
						LENGTH(vhc.Info) < 6 
					ORDER BY LENGTH(vhc.Info) LIMIT 1
				) AS nr_przepustki,

				CONCAT_WS(' - ', NULLIF(k.Symbol, ''), NULLIF(k.Nazwa, '')) AS KontrahSymbolNazwa,
				i.osoba_uzytk_Nazwisko_Imiona, 
				-- i.osoba AS `osoba_uzytk_Nazwisko_Imiona`,
				i.osoba_przypisana AS `osoba_przyp_Nazwisko_Imiona`
			FROM `t_select_egzempl` t
			INNER JOIN `v_towrng_instancje` i ON i.GUID = t.GUID
			LEFT JOIN `op_instancje_det` oid ON oid.IDN = i.Last_Op_IDN
			LEFT JOIN `op_instancje` oi ON oi.ID = oid.ID_Ng
			LEFT JOIN `opng` n ON n.GUID = oi.IdnOper
			LEFT JOIN `kontrah` k ON k.GUID = n.KontrGUID
			;
        END IF;
    END IF;
    
	IF _MODE LIKE 'OLD.select%' THEN
		DROP TEMPORARY TABLE IF EXISTS `t_select_egzemplarze_osoby`;
		SET _SQLText = 
		"
		CREATE TEMPORARY TABLE `t_select_egzemplarze_osoby`	
			SELECT
				i.GUID,
				i.idntowr,
				i.kod_kreskowy,
				i.nr_seryjny,
				i.nrinwentarz,
				i.opis,
				i.status,
				i.status_biblioteczny,
				i.is_multi_instancje,
				i.serwis_data,
				i.serwis_cykl_dni,
				i.serwis_alert_dni,
				i.Ilosc_wydana,
				-- i.nazwa AS towrnazwa,
				IF(i.is_multi_instancje,
					CONCAT_WS(' - ', i.nazwa, NULLIF(oi.ExtInf, '')),
					i.nazwa
				) AS towrnazwa,
				-- _VarInt(@Dni_do_serwisu := IF(i.serwis_data IS NOT NULL, TIMESTAMPDIFF(DAY, NOW(), i.serwis_data), 0)) AS Dni_do_serwisu,
				i.Dni_do_serwisu,
				-- _VarInt(@IsAlert := (@Dni_do_serwisu < i.serwis_alert_dni)) AS IsAlert,
				i.IsAlert,
				i.IsAlertMsg,
				i.AreaSymbolNazwa AS AreaSymbolNazwa,
				n.KontrGUID,
				(
					SELECT 
						IFNULL(vhc.ID, '')  
					FROM ht.hr_cards vhc 
					WHERE 
						IFNULL(vhc.OsobaGUID ,'') <> '' AND 
						vhc.OsobaGUID = oi.OsobaGUID AND 
						LENGTH(vhc.ID) < 6 
					ORDER BY LENGTH(vhc.ID) LIMIT 1
				) AS nr_karty_RCP,
				(
					SELECT 
						IFNULL(vhc.Info,'')  
					FROM ht.hr_cards vhc 
					WHERE 
						IFNULL(vhc.OsobaGUID ,'') <> '' AND 
						vhc.OsobaGUID = i.OsobaGUID AND 
						LENGTH(vhc.Info) < 6 
					ORDER BY LENGTH(vhc.Info) LIMIT 1
				) AS nr_przepustki,

				CONCAT_WS(' - ', NULLIF(k.Symbol, ''), NULLIF(k.Nazwa, '')) AS KontrahSymbolNazwa,
				i.osoba AS `osoba_uzytk_Nazwisko_Imiona`,
				i.osoba_przypisana AS `osoba_przyp_Nazwisko_Imiona`
			FROM `v_instancje` i
			LEFT JOIN `op_instancje_det` oid ON oid.IDN = i.Last_Op_IDN
			LEFT JOIN `op_instancje` oi ON oi.ID = oid.ID_Ng
			LEFT JOIN `opng` n ON n.GUID = oi.IdnOper
			LEFT JOIN `kontrah` k ON k.GUID = n.KontrGUID
			WHERE
				#WHERE#
				#IDNOPER#
			;
		";
	--	Najpierw czy 	_Key2 <> '' 
	--	Jesli tak to jest to idnoper wlasnie wystawiany i nalezy egzemplarze eleiminowac w Where gdy sa w op_instacje ze statusem E_Status = 'NEW' czyli wlasnie wystawiane
		IF _Key2 != '' THEN
			SET _SQLText = REPLACE(_SQLText, '#IDNOPER#', 'AND NOT EXISTS(SELECT p.ID FROM `op_instancje` p WHERE p.IdnOper = #_Key2# AND p.guid_instancji = i.GUID)');
			SET _SQLText = REPLACE(_SQLText, '#_Key2#', QUOTE(_Key2));
		ELSE
			SET _SQLText = REPLACE(_SQLText, '#IDNOPER#', '');
		END IF;
		
		IF _MODE LIKE 'select.egzemplarze.osoby%' THEN
			SET _SQLText = REPLACE(_SQLText, '#WHERE#', 
				"
				i.OsobaGUID = #_Key#
				-- AND t.Deleted = 0
				AND status_biblioteczny != 0
				"
			);
			SET _SQLText = REPLACE(_SQLText, '#_Key#', QUOTE(_Key));
			SET @_SQLText = _SQLText;
			CALL _ExecuteCmd(_SQLText, @Error);
			
			IF _MODE = 'select.egzemplarze.osoby' THEN
				SELECT * FROM `t_select_egzemplarze_osoby`;
			ELSE
				SELECT _VarInt(COUNT(*)) AS Ile_Egz  FROM `t_select_egzemplarze_osoby`;
			END IF;
		ELSE
			SET _SQLText = REPLACE(_SQLText, '#WHERE#', 
				"
				IF(#_MODE# = 'select.w.serwisie',
					-- i.Status = -2,	-- -2 = SERWIS
					i.status_biblioteczny = 1 AND i.substatus_biblioteczny = 101,
					-- i.IsAlert AND i.Status != -2
					i.IsAlert AND NOT(i.status_biblioteczny = 1 AND i.substatus_biblioteczny = 101)
				)	
				AND
				#IS_IN_op_instance#
				"
			);
			IF _Param_F != '' AND _MODE = 'select.w.serwisie' THEN
				SET _SQLText = REPLACE(_SQLText, '#IS_IN_op_instance#', 
					'NOT EXISTS(SELECT oi.idn FROM `op_instancje` oi WHERE oi.GUID_Instancji = i.GUID AND oi.E_STatus = "NEW" LIMIT 1)'
				);
			ELSE
				SET _SQLText = REPLACE(_SQLText, '#IS_IN_op_instance#', 'TRUE');
			END IF;
			SET _SQLText = REPLACE(_SQLText, '#_MODE#', QUOTE(_MODE));
			SET @_SQLText = _SQLText;
			CALL _ExecuteCmd(_SQLText, @Error);
			
			SELECT * FROM `t_select_egzemplarze_osoby`;
		END IF;
		DROP TEMPORARY TABLE IF EXISTS `t_select_egzemplarze_osoby`;
	END IF;
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'Choice.Instancja.For.Towar'
		Pobierz rekord danych towaru
		Parametry
			_Key		ID towaru
			_Key2		ID kontrah.
			_Param_A	status
			_Param_B	magazyn
			CALL towrng_instancje_serwis('Choice.Instancja.For.Towar', 'aIdnTowr', 'aKontrGUID', 'aStatus', 'aMagazyn');				
		    np. CALL wegasa.towrng_instancje_serwis('Choice.Instancja.For.Towar', '{F94D5249-F1DC-4530-8DEA-417374106C5B}', '1181798863', '-1', '10');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE LIKE 'Choice.Instancja.For.Towar' THEN

	SELECT SQL_BUFFER_RESULT 
		ti.*, CONCAT(o.Nazwisko, ' ', o.Imie1) AS NazwiskoImiona, o.info1, o.info2, o.nazwa_dzialu, 
		k.Nazwa AS kontrNazwa, k.Symbol AS kontrSymbol, ti.lastOplustGUID 
	FROM towrng_instancje ti 
	LEFT JOIN osoby o ON ti.osobaGUID_przypisana = o.guid 
	LEFT JOIN kontrah k ON k.guid=o.kontrGUID 
	WHERE 
		ti.idntowr = _Key
		AND IF(_Key2 = '', TRUE, if(_Param_A<>'4',(k.GUID = _Key2), isnull(k.GUID))) -- 2013-08-12 blokujemy dla wegi zeby nie przyjmowali rzeczy bez osob
			--		or isnull(k.GUID)) )  -- w Delphi to jest na {$IFDEF WEGA}
		AND IF(_Param_A = '-1', TRUE, ti.Status = _Param_A)
		AND IF(_Param_B = '-1', TRUE, ((ti.magazyn = _Param_B) or (ti.magazyn = -1)))
		AND IF(_Param_C = '-1' AND _Param_D = '-1', TRUE, if(_Param_C = '47' AND _Param_D = '1', ti.przed_pierwszym_wydaniem = 1, 
			IF(_Param_C = '9', TRUE, ti.przed_pierwszym_wydaniem = 0)))
		;
		
	END IF;	
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'Choice.Zamiennik.For.Towar'
		Pobierz rekord danych towaru
		Parametry
			_Key		ID towaru
			_Key2		ID kontrah. 
			_Param_A	status		
			_Param_B	magazyn
			CALL towrng_instancje_serwis('Choice.Zamiennik.For.Towar', 'aIdnTowr', 'aKontrGUID', 'aStatus', 'aMagazyn');				
		    np. CALL wegasa.towrng_instancje_serwis('Choice.Zamiennik.For.Towar', '{F94D5249-F1DC-4530-8DEA-417374106C5B}', '1181798863', '-1', '10');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF _MODE LIKE 'Choice.Zamiennik.For.Towar' THEN

	SELECT SQL_BUFFER_RESULT 
		ti.*, CONCAT(o.Nazwisko, ' ', o.Imie1) AS NazwiskoImiona, o.info1, o.info2, o.nazwa_dzialu, 
		k.Nazwa AS kontrNazwa, k.Symbol AS kontrSymbol, ti.lastOplustGUID 
		-- T.GUID, T.Nazwa AS ZamiennikNazwa, T.symbol, Z.opis, Z.priorytet, Z.idn, Z.idntowr, Z.idntowr2, 
		-- M.Ilosc, (M.ilosc-M.zamowiono_OO) AS Dostepne 
		FROM zamienniki Z 
		JOIN TowrNg T ON T.GUID = IF(Z.idntowr = _Key, Z.idntowr2, Z.idntowr)   -- LEFT
		JOIN towrng_instancje ti ON ti.idntowr = T.GUID
		LEFT JOIN osoby o ON ti.osobaGUID_przypisana = o.guid 
		LEFT JOIN kontrah k ON k.guid=o.kontrGUID 
		LEFT JOIN TowrPo M ON M.IdnTowr = T.GUID AND M.Magazyn = _Param_B
		WHERE (Z.idntowr = _Key OR Z.idntowr2 = _Key)   -- tożsame z:  ti.idntowr = _Key
		AND IF(_Key2 = '', TRUE, if(_Param_A<>'4',(k.GUID = _Key2), isnull(k.GUID))) -- jw.  or isnull(k.GUID)) )   -- w Delphi to jest na {$IFDEF WEGA}
		AND IF(_Param_A = '-1', TRUE, ti.Status = _Param_A)
		AND IF(_Param_B = '-1', TRUE, ((ti.magazyn = _Param_B) or (ti.magazyn = -1)))
		AND IF(_Param_C = '-1' AND _Param_D = '-1', TRUE, if(_Param_C = '47' AND _Param_D = '1', ti.przed_pierwszym_wydaniem = 1, 
			IF(_Param_C = '9', TRUE, ti.przed_pierwszym_wydaniem = 0)))
		;
	END IF;	
	
	
	
END$$

/* ************************************************************************************************************************************************************************
	SYSTEMOWE - zgodnosc statusow
************************************************************************************************************************************************************************ */	
DROP PROCEDURE IF EXISTS `sys_instancje`$$

DELIMITER ;

/*
$Log: C_towrng_instancje.sql,v $
Revision 1.20  2025/03/31 06:54:50  jmam
$send$ poprawki dla Narzedziowni z 2024

*/


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

*/
