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

CREATE PROCEDURE [dbo].[CPJ_Cbtes_Asientos_Control] @pJsonRecibido VARCHAR(8000)
AS 
SET NOCOUNT ON
/*Parametros*/
DECLARE		@pId_Usuario			INT,
			@pFlagUsarTrans			TINYINT,
			@pModoDebug				TINYINT,
			@pFecha_Desde			DATETIME,
			@pFecha_Hasta			DATETIME,
			@pTipo					CHAR(1),
			@pDiferencia			DECIMAL(12,2),
			@pFlag_SinAsientos		TINYINT,
			@pFlag_NoBalanceados 	TINYINT,
			@pFlag_Fechas			TINYINT,
			@pFlag_Periodo			TINYINT,
			@pFlag_Alias			TINYINT,
			@pFlag_CentroCostos		TINYINT,
			@pFlag_Diferencias		TINYINT,
			@pFlag_AsiResumen		TINYINT
			
			

SET @pId_Usuario				= ISNULL(CONVERT(SMALLINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Id_Usuario')), 0)
SET @pFlagUsarTrans				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'FlagUsarTrans')), 0)
SET @pModoDebug					= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'ModoDebug')), 0)

SET @pFecha_Desde				= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJsonRecibido,'Fecha_Desde')),GETDATE())
SET @pFecha_Hasta				= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJsonRecibido,'Fecha_Hasta')),GETDATE())
SET @pTipo						= ISNULL(CONVERT(CHAR(1), dbo.CF_JSON_VALUE(@pJsonRecibido,'Tipo')),'')
SET @pDiferencia				= ISNULL(CONVERT(DECIMAL(12,2), dbo.CF_JSON_VALUE(@pJsonRecibido,'Diferencia')),0)
SET	@pFlag_SinAsientos			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_SinAsientos')), 0)
SET	@pFlag_NoBalanceados		= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_NoBalanceados')), 0)
SET	@pFlag_Fechas				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_Fechas')), 0)
SET	@pFlag_Periodo				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_Periodo')), 0)
SET	@pFlag_Alias				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_Alias')), 0)
SET	@pFlag_CentroCostos			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_CentroCostos')), 0)
SET	@pFlag_Diferencias			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_Diferencias')), 0)
SET	@pFlag_AsiResumen			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Flag_AsiResumen')), 0)


IF (@pFlag_SinAsientos + @pFlag_NoBalanceados + @pFlag_Fechas + @pFlag_Periodo + @pFlag_Alias +		
   @pFlag_CentroCostos + @pFlag_Diferencias	+ @pFlag_AsiResumen) = 0
BEGIN   
	SET	@pFlag_SinAsientos			= 1
	SET	@pFlag_NoBalanceados		= 1
	SET	@pFlag_Fechas				= 1
	SET	@pFlag_Periodo				= 1
	SET	@pFlag_Alias				= 1
	SET	@pFlag_CentroCostos			= 1
	SET	@pFlag_Diferencias			= 1
	SET	@pFlag_AsiResumen			= 1
END	

	


/*Variables locales*/
DECLARE		@accion		NVARCHAR(250)
DECLARE		@sql		NVARCHAR(MAX)
DECLARE		@insert		NVARCHAR(MAX)
DECLARE		@from		NVARCHAR(MAX)
DECLARE		@filtro		NVARCHAR(MAX)
DECLARE		@Error_Msg	NVARCHAR(1000)
DECLARE		@Id_Error	NVARCHAR(10)

/*************************************************/
IF UPPER(@pTipo) NOT IN ('R','O','C','T','V','')	RETURN

CREATE TABLE  #Respuesta (
	Fecha			DATETIME,
	Comprobante_Nro INT,
	Destinatario	VARCHAR(100),
	Imp_Total		DECIMAL(12,2),
	Id_Trans		INT,
	Id_Error		INT, 
	Error_Msg		VARCHAR(1000),
	Accion			VARCHAR(5000)
	)

