-- STEFANO 21-12-2011
-- MODIFICA DELLA STORE PROCEDURE PER IL RICALCOLO DELLE GIACENZE PRECEDENTI


CREATE FUNCTION [dbo].[RimanenzaNegativa]
(
	-- Add the parameters for the function here
	@CodArticolo nvarchar(50), 
	@Taglia nvarchar(50), 
	@Colore nvarchar(50), 
	@IDNegozio nvarchar(50), 
	@Data smalldatetime , 
	@Quantita decimal(18,4) 

--	<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS @t table (QtaVend decimal(18,4), 
				  ValVend decimal(18,4),
				  PrzVend decimal(18,4),
				  QtaScar decimal(18,4),
				  ValScar decimal(18,4))
AS
BEGIN

	
	IF @Quantita<0 
	BEGIN
	
		-- Declare the return variable here
		DECLARE @Qta as Integer;
		DECLARE @QtaVend decimal(18,4);
		DECLARE @ValVend decimal(18,4);
		DECLARE @PrzVend decimal(18,4);
		DECLARE @QtaScar decimal(18,4);
		DECLARE @ValScar decimal(18,4);

		SET @QtaVend =0;
		SET @ValVend =0;
		SET @PrzVend =0;
		SET @QtaScar =0;
		SET @ValScar =0;

		
		DECLARE @QtaApp decimal(18,4);
		DECLARE @ValVendApp decimal(18,4);
		DECLARE @PrzVendApp decimal(18,4);
		DECLARE @ValScarApp decimal(18,4);
		DECLARE @Peso decimal(18,4);
		
		DECLARE @QtaTrovata decimal(18,4);
		DECLARE @Coefficiente decimal(18,4);
		DECLARE @TipoMovimento nvarchar(50);

		set @Qta=convert(Integer, @Quantita*(-1));
		
		if @Qta=0 BEGIN 
			set @Qta=1
		END

		--DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>
		
		DECLARE @MovApp CURSOR;
		SET @MovApp = CURSOR FOR
		-- suppongo che un esploso pu? contenere al massimo tre pezzi
		SELECT TOP (@Qta*3) TipoDocumento, Movimento.Quantita, rptVendutoCostoImponibile, rptVendutoPrezzoImponibile, rptDisponibilitaCostoImponibile , Peso
			FROM Movimento inner join articolo on movimento.idarticolo=articolo.idarticolo WHERE (TipoMovimento = N'Scarico') 
			AND IDNegozio=(@IDNegozio) AND Data<(@Data) 
			AND (articolo.articolo=(@CodArticolo) and articolo.taglia=@Taglia and articolo.colore=@Colore)
			ORDER BY Data DESC;

		SET @QtaTrovata=0;

		OPEN @MovApp;
		FETCH NEXT FROM @MovApp INTO @TipoMovimento, @QtaApp, @ValVendApp, @PrzVendApp, @ValScarApp, @Peso;
		WHILE @@FETCH_STATUS = 0 AND @QtaTrovata>@Quantita
			BEGIN
				IF @TipoMovimento='Scontrino'
				BEGIN	
					-- Qta Venduto
					-- controllo se la quantit? trovata ? maggiore di quella richiesta
					IF @Quantita>@QtaTrovata+(@QtaApp*@Peso)
					BEGIN
						set @Coefficiente=(@Quantita-@QtaTrovata)/@QtaApp;
						set @QtaApp=(@Quantita-@QtaTrovata);
					END;
					ELSE
						set @Coefficiente=1;	
					
					set @QtaVend=@QtaVend+(@QtaApp*@Peso);
					-- Costo Venduto
					set @ValVend=(@ValVendApp*@Coefficiente*@Peso)+@ValVend;
					-- Prezzo Venduto
					set @PrzVend=(@PrzVendApp*@Coefficiente*@Peso)+@PrzVend;
				END;
				ELSE
				BEGIN
					-- Qta Scaricato
					-- controllo se la quantit? trovata ? maggiore di quella richiesta
					IF @Quantita>@QtaTrovata+(@QtaApp*@Peso)
					BEGIN
						set @Coefficiente=(@Quantita-@QtaTrovata)/@QtaApp;
						set @QtaApp=(@Quantita-@QtaTrovata);
					END;
					ELSE
						set @Coefficiente=1;

					set @QtaScar=@QtaScar+(@QtaApp*@Peso);
					-- Costo Scaricato
					set @ValScar=(@ValScarApp*@Coefficiente*@Peso)+@ValScar;
				END;

				SET @QtaTrovata=@QtaVend+@QtaScar;
				FETCH NEXT FROM @MovApp INTO @TipoMovimento, @QtaApp, @ValVendApp, @PrzVendApp, @ValScarApp, @Peso;
			END;

			CLOSE @MovApp;
			DEALLOCATE @MovApp;

			insert into @t values(@QtaVend*-1, @ValVend, @PrzVend, @QtaScar, @ValScar);
			
		END;
	ELSE
		BEGIN
			-- non far niente la tabella sar? vuota
			insert into @t values(0, 0, 0, 0, 0);
		END;
	RETURN;
	END


GO
