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

CREATE PROCEDURE [dbo].[CPJ_Cbtes_Fac_Fin] @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 @pObservacion_Incluye_Integ VARCHAR(8000)
DECLARE @pFlag_Tabla_Temp           TINYINT
DECLARE @pFlag_Renumerar			TINYINT
DECLARE @id_Estado_cbte 			TINYINT
DECLARE @pOmitir_Result_OK			TINYINT

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_Trans					= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Trans')), 0)
SET @pObservacion_Incluye_Integ = ISNULL(CONVERT(VARCHAR(8000), dbo.CF_JSON_VALUE(@pJson,'Observacion_Incluye_Integ')), '')
SET @pFlag_Tabla_Temp           = ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Flag_Tabla_Temp')), 0)
SET @pFlag_Renumerar			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Flag_Renumerar')), 1)
SET @pOmitir_Result_OK			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Omitir_Result_OK')), 1)

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

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

/*Declaracion Variables Locales*/
DECLARE @Id_Cta_Contable					INT
DECLARE @Fecha								DATETIME
DECLARE @Observacion						VARCHAR(100)
DECLARE @Item								SMALLINT

DECLARE @Descripcion_Cbte					VARCHAR(80)
DECLARE @Porc_Bonificacion_Cb				DECIMAL(5,2)
DECLARE @Imp_Gravado_1						DECIMAL(12,2)
DECLARE @Imp_Gravado_2						DECIMAL(12,2)
DECLARE @Imp_Gravado_3						DECIMAL(12,2)
DECLARE @Imp_Iva_1							DECIMAL(12,2)
DECLARE @Imp_Iva_2							DECIMAL(12,2)
DECLARE @Imp_Iva_3							DECIMAL(12,2)
DECLARE @Imp_Exento							DECIMAL(12,2)
DECLARE @Imp_Total							DECIMAL(12,2)
DECLARE @Saldo								DECIMAL(12,2)
DECLARE @Imp_Bonificacion					DECIMAL(12,2)
DECLARE @Cantidad							DECIMAL(12,4)
DECLARE @Imp_Percep							DECIMAL(12,2)
DECLARE @Compromete_Factura					SMALLINT
DECLARE @Id_Tipo_Cbte						VARCHAR(4)
DECLARE @It_Sum_Iva_1						DECIMAL(12,2)
DECLARE @It_Sum_Iva_2						DECIMAL(12,2)
DECLARE @It_Sum_Iva_3						DECIMAL(12,2)
DECLARE @It_Sum_Iva_Total					DECIMAL(12,2)
DECLARE @It_Sum_Imp_Gravado_1				DECIMAL(12,2)
DECLARE @It_Sum_Imp_Gravado_2				DECIMAL(12,2)
DECLARE @It_Sum_Imp_Gravado_3				DECIMAL(12,2)
DECLARE @It_Sum_Gravado_Total				DECIMAL(12,2)
DECLARE @Tasa_Iva_1							DECIMAL(12,2)
DECLARE @Tasa_Iva_2							DECIMAL(12,2)
DECLARE @Tasa_Iva_3							DECIMAL(12,2)

DECLARE @Result_Tabla_Stored_Invocado TABLE (ErrorNumber	INT,
											ErrorSeverity	INT,
											ErrorState		INT,
											ErrorProcedure  VARCHAR(1000),
											ErrorLine		INT,
											ErrorMessage	VARCHAR(4000))

/*Fin de Declaraciones Variables Locales */

