IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'udf_SplitVariable') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.udf_SplitVariable'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION dbo.udf_SplitVariable
(
    @List varchar(8000),
    @SplitOn varchar(5) = '',''
)

RETURNS @RtnValue TABLE
(
    Id INT IDENTITY(1,1),
    Value VARCHAR(8000)
)

AS
BEGIN

--Account for ticks
SET @List = (REPLACE(@List, '''''''', ''''))

--Account for ''emptynull''
IF LTRIM(RTRIM(@List)) = ''emptynull''
BEGIN
    SET @List = ''''
END

--Loop through all of the items in the string and add records for each item
WHILE (CHARINDEX(@SplitOn,@List)>0)
BEGIN

    INSERT INTO @RtnValue (value)
    SELECT Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List)-1)))  

    SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn,@List) + LEN(@SplitOn), LEN(@List))

END

INSERT INTO @RtnValue (Value)
SELECT Value = LTRIM(RTRIM(@List))

RETURN

END '
GO
IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaPMP]'))
DROP PROCEDURE [dbo].[sp_ResaldaPMP]
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaPMP] (@Articulo varchar(15)) AS 
SET NOCOUNT ON 
DECLARE @Id uniqueidentifier
DECLARE @Estoc decimal(30,6)
DECLARE @PMPAnt decimal(30,6)
DECLARE @SerieTipoDoc nvarchar(4)
DECLARE @FechaConsInv datetime, @FechaCierreInv datetime
DECLARE @Cantidad decimal(30,6), @Precio decimal(30,6), @E_S_N nchar(1), @No_calculo_pmp bit

--busco la data consolidacio
SET @FechaConsInv=(SELECT TOP 1 Fecha_consolidacion_inventario FROM Consolidacion_inventario ORDER BY Fecha_consolidacion_inventario DESC)
--si no hi ha data consolidacio poso una data minima
IF (@FechaConsInv is null)
	SET @FechaConsInv=DATETIMEFROMPARTS( 1900, 12, 31, 23, 59, 59, 0 )
ELSE
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaConsInv),MONTH(@FechaConsInv),DAY(@FechaConsInv),23,59,59,0)

--busco la data tancament inventari
SET @FechaCierreInv=ISNULL((SELECT TOP 1 Fecha_cierre_inv
						FROM V_Movimientos_estoc
						WHERE Articulo = @Articulo
						AND ISNULL(Fecha_cierre_inv,'''')<>''''
						GROUP BY Fecha_cierre_inv
						ORDER BY Fecha_cierre_inv DESC),@FechaConsInv)
--si la data tancament ínventari és superior a la data consilidació, igualo les dates
IF (@FechaCierreInv>@FechaConsInv)
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaCierreInv),MONTH(@FechaCierreInv),DAY(@FechaCierreInv),23,59,59,0)

DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT V_Movimientos_estoc.Id, V_Movimientos_estoc.SerieTipoDoc, V_Movimientos_estoc.Cantidad, ISNULL(V_Movimientos_estoc.Precio,0) as Precio, V_Movimientos_estoc.E_S_N, Series_albaranes_compra.No_calculo_pmp
									FROM V_Movimientos_estoc
									LEFT OUTER JOIN Series_albaranes_compra 
									ON dbo.V_Movimientos_estoc.SerieTipoDoc = ''AC''
									AND dbo.V_Movimientos_estoc.Serie_tipo_mov = dbo.Series_albaranes_compra.Serie
									WHERE V_Movimientos_estoc.Articulo = @Articulo
									AND V_Movimientos_estoc.Fecha_hora > CONVERT(DATETIME, @FechaConsInv, 103) 
									AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')=''''
									ORDER BY V_Movimientos_estoc.Fecha_hora, V_Movimientos_estoc.Serie_tipo_mov, V_Movimientos_estoc.Num_movimiento, V_Movimientos_estoc.Linea, V_Movimientos_estoc.E_S_N Desc

SET @PMPAnt=ISNULL((SELECT TOP 1 V_Movimientos_estoc.Pmp
					FROM V_Movimientos_estoc
					WHERE V_Movimientos_estoc.Articulo = @Articulo
					AND V_Movimientos_estoc.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103)  AND E_S_N=''E''
					AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')<>''''
					ORDER BY V_Movimientos_estoc.Fecha_hora DESC, V_Movimientos_estoc.Serie_tipo_mov DESC, V_Movimientos_estoc.Num_movimiento DESC, V_Movimientos_estoc.Linea DESC, V_Movimientos_estoc.E_S_N ASC),0)

SET @Estoc=ISNULL((SELECT sum(V_Movimientos_estoc.Cantidad)
					FROM V_Movimientos_estoc
					WHERE V_Movimientos_estoc.Articulo = @Articulo
					AND V_Movimientos_estoc.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103) 
					AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')<>''''),0)
BEGIN TRANSACTION	
OPEN Tb 
FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
WHILE @@FETCH_STATUS = 0 
BEGIN 
	/*calculo si cal*/
	IF ((@E_S_N=''E'')  AND ISNULL(@No_calculo_pmp,0)=0 AND (@Cantidad+@Estoc) > 0)
	BEGIN
		/*faig el càlcul*/
		IF (@Estoc < 0)
			BEGIN
			/*faig el càlcul*/
			SET @PMPAnt = @Precio
			END
		ELSE
			BEGIN
				SET @PMPAnt = ((@Cantidad*@Precio) + (@Estoc*@PMPAnt)) / (@Cantidad + @Estoc)
			END

	END

	/*actualitzo a la taula corresponent*/
	IF (@SerieTipoDoc=''AC'')	
		UPDATE Alb_compra_lineas_lotes SET pmp = @PMPAnt WHERE id=@Id
	ELSE IF (@SerieTipoDoc=''AL'')	
		UPDATE Alb_liq_lin SET pmp = @PMPAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''AV'')	
		UPDATE Alb_venta_lineas_lotes SET pmp = @PMPAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''FS'')	
		UPDATE Facturas_simpl_lineas SET pmp = @PMPAnt WHERE id=@Id	
	ELSE 
		UPDATE Movimientos SET pmp = @PMPAnt WHERE id=@Id
	/*actualitzo estoc*/
	SET @Estoc=@Estoc+@Cantidad
	/*següent registre*/
	FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
END 
CLOSE Tb 
DEALLOCATE Tb 
COMMIT TRANSACTION
RETURN'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaPMP_TodosArticulos]'))
DROP PROCEDURE [dbo].[sp_ResaldaPMP_TodosArticulos]
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaPMP_TodosArticulos]  AS 
SET NOCOUNT ON
DECLARE @Articulo varchar(15), @Articulo_ACTUAL varchar(15)
DECLARE @Id uniqueidentifier
DECLARE @Estoc decimal(30,6)
DECLARE @PMPAnt decimal(30,6)
DECLARE @SerieTipoDoc nvarchar(4)
DECLARE @FechaConsInv datetime, @FechaCierreInv datetime
DECLARE @Cantidad decimal(30,6), @Precio decimal(30,6), @E_S_N nchar(1), @No_calculo_pmp bit

--busco la data consolidacio
SET @FechaConsInv=(SELECT TOP 1 Fecha_consolidacion_inventario FROM Consolidacion_inventario WITH(NOLOCK) ORDER BY Fecha_consolidacion_inventario DESC)
--si no hi ha data consolidacio poso una data minima
IF (@FechaConsInv is null)
	SET @FechaConsInv=DATETIMEFROMPARTS( 1900, 12, 31, 23, 59, 59, 0 )
ELSE
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaConsInv),MONTH(@FechaConsInv),DAY(@FechaConsInv),23,59,59,0)

--busco la data tancament inventari
SET @FechaCierreInv=ISNULL((SELECT TOP 1 Fecha_cierre_inv
						FROM V_Movimientos_estoc
						WHERE ISNULL(Fecha_cierre_inv,'''')<>''''
						GROUP BY Fecha_cierre_inv
						ORDER BY Fecha_cierre_inv DESC),@FechaConsInv)
--si la data tancament ínventari és superior a la data consilidació, igualo les dates
IF (@FechaCierreInv>@FechaConsInv)
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaCierreInv),MONTH(@FechaCierreInv),DAY(@FechaCierreInv),23,59,59,0)

SET @Articulo_ACTUAL=''''

--taula amb moviments temporals
DECLARE @VME table (Articulo nvarchar(15), Pmp decimal(30,6), Estoc decimal(30,6))

INSERT INTO @VME
SELECT Articulo, Pmp,
	ISNULL((SELECT SUM(ISNULL(Cantidad,0))
	FROM V_Movimientos_estoc AS VME WITH(NOLOCK) 
	WHERE VME.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103)
	AND  VME.Fecha_cierre_inv Is Not Null
	AND VME.Articulo=tb.Articulo),0) As Estoc
FROM
	(SELECT ROW_NUMBER() OVER(PARTITION BY Articulo
	ORDER BY VME_ES.Fecha_hora DESC, VME_ES.Serie_tipo_mov DESC, VME_ES.Num_movimiento DESC, VME_ES.Linea DESC, VME_ES.E_S_N ASC) AS RowNumber,
	Articulo, Fecha_hora, Fecha_cierre_inv, Serie_tipo_mov, Num_movimiento, Linea, E_S_N,  Pmp , Cantidad
	FROM V_Movimientos_estoc   AS VME_ES WITH(NOLOCK) 
	WHERE VME_ES.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103)  AND E_S_N=''E'' 
	AND  VME_ES.Fecha_cierre_inv Is Not Null) As Tb
WHERE RowNumber=1

--taula temporal amb pmp i estoc
DECLARE @ArtPE table (Codigo nvarchar(15), Pmp decimal(30,6), Estoc decimal(30,6)) 		

INSERT INTO @ArtPE (Codigo, Pmp, Estoc)
SELECT Art.Codigo, MAX(ISNULL(VME.Pmp,0)), MAX(ISNULL(VME.Estoc,0))
FROM Articulos AS Art WITH(NOLOCK) 
LEFT JOIN @VME AS VME 
ON VME.Articulo = Art.Codigo
GROUP BY Art.Codigo
ORDER BY Art.Codigo

DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT V_Movimientos_estoc.Articulo, V_Movimientos_estoc.Id, V_Movimientos_estoc.SerieTipoDoc, V_Movimientos_estoc.Cantidad, ISNULL(V_Movimientos_estoc.Precio,0) as Precio, V_Movimientos_estoc.E_S_N, Series_albaranes_compra.No_calculo_pmp
									FROM V_Movimientos_estoc WITH(NOLOCK) 
									LEFT OUTER JOIN Series_albaranes_compra WITH(NOLOCK) 
									ON dbo.V_Movimientos_estoc.SerieTipoDoc = ''AC''
									AND dbo.V_Movimientos_estoc.Serie_tipo_mov = dbo.Series_albaranes_compra.Serie
									WHERE V_Movimientos_estoc.Fecha_hora > CONVERT(DATETIME, @FechaConsInv, 103)
									AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')=''''
									ORDER BY V_Movimientos_estoc.Articulo, V_Movimientos_estoc.Fecha_hora, V_Movimientos_estoc.Serie_tipo_mov, V_Movimientos_estoc.Num_movimiento, V_Movimientos_estoc.Linea, V_Movimientos_estoc.E_S_N DESC
BEGIN TRANSACTION	
OPEN Tb
FETCH NEXT FROM Tb INTO @Articulo, @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
WHILE @@FETCH_STATUS = 0
BEGIN
	--Control cambio artículo
	IF (@Articulo<>@Articulo_ACTUAL)
	BEGIN
		SELECT @PMPAnt=Pmp, @Estoc=Estoc FROM @ArtPE WHERE Codigo=@Articulo
		SET @Articulo_ACTUAL=@Articulo
	END
	/*calculo si cal*/
	IF ((@E_S_N=''E'')  AND ISNULL(@No_calculo_pmp,0)=0 AND (@Cantidad+@Estoc) > 0)
	BEGIN
		/*faig el càlcul*/
		IF (@Estoc < 0)
			BEGIN
			/*faig el càlcul*/
			SET @PMPAnt = @Precio
			END
		ELSE
			BEGIN
				SET @PMPAnt = ((@Cantidad*@Precio) + (@Estoc*@PMPAnt)) / (@Cantidad + @Estoc)
			END
	END

	/*actualitzo a la taula corresponent*/
	IF (@SerieTipoDoc=''AC'')	
		UPDATE Alb_compra_lineas_lotes SET pmp = @PMPAnt WHERE id=@Id
	ELSE IF (@SerieTipoDoc=''AL'')	
		UPDATE Alb_liq_lin SET pmp = @PMPAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''AV'')	
		UPDATE Alb_venta_lineas_lotes SET pmp = @PMPAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''FS'')	
		UPDATE Facturas_simpl_lineas SET pmp = @PMPAnt WHERE id=@Id	
	ELSE
		UPDATE Movimientos SET pmp = @PMPAnt WHERE id=@Id
	/*actualitzo estoc*/
	SET @Estoc=@Estoc+@Cantidad
	/*següent registre*/
	FETCH NEXT FROM Tb INTO @Articulo, @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
END
CLOSE Tb
DEALLOCATE Tb
COMMIT TRANSACTION
RETURN
'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[RemoveDefaultConstraints]'))
DROP PROCEDURE [dbo].RemoveDefaultConstraints
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[RemoveDefaultConstraints] @table_name nvarchar(256), @column_name nvarchar(256)
AS
BEGIN

    DECLARE @ObjectName NVARCHAR(100)

    START: --Start of loop
    SELECT 
        @ObjectName = OBJECT_NAME([default_object_id]) 
    FROM 
        SYS.COLUMNS
    WHERE 
        [object_id] = OBJECT_ID(@table_name) 
        AND [name] = @column_name;

   
    IF @ObjectName IS NOT NULL
    BEGIN
        EXEC (''ALTER TABLE ''+@table_name+'' DROP CONSTRAINT '' + @ObjectName)
        GOTO START; --Used to loop in case of multiple default constraints
    END
END'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaPMPLote]'))
DROP PROCEDURE [dbo].sp_ResaldaPMPLote
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaPMPLote] (@Articulo varchar(15), @Lote nvarchar(20)) AS
SET NOCOUNT ON
DECLARE @Id uniqueidentifier
DECLARE @Estoc decimal(30,6)
DECLARE @PMPAnt decimal(30,6)
DECLARE @SerieTipoDoc nvarchar(4)
DECLARE @FechaConsInv datetime, @FechaCierreInv datetime
DECLARE @Cantidad decimal(30,6), @Precio decimal(30,6), @E_S_N nchar(1), @No_calculo_pmp bit

--busco la data consolidacio
SET @FechaConsInv=(SELECT TOP 1 Fecha_consolidacion_inventario FROM Consolidacion_inventario ORDER BY Fecha_consolidacion_inventario DESC)
--si no hi ha data consolidacio poso una data minima
IF (@FechaConsInv is null)
	SET @FechaConsInv=DATETIMEFROMPARTS( 1900, 12, 31, 23, 59, 59, 0 )
ELSE
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaConsInv),MONTH(@FechaConsInv),DAY(@FechaConsInv),23,59,59,0)

--busco la data tancament inventari
SET @FechaCierreInv=ISNULL((SELECT TOP 1 Fecha_cierre_inv
						FROM V_Movimientos_estoc
						WHERE Articulo = @Articulo
						AND ISNULL(Fecha_cierre_inv,'''')<>''''
						GROUP BY Fecha_cierre_inv
						ORDER BY Fecha_cierre_inv DESC),@FechaConsInv)
--si la data tancament ínventari és superior a la data consilidació, igualo les dates
IF (@FechaCierreInv>@FechaConsInv)
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaCierreInv),MONTH(@FechaCierreInv),DAY(@FechaCierreInv),23,59,59,0)

DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT V_Movimientos_estoc.Id, V_Movimientos_estoc.SerieTipoDoc, V_Movimientos_estoc.Cantidad, ISNULL(V_Movimientos_estoc.Precio,0) as Precio, V_Movimientos_estoc.E_S_N, Series_albaranes_compra.No_calculo_pmp
									FROM V_Movimientos_estoc
									LEFT OUTER JOIN Series_albaranes_compra
									ON dbo.V_Movimientos_estoc.SerieTipoDoc = ''AC''
									AND dbo.V_Movimientos_estoc.Serie_tipo_mov = dbo.Series_albaranes_compra.Serie
									WHERE V_Movimientos_estoc.Articulo = @Articulo
									AND V_Movimientos_estoc.Lote = @Lote
									AND V_Movimientos_estoc.Fecha_hora > CONVERT(DATETIME, @FechaConsInv, 103)
									AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')=''''
									ORDER BY V_Movimientos_estoc.Fecha_hora, V_Movimientos_estoc.Serie_tipo_mov, V_Movimientos_estoc.Num_movimiento, V_Movimientos_estoc.Linea, V_Movimientos_estoc.E_S_N Desc

