
/****** Object:  UserDefinedFunction [dbo].[GetSaldoPendienteSeccionBeforeOper]    Script Date: 05/02/2016 11:44:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION GetSaldoPendienteSeccionBeforeOper
                      (@id_arti int, 
                       @id_secc smallint, 
                       @id_operacion int)
RETURNS numeric(12,4)
AS
/*	GM, oct 2006, agregué reversiones para todos los mov, pues como
	estaba no funcionaba y además agregué devol y elab
	Además agregué la posibilidad de llamarla con id_operacion null
	para que dé en ese caso todos los pendientes y poderme echar
	el arreglo del GetSaldoPendienteAlmacen, haciendo que llame a éste

	Devuelve el saldo en cantidad pendiente de actualizar
	de un artículo en una sección dada, 
	para la operacion anterior a la dada.
*/
BEGIN





	Declare @saldo numeric(12,4),
			@saldo_compras numeric(12,4),
			@saldo_revcompras numeric(12,4),
			@saldo_devoluciones numeric(12,4),
			@saldo_traslados_origen numeric(12,4),
			@saldo_traslados_destino numeric(12,4),
			@saldo_revtraslados_origen numeric(12,4),
			@saldo_revtraslados_destino numeric(12,4),
			@saldo_multitraslados_origen numeric(12,4),
			@saldo_multitraslados_destino numeric(12,4),
			@saldo_ajustes numeric(12,4),
			@saldo_revajustes numeric(12,4),
			@saldo_inventarios numeric(12,4),
			@saldo_despieces_origen numeric(12,4),
			@saldo_despieces_destino numeric(12,4),
			@saldo_revdespieces_origen numeric(12,4),
			@saldo_revdespieces_destino numeric(12,4),
			@saldo_rebajas_principal numeric(12,4),
			@saldo_elab_elaborado numeric(12,4),
			@saldo_elab_ingrediente numeric(12,4),
			@saldo_revelab_elaborado numeric(12,4),
			@saldo_revelab_ingrediente numeric(12,4),
			@fecha_oper datetime

Set @saldo = 0 

