/*****************************************************
* STORED sstp_processaCodaMovimMag
*
* Processa la coda dei movimenti di magazzino e chiama procedura x salvataggio dato su AS400
*
* Steamware, S.E.L.
* mod: 2013.11.22
*
****************************************/
CREATE PROCEDURE BatchQueue.stp_processaCodaMovimMag
AS

	-- VERIFICARE A CURA MAZZUCCONI!!!
	-- campi variabili "globali"
	DECLARE @IdxBatch INT	
	DECLARE @CodSoggetto NVARCHAR(17)
	DECLARE @CodMovCarico CHAR(2)
	DECLARE @CodMovScarico CHAR(2)
	-- campi x cursore e valorizzazione riga a riga
	DECLARE @Particolare NVARCHAR(15)
	DECLARE @Causale NVARCHAR(2)
	DECLARE @CodMag	NVARCHAR(50)
	DECLARE @Qta INT
	DECLARE @Data NVARCHAR(8)
	DECLARE @RIFFO NVARCHAR(8)
	
	-- faccio una query con un cursore x processare tutte le righe da inviare ad AS400..
	--DECLARE RigaMovMag CURSOR LOCAL FOR
	--	SELECT TOP 2000 IdxBatch FROM dbo.AS400_BatchMovimenti WHERE DataBatch IS NULL    -- limito a 2000 i movimenti da passare

    -- modifica per cambio anagrafica ( blocco i movimenti con particolare vecchio )
    IF GETDATE() >= '20140101'                     -- 22/11/2013 Hard Coded x Modifica Anagrafica Articoli 
        DECLARE RigaMovMag CURSOR LOCAL FOR
            SELECT TOP 2000 IdxBatch FROM dbo.AS400_BatchMovimenti
            WHERE DataBatch IS NULL    -- limito a 2000 i movimenti da passare
            AND LEFT(Particolare ,1) <> 'P'   -- Hard Coded 22/11/2013  non passo movimenti con codice vecchio
            AND LEFT(Particolare ,1) <> 'A'   -- Hard Coded 31/01/2014  non passo movimenti con codice anime vecchio
            ORDER BY DataIns
    ELSE 
        DECLARE RigaMovMag CURSOR LOCAL FOR
            SELECT TOP 2000 IdxBatch FROM dbo.AS400_BatchMovimenti
            WHERE DataBatch IS NULL    -- limito a 2000 i movimenti da passare
            ORDER BY DataIns

	-- utente da inviare ad AS... VERIFICARE!!! su AS400 è un Char(10)
	SET @CodSoggetto = 'UTENTEGMW2'

	-- carico i 2 valori di default di carico e scarico da AS400
	SET @CodMovCarico  = (SELECT CauCarico  FROM RilPro.AnagCausaliMag WHERE CodElemento = '0001')
	SET @CodMovScarico = (SELECT CauScarico FROM RilPro.AnagCausaliMag WHERE CodElemento = '0001')

	-- inizio cursore!
	OPEN RigaMovMag
	FETCH NEXT FROM RigaMovMag 
	INTO @IdxBatch
	WHILE @@FETCH_STATUS = 0
	BEGIN
	  -- controllo ci sia la riga
	  IF (SELECT COUNT(IdxBatch) FROM dbo.AS400_BatchMovimenti WHERE IdxBatch = @IdxBatch) > 0
		BEGIN
 			/*   OLD VERSION
			SELECT	@Particolare=bm.Particolare, 
			        @Causale=CASE WHEN bm.Quantita>0 THEN @CodMovCarico ELSE @CodMovScarico END, 
					@CodMag=bm.CodMagAS,
					@Qta = ABS(bm.Quantita),
					@Data=dbo.dateToAsFormat(bm.DataIns),                     -- mod. 09/06/2012
					@RIFFO=RIGHT( (CONVERT(NVARCHAR(20),bm.IdxBatch)) , 8 )   -- mod. 09/06/2012
            */

			-- carico valori che mi servono
			-- Lo scarico Anime esterne usa la causale P3 per poterle distinguerle in AS400 ( richiesta da TEKAL ) x il carico 
			-- non serve visto che non viene mai fatto vs AS400 x le anime esterne
			SELECT	@Particolare = bm.Particolare, 
			        @Causale = CASE WHEN bm.Quantita < 0 AND (gm.CodStatoTo='AnimExt' OR gm.CodStatoFrom='AnimExt') THEN 'P3'  -- Hard Coded 11/06/2013
			                        WHEN bm.Quantita > 0 THEN @CodMovCarico 
			                        ELSE @CodMovScarico END, 
					@CodMag = bm.CodMagAS,
					@Qta    = ABS(bm.Quantita),
					@Data   = dbo.dateToAsFormat(bm.DataIns),                    -- mod. 09/06/2012
					@RIFFO  = RIGHT( (CONVERT(NVARCHAR(20),bm.IdxBatch)) , 8 )   -- mod. 09/06/2012

--					@Data=dbo.dateToAsFormat(GETDATE()),
--					@RIFFO=dbo.getUdcComp(bm.UDC,8)

			FROM dbo.AS400_BatchMovimenti AS bm
			INNER JOIN dbo.GiornaleMagazzino AS gm ON bm.numOp = gm.numOp
			WHERE IdxBatch = @IdxBatch
					
			-- Eseguo la stored che registra i movimenti magazzino
			DECLARE @ScritturaASOK AS INT
			EXECUTE @ScritturaASOK = BatchQueue.stp_registraMovMag @CodSoggetto, @Causale, @Particolare, @CodMag, @Qta, @Data, @RIFFO
            
			-- registro la data del movimento BATCH solo se la stp verso AS400 è Ok
			IF @ScritturaASOK = 0
			  UPDATE dbo.AS400_BatchMovimenti SET DataBatch = GETDATE() WHERE IdxBatch = @IdxBatch
			
			FETCH NEXT FROM RigaMovMag INTO @IdxBatch
		END
	END
	CLOSE RigaMovMag
	DEALLOCATE RigaMovMag
	
RETURN
