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

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

/*Variables recibidas por parametro a traves del JSON*/
DECLARE @pModoDebug			    	TINYINT
DECLARE @pId_Usuario			    SMALLINT
DECLARE @pId_Plan_Cta			    INT
DECLARE @pId_Centro_Costo			CHAR(10)
DECLARE @pPeriodo_Desde			    DATETIME
DECLARE @pPeriodo_Hasta			    DATETIME
DECLARE @pSoloResultado	    		TINYINT
DECLARE @pIncluirCCNoDef	    	TINYINT
DECLARE @pId_Unid_Negocio			CHAR(10)
DECLARE @pFlag_FiltrarId_CC			TINYINT			--10/05/2021

SET @pModoDebug					= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'ModoDebug')), 0)
SET @pId_Usuario				= ISNULL(CONVERT(SMALLINT, dbo.CF_JSON_VALUE(@pJson,'Id_Usuario')), 0)
SET @pId_Plan_Cta				= ISNULL(CONVERT(INT, dbo.CF_JSON_VALUE(@pJson,'Id_Plan_Cta')), 0)
SET @pId_Centro_Costo			= ISNULL(CONVERT(CHAR(10), dbo.CF_JSON_VALUE(@pJson,'Id_Centro_Costo')), 0)
SET @pPeriodo_Desde				= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Periodo_Desde')), '19000101')
SET @pPeriodo_Hasta				= ISNULL(CONVERT(DATETIME, dbo.CF_JSON_VALUE(@pJson,'Periodo_Hasta')), '19000101')
SET @pIncluirCCNoDef			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'IncluirCCNoDef')), 0)
SET @pSoloResultado				= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'SoloResultado')), 0)
SET @pId_Unid_Negocio			= ISNULL(CONVERT(CHAR(10), dbo.CF_JSON_VALUE(@pJson,'Id_Unid_Negocio')), '')
SET @pFlag_FiltrarId_CC			= ISNULL(CONVERT(TINYINT, dbo.CF_JSON_VALUE(@pJson,'Flag_FiltrarId_CC')), 0)
/*FIN Variables recibidas por parametro a traves del JSON*/

/*Variables Locales*/
DECLARE @SqlStr						NVARCHAR(MAX)
DECLARE @Cta_Cont_Saldo				DECIMAL(16,2)
DECLARE @Mes_Desde					DATETIME
DECLARE @Mes_Hasta					DATETIME
DECLARE @Mes_Nro					TINYINT
DECLARE @Alias						DECIMAL(12,0)
DECLARE @Id_Centro_Costo			CHAR(10)
DECLARE @Flag_Unid_Neg				TINYINT
/*FIN Variables Locales*/
IF RTRIM(LTRIM(@pId_Unid_Negocio)) = ''
	SET @Flag_Unid_Neg = 0
ELSE
	SET @Flag_Unid_Neg = 1

SET @pId_Centro_Costo = RTRIM(LTRIM(@pId_Centro_Costo))