SET @insert =	'INSERT INTO #Respuesta'	+ CHAR(13) + 	
				'SELECT C.Fecha,C.Comprobante_Nro,C.Destinatario,C.Imp_Total,C.Id_Trans '		+ CHAR(13)
				
SET @from =	'	FROM Cbtes C, Cbtes_Tipos T '												+ CHAR(13) +
				'	WHERE C.Id_Tipo_Cbte = T.Id_Tipo_Cbte'										+ CHAR(13) +
				'	AND C.Id_Estado_Cbte NOT IN(0,3)'

IF UPPER(@pTipo) = 'R'
	SET @from =  RTRIM(LTRIM(@from))																+ CHAR(13) + 
			'		AND C.Fecha >= ''' + CONVERT(VARCHAR(8),@pFecha_Desde,112) + ''''			+ CHAR(13) + 
			'		AND C.Fecha < ''' + CONVERT(VARCHAR(8),@pFecha_Hasta + 1,112) + ''''		+ CHAR(13) + 
            '		AND T.Compromete_Asientos IN (1,-1)'										+ CHAR(13) +
            '		AND ISNULL(T.Compromete_Trans_Fondos,0) = 0 '								+ CHAR(13) +
            '		AND T.Compromete_Recibos IN (1,-1)'

IF UPPER(@pTipo) = 'O'
	SET @from =  RTRIM(LTRIM(@from))																+ CHAR(13) + 
			'		AND C.Fecha >= ''' + CONVERT(VARCHAR(8),@pFecha_Desde,112) + ''''			+ CHAR(13) + 
			'		AND C.Fecha < ''' + CONVERT(VARCHAR(8),@pFecha_Hasta + 1,112) + ''''		+ CHAR(13) + 
            '		AND T.Compromete_Asientos IN (1,-1)'										+ CHAR(13) +
            '		AND T.Compromete_Pagos IN (1,-1)'

IF UPPER(@pTipo) = 'C'
	SET @from =  RTRIM(LTRIM(@from))																+ CHAR(13) + 
			'		AND C.Periodo_Iva >= ''' + CONVERT(VARCHAR(8),@pFecha_Desde,112) + ''''			+ CHAR(13) + 
			'		AND C.Periodo_Iva < ''' + CONVERT(VARCHAR(8),@pFecha_Hasta + 1,112) + ''''		+ CHAR(13) + 
            '		AND T.Compromete_Asientos IN (1,-1)'										+ CHAR(13) +
            '		AND ISNULL(T.Compromete_Recibos,0) = 0 '									+ CHAR(13) +
            '		AND T.Compromete_Compras IN (1,-1)'

IF UPPER(@pTipo) = 'T'
	SET @from =  RTRIM(LTRIM(@from))																+ CHAR(13) + 
			'		AND C.Fecha >= ''' + CONVERT(VARCHAR(8),@pFecha_Desde,112) + ''''			+ CHAR(13) + 
			'		AND C.Fecha < ''' + CONVERT(VARCHAR(8),@pFecha_Hasta + 1,112) + ''''		+ CHAR(13) + 
            '		AND T.Compromete_Asientos IN (1,-1)'										+ CHAR(13) +
            '		AND T.Compromete_Trans_Fondos IN (1,-1)'

IF UPPER(@pTipo) = 'V' OR UPPER(@pTipo) = ''
	SET @from =  RTRIM(LTRIM(@from))																+ CHAR(13) + 
			'		AND C.Fecha >= ''' + CONVERT(VARCHAR(8),@pFecha_Desde,112) + ''''			+ CHAR(13) + 
			'		AND C.Fecha < ''' + CONVERT(VARCHAR(8),@pFecha_Hasta + 1,112) + ''''		+ CHAR(13) + 
            '		AND T.Compromete_Asientos IN (1,-1)'										+ CHAR(13) +
            '		AND ISNULL(T.Compromete_Trans_Fondos,0) = 0 '								+ CHAR(13) +
            '		AND T.Compromete_Impuestos IN (1,-1)'										+ CHAR(13) +
            '		AND T.Compromete_Factura  IN (1,-1)'

/********************************************************************************************/
/*Comprobantes sin Asientos---------------------------------------*/
IF @pFlag_SinAsientos = 1
	BEGIN
	IF @pModoDebug = 1 PRINT 'Comprobantes sin Asientos'

	SET @filtro		=  '		AND NOT EXISTS (SELECT 1 FROM Cbtes_Ctas_Contables CTA WHERE CTA.Id_Trans = C.Id_Trans) '
	SET @Id_Error	= ',1001'
	SET @Error_Msg	= ',''Cbte. sin asiento'''
	SET @accion		= ',''Se debe generar el asiento'''


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END

