set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_scaricaUdc
*
* elimina dalle posizioni correnti un UDC, salvandone la posizione precedente nella tab storica (per scaricamento / spedizione)
*
* Steamware, S.E.L.
* mod: 2010.09.28
*
****************************************/
alter PROCEDURE stp_scaricaUdc
(
	@UDC VARCHAR(50),
	@IdxCellaFrom INT,
	@IdxPosizione INT
)
AS

BEGIN TRAN
	-- libero la posizione attuale dell'UDC (se c'è...)
	DELETE
	FROM	PosizioneUdcCorrente
	WHERE	UDC = @UDC AND IdxCella = @IdxCellaFrom
	
	-- aggiorno l'UDC come posizione finale...
	UPDATE	ElencoCartellini
	SET		IdxPosizione = @IdxPosizione, ModDate = GETDATE()
	WHERE	UDC = @UDC	
	
COMMIT TRAN

RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_UDC_delibera
*
* fa la delibera dell'UDC andando a processare la state machien e quindi eventualmente cambiando la sua posizione
*
* Steamware, S.E.L.
* mod: 2010.09.13
*
************************************/
alter PROCEDURE stp_UDC_delibera
(
	@CodTipoDelibera NVARCHAR(50),
	@UDC NVARCHAR(50),
	@CodSoggetto NVARCHAR(17),	
	@CodCS VARCHAR(2)
)

AS

BEGIN TRAN
	DECLARE @IdxPosizioneTo AS INT
	DECLARE @IdxPosizioneFrom AS INT
	DECLARE @IdxPosizionePre AS NVARCHAR(50)
	DECLARE @IdxCellaPre AS INT
	DECLARE @IdxCellaTo AS INT

	-- ricavo cella ATTUALE
	SET		@IdxCellaPre = (SELECT IdxCella FROM PosizioneUdcCorrente WHERE UDC = @UDC)
	
	-- ricavo posizione ATTUALE
	SET		@IdxPosizionePre = (SELECT TOP 1 b.CodMag FROM Celle c INNER JOIN Blocchi b ON c.IdxBlocco=b.IdxBlocco WHERE c.IdxCella = @IdxCellaPre)

	
	-- registro delibera
	INSERT INTO DELIBERE
	VALUES (@CodTipoDelibera, @UDC, GETDATE(), @CodSoggetto)

	-- ricavo nuova posizione
	SET		@IdxPosizioneTo = (SELECT	tt.IdxPosizioneTo
	   		                   FROM     TabTranPosizEventi tt INNER JOIN AnagTipoDelibere atd ON tt.CodEvento = atd.CodEvento
	   		                   WHERE    (atd.CodTipoDelibera = @CodTipoDelibera))
	
	-- ricavo posizione TEORICA VECCHIA
	SET		@IdxPosizioneFrom = (SELECT	tt.IdxPosizione
	   		                   FROM     TabTranPosizEventi tt INNER JOIN AnagTipoDelibere atd ON tt.CodEvento = atd.CodEvento
	   		                   WHERE    (atd.CodTipoDelibera = @CodTipoDelibera))

	-- calcolo la prima cella della nuova posizione...
	SET		@IdxCellaTo = (
							SELECT TOP 1 IdxCella FROM Celle
								WHERE IdxBlocco = (
									SELECT IdxBlocco FROM Blocchi
										WHERE CodMag=CAST(@IdxPosizioneTo AS NVARCHAR(50)))
						  )
	
	-- faccio update posizione
	UPDATE ElencoCartellini
	SET IdxPosizione = @IdxPosizioneTo, ModDate = GETDATE()
	WHERE UDC = @UDC

	-- controllo posizioni actual e from teorica: SE e SOLO SE corrispondono faccio spostamento...
	IF(CAST(@IdxPosizioneFrom AS NVARCHAR(50)) = @IdxPosizionePre)
	BEGIN
		-- ora cambio anche la posizione corrente dell'UDC (e tramite trigger storicizza...)
		EXEC stp_spostaUdc @CodCS, @UDC, @IdxCellaTo	
	END
	
