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

CREATE FUNCTION dbo.CF_Localidades_Ocupadas(@pId_Sector SMALLINT, @pFecha DATETIME, @pId_Lista_Precio_Evento SMALLINT)
RETURNS INT
AS
BEGIN
DECLARE @Cantidad_Localidades_Ocupadas	INT
DECLARE @Id_Evento_Grupo				INT

-------------------------------------------------------------------------------------------------------------------------------------
/*
VERSIONES:
28/07/2022. Se agrega forzado de utilizacion de indices
*/
-------------------------------------------------------------------------------------------------------------------------------------

SET @Cantidad_Localidades_Ocupadas = 0

IF (@pId_Lista_Precio_Evento > 0)
BEGIN
	--WHERE no toma la fecha y filtra B.Id_Lista
	
	SET @Id_Evento_Grupo = (SELECT ISNULL(Id_Evento_Grupo, 0) FROM Prod_Listas_Precios WHERE Id_Lista_Precio = @pId_Lista_Precio_Evento)
	
	IF(@Id_Evento_Grupo = 0)
	BEGIN
		SELECT 
		@Cantidad_Localidades_Ocupadas = COUNT(*) 
		FROM Cbtes_Items A, Cbtes B, Cbtes_Tipos C, Productos P
		WHERE 
		A.Id_Trans = B.Id_Trans
		AND B.Id_Tipo_Cbte = C.Id_Tipo_Cbte
		AND A.Id_Producto = P.Id_Producto
		AND A.Flag_QA = 'A' 
		AND B.Id_Estado_Cbte <> 3 
		AND B.Id_Estado_Cbte <> 0
		AND (C.Compromete_Factura = 1 OR C.Compromete_Remitos = 1 OR C.Compromete_Pedido = 1)
		AND B.Id_Lista = @pId_Lista_Precio_Evento
		AND P.Tipo = 'L'
		AND P.Vendible=1
		AND P.Id_Sector = @pId_Sector
		OPTION (
				TABLE HINT(B, INDEX(IX_CBT_Lista_Estado)), 
				TABLE HINT(A, INDEX(IX_CBTI_Flag_QA))
				)
	END
	ELSE
	BEGIN
		SELECT 
		@Cantidad_Localidades_Ocupadas =	COUNT(*) 
		FROM Cbtes_Items A, Cbtes B, Cbtes_Tipos C, Productos P
		WHERE 
		A.Id_Trans = B.Id_Trans
		AND B.Id_Tipo_Cbte = C.Id_Tipo_Cbte
		AND A.Id_Producto = P.Id_Producto
		AND A.Flag_QA = 'A' 
		AND B.Id_Estado_Cbte <> 3 
		AND B.Id_Estado_Cbte <> 0
		AND (C.Compromete_Factura = 1 OR C.Compromete_Remitos = 1 OR C.Compromete_Pedido = 1)
		AND B.Id_Lista IN (SELECT Id_Lista_Precio FROM Prod_Listas_Precios WHERE ((Flag_Localidades = 1/*Abono*/) OR (Flag_Localidades = 2/*Partido*/ AND CONVERT(DATE, Fecha_Evento) >= CONVERT(DATE, GETDATE()))) AND Id_Evento_Grupo = @Id_Evento_Grupo)
		AND P.Tipo = 'L'
		AND P.Id_Sector = @pId_Sector
		OPTION (
				TABLE HINT(B, INDEX(IX_CBT_Lista_Estado)), 
				TABLE HINT(A, INDEX(IX_CBTI_Flag_QA))
				)

		--28/07/2022 Para forzar que un query utilice ciertos indices se hace de la forma quq esta arriba
		--ANTES del 28/07/2022
		/*
		SET @Cantidad_Localidades_Ocupadas =	(SELECT COUNT(*) 
												FROM Cbtes_Items A, Cbtes B, Cbtes_Tipos C, Productos P
												WHERE 
												A.Id_Trans = B.Id_Trans
												AND B.Id_Tipo_Cbte = C.Id_Tipo_Cbte
												AND A.Id_Producto = P.Id_Producto
												AND A.Flag_QA = 'A' 
												AND B.Id_Estado_Cbte <> 3 
												AND B.Id_Estado_Cbte <> 0
												AND (C.Compromete_Factura = 1 OR C.Compromete_Remitos = 1 OR C.Compromete_Pedido = 1)
												AND B.Id_Lista IN (SELECT Id_Lista_Precio FROM Prod_Listas_Precios WHERE ((Flag_Localidades = 1/*Abono*/) OR (Flag_Localidades = 2/*Partido*/ AND CONVERT(DATE, Fecha_Evento) >= CONVERT(DATE, GETDATE()))) AND Id_Evento_Grupo = @Id_Evento_Grupo)
												AND P.Tipo = 'L'
												AND P.Id_Sector = @pId_Sector)

		*/
	END
END
ELSE
BEGIN
	--WHERE toma la fecha y no filtra B.Id_Lista
	SELECT 
	@Cantidad_Localidades_Ocupadas = COUNT(*) 
	FROM Cbtes_Items A, Cbtes B, Cbtes_Tipos C, Productos P
	WHERE 
	A.Id_Trans = B.Id_Trans
	AND B.Id_Tipo_Cbte = C.Id_Tipo_Cbte
	AND A.Id_Producto = P.Id_Producto
	AND A.Flag_QA = 'A' 
	AND B.Id_Estado_Cbte <> 3 
	AND B.Id_Estado_Cbte <> 0
	AND (C.Compromete_Factura = 1 OR C.Compromete_Remitos = 1 OR C.Compromete_Pedido = 1)
	AND A.Fecha_QA < CONVERT(DATE, DATEADD(DAY, 1, @pFecha))
	AND A.Fecha_Venc >= CONVERT(DATE, @pFecha)
	AND P.Tipo = 'L'
	AND P.Id_Sector = @pId_Sector
	OPTION (
		TABLE HINT(B, INDEX(IX_CBT_Lista_Estado)), 
		TABLE HINT(A, INDEX(IX_CBTI_Flag_QA))
		)
END

-------------------------------------------------------------------------------------------------------------------------------------

RETURN ISNULL(@Cantidad_Localidades_Ocupadas, 0)
END
