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

CREATE PROCEDURE CPJ_Cli_Catcte_Control  @pJsonRecibido VARCHAR(8000)	 

AS
SET NOCOUNT ON 
DECLARE 	@pId_Cliente			INT,
			@pReparar				CHAR(1),
			@pDebug					INT,
			@Cli_Ref_CtaCte_Agrup	INT,
			@Id_Cliente_Tit			INT,
			@Sql					VARCHAR(MAX)


SET @pId_Cliente				= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Id_Cliente')),0)
SET @pReparar					= ISNULL(CONVERT(CHAR(1), dbo.CF_JSON_VALUE(@pJsonRecibido,'Reparar')),'')
SET @pDebug						= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJsonRecibido,'Debug')),0)

SET @Cli_Ref_CtaCte_Agrup = ISNULL(CONVERT(INT,dbo.CF_xParam('Cli_Ref_CtaCte_Agrup')),0)

CREATE TABLE  #Respuesta (Id_Error INT, Error_Msg VARCHAR(1000),Accion VARCHAR(5000))

IF @Cli_Ref_CtaCte_Agrup <> 0	
	SET @Id_Cliente_Tit = dbo.CF_Cli_Id_Cliente_Ref(@pId_Cliente)
ELSE
	SET @Id_Cliente_Tit = @pId_Cliente




	
/****************Signo erroneo en ctat.cte. en facturas **************************/
IF @pReparar = 'S'
BEGIN
	SET @Sql = 'UPDATE Clientes_CtaCte SET Importe = Importe * -1
			FROM Clientes_CtaCte K, Cbtes C, Cbtes_Tipos T
			 WHERE K.Id_Trans = C.Id_Trans AND T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
			 AND T.Compromete_Factura = 1
			 AND C.Id_Estado_Cbte IN (1,2,4)
			 AND K.Importe < 0'
	IF @Cli_Ref_CtaCte_Agrup <> 0
		SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
							OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
							)'
	ELSE
		SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
    IF @pDebug = 1 PRINT @Sql
	EXEC(@sql)
END

SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9000,''Signo erroneo en ctat.cte. en facturas, '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente)  ,''REPARACIÓN AUTOMÁTICA POSIBLE'' 
				 FROM Clientes_CtaCte K, Cbtes C, Cbtes_Tipos T
				 WHERE K.Id_Trans = C.Id_Trans AND T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND T.Compromete_Factura = 1 
				 AND C.Id_Estado_Cbte IN (1,2,4)
				 AND K.Importe < 0'
IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)



/****************Signo erroneo en ctat.cte. en NC o REC**************************/
IF @pReparar = 'S'
BEGIN
	SET @Sql = 'UPDATE Clientes_CtaCte SET Importe = Importe * -1
			FROM Clientes_CtaCte K, Cbtes C, Cbtes_Tipos T
			 WHERE K.Id_Trans = C.Id_Trans AND T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
			 AND (T.Compromete_Factura = -1 OR T.Compromete_Recibos = 1)
			 AND C.Id_Estado_Cbte IN (1,2,4)
			 AND K.Importe > 0'
	IF @Cli_Ref_CtaCte_Agrup <> 0
		SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
							OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
							)'
	ELSE
		SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
    IF @pDebug = 1 PRINT @Sql
	EXEC(@sql)
END

SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9001,''Signo erroneo en ctat.cte. en NC o REC, '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente)  ,''REPARACIÓN AUTOMÁTICA POSIBLE'' 
				 FROM Clientes_CtaCte K, Cbtes C, Cbtes_Tipos T
				 WHERE K.Id_Trans = C.Id_Trans AND T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND (T.Compromete_Factura = -1 OR T.Compromete_Recibos = 1)
				 AND C.Id_Estado_Cbte IN (1,2,4)
				 AND K.Importe > 0'
IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)


	
/*************** *Estado diferente en ctat.cte.  **************************/
IF @pReparar = 'S'
BEGIN
	SET @Sql = 'UPDATE Clientes_CtaCte SET Id_Estado_Cbte =  C.Id_Estado_Cbte
					 FROM Clientes_CtaCte K, Cbtes C, Cbtes_Tipos T
					 WHERE K.Id_Trans = C.Id_Trans AND T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
					 AND (T.Compromete_Factura = -1 OR T.Compromete_Recibos = 1)
					 AND C.Id_Estado_Cbte IN (1,2,4) 
					 AND C.Id_Estado_Cbte <> K.Id_Estado_Cbte'
	IF @Cli_Ref_CtaCte_Agrup <> 0
		SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
							OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
							)'
	ELSE
		SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
	IF @pDebug = 1 PRINT @Sql
	EXEC(@sql)
END

SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9002,''Estado diferente en ctacte., '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente) ,''REPARACIÓN AUTOMÁTICA POSIBLE'' 
				 FROM Clientes_CtaCte K, Cbtes C, Cbtes_Tipos T
				 WHERE K.Id_Trans = C.Id_Trans AND T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND (T.Compromete_Factura IN (1,-1) OR T.Compromete_Recibos IN (1,-1) )
				 AND C.Id_Estado_Cbte IN (1,2,4) 
				 AND C.Id_Estado_Cbte <> K.Id_Estado_Cbte'
IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)



/*************** Importe total diferente en ctat.cte.  **************************/

SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9003,''Importe diferente em cta.cte. '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente) ,''REPARACIÓN MANUAL DESAPLICANDO TODA LA CTA.CTE.'' 
				 FROM Cbtes C, Cbtes_Tipos T
				 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND T.Compromete_Factura IN (1,-1) 
				 AND C.Id_Estado_Cbte IN (1,2,4) 
				 AND C.Imp_Total * T.Compromete_Factura <> ISNULL((SELECT SUM(k.importe) FROM Clientes_CtaCte K WHERE K.Id_Trans = C.Id_Trans),0)'

IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)


SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9004,''Importe diferente em cta.cte. '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente) ,''REPARACIÓN MANUAL DESAPLICANDO TODA LA CTA.CTE.'' 
				 FROM Cbtes C, Cbtes_Tipos T
				 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND T.Compromete_Recibos IN (1,-1) 
				 AND C.Id_Estado_Cbte IN (1,2,4) 
				 AND C.Imp_Total * T.Compromete_Recibos * -1 <> ISNULL((SELECT SUM(k.importe) FROM Clientes_CtaCte K WHERE K.Id_Trans = C.Id_Trans),0)'
IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)


/*************** Saldos diferente en ctat.cte.  **************************/

SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9005,''Importe diferente em cta.cte. '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente) ,''REPARACIÓN MANUAL DESAPLICANDO TODA LA CTA.CTE.'' 
				 FROM Cbtes C, Cbtes_Tipos T
				 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND T.Compromete_Factura IN (1,-1) 
				 AND C.Id_Estado_Cbte IN (1,2,4) 
				 AND C.Saldo * T.Compromete_Factura <> ISNULL((SELECT SUM(k.Saldo) FROM Clientes_CtaCte K WHERE K.Id_Trans = C.Id_Trans),0)'

IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)


SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9006,''Importe diferente em cta.cte. '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente) ,''REPARACIÓN MANUAL DESAPLICANDO TODA LA CTA.CTE.'' 
				 FROM Cbtes C, Cbtes_Tipos T
				 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND T.Compromete_Recibos IN (1,-1) 
				 AND C.Id_Estado_Cbte IN (1,2,4) 
				 AND C.Saldo * T.Compromete_Recibos * -1 <> ISNULL((SELECT SUM(k.Saldo) FROM Clientes_CtaCte K WHERE K.Id_Trans = C.Id_Trans),0)'
IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)


/*************** Aplicaciones fuera del grupo familiar erroenas de id_Cliente ctat.cte.  **************************/