--return @saldo


	-- Chequeo de parámetros, devuelve NULL en caso de error
	IF @id_secc IS NULL OR @id_arti IS NULL OR NOT 
	     Exists(select * from STOKARTI where id_arti =@id_arti )
		return 0

	If @id_operacion is null	-- Para incluir total pendiente
		Begin
			Select @fecha_oper = max(fec_oper) from stokoper
			Select @id_operacion=-1
		End
	Else
		If Exists(SELECT * FROM stokoper WHERE id_operacion=@id_operacion)
				  SELECT @fecha_oper=fec_oper 
				         FROM stokoper 
				         WHERE id_operacion=@id_operacion
		Else
				SELECT @fecha_oper=fecha_dia FROM stoktabl

	/* Compras y reversiones */
	------------------------------------------------------------------
	SELECT @saldo_compras=SUM(coalesce(dbo.Get_ConvertUM (1 ,NULL ,
					dbo.Get_ConvertUM (NULL ,1 , l.cantidad,l.id_arti) ,
					l.id_arti),0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokcmpi i ON o.id_operacion=i.id_operacion
	INNER JOIN stokcmpl l ON i.id_cmpi = l.id_cmpi
	WHERE o.estado=1 AND 
		t.id_cmov = 1 AND 
		l.id_arti=@id_arti AND 
		i.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion

	SELECT @saldo_revcompras=SUM(coalesce(-dbo.Get_ConvertUM (1 ,NULL ,
					dbo.Get_ConvertUM (NULL ,1 , l.cantidad,l.id_arti),l.id_arti),0))
	FROM stokoper o 
	INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokcmpi i ON rvtda.id_operacion=i.id_operacion
	INNER JOIN stokcmpl l ON i.id_cmpi = l.id_cmpi
			and l.id_revertidor is not null and l.id_revertidor=o.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 2 AND 
		l.id_arti=@id_arti AND 
		i.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion


	-- Traslados y reversiones (origen)
    ------------------------------------------------------------------------	
	SELECT @saldo_traslados_origen=SUM(coalesce(-l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stoktrac c ON o.id_operacion=c.id_operacion
	INNER JOIN stoktral l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 3 AND 
		l.id_arti=@id_arti AND 
		c.id_seccO = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion

	SELECT @saldo_revtraslados_origen=SUM(coalesce(l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion	
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stoktrac c ON rvtda.id_operacion=c.id_operacion
	INNER JOIN stoktral l ON rvtda.id_operacion=l.id_operacion
			and l.id_revertidor is not null and l.id_revertidor=o.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov  = 4 AND 
		l.id_arti=@id_arti AND 
		c.id_seccO = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion


	-- Traslados y reversiones (destino)
    ------------------------------------------------------------------------	
	
	SELECT @saldo_traslados_destino=SUM(coalesce(dbo.Get_ConvertUM (
				case when c.id_seccO is null then 1 
					  else 0 end, NULL , l.cantidad,l.id_arti),0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stoktrac c ON o.id_operacion=c.id_operacion
	INNER JOIN stoktral l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 3 AND 
		l.id_arti=@id_arti AND 
		c.id_seccD = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion

	SELECT @saldo_revtraslados_destino=SUM(coalesce(-dbo.Get_ConvertUM (
				case when c.id_seccO is null then 1 
					  else 0 end, NULL , l.cantidad,l.id_arti),0))
	FROM stokoper o 
	INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion	
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stoktrac c ON rvtda.id_operacion=c.id_operacion
	INNER JOIN stoktral l ON rvtda.id_operacion=l.id_operacion
			and l.id_revertidor is not null and l.id_revertidor=o.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 4 AND 
		l.id_arti=@id_arti AND 
		c.id_seccD = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion

	-- MultiTraslados (origen)
    ------------------------------------------------------------------------	
	
	SELECT @saldo_multitraslados_origen=SUM(coalesce(-l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokmalc c ON o.id_operacion=c.id_operacion
	INNER JOIN stokmall l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov in (7) AND 
		l.id_arti=@id_arti AND 
		c.id_seccO = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion AND 
		c.id_dato_de=dbo.GetCurrentDato()

	-- MultiTraslados (destino)
    ------------------------------------------------------------------------	
	
	SELECT @saldo_multitraslados_destino=SUM(coalesce(dbo.Get_ConvertUM (case when c.id_seccO is null then 0 else 1 end, 1 , l.cantidad,l.id_arti),0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokmalc c ON o.id_operacion=c.id_operacion
	INNER JOIN stokmall l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov in (7) AND 
		l.id_arti=@id_arti AND 
		c.id_seccD = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion AND 
		c.id_dato_de=dbo.GetCurrentDato()

	-- Ajustes y reversiones
    ------------------------------------------------------------------------	

	SELECT @saldo_ajustes=SUM(coalesce(l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokajuc c ON o.id_operacion=c.id_operacion
	INNER JOIN stokajul l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 5 AND 
		l.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	SELECT @saldo_revajustes=SUM(coalesce(-l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion	
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokajuc c ON rvtda.id_operacion=c.id_operacion
	INNER JOIN stokajul l ON rvtda.id_operacion=l.id_operacion
			and l.id_revertidor is not null and l.id_revertidor=o.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 6 AND 
		l.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	-- Fijación de inventarios
    ------------------------------------------------------------------------	
	
	SELECT @saldo_inventarios=SUM(coalesce(l.toma-l.existencia,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokinvc c ON o.id_operacion=c.id_operacion
	INNER JOIN stokinvl l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 9 AND 
		l.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	-- Despieces y reversiones (art. origen)
    ------------------------------------------------------------------------	
	
	SELECT @saldo_despieces_origen=SUM(coalesce(-c.cantidad,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokdesc c ON o.id_operacion=c.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 10 AND 
		c.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	SELECT @saldo_revdespieces_origen=SUM(coalesce(c.cantidad,0))
	FROM stokoper o 
	INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion	
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokdesc c ON rvtda.id_operacion=c.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 11 AND 
		c.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	-- Despieces y reversiones (arts. destino)
    ------------------------------------------------------------------------	
	
	SELECT @saldo_despieces_destino=SUM(coalesce(l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokdesc c ON o.id_operacion=c.id_operacion
	INNER JOIN stokdesl l ON o.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 10 AND 
		l.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	SELECT @saldo_revdespieces_destino=SUM(coalesce(-l.cantidad,0))
	FROM stokoper o 
	INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion	
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokdesc c ON rvtda.id_operacion=c.id_operacion
	INNER JOIN stokdesl l ON rvtda.id_operacion=l.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 11 AND 
		l.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	-- Rebaja, principal
    ------------------------------------------------------------------------	
	
	SELECT @saldo_rebajas_principal=SUM(coalesce(-p.cantidad_pv,0))
	FROM stokoper o 
	INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
	INNER JOIN stokrebc c ON o.id_operacion=c.id_operacion
	INNER JOIN stokrebp p ON o.id_operacion=p.id_operacion
	WHERE o.estado=1 AND 
		t.id_cmov = 12 AND 
		p.id_arti=@id_arti AND 
		c.id_secc = @id_secc AND
		datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion

	-- Devoluciones
    ------------------------------------------------------------------------	
	
	SELECT @saldo_devoluciones=SUM(coalesce(-dbo.Get_ConvertUM (1 ,NULL ,dbo.Get_ConvertUM (NULL ,1 , l.cantidad,l.id_arti) ,l.id_arti),0))
			FROM stokoper o 
				INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
				INNER JOIN stokdevi i ON o.id_operacion=i.id_operacion
				INNER JOIN stokdevl l ON i.id_devi = l.id_devi
			WHERE o.estado=1 AND 
				t.id_cmov = 32 AND 
				l.id_arti=@id_arti AND 
				i.id_secc = @id_secc AND
				datediff(dd,o.fec_oper,@fecha_oper) >= 0 and  o.id_operacion!=@id_operacion
	
	---- Elaboraciones
    --------------------------------------------------------------------------	
	-- elaborados
	SELECT @saldo_elab_elaborado=SUM(coalesce(c.cant_r,0))
		FROM stokoper o 
		INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
		INNER JOIN stokeelo c ON o.id_operacion=c.id_operacion
		WHERE o.estado=1 AND 
			t.id_cmov = 15 AND 
			c.id_arti=@id_arti AND 
			c.id_secc = @id_secc AND
			datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion
	-- ingredientes 
	SELECT @saldo_elab_ingrediente=
		dbo.CantPdteElabIngred(@id_arti,@id_secc,@fecha_oper,@id_operacion)

	---- Reversión de Elaboraciones
    --------------------------------------------------------------------------	
	
	-- elaborados
	SELECT @saldo_revelab_elaborado=SUM(coalesce(-c.cant_r,0))
		FROM stokoper o 
		INNER JOIN stokoper rvtda on o.id_revertido=rvtda.id_operacion	
		INNER JOIN stoktmov t ON o.id_tmov=t.id_tmov
		INNER JOIN stokeelo c ON rvtda.id_operacion=c.id_operacion
		WHERE o.estado=1 AND 
			t.id_cmov = 16 AND 
			c.id_arti=@id_arti AND 
			c.id_secc = @id_secc AND
			datediff(dd,o.fec_oper,@fecha_oper) >= 0  and  o.id_operacion!=@id_operacion
	-- ingredientes 
	SELECT @saldo_revelab_ingrediente=
		dbo.CantPdteRevElabIngred(@id_arti,@id_secc,@fecha_oper,@id_operacion)

	-- Saldo pendiente anterior a la operación
	select @saldo=COALESCE(@saldo_compras,0)
		+COALESCE(@saldo_revcompras,0)
		+COALESCE(@saldo_devoluciones,0)
		+COALESCE(@saldo_traslados_origen,0)
		+COALESCE(@saldo_revtraslados_origen,0)
		+COALESCE(@saldo_traslados_destino,0)
		+COALESCE(@saldo_revtraslados_destino,0)
		+COALESCE(@saldo_multitraslados_origen,0)
		+COALESCE(@saldo_multitraslados_destino,0)
		+COALESCE(@saldo_ajustes,0)
		+COALESCE(@saldo_revajustes,0)
		+COALESCE(@saldo_inventarios,0)
		+COALESCE(@saldo_despieces_origen,0)
		+COALESCE(@saldo_revdespieces_origen,0)
		+COALESCE(@saldo_despieces_destino,0)
		+COALESCE(@saldo_revdespieces_destino,0)
		+COALESCE(@saldo_rebajas_principal,0)
		+COALESCE(@saldo_elab_elaborado,0)
		+COALESCE(@saldo_elab_ingrediente,0)
		+COALESCE(@saldo_revelab_elaborado,0)
		+COALESCE(@saldo_revelab_ingrediente,0)
	RETURN @saldo
	

END