/********************************************************************************************/
/*Asientos no balanceados---------------------------------------*/
IF @pFlag_NoBalanceados = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Asientos no balanceados'

	SET @filtro =	CHAR(13) +	'	AND	((SELECT ISNULL(SUM(Debe),0) FROM Cbtes_Ctas_Contables CTA ' + CHAR(13) +
								'           WHERE CTA.Id_Trans = C.Id_Trans) ' + CHAR(13) +
								'		<> (SELECT ISNULL(SUM(Haber),0) FROM Cbtes_Ctas_Contables CTA ' + CHAR(13) +
								'			WHERE CTA.Id_Trans = C.Id_Trans))'
	SET @Id_Error	= ',1002'
	SET @Error_Msg	= ',''Asiento no balanceado'''
	SET @accion		= ',''Se debe generar el asiento'''


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END


/********************************************************************************************/
/*Fechas no validas---------------------------------------*/
IF @pFlag_Fechas = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Fechas no validas'

	IF UPPER(@ptipo) = 'C'
	BEGIN
		SET @filtro =	CHAR(13) +	'	AND	 C.Fecha > C.Periodo_Iva '
		SET @Error_Msg	= ',''Fecha inválida'''
		SET @accion		= ',''La fecha del cbte. debe ser mayor o igual al período de iva'''
	END
	ELSE
	BEGIN
		SET @filtro =	CHAR(13) +	'	AND	 C.Fecha <> C.Periodo_Iva ' 
		SET @Error_Msg	= ',''Fecha inválida'''
		SET @accion		= ',''La fecha del cbte. debe ser igual al período de iva'''
	END

	SET @Id_Error	= ',1003'


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END

/********************************************************************************************/
/*Periodo contable no válido---------------------------------------*/
IF @pFlag_Periodo = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Periodo contable no válido'

	SET @filtro =	CHAR(13) +	
		' AND EXISTS (SELECT 1 FROM Cbtes_Ctas_Contables CTA2, Pla_Ctas_Cuentas_Contables PL,'+ CHAR(13) +
		'						Plan_Ctas PT, Plan_Ctas_Ejercicios EJ'+ CHAR(13) +
		'					 WHERE CTA2.Id_Trans = C.Id_Trans  '+ CHAR(13) +
		'						AND PL.Id_Cta_Contable = CTA2.Id_Cta_Contable '+ CHAR(13) +
		'						AND PT.Id_Plan_Cta = PL.Id_Plan_Cta '+ CHAR(13) +
		'						AND EJ.Id_Ejercicio = PT.Id_Ejercicio '+ CHAR(13) +
		'						AND (C.Periodo_Iva < EJ.Fecha_Inicio OR C.Periodo_Iva > EJ.Fecha_Cierre))'
	SET @Error_Msg	= ',''Cuenta contable fuera de ejercio'''
	SET @accion		= ',''Se debe regenerar el asiento'''
	SET @Id_Error	= ',1004'


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END


