 SET NAMES utf8;

DELIMITER $$

DROP PROCEDURE IF EXISTS `rcp_tools`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `rcp_tools`(
	IN _MODE VARCHAR(150),
	IN _Key VARCHAR(255),	
	IN _Param_A TEXT,
	IN _Param_B VARCHAR(255),
	IN _Param_C VARCHAR(255),
	IN _Param_D VARCHAR(255)
)
SPROC: BEGIN 
	-- wejscie apro: CALL rcp_tools('rcp_rejestracje.mm.insert.update', '8', '1', unix_timestamp(now()), 0x80+0, '');	
	-- wyjscie apro: CALL rcp_tools('rcp_rejestracje.mm.insert.update', '8', '1', unix_timestamp(now()), 0x81+0, '');	

	DECLARE _SQLText TEXT DEFAULT '';
	DECLARE _Tryb INT;
	DECLARE _IDN INT;
	
	IF _MODE IN ('rcp_rejestracje.mm.insert','rcp_rejestracje.mm.insert.update') THEN
/* 
id - osoby identyfikowane sa w rejestratorach wg idn
tryby: bajt 
- bit0:0 wejscie, 1 wyjscie, 
- bit4 = 1 :(0x1X) odmowa dostepu i w X jest powod: 2 drzwi w trybie blokady, 4:śluza, 6:antypassback, 8:zly pin, A: zly pin 3 raz - blokada karty
- bit6 = 1 :(0x4X) - rejestracje bez osob:
- bit7 = 1 : RCP : bit 
group_type:
0 - wszedzie - default
1 - tylko uprawnienia
2 - tylko ugrpguid (kontrah,TowrNg,opng,zmng itp)
3 - tylko crm
4 - tylko crm
5 - tylko KDM, pole dzial okresla numer grupy w KDM
*/
		SET _Tryb=_VarInt(_Param_C),_IDN=_VarInt(_Key);
		SET @tryb=_Tryb; -- debug
		SET @wyjscie=(_Tryb & 1)<>0;
		SET @isRCP=(_Tryb & 128)<>0;
		SET @RCPtyp=if(@isRCP,1+((_Tryb & 14) >> 1),0); -- 0: nie rcp 1:normalny, 2:sluzbowy, 3:socjalny/prywatny, 4 do 8 specjalne
		SET @isOdmowa=(_Tryb & 16)<>0;
		SET @OdmowaTyp=if(@isOdmowa AND NOT @isRCP,1+((_Tryb & 14) >> 1),0); -- 0:dostep ok, 1:odmowa, 2:blokada drzwi, 3: sluza, 4: antypassback, 5: zly pin, 6:zly pin 3 razy - blokada karty 
		-- SELECT @tryb,@wyjscie,@isRCP,@RCPtyp,@isOdmowa,@OdmowaTyp,_IDN;
		INSERT IGNORE INTO `rcp_rejestracje` 
			(rcp_czytnik, rcp_karta, osobaguid, rcp_czas, rcp_tryb, rcp_wyjscie, rcp_status2)
		SELECT
			_Param_A AS rcp_czytnik,
			h.id AS rcp_karta,
			o.guid as osobaguid,
			FROM_UNIXTIME(_Param_B) AS rcp_czas,
			@RCPtyp AS rcp_tryb, 
			@wyjscie AS rcp_wyjscie, -- 0: wejscie 1: wyjscie
			0 AS rcp_status2 -- nieistotne
			-- TODO  rejestracje niepoprawne - czy i jak wprowadzac?
		FROM osoby o
		LEFT JOIN hr_cards h on h.osobaguid=o.guid
		WHERE o.idn=_IDN;
		IF _MODE = 'rcp_rejestracje.mm.insert.update' THEN
			CALL rcp_tools('rcp_rejestracje.update', '', '', '', '', '');  -- wywolac samemu po 
		END IF;	--	IF _MODE = 'rcp_rejestracje.insert'
		SELECT LEFT((FROM_UNIXTIME(_Param_B)),19) as czas,imie1,nazwisko FROM osoby WHERE idn=_IDN;
	END IF;	-- IF _MODE = 'rcp_rejestracje.insert'
-- CALL rcp_tools('kde_karty', '', '', '', '', '');
	IF _MODE IN ('kdm_karty') THEN
		SET _IDN=_VarInt(_Key);
		SELECT
			o.idn as id,
			h.id AS kartastr,conv(h.id,16,10) as karta,
			h.status,
			IFNULL((SELECT g.dzial FROM grupy_osob go, osoby g WHERE go.osobaguid=o.guid AND go.grupaguid=g.guid AND g.group_type=5 ORDER BY dzial LIMIT 0,1),0) as grupa1,
			IFNULL((SELECT g.dzial FROM grupy_osob go, osoby g WHERE go.osobaguid=o.guid AND go.grupaguid=g.guid AND g.group_type=5 ORDER BY dzial LIMIT 1,1),0) as grupa2,
			IFNULL((SELECT g.dzial FROM grupy_osob go, osoby g WHERE go.osobaguid=o.guid AND go.grupaguid=g.guid AND g.group_type=5 ORDER BY dzial LIMIT 2,1),0) as grupa3,
			IFNULL((SELECT g.dzial FROM grupy_osob go, osoby g WHERE go.osobaguid=o.guid AND go.grupaguid=g.guid AND g.group_type=5 ORDER BY dzial LIMIT 3,1),0) as grupa4,
			DATE(h.DateFrom) as DateFrom,DATE(h.DateTo) as DateTo,
			0 as flags,
			'000000' as pin,
			o.nazwisko,o.imiona
			
		FROM osoby o
		INNER JOIN hr_cards h on h.osobaguid=o.guid and h.kind='RCP'
		WHERE _IDN IN (0,o.idn) 
		ORDER BY o.idn;
		-- zalozenie takie, ze wysylane sa tylko osoby z kartami - jesli karta jest uniewazniania, to status w hr_cards powinien byc ustawiony na -1
	END IF;
	
	
	IF (_MODE = 'monthly.data') THEN
		SELECT r.*, CONCAT(o.Nazwisko, ' ', o.Imiona) AS Nazwisko_Imiona 
		FROM rcp_rejestracje r 
		JOIN osoby o ON o.GUID = r.OsobaGUID 
		JOIN Pracownicy p ON o.GUID = p.GUID 
		WHERE r.deleted = 0
			AND YEAR(rcp_czas) = _varINT(_Param_B)  AND MONTH(rcp_czas) = _varINT(_Param_C)		 
			AND IF(IFNULL(_Key, '') = '', TRUE, r.OsobaGUID = _Key);
	END IF;


