IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[CF_SCA_Antipassback]') 
                   and [type] = 'FN')
BEGIN
    DROP FUNCTION dbo.CF_SCA_Antipassback
END
GO

CREATE FUNCTION [dbo].[CF_SCA_Antipassback](@pId_Cliente INT, @pId_Acceso SMALLINT, @pFecha DATETIME, @pTipoAcceso CHAR(1), @pFechaEvento DATETIME)
RETURNS CHAR(1)
AS
BEGIN
DECLARE @Flag_Estado_Acceso			CHAR(1)
DECLARE @Cant_Horas_Antipassback	TINYINT
DECLARE @Flag_Evento				TINYINT
DECLARE @UltTipoAcceso				CHAR(1)
DECLARE @Tiempo_Antirebote			INT
DECLARE @UltPasadaExistosa			DATETIME
DECLARE @LimiteAntirrebote			DATETIME

SET @Cant_Horas_Antipassback = (SELECT ISNULL(Flag_Antipassback, 0) FROM CD_Accesos WHERE Id_Acceso = @pId_Acceso)
SET @Flag_Evento			 = (SELECT ISNULL(Flag_Evento, 0) FROM CD_Accesos WHERE Id_Acceso = @pId_Acceso)
/*@Tiempo_Antirebote en centesimas de segundo*/
SET @Tiempo_Antirebote		 = (SELECT ISNULL(Tiempo_Antirebote, 0) FROM CD_Accesos WHERE Id_Acceso = @pId_Acceso)

IF(@Cant_Horas_Antipassback = 0)
BEGIN
	--SET @Cant_Horas_Antipassback = 16 --Horas
	SET @Flag_Estado_Acceso = 'O'
	RETURN @Flag_Estado_Acceso
END


IF(@Flag_Evento <> 0)
BEGIN
	-- Modo Evento (Ej. Partido)
	
	SET @UltPasadaExistosa =ISNULL((SELECT MAX(CE.Fecha)
								FROM CD_ES CE
								WHERE 
								CE.Id_Cliente = @pId_Cliente
								AND CE.Id_ES =	(SELECT MAX(CE2.Id_ES) FROM CD_ES CE2 WHERE CE2.Id_Cliente = @pId_Cliente AND CE2.Resultado = 'S' AND CE2.Id_Acceso IN (SELECT Id_Acceso FROM CD_Accesos WHERE Flag_Evento = 1 ))
								AND CE.Fecha >= @pFechaEvento),'19000101')
	
	IF(@UltPasadaExistosa <> '19000101')
	BEGIN
		/*Ya pasó una vez por Molinete durante el evento*/
		SET @LimiteAntirrebote = DATEADD(SS, (@Tiempo_Antirebote/100), @UltPasadaExistosa)		
		
		SET @UltTipoAcceso =	(SELECT ISNULL(MAX(CE.Tipo), 'S')
								FROM CD_ES CE
								WHERE 
								CE.Id_Cliente = @pId_Cliente
								AND CE.Id_ES =	(SELECT MAX(CE2.Id_ES) FROM CD_ES CE2 WHERE CE2.Id_Cliente = @pId_Cliente AND CE2.Resultado = 'S' AND CE2.Id_Acceso IN (SELECT Id_Acceso FROM CD_Accesos WHERE Flag_Evento = 1 ))
								AND CE.Fecha >= @pFechaEvento
								AND @pFecha >= @LimiteAntirrebote)

		IF(@UltTipoAcceso = @pTipoAcceso)
		BEGIN
			IF(@pTipoAcceso = 'E')
			BEGIN
				--Ya Ingresado
				SET @Flag_Estado_Acceso = 'Y'
				RETURN @Flag_Estado_Acceso
			END
			
			IF(@pTipoAcceso = 'S')
			BEGIN
				--No Registro Entrada
				SET @Flag_Estado_Acceso = 'S'
				RETURN @Flag_Estado_Acceso
			END
		END
	END
	ELSE
	BEGIN
		/*Nunca Pasó*/
		SET @Flag_Estado_Acceso = 'O'
		RETURN @Flag_Estado_Acceso
	END
END
ELSE
BEGIN
	-- Modo "Normal"
	SET @UltTipoAcceso =	(SELECT ISNULL(MAX(CE.Tipo), 'S')
							FROM CD_ES CE
							WHERE
							CE.Id_Cliente = @pId_Cliente
							AND CE.Id_ES = (SELECT MAX(CE2.Id_ES) FROM CD_ES CE2 WHERE CE2.Id_Cliente = @pId_Cliente AND CE2.Resultado = 'S')
							AND CE.Fecha >= DATEADD(hh, (@Cant_Horas_Antipassback * (-1)), @pFecha))
							
	IF(@UltTipoAcceso = @pTipoAcceso)
	BEGIN
		IF(@pTipoAcceso = 'E')
		BEGIN
			--No Registro Salida
			SET @Flag_Estado_Acceso = 'E'
			RETURN @Flag_Estado_Acceso
		END
		
		IF(@pTipoAcceso = 'S')
		BEGIN
			--No Registro Entrada
			SET @Flag_Estado_Acceso = 'S'
			RETURN @Flag_Estado_Acceso
		END
	END						

END

RETURN ISNULL(@Flag_Estado_Acceso, 'O')

END