/***************************************
* STORED stp_UAL_insertNewRX
*
* Stored completa x gestione postazione RxNt e AL:
* - crea un nuovo record nella tab ElencoAssiemi di tipo Rx NT (non tracciati dtmx) 
* - associa tutti gli UDC della cella della postazione
* - sposta gli UDC da posizione temporanea a posizione reale
* - restituisce il codice AL appena creato in output
*
* Steamware, S.E.L.
* mod: 2010.04.04
*
****************************************/
CREATE PROCEDURE stp_UAL_insertNewRX
(
	@CodCS			VARCHAR(2),
	@Anno			VARCHAR(2),
	@Cesta			VARCHAR(4),
	@PostFlux		VARCHAR(10), -- RxNt / RxDt / ...
	@Flusso			CHAR(2),
	@TipoAl			CHAR(1),
	@DataCreaz		DATETIME,
	@CodSoggetto	VARCHAR(17),
	@CodDtxStart	VARCHAR(50),
	@CodDtxEnd		VARCHAR(50),
	@CodCella		VARCHAR(50), -- CodCella che contiene UDC da associare
	@CodEvento		VARCHAR(10), -- evento
	@Note			NVARCHAR(500),
	@AL				VARCHAR(50) OUTPUT
)
AS

-- DECLARE iniziali
DECLARE @numFlu			INT,
		@numUdc			INT,
		@idxCellaTo		INT = 0,
		@idxPosizioneTo	INT = 0


------------------------------------------------------------------------------------------------------
-- Gestione Flusso
------------------------------------------------------------------------------------------------------
-- controllo se esiste il flusso...
SET @numFlu = (
	SELECT count(*)
	FROM AnagBilance
	WHERE	CodBilancia	= @Flusso
)
-- ...sennò lo creo...
IF(@numFlu = 0)
	BEGIN
		-- se c'è inserisco in tab
		INSERT INTO AnagBilance(CodBilancia, DescrImpianto, CodCS)
		VALUES (@Flusso, @Flusso, @CodCS)
	END
------------------------------------------------------------------------------------------------------

		
------------------------------------------------------------------------------------------------------
-- Gestione contatore incrementale x flusso...
------------------------------------------------------------------------------------------------------
-- controllo se ci sia già un UDC per company / flusso anno
BEGIN TRAN
	-- cerco nella tab contatori se esiste contatore x il flusso
    -- controllo se record c'è...
	IF EXISTS(  SELECT TOP 1 Flusso FROM ContatoriUdc 
		        WHERE	CodCS		=	@CodCS
		        AND		Flusso		=	@Flusso
		        AND		Anno		=	@Anno )
	    BEGIN
			-- se c'è incremento di 1 in tab
			UPDATE ContatoriUdc
			SET LastIdx = LastIdx  + 1
			WHERE	CodCS		=	@CodCS
			AND		Flusso		=	@Flusso
			AND		Anno		=	@Anno
		END
	ELSE
		BEGIN
			-- lo creo!
			INSERT INTO ContatoriUdc(CodCS, Flusso, Anno, LastIdx)
			VALUES (@CodCS, @Flusso, @Anno, 1)
		END
	-- aggiorno numero UDC
	SET @numUdc = (
		SELECT LastIdx
		FROM ContatoriUdc
		WHERE	CodCS		=	@CodCS
		AND		Flusso		=	@Flusso
		AND		Anno		=	@Anno
	)
COMMIT TRAN
------------------------------------------------------------------------------------------------------



------------------------------------------------------------------------------------------------------
-- Ciclo calcolo idxPosizione e idxCella di destinazione
------------------------------------------------------------------------------------------------------
-- cerco in TabTranPosizEventi record x calcolare cella
DECLARE @IdxBloccoTo INT
SET @IdxBloccoTo = 0

-- ricavo al volo blocco e idxPosizione
SELECT TOP 1 @IdxPosizioneTo = ttpe.IdxPosizioneTo
	, @IdxBloccoTo = ttpe.IdxBloccoTo
FROM PosizioneUdcCorrente puc
INNER JOIN ElencoCartellini udc
	ON puc.UDC = udc.UDC
INNER JOIN TabTranPosizEventi ttpe
	ON ttpe.IdxPosizione = udc.IdxPosizione
INNER JOIN Celle c
	ON puc.IdxCella = c.IdxCella
WHERE CodCella = @CodCella


SELECT	TOP 1 @idxCellaTo = c.IdxCella 
FROM	Celle c 
WHERE	c.IdxBlocco = @IdxBloccoTo
------------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------------
-- Ciclo principale x inserimento nuovo record, associazione UDC, spostamenti
------------------------------------------------------------------------------------------------------
BEGIN TRAN
	-- ottengo il nuovo codice AL completo
	SET @AL = dbo.f_componiAL(@TipoAl, @Flusso, @Anno, @numUdc, @Cesta)
		
	-- inserisco un nuovo record
	INSERT INTO ElencoAssiemi(AL, Attivo, DataCreaz, CodSoggetto, CodDtx_start, CodDtx_end)
	VALUES	(@AL, 1, @DataCreaz, @CodSoggetto, @CodDtxStart, @CodDtxEnd)

	-- associo tutti gli UDC della cella indicata al nuovo AL
	INSERT INTO AL2UDC(AL, UDC, DataCreaz, CodSoggetto)
	SELECT	@AL, UDC, @DataCreaz, @CodSoggetto
	FROM PosizioneUdcCorrente puc
	INNER JOIN Celle c
		ON puc.IdxCella = c.IdxCella
	WHERE CodCella = @CodCella

	-- aggiorno gli UDC x idxPosizione!
	UPDATE udc
	SET IdxPosizione = @IdxPosizioneTo
		, Note = @Note
	FROM ElencoCartellini udc
	INNER JOIN PosizioneUdcCorrente puc
		ON puc.UDC = udc.UDC
	INNER JOIN Celle c
		ON puc.IdxCella = c.IdxCella
	WHERE CodCella = @CodCella


	-- sposto gli UDC come cella!
	UPDATE puc
	SET IdxCella = @idxCellaTo
		, DataRif = @DataCreaz
		, CodSoggetto = @CodSoggetto
	FROM PosizioneUdcCorrente puc
	INNER JOIN Celle c
		ON puc.IdxCella = c.IdxCella
	WHERE CodCella = @CodCella

COMMIT TRAN

------------------------------------------------------------------------------------------------------


RETURN