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

CREATE PROCEDURE [dbo].[CPJ_Cbtes_Fac_Generar_Item]		@pJson VARCHAR(8000)
AS 
SET NOCOUNT ON 

/*
 * LOG VERSIONES:
 * 13/09/2021: Se agrego Log de Versiones
*/

/*Variables recibidas por parametro a traves del JSON*/
DECLARE @pFlagUsarTrans			TINYINT
DECLARE @pModoDebug				TINYINT
DECLARE @pId_Trans				INT
DECLARE @pId_Producto			VARCHAR(14)
DECLARE @pCantidad				DECIMAL(15,5)
DECLARE @pFecha_QA				DATETIME
DECLARE @pFecha_Venc			DATETIME
DECLARE @pId_Cliente			INT
DECLARE @pBonif					DECIMAL(5,2)
DECLARE @pPrecio_Grav			DECIMAL(15,5)
DECLARE @pPrecio_Exen			DECIMAL(15,5)
DECLARE @pId_Tiempo             CHAR(3)
DECLARE @pRefacturar            TINYINT
DECLARE @pFlag_Tabla_Temp       TINYINT
DECLARE @pLote					VARCHAR(20)
DECLARE @pFecha_Entrega			DATETIME
DECLARE @pCosto_GF				DECIMAL(15,5)
DECLARE @pCosto_MO				DECIMAL(15,5)
DECLARE @pRedondeo_Imp_Final	TINYINT
DECLARE @pCantidad_Equiv		DECIMAL(15,5)

SET @pFlag_Tabla_Temp		    = ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Flag_Tabla_Temp')), 0)
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')), 0)
SET @pCantidad					= ISNULL(CONVERT(DECIMAL(15,5), dbo.CF_JSON_VALUE(@pJson,'Cantidad')), 0)
SET @pFecha_QA					= CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Fecha_QA'))
SET @pFecha_Venc				= CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Fecha_Venc'))
SET @pId_Cliente				= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Cliente')), 0)
SET @pBonif						= ISNULL(CONVERT(DECIMAL(5,2), dbo.CF_JSON_VALUE(@pJson,'Bonif')), 0)
SET @pPrecio_Grav 				= ISNULL(CONVERT(DECIMAL(15,5), dbo.CF_JSON_VALUE(@pJson,'Precio_Grav')), 0)
SET @pPrecio_Exen				= ISNULL(CONVERT(DECIMAL(15,5), dbo.CF_JSON_VALUE(@pJson,'Precio_Exen')), 0)
SET @pId_Tiempo	            	= ISNULL(CONVERT(CHAR(3), dbo.CF_JSON_VALUE(@pJson,'Id_Tiempo')), '')
SET @pRefacturar		        = ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Refacturar')), 0)
SET @pId_Trans					= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Trans')), 0)
SET @pLote						= ISNULL(CONVERT(VARCHAR(20), dbo.CF_JSON_VALUE(@pJson,'Lote')), '')
SET @pFecha_Entrega				= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Fecha_Entrega')), '19000101')
SET @pCosto_GF					= ISNULL(CONVERT(DECIMAL(15,5), dbo.CF_JSON_VALUE(@pJson,'Costo_GF')), 0)
SET @pCosto_MO					= ISNULL(CONVERT(DECIMAL(15,5), dbo.CF_JSON_VALUE(@pJson,'Costo_MO')), 0)
SET @pRedondeo_Imp_Final		= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Redondeo_Imp_Final')), 0)
SET @pCantidad_Equiv     		= ISNULL(CONVERT(DECIMAL(15,5), dbo.CF_JSON_VALUE(@pJson,'Cantidad_Equiv')), 0)

/*FIN Variables recibidas por parametro a traves del JSON*/

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