IF @pReparar = 'S'
BEGIN
	CREATE TABLE #Trans (Id_Trans INT)


	SET @Sql = 'INSERT INTO #Trans
				SELECT DISTINCT(X.Id_Trans) 
					 FROM Cbtes C, Cbtes_Tipos T, Cbtes_Aplica A, Cbtes X
					 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
					 AND T.Compromete_Factura IN (1) 
					 AND C.Id_Estado_Cbte IN (1,2,4)
					 AND A.Id_Trans = C.Id_Trans
					 AND A.Id_Trans_D = X.Id_Trans
					 AND a.Id_trans_d <> 0
					 AND X.Id_Estado_Cbte IN (1,2,4) 
					 ' 

	IF @Cli_Ref_CtaCte_Agrup <> 0
		SET @Sql = @Sql  +  '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
									OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
									)
								 AND  dbo.CF_Cli_Id_Cliente_Ref(C.Id_Cliente) <> dbo.CF_Cli_Id_Cliente_Ref(x.Id_Cliente) '
	ELSE
		SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) + '
								 AND C.Id_Cliente <> x.Id_Cliente'


	IF @pDebug = 1 PRINT @Sql
	EXEC(@sql)


	SET @Sql = 'UPDATE Clientes_CtaCte SET Id_cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +'
					 WHERE Id_Trans IN (SELECT Id_Trans FROM #Trans)'
	IF @pDebug = 1 PRINT @Sql
	EXEC(@sql)

	SET @Sql = 'UPDATE Cbtes SET Id_cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +'
					 WHERE Id_Trans IN (SELECT Id_Trans FROM #Trans)'
	IF @pDebug = 1 PRINT @Sql
	EXEC(@sql)

	DROP TABLE #Trans

END


SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9007,''Aplicación no corresponde al grupo '' + X.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),X.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),X.Id_Cliente) ,''REPARACIÓN AUTOMÁTICA POSIBLE'' 
				 FROM Cbtes C, Cbtes_Tipos T, Cbtes_Aplica A, Cbtes X
					 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
					 AND T.Compromete_Factura IN (1) 
					 AND C.Id_Estado_Cbte IN (1,2,4)
					 AND A.Id_Trans = C.Id_Trans
					 AND A.Id_Trans_D = X.Id_Trans
					 AND a.Id_trans_d <> 0
					 AND X.Id_Estado_Cbte IN (1,2,4) 
					 ' 

	IF @Cli_Ref_CtaCte_Agrup <> 0
		SET @Sql = @Sql  +  '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
									OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
									)
								 AND  dbo.CF_Cli_Id_Cliente_Ref(C.Id_Cliente) <> dbo.CF_Cli_Id_Cliente_Ref(x.Id_Cliente) '
	ELSE
		SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) + '
								 AND C.Id_Cliente <> x.Id_Cliente'


IF @pDebug = 1 PRINT @Sql
EXEC(@sql)


/*************** Importe Aplicado diferente al total del cbte  **************************/

SET @Sql = 'INSERT INTO #Respuesta
			SELECT 9008,''Importe aplicado diferente del total del cbte. '' + C.Id_Tipo_Cbte + '' Transacción: '' + CONVERT(VARCHAR(16),C.Id_Trans) + '' Cliente: '' + CONVERT(VARCHAR(16),C.Id_Cliente) ,''REPARACIÓN MANUAL DESAPLICANDO TODA LA CTA.CTE.'' 
				 FROM Cbtes C, Cbtes_Tipos T
				 WHERE T.Id_Tipo_Cbte = C.Id_Tipo_Cbte
				 AND T.Compromete_Factura IN (1)  
				 AND C.Id_Estado_Cbte IN (1,2,4) 
				 AND C.Imp_Total - C.Saldo <> ISNULL((SELECT SUM(a.Importe) FROM Cbtes_Aplica a, Cbtes X
									WHERE a.Id_Trans = C.Id_Trans
									AND a.Id_trans_d = X.Id_Trans
									AND a.Id_trans_d <> 0
								    AND X.Id_Estado_Cbte IN (1,2,4) 
									),0)'
IF @Cli_Ref_CtaCte_Agrup <> 0
	SET @Sql = @Sql  + '	 AND (C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +' 
						OR C.Id_Cliente IN (SELECT Id_Cliente FROM Clientes WHERE Id_Cliente_Ref = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit) +') 
						)'
ELSE
	SET @Sql = @Sql  + '	 AND C.Id_Cliente = ' + CONVERT(VARCHAR(16),@Id_Cliente_Tit)
IF @pDebug = 1 PRINT @Sql
EXEC(@sql)

SELECT * FROM #Respuesta
DROP TABLE #Respuesta