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


CREATE PROCEDURE dbo.CPJ_Produc_Precio @pJson VARCHAR(8000)
AS
SET NOCOUNT ON

/*Variables recibidas por parámetro a traves del JSON*/
DECLARE @pFlagUsarTrans			TINYINT
DECLARE @pModoDebug				TINYINT
DECLARE @pId_Producto			VARCHAR(14)
DECLARE @pId_Cliente			INT
DECLARE @pFecha					DATETIME
DECLARE @pId_Contrato			INT

SET @pFlagUsarTrans				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'FlagUsarTrans')), 0)
SET @pModoDebug					= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'ModoDebug')), 0)
SET @pId_Producto				= ISNULL(CONVERT(VARCHAR(14), dbo.CF_JSON_VALUE(@pJson,'Id_Producto')), '')
SET @pId_Cliente				= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Cliente')), 0)
SET @pFecha						= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Fecha')), '19000101')
SET @pId_Contrato				= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Contrato')), 0)
/*FIN Variables recibidas por parámetro a traves del JSON*/


/*Variable de Retorno del Stored*/
DECLARE @rtaErrorStored						INT
DECLARE @rtaMsjStored						VARCHAR(4000)
/*FIN Variable de Retorono del Stored*/


/*Variables Locales*/
DECLARE @Precio							DECIMAL(12,4)
DECLARE @Precio_Grav					DECIMAL(12,4)
DECLARE @Precio_Exen					DECIMAL(12,4)
DECLARE @Prioridad_Calculo				TINYINT

DECLARE @Id_Lista_Precio_Cliente		SMALLINT
DECLARE @Id_Lista_Precio_Espec_Cliente	INT
DECLARE @Id_Lista_Precio_Contrato		SMALLINT
DECLARE @Precio_Contrato				DECIMAL(12,4)
DECLARE @Precio_Producto				DECIMAL(12,4)
DECLARE @Flag_Precio_For				TINYINT
DECLARE @Flag_Existe_Prod_Cli_Precios	TINYINT
DECLARE @Id_IVA							CHAR(3)
DECLARE @Porc_IVA						DECIMAL(7,4)
/*FIN Variables Locales*/