SET @PMPAnt=ISNULL((SELECT TOP 1 V_Movimientos_estoc.Pmp_lote
					FROM V_Movimientos_estoc
					WHERE V_Movimientos_estoc.Articulo = @Articulo
					AND V_Movimientos_estoc.Lote = @Lote
					AND V_Movimientos_estoc.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103) AND E_S_N=''E''
					AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')<>''''
					ORDER BY V_Movimientos_estoc.Fecha_hora DESC, V_Movimientos_estoc.Serie_tipo_mov DESC, V_Movimientos_estoc.Num_movimiento DESC, V_Movimientos_estoc.Linea DESC, V_Movimientos_estoc.E_S_N ASC),0)

SET @Estoc=ISNULL((SELECT sum(V_Movimientos_estoc.Cantidad)
					FROM V_Movimientos_estoc
					WHERE V_Movimientos_estoc.Articulo = @Articulo
					AND V_Movimientos_estoc.Lote = @Lote
					AND V_Movimientos_estoc.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103)
					AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')<>''''),0)
BEGIN TRANSACTION	
OPEN Tb
FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
WHILE @@FETCH_STATUS = 0
BEGIN
	/*calculo si cal*/
	IF ((@E_S_N=''E'')  AND ISNULL(@No_calculo_pmp,0)=0 AND (@Cantidad+@Estoc) > 0)
	BEGIN
		/*faig el càlcul*/
		IF (@Estoc < 0)
			BEGIN
			/*faig el càlcul*/
			SET @PMPAnt = @Precio
			END
		ELSE
			BEGIN
				SET @PMPAnt = ((@Cantidad*@Precio) + (@Estoc*@PMPAnt)) / (@Cantidad + @Estoc)
			END
	END

	/*actualitzo a la taula corresponent*/
	IF (@SerieTipoDoc=''AC'')	
		UPDATE Alb_compra_lineas_lotes SET Pmp_lote = @PMPAnt WHERE id=@Id
	ELSE IF (@SerieTipoDoc=''AL'')	
		UPDATE Alb_liq_lin SET Pmp_lote = @PMPAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''AV'')	
		UPDATE Alb_venta_lineas_lotes SET Pmp_lote = @PMPAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''FS'')	
		UPDATE Facturas_simpl_lineas SET Pmp_lote = @PMPAnt WHERE id=@Id	
	ELSE
		IF (@E_S_N=''S'' AND @SerieTipoDoc<>''AV'' AND @SerieTipoDoc<>''FS'' AND @SerieTipoDoc<>''CPRE'')
			/*actualitzo també el preu en cas de sortides que no siguin ni albarans venta, ni factures simplificades, ni canvis de preu*/
			UPDATE Movimientos SET Pmp_lote = @PMPAnt, Precio = @PMPAnt WHERE id=@Id
		ELSE
			UPDATE Movimientos SET Pmp_lote = @PMPAnt WHERE id=@Id
	/*actualitzo estoc*/
	SET @Estoc=@Estoc+@Cantidad
	/*següent registre*/
	FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
END
CLOSE Tb
DEALLOCATE Tb
COMMIT TRANSACTION
RETURN'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaPMPLote_TodosArticulos]'))
DROP PROCEDURE [dbo].sp_ResaldaPMPLote_TodosArticulos
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaPMPLote_TodosArticulos]  AS
SET NOCOUNT ON
DECLARE @Articulo varchar(15), @Articulo_ACTUAL varchar(15)
DECLARE @Lote varchar(20), @Lote_ACTUAL varchar(20)
DECLARE @Id uniqueidentifier
DECLARE @Estoc decimal(30,6)
DECLARE @PMPLoteAnt decimal(30,6)
DECLARE @PMP decimal(30,6)
DECLARE @PmpLinea decimal(30,6)
DECLARE @SerieTipoDoc nvarchar(4)
DECLARE @FechaConsInv datetime, @FechaCierreInv datetime
DECLARE @Cantidad decimal(30,6), @Precio decimal(30,6), @E_S_N nchar(1), @No_calculo_pmp bit

--busco la data consolidacio
SET @FechaConsInv=(SELECT TOP 1 Fecha_consolidacion_inventario FROM Consolidacion_inventario WITH(NOLOCK)  ORDER BY Fecha_consolidacion_inventario DESC)
--si no hi ha data consolidacio poso una data minima
IF (@FechaConsInv is null)
	SET @FechaConsInv=DATETIMEFROMPARTS( 1900, 12, 31, 23, 59, 59, 0 )
ELSE
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaConsInv),MONTH(@FechaConsInv),DAY(@FechaConsInv),23,59,59,0)

--busco la data tancament inventari
SET @FechaCierreInv=ISNULL((SELECT TOP 1 Fecha_cierre_inv
						FROM V_Movimientos_estoc WITH(NOLOCK)
						WHERE ISNULL(Fecha_cierre_inv,'''')<>''''
						GROUP BY Fecha_cierre_inv
						ORDER BY Fecha_cierre_inv DESC),@FechaConsInv)
--si la data tancament ínventari és superior a la data consilidació, igualo les dates
IF (@FechaCierreInv>@FechaConsInv)
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaCierreInv),MONTH(@FechaCierreInv),DAY(@FechaCierreInv),23,59,59,0)

SET @Articulo_ACTUAL=''''
SET @Lote_ACTUAL=''''

--taula amb moviments temporals
DECLARE @VME table (Articulo nvarchar(15), Lote nvarchar(20), Pmp_Lote decimal(30,6), Estoc decimal(30,6),Pmp decimal(30,6))

INSERT INTO @VME
SELECT Articulo, Lote, Pmp_lote,Pmp,
	ISNULL((SELECT SUM(ISNULL(Cantidad,0))
	FROM V_Movimientos_estoc AS VME WITH(NOLOCK)
	WHERE VME.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103)
	AND  VME.Fecha_cierre_inv Is Not Null
	AND VME.Articulo=tb.Articulo
	AND VME.Lote=tb.Lote),0) As Estoc
FROM
	(SELECT ROW_NUMBER() OVER(PARTITION BY Articulo, Lote
	ORDER BY VME_ES.Fecha_hora DESC, VME_ES.Serie_tipo_mov DESC, VME_ES.Num_movimiento DESC, VME_ES.Linea DESC, VME_ES.E_S_N ASC) AS RowNumber,
	Articulo, Lote, Fecha_hora, Fecha_cierre_inv, Serie_tipo_mov, Num_movimiento, Linea, E_S_N,  Pmp_lote ,Pmp, Cantidad
	FROM V_Movimientos_estoc AS VME_ES WITH(NOLOCK)
	WHERE VME_ES.Fecha_hora <= CONVERT(DATETIME, @FechaConsInv, 103)  AND E_S_N=''E''
	AND  VME_ES.Fecha_cierre_inv Is Not Null) As Tb
WHERE RowNumber=1

--taula temporal amb pmp i estoc
DECLARE @ArtPE table (Codigo nvarchar(15), Lote nvarchar(20), Pmp_Lote decimal(30,6), Estoc decimal(30,6),Pmp decimal(30,6)) 		

