
/****** Object:  StoredProcedure [dbo].[DSS_ACC_EstadoResultados]    Script Date: 09/23/2012 11:05:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
===========================================================
-- Autor:       Francis Antonio Bolaños Arias
-- Fecha:       23/09/2012 11:05:20
-- Descripción: Procedimiento que obtiene la información
--              para generar el informe de Estado de
--              Resultados para DSS
-- ========================================================
*/
DROP PROCEDURE [dbo].[DSS_ACC_BalanceComprob]
GO

CREATE PROCEDURE [dbo].[DSS_ACC_BalanceComprob]
(
    @Modo         INT, -- 2 - Totalizado, 1 - Resumido (Estructural), 0 - Detallado (Plan)
    @Filtro       INT, -- 0 - Ingresos, 1 - Costos, 2 - Gastos  
    @id_ejer      INT, 
    @id_peri      INT, 
    @id_empr      INT,
    @id_mone      INT,
    @Tasa         NUMERIC(13, 8)
)
AS
BEGIN 

	DECLARE @Orden INT, @TipoCuenta INT
	
	SELECT @Orden = orden
	FROM   CONTPERI
	WHERE  id_peri = @id_peri
	
	SET @Tasa = (1 / CASE @Tasa WHEN 0 THEN 1 ELSE @Tasa END)
	
	SELECT @TipoCuenta = CASE @Filtro
						 WHEN 0 THEN 1 -- Ingresos
						 WHEN 1 THEN 2 -- Costos
						 WHEN 2 THEN 3 -- Gastos
						 ELSE 3
						 END
						 
	--SELECT @Tasa = (SELECT tasa FROM SICLAMON WHERE refer_mone = 1)
	
	-- Consulta modificada del procedimiento b_comprob para evitar valores duplicados
	
	CREATE TABLE #BalCom
	(
		cuenta      VARCHAR(255),
		cto_gto     VARCHAR(255),
		tit_cta     VARCHAR(255),
		sal_ini     NUMERIC(21, 6), --v2.0.80: Éstos deben ser NUMERIC(21, 6), no (18, 2)
		debe        NUMERIC(21, 6),
		haber       NUMERIC(21, 6),
		id_estr     INT,
		cuenta_estr VARCHAR(255),
		tit_ctaest  VARCHAR(255),
		id_tcta     INT,
		deudora     BIT,
		periodo     VARCHAR(255),
		orden       INT
	)
	
	IF @id_peri > 0
	BEGIN
	
		INSERT INTO #BalCom
		SELECT cuenta, 
			   cto_gto  = COALESCE(cto_gto,  SPACE(1)), 
			   tit_cta,
			   --tit_ctgt = COALESCE(tit_ctgt, SPACE(1)),
			   sal_ini  = CONVERT(NUMERIC(21, 6), SUM(CASE WHEN sa.id_peri != @id_peri
														   THEN debe - haber 
														   ELSE 0 
														   END * @Tasa)),
			   debe     = CONVERT(NUMERIC(21, 6), SUM(CASE WHEN sa.id_peri =  @id_peri
														   THEN debe 
														   ELSE 0 
														   END * @Tasa)),
			   haber    = CONVERT(NUMERIC(21, 6), SUM(CASE WHEN sa.id_peri =  @id_peri 
														   THEN haber 
														   ELSE 0 
														   END * @Tasa)),
			   MAX(es.id_estr) AS id_estr,
			   MAX(es.cuenta_est) AS cuenta_est,
			   MAX(es.tit_ctaest) AS tit_ctaest,
			   MAX(tc.id_tcta) AS id_tcta,
			   pl.deudora,
			   NULL periodo,
			   @orden
		FROM       CONTSALD sa
		INNER JOIN CONTPLAN pl ON sa.id_cuenta = pl.id_cuenta
		LEFT  JOIN CONTCTGT cg ON pl.id_ctgt   = cg.id_ctgt
		INNER JOIN CONTPERI pe ON sa.id_peri   = pe.id_peri
		INNER JOIN CONTESTR es ON pl.id_estr   = es.id_estr
		INNER JOIN CONTTCTA tc ON es.id_tcta   = tc.id_tcta
		INNER JOIN CONTEMPR em ON pl.id_empr   = em.id_empr
		INNER JOIN SICLAMON mo ON em.id_mone   = mo.id_mone
		WHERE    sa.id_ejer  = @id_ejer
			AND  em.id_empr  = @id_empr
			AND  pe.orden   <= @Orden -- + @Cade1 + @Cade_tcta + @cade_cto
		GROUP BY cuenta, cto_gto, tit_cta, tit_ctgt, pl.deudora, pe.titulo, pe.orden
		ORDER BY cuenta, cto_gto --, tit_cta
    
    END
    ELSE
    BEGIN
    
			DECLARE @id_peri_ini INT = (SELECT id_peri FROM CONTPERI WHERE orden = 0 AND id_ejer = @id_ejer)
    
			INSERT INTO #BalCom
			SELECT cuenta, 
				   cto_gto  = COALESCE(cto_gto,  SPACE(1)), 
				   tit_cta,
				   --tit_ctgt = COALESCE(tit_ctgt, SPACE(1)),
				   sal_ini  = CONVERT(NUMERIC(21, 6), SUM(CASE WHEN sa.id_peri != @id_peri_ini
															   THEN debe - haber 
															   ELSE 0 
															   END * @Tasa)),
				   debe     = CONVERT(NUMERIC(21, 6), SUM(CASE WHEN sa.id_peri =  @id_peri_ini
															   THEN debe 
															   ELSE 0 
															   END * @Tasa)),
				   haber    = CONVERT(NUMERIC(21, 6), SUM(CASE WHEN sa.id_peri =  @id_peri_ini 
															   THEN haber 
															   ELSE 0 
															   END * @Tasa)),
				   MAX(es.id_estr) AS id_estr,
				   MAX(es.cuenta_est) AS cuenta_est,
				   MAX(es.tit_ctaest) AS tit_ctaest,
				   MAX(tc.id_tcta) AS id_tcta,
				   pl.deudora,
				   pe.titulo periodo,
				   pe.orden
			FROM       CONTSALD sa
			INNER JOIN CONTPLAN pl ON sa.id_cuenta = pl.id_cuenta
			LEFT  JOIN CONTCTGT cg ON pl.id_ctgt   = cg.id_ctgt
			INNER JOIN CONTPERI pe ON sa.id_peri   = pe.id_peri
			INNER JOIN CONTESTR es ON pl.id_estr   = es.id_estr
			INNER JOIN CONTTCTA tc ON es.id_tcta   = tc.id_tcta
			INNER JOIN CONTEMPR em ON pl.id_empr   = em.id_empr
			INNER JOIN SICLAMON mo ON em.id_mone   = mo.id_mone
			WHERE    sa.id_ejer  = @id_ejer
				AND  em.id_empr  = @id_empr
			GROUP BY cuenta, cto_gto, tit_cta, tit_ctgt, pl.deudora, pe.titulo, pe.orden
			ORDER BY cuenta, cto_gto
    
    END
	
	-- Se obtienen valores especiales
	
	DECLARE @Ejercicio   INT          = (SELECT ejercicio FROM CONTEJER WHERE id_ejer = @id_ejer)
	DECLARE @Periodo     VARCHAR(100) = (SELECT titulo    FROM CONTPERI WHERE id_peri = @id_peri)
	DECLARE @TitEmpresa  VARCHAR(100) = (SELECT tit_emp   FROM CONTEMPR WHERE id_empr = @id_empr)
	DECLARE @co_maydig   INT          = (SELECT co_maydig FROM CONTTABL WHERE id_tabl = 1)
	DECLARE @Moneda      VARCHAR(100) = (SELECT desc_mone FROM SICLAMON WHERE id_mone = @id_mone)
	
	UPDATE #BalCom 
	SET    periodo = @Periodo 
	WHERE  periodo IS NULL
	
	--SELECT * FROM #BalCom

	IF @Modo = 0
	BEGIN
	
		SELECT bc.cuenta,
		       LTRIM(RTRIM(bc.cto_gto)) cto_gto,
			   LTRIM(RTRIM(bc.tit_cta)) tit_cta,
			   --LTRIM(RTRIM(MAX(es.cuenta_est))) AS cuenta_may,
			   --LTRIM(RTRIM(MAX(es.tit_ctaest))) AS tit_ctamay,
			   LTRIM(RTRIM(es.cuenta_est)) AS cuenta_may,
			   LTRIM(RTRIM(es.tit_ctaest)) AS tit_ctamay,
		       bc.sal_ini,
		       bc.debe,
			   bc.haber,
			   @Ejercicio     AS Ejercicio,
			   bc.periodo     AS Periodo,
			   @TitEmpresa    AS TitEmpresa,
			   @Moneda        AS Moneda,
			   1              AS Sumar,
			   bc.deudora AS Deudora,
			   orden
		FROM        #BalCom  bc
		INNER JOIN  CONTESTR es ON SUBSTRING(bc.cuenta, 1, @co_maydig) = es.cuenta_est
		--GROUP BY cuenta, cto_gto, tit_cta, 
		--         sal_ini, debe, haber, bc.deudora, 
		--         periodo, orden --v2.0.80: Esta agrupación parace ser el causante del error con los montos
		ORDER BY bc.cuenta ASC
	
	END
	ELSE
	BEGIN
		
		RETURN
		
	END

	RETURN

END