BEGIN TRY

	IF @pFlagUsarTrans <> 0 
	BEGIN
		BEGIN TRAN
	END

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Ingreso a Stored Procedure: CPJ_Cbtes_Fac_Fin'
		PRINT 'Parametros:'
		PRINT 'FlagUsarTrans: ' + CONVERT(VARCHAR(10), @pFlagUsarTrans) + ' Id_Trans: ' + CONVERT(VARCHAR(10), @pId_Trans)
	END
	
	/*===================================================================*/

	IF(@pId_Trans = 0)
	BEGIN
		SET @rtaErrorStored = 70001 /*Transaccion no abierta*/
		
		SELECT	 @rtaErrorStored	AS ErrorNumber 
				,0					AS ErrorSeverity  
				,0					AS ErrorState 
				,0					AS ErrorProcedure  
				,0					AS ErrorLine		
				,''					AS ErrorMessage
			
		IF @pFlagUsarTrans <> 0 
		BEGIN
			ROLLBACK
		END
		
		RETURN 9999
	END
	
	/*===================================================================*/	
		
	SET @JSON_Parametros_Stored_Invocado =	'{' +
											dbo.CF_Json_ParsearVariable('Id_Trans', @pId_Trans, 'INT') +
											'}'
											
	
	/*===================================================================*/

	SELECT 
	@Id_Tipo_Cbte = ISNULL(Id_Tipo_Cbte, '')
	FROM Cbtes
	WHERE
	Id_Trans = @pId_Trans

	SELECT
	@Compromete_Factura = ISNULL(Compromete_Factura, 0),
	@Id_Estado_cbte = Id_Estado_cbte
	FROM Cbtes_Tipos
	WHERE
	Id_Tipo_Cbte = @Id_Tipo_Cbte

	IF(@pModoDebug = 1)
	BEGIN
		PRINT '@Id_Tipo_Cbte: ' + @Id_Tipo_Cbte + ' @Compromete_Factura: ' + CONVERT(VARCHAR(10), @Compromete_Factura)
	END
	
	-----------------------------------------------------------------------------------------------------------------------------------------

	SET @Descripcion_Cbte = (dbo.CF_Cbte_Descrip(@pId_Trans))
	
	-----------------------------------------------------------------------------------------------------------------------------------------
	
	UPDATE Transacciones SET Descripcion = @Descripcion_Cbte WHERE Id_Trans = @pId_Trans
	
	-----------------------------------------------------------------------------------------------------------------------------------------
	
	UPDATE Cbtes_Items 	SET Id_Estado_Cbte = 1	WHERE Id_Trans = @pId_Trans
	
	-----------------------------------------------------------------------------------------------------------------------------------------

	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'))

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

	SET @Porc_Bonificacion_Cb	= ISNULL((SELECT ISNULL(Porc_Bonificacion, 0) FROM Cbtes WHERE Id_Trans = @pId_Trans), 0)
	
	-----------------------------------------------------------------------------------------------------------------------------------------
	
	SET @It_Sum_Imp_Gravado_1	= 0
	SET @It_Sum_Imp_Gravado_2	= 0
	SET @It_Sum_Imp_Gravado_3	= 0
	SET @It_Sum_Gravado_Total	= 0

	SET @Imp_Gravado_1			= 0
	SET @Imp_Gravado_2			= 0
	SET @Imp_Gravado_3			= 0

	-----------------------------------------------------------------------------------------------------------------------------------------
	
	SET @It_Sum_Iva_1			= 0
	SET @It_Sum_Iva_2			= 0
	SET @It_Sum_Iva_3			= 0
	SET @It_Sum_Iva_Total		= 0
	
	SET @Imp_Iva_1				= 0
	SET @Imp_Iva_2				= 0
	SET @Imp_Iva_3				= 0

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

	--06/07/2021 Se comenta en @Imp_Gravado_Sum_It la multiplicacion de * ISNULL(Cantidad_Saldo, 0)
	IF @pFlag_Tabla_Temp = 0
	BEGIN
		SET @It_Sum_Imp_Gravado_1	= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0))) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = @Tasa_Iva_1), 0)
		SET @It_Sum_Imp_Gravado_2	= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0))) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = @Tasa_Iva_2), 0)
		SET @It_Sum_Imp_Gravado_3	= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0))) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = @Tasa_Iva_3), 0)
		SET @It_Sum_Gravado_Total	= @It_Sum_Imp_Gravado_1 + @It_Sum_Imp_Gravado_2 + @It_Sum_Imp_Gravado_3

		SET @It_Sum_Iva_1			= ISNULL((SELECT SUM(ISNULL(Imp_Iva, 0)) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = @Tasa_Iva_1), 0)
		SET @It_Sum_Iva_2			= ISNULL((SELECT SUM(ISNULL(Imp_Iva, 0)) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = @Tasa_Iva_2), 0)
		SET @It_Sum_Iva_3			= ISNULL((SELECT SUM(ISNULL(Imp_Iva, 0)) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = @Tasa_Iva_3), 0)
		SET @It_Sum_Iva_Total		= @It_Sum_Iva_1 + @It_Sum_Iva_2 + @It_Sum_Iva_3

 	    SET @Imp_Exento				= ISNULL((SELECT SUM((ISNULL(Imp_Exento, 0) * ISNULL(Cantidad_Saldo, 0))) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans), 0)
		SET @Imp_Exento				= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0) * ISNULL(Cantidad_Saldo, 0))) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans AND Porc_Iva = 0), 0)	--03/08/2021 Debido a que Gabriel nos dijo que aunque se exento lo grabe en Imp_Gravado
        SET @Cantidad				= ISNULL((SELECT COUNT(*) FROM Cbtes_Items WHERE Id_Trans = @pId_Trans), 0)  
        SET @Imp_Percep				= ISNULL((SELECT SUM(ISNULL(Importe, 0)) FROM Cbtes_Reten WHERE Id_Trans = @pId_Trans), 0)	--21/04/2021 Se agrega
	END
    ELSE
	BEGIN
		SET @It_Sum_Imp_Gravado_1	= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0))) FROM #ITEMS_CBTE WHERE Porc_Iva = @Tasa_Iva_1), 0)
		SET @It_Sum_Imp_Gravado_2	= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0))) FROM #ITEMS_CBTE WHERE Porc_Iva = @Tasa_Iva_2), 0)
		SET @It_Sum_Imp_Gravado_3	= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0))) FROM #ITEMS_CBTE WHERE Porc_Iva = @Tasa_Iva_3), 0)
		SET @It_Sum_Gravado_Total	= @It_Sum_Imp_Gravado_1 + @It_Sum_Imp_Gravado_2 + @It_Sum_Imp_Gravado_3

		SET @It_Sum_Iva_1			= ISNULL((SELECT SUM(ISNULL(Imp_Iva, 0)) FROM #ITEMS_CBTE WHERE Porc_Iva = @Tasa_Iva_1), 0)
		SET @It_Sum_Iva_2			= ISNULL((SELECT SUM(ISNULL(Imp_Iva, 0)) FROM #ITEMS_CBTE WHERE Porc_Iva = @Tasa_Iva_2), 0)
		SET @It_Sum_Iva_3			= ISNULL((SELECT SUM(ISNULL(Imp_Iva, 0)) FROM #ITEMS_CBTE WHERE Porc_Iva = @Tasa_Iva_3), 0)
		SET @It_Sum_Iva_Total		= @It_Sum_Iva_1 + @It_Sum_Iva_2 + @It_Sum_Iva_3

		SET @Imp_Exento				= ISNULL((SELECT SUM((ISNULL(Imp_Exento, 0) * ISNULL(Cantidad_Saldo, 0))) FROM #ITEMS_CBTE), 0)
		SET @Imp_Exento				= ISNULL((SELECT SUM((ISNULL(Imp_Gravado, 0) * ISNULL(Cantidad_Saldo, 0))) FROM #ITEMS_CBTE WHERE Porc_Iva = 0), 0)	--03/08/2021 Debido a que Gabriel nos dijo que aunque se exento lo grabe en Imp_Gravado
        SET @Cantidad				= ISNULL((SELECT COUNT(*) FROM #ITEMS_CBTE), 0)  
        SET @Imp_Percep				= ISNULL((SELECT SUM(ISNULL(Importe, 0)) FROM Cbtes_Reten WHERE Id_Trans = @pId_Trans), 0)	--21/04/2021 Se agrega
	END        	
	
	-----------------------------------------------------------------------------------------------------------------------------------------
	
	IF(@Porc_Bonificacion_Cb = 0)
	BEGIN
		SET @Imp_Gravado_1		= @It_Sum_Imp_Gravado_1
		SET @Imp_Gravado_2		= @It_Sum_Imp_Gravado_2
		SET @Imp_Gravado_3		= @It_Sum_Imp_Gravado_3
	END
	ELSE
	BEGIN
		SET @Imp_Gravado_1		= (@It_Sum_Imp_Gravado_1 * ((100 - @Porc_Bonificacion_Cb) / 100))
		SET @Imp_Gravado_2		= (@It_Sum_Imp_Gravado_2 * ((100 - @Porc_Bonificacion_Cb) / 100))
		SET @Imp_Gravado_3		= (@It_Sum_Imp_Gravado_3 * ((100 - @Porc_Bonificacion_Cb) / 100))
	END

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

	SET @Imp_Iva_1				= @It_Sum_Iva_1
	SET @Imp_Iva_2				= @It_Sum_Iva_2
	SET @Imp_Iva_3				= @It_Sum_Iva_3

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

	SET @Imp_Total				=	(@Imp_Gravado_1 + @Imp_Gravado_2 + @Imp_Gravado_3) + 
									(@Imp_Iva_1 + @Imp_Iva_2 + @Imp_Iva_3) + 
									@Imp_Exento + 
									@Imp_Percep
	
	-----------------------------------------------------------------------------------------------------------------------------------------

	SET @Saldo					= @Imp_Total
	SET @Imp_Bonificacion		= ((@It_Sum_Imp_Gravado_1 + @It_Sum_Imp_Gravado_2 + @It_Sum_Imp_Gravado_3) - (@Imp_Gravado_1 + @Imp_Gravado_2 + @Imp_Gravado_3))		
	
	-----------------------------------------------------------------------------------------------------------------------------------------
	
	IF (@It_Sum_Iva_Total = 0)
	BEGIN
		SET @Imp_Exento = @Imp_Exento + @Imp_Gravado_1 + @Imp_Gravado_2 + @Imp_Gravado_3
		SET @Imp_Gravado_1 = 0
		SET @Imp_Gravado_2 = 0
		SET @Imp_Gravado_3 = 0
	END
	
	-----------------------------------------------------------------------------------------------------------------------------------------

	UPDATE Cbtes 
	SET 
	Cantidad			= @Cantidad,
	Imp_Gravado			= @Imp_Gravado_1, 
	Imp_Gravado2		= @Imp_Gravado_2,
	Imp_Gravado3		= @Imp_Gravado_3, 
	Imp_Exento			= @Imp_Exento,
	Saldo				= @Saldo, 
	Imp_Iva				= @Imp_Iva_1,
	Imp_Iva2			= @Imp_Iva_2,
	Imp_Iva3			= @Imp_Iva_3,
	Imp_Bonificacion	= @Imp_Bonificacion,
	Imp_Total			= @Imp_Total,
	Observacion         = @pObservacion_Incluye_Integ,
	Imp_Percep			= @Imp_Percep,
    Id_Estado_Cbte      = @Id_Estado_cbte
	WHERE 
	Id_Trans = @pId_Trans

	-----------------------------------------------------------------------------------------------------------------------------------------
		
	UPDATE Clientes_CtaCte
	SET
	Descripcion		= @Descripcion_Cbte,
	Importe			= @Imp_Total * @Compromete_Factura,
	Saldo			= @Saldo * @Compromete_Factura
	WHERE
	Id_Trans = @pId_Trans

	-----------------------------------------------------------------------------------------------------------------------------------------
	If dbo.CF_xParam('Lote:Asi_Generar') = 1
	   BEGIN
			SET @JSON_Parametros_Stored_Invocado =	'{' +
													dbo.CF_Json_ParsearVariable('FlagUsarTrans', 0, 'INT') + ',' +
													dbo.CF_Json_ParsearVariable('Id_Trans', @pId_Trans, 'INT') + ',' +
													dbo.CF_Json_ParsearVariable('ModoDebug', @pModoDebug, 'INT') + ',' +
													dbo.CF_Json_ParsearVariable('FlagRegenerar', 1, 'TINYINT') + 
													'}'
			INSERT INTO @Result_Tabla_Stored_Invocado					
			EXEC @Result_Stored_Invocado = dbo.CPJ_Cbtes_Ctas_Contables_Generar @JSON_Parametros_Stored_Invocado
			IF ISNULL(@Result_Stored_Invocado,0) <> 0 
			BEGIN
				/*El CPJ_Cbtes_Ctas_Contables_Generar debera devolver el SELECT con el error*/
				SELECT * FROM @Result_Tabla_Stored_Invocado
				RETURN 9999
			END		
        END
	-----------------------------------------------------------------------------------------------------------------------------------------

	IF(@pFlag_Renumerar = 1)
	BEGIN
	    INSERT INTO @Result_Tabla_Stored_Invocado
		EXEC @Result_Stored_Invocado = dbo.CPJ_Cbtes_Grabar_Numero @JSON_Parametros_Stored_Invocado
		IF ISNULL(@Result_Stored_Invocado,0) <> 0 
		BEGIN
			/*El CPJ_Cbtes_Grabar_Numero deber├Øa devolver el SELECT con el error*/
	     	SELECT * FROM @Result_Tabla_Stored_Invocado
			RETURN 9999
		END

		SET @Descripcion_Cbte = (dbo.CF_Cbte_Descrip(@pId_Trans))
		UPDATE Transacciones SET Descripcion = @Descripcion_Cbte WHERE Id_Trans = @pId_Trans
		UPDATE Clientes_CtaCte SET Descripcion = @Descripcion_Cbte WHERE Id_Trans = @pId_Trans
	END
	-----------------------------------------------------------------------------------------------------------------------------------------

	--17/11/2020 Se agrega que si el saldo es 0 en cta cte tiene que poner el estado en completo
	IF(@Saldo = 0)
	BEGIN
		UPDATE Clientes_CtaCte
		SET
		Id_Estado_Cbte = 2 --Completo
		WHERE
		Id_Trans = @pId_Trans
	END

	-----------------------------------------------------------------------------------------------------------------------------------------
	
	IF @pFlagUsarTrans <> 0 
	BEGIN
		COMMIT
	END

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

	SET @rtaMsjStored		=	'{' +
								dbo.CF_Json_ParsearVariable('id_trans', @pId_Trans, 'INT') + ',' +
								dbo.CF_Json_ParsearVariable('descrip_Cbte', @Descripcion_Cbte, 'VARCHAR') +
								'}'
    IF @pOmitir_Result_OK = 0
		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_Fin'
	END

END TRY  


BEGIN CATCH  
    EXECUTE usp_GetErrorInfo

	IF @pFlagUsarTrans <> 0 
	BEGIN
		ROLLBACK
	END

	RETURN 9999
END CATCH

RETURN 0 

--EXEC dbo.CPJ_Cbtes_Fac_Fin '{"FlagUsarTrans":"0","ModoDebug":"1","Id_Trans":"9067896","Flag_Renumerar":"1"}'