INSERT INTO @ArtPE (Codigo, Lote, Pmp_Lote, Estoc,Pmp)
SELECT VME_ES.Articulo, VME_ES.Lote, MAX(ISNULL(VME.Pmp_Lote,0)), MAX(ISNULL(VME.Estoc,0)), MAX(ISNULL(VME.Pmp,0))
FROM V_Movimientos_estoc AS VME_ES WITH(NOLOCK)
LEFT JOIN @VME AS VME
ON VME.Articulo = VME_ES.Articulo
AND VME.Lote = VME_ES.Lote
WHERE VME_ES.Fecha_hora > CONVERT(DATETIME, @FechaConsInv, 103)
AND ISNULL(VME_ES.Fecha_cierre_inv,'''')=''''
GROUP BY VME_ES.Articulo, VME_ES.Lote
ORDER BY VME_ES.Articulo, VME_ES.Lote

DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT V_Movimientos_estoc.Articulo, V_Movimientos_estoc.Lote, V_Movimientos_estoc.Id, V_Movimientos_estoc.SerieTipoDoc, V_Movimientos_estoc.Cantidad, ISNULL(V_Movimientos_estoc.Precio,0) as Precio, V_Movimientos_estoc.E_S_N, Series_albaranes_compra.No_calculo_pmp,Pmp 
									FROM V_Movimientos_estoc WITH(NOLOCK)
									LEFT OUTER JOIN Series_albaranes_compra WITH(NOLOCK)
									ON dbo.V_Movimientos_estoc.SerieTipoDoc = ''AC''
									AND dbo.V_Movimientos_estoc.Serie_tipo_mov = dbo.Series_albaranes_compra.Serie
									WHERE V_Movimientos_estoc.Fecha_hora > CONVERT(DATETIME, @FechaConsInv, 103)
									AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')=''''
									ORDER BY V_Movimientos_estoc.Articulo, V_Movimientos_estoc.Lote, V_Movimientos_estoc.Fecha_hora, V_Movimientos_estoc.Serie_tipo_mov, V_Movimientos_estoc.Num_movimiento, V_Movimientos_estoc.Linea, V_Movimientos_estoc.E_S_N DESC
BEGIN TRANSACTION	
OPEN Tb
FETCH NEXT FROM Tb INTO @Articulo, @Lote, @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp,@PmpLinea
WHILE @@FETCH_STATUS = 0
BEGIN
	--Control cambio artículo
	IF (@Articulo<>@Articulo_ACTUAL or @Lote<>@Lote_ACTUAL)
	BEGIN
		SELECT @PMPLoteAnt=Pmp_Lote, @Estoc=Estoc,@PMP=Pmp FROM @ArtPE WHERE Codigo=@Articulo AND Lote=@Lote
		SET @Articulo_ACTUAL=@Articulo
		SET @Lote_ACTUAL=@Lote
	END
	/*calculo si cal*/
	IF ((@E_S_N=''E'')  AND ISNULL(@No_calculo_pmp,0)=0 AND (@Cantidad+@Estoc) > 0)
	BEGIN
		/*faig el càlcul*/
		IF (@Estoc < 0)
			BEGIN
			/*faig el càlcul*/
			SET @PMPLoteAnt = @Precio
			END
		ELSE
			BEGIN
				SET @PMPLoteAnt = ((@Cantidad*@Precio) + (@Estoc*@PMPLoteAnt)) / (@Cantidad + @Estoc)
			END
	END
	/*SI ES UNA ENTRADA PERO NO TIENE PRECIO AL PMP LOTE SE LE METERA EL PMP VALIDAR CON PEPE*/
	IF ((@E_S_N=''E'' AND @SerieTipoDoc<>''AC'' AND @SerieTipoDoc<>''AL'')  AND ISNULL(@No_calculo_pmp,0)=0 AND ISNULL(@Precio,0)=0 AND @PmpLinea<>0 AND @PMPLoteAnt=0)
	BEGIN

		SET @PMPLoteAnt = @PmpLinea
	END
	/*ESTO ES PARA COGER en las devoluciones si es un lote que no estaba antes y no tiene pmplote ponerle el pmp*/
	IF ((@E_S_N=''S'' AND @Cantidad>0 AND @SerieTipoDoc=''AV'' AND ISNULL(@PMPLoteAnt,0)=0))
	BEGIN
		SET @PMPLoteAnt=@PmpLinea
	END
	/*actualitzo a la taula corresponent*/
	IF (@SerieTipoDoc=''AC'')	
		UPDATE Alb_compra_lineas_lotes SET Pmp_lote = @PMPLoteAnt WHERE id=@Id
	ELSE IF (@SerieTipoDoc=''AL'')	
		UPDATE Alb_liq_lin SET Pmp_lote = @PMPLoteAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''AV'')	
		UPDATE Alb_venta_lineas_lotes SET Pmp_lote = @PMPLoteAnt WHERE id=@Id	
	ELSE IF (@SerieTipoDoc=''FS'')	
		UPDATE Facturas_simpl_lineas SET Pmp_lote = @PMPLoteAnt WHERE id=@Id	
	ELSE
		IF (@E_S_N=''S'' AND @SerieTipoDoc<>''AV'' AND @SerieTipoDoc<>''FS'' AND @SerieTipoDoc<>''CPRE'')
			/*actualitzo també el preu en cas de sortides que no siguin ni albarans venta, ni factures simplificades, ni canvis de preu*/
			UPDATE Movimientos SET Pmp_lote = @PMPLoteAnt, Precio = @PMPLoteAnt WHERE id=@Id
		ELSE
			UPDATE Movimientos SET Pmp_lote = @PMPLoteAnt WHERE id=@Id
	/*actualitzo estoc*/
	SET @Estoc=@Estoc+@Cantidad
	/*següent registre*/
	FETCH NEXT FROM Tb INTO @Articulo, @Lote, @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp,@PmpLinea
END
CLOSE Tb
DEALLOCATE Tb
COMMIT TRANSACTION
RETURN'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaCuentaDesde]'))
DROP PROCEDURE [dbo].sp_ResaldaCuentaDesde
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaCuentaDesde] (@Cuenta varchar(12), @Fecha Datetime) AS 
SET NOCOUNT ON 
DECLARE @SaldoAux float, @EjercicioACTUAL smallint
DECLARE @Ejercicio smallint, @Importe float, @cuenta_debe varchar(12), @cuenta_haber varchar(12), @Saldo float  
DECLARE @IniciarEjercicio bit

SET @IniciarEjercicio=(SELECT iniciar_saldo_ejercicio FROM Asientos_cuentas_contables WHERE Codigo = @Cuenta)

DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT Asientos_cabecera.fk_ejercicio_contable, Asientos_linea.importe, Asientos_linea.fk_cuenta_debe, Asientos_linea.fk_cuenta_haber, Asientos_linea.saldo 
									FROM Asientos_linea
									INNER JOIN Asientos_cabecera
									ON Asientos_cabecera.id=Asientos_linea.fk_asientos_cabecera
									WHERE (fk_cuenta_debe=@Cuenta OR fk_cuenta_haber=@Cuenta)
									AND Asientos_cabecera.fecha >= CONVERT(DATETIME, @Fecha, 103) 
									ORDER BY Asientos_cabecera.fecha, Asientos_cabecera.numero_asiento, Asientos_linea.num_linea
									FOR UPDATE OF saldo 

SELECT TOP 1 @EjercicioACTUAL=ISNULL(Asientos_cabecera.fk_ejercicio_contable,0), @SaldoAux=ISNULL(Asientos_linea.saldo,0)
					FROM Asientos_linea 
					INNER JOIN Asientos_cabecera
					ON Asientos_cabecera.id=Asientos_linea.fk_asientos_cabecera
					WHERE (fk_cuenta_debe=@Cuenta OR fk_cuenta_haber=@Cuenta) 
					AND (Asientos_cabecera.fecha < CONVERT(DATETIME, @Fecha, 103)) 
					ORDER BY Asientos_cabecera.fecha DESC, Asientos_cabecera.numero_asiento DESC, Asientos_linea.num_linea DESC

OPEN Tb 
FETCH NEXT FROM Tb INTO @Ejercicio, @Importe, @cuenta_debe, @cuenta_haber, @Saldo 
WHILE @@FETCH_STATUS = 0 
BEGIN 
	IF (@IniciarEjercicio=1)
		IF (@EjercicioACTUAL<>@Ejercicio)
			BEGIN
				SET @SaldoAux=0
				SET @EjercicioACTUAL=@Ejercicio
			END
	SET @SaldoAux = @SaldoAux + CASE WHEN @cuenta_debe IS NOT NULL THEN @Importe ELSE -@Importe END
	UPDATE Asientos_linea SET saldo=Round(ISNULL(@SaldoAux,0),2) WHERE CURRENT OF Tb 
	FETCH NEXT FROM Tb INTO @Ejercicio, @Importe, @cuenta_debe, @cuenta_haber, @Saldo 
END 
CLOSE Tb 
DEALLOCATE Tb 
RETURN'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaPMPLoteDesde]'))
DROP PROCEDURE [dbo].sp_ResaldaPMPLoteDesde
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaPMPLoteDesde] (@Articulo varchar(15), @Lote nvarchar(20), @Fecha Datetime) AS
SET NOCOUNT ON
DECLARE @Id uniqueidentifier
DECLARE @Estoc decimal(30,6)
DECLARE @PMPAnt decimal(30,6)
DECLARE @SerieTipoDoc nvarchar(4)
DECLARE @FechaConsInv datetime, @FechaCierreInv datetime
DECLARE @Cantidad decimal(30,6), @Precio decimal(30,6), @E_S_N nchar(1), @No_calculo_pmp bit

--busco la data consolidacio
SET @FechaConsInv=(SELECT TOP 1 Fecha_consolidacion_inventario FROM Consolidacion_inventario ORDER BY Fecha_consolidacion_inventario DESC)
--si no hi ha data consolidacio poso una data minima
IF (@FechaConsInv is null)
	SET @FechaConsInv=DATETIMEFROMPARTS( 1900, 12, 31, 23, 59, 59, 0 )
ELSE
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaConsInv),MONTH(@FechaConsInv),DAY(@FechaConsInv),23,59,59,0)

--busco la data tancament inventari
SET @FechaCierreInv=ISNULL((SELECT TOP 1 Fecha_cierre_inv
						FROM V_Movimientos_estoc
						WHERE Articulo = @Articulo
						AND ISNULL(Fecha_cierre_inv,'''')<>''''
						GROUP BY Fecha_cierre_inv
						ORDER BY Fecha_cierre_inv DESC),@FechaConsInv)
--si la data tancament ínventari és superior a la data consilidació, igualo les dates
IF (@FechaCierreInv>@FechaConsInv)
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaCierreInv),MONTH(@FechaCierreInv),DAY(@FechaCierreInv),23,59,59,0)

if (@Fecha<@FechaConsInv) 
	RETURN
ELSE
	BEGIN
		DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT V_Movimientos_estoc.Id, V_Movimientos_estoc.SerieTipoDoc, V_Movimientos_estoc.Cantidad, ISNULL(V_Movimientos_estoc.Precio,0) as Precio, V_Movimientos_estoc.E_S_N, Series_albaranes_compra.No_calculo_pmp
											FROM V_Movimientos_estoc
											LEFT OUTER JOIN Series_albaranes_compra
											ON dbo.V_Movimientos_estoc.SerieTipoDoc = ''AC''
									AND dbo.V_Movimientos_estoc.Serie_tipo_mov = dbo.Series_albaranes_compra.Serie
											WHERE V_Movimientos_estoc.Articulo = @Articulo
											AND V_Movimientos_estoc.Lote = @Lote
											AND V_Movimientos_estoc.Fecha_hora >= CONVERT(DATETIME, @Fecha, 103)
											AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')=''''
											ORDER BY V_Movimientos_estoc.Fecha_hora, V_Movimientos_estoc.Serie_tipo_mov, V_Movimientos_estoc.Num_movimiento, V_Movimientos_estoc.Linea, V_Movimientos_estoc.E_S_N Desc

		SET @PMPAnt=ISNULL((SELECT TOP 1 V_Movimientos_estoc.Pmp_lote
							FROM V_Movimientos_estoc
							WHERE V_Movimientos_estoc.Articulo = @Articulo
							AND V_Movimientos_estoc.Lote = @Lote
							AND V_Movimientos_estoc.Fecha_hora < CONVERT(DATETIME, @Fecha, 103) AND E_S_N=''E''
							ORDER BY V_Movimientos_estoc.Fecha_hora DESC, V_Movimientos_estoc.Serie_tipo_mov DESC, V_Movimientos_estoc.Num_movimiento DESC, V_Movimientos_estoc.Linea DESC, V_Movimientos_estoc.E_S_N ASC),0)

		SET @Estoc=ISNULL((SELECT sum(V_Movimientos_estoc.Cantidad)
							FROM V_Movimientos_estoc
							WHERE V_Movimientos_estoc.Articulo = @Articulo
							AND V_Movimientos_estoc.Lote = @Lote
							AND V_Movimientos_estoc.Fecha_hora < CONVERT(DATETIME, @Fecha, 103)),0)
BEGIN TRANSACTION
		OPEN Tb
		FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
		WHILE @@FETCH_STATUS = 0
		BEGIN
			/*calculo si cal*/
			IF ((@E_S_N=''E'')  AND ISNULL(@No_calculo_pmp,0)=0 AND (@Cantidad+@Estoc) > 0)
			BEGIN
				/*faig el càlcul*/
				IF (@Estoc < 0)
					BEGIN
					/*faig el càlcul*/
					SET @PMPAnt = @Precio
					END
				ELSE
					BEGIN
						SET @PMPAnt = ((@Cantidad*@Precio) + (@Estoc*@PMPAnt)) / (@Cantidad + @Estoc)
					END
			END

			/*actualitzo a la taula corresponent*/
			IF (@SerieTipoDoc=''AC'')	
				UPDATE Alb_compra_lineas_lotes SET Pmp_lote = @PMPAnt WHERE id=@Id
			ELSE IF (@SerieTipoDoc=''AL'')	
				UPDATE Alb_liq_lin SET Pmp_lote = @PMPAnt WHERE id=@Id	
			ELSE IF (@SerieTipoDoc=''AV'')	
				UPDATE Alb_venta_lineas_lotes SET Pmp_lote = @PMPAnt WHERE id=@Id	
			ELSE IF (@SerieTipoDoc=''FS'')	
				UPDATE Facturas_simpl_lineas SET Pmp_lote = @PMPAnt WHERE id=@Id	
			ELSE
				IF (@E_S_N=''S'' AND @SerieTipoDoc<>''AV'' AND @SerieTipoDoc<>''FS'' AND @SerieTipoDoc<>''CPRE'')
					/*actualitzo també el preu en cas de sortides que no siguin ni albarans venta, ni factures simplificades, ni canvis de preu*/
					UPDATE Movimientos SET Pmp_lote = @PMPAnt, Precio = @PMPAnt WHERE id=@Id
				ELSE
					UPDATE Movimientos SET Pmp_lote = @PMPAnt WHERE id=@Id
			/*actualitzo estoc*/
			SET @Estoc=@Estoc+@Cantidad
			/*següent registre*/
			FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
		END
		CLOSE Tb
		DEALLOCATE Tb
		COMMIT TRANSACTION
		RETURN
	END'
GO

IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ResaldaPMPDesde]'))
DROP PROCEDURE [dbo].sp_ResaldaPMPDesde
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ResaldaPMPDesde] (@Articulo varchar(15), @Fecha Datetime) AS
SET NOCOUNT ON
DECLARE @Id uniqueidentifier
DECLARE @Estoc decimal(30,6)
DECLARE @PMPAnt decimal(30,6)
DECLARE @SerieTipoDoc nvarchar(4)
DECLARE @FechaConsInv datetime, @FechaCierreInv datetime
DECLARE @Cantidad decimal(30,6), @Precio decimal(30,6), @E_S_N nchar(1), @No_calculo_pmp bit

--busco la data consolidacio
SET @FechaConsInv=(SELECT TOP 1 Fecha_consolidacion_inventario FROM Consolidacion_inventario ORDER BY Fecha_consolidacion_inventario DESC)
--si no hi ha data consolidacio poso una data minima
IF (@FechaConsInv is null)
	SET @FechaConsInv=DATETIMEFROMPARTS( 1900, 12, 31, 23, 59, 59, 0 )
ELSE
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaConsInv),MONTH(@FechaConsInv),DAY(@FechaConsInv),23,59,59,0)