BEGIN TRY
	
	IF @pFlagUsarTrans <> 0 
	BEGIN
		BEGIN TRAN
	END

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Ingreso a Stored Procedure: CPJ_Produc_Precio'
		PRINT 'Parámetros:'
		PRINT 'ModoDebug: ' + CONVERT(VARCHAR(10), @pModoDebug) + '. Id_Producto: ' + @pId_Producto + '. Id_Cliente: ' + CONVERT(VARCHAR(10), @pId_Cliente) + '. Id_Contrato: ' + CONVERT(VARCHAR(10), @pId_Contrato) + ' Fecha: ' + CONVERT(VARCHAR(10), @pFecha, 112)
	END

	/*=================================================================================*/
	/*
	 * PRIORIDADES:
	 * 
	 * 1) Digitado en Contrato
	 * 2) Formulado
	 * 3) Prod_Cli_Precios
	 * 4) Lista de Precios Contrato
	 * 5) Lista de Precios Especial Cliente
	 * 6) Lista de Precios "Comun" Cliente
	 * 7) Producto
	*/
	SET @Prioridad_Calculo = 0

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

	IF(@pId_Producto = '')
	BEGIN
		SET @Precio = 0
		RETURN @Precio
	END

	/*=================================================================================*/
	
	SELECT
	@Flag_Precio_For		= ISNULL(Flag_Precio_For, 0),
	@Precio_Producto		= ISNULL(Precio_Gravado, 0),
	@Id_IVA					= ISNULL(Id_IVA, '')
	FROM Productos
	WHERE
	Id_Producto = @pId_Producto


	SELECT
	@Id_Lista_Precio_Cliente		= ISNULL(Id_Lista_Precio, 0),
	@Id_Lista_Precio_Espec_Cliente	= ISNULL(Id_Precio_Especial, 0)
	FROM Clientes
	WHERE
	Id_Cliente = @pId_Cliente


	SELECT
	@Id_Lista_Precio_Contrato		= ISNULL(Id_Lista_Precio, 0)
	FROM Contratos
	WHERE
	Id_Contrato = @pId_Contrato

	SELECT
	@Porc_IVA						= ISNULL(Porc1, 0)
	FROM Productos_TasaIVA
	WHERE
	Id_IVA = @Id_IVA

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

	/*1) Precio Digitado en Contrato*/

	IF(@Prioridad_Calculo = 0 AND @pId_Contrato > 0)
	BEGIN
		SELECT
		@Precio_Contrato = Precio
		FROM Contratos_Prod
		WHERE
		Id_Contrato = @pId_Contrato
		AND Id_Producto = @pId_Producto		

		IF(@Precio_Contrato > 0)
		BEGIN
			SET @Precio = @Precio_Contrato

			SET @Prioridad_Calculo = 1
		END
	END

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

	/*2) Precio Formulado*/

	IF(@Prioridad_Calculo = 0 AND @Flag_Precio_For = 1)
	BEGIN

		SET @Precio = (dbo.CFU_Produc_Precio(@pId_Cliente, @pId_Producto, @pFecha))

		SET @Prioridad_Calculo = 2
	END

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

	/*3) Precio Prod_Cli_Precios*/

	IF(@Prioridad_Calculo = 0 AND @pId_Cliente <> 0)
	BEGIN
		SET @Flag_Existe_Prod_Cli_Precios = ISNULL((SELECT MAX(1) FROM Prod_Cli_Precios WHERE Id_Producto = @pId_Producto AND Id_Cliente = @pId_Cliente), 0)

		IF(@Flag_Existe_Prod_Cli_Precios = 1)
		BEGIN
			SELECT 
			@Precio = ISNULL(Precio, 0)
			FROM Prod_Cli_Precios
			WHERE
			Id_Producto = @pId_Producto
			AND Id_Cliente = @pId_Cliente

			SET @Prioridad_Calculo = 3
		END
	END

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

	/*4) Precio Lista de Precios Contrato*/

	IF(@Prioridad_Calculo = 0 AND @Id_Lista_Precio_Contrato <> 0)
	BEGIN
		SET @Flag_Existe_Prod_Cli_Precios = ISNULL((SELECT MAX(1) FROM Prod_Listas_Precios_Items WHERE Id_Producto = @pId_Producto AND Id_Lista_Precio = @Id_Lista_Precio_Contrato), 0)

		IF(@Flag_Existe_Prod_Cli_Precios = 1)
		BEGIN
			SELECT 
			@Precio = ISNULL(Precio, 0)
			FROM Prod_Listas_Precios_Items
			WHERE
			Id_Producto = @pId_Producto
			AND Id_Lista_Precio = @Id_Lista_Precio_Contrato

			SET @Prioridad_Calculo = 4
		END
	END

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

	/*5) Precio Lista de Precios Especial Cliente*/

	IF(@Prioridad_Calculo = 0 AND @Id_Lista_Precio_Espec_Cliente <> 0)
	BEGIN
		SET @Flag_Existe_Prod_Cli_Precios = ISNULL((SELECT MAX(1) FROM Prod_Listas_Precios_Items WHERE Id_Producto = @pId_Producto AND Id_Lista_Precio = @Id_Lista_Precio_Espec_Cliente), 0)

		IF(@Flag_Existe_Prod_Cli_Precios = 1)
		BEGIN
			SELECT 
			@Precio = ISNULL(Precio, 0)
			FROM Prod_Listas_Precios_Items
			WHERE
			Id_Producto = @pId_Producto
			AND Id_Lista_Precio = @Id_Lista_Precio_Espec_Cliente

			SET @Prioridad_Calculo = 5
		END
	END

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

	/*6) Precio Lista de Precios "Comun" Cliente*/

	IF(@Prioridad_Calculo = 0 AND @Id_Lista_Precio_Cliente <> 0)
	BEGIN
		SET @Flag_Existe_Prod_Cli_Precios = ISNULL((SELECT MAX(1) FROM Prod_Listas_Precios_Items WHERE Id_Producto = @pId_Producto AND Id_Lista_Precio = @Id_Lista_Precio_Cliente), 0)

		IF(@Flag_Existe_Prod_Cli_Precios = 1)
		BEGIN
			SELECT 
			@Precio = ISNULL(Precio, 0)
			FROM Prod_Listas_Precios_Items
			WHERE
			Id_Producto = @pId_Producto
			AND Id_Lista_Precio = @Id_Lista_Precio_Cliente

			SET @Prioridad_Calculo = 6
		END
	END

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

	/*7) Precio Producto*/
	IF(@Prioridad_Calculo = 0)
	BEGIN
		SET @Precio = @Precio_Producto
		SET @Prioridad_Calculo = 7
	END
	
	/*=================================================================================*/
	
	IF(@Porc_IVA = 0)
	BEGIN
		SET @Precio_Grav = 0
		SET @Precio_Exen = @Precio
	END
	ELSE
	BEGIN
		SET @Precio_Grav = @Precio * (1 + (@Porc_IVA / 100))
		SET @Precio_Exen = 0
	END

	/*=================================================================================*/
	IF(@pModoDebug = 1)
	BEGIN
		PRINT '@Precio_Grav: ' + CONVERT(VARCHAR(10), @Precio_Grav) + '. @Precio_Exen: '+ CONVERT(VARCHAR(10), @Precio_Exen) + '. @Prioridad_Calculo: ' + CONVERT(VARCHAR(10), @Prioridad_Calculo)
	END

	SET @rtaMsjStored		=	'{' +
								dbo.CF_Json_ParsearVariable('Precio_Grav', @Precio_Grav, 'DECIMAL(12,2)') + ',' + 
								dbo.CF_Json_ParsearVariable('Precio_Exen', @Precio_Exen, 'DECIMAL(12,2)') + ',' + 
								dbo.CF_Json_ParsearVariable('Prioridad_Calculo', @Prioridad_Calculo, 'TINYINT') + 
								'}'

	SELECT	 0				AS ErrorNumber 
			,0				AS ErrorSeverity
			,0				AS ErrorState
			,0				AS ErrorProcedure
			,0				AS ErrorLine
			,@rtaMsjStored	AS ErrorMessage

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

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Fin Stored Procedure: CPJ_Produc_Precio'
	END

END TRY  


BEGIN CATCH  
    EXECUTE usp_GetErrorInfo

	IF @pFlagUsarTrans <> 0 
	BEGIN
		ROLLBACK
	END

	RETURN 9999
END CATCH

RETURN 0