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

CREATE PROCEDURE [dbo].[CP_Asientos_Control] @fdesde DATETIME, @fhasta DATETIME
AS

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

-- Control de Alias Duplicados ------------------------------------------------------------------------------- AGREGAR FILTRO FECHA
SET @Accion = 'Debe modificar en el plan de cuentas el alias '
SET @Accion = @Accion + 'indicando el proximo numero disponible de alias'

INSERT INTO #Respuesta
	SELECT 1001 AS Validacion, 
			'Alias Nro.: ' + RTRIM(CONVERT(VARCHAR(15),Alias)) + 
			' de Cuenta Contable Duplicado, Plan de Cuentas: ' + RTRIM(CONVERT(VARCHAR(15),Id_Plan_Cta)) AS Mensaje, 
			@Accion AS Accion
	FROM (SELECT Id_Plan_Cta, Alias, COUNT(*) AS Cantidad FROM Pla_Ctas_Cuentas_Contables 
			GROUP BY Id_Plan_Cta, Alias
			HAVING COUNT(*) > 1) aux1 

-- Control de Alias Diferentes con Plan de Cuentas ----------------------------------------------------------- AGREGAR FILTRO FECHA
INSERT INTO #Respuesta
	SELECT 1002 AS Validacion, 
		   'El Alias Nro.: ' + RTRIM(CONVERT(VARCHAR(15),Id_Alias_Cta_Cont)) + 
		   ' de la cuenta contable: ' + RTRIM(CONVERT(VARCHAR(15),Id_Cta_Contable)) + 
		   ' No equivale a su Alias: ' + RTRIM(CONVERT(VARCHAR(15),p_alias)) AS Mensaje,
		   'Se debe corregir el asiento contable Nro. ' + RTRIM(CONVERT(VARCHAR(15),Id_Asiento)) + ' Item: ' + RTRIM(CONVERT(VARCHAR(15),Item)) AS Accion
	FROM (SELECT I.*, P.Alias AS p_alias
			FROM Asientos_Items I, Pla_Ctas_Cuentas_Contables P
			WHERE I.Id_Cta_Contable = P.Id_Cta_Contable
				AND I.Id_Alias_Cta_Cont <> P.Alias) aux1

-- Control de Cuentas de Otro Ejercicio ------------------------------------------------------------------------ AGREGAR FILTRO FECHA
INSERT INTO #Respuesta
	SELECT 1003 AS Validacion,
		   'La cuenta contable: ' + RTRIM(CONVERT(VARCHAR(15),Id_Cta_Contable)) +
		   ' no pertenece al plan de cuentas, La Cuenta del Periodo es: ' + RTRIM(CONVERT(VARCHAR(15),cuenta_cont_valida)) AS Mensaje,
		   'Se debe corregir el asiento contable Nro. ' + RTRIM(CONVERT(VARCHAR(15),Id_Asiento)) + ' Item: ' + RTRIM(CONVERT(VARCHAR(15),Item)) AS Accion
	FROM  (SELECT I.*, dbo.CF_Cta_Cont(I.Id_Alias_Cta_Cont,a.Fecha) AS cuenta_cont_valida
			 FROM Asientos_Items I, Asientos A, Pla_Ctas_Cuentas_Contables P, Plan_Ctas PC, Plan_Ctas_Ejercicios PE
			 WHERE I.Id_Cta_Contable = P.Id_Cta_Contable
				 AND A.Id_Asiento = I.Id_Asiento
				 AND P.Id_Plan_Cta = PC.Id_Plan_Cta
				 AND PC.Id_Ejercicio = PE.Id_Ejercicio
				 AND (A.Fecha < PE.Fecha_Inicio or A.Fecha >= PE.Fecha_Cierre + 1)) aux1

-- Control de Id_Cta_Contable Unido con Alias ------------------------------------------------------------------ AGREGAR FILTRO FECHA
INSERT INTO #Respuesta
	SELECT 1005 AS Validacion,
		   'La cuenta contable: ' + RTRIM(CONVERT(VARCHAR(15),Id_Cta_Contable)) +
		   ' no se corresponde con su alias en el plan de cuentas, Asiento: ' + RTRIM(CONVERT(VARCHAR(15),Id_Asiento)) +
		   ' Item: ' + RTRIM(CONVERT(VARCHAR(15),Item)) AS Mensaje,
		   'Se debe corregir el asiento contable Nro. ' + RTRIM(CONVERT(VARCHAR(15),Id_Asiento)) + ' Item: '+ RTRIM(CONVERT(VARCHAR(15),Item)) AS Accion
	FROM (SELECT I.*
			FROM Asientos_Items I, Asientos A, Pla_Ctas_Cuentas_Contables P, Plan_Ctas PC, Plan_Ctas_Ejercicios PE
			WHERE A.Id_Asiento = I.Id_Asiento
				 AND P.Id_Plan_Cta = PC.Id_Plan_Cta
				 AND PC.Id_Ejercicio = PE.Id_Ejercicio
				 AND P.Id_Plan_Cta = A.Id_Plan_Cta
				 AND P.Alias = I.Id_Alias_Cta_Cont
				 AND I.Id_Cta_Contable <> P.Id_Cta_Contable) aux1