--busco la data tancament inventari
SET @FechaCierreInv=ISNULL((SELECT TOP 1 Fecha_cierre_inv
						FROM V_Movimientos_estoc
						WHERE Articulo = @Articulo
						AND ISNULL(Fecha_cierre_inv,'''')<>''''
						GROUP BY Fecha_cierre_inv
						ORDER BY Fecha_cierre_inv DESC),@FechaConsInv)
--si la data tancament ínventari és superior a la data consilidació, igualo les dates
IF (@FechaCierreInv>@FechaConsInv)
	SET @FechaConsInv=DATETIMEFROMPARTS(YEAR(@FechaCierreInv),MONTH(@FechaCierreInv),DAY(@FechaCierreInv),23,59,59,0)

if (@Fecha<@FechaConsInv)
	RETURN
ELSE
	BEGIN
		DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT V_Movimientos_estoc.Id, V_Movimientos_estoc.SerieTipoDoc, V_Movimientos_estoc.Cantidad, ISNULL(V_Movimientos_estoc.Precio,0) as Precio, V_Movimientos_estoc.E_S_N, Series_albaranes_compra.No_calculo_pmp
											FROM V_Movimientos_estoc
											LEFT OUTER JOIN Series_albaranes_compra
											ON dbo.V_Movimientos_estoc.SerieTipoDoc = ''AC''
									AND dbo.V_Movimientos_estoc.Serie_tipo_mov = dbo.Series_albaranes_compra.Serie
											WHERE V_Movimientos_estoc.Articulo = @Articulo
											AND V_Movimientos_estoc.Fecha_hora >= CONVERT(DATETIME, @Fecha, 103)
											AND ISNULL(V_Movimientos_estoc.Fecha_cierre_inv,'''')=''''
											ORDER BY V_Movimientos_estoc.Fecha_hora, V_Movimientos_estoc.Serie_tipo_mov, V_Movimientos_estoc.Num_movimiento, V_Movimientos_estoc.Linea, V_Movimientos_estoc.E_S_N Desc

		SET @PMPAnt=ISNULL((SELECT TOP 1 V_Movimientos_estoc.Pmp
							FROM V_Movimientos_estoc
							WHERE V_Movimientos_estoc.Articulo = @Articulo
							AND V_Movimientos_estoc.Fecha_hora < CONVERT(DATETIME, @Fecha, 103) AND E_S_N=''E''
							ORDER BY V_Movimientos_estoc.Fecha_hora DESC, V_Movimientos_estoc.Serie_tipo_mov DESC, V_Movimientos_estoc.Num_movimiento DESC, V_Movimientos_estoc.Linea DESC, V_Movimientos_estoc.E_S_N ASC),0)

		SET @Estoc=ISNULL((SELECT sum(V_Movimientos_estoc.Cantidad)
							FROM V_Movimientos_estoc
							WHERE V_Movimientos_estoc.Articulo = @Articulo
							AND V_Movimientos_estoc.Fecha_hora < CONVERT(DATETIME, @Fecha, 103)),0)
BEGIN TRANSACTION
		OPEN Tb
		FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
		WHILE @@FETCH_STATUS = 0
		BEGIN
			/*calculo si cal*/
			IF ((@E_S_N=''E'')  AND ISNULL(@No_calculo_pmp,0)=0 AND (@Cantidad+@Estoc) > 0)
			BEGIN
				/*faig el càlcul*/
				IF (@Estoc < 0)
					BEGIN
					/*faig el càlcul*/
					SET @PMPAnt = @Precio
					END
				ELSE
					BEGIN
						SET @PMPAnt = ((@Cantidad*@Precio) + (@Estoc*@PMPAnt)) / (@Cantidad + @Estoc)
					END
			END

			/*actualitzo a la taula corresponent*/
			IF (@SerieTipoDoc=''AC'')	
				UPDATE Alb_compra_lineas_lotes SET Pmp = @PMPAnt WHERE id=@Id
			ELSE IF (@SerieTipoDoc=''AL'')	
				UPDATE Alb_liq_lin SET Pmp = @PMPAnt WHERE id=@Id	
			ELSE IF (@SerieTipoDoc=''AV'')	
				UPDATE Alb_venta_lineas_lotes SET Pmp = @PMPAnt WHERE id=@Id	
			ELSE IF (@SerieTipoDoc=''FS'')	
				UPDATE Facturas_simpl_lineas SET Pmp = @PMPAnt WHERE id=@Id	
			ELSE
				UPDATE Movimientos SET Pmp = @PMPAnt WHERE id=@Id
			/*actualitzo estoc*/
			SET @Estoc=@Estoc+@Cantidad
			/*següent registre*/
			FETCH NEXT FROM Tb INTO @Id, @SerieTipoDoc, @Cantidad, @Precio, @E_S_N, @No_calculo_pmp
		END
		CLOSE Tb
		DEALLOCATE Tb
		COMMIT TRANSACTION
		RETURN
	END'
GO


IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_GetInventarioLineasValoradoAFecha') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_GetInventarioLineasValoradoAFecha'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_GetInventarioLineasValoradoAFecha] (@Fecha DATETIME)
				RETURNS TABLE
				AS
				RETURN
				(
				SELECT I.Fecha,I.Fk_articulo,I.Desc_articulo
,PMP.PmpFinal,ESTOC.Cantidad as Cantidad_estoc
,ROUND(ISNULL(ESTOC.Cantidad,0)*ISNULL(PMP.PmpFinal,0),2) as Importe_estoc,I.Cantidad_inventario
,ROUND(ISNULL(I.Cantidad_inventario,0)*ISNULL(PMP.PmpFinal,0),2) as Importe_inventario 
,ROUND(ISNULL(I.Cantidad_inventario,0)*ISNULL(PMP.PmpFinal,0),2)-ROUND(ISNULL(ESTOC.Cantidad,0)*ISNULL(PMP.PmpFinal,0),2) AS Diferencia
,ROUND(ISNULL(I.Cantidad_inventario,0),2)-ROUND(ISNULL(ESTOC.Cantidad,0),2) AS Diferencia_cantidad
 FROM

(SELECT Serie,Numero,Fecha,Fk_articulo,I.Desc_articulo, SUM(Cantidad_real) as Cantidad_inventario
FROM V_InventarioLineas I WHERE CAST(Fecha as date)=CAST(@Fecha as date) GROUP BY Serie,Numero,Fecha,Fk_articulo,Desc_articulo ) I

LEFT OUTER JOIN (SELECT        ISNULL(Articulo, 0) AS Articulo, SUM(ISNULL(Cantidad, 0)) AS Cantidad
FROM            dbo.V_Movimientos_estoc
WHERE        (Fecha_consolidacion_inventario IS NULL) AND CAST(dbo.V_Movimientos_estoc.Fecha_hora as date) <= CAST(@Fecha as date)
GROUP BY Articulo) 
ESTOC ON 
I.Fk_articulo=ESTOC.Articulo


LEFT OUTER JOIN(
SELECT 
		ISNULL(FIN.Articulo,'''') as Articulo, 
		ISNULL (FIN.pmp, 0) as PmpFinal
		FROM
		(select A.Articulo,  T.Fecha_max, A.pmp from
			V_movimientos_estoc A WITH (NOLOCK) 
			inner join
			(select Articulo,  Max(FechaMaxId) as Fecha_max from V_Movimientos_estoc		 WITH (NOLOCK) 
			where 1=1  AND E_S_N=''E'' AND CAST(Fecha_hora as date)<=CAST(@Fecha as date)
			group by articulo) T
			on A.Articulo = T.Articulo  and A.FechaMaxId = T.Fecha_max) FIN
) PMP ON I.Fk_articulo=PMP.Articulo
				)'
GO
IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_Get_EstocParaValidar') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_Get_EstocParaValidar'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_Get_EstocParaValidar] (@stringDocAValidar nvarchar(50),@stringDocsAsociados nvarchar(max),@fechaConsolidacion datetime,@fechaHasta datetime,@soloEnEstoc BIT,@UsarTemporales BIT,@usuarioTemporal nvarchar(30),@stringListaArticulos nvarchar(max))
RETURNS TABLE AS RETURN
(				
	SELECT PRINCIPAL.*
	,Articulos.Descripcion as Desc_articulo
	,Almacenes.Descripcion as Desc_almacen
	,Centros.Descripcion as Desc_centro
	,Lotes.Lote_etiqueta
	,LOTES.Grado
	,LOTES.Añada
	,LOTES.Fecha_caducidad
	,LOTES.Fecha_consumo_preferente
	,LOTES.Fecha_lote
	,LOTES.Grado_oficial
	,LOTES.Fk_ficha_tecnica
	,FT_articulos.Descripcion as Desc_ficha_tecnica
	,LOTES.Fk_persona
	,CLIENTE.NombreCompleto
	FROM
	(
		SELECT E.*,ISNULL(R.Cantidad_reservada,0) AS Cantidad_reservada,E.Cantidad-ISNULL(R.Cantidad_reservada,0) AS Cantidad_disponible,ESTOC_SIN_FECHA.Cantidad as Estoc_sin_fecha_fin FROM
		(
			--CONSULTA ESTOC
			SELECT M.Articulo, M.Almacen, M.Lote, M.Centro, M.Cantidad, M.Fecha_hora
			FROM  
			(
				SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Centro, 0) AS Centro, SUM(ISNULL(Cantidad, 0)) AS Cantidad, MIN(Fecha_hora) AS Fecha_hora, MAX(Fecha_hora)													AS Fecha_ultimo_mov
				FROM
				(
					SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Fk_centro, 0) AS Centro, ISNULL(Cantidad, 0) AS Cantidad, Fecha_hora AS Fecha_hora							
					FROM V_Movimientos_estoc
					WHERE (Fecha_consolidacion_inventario IS NULL)	
					AND Articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
					AND (  @fechaConsolidacion IS NULL OR Fecha_hora>=convert(datetime, @fechaConsolidacion, 103))
					AND (@fechaHasta IS NULL OR  Fecha_hora<=convert(datetime, @fechaHasta, 103))
					AND V_movimientos_estoc.SerieTipoDoc + ''-'' +V_Movimientos_estoc.Serie_tipo_mov+ ''/'' + CAST(V_Movimientos_estoc.Num_movimiento AS nvarchar) NOT IN(@stringDocAValidar)						
					UNION ALL SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Fk_centro, 0) AS Centro, CASE WHEN E_S_N=''S'' THEN  ISNULL(-Cantidad, 0) ELSE ISNULL(Cantidad,0) END  AS Cantidad,Fecha_hora														
					FROM Movimientos_temporales
					WHERE  @UsarTemporales=1 AND No_inventariable=0 AND Usuario=@usuarioTemporal
					AND Articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
					AND Movimientos_temporales.SerieTipoDoc + ''-'' +Movimientos_temporales.Tipo_movimiento + ''/'' + CAST(Movimientos_temporales.Movimiento AS nvarchar) NOT IN (select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)
				) Movs
				GROUP BY Articulo, Almacen, Lote, Centro
				HAVING (@soloEnEstoc=0 OR SUM(ISNULL(Cantidad, 0))<>0)
			)  AS M
		) E
	LEFT OUTER JOIN
		(
			SELECT M.Articulo, M.Almacen, M.Lote, M.Centro, M.Cantidad, M.Fecha_hora
			FROM
			(
				SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Centro, 0) AS Centro, SUM(ISNULL(Cantidad, 0)) AS Cantidad, MIN(Fecha_hora) AS Fecha_hora, MAX(Fecha_hora)														AS Fecha_ultimo_mov
				FROM
				(
					SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Fk_centro, 0) AS Centro, ISNULL(Cantidad, 0) AS Cantidad, Fecha_hora AS Fecha_hora							
					FROM V_Movimientos_estoc
					WHERE (Fecha_consolidacion_inventario IS NULL)
					AND Articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
					AND (@fechaConsolidacion IS NULL OR Fecha_hora>=convert(datetime, @fechaConsolidacion, 103))
					AND V_movimientos_estoc.SerieTipoDoc + ''-'' +V_Movimientos_estoc.Serie_tipo_mov+ ''/'' + CAST(V_Movimientos_estoc.Num_movimiento AS nvarchar) NOT IN(@stringDocAValidar)																						
				) Movs
				GROUP BY Articulo, Almacen, Lote, Centro
				HAVING (SUM(ISNULL(Cantidad, 0))<>0)
			)  AS M
		) ESTOC_SIN_FECHA
		ON  E.Articulo=ESTOC_SIN_FECHA.Articulo
		AND E.Almacen=ESTOC_SIN_FECHA.Almacen
		AND E.Lote=ESTOC_SIN_FECHA.Lote
		AND E.Centro=ESTOC_SIN_FECHA.Centro
	LEFT OUTER JOIN
		(
			--CONSULTA RESERVAS
			SELECT ISNULL(Centro, 0) AS Centro, ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, SUM(Cantidad_reservada) AS Cantidad_reservada
			FROM 
			(
				SELECT Hoja_carga_cabecera.Fk_centro AS Centro, Hoja_carga_linea.Fk_articulo AS Articulo, Hoja_carga_linea.Fk_almacen AS Almacen, Hoja_carga_linea.Lote, SUM(ISNULL(Hoja_carga_linea.Cantidad, 0))											 AS Cantidad_reservada
				FROM Hoja_carga_cabecera 
				INNER JOIN Hoja_carga_linea 
				ON Hoja_carga_cabecera.Id = Hoja_carga_linea.Fk_cabecera 
				AND Hoja_carga_cabecera.Serie = Hoja_carga_linea.Serie 
				AND Hoja_carga_cabecera.Numero = Hoja_carga_linea.Numero
				WHERE (Hoja_carga_cabecera.Estado = 0)
				AND Hoja_carga_linea.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
				AND (Hoja_carga_linea.Fk_almacen IS NOT NULL) 
				AND (Hoja_carga_linea.Lote IS NOT NULL)
				AND ''HC-'' +Hoja_carga_cabecera.Serie+ ''/'' + CAST(Hoja_carga_cabecera.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
				AND ''HC-'' +Hoja_carga_cabecera.Serie+ ''/'' + CAST(Hoja_carga_cabecera.Numero AS nvarchar)<>@stringDocAValidar
				GROUP BY Hoja_carga_cabecera.Fk_centro, Hoja_carga_linea.Fk_articulo, Hoja_carga_linea.Fk_almacen, Hoja_carga_linea.Lote
				UNION ALL SELECT ISNULL(Centro, 0) AS Centro, ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, SUM(Cantidad_reservada) AS Cantidad_reservada
				FROM 
				(
					SELECT ''OP'' AS SerieTipoDoc,LOTES.Fk_serie,LOTES.Numero,lotes.Centro,LOTES.Articulo,LOTES.Almacen,LOTES.Lote,LOTES.Cantidad_reservada AS Cantidad_reservada_origen,PARCIAL.Cantidad_desreservar,(LOTES.Cantidad_reservada - ISNULL(PARCIAL.Cantidad_desreservar,0)) AS Cantidad_reservada 
					FROM 
					(
						SELECT op.Fk_serie,Op.Numero, Op.Fk_centro AS Centro, L.Fk_articulo_componente AS Articulo, L.Fk_almacen AS Almacen, L.Lote, ISNULL(SUM(ISNULL(L.Cantidad, 0)),0) AS Cantidad_reservada
						FROM Op 
						INNER JOIN Op_componentes_lotes L 
						ON Op.Id = L.Fk_op
						WHERE (Op.Estado = 1 OR op.Estado=0 or Op.Estado=2)
						AND L.Fk_articulo_componente IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
						AND L.Lote IS NOT NULL
						AND ''OP-'' +Op.Fk_serie+ ''/'' + CAST(Op.Numero AS nvarchar(100)) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
						AND ''OP-'' +Op.Fk_serie+ ''/'' + CAST(Op.Numero AS nvarchar(100))<>@stringDocAValidar
						GROUP BY op.Fk_serie,Op.Numero,Op.Fk_centro, L.Fk_almacen, L.Fk_articulo_componente, L.Lote
					) LOTES 
					LEFT OUTER JOIN
					(
						SELECT op.Fk_serie,Op.Numero, Op.Fk_centro AS Centro, L.Fk_articulo_componente AS Articulo, L.Fk_almacen AS Almacen, L.Lote, ISNULL(SUM(ISNULL(L.Cantidad, 0)),0) AS Cantidad_desreservar
						FROM Op 
						INNER JOIN	Op_componentes_lotes_real L 
						ON Op.Id = L.Fk_op
						WHERE (Op.Estado = 2 )
						AND L.Fk_articulo_componente IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
						AND L.Lote IS NOT NULL
						GROUP BY op.Fk_serie,Op.Numero,Op.Fk_centro, L.Fk_almacen, L.Fk_articulo_componente, L.Lote
					) PARCIAL 
					ON LOTES.Fk_serie=PARCIAL.Fk_serie 
					AND LOTES.Numero=PARCIAL.Numero 
					AND LOTES.Articulo=PARCIAL.Articulo 
					AND LOTES.Almacen=PARCIAL.Almacen 
					AND LOTES.Lote=PARCIAL.Lote
					AND LOTES.Centro=PARCIAL.Centro
				) A 
				GROUP BY Centro, Articulo, Almacen, Lote
				UNION ALL SELECT Fk_centro AS Centro, Fk_articulo AS Articulo, Almacen, Lote, SUM(ISNULL(Cantidad, 0) - ISNULL(Cantidad_asociada, 0) - ISNULL(Cantidad_cargada, 0)) AS Cantidad_reservada
				FROM
				(
					SELECT Ped_venta.Fk_centro, V_DocLinLotesEstadosPedVenta.Fk_articulo, V_DocLinLotesEstadosPedVenta.Almacen, V_DocLinLotesEstadosPedVenta.Lote, V_DocLinLotesEstadosPedVenta.Cantidad, V_DocLinLotesEstadosPedVenta.Cantidad_asociada, V_DocLinLotesEstadosPedVenta.Cantidad_cargada
					FROM V_DocLinLotesEstadosPedVenta 
					LEFT OUTER JOIN Ped_venta 
					ON V_DocLinLotesEstadosPedVenta.Serie = Ped_venta.Serie
					AND V_DocLinLotesEstadosPedVenta.Numero = Ped_venta.Numero
					AND ''PV-'' +Ped_venta.Serie+ ''/'' + CAST(Ped_venta.Numero AS nvarchar) NOT IN (select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
					AND ''PV-'' +Ped_venta.Serie+ ''/'' + CAST(Ped_venta.Numero AS nvarchar)<>@stringDocAValidar
					WHERE V_DocLinLotesEstadosPedVenta.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
				) AS LotesEstadosPedVenta
				GROUP BY Fk_centro, Fk_articulo, Almacen, Lote
				UNION ALL SELECT Traspasos.Fk_centro_origen AS Centro, Traspasos_lineas.Fk_articulo AS Articulo, Traspasos_lineas.Fk_almacen AS Almacen, Traspasos_lineas.Fk_lote AS Lote, SUM(ISNULL(Traspasos_lineas.Cantidad, 0)) AS Cantidad_reservada
				FROM Traspasos 
				INNER JOIN Traspasos_lineas 
				ON Traspasos.Id = Traspasos_lineas.Fk_traspaso
				WHERE ((Traspasos.Estado = 0) OR (Traspasos.Estado = 1))
				AND Traspasos_lineas.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
				AND ''TC-'' +Traspasos.Fk_serie+ ''/'' + CAST(Traspasos.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
				AND ''TC-'' +Traspasos.Fk_serie+ ''/'' + CAST(Traspasos.Numero AS nvarchar)<>@stringDocAValidar
				GROUP BY Traspasos.Fk_centro_origen, Traspasos_lineas.Fk_articulo, Traspasos_lineas.Fk_almacen, Traspasos_lineas.Fk_lote

				UNION ALL SELECT Copages.Fk_centro AS Centro, Copages_lineas.Fk_articulo AS Articulo, Copages_lineas.Fk_almacen AS Almacen, Copages_lineas.Lote AS Lote, SUM(ISNULL(Copages_lineas.Cantidad, 0)) AS Cantidad_reservada
				FROM Copages
				INNER JOIN Copages_lineas
				ON Copages.Id = Copages_lineas.Fk_cabecera
				WHERE ((Copages.Estado = 0) OR (Copages.Estado = 1))
				AND Copages_lineas.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))				
				AND ''CP-'' +Copages.Fk_serie+ ''/'' + CAST(Copages.Numero AS nvarchar)<>@stringDocAValidar
				GROUP BY Copages.Fk_centro, Copages_lineas.Fk_articulo, Copages_lineas.Fk_almacen, Copages_lineas.Lote
			) AS A
			GROUP BY Centro, Articulo, Almacen, Lote
		) R
		ON E.Centro=R.Centro AND E.Almacen=R.Almacen AND E.Articulo=R.Articulo AND E.Lote=R.Lote
	) AS PRINCIPAL
	LEFT OUTER JOIN Centros ON PRINCIPAL.Centro=Centros.Codigo
	LEFT OUTER JOIN Lotes ON PRINCIPAL.Articulo = Lotes.Fk_articulo AND PRINCIPAL.Lote = Lotes.Lote
	LEFT OUTER JOIN V_Personas CLIENTE ON Lotes.Fk_persona=CLIENTE.Codigo
	LEFT OUTER JOIN FT_articulos ON Lotes.Fk_ficha_tecnica=FT_articulos.Codigo_FT
	LEFT JOIN Articulos ON Articulos.codigo=PRINCIPAL.Articulo
	LEFT JOIN Almacenes ON Almacenes.codigo=PRINCIPAL.almacen
)'
GO

IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_UltimosPreciosEntradaCompraAFecha') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_UltimosPreciosEntradaCompraAFecha'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_UltimosPreciosEntradaCompraAFecha](@AFecha Datetime)
RETURNS Table AS Return (SELECT
	A.Codigo as Articulo,A.Descripcion
	,CASE WHEN A.Tipo_recuperacion_precio=3 THEN ALBS.Precio_alb
	WHEN A.Tipo_recuperacion_precio=1 THEN FACS.Precio_fac
	WHEN A.Tipo_recuperacion_precio=4 THEN CASE WHEN ISNULL(ALBS.Fecha_alb,CAST(''01-01-1900'' as datetime))>ISNULL(FACS.Fecha_fac,CAST(''01-01-1900'' as datetime))  THEN ALBS.Precio_alb ELSE FACS.Precio_fac END
	END as Precio_ultima_compra
	,CASE WHEN A.Tipo_recuperacion_precio=3 THEN ''A''
	WHEN A.Tipo_recuperacion_precio=1 THEN ''F''
	WHEN A.Tipo_recuperacion_precio=4 THEN CASE WHEN ISNULL(ALBS.Fecha_alb,CAST(''01-01-1900'' as datetime))>ISNULL(FACS.Fecha_fac,CAST(''01-01-1900'' as datetime))  THEN ''A'' ELSE ''F'' END
	END as UltPrecioAlbaranOFactura
	,CASE WHEN A.Tipo_recuperacion_precio=3 THEN ALBS.Fecha_alb
	WHEN A.Tipo_recuperacion_precio=1 THEN FACS.Fecha_fac
	WHEN A.Tipo_recuperacion_precio=4 THEN CASE WHEN ISNULL(ALBS.Fecha_alb,CAST(''01-01-1900'' as datetime))>ISNULL(FACS.Fecha_fac,CAST(''01-01-1900'' as datetime))  THEN ALBS.Fecha_alb ELSE FACS.Fecha_fac END
	END as Fecha_ultima_compra	
	,MOVS.Fecha_mov,MOVS.Precio_mov,movs.SerieTipoDoc_mov
	,FACS.Fecha_fac,FACS.Precio_fac,FACS.SerieTipoDoc_fac
	,ALBS.Fecha_alb,ALBS.Precio_alb,ALBS.SerieTipoDoc_alb
	,CASE WHEN ISNULL(MOVS.Fecha_mov,CAST(''01-01-1900'' as datetime))>ISNULL(FACS.Fecha_fac,CAST(''01-01-1900'' as datetime))  THEN MOVS.Precio_mov ELSE FACS.Precio_fac END AS Ult_Precio_general
	,CASE WHEN ISNULL(MOVS.Fecha_mov,CAST(''01-01-1900'' as datetime))>ISNULL(FACS.Fecha_fac,CAST(''01-01-1900'' as datetime)) THEN MOVS.SerieTipoDoc_mov ELSE FACS.SerieTipoDoc_fac END AS SerietipoDoc_general
	FROM
	Articulos A
	LEFT OUTER JOIN
					
		(
			SELECT FINAL.Articulo,FINAL.Precio as Precio_mov,FINAL.Fecha_hora  as Fecha_mov,FINAL.SerieTipoDoc as SerieTipoDoc_mov FROM
			(
			select A.Articulo as Articulo, A.Precio as Precio,A.Fecha_hora,A.SerieTipoDoc, ROW_NUMBER() OVER(PARTITION BY A.Articulo ORDER BY A.Articulo, A.Fecha_hora DESC,A.Num_movimiento DESC,A.Linea DESC) AS Rown
			from
			V_movimientos A WITH (NOLOCK)
			LEFT OUTER JOIN Articulos ON A.Articulo=Articulos.Codigo
			WHERE ((SerieTipoDoc=''OP''  AND A.Cantidad>0 AND E_S_N=''E'') OR  (SerieTipoDoc=''AC''  AND A.Cantidad>0) OR (SerieTipoDoc=''AL'' AND A.Cantidad>0) OR (SerieTipoDoc=''AI'' AND E_S_N=''E'') OR (SerieTipoDoc=''CP'' AND E_S_N=''E''  AND A.Cantidad>0)  OR (SerieTipoDoc=''CPRE'' AND E_S_N=''E''  AND A.Cantidad>0)) AND A.Precio>0 and CAST(A.Fecha_hora AS Date)<=CAST( @AFecha as date)
			) AS FINAL
			WHERE Rown=1
			) MOVS ON MOVS.Articulo=A.Codigo
	LEFT OUTER JOIN
			(SELECT FINAL.Articulo,FINAL.Precio as Precio_fac,FINAL.Fecha_hora as Fecha_fac,''FC'' as SerieTipoDoc_fac FROM
				(
				select A.Fk_articulo as Articulo, A.Precio_bruto as Precio ,A.Fecha_hora, ROW_NUMBER() OVER(PARTITION BY A.Fk_articulo ORDER BY A.Fk_articulo, A.Fecha_hora DESC,A.Numero DESC,A.Linea DESC) AS Rown
				from
				V_Mov_facturas_compra A WITH (NOLOCK)
				LEFT OUTER JOIN Articulos ON A.Fk_articulo=Articulos.Codigo
				WHERE SerieTipoDoc=''FC'' AND A.Cantidad>0 AND A.Precio_bruto>0 and CAST(A.Fecha_hora AS Date)<=CAST( @AFecha as date)
				) AS FINAL
				WHERE Rown=1
				)
				FACS ON FACS.Articulo=A.Codigo
	LEFT OUTER JOIN 
	(
	SELECT FINAL.Articulo,FINAL.Precio as Precio_alb,FINAL.Fecha_hora as Fecha_alb,''AC'' as SerieTipoDoc_alb FROM
			(
			select A.Articulo as Articulo, A.Precio as Precio,A.Fecha_hora,A.Num_movimiento, ROW_NUMBER() OVER(PARTITION BY A.Articulo ORDER BY A.Articulo, A.Fecha_hora DESC,A.Num_movimiento DESC,A.Linea DESC) AS Rown
			from
			V_movimientos A WITH (NOLOCK)
			LEFT OUTER JOIN Articulos ON A.Articulo=Articulos.Codigo
			WHERE SerieTipoDoc=''AC''  AND A.Cantidad>0 AND A.Precio>0 and CAST(A.Fecha_hora AS Date)<=CAST( @AFecha as date)
			) AS FINAL
			WHERE Rown=1
			) ALBS ON ALBS.Articulo=A.Codigo
)'
GO

IF EXISTS(SELECT * FROM sysobjects WHERE id = object_id(N'fn_GetRangoFechas') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_GetRangoFechas'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION  [dbo].[fn_GetRangoFechas] (@R1 datetime,@R2 datetime,@Part varchar(10),@Incr int)
Returns Table AS
Return (
    with cte0(M)   As (Select 1+Case @Part When ''YY'' then DateDiff(YY,@R1,@R2)/@Incr When ''QQ'' then DateDiff(QQ,@R1,@R2)/@Incr When ''MM'' then DateDiff(MM,@R1,@R2)/@Incr When ''WK'' then DateDiff(WK,@R1,@R2)/@Incr When ''DD'' then DateDiff(DD,@R1,@R2)/@Incr When ''HH'' then DateDiff(HH,@R1,@R2)/@Incr When ''MI'' then DateDiff(MI,@R1,@R2)/@Incr When ''SS'' then DateDiff(SS,@R1,@R2)/@Incr End),
         cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
         cte2(N)   As (Select Top (Select M from cte0) Row_Number() over (Order By (Select NULL)) From cte1 a, cte1 b, cte1 c, cte1 d, cte1 e, cte1 f, cte1 g, cte1 h ),
         cte3(N,D) As (Select 0,@R1 Union All Select N,Case @Part When ''YY'' then DateAdd(YY, N*@Incr, @R1) When ''QQ'' then DateAdd(QQ, N*@Incr, @R1) When ''MM'' then DateAdd(MM, N*@Incr, @R1) When ''WK'' then DateAdd(WK, N*@Incr, @R1) When ''DD'' then DateAdd(DD, N*@Incr, @R1) When ''HH'' then DateAdd(HH, N*@Incr, @R1) When ''MI'' then DateAdd(MI, N*@Incr, @R1) When ''SS'' then DateAdd(SS, N*@Incr, @R1) End From cte2 )

    Select RetSeq = N+1
          ,RetVal = D 
     From  cte3,cte0 
     Where D<=@R2
)'
GO
IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'GetPmpEscandallo') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.GetPmpEscandallo'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[GetPmpEscandallo] (@centro integer, @articulo nvarchar(15),@cantidad decimal(15,6))
RETURNS Decimal(15,6)
AS
BEGIN
DECLARE @returnValue as decimal(15,6) = 0;
DECLARE @FkCabecera as UniqueIdentifier;
DECLARE @Pmp as Decimal(15,6);
DECLARE @TipoCoste as Tinyint=0;
DECLARE @cantComp as decimal(15,6)
SET @FkCabecera=(SELECT TOP 1 Id FROM Escandallo_cabecera WITH(NOLOCK) WHERE Fk_articulo=@articulo AND (Fk_centro_habitual IS NULL OR Fk_centro_habitual=@centro) ORDER BY Fk_centro_habitual DESC)
--Si tiene escandallo se hara recursiva y si no se pondrá el pmp actual
IF (@FkCabecera IS NULL)	
	BEGIN
		SET @TipoCoste=(SELECT TOP 1 Tipologia FROM Articulos WHERE Codigo=@articulo);
		IF (@TipoCoste=1)
			BEGIN
				SET @returnValue= ROUND(@cantidad * (SELECT TOP 1 Coste_produccion FROM Articulos WHERE Codigo=@articulo),6);		
			END
		ELSE
			BEGIN
				SET @returnValue=ROUND(@cantidad * (SELECT PMP FROM V_ArticulosPMP WHERE Articulo=@articulo),6);		
			END
	END
ELSE

	BEGIN
		DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT Fk_articulo_inferior as articulo,cantidad FROM Escandallo_linea WHERE Fk_escandallo_cabecera=@FkCabecera
		OPEN Tb
		FETCH NEXT FROM Tb INTO @articulo, @cantComp
		WHILE @@FETCH_STATUS = 0
		BEGIN
			SET @returnValue= @returnValue + ROUND(@cantidad * ISNULL(dbo.GetPmpEscandallo(@centro,@articulo,@cantComp),0),6) ;
			
			FETCH NEXT FROM Tb INTO @articulo, @cantComp
		END
		CLOSE Tb
		DEALLOCATE Tb

	END

 
RETURN @returnValue;
END'
GO
IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_Get_EstocArticulo') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_Get_EstocArticulo'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_Get_EstocArticulo] (@stringDocAValidar nvarchar(50),@stringDocsAsociados nvarchar(max),@fechaConsolidacion datetime,@fechaHasta datetime,@soloEnEstoc BIT,@UsarTemporales BIT,@usuarioTemporal nvarchar(30),@articulo nvarchar(15))
				RETURNS TABLE
				AS
				RETURN
				(


				SELECT PRINCIPAL.*

 FROM
(
	SELECT E.*,Lotes.Lote_etiqueta,ISNULL(R.Cantidad_reservada,0) AS Cantidad_reservada,E.Cantidad-ISNULL(R.Cantidad_reservada,0) AS Cantidad_disponible FROM
	(
			--CONSULTA ESTOC
			SELECT        M.Articulo, M.Almacen, M.Lote, M.Centro, M.Cantidad, M.Fecha_hora
			FROM            (
				SELECT        ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Centro, 0) AS Centro, SUM(ISNULL(Cantidad, 0)) AS Cantidad, MIN(Fecha_hora) AS Fecha_hora, MAX(Fecha_hora)
														AS Fecha_ultimo_mov
							  FROM   (
							
							  SELECT ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Fk_centro, 0) AS Centro, ISNULL(Cantidad, 0) AS Cantidad, Fecha_hora AS Fecha_hora			
								FROM dbo.V_MiniMovsEstoc
								  WHERE     (@articulo IS NULL OR  Articulo=@articulo)
								
								  AND (  @fechaConsolidacion IS NULL OR Fecha_hora>=convert(datetime, @fechaConsolidacion, 103))
                   AND (@fechaHasta IS NULL OR  Fecha_hora<=convert(datetime, @fechaHasta, 103))
								  AND ID_Mov NOT IN(@stringDocAValidar)						
								
								   UNION ALL

								
										SELECT        ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Fk_centro, 0) AS Centro
										, CASE WHEN E_S_N=''S'' THEN  ISNULL(-Cantidad, 0) ELSE ISNULL(Cantidad,0) END  AS Cantidad,Fecha_hora
														
									  FROM            dbo.Movimientos_temporales
									  WHERE  @UsarTemporales=1 AND No_inventariable=0 AND Usuario=@usuarioTemporal and (@articulo IS NULL OR  Articulo=@articulo)
									  AND dbo.Movimientos_temporales.SerieTipoDoc + ''-'' +dbo.Movimientos_temporales.Tipo_movimiento + ''/'' + CAST(dbo.Movimientos_temporales.Movimiento AS nvarchar) NOT IN (select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)
							) Movs

							 GROUP BY Articulo, Almacen, Lote, Centro
							 HAVING (@soloEnEstoc=0 OR SUM(ISNULL(Cantidad, 0))<>0)
							  )  AS M
	) E
	
	LEFT OUTER JOIN

	(
		--CONSULTA RESERVAS
		SELECT        ISNULL(Centro, 0) AS Centro, ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, SUM(Cantidad_reservada) AS Cantidad_reservada
		FROM            (

					SELECT        dbo.Hoja_carga_cabecera.Fk_centro AS Centro, dbo.Hoja_carga_linea.Fk_articulo AS Articulo, dbo.Hoja_carga_linea.Fk_almacen AS Almacen, dbo.Hoja_carga_linea.Lote, SUM(ISNULL(dbo.Hoja_carga_linea.Cantidad, 0))
											 AS Cantidad_reservada
					FROM            dbo.Hoja_carga_cabecera INNER JOIN
											 dbo.Hoja_carga_linea ON dbo.Hoja_carga_cabecera.Id = dbo.Hoja_carga_linea.Fk_cabecera AND dbo.Hoja_carga_cabecera.Serie = dbo.Hoja_carga_linea.Serie AND
											 dbo.Hoja_carga_cabecera.Numero = dbo.Hoja_carga_linea.Numero
					WHERE        (dbo.Hoja_carga_cabecera.Estado = 0) AND (dbo.Hoja_carga_linea.Fk_almacen IS NOT NULL) AND (dbo.Hoja_carga_linea.Lote IS NOT NULL) and (@articulo IS NULL OR  dbo.Hoja_carga_linea.Fk_articulo=@articulo)
								AND ''HC-'' +dbo.Hoja_carga_cabecera.Serie+ ''/'' + CAST(dbo.Hoja_carga_cabecera.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
								AND ''HC-'' +dbo.Hoja_carga_cabecera.Serie+ ''/'' + CAST(dbo.Hoja_carga_cabecera.Numero AS nvarchar)<>@stringDocAValidar
					GROUP BY dbo.Hoja_carga_cabecera.Fk_centro, dbo.Hoja_carga_linea.Fk_articulo, dbo.Hoja_carga_linea.Fk_almacen, dbo.Hoja_carga_linea.Lote

											  UNION ALL

											  SELECT        ISNULL(Centro, 0) AS Centro, ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, SUM(Cantidad_reservada) AS Cantidad_reservada
					FROM(
					SELECT ''OP'' AS SerieTipoDoc,LOTES.Fk_serie,LOTES.Numero,lotes.Centro,LOTES.Articulo,LOTES.Almacen,LOTES.Lote,LOTES.Cantidad_reservada AS Cantidad_reservada_origen
					,PARCIAL.Cantidad_desreservar,(LOTES.Cantidad_reservada - ISNULL(PARCIAL.Cantidad_desreservar,0)) AS Cantidad_reservada FROM
					(
					SELECT        dbo.op.Fk_serie,dbo.Op.Numero, dbo.Op.Fk_centro AS Centro, L.Fk_articulo_componente AS Articulo, L.Fk_almacen AS Almacen, L.Lote,
											 ISNULL(SUM(ISNULL(L.Cantidad, 0)),0) AS Cantidad_reservada
					FROM            dbo.Op INNER JOIN
											 dbo.Op_componentes_lotes L ON dbo.Op.Id = L.Fk_op
						
					WHERE        (dbo.Op.Estado = 1 OR dbo.op.Estado=0 or dbo.Op.Estado=2) AND L.Lote IS NOT NULL  and L.Fk_articulo_componente=@articulo
						AND ''OP-'' +dbo.Op.Fk_serie+ ''/'' + CAST(dbo.Op.Numero AS nvarchar(100)) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
						AND ''OP-'' +dbo.Op.Fk_serie+ ''/'' + CAST(dbo.Op.Numero AS nvarchar(100))<>@stringDocAValidar
					GROUP BY dbo.op.Fk_serie,dbo.Op.Numero,dbo.Op.Fk_centro, L.Fk_almacen, L.Fk_articulo_componente, L.Lote
					) LOTES LEFT OUTER JOIN
					(
					SELECT       dbo.op.Fk_serie,dbo.Op.Numero, dbo.Op.Fk_centro AS Centro, L.Fk_articulo_componente AS Articulo, L.Fk_almacen AS Almacen, L.Lote,
											 ISNULL(SUM(ISNULL(L.Cantidad, 0)),0) AS Cantidad_desreservar
					FROM            dbo.Op INNER JOIN
											 dbo.Op_componentes_lotes_real L ON dbo.Op.Id = L.Fk_op
						
					WHERE        (dbo.Op.Estado = 2 ) AND L.Lote IS NOT NULL  and L.Fk_articulo_componente=@articulo
					GROUP BY dbo.op.Fk_serie,dbo.Op.Numero,dbo.Op.Fk_centro, L.Fk_almacen, L.Fk_articulo_componente, L.Lote
					) PARCIAL ON LOTES.Fk_serie=PARCIAL.Fk_serie AND LOTES.Numero=PARCIAL.Numero AND LOTES.Articulo=PARCIAL.Articulo AND LOTES.Almacen=PARCIAL.Almacen AND LOTES.Lote=PARCIAL.Lote
					) A GROUP BY Centro, Articulo, Almacen, Lote


											  UNION ALL

											  SELECT        Fk_centro AS Centro, Fk_articulo AS Articulo, Almacen, Lote, SUM(ISNULL(Cantidad, 0) - ISNULL(Cantidad_asociada, 0) - ISNULL(Cantidad_cargada, 0)) AS Cantidad_reservada
					FROM            (SELECT        dbo.Ped_venta.Fk_centro, dbo.V_DocLinLotesEstadosPedVenta.Fk_articulo, dbo.V_DocLinLotesEstadosPedVenta.Almacen, dbo.V_DocLinLotesEstadosPedVenta.Lote, dbo.V_DocLinLotesEstadosPedVenta.Cantidad,
																		dbo.V_DocLinLotesEstadosPedVenta.Cantidad_asociada, dbo.V_DocLinLotesEstadosPedVenta.Cantidad_cargada
											  FROM            dbo.V_DocLinLotesEstadosPedVenta LEFT OUTER JOIN
																		dbo.Ped_venta ON dbo.V_DocLinLotesEstadosPedVenta.Serie = dbo.Ped_venta.Serie AND  (@articulo IS NULL OR  dbo.V_DocLinLotesEstadosPedVenta.Fk_articulo=@articulo)
																		AND dbo.V_DocLinLotesEstadosPedVenta.Numero = dbo.Ped_venta.Numero
																		AND ''PV-'' +dbo.Ped_venta.Serie+ ''/'' + CAST(dbo.Ped_venta.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
																		AND ''PV-'' +dbo.Ped_venta.Serie+ ''/'' + CAST(dbo.Ped_venta.Numero AS nvarchar)<>@stringDocAValidar
																		) AS LotesEstadosPedVenta
					GROUP BY Fk_centro, Fk_articulo, Almacen, Lote

											  UNION ALL

											  SELECT        dbo.Traspasos.Fk_centro_origen AS Centro, dbo.Traspasos_lineas.Fk_articulo AS Articulo, dbo.Traspasos_lineas.Fk_almacen AS Almacen, dbo.Traspasos_lineas.Fk_lote AS Lote, SUM(ISNULL(dbo.Traspasos_lineas.Cantidad,
											 0)) AS Cantidad_reservada
					FROM            dbo.Traspasos INNER JOIN
											 dbo.Traspasos_lineas ON dbo.Traspasos.Id = dbo.Traspasos_lineas.Fk_traspaso
					WHERE        ((dbo.Traspasos.Estado = 0) OR (dbo.Traspasos.Estado = 1))  and  (@articulo IS NULL OR  dbo.Traspasos_lineas.Fk_articulo=@articulo)
					AND ''TC-'' +dbo.Traspasos.Fk_serie+ ''/'' + CAST(dbo.Traspasos.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
													AND ''TC-'' +dbo.Traspasos.Fk_serie+ ''/'' + CAST(dbo.Traspasos.Numero AS nvarchar)<>@stringDocAValidar
					GROUP BY dbo.Traspasos.Fk_centro_origen, dbo.Traspasos_lineas.Fk_articulo, dbo.Traspasos_lineas.Fk_almacen, dbo.Traspasos_lineas.Fk_lote

					) AS A
					
					
					GROUP BY Centro, Articulo, Almacen, Lote
	) R
	ON E.Centro=R.Centro AND E.Almacen=R.Almacen AND E.Articulo=R.Articulo AND E.Lote=R.Lote
	LEFT OUTER JOIN Lotes ON E.Articulo=Lotes.Fk_articulo AND E.lote=Lotes.Lote
	)
	AS PRINCIPAL

				)'
GO

IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_AnalisisRepresentantesPeriodo') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_AnalisisRepresentantesPeriodo'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_AnalisisRepresentantesPeriodo] (@PERIODO nvarchar(50),@FECHA_INICIO datetime, @FECHA_FIN datetime)  
RETURNS TABLE
AS
RETURN
(SELECT @PERIODO AS Periodo, Codigo, Razon_social,
	--Clientes
	(SELECT COUNT(*) AS NCli FROM Personas
		WHERE Fk_representante1 = REP.Codigo OR Fk_representante2 = REP.Codigo) AS Clientes,
	--NuevosClientes
	(SELECT COUNT(*) AS NCli FROM Personas
		WHERE Fecha_alta>=@FECHA_INICIO AND Fecha_alta<=@FECHA_FIN AND (Fk_representante1 = REP.Codigo OR Fk_representante2 = REP.Codigo)) AS NuevosClientes,
	--Pedidos
	(SELECT COUNT(*) FROM Ped_Venta
	WHERE Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN AND (Representante1 =REP.Codigo OR Representante2 =REP.Codigo)) AS Pedidos,
	--PedidosNuevosClientes
	(SELECT COUNT(*) FROM Ped_Venta
	WHERE Codigo_cliente IN (SELECT Codigo FROM Personas WHERE Fecha_alta>=@FECHA_INICIO AND Fecha_alta<=@FECHA_FIN AND (Fk_representante1 = REP.Codigo OR Fk_representante2 = REP.Codigo))
	AND (Ped_venta.Representante1 =REP.Codigo OR Ped_venta.Representante2 =REP.Codigo)
	AND Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN) AS PedidosNuevosClientes,
	--PedidosAntiguosClientes
	(SELECT COUNT(*) FROM Ped_Venta
	WHERE Codigo_cliente NOT IN (SELECT Codigo FROM Personas WHERE Fecha_alta>=@FECHA_INICIO AND Fecha_alta<=@FECHA_FIN AND (Fk_representante1 = REP.Codigo OR Fk_representante2 = REP.Codigo))
	AND (Ped_venta.Representante1 =REP.Codigo OR Ped_venta.Representante2 =REP.Codigo)
	AND Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN) AS PedidosAntiguosClientes,
	--Visitas
	(SELECT COUNT (*) FROM Incidencia WHERE Incidencia.Fk_usuario=REP.Codigo AND Incidencia.Visita=1 AND Fecha_inicio>=@FECHA_INICIO AND Fecha_inicio<=@FECHA_FIN) AS Visitas,
	--VisitasAntiguosClientes
	(SELECT COUNT (*) FROM Incidencia
		WHERE Incidencia.Fk_usuario=REP.Codigo AND Incidencia.Visita=1
		AND Fecha_inicio>=@FECHA_INICIO AND Fecha_inicio<=@FECHA_FIN
		AND Fk_cliente NOT IN (SELECT Codigo FROM Personas WHERE Fecha_alta>=@FECHA_INICIO AND Fecha_alta<=@FECHA_FIN AND (Fk_representante1 = REP.Codigo OR Fk_representante2 = REP.Codigo))
		) AS VisitasAntiguosClientes,
	--Dias
	(SELECT DATEDIFF(day, @FECHA_INICIO, @FECHA_FIN)) AS Dias,
	--Unidades
	(SELECT SUM(PL.Cantidad) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN
	AND (Representante1 =REP.Codigo OR Representante2 =REP.Codigo)) AS Unidades,
	--Cajas
	(SELECT SUM(PL.Bultos) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN
	AND (Representante1 =REP.Codigo OR Representante2 =REP.Codigo)) AS Cajas,
	--ImporteVentas
	(SELECT SUM(PL.Importe_base) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN
	AND (Representante1 =REP.Codigo OR Representante2 =REP.Codigo)) AS ImporteVentas,
	--ImporteMedioVentas
	(SELECT SUM(PL.Importe_base)/COUNT(DISTINCT P.Id) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO AND Fecha_hora<=@FECHA_FIN
	AND (Representante1 =REP.Codigo OR Representante2 =REP.Codigo)) AS ImporteMedioVentas
FROM            Personas AS REP
WHERE        (ISNULL(Representante, 0) = 1)
)'
GO

IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_AnalisisClientesPeriodo') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_AnalisisClientesPeriodo'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_AnalisisClientesPeriodo] (@PERIODO nvarchar(50),@FECHA_INICIO datetime, @FECHA_FIN datetime)  
RETURNS TABLE
AS
RETURN
(SELECT @PERIODO AS Periodo, CLI.Codigo AS CodigoCliente, CLI.Razon_social AS NombreCliente, 
	REP.Codigo AS CodigoRepre, REP.Razon_social AS NombreRepre, CLI.Frecuencia_preferente_visita_comercial AS FrecuenciaVisita,
	--Dias
	(SELECT DATEDIFF(day, @FECHA_INICIO, @FECHA_FIN)) AS Dias,
	--VisitasPeriodo
	(SELECT COUNT (*) FROM Incidencia WHERE Fk_cliente=CLI.Codigo AND Visita=1 AND Fecha_inicio>=@FECHA_INICIO AND Fecha_inicio<=@FECHA_FIN) AS VisitasPeriodo,
	--VisitasSegunFrecuencia
	(SELECT DATEDIFF(day, @FECHA_INICIO, @FECHA_FIN) / CLI.Frecuencia_preferente_visita_comercial) AS VisitasSegunFrecuencia,
	--FechaUltimaVisita
	(SELECT TOP 1 Fecha_inicio FROM Incidencia WHERE Fk_cliente=CLI.Codigo AND Visita=1 ORDER BY Fecha_inicio DESC) AS FechaUltimaVisita,
	--FechaUltimoPedido
	(SELECT TOP 1 Fecha_hora FROM Ped_venta	WHERE Codigo_cliente=CLI.Codigo	ORDER BY Fecha_hora DESC) AS FechaUltimoPedido,
	--DiasUltimoPedido
	(SELECT DATEDIFF(DAY, (SELECT TOP 1 Fecha_hora FROM Ped_venta WHERE Codigo_cliente=CLI.Codigo ORDER BY Fecha_hora DESC),GETDATE())) AS DiasUltimoPedido,
	--Unidades Repre
	(SELECT SUM(PL.Cantidad) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo
	AND (P.Representante1=REP.Codigo or P.Representante2=REP.Codigo)) AS UnidadesRepre,
	--Unidades Otros
	(SELECT SUM(PL.Cantidad) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo
	AND (ISNULL(P.Representante1,'''')<>REP.Codigo AND ISNULL(P.Representante2,'''')<>REP.Codigo)) AS UnidadesOtros,
	--Unidades Total
	(SELECT SUM(PL.Cantidad) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo) AS UnidadesTotal,
	--Cajas Repre
	(SELECT SUM(PL.Bultos) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo
	AND (P.Representante1=REP.Codigo or P.Representante2=REP.Codigo)) AS CajasRepre,
	--Cajas Otros
	(SELECT SUM(PL.Bultos) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo
	AND (ISNULL(P.Representante1,'''')<>REP.Codigo AND ISNULL(P.Representante2,'''')<>REP.Codigo)) AS CajasOtros,
	--Cajas Total
	(SELECT SUM(PL.Bultos) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo) AS CajasTotal,
	--ImporteVentasRepre
	(SELECT SUM(PL.Importe_base) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo
	AND (P.Representante1=REP.Codigo or P.Representante2=REP.Codigo)) AS ImporteVentasRepre,
	--ImporteVentasOtros
	(SELECT SUM(PL.Importe_base) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo
	AND (ISNULL(P.Representante1,'''')<>REP.Codigo AND ISNULL(P.Representante2,'''')<>REP.Codigo)) AS ImporteVentasOtros,
	--ImporteVentasTotal
	(SELECT SUM(PL.Importe_base) FROM Ped_Venta P
	INNER JOIN Ped_venta_lineas PL
	ON PL.Serie=P.Serie
	AND PL.Numero=P.Numero
	INNER JOIN Articulos A
	ON A.Codigo=PL.Fk_articulo
	WHERE A.disponible_est_repre=1
	AND Fecha_hora>=@FECHA_INICIO
	AND Fecha_hora<=@FECHA_FIN
	AND Codigo_cliente=CLI.Codigo) AS ImporteVentasTotal
FROM Personas AS CLI
INNER JOIN Personas REP
ON REP.Codigo=CLI.Fk_representante1
WHERE ISNULL(CLI.Cliente, 0) = 1
)'
GO
IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_Get_V_estoc_articulo]'))
DROP PROCEDURE [dbo].sp_Get_V_estoc_articulo
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_Get_V_estoc_articulo] (@Parametros nvarchar(max))
AS
BEGIN
	--Creamos una tabla temporal por simplificar el trabajo
	--y almacenar los parametros que vayamos obteniendo
	CREATE TABLE #parametros (parametro varchar(1000))
	SET NOCOUNT ON
	--El separador de nuestros parametros sera una ,
	DECLARE @Posicion int
	--@Posicion es la posicion de cada uno de nuestros separadores
	DECLARE @Parametro varchar(1000)
	--@Parametro es cada uno de los valores obtenidos
	--que almacenaremos en #parametros
	SET @Parametros = @Parametros + '',''
	--Colocamos un separador al final de los parametros
	--para que funcione bien nuestro codigo
	--Hacemos un bucle que se repite mientras haya separadores
	WHILE patindex(''%,%'' , @Parametros) <> 0
	--patindex busca un patron en una cadena y nos devuelve su posicion
	BEGIN
	  SELECT @Posicion =  patindex(''%,%'' , @Parametros)
	  --Buscamos la posicion de la primera ,
	  SELECT @Parametro = left(@Parametros, @Posicion - 1)
	  --Y cogemos los caracteres hasta esa posicion
	  INSERT INTO #parametros values (@Parametro)
	  --y ese parámetro lo guardamos en la tabla temporal
	  --Reemplazamos lo procesado con nada con la funcion stuff
	  SELECT @Parametros = stuff(@Parametros, 1, @Posicion, '''')
	END
	--Si no hi ha parametres només queda un registre en blanc, el borro
	IF ((SELECT COUNT(*) FROM #parametros)=1 AND (SELECT TOP 1 parametro FROM #parametros)='''') DELETE FROM #Parametros
	--Y cuando se han recorrido todos los parametros sacamos por pantalla el resultado
	SELECT Fk_centro, Centros.Descripcion AS Desc_centro, Articulo, ISNULL(Art.Descripcion,'''') AS Descripcion, Articulos_tipos.Descripcion AS Desc_tipo_articulo,
	Cantidad, C_reservada_venta, C_pedida_a_prov, C_reservada_produccion, C_prevista_prod, ISNULL(Art.Estoc_minimo, 0) AS Estoc_minimo, ISNULL(Art.Estoc_maximo, 0) AS Estoc_maximo,
	Cantidad_disponible, Cantidad_virtual_futura,
	CAST((CASE WHEN Cantidad_por_bulto <> 0 THEN Cantidad_disponible / cantidad_por_bulto ELSE 0 END) AS decimal(15, 2)) AS Bultos_disponible,
	CAST((CASE WHEN cantidad_por_bulto <> 0 THEN Cantidad / cantidad_por_bulto ELSE 0 END) AS decimal(15, 2)) AS Bultos_actual,
	CAST((CASE WHEN cantidad_por_bulto <> 0 THEN Cantidad_virtual_futura / cantidad_por_bulto ELSE 0 END) AS decimal(15, 2)) AS Bultos_futura
	FROM
		(SELECT A.Fk_centro, A.Articulo, A.Cantidad, ISNULL(B.C_reservada_venta, 0) AS C_reservada_venta, ISNULL(C.C_pedida_a_prov, 0) AS C_pedida_a_prov,
			ISNULL(D.Cantidad_reservada_produccion, 0) AS C_reservada_produccion, ISNULL(E.Cantidad_prevista_prod, 0) AS C_prevista_prod,
			A.Cantidad - ISNULL(D.Cantidad_reservada_produccion, 0) - ISNULL(B.C_reservada_venta, 0) AS Cantidad_disponible,
			A.Cantidad + ISNULL(C.C_pedida_a_prov, 0) + ISNULL(E.Cantidad_prevista_prod, 0) - ISNULL(D.Cantidad_reservada_produccion, 0) - ISNULL(B.C_reservada_venta, 0) AS Cantidad_virtual_futura
		FROM
			(
				SELECT ISNULL(Fk_centro, N'''') AS Fk_centro, Articulo, SUM(ISNULL(Cantidad, 0)) AS Cantidad
				FROM V_MiniMovsEstoc WITH (NOLOCK)
				WHERE ((SELECT COUNT(*) FROM #parametros)=0 OR Articulo IN (SELECT * FROM #parametros))
				GROUP BY Fk_centro, Articulo
			) AS A
		LEFT OUTER JOIN
			(SELECT Fk_centro, Fk_articulo, SUM(ISNULL(Cantidad_pendiente, 0)) AS C_reservada_venta	FROM V_DocLinEstadosPedVenta  WITH (NOLOCK)
			WHERE ((SELECT COUNT(*) FROM #parametros)=0 OR Fk_articulo IN (SELECT * FROM #parametros))
			GROUP BY Fk_centro, Fk_articulo) AS B
		ON A.Articulo = B.Fk_articulo
		AND A.Fk_centro = B.Fk_centro
		LEFT OUTER JOIN
			(SELECT Fk_centro, Fk_articulo, SUM(ISNULL(Cantidad_pendiente, 0)) AS C_pedida_a_prov FROM V_DocLinEstadosPedCompra  WITH (NOLOCK)
			WHERE ((SELECT COUNT(*) FROM #parametros)=0 OR Fk_articulo IN (SELECT * FROM #parametros))
			GROUP BY Fk_centro, Fk_articulo) AS C
		ON A.Articulo = C.Fk_articulo
		AND A.Fk_centro = C.Fk_centro
		LEFT OUTER JOIN
			(SELECT OPRES.Fk_centro, OPRES.Fk_articulo_componente, OPRES.Cantidad_reservada_produccion - ISNULL(OPREAL.Cantidad_realizada, 0) AS Cantidad_reservada_produccion
				FROM
					(SELECT Op.Fk_centro, Op_Componentes.Fk_articulo_componente, SUM(ISNULL(Op_Componentes.Cantidad, 0)) AS Cantidad_reservada_produccion
						FROM Op  WITH (NOLOCK)
						INNER JOIN Op_Componentes
						ON Op.Id = Op_Componentes.Fk_op
						WHERE (Op.Estado = 0) OR (Op.Estado = 1) OR (Op.Estado = 2)
						AND ((SELECT COUNT(*) FROM #parametros)=0 OR Op_Componentes.Fk_articulo_componente IN (SELECT * FROM #parametros))
						GROUP BY Op.Fk_centro, Op_Componentes.Fk_articulo_componente) AS OPRES
				LEFT OUTER JOIN
					(SELECT Op_2.Fk_centro, lr.Fk_articulo_componente, SUM(lr.Cantidad) AS Cantidad_realizada
						FROM Op AS Op_2   WITH (NOLOCK)
						INNER JOIN Op_componentes_lotes_real AS lr
						ON Op_2.Id = lr.Fk_op
						WHERE (Op_2.Estado = 2)
						AND ((SELECT COUNT(*) FROM #parametros)=0 OR lr.Fk_articulo_componente IN (SELECT * FROM #parametros))
						GROUP BY Op_2.Fk_centro, lr.Fk_articulo_componente) AS OPREAL
				ON OPRES.Fk_centro = OPREAL.Fk_centro
				AND OPRES.Fk_articulo_componente = OPREAL.Fk_articulo_componente) AS D
		ON A.Articulo = D.Fk_articulo_componente
		AND A.Fk_centro = D.Fk_centro
		LEFT OUTER JOIN
			(SELECT Fk_centro, Fk_articulo, SUM(ISNULL(Cantidad, 0) - ISNULL(Cantidad_real, 0)) AS Cantidad_prevista_prod
			FROM Op AS Op_1 WITH (NOLOCK)
			WHERE Estado <> 3 AND Estado <> 4
			AND ((SELECT COUNT(*) FROM #parametros)=0 OR Fk_articulo IN (SELECT * FROM #parametros))
			GROUP BY Fk_centro, Fk_articulo) AS E
		ON A.Articulo = E.Fk_articulo
		AND A.Fk_centro = E.Fk_centro
		) AS cons
	LEFT OUTER JOIN Articulos AS Art WITH (NOLOCK)
	ON Art.Codigo=cons.Articulo
	LEFT OUTER JOIN Articulos_tipos WITH (NOLOCK)
	ON Art.Fk_articulo_tipo = Articulos_tipos.Codigo
	LEFT OUTER JOIN Centros  WITH (NOLOCK)
	ON Centros.Codigo = cons.Fk_centro
	WHERE ((SELECT COUNT(*) FROM #parametros)=0 OR Articulo IN (SELECT * FROM #parametros))
	SET NOCOUNT OFF
END
RETURN'
GO
IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_Get_EstocParaValidar]'))
DROP PROCEDURE [dbo].sp_Get_EstocParaValidar
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_Get_EstocParaValidar](@stringDocAValidar nvarchar(50),@stringDocsAsociados nvarchar(max),@fechaConsolidacion datetime,@fechaHasta datetime, @stringListaArticulos nvarchar(max))
AS
BEGIN
	SET NOCOUNT ON;

--Objecte auxiliar de V_MiniMovsEstoc segons llista articles
DECLARE @MovsAux AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL,
 Fecha_hora datetime NULL,
 Id_Mov nvarchar(30) NULL
 )
INSERT INTO @MovsAux (Articulo, Almacen, Lote, Centro, Cantidad, Fecha_hora, Id_Mov)
SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Fk_centro, 0) AS Centro, ISNULL(Cantidad, 0) AS Cantidad, Fecha_hora, Id_Mov
FROM V_MiniMovsEstoc WITH (NOLOCK)
WHERE Articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))

--Objecte auxiliar de V_DocLinLotesEstadosPedVenta segons llista articles
DECLARE @EstAux AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL,
 Cantidad_asociada  decimal(25, 6) NOT NULL,
 Cantidad_cargada  decimal(25, 6) NOT NULL
 )
INSERT INTO @EstAux (Articulo, Almacen, Lote, Centro, Cantidad, Cantidad_asociada, Cantidad_cargada)
SELECT EA.Fk_articulo, EA.Almacen, EA.Lote, Ped_venta.Fk_centro, EA.Cantidad, EA.Cantidad_asociada, EA.Cantidad_cargada
FROM 
	(
		--V_DocLinLotesEstadosPedVenta
		SELECT VDLLE.Fk_articulo, VDLLE.Almacen, VDLLE.Lote, VDLEPV.Fk_centro, VDLLE.Cantidad, VDLLE.Cantidad_asociada, VDLLE.Serie, VDLLE.Numero
		, ISNULL((SELECT SUM(ISNULL(Cantidad, 0)) AS Expr1 FROM Hoja_carga_linea WHERE (Fk_linea_ped_asociado = VDLLE.Id) AND (Fk_articulo = VDLLE.Fk_articulo) AND (Lote = VDLLE.Lote)), 0) AS Cantidad_cargada
		FROM V_DocLinLotesEstados AS VDLLE WITH (NOLOCK)
		INNER JOIN 
			(
				--V_DocLinEstadosPedVenta
				SELECT Id, Fk_centro, Cantidad_pendiente
				FROM
					(
						SELECT Id, Fk_centro, ISNULL(Cantidad_pendiente, 0) AS Cantidad_pendiente
						FROM V_DocLinEstados AS V WITH (NOLOCK)
						WHERE Tipo_doc = ''PV''
					) AS derivedtbl_1
			)
			AS VDLEPV
		ON VDLLE.Id = VDLEPV.Id
		WHERE VDLEPV.Cantidad_pendiente > 0
	) AS EA
LEFT OUTER JOIN Ped_venta WITH (NOLOCK)
ON EA.Serie = Ped_venta.Serie
AND EA.Numero = Ped_venta.Numero
AND ''PV-'' +Ped_venta.Serie+ ''/'' + CAST(Ped_venta.Numero AS nvarchar) NOT IN (select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
AND ''PV-'' +Ped_venta.Serie+ ''/'' + CAST(Ped_venta.Numero AS nvarchar)<>@stringDocAValidar
WHERE EA.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--CONSULTA ESTOC
DECLARE @ESTOC AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL,
 Fecha_hora datetime NULL
 )
 INSERT INTO @ESTOC (Articulo, Almacen, Lote, Centro, Cantidad, Fecha_hora)
SELECT Articulo, Almacen, Lote, Centro, SUM(Cantidad) AS Cantidad, MIN(Fecha_hora) AS Fecha_hora
FROM @MovsAux
WHERE (@fechaConsolidacion IS NULL OR Fecha_hora>=convert(datetime, @fechaConsolidacion, 103))
AND (@fechaHasta IS NULL OR  Fecha_hora<=convert(datetime, @fechaHasta, 103))
AND Id_Mov NOT IN(@stringDocAValidar)
GROUP BY Articulo, Almacen, Lote, Centro
HAVING SUM(ISNULL(Cantidad, 0))<>0

--ESTOC SIN FECHA
DECLARE @ESTOC_SIN_FECHA AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL,
 Fecha_hora datetime NULL
 )
INSERT INTO @ESTOC_SIN_FECHA (Articulo, Almacen, Lote, Centro, Cantidad, Fecha_hora)
SELECT ISNULL(Articulo, 0) AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Centro, 0) AS Centro, SUM(ISNULL(Cantidad, 0)) AS Cantidad, MIN(Fecha_hora) AS Fecha_hora
FROM @MovsAux
WHERE (@fechaConsolidacion IS NULL OR Fecha_hora>=convert(datetime, @fechaConsolidacion, 103))
AND Id_Mov NOT IN(@stringDocAValidar)																						
GROUP BY Articulo, Almacen, Lote, Centro
HAVING (SUM(ISNULL(Cantidad, 0))<>0)

--HOJAS CARGA
DECLARE @HOJAS_CARGA AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL
 )
INSERT INTO @HOJAS_CARGA (Articulo, Almacen, Lote, Centro, Cantidad)
SELECT HCL.Fk_articulo AS Articulo, HCL.Fk_almacen AS Almacen, HCL.Lote, HCC.Fk_centro AS Centro, SUM(ISNULL(HCL.Cantidad, 0)) AS Cantidad
FROM Hoja_carga_cabecera AS HCC WITH (NOLOCK)
INNER JOIN Hoja_carga_linea AS HCL WITH (NOLOCK)
ON HCC.Id = HCL.Fk_cabecera
AND HCC.Serie = HCL.Serie
AND HCC.Numero = HCL.Numero
WHERE (HCC.Estado = 0)
AND HCL.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
AND (HCL.Fk_almacen IS NOT NULL)
AND (HCL.Lote IS NOT NULL)
AND ''HC-'' +HCC.Serie+ ''/'' + CAST(HCC.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
AND ''HC-'' +HCC.Serie+ ''/'' + CAST(HCC.Numero AS nvarchar)<>@stringDocAValidar
GROUP BY HCL.Fk_articulo, HCL.Fk_almacen, HCL.Lote, HCC.Fk_centro

--OP
DECLARE @OP AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL
 )
INSERT INTO @OP (Articulo, Almacen, Lote, Centro, Cantidad)
SELECT LOTES.Articulo, LOTES.Almacen, LOTES.Lote, lotes.Centro, SUM(LOTES.Cantidad_reservada - ISNULL(PARCIAL.Cantidad_desreservar,0)) AS Cantidad
FROM
(
	SELECT L.Fk_articulo_componente AS Articulo, L.Fk_almacen AS Almacen, L.Lote, Op.Fk_centro AS Centro, SUM(ISNULL(L.Cantidad, 0)) AS Cantidad_reservada
	FROM Op WITH (NOLOCK)
	INNER JOIN Op_componentes_lotes L WITH (NOLOCK)
	ON Op.Id = L.Fk_op
	WHERE (Op.Estado = 1 OR op.Estado=0 or Op.Estado=2)
	AND L.Fk_articulo_componente IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
	AND L.Lote IS NOT NULL
	AND ''OP-'' +Op.Fk_serie+ ''/'' + CAST(Op.Numero AS nvarchar(100)) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
	AND ''OP-'' +Op.Fk_serie+ ''/'' + CAST(Op.Numero AS nvarchar(100)) <> @stringDocAValidar
	GROUP BY L.Fk_articulo_componente, L.Fk_almacen, L.Lote, Op.Fk_centro
) LOTES
LEFT OUTER JOIN
(
	SELECT L.Fk_articulo_componente AS Articulo, L.Fk_almacen AS Almacen, L.Lote, Op.Fk_centro AS Centro, SUM(ISNULL(L.Cantidad, 0)) AS Cantidad_desreservar
	FROM Op WITH (NOLOCK)
	INNER JOIN	Op_componentes_lotes_real L WITH (NOLOCK)
	ON Op.Id = L.Fk_op
	WHERE (Op.Estado = 2 )
	AND L.Fk_articulo_componente IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
	AND L.Lote IS NOT NULL
	GROUP BY L.Fk_articulo_componente, L.Fk_almacen, L.Lote, Op.Fk_centro
) PARCIAL
ON LOTES.Articulo=PARCIAL.Articulo
AND LOTES.Almacen=PARCIAL.Almacen
AND LOTES.Lote=PARCIAL.Lote
AND LOTES.Centro=PARCIAL.Centro
GROUP BY LOTES.Articulo, LOTES.Almacen, LOTES.Lote, lotes.Centro

--TRASPASSOS
DECLARE @TRASPASOS AS TABLE
(Articulo nvarchar(15) NULL,
 Almacen nvarchar(15) NULL,
 Lote nvarchar(20) NULL,
 Centro INT NULL,
 Cantidad decimal(25, 6) NOT NULL
 )
INSERT INTO @TRASPASOS (Articulo, Almacen, Lote, Centro, Cantidad)
SELECT TRL.Fk_articulo AS Articulo, TRL.Fk_almacen AS Almacen, TRL.Fk_lote AS Lote, TR.Fk_centro_origen AS Centro, SUM(ISNULL(TRL.Cantidad, 0)) AS Cantidad
FROM Traspasos AS TR WITH (NOLOCK)
INNER JOIN Traspasos_lineas AS TRL WITH (NOLOCK)
ON TR.Id = TRL.Fk_traspaso
WHERE ((TR.Estado = 0) OR (TR.Estado = 1))
AND TRL.Fk_articulo IN (select Value from udf_SplitVariable(@stringListaArticulos,'',''))
AND ''TC-'' +TR.Fk_serie+ ''/'' + CAST(TR.Numero AS nvarchar) NOT IN(select AUX.Value from udf_SplitVariable(@stringDocsAsociados,'','') AUX)	
AND ''TC-'' +TR.Fk_serie+ ''/'' + CAST(TR.Numero AS nvarchar)<>@stringDocAValidar
GROUP BY TRL.Fk_articulo, TRL.Fk_almacen, TRL.Fk_lote, TR.Fk_centro_origen

--CONSULTA FINAL
SELECT E.*, ISNULL(R.Cantidad_reservada,0) AS Cantidad_reservada,E.Cantidad-ISNULL(R.Cantidad_reservada,0) AS Cantidad_disponible,ESTOC_SIN_FECHA.Cantidad as Estoc_sin_fecha_fin
FROM @ESTOC AS E
LEFT OUTER JOIN @ESTOC_SIN_FECHA AS ESTOC_SIN_FECHA
ON  E.Articulo=ESTOC_SIN_FECHA.Articulo
AND E.Almacen=ESTOC_SIN_FECHA.Almacen
AND E.Lote=ESTOC_SIN_FECHA.Lote
AND E.Centro=ESTOC_SIN_FECHA.Centro
LEFT OUTER JOIN
(
	--CONSULTA RESERVAS
	SELECT ISNULL(Articulo, '''') AS Articulo, ISNULL(Almacen, '''') AS Almacen, ISNULL(Lote, '''') AS Lote, ISNULL(Centro, 0) AS Centro, SUM(Cantidad_reservada) AS Cantidad_reservada
	FROM
	(
		SELECT Articulo, Almacen, Lote, Centro, Cantidad AS Cantidad_reservada
		FROM @HOJAS_CARGA
		UNION ALL
		SELECT Articulo, Almacen, Lote, Centro, Cantidad AS Cantidad_reservada
		FROM @OP
		UNION ALL SELECT Articulo, Almacen, Lote, Centro AS Centro, SUM(ISNULL(Cantidad, 0) - ISNULL(Cantidad_asociada, 0) - ISNULL(Cantidad_cargada, 0)) AS Cantidad_reservada
		FROM
		(
			SELECT EA.Articulo, EA.Almacen, EA.Lote, EA.Centro, EA.Cantidad, EA.Cantidad_asociada, EA.Cantidad_cargada
			FROM @EstAux AS EA
		) AS LotesEstadosPedVenta
		GROUP BY Articulo, Almacen, Lote, Centro
		UNION ALL
		SELECT Articulo, Almacen, Lote, Centro, Cantidad AS Cantidad_reservada
		FROM @TRASPASOS
	) AS A
	GROUP BY Articulo, Almacen, Lote, Centro
) R
ON E.Articulo=R.Articulo
AND E.Almacen=R.Almacen
AND E.Lote=R.Lote
AND E.Centro=R.Centro
END'
GO
IF EXISTS(SELECT* FROM sysobjects WHERE id = object_id(N'fn_BuscaValoresCopageProdAceite') 
AND xtype IN (N'FN', N'IF', N'TF')) EXEC dbo.sp_executesql @statement = N'DROP FUNCTION dbo.fn_BuscaValoresCopageProdAceite'
GO
EXEC dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[fn_BuscaValoresCopageProdAceite]
(
	@articulo nvarchar(20)
	,@lote nvarchar(20)
	,@fechaDesde datetime
)
RETURNS
@tablaReturn TABLE
(
		-- Add the column definitions for the TABLE variable here
	Pa_serie_copage nvarchar(6) NULL
	,Pa_numero_copage bigint NULL
	,Pa_rend_copage decimal(15,2) NULL
	,Pa_rend_salidas_copage decimal(15,2) NULL
	,CopageRendimientosCompleto BIT NULL
)
AS
BEGIN
DECLARE @SerieTipoDoc nvarchar(20)
DECLARE @Serie_tipo_mov nvarchar(20)
DECLARE @Num_movimiento bigint
DECLARE @Tipo_proceso int
DECLARE @Fecha_hora datetime

	-- Fill the table variable with the rows for your result set
	DECLARE Tb CURSOR LOCAL FORWARD_ONLY  FOR SELECT M.SerieTipoDoc, M.Serie_tipo_mov,M.Num_movimiento,SC.Tipo_proceso,M.Fecha_hora
									FROM V_Movimientos_estoc M			
									LEFT OUTER JOIN Series_copages SC ON M.Serie_tipo_mov=SC.Serie
									WHERE M.E_S_N=''S'' AND M.Articulo=@articulo AND M.Lote=@lote AND M.Fecha_hora>@fechaDesde
									ORDER BY M.Fecha_hora Desc
	OPEN Tb
	FETCH NEXT FROM Tb INTO @SerieTipoDoc,@Serie_tipo_mov,@Num_movimiento,@Tipo_proceso,@Fecha_hora
	WHILE @@FETCH_STATUS = 0
	BEGIN
		/*si es un copage de procesado aceite hemos llegado, y devolveremos la consulta con los valores.*/
		IF (@tipo_proceso=1)
			BEGIN
				
				INSERT INTO @tablaReturn SELECT Fk_serie as Pa_serie_copage,Numero as Pa_numero_copage,RendCopage as Pa_rend_copage,RendMedioSalidas as Pa_rend_salidas_copage,ISNULL(CopageRendimientosCompleto,0) AS CopageRendimientosCompleto  FROM V_CopagesProdAceiteRendimientos WHERE Fk_serie=@Serie_tipo_mov AND Numero=@Num_movimiento
				CLOSE Tb
				DEALLOCATE Tb
				RETURN
			END
		ELSE
			/*Buscar en de ese documento una entrada con ese articulo por si cambia el lote y volver a llamar a la función recursiva*/
			BEGIN
				
				DECLARE Tb2 CURSOR LOCAL FORWARD_ONLY  FOR SELECT TOP 1  M.SerieTipoDoc, M.Serie_tipo_mov,M.Num_movimiento,SC.Tipo_proceso,M.Fecha_hora,M.Lote
									FROM V_Movimientos_estoc M			
									LEFT OUTER JOIN Series_copages SC ON M.Serie_tipo_mov=SC.Serie
									WHERE M.SerieTipoDoc=@SerieTipoDoc AND M.Serie_tipo_mov=@Serie_tipo_mov AND M.Num_movimiento=@Num_movimiento AND M.E_S_N=''E'' AND M.Articulo=@articulo
									ORDER BY M.Fecha_hora Desc
				OPEN Tb2
				FETCH NEXT FROM Tb2 INTO @SerieTipoDoc,@Serie_tipo_mov,@Num_movimiento,@Tipo_proceso,@Fecha_hora,@lote
				WHILE @@FETCH_STATUS = 0
				BEGIN
					IF (ISNULL(@Serie_tipo_mov,'''')<>'''')
						BEGIN
							INSERT INTO @tablaReturn SELECT * FROM fn_BuscaValoresCopageProdAceite(@articulo,@lote,@Fecha_hora)
							CLOSE Tb
							DEALLOCATE Tb
							RETURN
						END
				END
			END			
		/*següent registre*/
		FETCH NEXT FROM Tb INTO @Serie_tipo_mov,@Num_movimiento,@Tipo_proceso,@Fecha_hora,@lote
	END
	CLOSE Tb
	DEALLOCATE Tb


	RETURN
END
'
GO
IF  EXISTS (SELECT * FROM sys.procedures WHERE object_id = OBJECT_ID(N'[dbo].[sp_ClearAuditoria]'))
DROP PROCEDURE [dbo].[sp_ClearAuditoria]
GO
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[sp_ClearAuditoria] (@MonthsBack tinyint, @MonthsToLeave tinyint) AS 
SET NOCOUNT ON 
WHILE 1 = 1
BEGIN
	IF EXISTS (
		SELECT 1
		FROM dbo.Auditoria
		WHERE Fecha_hora < DATEADD(MONTH, -@MonthsBack, GETDATE())
	)
	BEGIN
		DELETE TOP (10000)
		FROM dbo.Auditoria
		WHERE Fecha_hora < DATEADD(MONTH, -@MonthsToLeave, GETDATE());
	END
    IF @@ROWCOUNT = 0 BREAK;
END
RETURN'
GO