COMMIT TRAN


RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_ParticolariOverview
*
* elenco di overview sull'impiego dei particolari (dettaglio a "maglie larghe")
*
* Steamware, S.E.L.
* mod: 2010.05.31
*
****************************************/
alter PROCEDURE stp_ParticolariOverview
(
	@searchVal VARCHAR(50),
	@CodCS VARCHAR(2)
)
AS

	SELECT      RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare, ISNULL(COUNT(dbo.ElencoCartellini.UDC), 0) AS NumUDC, 
				ISNULL(SUM(dbo.ElencoCartellini.Qta), 0) AS TotQta, ISNULL(COUNT(dbo.PosizioneUdcCorrente.IdxCella), 0) AS NumInMag
	FROM        RilPro.AnagParticolari LEFT OUTER JOIN
				dbo.ElencoCartellini ON RilPro.AnagParticolari.Particolare = dbo.ElencoCartellini.Particolare LEFT OUTER JOIN
				dbo.PosizioneUdcCorrente ON dbo.ElencoCartellini.UDC = dbo.PosizioneUdcCorrente.UDC
	WHERE		RilPro.AnagParticolari.CodCS = @CodCS AND RilPro.AnagParticolari.Particolare = @searchVal
				AND ElencoCartellini.IdxPosizione >= 0 -- vincolo posizioni mag attive
	GROUP BY	RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare

RETURN
go

/***************************************
* STORED stp_ParticolariOverviewLike
*
* elenco di overview sull'impiego dei particolari (dettaglio a "maglie larghe") - modalità LIKE
*
* Steamware, S.E.L.
* mod: 2010.05.31
*
****************************************/
alter PROCEDURE stp_ParticolariOverviewLike
(
	@searchVal VARCHAR(50),
	@CodCS VARCHAR(2)
)
AS

	SELECT		RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare, ISNULL(COUNT(ElencoCartellini.UDC), 0) AS NumUDC, 
				SUM(ISNULL(ElencoCartellini.Qta, 0)) AS TotQta, ISNULL(COUNT(PosizioneUdcCorrente.IdxCella), 0) AS NumInMag
	FROM        RilPro.AnagParticolari LEFT OUTER JOIN
	            ElencoCartellini ON RilPro.AnagParticolari.Particolare = ElencoCartellini.Particolare LEFT OUTER JOIN
	            PosizioneUdcCorrente ON ElencoCartellini.UDC = PosizioneUdcCorrente.UDC
	WHERE       (RilPro.AnagParticolari.CodCS = @CodCS) 
			AND ((RilPro.AnagParticolari.Particolare LIKE '%' + @searchVal + '%') OR (RilPro.AnagParticolari.DescParticolare LIKE '%' + @searchVal + '%'))
			AND ElencoCartellini.IdxPosizione >= 0 -- vincolo posizioni mag attive
	GROUP BY	RilPro.AnagParticolari.Particolare, RilPro.AnagParticolari.DescParticolare

RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_paretoDettMagByParticolare
*
* restituisce elenco giacenze a magazzino in logica pareto (quantità) per un dato particolare
*
* Steamware, S.E.L.
* mod: 2010.06.04
*
****************************************/
alter PROCEDURE stp_paretoDettMagByParticolare
(
	@CodCS VARCHAR(2),
	@Particolare VARCHAR(20)
)
AS

	SELECT	TOP (100) PERCENT am.CodCS, am.CodMag, am.DescMag, b.IdxBlocco, b.CodBlocco, ec.Particolare, 
				ec.Esponente, COUNT(puc.UDC) AS NumUDC, ISNULL(MIN(puc.DataRif), 
				GETDATE()) AS Oldest, ISNULL(MAX(puc.DataRif), GETDATE()) AS Newest, SUM(ec.Qta) AS QtaTotPz, 
				asp.DescStato, ec.IdxPosizione AS CodMagLog
	FROM		AnagMag am INNER JOIN
				Blocchi b ON am.CodMag = b.CodMag AND am.CodCS = b.CodCS INNER JOIN
				Celle c INNER JOIN
				ElencoCartellini ec LEFT OUTER JOIN
				PosizioneUdcCorrente puc ON ec.UDC = puc.UDC ON c.IdxCella = puc.IdxCella ON 
				b.IdxBlocco = c.IdxBlocco INNER JOIN
				AnagStatiProdotto asp ON ec.CodStato = asp.CodStato
	WHERE		(c.Attiva = 1) AND (am.CodCS = @CodCS) AND (ec.Particolare = @Particolare)
	GROUP BY	am.CodCS, am.CodMag, am.DescMag, b.IdxBlocco, b.CodBlocco, b.NumX, b.NumY, b.NumZ, 
	            ec.Particolare, ec.Esponente, ec.IdxPosizione, asp.DescStato
	ORDER BY	QtaTotPz DESC

	
RETURN
go

commit
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_spostaUdc
*
* sposta un UDC, salvandone la posizione precedente (se esiste) nella tab storica
*
* Steamware, S.E.L.
* mod: 2010.06.11
*
****************************************/
alter PROCEDURE stp_spostaUdc
(
	@CodCS VARCHAR(2),
	@UDC VARCHAR(50),
	@IdxCellaTo INT
)
AS

BEGIN TRAN
	
	-- DICHIARAZIONI iniziali variabili
	DECLARE @IdxCellaFrom INT
	DECLARE @capienza INT
	DECLARE @numUdc INT
	
	-- controllo cella di partenza
	SET		@IdxCellaFrom = (SELECT IdxCella FROM PosizioneUdcCorrente WHERE UDC = @UDC)
	-- controllo se la cella di dest vada indicata come piena
	SET		@capienza = (
							SELECT tc.Capienza 
								FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
								WHERE c.IdxCella = @IdxCellaFrom	
						)
	SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaFrom)
	-- se capienza raggiunta aggiorno...
	IF(@numUdc -1 < @capienza)
		BEGIN
			EXEC stp_celle_updPiena @IdxCellaFrom, 0
		END
		
	-- cancello posizione occupata
	DELETE
	FROM	PosizioneUdcCorrente
	WHERE	UDC = @UDC
	
	-- cancello eventuali righe liste di prelievo FUSI per l'UDC
	DELETE FROM RigheListePrelievo
		WHERE UDC = @UDC AND CodLista IN ( 
			SELECT CodLista FROM ElencoListePrelievo 
			WHERE CodTipoLista='01-PreFus'
		)

	
	
	-- creo una nuova posizione per l'UDC
	INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif)
	VALUES(@UDC, @IdxCellaTo, @CodCS, GETDATE())
	
	-- controllo se la cella di dest vada indicata come piena
	SET		@capienza = (
							SELECT tc.Capienza 
								FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
								WHERE c.IdxCella = @IdxCellaTo	
						)
	SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaTo)
	-- se capienza raggiunta aggiorno...
	IF(@numUdc >= @capienza)
		BEGIN
			EXEC stp_celle_updPiena @IdxCellaTo, 1
		END
	
COMMIT TRAN

RETURN
go

commit
go

set xact_abort on
go

begin transaction
go

DELETE FROM dbo.TabTranPosizEventi WHERE CodEvento=N'UDC_RIEN' and IdxPosizione=88
go

commit transaction
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.AnagTipoEvento
  VALUES (N'UDC_RIEN54', N'Rientro UDC da 88 a 54')
INSERT INTO dbo.AnagTipoEvento
  VALUES (N'UDC_RIEN84', N'Rientro UDC da 88 a 84')