BEGIN TRY
	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Ingreso a Stored Procedure: CPJ_BalanceSaldoMesCentro_Rpt'
		PRINT 'Parametros: '
		PRINT '@pId_Usuario: ' + CONVERT(VARCHAR(10), @pId_Usuario) + '. @pId_Plan_Cta: ' + CONVERT(VARCHAR(10), @pId_Plan_Cta) + '. @pPeriodo_Desde: ' + CONVERT(VARCHAR(10), @pPeriodo_Desde, 112) + '. @pPeriodo_Hasta: ' + CONVERT(VARCHAR(10), @pPeriodo_Hasta, 112) + '. @pIncluirCCNoDef: ' + CONVERT(VARCHAR(10), @pIncluirCCNoDef) +'. @pId_Unid_Negocio: ' + @pId_Unid_Negocio
		PRINT '@pFlag_FiltrarId_CC: ' + CONVERT(VARCHAR(10), @pFlag_FiltrarId_CC)
	END

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

	SET @pPeriodo_Desde = dbo.CF_FOMONTH(@pPeriodo_Desde)
	SET @pPeriodo_Hasta	= dbo.CF_EOMONTH(@pPeriodo_Hasta)

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Verificacion Periodos Completos. @pPeriodo_Desde: ' + CONVERT(VARCHAR(10), @pPeriodo_Desde, 112) + '. @pPeriodo_Hasta: ' + CONVERT(VARCHAR(10), @pPeriodo_Hasta, 112)
	END

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

	IF(@pId_Usuario = 0)
	BEGIN
		SET @pId_Usuario = -1
	END

	IF(@pId_Plan_Cta = 0)										RAISERROR ('Id_Plan_Cta can not be zero.', 16,  1) 
	IF(@pPeriodo_Desde = '19000101')							RAISERROR ('Periodo_Desde can not be blank.', 16,  1)
	IF(@pPeriodo_Hasta = '19000101')							RAISERROR ('Periodo_Hasta can not be blank.', 16,  1) 
	IF(@pPeriodo_Desde >= @pPeriodo_Hasta)						RAISERROR ('Periodo_Desde can not be bigger or equal than Periodo_Hasta.', 16,  1) 
	IF(DATEDIFF(YEAR, @pPeriodo_Desde, @pPeriodo_Hasta) > 0)	RAISERROR ('Diference between Periodo_Desde and Periodo_Hasta can not be bigger than a year.', 16,  1) 	
	IF(@pFlag_FiltrarId_CC <> 0)
	BEGIN
		IF(@pId_Centro_Costo = '')									RAISERROR ('Id_Centro_Costo can not be blank.', 16,  1)
	END

	/*=============================================================================================================================*/
	
	CREATE TABLE #Rpt_Balance_Saldo_x_Mes_CC_Meses
	(Mes			TINYINT,
	Desde			DATETIME,
	Hasta			DATETIME)

	SET @Mes_Nro = DATEPART(mm,@pPeriodo_Desde)
	SET @Mes_Desde = dbo.CF_FOMONTH(@pPeriodo_Desde)
	SET @Mes_Hasta = dbo.CF_EOMONTH(@pPeriodo_Desde)

	WHILE @Mes_Hasta <= @pPeriodo_Hasta
	BEGIN
		IF(@pModoDebug = 1)
		BEGIN
			PRINT '@Mes_Nro: ' + CONVERT(VARCHAR(10), @Mes_Nro) + '. @Mes_Desde: ' + CONVERT(VARCHAR(10), @Mes_Desde, 112) + '. @Mes_Hasta: ' + CONVERT(VARCHAR(10), @Mes_Hasta, 112)
		END

		INSERT INTO #Rpt_Balance_Saldo_x_Mes_CC_Meses (Mes,	Desde,	Hasta)
				VALUES 	(@Mes_Nro, @Mes_Desde, @Mes_Hasta)

		SET @Mes_Nro = @Mes_Nro + 1
		SET @Mes_Desde = DATEADD(MONTH, 1, @Mes_Desde)
		SET @Mes_Hasta = dbo.CF_EOMONTH(@Mes_Desde)	
	END

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

	CREATE TABLE #Rpt_Balance_Saldo_x_Mes_CC
	(Nro_Cta_Contable				VARCHAR(20),
	Alias							DECIMAL(12,0),
	Cta_Contable					VARCHAR(80),
	Id_Centro_Costo					CHAR(10),
	Centro_Costo					VARCHAR(200),
	Mes_01							DECIMAL(16,2),
	Mes_02							DECIMAL(16,2),
	Mes_03							DECIMAL(16,2),
	Mes_04							DECIMAL(16,2),
	Mes_05							DECIMAL(16,2),
	Mes_06							DECIMAL(16,2),
	Mes_07							DECIMAL(16,2),
	Mes_08							DECIMAL(16,2),
	Mes_09							DECIMAL(16,2),
	Mes_10							DECIMAL(16,2),
	Mes_11							DECIMAL(16,2),
	Mes_12							DECIMAL(16,2),
	Total							DECIMAL(16,2))

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

	SET @SqlStr =	'INSERT INTO #Rpt_Balance_Saldo_x_Mes_CC (Nro_Cta_Contable, Alias, Cta_Contable, Id_Centro_Costo, Centro_Costo) '

	SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) + 
		'SELECT DISTINCT PCCC.Nro_Cta_Contable, PCCC.Alias, PCCC.Descripcion, CC.Id_Centro_Costo, CC.Descripcion ' + CHAR(13) +
		'FROM Cbtes_Ctas_Contables CCC, Pla_Ctas_Cuentas_Contables PCCC, Centro_Costos CC ' + CHAR(13) +
		'WHERE ' + CHAR(13) +
		'CCC.Id_Cta_Contable = PCCC.Id_Cta_Contable ' + CHAR(13) +
		'AND ISNULL(CCC.Id_Centro_Costo, '''') = CC.Id_Centro_Costo ' + CHAR(13) +
		'AND PCCC.Id_Plan_Cta = ' + CONVERT(VARCHAR(10), @pId_Plan_Cta) + ' '

	IF(@pIncluirCCNoDef = 0)
		SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
						'AND ISNULL(CCC.Id_Centro_Costo, '''') <> '''' '

	IF(@pFlag_FiltrarId_CC <> 0)
		SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
					'AND ISNULL(CCC.Id_Centro_Costo, '''') = '''+  @pId_Centro_Costo    +''' '

	IF(@pSoloResultado = 1)
		SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
					'AND ISNULL(PCCC.Tipo, '''') IN (''+'',''-'') '
	SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) + 
		'UNION ' + CHAR(13) +
		'SELECT DISTINCT PCCC.Nro_Cta_Contable, PCCC.Alias, PCCC.Descripcion, CC.Id_Centro_Costo, CC.Descripcion ' + CHAR(13) +
		'FROM Asientos_Items CCC, Pla_Ctas_Cuentas_Contables PCCC, Centro_Costos CC ' + CHAR(13) +
		'WHERE ' + CHAR(13) +
		'CCC.Id_Cta_Contable = PCCC.Id_Cta_Contable ' + CHAR(13) +
		'AND ISNULL(CCC.Id_Centro_Costo, '''') = CC.Id_Centro_Costo ' + CHAR(13) +
		'AND PCCC.Id_Plan_Cta = ' + CONVERT(VARCHAR(10), @pId_Plan_Cta) + ' '

	IF(@pIncluirCCNoDef = 0)
		SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
						'AND ISNULL(CCC.Id_Centro_Costo, '''') <> '''' '

	IF(@pFlag_FiltrarId_CC <> 0)
		SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
					'AND ISNULL(CCC.Id_Centro_Costo, '''') = '''+  @pId_Centro_Costo    +''' '

	IF(@pSoloResultado = 1)
		SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
					'AND ISNULL(PCCC.Tipo, '''') IN (''+'',''-'') '
    SET @SqlStr =	RTRIM(LTRIM(@SqlStr)) + CHAR(13) +
					'ORDER BY PCCC.Nro_Cta_Contable, CC.Descripcion'
					
	IF(@pModoDebug = 1)
	BEGIN
		PRINT ''
		PRINT '@SqlStr: '
		PRINT @SqlStr
		PRINT ''
	END

	EXECUTE sp_executesql @SqlStr

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

	UPDATE #Rpt_Balance_Saldo_x_Mes_CC 
	SET 
	Mes_01 = 0,
	Mes_02 = 0,
	Mes_03 = 0,
	Mes_04 = 0,
	Mes_05 = 0,
	Mes_06 = 0,
	Mes_07 = 0,
	Mes_08 = 0,
	Mes_09 = 0,
	Mes_10 = 0,
	Mes_11 = 0,
	Mes_12 = 0,
	Total = 0

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

	DECLARE curCPJ_BalanceSaldoMesCentro_Rpt CURSOR FOR
	SELECT 
	Alias, 
	Id_Centro_Costo 
	FROM #Rpt_Balance_Saldo_x_Mes_CC

	OPEN curCPJ_BalanceSaldoMesCentro_Rpt
	FETCH NEXT FROM curCPJ_BalanceSaldoMesCentro_Rpt INTO @Alias, @Id_Centro_Costo
	WHILE @@FETCH_STATUS = 0
	BEGIN

		--Recorro todos los meses
		DECLARE curCPJ_BalanceSaldoMesCentro_Rpt_Meses CURSOR FOR
						SELECT Mes, Desde, Hasta 
						FROM #Rpt_Balance_Saldo_x_Mes_CC_Meses
						ORDER BY Mes

		OPEN curCPJ_BalanceSaldoMesCentro_Rpt_Meses
		FETCH NEXT FROM curCPJ_BalanceSaldoMesCentro_Rpt_Meses INTO @Mes_Nro, @Mes_Desde, @Mes_Hasta
		WHILE @@FETCH_STATUS = 0
		BEGIN

			SET @Cta_Cont_Saldo = dbo.CF_Cta_Cont_Saldo (@Mes_Desde, 
														@Mes_Hasta, 
														@Alias, 
														@pId_Plan_Cta, 
														0/*@Flag_Inc_SA*/, 
														1 /*@Flag_CentroCosto*/,
														@Id_Centro_Costo,
														0/*@Flag_CentroCosto_Recur*/,
														@Flag_Unid_Neg,
														@pId_Unid_Negocio,
														0/*@Flag_SoloAsientos*/)

			IF(@pModoDebug = 1)
			BEGIN
				PRINT '@Alias: ' + CONVERT(VARCHAR(10), @Alias) + '. @Centro_Costo: ' + LTRIM(RTRIM(CONVERT(VARCHAR(10), @Id_Centro_Costo))) + '. @pId_Plan_Cta: ' + CONVERT(VARCHAR(10), @pId_Plan_Cta) + '. @pId_Unid_Negocio: ' + LTRIM(RTRIM(CONVERT(VARCHAR(10), @pId_Unid_Negocio))) + '. @Mes_Nro: ' + CONVERT(VARCHAR(10), @Mes_Nro) + ' (@Mes_Desde: ' + CONVERT(VARCHAR(10), @Mes_Desde, 112) + ' - @Mes_Hasta: ' + CONVERT(VARCHAR(10), @Mes_Hasta, 112) + ') @Cta_Cont_Saldo: ' + CONVERT(VARCHAR(20), @Cta_Cont_Saldo)
			END

			IF(@Mes_Nro = 1)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_01 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo				
			END

			IF(@Mes_Nro = 2)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_02 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 3)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_03 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 4)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_04 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 5)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_05 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 6)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_06 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 7)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_07 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 8)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_08 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 9)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_09 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 10)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_10 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 11)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_11 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			IF(@Mes_Nro = 12)
			BEGIN
				UPDATE #Rpt_Balance_Saldo_x_Mes_CC SET Mes_12 = @Cta_Cont_Saldo WHERE Alias = @Alias AND Id_Centro_Costo = @Id_Centro_Costo
			END

			FETCH NEXT FROM curCPJ_BalanceSaldoMesCentro_Rpt_Meses INTO @Mes_Nro, @Mes_Desde, @Mes_Hasta
		END
		CLOSE curCPJ_BalanceSaldoMesCentro_Rpt_Meses
		DEALLOCATE curCPJ_BalanceSaldoMesCentro_Rpt_Meses	

		FETCH NEXT FROM curCPJ_BalanceSaldoMesCentro_Rpt INTO @Alias, @Id_Centro_Costo
	END
	CLOSE curCPJ_BalanceSaldoMesCentro_Rpt
	DEALLOCATE curCPJ_BalanceSaldoMesCentro_Rpt
	
	/*=============================================================================================================================*/
	
	UPDATE #Rpt_Balance_Saldo_x_Mes_CC 
	SET
	Total = Mes_01 + Mes_02 + Mes_03 + Mes_04 + Mes_05 + Mes_06 + Mes_07 + Mes_08 + Mes_09 + Mes_10 + Mes_11 + Mes_12



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

	SELECT * FROM #Rpt_Balance_Saldo_x_Mes_CC 
		WHERE	Mes_01 <> 0 OR Mes_02 <> 0 OR Mes_03 <> 0 OR Mes_04 <> 0 OR Mes_05 <> 0 OR Mes_06 <> 0 OR
				Mes_07 <> 0 OR Mes_08 <> 0 OR Mes_09 <> 0 OR Mes_10 <> 0 OR Mes_11 <> 0 OR Mes_12 <> 0
	
	/*=============================================================================================================================*/

	DROP TABLE #Rpt_Balance_Saldo_x_Mes_CC
	DROP TABLE #Rpt_Balance_Saldo_x_Mes_CC_Meses
	
	/*=============================================================================================================================*/

	IF(@pModoDebug = 1)
	BEGIN
		PRINT 'Fin Stored Procedure: CPJ_BalanceSaldoMesCentro_Rpt'
	END
END TRY  


BEGIN CATCH  
    EXECUTE usp_GetErrorInfo

	RETURN 9999
END CATCH

RETURN 0

/*
EXEC dbo.CPJ_BalanceSaldoMesCentro_Rpt '{"ModoDebug":"1",
										"Id_Usuario":"-1",
										"Id_Plan_Cta":"1",
										"Id_Centro_Costo":"14",
										"Periodo_Desde":"20210101",
										"Periodo_Hasta":"20211231",
										"IncluirCCNoDef":"1",
										"Id_Unid_Negocio":"",
										"Flag_FiltrarId_CC":"0"
										}'
*/
