ALTER PROCEDURE [dbo].[sp_invCentralizacion]
(
	@fecini DATE,
	@fecfin DATE,
	@coddoc INT = 0,
	@porunineg INT = 0,
	@tipoctaexistencia INT = 0,
	@codbod INT = 0
)	
AS
DECLARE @ctaexistenciaparametro INT
SELECT @ctaexistenciaparametro = ctaexistencia FROM invParametros

IF  @coddoc = 2 or @coddoc = 4    ----------------------------------------------------------------
	BEGIN
		IF @tipoctaexistencia = 0
			BEGIN
				SELECT  CASE @porunineg 
						WHEN 0 THEN invFamilia.ctacontable 
						ELSE conUnidadNegocio.ctacontable END AS cuenta, 
						CAST(CASE invEncabezado.coddoc WHEN 2 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS debe, 
						CAST(CASE invEncabezado.coddoc WHEN 4 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS haber,
						invEncabezado.codcen AS uni_negocio,
						invEncabezado.item

				FROM    invArticulos LEFT OUTER JOIN
						invFamilia ON invArticulos.codfam = invFamilia.codfam RIGHT OUTER JOIN
						invEncabezado INNER JOIN
						invDetalle ON invEncabezado.coddoc = invDetalle.coddoc
						AND invEncabezado.numinv = invDetalle.numinv ON 
						invArticulos.codbus = invDetalle.codbus LEFT OUTER JOIN
						conCtacte ON conCtacte.rutcte = invEncabezado.rutcte  LEFT OUTER JOIN
						conUnidadNegocio ON invEncabezado.codcen = conUnidadNegocio.idUniNeg

				WHERE invEncabezado.coddoc = @coddoc 
				AND invEncabezado.fecdoc BETWEEN @fecini AND @fecfin
				AND (invEncabezado.tipcom = 0 AND invEncabezado.numcom = 0)
				AND invEncabezado.tipref2 <> 2
				AND (invEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY invEncabezado.coddoc, invFamilia.ctacontable, invEncabezado.codcen,
						 invEncabezado.item,conUnidadNegocio.ctacontable, invArticulos.codfam


				UNION


				SELECT  CASE @tipoctaexistencia 
						WHEN 0 THEN invFamilia.ctaexistencias
						WHEN 2 THEN @ctaexistenciaparametro END AS cuenta,
						CAST(CASE invEncabezado.coddoc WHEN 4 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS debe, 
						CAST(CASE invEncabezado.coddoc WHEN 2 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS haber,
						invEncabezado.codcen AS uni_negocio,
						invEncabezado.item

				FROM    invArticulos LEFT OUTER JOIN
						invFamilia ON invArticulos.codfam = invFamilia.codfam RIGHT OUTER JOIN
						invEncabezado INNER JOIN
						invDetalle ON invEncabezado.coddoc = invDetalle.coddoc 
						AND invEncabezado.numinv = invDetalle.numinv ON 
						invArticulos.codbus = invDetalle.codbus LEFT OUTER JOIN
						conCtacte ON conCtacte.rutcte = invEncabezado.rutcte
				WHERE invEncabezado.coddoc = @coddoc 
				AND invEncabezado.fecdoc BETWEEN @fecini AND @fecfin
				AND (invEncabezado.tipcom = 0 AND invEncabezado.numcom = 0)
				AND invEncabezado.tipref2 <> 2
				AND (invEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY invEncabezado.coddoc, invFamilia.ctaexistencias, invEncabezado.codcen, invEncabezado.item
				ORDER BY invEncabezado.codcen, invEncabezado.item, haber
		END
		IF @tipoctaexistencia = 1
			BEGIN
				SELECT  CASE @porunineg 
						WHEN 0 THEN invSubFamilia.ctacontable 
						ELSE conUnidadNegocio.ctacontable END AS cuenta, 
						CAST(CASE invEncabezado.coddoc WHEN 2 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS debe, 
						CAST(CASE invEncabezado.coddoc WHEN 4 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS haber,
						invEncabezado.codcen AS uni_negocio,
						invEncabezado.item

				FROM    invArticulos LEFT OUTER JOIN
						invSubFamilia ON invArticulos.codfam = invSubFamilia.codfam 
						AND invArticulos.codsub = invSubFamilia.codsub RIGHT OUTER JOIN
						invEncabezado INNER JOIN
						invDetalle ON invEncabezado.coddoc = invDetalle.coddoc AND invEncabezado.numinv = invDetalle.numinv ON 
						invArticulos.codbus = invDetalle.codbus LEFT OUTER JOIN
						conCtacte ON conCtacte.rutcte = invEncabezado.rutcte  LEFT OUTER JOIN
						conUnidadNegocio ON invEncabezado.codcen = conUnidadNegocio.idUniNeg

				WHERE invEncabezado.coddoc = @coddoc 
				AND invEncabezado.fecdoc BETWEEN @fecini AND @fecfin
				AND (invEncabezado.tipcom = 0 AND invEncabezado.numcom = 0)
				AND invEncabezado.tipref2 <> 2
				AND (invEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY invEncabezado.coddoc, invSubFamilia.ctacontable, invEncabezado.codcen, invEncabezado.item
				,conUnidadNegocio.ctacontable, invArticulos.codsub


				UNION


				SELECT  CASE @tipoctaexistencia 
						WHEN 1 THEN invSubFamilia.ctaexistencias
						WHEN 2 THEN @ctaexistenciaparametro END AS cuenta,
						CAST(CASE invEncabezado.coddoc WHEN 4 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS debe, 
						CAST(CASE invEncabezado.coddoc WHEN 2 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS haber,
						invEncabezado.codcen AS uni_negocio,
						invEncabezado.item

				FROM    invArticulos LEFT OUTER JOIN
						invEncabezado INNER JOIN
						invDetalle ON invEncabezado.coddoc = invDetalle.coddoc
						AND invEncabezado.numinv = invDetalle.numinv ON 
						invArticulos.codbus = invDetalle.codbus LEFT OUTER JOIN
						conCtacte ON conCtacte.rutcte = invEncabezado.rutcte LEFT OUTER JOIN
						invSubFamilia on invArticulos.codfam = invSubFamilia.codfam
						AND invArticulos.codsub = invSubFamilia.codsub
				WHERE invEncabezado.coddoc = @coddoc 
				AND invEncabezado.fecdoc BETWEEN @fecini AND @fecfin
				AND (invEncabezado.tipcom = 0 AND invEncabezado.numcom = 0)
				AND invEncabezado.tipref2 <> 2
				AND (invEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY invEncabezado.coddoc,invEncabezado.codcen,
						 invEncabezado.item,invSubFamilia.ctaexistencias
				ORDER BY invEncabezado.codcen, invEncabezado.item, haber
		END
		IF @tipoctaexistencia = 2
			BEGIN
				SELECT  conUnidadNegocio.ctacontable AS cuenta, 
						CAST(CASE invEncabezado.coddoc WHEN 2 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS debe, 
						CAST(CASE invEncabezado.coddoc WHEN 4 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS haber,
						invEncabezado.codcen AS uni_negocio,
						invEncabezado.item

				FROM    invArticulos RIGHT OUTER JOIN --LEFT OUTER JOIN
						invEncabezado INNER JOIN
						invDetalle ON invEncabezado.coddoc = invDetalle.coddoc
						AND invEncabezado.numinv = invDetalle.numinv ON 
						invArticulos.codbus = invDetalle.codbus LEFT OUTER JOIN
						conCtacte ON conCtacte.rutcte = invEncabezado.rutcte  LEFT OUTER JOIN
						conUnidadNegocio ON invEncabezado.codcen = conUnidadNegocio.idUniNeg

				WHERE invEncabezado.coddoc = @coddoc 
				AND invEncabezado.fecdoc BETWEEN @fecini AND @fecfin
				AND (invEncabezado.tipcom = 0 AND invEncabezado.numcom = 0)
				AND invEncabezado.tipref2 <> 2
				AND (invEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY invEncabezado.coddoc, invEncabezado.codcen,
						 invEncabezado.item,conUnidadNegocio.ctacontable


				UNION


				SELECT  @ctaexistenciaparametro AS cuenta,
						CAST(CASE invEncabezado.coddoc WHEN 4 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS debe, 
						CAST(CASE invEncabezado.coddoc WHEN 2 THEN ROUND(SUM(invDetalle.cantidad * invDetalle.costo),0) ELSE 0 END AS INT) AS haber,
						invEncabezado.codcen AS uni_negocio,
						invEncabezado.item

				FROM    invArticulos LEFT OUTER JOIN
						invFamilia ON invArticulos.codfam = invFamilia.codfam RIGHT OUTER JOIN
						invEncabezado INNER JOIN
						invDetalle ON invEncabezado.coddoc = invDetalle.coddoc 
						AND invEncabezado.numinv = invDetalle.numinv ON 
						invArticulos.codbus = invDetalle.codbus LEFT OUTER JOIN
						conCtacte ON conCtacte.rutcte = invEncabezado.rutcte
				WHERE invEncabezado.coddoc = @coddoc 
				AND invEncabezado.fecdoc BETWEEN @fecini AND @fecfin
				AND (invEncabezado.tipcom = 0 AND invEncabezado.numcom = 0)
				AND invEncabezado.tipref2 <> 2
				AND (invEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY invEncabezado.coddoc, invEncabezado.codcen, invEncabezado.item
				ORDER BY invEncabezado.codcen, invEncabezado.item, haber
		END
	END
ELSE
	BEGIN
		IF @tipoctaexistencia = 0
			BEGIN
				SELECT  CASE @porunineg 
						WHEN 0 THEN invFamilia.ctacontable
						ELSE conUnidadNegocio.ctacontable END AS cuenta, 
						SUM(VenDetalle.cantidad * VenDetalle.costo) AS debe,
						0 AS haber, 
						venEncabezado.codcen AS uni_negocio,
						venEncabezado.coditem AS item

				FROM    invArticulos INNER JOIN
						invFamilia ON invArticulos.codfam = invFamilia.codfam INNER JOIN
						venEncabezado INNER JOIN
						venDetalle ON venEncabezado.coddoc = venDetalle.coddoc 
						AND venEncabezado.numinv = venDetalle.numinv 
						AND venEncabezado.grudoc = venDetalle.grudoc ON 
						invArticulos.codbus = venDetalle.codbus LEFT OUTER JOIN
						conUnidadNegocio ON venEncabezado.codcen = conUnidadNegocio.idUniNeg
				WHERE  (venEncabezado.grudoc = 50)
				AND           (venencabezado.estado<>9)
				AND           (venEncabezado.fecdoc BETWEEN @fecini AND @fecfin)
				AND           (venEncabezado.tipcom = 0) 
				AND           (venEncabezado.numcom = 0)
				AND (venEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY venEncabezado.coddoc, invFamilia.ctacontable, venEncabezado.codcen,
						 conUnidadNegocio.ctacontable,  venEncabezado.coditem, invArticulos.codfam
				HAVING      (SUM(ROUND(venDetalle.cantidad * invArticulos.costo, 0)) > 0)


				UNION


				SELECT  CASE @tipoctaexistencia 
						WHEN 0 THEN invFamilia.ctaexistencias
						WHEN 2 THEN @ctaexistenciaparametro END AS cuenta,
						0 AS debe,
						SUM(VenDetalle.cantidad * VenDetalle.costo) AS haber, 
						venEncabezado.codcen AS uni_negocio,
						venEncabezado.coditem  AS item

				FROM    invArticulos INNER JOIN
						invFamilia ON invArticulos.codfam = invFamilia.codfam INNER JOIN
						venEncabezado INNER JOIN
						venDetalle ON venEncabezado.coddoc = venDetalle.coddoc 
						AND venEncabezado.numinv = venDetalle.numinv 
						AND venEncabezado.grudoc = venDetalle.grudoc ON 
						invArticulos.codbus = venDetalle.codbus
				WHERE  (venEncabezado.grudoc = 50)
				AND           (venencabezado.estado<>9)
				AND           (venEncabezado.fecdoc BETWEEN @fecini AND @fecfin)
				AND           (venEncabezado.tipcom = 0) 
				AND           (venEncabezado.numcom = 0)
				AND (venEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY venEncabezado.coddoc, invFamilia.ctaexistencias, venEncabezado.codcen, venEncabezado.coditem
				HAVING      (SUM(ROUND(venDetalle.cantidad * invArticulos.costo, 0)) > 0)
				ORDER BY venEncabezado.codcen, haber
		END
		IF @tipoctaexistencia = 1
			BEGIN
				SELECT  CASE @porunineg 
						WHEN 0 THEN invSubFamilia.ctacontable 
						ELSE conUnidadNegocio.ctacontable END AS cuenta, 
						SUM(VenDetalle.cantidad * VenDetalle.costo) AS debe,
						0 AS haber, 
						venEncabezado.codcen AS uni_negocio,
						venEncabezado.coditem AS item

				FROM    invArticulos INNER JOIN
						venEncabezado INNER JOIN
						venDetalle ON venEncabezado.coddoc = venDetalle.coddoc 
						AND venEncabezado.numinv = venDetalle.numinv 
						AND venEncabezado.grudoc = venDetalle.grudoc ON 
						invArticulos.codbus = venDetalle.codbus LEFT OUTER JOIN
						conUnidadNegocio ON venEncabezado.codcen = conUnidadNegocio.idUniNeg LEFT OUTER JOIN
						invSubFamilia on invArticulos.codfam = invSubFamilia.codfam
						AND invArticulos.codsub = invSubFamilia.codsub
				WHERE  (venEncabezado.grudoc = 50)
				AND           (venencabezado.estado<>9)
				AND           (venEncabezado.fecdoc BETWEEN @fecini AND @fecfin)
				AND           (venEncabezado.tipcom = 0) 
				AND           (venEncabezado.numcom = 0)
				AND (venEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY venEncabezado.coddoc, invSubFamilia.ctacontable, venEncabezado.codcen,
						 conUnidadNegocio.ctacontable, venEncabezado.coditem, invArticulos.codsub
				HAVING      (SUM(ROUND(venDetalle.cantidad * invArticulos.costo, 0)) > 0)


				UNION


				SELECT  CASE @tipoctaexistencia 
						WHEN 1 THEN invSubFamilia.ctaexistencias
						WHEN 2 THEN @ctaexistenciaparametro END AS cuenta,
						0 AS debe,
						SUM(VenDetalle.cantidad * VenDetalle.costo) AS haber, 
						venEncabezado.codcen AS uni_negocio,
						venEncabezado.coditem  AS item

				FROM    invArticulos INNER JOIN
					venEncabezado INNER JOIN
					venDetalle ON venEncabezado.coddoc = venDetalle.coddoc 
					AND venEncabezado.numinv = venDetalle.numinv 
					AND venEncabezado.grudoc = venDetalle.grudoc ON 
					invArticulos.codbus = venDetalle.codbus LEFT OUTER JOIN
					invSubFamilia on invArticulos.codfam = invSubFamilia.codfam
					AND invArticulos.codsub = invSubFamilia.codsub
				WHERE  (venEncabezado.grudoc = 50)
				AND           (venencabezado.estado<>9)
				AND           (venEncabezado.fecdoc BETWEEN @fecini AND @fecfin)
				AND           (venEncabezado.tipcom = 0) 
				AND           (venEncabezado.numcom = 0)
				AND (venEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY venEncabezado.coddoc, invSubFamilia.ctaexistencias,
						 venEncabezado.codcen,venEncabezado.coditem 
				HAVING      (SUM(ROUND(venDetalle.cantidad * invArticulos.costo, 0)) > 0)
				ORDER BY venEncabezado.codcen, haber
		END
		IF @tipoctaexistencia = 2
			BEGIN
				SELECT  conUnidadNegocio.ctacontable AS cuenta, 
						SUM(VenDetalle.cantidad * VenDetalle.costo) AS debe,
						0 AS haber, 
						venEncabezado.codcen AS uni_negocio,
						venEncabezado.coditem AS item

				FROM    invArticulos INNER JOIN
						venEncabezado INNER JOIN
						venDetalle ON venEncabezado.coddoc = venDetalle.coddoc 
						AND venEncabezado.numinv = venDetalle.numinv 
						AND venEncabezado.grudoc = venDetalle.grudoc ON 
						invArticulos.codbus = venDetalle.codbus LEFT OUTER JOIN
						conUnidadNegocio ON venEncabezado.codcen = conUnidadNegocio.idUniNeg
				WHERE  (venEncabezado.grudoc = 50)
				AND           (venencabezado.estado<>9)
				AND           (venEncabezado.fecdoc BETWEEN @fecini AND @fecfin)
				AND           (venEncabezado.tipcom = 0) 
				AND           (venEncabezado.numcom = 0)
				AND (venEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY venEncabezado.coddoc, venEncabezado.codcen,
						 conUnidadNegocio.ctacontable,  venEncabezado.coditem
				HAVING      (SUM(ROUND(venDetalle.cantidad * invArticulos.costo, 0)) > 0)


				UNION


				SELECT  @ctaexistenciaparametro AS cuenta,
						0 AS debe,
						SUM(VenDetalle.cantidad * VenDetalle.costo) AS haber, 
						venEncabezado.codcen AS uni_negocio,
						venEncabezado.coditem  AS item

				FROM    invArticulos INNER JOIN
						venEncabezado INNER JOIN
						venDetalle ON venEncabezado.coddoc = venDetalle.coddoc 
						AND venEncabezado.numinv = venDetalle.numinv 
						AND venEncabezado.grudoc = venDetalle.grudoc ON 
						invArticulos.codbus = venDetalle.codbus
				WHERE  (venEncabezado.grudoc = 50)
				AND           (venencabezado.estado<>9)
				AND           (venEncabezado.fecdoc BETWEEN @fecini AND @fecfin)
				AND           (venEncabezado.tipcom = 0) 
				AND           (venEncabezado.numcom = 0)
				AND (venEncabezado.codbod = @codbod OR @codbod = 0)
				GROUP BY venEncabezado.coddoc, venEncabezado.codcen, venEncabezado.coditem
				HAVING      (SUM(ROUND(venDetalle.cantidad * invArticulos.costo, 0)) > 0)
				ORDER BY venEncabezado.codcen, haber
		END
END