DELETE FROM dbo.AnagTipoEvento WHERE CodEvento=N'UDC_RIEN'
go

commit transaction
go


set xact_abort on
go

begin transaction
go

INSERT INTO dbo.TabTranPosizEventi
  VALUES (N'UDC_RIEN54', 88, 54, 1)
INSERT INTO dbo.TabTranPosizEventi
  VALUES (N'UDC_RIEN84', 88, 84, 1)
go

commit transaction
go


set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_spostaUdc
*
* sposta un UDC, salvandone la posizione precedente (se esiste) nella tab storica
*
* Steamware, S.E.L.
* mod: 2010.06.11
*
****************************************/
alter PROCEDURE stp_spostaUdc
(
	@CodCS VARCHAR(2),
	@UDC VARCHAR(50),
	@IdxCellaTo INT,
	@resetRLP BIT
)
AS

BEGIN TRAN
	
	-- DICHIARAZIONI iniziali variabili
	DECLARE @IdxCellaFrom INT
	DECLARE @capienza INT
	DECLARE @numUdc INT
	
	-- controllo cella di partenza
	SET		@IdxCellaFrom = (SELECT IdxCella FROM PosizioneUdcCorrente WHERE UDC = @UDC)
	-- controllo se la cella di dest vada indicata come piena
	SET		@capienza = (
							SELECT tc.Capienza 
								FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
								WHERE c.IdxCella = @IdxCellaFrom	
						)
	SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaFrom)
	-- se capienza raggiunta aggiorno...
	IF(@numUdc -1 < @capienza)
		BEGIN
			EXEC stp_celle_updPiena @IdxCellaFrom, 0
		END
		
	-- cancello posizione occupata
	DELETE
	FROM	PosizioneUdcCorrente
	WHERE	UDC = @UDC
	
	-- SE RICHIESTO cancello eventuali righe liste di prelievo FUSI per l'UDC
	IF(@resetRLP = 1)
	BEGIN
		DELETE FROM RigheListePrelievo
			WHERE UDC = @UDC AND CodLista IN ( 
				SELECT CodLista FROM ElencoListePrelievo 
				WHERE CodTipoLista='01-PreFus'
			)
	END

	
	
	-- creo una nuova posizione per l'UDC
	INSERT INTO PosizioneUdcCorrente(UDC, IdxCella, CodCS, DataRif)
	VALUES(@UDC, @IdxCellaTo, @CodCS, GETDATE())
	
	-- controllo se la cella di dest vada indicata come piena
	SET		@capienza = (
							SELECT tc.Capienza 
								FROM TipoCella TC INNER JOIN Celle c ON TC.IdxTipoCella=c.IdxTipoCella
								WHERE c.IdxCella = @IdxCellaTo	
						)
	SET @numUdc = (SELECT COUNT(*) FROM PosizioneUdcCorrente WHERE IdxCella = @IdxCellaTo)
	-- se capienza raggiunta aggiorno...
	IF(@numUdc >= @capienza)
		BEGIN
			EXEC stp_celle_updPiena @IdxCellaTo, 1
		END
	
COMMIT TRAN

RETURN
go

commit
go



set xact_abort on
go

begin transaction
go

set ANSI_NULLS on
go

/***************************************
* STORED stp_annullaUDC
*
* annulla un UDC
*
* Steamware, S.E.L.
* mod: 2010.04.28
*
****************************************/
alter PROCEDURE stp_annullaUDC
(
	@UDC VARCHAR(20),
	@CodSoggetto VARCHAR(17)
)
AS

BEGIN TRAN
	
	-- faccio update
	UPDATE      ElencoCartellini
	SET         IdxPosizione = 0, ModDate = GETDATE()
	WHERE		UDC = @UDC
	
	
COMMIT TRAN

RETURN
go

commit
go





-- registro versione...
INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(335, GETDATE())
GO
