IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[CP_Browse_CD_ES_Log]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[CP_Browse_CD_ES_Log] 
END
GO

CREATE PROCEDURE [dbo].[CP_Browse_CD_ES_Log]	@pFecha_Desde		DATETIME,
											@pFecha_Hasta		DATETIME,
											@pId_Cliente		INT = NULL,
											@pTipo				CHAR(2) = NULL,/*E: Entrada. S: Salida. ES: Entrada/Salida*/
											@pResultado			CHAR(1) = NULL,/*S: Satisfactorio. E: Erroneo*/
											@pTipo_Filtro		CHAR(1) = NULL,/*A: Por Acceso. C: Por Controlador*/
											@pId_Accesos		VARCHAR(100) = NULL,/*Separados por coma (depende de @pTipo_Filtro)*/
											@pId_Controladores	VARCHAR(100) = NULL/*Separados por coma (depende de @pTipo_Filtro)*/
AS
BEGIN
DECLARE @posicion						INT
DECLARE @longitud						INT
DECLARE @Id_Controlador_Filtro			SMALLINT
DECLARE @Id_Acceso_Filtro				SMALLINT

/*===========================================================================*/

IF(ISNULL(@pFecha_Desde, '19000101') = '19000101')
BEGIN
	SET @pFecha_Desde = '19000101'
END
ELSE
BEGIN
	SET @pFecha_Desde = CONVERT(DATE, @pFecha_Desde)
END

/*===========================================================================*/

IF(ISNULL(@pFecha_Hasta, '19000101') = '19000101')
BEGIN
	SET @pFecha_Hasta = '20501231'
END


/*===========================================================================*/

CREATE TABlE #Lista_Clientes			(Id_Cliente INT)

IF(ISNULL(@pId_Cliente, 0) = 0)
BEGIN
	INSERT INTO #Lista_Clientes
	(Id_Cliente)
	SELECT Id_Cliente FROM Clientes
END
ELSE
BEGIN
	INSERT INTO #Lista_Clientes
	(Id_Cliente)
	VALUES
	(@pId_Cliente)
END

/*===========================================================================*/

CREATE TABLE #Lista_Tipos				(Tipo CHAR(1))

IF(ISNULL(@pTipo, 'ES') = 'ES' OR @pTipo = '')
BEGIN
	INSERT INTO #Lista_Tipos (Tipo) VALUES ('E')
	INSERT INTO #Lista_Tipos (Tipo) VALUES ('S')
END
ELSE
BEGIN
	INSERT INTO #Lista_Tipos
	(Tipo)
	VALUES
	(@pTipo)
END

/*===========================================================================*/

CREATE TABLE #Lista_Resultados			(Resultado CHAR(1))

IF(ISNULL(@pResultado, '') = '')
BEGIN
	INSERT INTO #Lista_Resultados (Resultado) VALUES ('E')
	INSERT INTO #Lista_Resultados (Resultado) VALUES ('S')
END
ELSE
BEGIN
	INSERT INTO #Lista_Resultados
	(Resultado)
	VALUES
	(@pResultado)
END

/*===========================================================================*/

CREATE TABLE #Lista_Id_Controladores	(Id_Controlador SMALLINT)
CREATE TABLE #Lista_Id_Accesos			(Id_Acceso		SMALLINT)

IF(RIGHT(@pId_Controladores, 1) <> ',')
BEGIN
	SET @pId_Controladores = @pId_Controladores + ','
END

IF(RIGHT(@pId_Accesos, 1) <> ',')
BEGIN
	SET @pId_Accesos = @pId_Accesos + ','
END

SET @posicion = 0
SET @longitud = 0