/********************************************************************************************/
/*Alias de asiento inválido---------------------------------------*/
IF @pFlag_Alias = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Alias de asiento inválido'

	SET @filtro =	CHAR(13) +	
		' AND EXISTS (SELECT 1 FROM Cbtes_Ctas_Contables CTA2 '+ CHAR(13) +
		'			 WHERE CTA2.Id_Trans = C.Id_Trans '+ CHAR(13) +
		'				AND (ISNULL(dbo.CF_Cta_Cont(CTA2.alias,c.periodo_iva),0) = 0  '+ CHAR(13) +
		'				OR ISNULL(dbo.CF_Cta_Cont(CTA2.alias,c.periodo_iva),0) <> CTA2.Id_Cta_Contable ))'

	SET @Error_Msg	= ',''Alias inválido'''
	SET @accion		= ',''Se debe regenerar el asiento'''
	SET @Id_Error	= ',1005'


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END	

/********************************************************************************************/
/*Falta de centro de costo---------------------------------------*/
IF @pFlag_CentroCostos = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Falta de centro de costo'

	SET @filtro =	CHAR(13) +	
		' AND EXISTS (SELECT 1 FROM Cbtes_Ctas_Contables CTA3, Pla_Ctas_Cuentas_Contables PL '+ CHAR(13) +
		'			 WHERE CTA3.Id_Trans = C.Id_Trans '+ CHAR(13) +
		'				AND PL.Id_Cta_Contable = CTA3.Id_Cta_Contable  '+ CHAR(13) +
		'				AND PL.Tipo IN (''+'',''-'')   '+ CHAR(13) +
		'				AND (ISNULL(CTA3.Id_Centro_Costo,'''') = '''')) '

	SET @Error_Msg	= ',''Falta de centro de costo'''
	SET @accion		= ',''Se debe asignar centro de costo'''
	SET @Id_Error	= ',1006'


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END

/********************************************************************************************/
/* Diferencia de importes---------------------------------------*/
IF @pFlag_Diferencias = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Diferencia de importes'

	IF @pDiferencia = 0
		SET @filtro =	CHAR(13) +	
			'		AND  ((SELECT ISNULL(SUM(CTA4.Debe),0) '+ CHAR(13) +
			'			FROM Cbtes_Ctas_Contables CTA4 WHERE CTA4.Id_Trans = C.Id_Trans)  <> C.Imp_Total) '
	ELSE
		SET @filtro =	CHAR(13) +	
			'		AND   (ABS((SELECT ISNULL(SUM(CTA4.Debe),0)  '+ CHAR(13) +
			'						FROM Cbtes_Ctas_Contables CTA4 WHERE CTA4.Id_Trans = C.Id_Trans)  '+ CHAR(13) +
			'						- C.Imp_Total) > '+ CONVERT(VARCHAR(20),@pDiferencia) + ') '

	SET @Error_Msg	= ',''Suma del debe o haber no coincide con el total de comprobante'''
	SET @accion		= ',''Se debe regenerar el asiento del comprobante'''
	SET @Id_Error	= ',1007'


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END


/********************************************************************************************/
/* Cbtes con asientos resumen inexistentes---------------------------------------*/
IF @pFlag_AsiResumen = 1
BEGIN
	IF @pModoDebug = 1 PRINT 'Cbtes con asientos resumen inexistentes'

	SET @filtro =	CHAR(13) +	
			'		AND ISNULL(C.Id_Asiento,0) <> 0 AND NOT EXISTS (SELECT 1 FROM Asientos A WHERE A.Id_Asiento = C.Id_Asiento) '

	SET @Error_Msg	= ',''Asiento resumen inexistente'''
	SET @accion		= ',''Se debe generar los asientos resúmenes'''
	SET @Id_Error	= ',1008'


	SET @sql = @insert + @Id_Error + @Error_Msg + @accion + @from + @filtro
	IF @pModoDebug = 1 PRINT @Sql
	EXEC sp_executesql @Sql
END

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

/********************************************************************************************/
SELECT * FROM #Respuesta
DROP TABLE #Respuesta



/*
EXEC [CPJ_Cbtes_Asientos_Control] '{
			"Fecha_Desde":"20210401",
			"Fecha_Hasta":"20210430",
			"Tipo":"V",
			"Id_Usuario":"-1",
			"FlagUsarTrans":"1",
			"ModoDebug":"1"
			}'


*/