/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'rcp_rejestracje.import'
	Nalicza zimportowane wiersze (skrypt apro)  tabeli `rcp_rejestracje`
		Parametry
		BRAK
			_Key		
			_Param_A	Oznacza czy nowy czy stary format 
						'' stary
						<> '' nowy
	CALL rcp_tools('rcp_rejestracje.import', '', '', '', '', '');	-- NOWY
	CALL rcp_tools('rcp_rejestracje.import', '', '1', '', '', '');	-- STARY	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'rcp_rejestracje.import') THEN
		-- 	replace
		SET _Param_A = IFNULL(_Param_A, '');
		IF _Param_A = '' THEN
		--	NOWY
			INSERT IGNORE INTO `rcp_rejestracje` 
				(rcp_czytnik, rcp_karta, rcp_czas, rcp_tryb, rcp_wyjscie, rcp_status2, rcp_info)
				SELECT
					TRIM(MID(a,1,3)) AS rcp_czytnik,
					TRIM(MID(a,4,8)) AS rcp_karta,
					CONCAT(MID(a,12,4),'-',MID(a,16,2),'-',MID(a,18,2),' ',MID(a,20,2),':',MID(a,22,2),':',MID(a,24,2)) AS rcp_czas,
					MOD(MID(a,26,1) DIV 2+3,4)+1 AS rcp_tryb, --	 4 specjalny, 1 normalny, 2 sluzbowy, 3 prywatny
					MOD(MID(a,26,1),2) AS rcp_wyjscie,
					MID(a,27,1) AS rcp_status2, 
					CONCAT('HSKN',_VarSTR(now())) as rcp_info
					-- ,0 as processed
			FROM `ta_rcp`
		;
		ELSE
		--	STARY z wstawianym rokiem :(
			INSERT IGNORE INTO `rcp_rejestracje` 
				(rcp_czytnik, rcp_karta, rcp_czas, rcp_tryb, rcp_wyjscie, rcp_status2, rcp_info)
				SELECT
					TRIM(MID(a,1,3)) AS rcp_czytnik,
					TRIM(MID(a,4,8)) AS rcp_karta,
					CONCAT(REPLACE(CONCAT('2011','-',MID(a,12,2),'-',MID(a,14,2)),' ','0'),' ',REPLACE(CONCAT(MID(a,16,2),':',MID(a,18,2),':00'),' ','0')) AS rcp_czas,
					MOD(MID(a,20,1) DIV 2+3,4)+1 AS rcp_tryb, --	 4 specjalny, 1 normalny, 2 sluzbowy, 3 prywatny
					MOD(MID(a,20,1),2) AS rcp_wyjscie,
					MID(a,21,1) AS rcp_status2,
					CONCAT('HSKO',_VarSTR(now())) as rcp_info
					-- ,0 as processed
				FROM `ta_rcp`
			;
		END IF;
	--	a koniec update	
		CALL rcp_tools('rcp_rejestracje.update', '', '', '', '', '');  -- wrzucenie do hr_events
		--	select * from rcp_rejestracje;
	END IF;	--	IF _MODE = 'rcp_rejestracje.import'
	
	IF (_MODE = 'rcp_rejestracje.import.micromade') THEN
	/*
		PPPPPYYMMDDHHmmRRKE
		1234 67890123456789
		P - analityka pracownika
		Y - rok (YY - rok zapisany dwucyfrowo, YYYY - rok w pełnej postaci)
		M - miesiąc (MMMM - nazwa miesiąca, MMM - skrót nazwy miesiąca)
		D - dzień miesiąca (DDDD - nazwa dnia tygodnia, DDD - skrót nazwy dnia tygodnia)
		H - godzina
		m - minuta
		S - sekunda
		O - obszar (z zakładki Obszary)
		K - kierunek (z zakładki Symbole)
		R - rodzaj rejestracji (z zakładki Symbole)
Z = 2*R+K (w tym wypadku K i R muszą być liczbami)
	*/
		CREATE TEMPORARY TABLE t_rcp
		SELECT
			TRIM(MID(a,1,4)) AS analityka, -- uwaga - 4 znaki z 5, bo tak jest w płacach
			TIMESTAMP(CONCAT('20',MID(a,6,2),'-',MID(a,8,2),'-',MID(a,10,2),' ',MID(a,12,2),':',MID(a,14,2),':00')) AS czas,
			MID(a,16,2) AS rodzaj, --	 4 specjalny, 1 normalny, 2 sluzbowy, 3 prywatny
			MID(a,18,1) AS wyjscie
		FROM ta_rcp_bibi WHERE LEFT(a,5)<>'PPPPP';
		
		ALTER TABLE t_rcp add osobaguid VARCHAR(38) NOT NULL DEFAULT '',add karta VARCHAR(38) NOT NULL DEFAULT '',add brak int not null default 1, 
			add index (analityka),  add index (osobaguid);
		UPDATE t_rcp t, Pracownicy p SET t.osobaguid=p.guid WHERE p.analitykaFK=t.analityka;
		UPDATE t_rcp t, hr_cards h SET t.karta=h.ID,t.brak=0 WHERE t.osobaguid=h.OsobaGUID AND h.kind='RCP' and h.res_type='HR' and h.status=0 and h.ID like "BIBI%"; -- najpierw BIBI
		UPDATE t_rcp t, hr_cards h SET t.karta=h.ID,t.brak=0 WHERE t.osobaguid=h.OsobaGUID AND h.kind='RCP' and h.res_type='HR' and h.status=0 and h.ID not like "BIBI%" and brak=1;
		UPDATE t_rcp SET karta=CONCAT('BIBI',analityka) WHERE osobaguid<>'' AND karta='';
		-- braki osób lub kart
		-- SELECT * FROM t_rcp;
		SELECT DISTINCT t.osobaguid,t.analityka,t.karta,concat(o.nazwisko,' ',o.imiona) as n 
		FROM t_rcp t 
		LEFT JOIN osoby o ON o.guid=t.osobaguid 
		WHERE osobaguid='' OR brak=1;

		INSERT IGNORE INTO hr_cards (ID,kind,osobaguid)
		SELECT DISTINCT karta,'RCP',osobaguid FROM t_rcp WHERE osobaguid<>'' AND brak=1;
		
		-- SELECT * FROM t_rcp;
		-- SELECT DISTINCT rodzaj FROM t_rcp;
		
		INSERT IGNORE INTO rcp_rejestracje (rcp_czytnik, rcp_karta, rcp_czas, rcp_tryb, rcp_wyjscie, rcp_info)
		SELECT '9' as czytnik,karta, czas, 1 as tryb, wyjscie, CONCAT('BIBI',_VarSTR(now())) as rcp_info
		FROM t_rcp WHERE osobaguid<>'' ORDER BY czas;

		CALL rcp_tools('rcp_rejestracje.update', '', '', '', '', '');
		
	END IF;	--	IF _MODE = 'rcp_rejestracje.import.micromade'
	
	IF (_MODE = 'rcp_rejestracje.import.biosys') THEN
	/*
		1234567890123456
		PPPPYYMMDDHHmmKE
		211723113006490
		P - analityka pracownika
		Y - rok (YY - rok zapisany dwucyfrowo, YYYY - rok w pełnej postaci)
		M - miesiąc (MMMM - nazwa miesiąca, MMM - skrót nazwy miesiąca)
		D - dzień miesiąca (DDDD - nazwa dnia tygodnia, DDD - skrót nazwy dnia tygodnia)
		H - godzina
		m - minuta
		K - kierunek (0 - wejście, 1 - wyjście)
		E - ?
		przy braku rejestracji w danym dniu HHmmSS są puste (np: 0276231130)

	*/
		CREATE TEMPORARY TABLE t_rcp
		SELECT
			TRIM(MID(a,1,4)) AS analityka, -- uwaga - 4 znaki
			TIMESTAMP(CONCAT('20',MID(a,5,2),'-',MID(a,7,2),'-',MID(a,9,2),' ',MID(a,11,2),':',MID(a,13,2),':00')) AS czas,
			'1' AS rodzaj,
			MID(a,15,1) AS wyjscie
		FROM ta_rcp_biosys WHERE LENGTH(a)>10 AND LEFT(a,4)<>'PPPP';
		
		ALTER TABLE t_rcp add osobaguid VARCHAR(38) NOT NULL DEFAULT '',add karta VARCHAR(38) NOT NULL DEFAULT '',add brak int not null default 1, 
			add index (analityka),  add index (osobaguid);
		UPDATE t_rcp t, Pracownicy p SET t.osobaguid=p.guid WHERE p.analitykaFK=t.analityka;
		UPDATE t_rcp t, hr_cards h SET t.karta=h.ID,t.brak=0 WHERE t.osobaguid=h.OsobaGUID AND h.kind='RCP' and h.res_type='HR' and h.status=0 and h.ID like "BIBI%"; -- najpierw BIBI
		UPDATE t_rcp t, hr_cards h SET t.karta=h.ID,t.brak=0 WHERE t.osobaguid=h.OsobaGUID AND h.kind='RCP' and h.res_type='HR' and h.status=0 and h.ID not like "BIBI%" and brak=1;
		UPDATE t_rcp SET karta=CONCAT('BSYS',analityka) WHERE osobaguid<>'' AND karta='';
		-- braki osób lub kart
		-- SELECT * FROM t_rcp;
		SELECT DISTINCT t.osobaguid,t.analityka,t.karta,concat(o.nazwisko,' ',o.imiona) as n 
		FROM t_rcp t 
		LEFT JOIN osoby o ON o.guid=t.osobaguid 
		WHERE osobaguid='' OR brak=1;

		INSERT IGNORE INTO hr_cards (ID,kind,osobaguid)
		SELECT DISTINCT karta,'RCP',osobaguid FROM t_rcp WHERE osobaguid<>'' AND brak=1;
		
		SELECT * FROM t_rcp;
		-- SELECT DISTINCT rodzaj FROM t_rcp;
		
		INSERT IGNORE INTO rcp_rejestracje (rcp_czytnik, rcp_karta, rcp_czas, rcp_tryb, rcp_wyjscie, rcp_info)
		SELECT '8' as czytnik,karta, czas, 1 as tryb, wyjscie, CONCAT('BSYS',_VarSTR(now())) as rcp_info
		FROM t_rcp WHERE osobaguid<>'' ORDER BY czas;

		CALL rcp_tools('rcp_rejestracje.update', '', '', '', '', '');
		
	END IF;	--	IF _MODE = 'rcp_rejestracje.import.biosys'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'rcp_rejestracje.import'
	Nalicza zimportowane wiersze (skrypt apro)  tabeli `rcp_rejestracje`
		Parametry
		BRAK
			_Key		
			_Param_A	Oznacza czy nowy czy stary format 
						'' stary
						<> '' nowy
	CALL rcp_tools('rcp_rejestracje.import.from.`infpie_rcp`', '', '', '', '', '');	-- NOWY
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'rcp_rejestracje.import.from.`infpie_rcp`') THEN
		INSERT IGNORE INTO `rcp_rejestracje` 
		(rcp_czytnik, rcp_karta, osobaguid, rcp_czas, rcp_tryb, rcp_wyjscie, AreaGUID, SrcID, rcp_status2, rcp_info)
		SELECT
			ir.Kasa_IDU AS rcp_czytnik,
			hc.ID AS rcp_karta,
			hc.osobaguid,
			ir.rpcp_dat AS rcp_czas,
			@rcp_tryb := 1 AS rcp_tryb, --	 0: nie rcp, 1 normalny, 2 sluzbowy, 3 socjalny/prywatny, 4 do 8 specjalny, 
			(ir.rpcp_typ = 2) AS rcp_wyjscie, -- 0: wejscie 1: wyjscie a pole ir.rpcp_typ ma wartosci 1 = przyjscie do pracy 2= wyjscie z pracy 3= wyjscie na przerwe 4= powrot z przerwy
			an.GUID AS AreaGUID, 
			ir.INT_ID AS SrcID, 
			0 AS rcp_status2,
			CONCAT('IPIEK',_VarSTR(now())) as rcp_info
			-- nieistotne
			-- TODO  rejestracje niepoprawne - czy i jak wprowadzac?
			-- , an.Nazwa
		FROM zoo.`infpie_rcp` ir
		INNER JOIN `v_hr_cards` hc ON hc.ID = ir.rpcp_idc
		LEFT JOIN `erp_area_nodes` an ON an.Type = 'LOC' AND an.param3 = ir.Kasa_IDS
		WHERE 
			TRUE
			AND ir.rpcp_typ IN (1, 2)
			AND ir.rpcp_dat > CURRENT_DATE() - INTERVAL 21 DAY
			-- AND ir.rpcp_dat <= '2019-08-05'
			-- AND ir.rpcp_dat < '2019-08-05'
			AND IFNULL(an.Param5, 0) = 1
		;
	--	a koniec update	
		CALL rcp_tools('rcp_rejestracje.update', '', '', '', '', '');  -- wrzucenie do hr_events
		--	select * from rcp_rejestracje;
	END IF;	--	IF _MODE = 'rcp_rejestracje.import'
	
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'rcp_rejestracje.update'
	Nalicza zimportowane wiersze (skrypt apro)  tabeli `rcp_rejestracje`
		Parametry
		BRAK
			_Key		Oznacza etap konwersji VAT
			_Param_A
	CALL rcp_tools('rcp_rejestracje.update', '', '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'rcp_rejestracje.update') THEN
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_script`;
		CREATE TEMPORARY TABLE `t_rcp_rejestracje_script` (
			`rcp_karta` VARCHAR(50) NOT NULL DEFAULT '',
			`max_rcp_czas` DATETIME NOT NULL,
			`osobaguid` VARCHAR(38) NOT NULL DEFAULT '',
			PRIMARY KEY (`rcp_karta`),
			KEY `max_rcp_czas` (`max_rcp_czas`),
			KEY `osobaguid` (`osobaguid`)
		)
		;
		
		INSERT IGNORE INTO `t_rcp_rejestracje_script` 
			SELECT
				TRIM(rp.rcp_karta) AS rcp_karta, 
				MIN(rcp_czas) AS max_rcp_czas, 
				osobaguid 
			FROM `rcp_rejestracje` rp
			WHERE
				rp.processed = 0
				AND rp.Deleted = 0
			GROUP BY rp.rcp_karta
		;

		UPDATE `rcp_rejestracje` rp 
		SET
			rp.OsobaGUID = 
			IF(IFNULL(rp.OsobaGUID, '') = '',
				(SELECT v.OsobaGUID FROM `v_pass_cards` v WHERE v.ID = TRIM(rp.rcp_karta) LIMIT 1), 
				rp.OsobaGUID
			),
			rp.processed = -1
		WHERE	
			rp.processed = 0
			AND rp.Deleted = 0
		;	
		
		UPDATE `rcp_rejestracje` rp, `t_rcp_rejestracje_script` rpo
		SET
			rp.processed = IF(rp.Deleted = 0, -1, 1),
			rp.err_level = IF(rp.Deleted = 0, err_level, -1),
			rp.err_level_msg = IF(rp.Deleted = 0, rp.err_level_msg, 'DELETED')
		WHERE
			rp.rcp_karta = rpo.rcp_karta 
			AND rp.rcp_czas >= rpo.max_rcp_czas
		;
		
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_script`;
		
		CALL rcp_tools('rcp_rejestracje.update.calc', '', '', '', '', '');	
	END IF;	--	IF _MODE = 'rcp_rejestracje.update'

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'prepare.t_rcp_rejestracje_osoby'
	W delphi nie wystêpuje
	Tworzy `t_rcp_rejestracje_osoby` zawierajace karty które w rejestrze maja processed = -1
		Parametry
		BRAK
			_Key		Oznacza etap konwersji VAT
			_Param_A
	CALL rcp_tools('prepare.t_rcp_rejestracje_osoby', '', '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'prepare.t_rcp_rejestracje_osoby') THEN
	--	dodałem bo co rusz pojawia sie 1 rekord z pustym ID i pustą osoba 
		DELETE FROM `hr_cards` WHERE ID = '' AND OsobaGUID = '';
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_osoby`;
		CREATE TEMPORARY TABLE `t_rcp_rejestracje_osoby` 
			SELECT
				rcp_karta, osobaguid, MIN(rcp_czas) AS max_rcp_czas 
			FROM `rcp_rejestracje` rp
			WHERE
				rp.processed = 2
			GROUP BY rp.rcp_karta
		;
		
		ALTER TABLE `t_rcp_rejestracje_osoby` ADD INDEX rcp_karta(rcp_karta);
		
		UPDATE `rcp_rejestracje` rp
		SET
			rp.OsobaGUID = (SELECT v.OsobaGUID FROM `v_pass_cards` v WHERE v.ID = TRIM(rp.rcp_karta) LIMIT 1),
			rp.processed = 1,
			rp.err_level = -1,
			rp.err_level_msg = 'DELETED'
		WHERE
			rp.Deleted AND
			rp.processed = 2
		;
	END IF;	--	IF _MODE = 'prepare.t_rcp_rejestracje_osoby'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'edit.after.apply'
	Nalicza zimportowane wiersze (skrypt apro)  tabeli `rcp_rejestracje`
		Parametry
		BRAK
			_Key		Oznacza etap konwersji VAT
			_Param_A
	CALL rcp_tools('edit.after.apply', '', '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'edit.after.apply') THEN
		CALL rcp_tools('prepare.t_rcp_rejestracje_osoby', '', '', '', '', '');	
		UPDATE `rcp_rejestracje` rp, `t_rcp_rejestracje_osoby` rpo
		SET
			rp.OsobaGUID = (
				SELECT v.OsobaGUID FROM `v_pass_cards` v WHERE v.ID <> '' AND v.ID = TRIM(rp.rcp_karta)
				-- SELECT p.GUID FROM `Pracownicy` p WHERE p.NrKartyRCP = TRIM(rp.rcp_karta)
			),
			rp.processed = IF(rp.Deleted = 0, -1, 1),
			rp.err_level = IF(rp.Deleted = 0, err_level, -1),
			rp.err_level_msg = IF(rp.Deleted = 0, rp.err_level_msg, 'DELETED')
		WHERE
			rp.rcp_karta <> ''
			AND rp.rcp_karta = rpo.rcp_karta 
			-- propozycja apro: AND rp.processed=0
			-- a poza tym: 
			AND rp.rcp_czas > CURRENT_DATE - interval 50 day
			-- AND rp.rcp_czas >= rpo.max_rcp_czas
		;
		CALL rcp_tools('rcp_rejestracje.update.calc', '', '', '', '', '');	
	END IF;	--	IF _MODE = 'edit.after.apply'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'rcp_rejestracje.update.calc'
	Nalicza zimportowane wiersze (skrypt apro)  tabeli `rcp_rejestracje`
		Parametry
		BRAK
			_Key		Oznacza etap konwersji VAT
			_Param_A
	CALL rcp_tools('rcp_rejestracje.update.calc', '', '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'rcp_rejestracje.update.calc') THEN
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje`;
	
		CREATE TEMPORARY TABLE `t_rcp_rejestracje` (
			`idn` INT(11) NOT NULL AUTO_INCREMENT,
			`idn_prev` INT(11) NOT NULL DEFAULT -1,
			`rcp_czytnik` VARCHAR(3) NOT NULL DEFAULT '',
			`rcp_karta` VARCHAR(50) NOT NULL DEFAULT '',
			`rcp_czas` DATETIME NOT NULL,
			`rcp_czas_prev` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
			`rcp_tryb` INT(11) NOT NULL DEFAULT '1',
			`rcp_wyjscie` INT(11) NOT NULL DEFAULT '0',
			`rcp_wyjscie_prev` INT(11) NOT NULL DEFAULT '-1',
			`rcp_typ` VARCHAR(20) NOT NULL DEFAULT '',
			`rcp_typ_prev` VARCHAR(20) NOT NULL DEFAULT '',
			`rcp_status2` VARCHAR(1) NOT NULL DEFAULT '',
			`rcp_info` VARCHAR(250) NOT NULL DEFAULT '',
			`processed` INT(11) NOT NULL DEFAULT '0',
			`err_level` INT(11) NOT NULL DEFAULT '0' COMMENT 'poziom bledow 0 - OK, 1 - ERR DOUBLE OUT, 2 - ERR DOUBLE IN',
			`err_level_msg` VARCHAR(20) NOT NULL DEFAULT '' COMMENT 'err_level_msg odczytu "OK" lub "ERR DOUBLE OUT" "ERR DOUBLE IN"',
			`warning` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'opis statusu',
			`osobaguid` VARCHAR(38) NOT NULL DEFAULT '',
			`duration_min` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			`duration_sec` DOUBLE(16,4) NOT NULL DEFAULT '0.0000',
			PRIMARY KEY (`idn`),
			UNIQUE KEY `rcp` (`rcp_czas`,`rcp_karta`,`rcp_czytnik`),
			KEY `rcp_karta` (`rcp_karta`),
			KEY `osobaguid` (`osobaguid`),
			KEY `rcp_czas` (`rcp_czas`),
			KEY `idn_prev` (`idn_prev`)
		)
		;
		INSERT INTO `t_rcp_rejestracje`
		(idn, rcp_czytnik, rcp_karta, rcp_czas, rcp_tryb, rcp_wyjscie, osobaguid)
			SELECT
				idn, rcp_czytnik, rcp_karta, rcp_czas, rcp_tryb, rcp_wyjscie, osobaguid
			FROM `rcp_rejestracje` rp 
			WHERE
				rp.processed = -1
				AND rp.Deleted = 0
		;

		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_czas`;
		CREATE TEMPORARY TABLE `t_rcp_rejestracje_czas` (
			`idn` INT(11) NOT NULL AUTO_INCREMENT,
			`rcp_karta` VARCHAR(50) NOT NULL DEFAULT '',
			`rcp_czas` DATETIME NOT NULL,
			PRIMARY KEY (`idn`),
			KEY `rcp_karta` (`rcp_karta`),
			KEY `rcp_czas` (`rcp_czas`)
		)
		;
		INSERT INTO `t_rcp_rejestracje_czas`
		(idn, rcp_karta, rcp_czas)
			SELECT
				idn, rcp_karta, rcp_czas
			FROM `t_rcp_rejestracje` rp 
			ORDER BY rcp_karta, rp.rcp_czas DESC
		;
		
		
		SET _Param_A = '';
		IF _Param_A != '' THEN
			DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_kartaczas`;
			CREATE TEMPORARY TABLE `t_rcp_rejestracje_kartaczas` (
				`idn` INT(11) NOT NULL AUTO_INCREMENT,
				`idn_prev` INT(11) NOT NULL DEFAULT -1,
				`rcp_karta` VARCHAR(50) NOT NULL DEFAULT '',
				`rcp_czas` DATETIME NOT NULL,
				PRIMARY KEY (`idn`),
				KEY `rcp_karta` (`rcp_karta`),
				KEY `rcp_czas` (`rcp_czas`)
			)
			;
			INSERT INTO `t_rcp_rejestracje_kartaczas`
			(idn, rcp_karta, rcp_czas)
				SELECT
					idn, rcp_karta, rcp_czas
				FROM `t_rcp_rejestracje` rp 
				ORDER BY rcp_karta, rcp_czas
			;
			BEGIN
				DECLARE _idn INT(11);
				DECLARE _Last_idn INT(11);
				DECLARE _rcp_karta VARCHAR(50);
				DECLARE _Last_rcp_karta VARCHAR(50);
				DECLARE _rcp_czas DATETIME;
				
				
				
				DECLARE _done BOOL DEFAULT FALSE;
				DECLARE _c_proc CURSOR FOR
					SELECT 
						idn, rcp_karta, rcp_czas
					FROM `t_rcp_rejestracje_kartaczas`
					ORDER BY rcp_karta, rcp_czas
					;
				
				DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
				OPEN _c_proc;
				SET _Last_idn = -1;
				SET _Last_rcp_karta = '';
					loop_rejestracje_kartaczas: LOOP
						FETCH _c_proc INTO
							_idn, _rcp_karta, _rcp_czas;
						IF _done THEN
							LEAVE loop_rejestracje_kartaczas;
						ELSE
							IF _Last_rcp_karta != _rcp_karta THEN
							--	ZMIANA KARTY
								UPDATE `t_rcp_rejestracje` t
								SET
									t.idn_prev = IFNULL(
										(
										SELECT rp.IDN FROM `t_rcp_rejestracje_czas` rp WHERE rp.rcp_karta = _rcp_karta AND rp.rcp_czas < _rcp_czas LIMIT 1),
										-1
											
									),	
									t.rcp_typ = IF(t.rcp_wyjscie, 'WY', 'WE')
								WHERE
									t.IDN = _idn
								;	
							ELSE
							--	TA SAMA KARTA, WSTAW IDN
								UPDATE `t_rcp_rejestracje` t
								SET
									t.idn_prev = _Last_idn,	
									t.rcp_typ = IF(t.rcp_wyjscie, 'WY', 'WE')
								WHERE
									t.IDN = _idn
								;	
							END IF;
							SET _Last_idn = _idn;
							SET _Last_rcp_karta = _rcp_karta;
						END IF;
					END LOOP;
				CLOSE _c_proc;
			END;			
			DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_kartaczas`;
		
		ELSE

			SET @_Prev_rcp_karta = '';
			SET @_Prev_IDN = 0;
			
			UPDATE `t_rcp_rejestracje` t
			SET
				t.idn_prev = 
					IF(@_Prev_rcp_karta = t.rcp_karta,
						@_Prev_IDN,
						0
					
					),	
				t.rcp_karta = @_Prev_rcp_karta := rcp_karta,
				t.idn = @_Prev_IDN := t.idn,
				t.rcp_typ = IF(t.rcp_wyjscie, 'WY', 'WE')
			WHERE
				t.rcp_czas != '0000-00-00 00:00:00'
			ORDER BY t.rcp_karta, t.rcp_czas, t.idn
			
			;
			
			UPDATE `t_rcp_rejestracje` t
			SET
				t.idn_prev = 
					IFNULL(
						(
						SELECT rp.IDN FROM `rcp_rejestracje` rp WHERE rp.rcp_karta = t.rcp_karta AND rp.rcp_czas <= t.rcp_czas AND rp.Idn <> t.Idn AND Deleted = 0 ORDER BY rp.rcp_czas DESC LIMIT 1
						),
						-1
					)
			WHERE 
				t.idn_prev = 0
			;
			
			/*
			UPDATE `t_rcp_rejestracje` t
			SET
				t.idn_prev = IFNULL(
					(
					-- SELECT rp.IDN FROM `rcp_rejestracje` rp WHERE rp.rcp_karta = t.rcp_karta AND Deleted = 0 AND rp.rcp_czas < t.rcp_czas ORDER BY rp.rcp_czas DESC LIMIT 1),
					SELECT rp.IDN FROM `t_rcp_rejestracje_czas` rp WHERE rp.rcp_karta = t.rcp_karta AND rp.rcp_czas < t.rcp_czas LIMIT 1),
					-1
						
				),	
				t.rcp_typ = IF(t.rcp_wyjscie, 'WY', 'WE')
			;
			*/
		END IF;
		
			-- SELECT * FROM `t_rcp_rejestracje`;
		
		-- SELECT rp.IDN FROM `rcp_rejestracje` rp WHERE rp.rcp_karta =  ' 5443976' AND rp.rcp_czas < '2010-05-18 14:47:47' ORDER BY rp.rcp_czas DESC LIMIT 1;
		/* B Y £ O
		UPDATE `t_rcp_rejestracje` t
		SET
			t.rcp_wyjscie_prev = IFNULL(
				(
				SELECT rp.rcp_wyjscie FROM `rcp_rejestracje` rp WHERE rp.idn = t.idn_prev),
				-1	
			),
			t.rcp_czas_prev = IFNULL(
				(
				SELECT rp.rcp_czas FROM `rcp_rejestracje` rp WHERE rp.idn = t.idn_prev),
				0	
			)
		WHERE
			t.idn_prev > 0
		;
		J E S T ... */
		UPDATE `t_rcp_rejestracje` t, `rcp_rejestracje` rp
		SET
			t.rcp_wyjscie_prev = rp.rcp_wyjscie,
			t.rcp_czas_prev = rp.rcp_czas
		WHERE
			t.idn_prev > 0
			AND rp.idn = t.idn_prev
		;
		
		
		UPDATE `t_rcp_rejestracje` t
		SET
			t.rcp_typ_prev = IF(t.rcp_wyjscie_prev = 1, 'WY', IF(t.rcp_wyjscie_prev = 0, 'WE', '?')),
			t.err_level = 
				IF(rcp_wyjscie = 0 AND rcp_wyjscie_prev IN (1, -1),	--	WE jest OK gdy wczesniej WY lub niczego nie bylo
					0,
					IF(rcp_wyjscie = 1 AND rcp_wyjscie_prev = 0,
						0,
						IF(rcp_wyjscie = 1,
							1,
							2
						)
					)
				),
			t.err_level_msg = 
				IF(rcp_wyjscie = 0 AND rcp_wyjscie_prev IN (1, -1),	--	WE jest OK gdy wczesniej WY lub niczego nie bylo
					'OK',
					IF(rcp_wyjscie = 1 AND rcp_wyjscie_prev = 0,
						'OK',
						IF(rcp_wyjscie = 1,
							'ERR DOUBLE OUT',
							'ERR DOUBLE IN'
						)
					)
				),
			t.duration_sec = TIMESTAMPDIFF(SECOND, t.rcp_czas_prev, t.rcp_czas) 
			-- t.duration_min = TIMESTAMPDIFF(MINUTE, t.rcp_czas_prev, t.rcp_czas) 

		;
		UPDATE `t_rcp_rejestracje` t
		SET
			t.warning = 
				IF(t.err_level= 0 AND rcp_wyjscie = 1 AND duration_min > 20*60,
					'LONG TIME',
					IF(t.err_level= 0 AND rcp_wyjscie = 0 AND duration_sec < 2,
						'SHORT TIME',
						''
					)
				),
			/*	
			t.warning = 
				IF(rcp_wyjscie = 0 AND (duration_min > 20*60) AND (t.err_level_msg = 'OK') AND (t.rcp_typ = 'WY'),
					CONCAT(t.err_level_msg, ' / ', 'LONG TIME'),
					IF((duration_sec < 2) AND (t.err_level_msg = 'OK') AND (t.rcp_typ = 'WY'),
						CONCAT(t.err_level_msg, ' / ', 'SHORT TIME'),
						''
					)
				),
			*/	
			t.duration_min = ROUND(t.duration_sec/60, 4) 			
		-- WHERE	
		--  	t.rcp_typ = 'WY'
		;
		
		
		UPDATE `rcp_rejestracje` rp, `t_rcp_rejestracje` t
		SET
			rp.processed = 4,
			rp.idn_prev = t.idn_prev,
			rp.rcp_czas_prev= t.rcp_czas_prev,
			rp.rcp_wyjscie_prev = t.rcp_wyjscie_prev,
			rp.rcp_typ = t.rcp_typ,
			rp.rcp_typ_prev = t.rcp_typ_prev,
			rp.err_level = t.err_level,
			rp.err_level_msg = t.err_level_msg,
			rp.warning = t.warning,
			rp.duration_min = t.duration_min,
			rp.duration_sec = t.duration_sec
			
		WHERE
			rp.IDN = t.IDN
		;
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_czas`;
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje_osoby`;
		-- DROP TEMPORARY TABLE IF EXISTS `t_rcp_rejestracje`;
		 -- LEAVE SPROC;
		
	--	przygotuj `t_rcp_hr_events` - dla zmienionych (4) 
	-- jmam	CALL rcp_tools('prepare.prepare.t_rcp_hr_events', '', '4', '', '', '');	
		
		UPDATE `rcp_rejestracje` rp
		SET
			rp.processed = 1
		WHERE
			rp.processed = 4
		;	
	--	Wpisz do `hr_events` (przeniesione do triggera rcp_rejestracje)
	-- jmam	CALL hr_events_writes('hr_update.from.t_rcp_hr_events', '', '', '', '', '');	
		
		-- DROP TEMPORARY TABLE IF EXISTS `t_rcp_hr_events_delete`;
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_hr_events`;
	END IF;	--	IF _MODE = 'rcp_rejestracje.update.calc'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
	'prepare.t_rcp_hr_events'
	Tworzy `t_rcp_hr_events` zawierajace dane do zasilenia tabeli faktow czasowych osob `hr_events`
		Parametry
			_Param_A	4 lub '' oznacza ze przetwarzamy tylko WHERE rp.processed = 4
						1 oznacza wszystkie rp.processed = 1
	CALL rcp_tools('prepare.prepare.t_rcp_hr_events', '', '4', '', '', '');	
	CALL rcp_tools('prepare.prepare.t_rcp_hr_events', '', '1', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'prepare.prepare.t_rcp_hr_events') THEN
		SET _Param_A = IFNULL(_Param_A, '');
		IF _Param_A = '' THEN
			SET _Param_A = '4';
		END IF;
		
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_hr_events_delete`;
		CREATE TEMPORARY TABLE `t_rcp_hr_events_delete` 
			SELECT
				IF(rp.Korekta, MD5(CONCAT('RCP_KOREKTA', rp.IDN)), MD5(CONCAT(rp.rcp_karta, rp.rcp_czas))) AS ID
			FROM `rcp_rejestracje` rp
			WHERE
				rp.Err_level != 0 AND
				rp.rcp_typ = 'WY' AND
				rp.processed = _Param_A
			ORDER BY rp.rcp_karta, rp.rcp_czas
		;	
		INSERT INTO `t_rcp_hr_events_delete`
			SELECT
				IF(rp.Korekta, MD5(CONCAT('RCP_KOREKTA', rp.IDN)), MD5(CONCAT(rp.rcp_karta, rp.rcp_czas))) AS ID
			FROM `rcp_rejestracje` rp
			WHERE
				rp.Deleted AND
				rp.rcp_typ = 'WY'
		;	
		
		DROP TEMPORARY TABLE IF EXISTS `t_rcp_hr_events`;
		CREATE TEMPORARY TABLE `t_rcp_hr_events` 
			SELECT
				IF(rp.Korekta, MD5(CONCAT('RCP_KOREKTA', rp.IDN)), MD5(CONCAT(rp.rcp_karta, rp.rcp_czas))) AS ID,
				IF(rp.OsobaGUID = '', rp.rcp_karta, rp.OsobaGUID)AS OsobaGUID,
				rp.rcp_czytnik,
				rp.rcp_karta,
				rp.rcp_typ,
				rp.rcp_typ_prev,
				DATE_ADD(rp.rcp_czas, INTERVAL -rp.duration_sec SECOND) AS StartTime,
				rp.rcp_czas AS EndTime,
				rp.warning,
				ROUND(rp.duration_sec/3600, 4) AS Duration_hour,
				ROUND(rp.duration_sec/60, 4) AS Duration_min,
				rp.duration_sec,
				rp.rcp_czas,
				rp.rcp_czas_prev,
				rp.AreaGUID
			FROM `rcp_rejestracje` rp
			WHERE
				rp.Err_level = 0 
				AND rp.rcp_typ = 'WY' 
				AND rp.processed = _Param_A
			ORDER BY rp.rcp_karta, rp.rcp_czas
		;	
	
	END IF;	--	IF _MODE = 'prepare.prepare.t_rcp_hr_events'
	
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------	
DO USUNIECIA
	'update.all.rcp_hr_events.to.t_rcp_hr_events'
	wszystkie wpisy nalicza i odswieza dane w tabeli faktow czasowych osob `hr_events`
		Parametry
		BRAK
	CALL rcp_tools('update.all.rcp_hr_events.to.t_rcp_hr_events', '', '', '', '', '');	
------------------------------------------------------------------------------------------------------------------------------------------------------------------*/	
	IF (_MODE = 'update.all.rcp_hr_events.to.t_rcp_hr_events') THEN
	--	przygotuj `t_rcp_hr_events` - dla wszystkich (1) 
		CALL rcp_tools('prepare.prepare.t_rcp_hr_events', '', '1', '', '', '');	
	--	Wpisz do `hr_events` 
		CALL hr_events_writes('hr_update.from.t_rcp_hr_events', '', '', '', '', '');	
		-- DROP TEMPORARY TABLE IF EXISTS `t_rcp_hr_events`;

	END IF;	--	IF _MODE = 'update.all.rcp_hr_events.to.t_rcp_hr_events'
	
	
END $$

DELIMITER ;
/*
$Log: rcp_tools.sql,v $
Revision 1.38  2023/12/04 13:41:41  apro
biosys

Revision 1.37  2023/08/16 08:42:39  apro
poprawka importu bibi

Revision 1.36  2023/06/27 06:02:51  apro
Micromade

Revision 1.35  2022/11/02 08:38:40  jmam
$SEND$
usuwanie zb�dnych wpis�w w `hr_cards`
doda�em bo co rusz pojawia sie 1 rekord z pustym ID i pust� osoba

Revision 1.34  2022/07/11 06:24:41  apro
zabezpieczenie podzapytania

Revision 1.33  2021/09/13 10:48:17  jmam
$SEND$

Revision 1.32  2019/11/12 09:54:03  jmam
$SEND$

Revision 1.31  2019/08/07 12:54:29  jmam
$SEND$

Revision 1.30  2019/08/06 12:50:10  jmam
$SEND$

Revision 1.29  2019/05/09 10:33:21  jmam
$SEND$

Revision 1.28  2018/07/12 05:20:15  apro
mod dla RCP MicorMade -

*/