IF(@pTipo_Filtro = 'C')
BEGIN

	WHILE CHARINDEX(',', @pId_Controladores, @posicion + 1) > 0
	BEGIN
		SET @longitud				= CHARINDEX(',', @pId_Controladores, @posicion + 1) - @posicion
		SET @Id_Controlador_Filtro	= CONVERT(SMALLINT, SUBSTRING(@pId_Controladores, @posicion, @longitud))

		INSERT INTO #Lista_Id_Controladores (Id_Controlador) VALUES (@Id_Controlador_Filtro)	

		SET @posicion = CHARINDEX(',', @pId_Controladores, @posicion + @longitud) +1
	END

	INSERT INTO #Lista_Id_Accesos
	SELECT DISTINCT Id_Acceso FROM CD_Controladores WHERE Id_Controlador IN (SELECT Id_Controlador FROM #Lista_Id_Controladores)	
END

IF(@pTipo_Filtro = 'A')
BEGIN
	
	WHILE CHARINDEX(',', @pId_Accesos, @posicion + 1) > 0
	BEGIN
		SET @longitud = CHARINDEX(',', @pId_Accesos, @posicion + 1) - @posicion
		SET @Id_Acceso_Filtro = CONVERT(SMALLINT, SUBSTRING(@pId_Accesos, @posicion, @longitud))

		INSERT INTO #Lista_Id_Accesos (Id_Acceso) VALUES (@Id_Acceso_Filtro)

		SET @posicion = CHARINDEX(',', @pId_Accesos, @posicion + @longitud) +1
	END

	INSERT INTO #Lista_Id_Controladores
	SELECT DISTINCT Id_Controlador FROM CD_Controladores WHERE Id_Acceso IN (SELECT Id_Acceso FROM #Lista_Id_Accesos)
END

IF(@pTipo_Filtro = '')
BEGIN
	INSERT INTO #Lista_Id_Accesos
	SELECT DISTINCT Id_Acceso FROM CD_Accesos

	INSERT INTO #Lista_Id_Controladores
	SELECT DISTINCT Id_Controlador FROM CD_Controladores
END

/*===========================================================================*/

CREATE TABLE #BrowseCDES	(Codigo			INT,
							Tipo			VARCHAR(8),
							Origen			VARCHAR(11),
							Credencial		VARCHAR(50),
							Pers_Cod		INT,
							Pers_Nombre		VARCHAR(100), 
							Pers_Categ		VARCHAR(50),
							Fecha			DATE,
							Hora			VARCHAR(8),
							Resultado		VARCHAR(6),
							Observacion		VARCHAR(200),
							Id_Acceso		SMALLINT,
							Acceso			VARCHAR(20),
							Id_Controlador	SMALLINT,
							Controlador		VARCHAR(100))

INSERT INTO #BrowseCDES
SELECT 
CE.Id_ES						AS Codigo,
CASE CE.Tipo 
	WHEN 'E' THEN 'Entrada'
	WHEN 'S' THEN 'Salida'
END
AS Tipo,
CASE CE.Origen
	WHEN 'A' THEN 'Automatico'
	WHEN 'M' THEN 'Manual'
END
AS Origen,
CE.Id_Tarjeta					AS Credencial,
CL.Id_Cliente					AS Pers_Cod,
CL.Razon_Social					AS Pers_Nombre,
CT.Descripcion					AS Pers_Categ,
CONVERT(DATE, CE.Fecha)			AS Fecha,
CONVERT(VARCHAR(8), CE.Fecha, 8) AS Hora,
CASE CE.Resultado
	WHEN 'S' THEN 'Satisf'
	WHEN 'E' THEN 'Error'
END
AS Resultado,
CONVERT(VARCHAR(100), CE.Observacion)	AS Resultado,
CA.Id_Acceso					AS Id_Acceso,
CA.Descripcion					AS Acceso,
CC.Id_Controlador				AS Id_Controlador,
CC.Descripcion					AS Controlador
FROM CD_ES CE, Clientes CL, Clientes_Tipos CT, CD_Accesos CA, CD_Controladores CC
WHERE
CE.Id_Cliente = CL.Id_Cliente
AND ISNULL(CL.Id_Tipo_Cli, 0) = CT.Id_Tipo_Cli
AND CE.Id_Acceso = CA.Id_Acceso
AND CE.Id_Controlador = CC.Id_Controlador
AND CE.Fecha >= @pFecha_Desde
AND CE.Fecha < DATEADD(dd, 1, @pFecha_Hasta)
AND CE.Id_Cliente IN (SELECT Id_Cliente FROM #Lista_Clientes)
AND CE.Tipo COLLATE SQL_Latin1_General_CP1_CI_AS IN (SELECT CONVERT(VARCHAR(1), Tipo) COLLATE SQL_Latin1_General_CP1_CI_AS FROM #Lista_Tipos)
AND CE.Resultado COLLATE SQL_Latin1_General_CP1_CI_AS IN (SELECT Resultado COLLATE SQL_Latin1_General_CP1_CI_AS FROM #Lista_Resultados)
AND CE.Id_Controlador IN (SELECT Id_Controlador FROM #Lista_Id_Controladores)
AND CE.Id_Acceso IN (SELECT Id_Acceso FROM #Lista_Id_Accesos)
ORDER BY CE.Id_ES DESC

SELECT * FROM #BrowseCDES

DROP TABLE #BrowseCDES
DROP TABLE #Lista_Clientes
DROP TABLE #Lista_Tipos
DROP TABLE #Lista_Resultados
DROP TABLE #Lista_Id_Controladores
DROP TABLE #Lista_Id_Accesos

END