-- Control de Asientos Resumenes
INSERT INTO #Respuesta
	SELECT 1006 AS Validacion,
		   'El Asiento Nro.' + RTRIM(CONVERT(VARCHAR(15),Id_Asiento)) + ' - ' + RTRIM(CONVERT(varchar(15),Descripcion))+
		   ' de Fecha ' + RTRIM(CONVERT(VARCHAR(15),CONVERT(DATE,Fecha))) +
		   ' Presenta Diferencia de ' + RTRIM(CONVERT(VARCHAR(15),Dif_Debe_Control)) + ' en su asiento resumen ' AS Mensaje,
		   'Se debe Generar el Asiento Resumen ' AS Accion
	FROM (SELECT A.Id_Asiento, A.Fecha, A.Descripcion, A.Importe, O.debe AS Total_Debe_Control, A.Importe - O.debe AS Dif_Debe_Control,
				 O.haber AS Total_Haber_Control, A.Importe - O.Haber AS Dif_Haber_Control  
			FROM Asientos A, (select C.Id_Asiento, SUM(DEBE) AS debe, SUM(HABER) AS haber 
								FROM Cbtes_Ctas_Contables O, cbtes C 
								WHERE C.Id_Trans = O.Id_Trans
									AND C.Id_Estado_Cbte NOT IN (0,3) 
									AND C.Periodo_Iva >= @fdesde
									AND C.Periodo_Iva < @fhasta + 1
								GROUP BY C.Id_Asiento) O
			WHERE O.Id_Asiento = A.Id_Asiento) aux1 
	WHERE Dif_Debe_Control <> 0 OR Dif_Haber_Control <> 0

-- Control de Centro de Costos en NULO
DECLARE @CCNull INT
SET @CCNull = ISNULL((SELECT COUNT(*) FROM  Asientos_Items I, Asientos A 
						WHERE I.id_Asiento = A.id_Asiento 
						AND A.Fecha >= @fdesde 
						AND A.Fecha < @fhasta + 1
						AND I.Id_Centro_Costo IS NULL),0)
IF @CCNull > 0
BEGIN
	UPDATE Asientos_Items SET Id_Centro_Costo = '' FROM Asientos_Items I, Asientos A WHERE I.id_Asiento = A.id_Asiento AND A.Fecha >= @fdesde AND A.Fecha < @fhasta + 1 AND I.Id_Centro_Costo IS NULL
	INSERT INTO #Respuesta VALUES (1007,'Cantidad de Asientos_Items con Id_Centro_Costos en NULO: ' + CAST(@CCNull AS VARCHAR(10)),'Corregido')
END

-- Control de Cuentas Imputables como Cuentas Padres
INSERT INTO #Respuesta
SELECT 1008, 
	   'La cuenta contable: ' + RTRIM(CONVERT(VARCHAR(15),P.Id_Cta_Contable)) + ' ('+ RTRIM(P.Descripcion) +') del ejercicio ' + RTRIM(E.Descripcion) 
	   + ' esta configurada como cuenta imputable y es cuenta padre' AS Mensaje,
	   'Se debe configurar la misma como no imputable y corregir los asientos con esta cuenta' AS Accion
FROM Pla_Ctas_Cuentas_Contables P
	JOIN Plan_Ctas PC ON P.Id_Plan_Cta = PC.Id_Plan_Cta
	JOIN Plan_Ctas_Ejercicios E ON PC.Id_Ejercicio = E.Id_Ejercicio
WHERE P.Imputable = 1
	AND @fdesde BETWEEN E.Fecha_Inicio AND E.Fecha_Cierre
	AND @fhasta BETWEEN E.Fecha_Inicio AND E.Fecha_Cierre
	AND P.Alias IN (SELECT Id_Cuenta_Padre 
						FROM Pla_Ctas_Cuentas_Contables B 
						WHERE B.Id_Plan_Cta = P.Id_Plan_Cta)

-- Control de Cuentas Padres no Imputables con Asientos Imputados
INSERT INTO #Respuesta
SELECT 1009, 
	   'La cuenta contable: ' + RTRIM(CONVERT(VARCHAR(15),P.Id_Cta_Contable)) + ' ('+ RTRIM(P.Descripcion) +') del ejercicio ' + RTRIM(E.Descripcion) 
	   + ' esta configurada como cuenta no imputable y tiene asientos imputados' AS Mensaje,
	   'Se debe corregir el asiento codigo ' + RTRIM(CONVERT(VARCHAR(15),A.Id_Asiento)) + ' ('+ RTRIM(A.Descripcion) +') del ejercicio ' + RTRIM(E.Descripcion) AS Accion
FROM Pla_Ctas_Cuentas_Contables P
	JOIN Plan_Ctas PC ON P.Id_Plan_Cta = PC.Id_Plan_Cta
	JOIN Plan_Ctas_Ejercicios E ON PC.Id_Ejercicio = E.Id_Ejercicio
	JOIN Asientos A ON P.Id_Plan_Cta = PC.Id_Plan_Cta
	JOIN Asientos_Items I ON A.Id_Asiento = I.Id_Asiento AND P.Id_Cta_Contable = I.Id_Cta_Contable
WHERE P.Imputable = 0
	AND @fdesde BETWEEN E.Fecha_Inicio AND E.Fecha_Cierre
	AND @fhasta BETWEEN E.Fecha_Inicio AND E.Fecha_Cierre
	AND P.Alias IN (SELECT Id_Cuenta_Padre 
						FROM Pla_Ctas_Cuentas_Contables B 
						WHERE B.Id_Plan_Cta = P.Id_Plan_Cta)


SELECT * FROM #Respuesta
DROP TABLE #Respuesta