/*Declaracion Variables Locales*/
DECLARE @Item 					SMALLINT
DECLARE @Id_Estado_Cbte 		SMALLINT
DECLARE @Calle 					CHAR(5)
DECLARE @Columna 				CHAR(5)
DECLARE @Fila 					CHAR(5)
DECLARE @Bultos 				DECIMAL(15, 5)
DECLARE @Despacho 				VARCHAR(100)
DECLARE @Serie 					VARCHAR(100)
DECLARE @Millas 				INT
DECLARE @Cantidad_Saldo 		DECIMAL(15, 5)
DECLARE @Imp_Gravado 			DECIMAL(12, 2)
DECLARE @Imp_Exento 			DECIMAL(12, 2)
DECLARE @Analisis 				VARCHAR(30)
DECLARE @Flag_QA 				CHAR(1)
DECLARE @Descripcion_producto 	VARCHAR(100)
DECLARE @Id_Unidad_Medida 		CHAR(4)
DECLARE @Imp_Final				DECIMAL(15,5)
DECLARE @Costo 					DECIMAL(15, 5)
DECLARE @Imp_Iva 				DECIMAL(12, 2)
DECLARE @Id_Costo 				INT
DECLARE @Id_Tarea 				SMALLINT
DECLARE @Fecha_Caducidad 		DATETIME
DECLARE @Id_Pais 				CHAR(3)
DECLARE @Id_Usuario 			SMALLINT
DECLARE @Cantidad_Equiv 		DECIMAL(15, 5)
DECLARE @Costo_MO 				DECIMAL(15, 5)
DECLARE @Costo_GF 				DECIMAL(15, 5)
DECLARE @Id_Cond_Pago 			SMALLINT
DECLARE @Fecha_Proceso 			DATETIME
DECLARE @Id_Balanza 			CHAR(10)
DECLARE @Orden 					SMALLINT
DECLARE @Flag_NoImp_Factura 	TINYINT
DECLARE @Nro_Tag 				VARCHAR(30)
DECLARE @Fecha_Elaboracion 		DATETIME
DECLARE @Costo_Comparativo 		DECIMAL(13, 4)
DECLARE @Porc_Imp_Int 			DECIMAL(5, 2)
DECLARE @Id_Cta_Banco 			SMALLINT
DECLARE @Flag_Existe_Trans		TINYINT
DECLARE @Flag_Existe_Cliente	TINYINT
DECLARE @Flag_Existe_Producto	TINYINT
DECLARE @Observacion			VARCHAR(8000)
DECLARE @Id_Lista_Precio		SMALLINT
DECLARE @Precio_Gravado_Producto DECIMAL(13, 4)
DECLARE @Precio					DECIMAL(15,5)
DECLARE @Item_Facturado         SMALLINT
DECLARE @Id_Iva					CHAR(3)
DECLARE @Porc1					DECIMAL(7,4)
DECLARE @Tasa_Iva_1				DECIMAL(12,2)
DECLARE @Tasa_Iva_2				DECIMAL(12,2)
DECLARE @Tasa_Iva_3				DECIMAL(12,2)
DECLARE @Porc_Iva				DECIMAL(5,2)		
DECLARE @Precio_Exen			DECIMAL(15,5)
DECLARE @Precio_Grav			DECIMAL(15,5)
DECLARE @Costo_Rentabilidad		DECIMAL(13,4)			--09/09/2021 Agregado
/*FIN Declaracion Variables Locales*/


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

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Ingreso a Stored Procedure: CPJ_Cbtes_Fac_Generar_Item'
		PRINT 'Parametros:'
		PRINT 'FlagUsarTrans: ' + CONVERT(VARCHAR(10), @pFlagUsarTrans) + ' Id_Trans: ' + CONVERT(VARCHAR(10), @pId_Trans) + ' Id_Producto: ' + @pId_Producto + ' Cantidad: ' + CONVERT(VARCHAR(10), @pCantidad) + ' Fecha_QA: ' + CONVERT(VARCHAR(10), @pFecha_QA, 103) + ' Fecha_Venc: ' + CONVERT(VARCHAR(10), @pFecha_Venc, 103) + ' Id_Cliente: ' + CONVERT(VARCHAR(10), @pId_Cliente) + ' Bonif: ' + CONVERT(VARCHAR(10), @pBonif) + ' Precio_Grav: ' + CONVERT(VARCHAR(25), @pPrecio_Grav) + ' Precio_Exent: ' + CONVERT(VARCHAR(25), @pPrecio_Exen) 
	END

	/*===================================================================*/
    IF @pFlag_Tabla_Temp = 1
	BEGIN
		SET @pId_Trans	= 0
	END
	ELSE
	BEGIN
    	IF(@pId_Trans = 0)		RAISERROR ('Id_Trans can not be zero.', 16,  1 ) 
	END

	IF(@pId_Cliente = 0)	RAISERROR ('Id_Cliente can not be zero.', 16,  1 ) 
	IF(@pId_Producto = '')	RAISERROR ('Id_Producto can not be blank.', 16,  1 ) 
    
	SET @Item_Facturado = 0

	IF @pRefacturar = 0 
	BEGIN
	   	SET @Item_Facturado =  ( SELECT dbo.CFJ_Producto_Facturado  ('{ "Id_Cliente":"' + CONVERT(VARCHAR(15), @pId_Cliente) + '",' 
	                                                              + ' "id_producto":"' + CONVERT(VARCHAR(15), @pId_Producto) + '",'
																  + ' "Id_Tiempo":"' + CONVERT(VARCHAR(15), @pId_Tiempo) + '",'
																  + ' "Fecha":"' + CONVERT(VARCHAR(15), @pFecha_QA , 112 ) + '",'
																  + ' "Flag_Tabla_Temp":"' + CONVERT(VARCHAR(1), @pFlag_Tabla_Temp ) + '",'
															      + ' "Refacturar":"' + CONVERT(VARCHAR(5), @pRefacturar) + '"}'))
	END

    IF (@pRefacturar = 0 AND @Item_Facturado <> 0)
	BEGIN
		IF @pFlagUsarTrans <> 0 COMMIT

		/*************************************************************************************************/

		SET @rtaMsjStored		=	'{' +
									dbo.CF_Json_ParsearVariable('id_trans', ISNULL(@pId_Trans,0), 'INT')  + ',' +
									dbo.CF_Json_ParsearVariable('item', ISNULL(@Item,0), 'SMALLINT')  + ',' +
									dbo.CF_Json_ParsearVariable('id_producto', ISNULL(@pId_Producto,''), 'VARCHAR')  + ',' +
									dbo.CF_Json_ParsearVariable('imp_final', ISNULL(@Imp_Final,0), 'DECIMAL') +
									'}'

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

		RETURN 0
	END


	/*************************************************************************************************/

	SET @Tasa_Iva_1	= CONVERT(DECIMAL(12,2), dbo.CF_xParam('Tasa_Iva_1'))
	SET @Tasa_Iva_2	= CONVERT(DECIMAL(12,2), dbo.CF_xParam('Tasa_Iva_2'))
	SET @Tasa_Iva_3	= CONVERT(DECIMAL(12,2), dbo.CF_xParam('Tasa_Iva_3'))

	/*************************************************************************************************/

	SELECT  
	@Id_Estado_Cbte	= ISNULL(Id_Estado_Cbte, 0),
	@pLote			= ISNULL(Lote, ''),
	@Id_Usuario		= ISNULL(Id_Usuario, '-1')
	FROM Cbtes
	WHERE 
	Id_Trans = @pId_Trans

	/*************************************************************************************************/

	SELECT  
	@Calle					= ISNULL(Calle, ''),
	@Columna				= ISNULL(Columna, ''),
	@Fila					= ISNULL(Fila, ''),
	@Despacho				= ISNULL(Despacho, ''),
	@Descripcion_producto	= ISNULL(Descripcion_Resumida, ''),
	@Id_Unidad_Medida		= ISNULL(Id_Unidad_Medida, ''),
	@Costo					= ISNULL(Costo, 0),
	@Id_Cond_Pago			= ISNULL(Id_Cond_Pago, 0),
	@Id_Cta_Banco			= ISNULL(Id_Cta_Banco, 0),
	@Precio_Gravado_Producto = ISNULL(Precio_Gravado, 0),
	@Id_Iva					= ISNULL(Id_Iva, ''),
	@Costo_Rentabilidad		= ISNULL(Costo_Rentabilidad, 0)
	FROM Productos
	WHERE 
	Id_Producto = @pId_Producto	
	

	/*************************************************************************************************/

	SELECT
	@Porc1	= ISNULL(Porc1, 0)
	FROM Productos_TasaIva
	WHERE
	Id_Iva = @Id_Iva
	
	SET @Porc_Iva = @Porc1


	/*************************************************************************************************/
		
	--EXENTO
	IF(@pBonif > 0)
	BEGIN
		SET @Precio_Exen			= @pPrecio_Exen * (1 - (@pBonif / 100))
	END
	ELSE
	BEGIN
		SET @Precio_Exen			= @pPrecio_Exen
	END

	SET @Imp_Exento				= @Precio_Exen * @pCantidad	

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

	--GRAVADO
	IF(@pBonif > 0)
	BEGIN
		SET @Precio_Grav			= @pPrecio_Grav * (1 - (@pBonif / 100))
	END
	ELSE
	BEGIN
		SET @Precio_Grav			= @pPrecio_Grav
	END

	SET @Imp_Gravado			= @Precio_Grav * @pCantidad
	SET @Imp_Iva 				= @Imp_Gravado * (@Porc_Iva/100)

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

	SET @Precio		= @Precio_Exen + @Precio_Grav 

	SET @Imp_Final	= @Imp_Exento + @Imp_Gravado + @Imp_Iva

	IF(@pRedondeo_Imp_Final > 0)
	BEGIN
		SET @Imp_Final				= ROUND(@Imp_Final, @pRedondeo_Imp_Final)
	END

	/*************************************************************************************************/

	IF @pFlag_Tabla_Temp = 1
	BEGIN
    	SET @Item 					= (ISNULL((SELECT MAX(ISNULL(Item, 0)) FROM #ITEMS_CBTE WHERE Id_Trans = @pId_Trans), 0)) + 1
	END
	ELSE
	BEGIN
     	SET @Item 					= (ISNULL((SELECT MAX(ISNULL(Item, 0)) FROM CBTES_ITEMS WHERE Id_Trans = @pId_Trans), 0)) + 1
	END


	SET @Bultos 				= 0
	SET @Serie 					= ''
	SET @Millas 				= 0
	SET @Cantidad_Saldo 		= @pCantidad
	SET @Analisis 				= ''
	SET @Flag_QA 				= 'A'
	SET @Id_Costo 				= 0
	SET @Id_Tarea 				= 0
	SET @Fecha_Caducidad 		= NULL
	SET @Id_Pais 				= ''
	SET @Cantidad_Equiv 		= @pCantidad_Equiv

	IF(@pCosto_MO <> 0)
	BEGIN
		SET @Costo_MO 			= @pCosto_MO
	END
	ELSE
	BEGIN
		SET @Costo_MO			= @Costo_Rentabilidad
	END

	SET @Costo_GF 				= @pCosto_GF
	SET @Fecha_Proceso 			= NULL
	SET @Id_Balanza 			= ''
	SET @Orden 					= 0
	SET @Flag_NoImp_Factura 	= 0
	SET @Nro_Tag 				= ''
	SET @Fecha_Elaboracion 		= NULL
	SET @Costo_Comparativo 		= 0
	SET @Porc_Imp_Int 			= 0
	SET @Observacion			= ''	

	/*************************************************************************************************/

	IF((@pFecha_Entrega <> '19000101') AND (CONVERT(DATE, @pFecha_Entrega) <> CONVERT(DATE, GETDATE())))
	BEGIN
		UPDATE Cbtes 
		SET
		Fecha_Estimada = @pFecha_Entrega
		WHERE
		Id_Trans = @pId_Trans
	END

	/*************************************************************************************************/

	IF @pFlag_Tabla_Temp = 1
	BEGIN
		INSERT INTO #ITEMS_CBTE
		(Id_Trans,		Item,					Id_Producto, 
		Id_Estado_Cbte, Cantidad,				Calle, 
		Columna,		Fila,					Bultos, 
		Despacho,		Serie,					Fecha_Venc,
		Observacion,	Millas,					Cantidad_Saldo, 
		Precio_Grav,	Precio_Exen,			Imp_Gravado, 
		Imp_Exento,		Analisis,				Lote, 
		Flag_QA,		Fecha_QA,				Porc_Iva, 
		Bonif,			Descripcion_producto,	Id_Unidad_Medida, 
		Imp_Final,		Costo,					Imp_Iva, 
		Precio,			Id_Costo,				Id_Cliente,
		Id_Tarea,		Fecha_Caducidad,		Id_Pais, 
		Id_Usuario,		Cantidad_Equiv,			Costo_MO, 
		Costo_GF,		Id_Cond_Pago,			Fecha_Proceso, 
		Id_Balanza,		Orden,					Flag_NoImp_Factura, 
		Nro_Tag,		Fecha_Elaboracion,		Costo_Comparativo, 
		Porc_Imp_Int,	Id_Cta_Banco)
		VALUES
		(@pId_Trans,		@Item,					@pId_Producto, 
		@Id_Estado_Cbte,	@pCantidad,				@Calle, 
		@Columna,			@Fila,					@Bultos, 
		@Despacho,			@Serie,					@pFecha_Venc,
		@Observacion,		@Millas,				@Cantidad_Saldo, 
		@Precio_Grav,		@Precio_Exen,			@Imp_Gravado, 
		@Imp_Exento,		@Analisis,				@pLote, 
		@Flag_QA,			@pFecha_QA,				@Porc_Iva, 
		@pBonif,			@Descripcion_producto,	@Id_Unidad_Medida, 
		@Imp_Final,			@Costo,					@Imp_Iva, 
		@Precio,			@Id_Costo,				@pId_Cliente,
		@Id_Tarea,			@Fecha_Caducidad,		@Id_Pais, 
		@Id_Usuario,		@Cantidad_Equiv,		@Costo_MO, 
		@Costo_GF,			@Id_Cond_Pago,			@Fecha_Proceso, 
		@Id_Balanza,		@Orden,					@Flag_NoImp_Factura, 
		@Nro_Tag,			@Fecha_Elaboracion,		@Costo_Comparativo, 
		@Porc_Imp_Int,		@Id_Cta_Banco)
	END
	ELSE
	BEGIN    
		INSERT INTO CBTES_ITEMS
		(Id_Trans,		Item,					Id_Producto, 
		Id_Estado_Cbte, Cantidad,				Calle, 
		Columna,		Fila,					Bultos, 
		Despacho,		Serie,					Fecha_Venc,
		Observacion,	Millas,					Cantidad_Saldo, 
		Precio_Grav,	Precio_Exen,			Imp_Gravado, 
		Imp_Exento,		Analisis,				Lote, 
		Flag_QA,		Fecha_QA,				Porc_Iva, 
		Bonif,			Descripcion_producto,	Id_Unidad_Medida, 
		Imp_Final,		Costo,					Imp_Iva, 
		Precio,			Id_Costo,				Id_Cliente,
		Id_Tarea,		Fecha_Caducidad,		Id_Pais, 
		Id_Usuario,		Cantidad_Equiv,			Costo_MO, 
		Costo_GF,		Id_Cond_Pago,			Fecha_Proceso, 
		Id_Balanza,		Orden,					Flag_NoImp_Factura, 
		Nro_Tag,		Fecha_Elaboracion,		Costo_Comparativo, 
		Porc_Imp_Int,	Id_Cta_Banco)
	    VALUES
		(@pId_Trans,		@Item,					@pId_Producto, 
		@Id_Estado_Cbte,	@pCantidad,				@Calle, 
		@Columna,			@Fila,					@Bultos, 
		@Despacho,			@Serie,					@pFecha_Venc,
		@Observacion,		@Millas,				@Cantidad_Saldo, 
		@Precio_Grav,		@Precio_Exen,			@Imp_Gravado, 
		@Imp_Exento,		@Analisis,				@pLote, 
		@Flag_QA,			@pFecha_QA,				@Porc_Iva, 
		@pBonif,			@Descripcion_producto,	@Id_Unidad_Medida, 
		@Imp_Final,			@Costo,					@Imp_Iva, 
		@Precio,			@Id_Costo,				@pId_Cliente,
		@Id_Tarea,			@Fecha_Caducidad,		@Id_Pais, 
		@Id_Usuario,		@Cantidad_Equiv,		@Costo_MO, 
		@Costo_GF,			@Id_Cond_Pago,			@Fecha_Proceso, 
		@Id_Balanza,		@Orden,					@Flag_NoImp_Factura, 
		@Nro_Tag,			@Fecha_Elaboracion,		@Costo_Comparativo, 
		@Porc_Imp_Int,		@Id_Cta_Banco)
	END

	/*===================================================================*/
	
	IF @pFlagUsarTrans <> 0 
	BEGIN
		COMMIT
	END

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

	SET @rtaMsjStored		=	'{' +
								dbo.CF_Json_ParsearVariable('id_trans', @pId_Trans, 'INT')  + ',' +
								dbo.CF_Json_ParsearVariable('item',@Item, 'SMALLINT')  + ',' +
								dbo.CF_Json_ParsearVariable('id_producto', @pId_Producto, 'VARCHAR')  + ',' +
								dbo.CF_Json_ParsearVariable('imp_final',@Imp_Final, 'DECIMAL') +
								'}'

	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_Cbtes_Fac_Generar_Item'
	END
	
END TRY  


BEGIN CATCH  
    EXECUTE usp_GetErrorInfo

	IF @pFlagUsarTrans <> 0 
	BEGIN
		ROLLBACK
	END

	RETURN 9999
END CATCH

RETURN 0 