

/***************************************
* STORED stp_UAL_insertNewTT
*
* Stored completa x gestione postazione TT e AL:
* (1) - crea un nuovo record nella tab ElencoAssiemi di tipo TT partendo dal record RX
* (2a) - per ogni UDC dell'AL RX genera un nuovo UDC corrispondente in posizione CORRETTA (Terra TT)
* (2b) - per ogni UDC CREATO fa lo spostamento in cella corretta
* (2c) - per ogni UDC CREATO fa associazione con UDC parent ALR
* (3a) - per ogni UDC creato lo associa all'AL TT creato
* (3b) - per ogni UDC creato aggiunge attributi NumTratt e Durezza
* (4) - per ogni Dtx associato a UDC RX --> registra in nuovi UDC TT (copia) 
* (5a) - Consuma tutti gli UDC RX
* (5b) - elimina posizione x UDC RX
* (6) - Disattiva AL RX
* (7) - Registra record in ElencoTrattamenti
*
* Steamware, S.E.L.
* mod: 2010.04.14
*
****************************************/
CREATE PROCEDURE [dbo].[stp_UAL_insertNewTT]
(
	@SourceAL		VARCHAR(50), -- AL sorgente
	@TipoAl			CHAR(1), -- tipo AL di dest
	@DataCreaz		DATETIME,
	@CodSoggetto	VARCHAR(17),
	@Note			NVARCHAR(500),
	@NumTratt		NVARCHAR(50), -- nuovo formato 8 char: YY + progressivo (6 char)
	@Durezza		INT,
	@AL				VARCHAR(50) OUTPUT
)
AS

SET NOCOUNT ON;
SET XACT_ABORT ON;

-- DECLARE iniziali
DECLARE @idxCellaTo		INT = 0,
		@idxPosizioneTo	INT = 0,
		@Flusso			VARCHAR(2)	= 'TT',
		@CodStato		VARCHAR(50) = 'Tratt', -- stato nuovi UDC
		@CodEvento		VARCHAR(10) = 'UDC_TRATT',-- evento nuovi UDC
		@AttrNT			VARCHAR(2)	= 'NT', -- attributo x Num Trattamento
		@AttrDU			VARCHAR(2)	= 'DU', -- attributo x Durezza rilevata
		@HasDtx			BIT			= 0 -- indica se sia tipo datamatrix

------------------------------------------------------------------------------------------------------
-- 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 di destinazione UDC
SELECT TOP 1 @IdxPosizioneTo = ttpe.IdxPosizioneTo
	, @IdxBloccoTo = ttpe.IdxBloccoTo
FROM TabTranPosizEventi ttpe
WHERE	CodEvento	= @CodEvento
	AND	CodStatoTo	= @CodStato
	AND	IdxPosizione = 0


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: da vecchio con sostituzione tipo...
	SET @AL = dbo.f_genNewCodAL(@SourceAL, @TipoAl)
		
	-- (1) - inserisco un nuovo record da precedente...
	INSERT INTO ElencoAssiemi(AL, Attivo, DataCreaz, CodSoggetto, CodDtx_start, CodDtx_end)
	SELECT		@AL, 1, @DataCreaz, @CodSoggetto, CodDtx_start, CodDtx_start
		FROM	ElencoAssiemi
		WHERE	AL = @SourceAL


	-- (2a) - per ogni UDC dell'AL RX genera un nuovo UDC corrispondente in posizione CORRETTA @IdxPosizioneTo (Terra TT)
	INSERT INTO ElencoCartellini(UDC, CodCS, CodCliente, RagSociale, Particolare, DescParticolare, DisegnoGrezzo, Esponente, DataFus, TurnoFus, CodImballo, CodSoggetto, NumCont, Qta, CodStato, IdxPosizione, CreateDate, ModDate, Note, CodEvento)
	SELECT dbo.f_genNewCodUDC(ec.UDC,@Flusso) as UDC, ec.CodCS, ec.CodCliente, ec.RagSociale, ec.Particolare, ec.DescParticolare, ec.DisegnoGrezzo, ec.Esponente, @DataCreaz AS DataFus, ec.TurnoFus, ec.CodImballo, @CodSoggetto AS CodSoggetto, ec.NumCont, ec.Qta, @CodStato AS CodStato, @IdxPosizioneTo AS IdxPosizione, @DataCreaz AS CreateDate, @DataCreaz AS ModDate, @Note as Note, @CodEvento AS CodEvento
	FROM ElencoCartellini ec
	INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
	WHERE a2u.AL = @SourceAL
	
	-- (2b) - per ogni UDC CREATO fa lo spostamento in cella corretta
	INSERT INTO PosizioneUdcCorrente (UDC, IdxCella, CodCS, DataRif, CodSoggetto)
	SELECT	dbo.f_genNewCodUDC(ec.UDC,@Flusso) as UDC, @idxCellaTo as IdxCella, CodCS, @DataCreaz, @CodSoggetto
	FROM ElencoCartellini ec
	INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
	WHERE a2u.AL = @SourceAL
	
	-- (2c) - per ogni UDC CREATO fa associazione con UDC parent ALR
	INSERT INTO RelazUDC(UDC_parent, UDC_child, dataMod)
	SELECT	ec.UDC as UDC_parent, dbo.f_genNewCodUDC(ec.UDC,@Flusso) as UDC_child, @DataCreaz as dataMod
	FROM ElencoCartellini ec
	INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
	WHERE a2u.AL = @SourceAL

	-- (3a) - per ogni UDC creato lo associa all'AL TT creato
	INSERT INTO AL2UDC(AL, UDC, DataCreaz, CodSoggetto)
	SELECT	@AL, dbo.f_genNewCodUDC(ec.UDC,@Flusso) as UDC, @DataCreaz, @CodSoggetto
	FROM ElencoCartellini ec
	INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
	WHERE a2u.AL = @SourceAL
	

	-- (3b) - per ogni UDC creato aggiunge attributo NumTratt e Durezza
	INSERT INTO Attr2UDC(UDC, CodAttr, ValAttr, DateAttr, CodSoggetto)
	SELECT	dbo.f_genNewCodUDC(ec.UDC,@Flusso) as UDC, @AttrNT AS CodAttr, @NumTratt AS ValAttr, @DataCreaz AS DateAttr, @CodSoggetto AS CodSoggetto
	FROM ElencoCartellini ec
	INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
	WHERE a2u.AL = @SourceAL

/*  Per il momento non registro la durezza x ogni UDC come attributo
	UNION
	SELECT	dbo.f_genNewCodUDC(ec.UDC,@Flusso) as UDC, @AttrDU AS CodAttr, @Durezza AS ValAttr, @DataCreaz AS DateAttr, @CodSoggetto AS CodSoggetto
	FROM ElencoCartellini ec
	INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
	WHERE a2u.AL = @SourceAL
*/

    -- (4) - verifico SE ho datamatrix x UDC RX...
    --SELECT	@HasDtx = CASE WHEN COUNT(DataMatrix) > 0 THEN 1 ELSE 0 END
	--FROM	Dtx2UDC d2u 
	--	INNER JOIN AL2UDC a2u ON d2u.UDC = a2u.UDC
	--WHERE	a2u.AL = @SourceAL

	-- (4) - verifico SE ho datamatrix x UDC RX ( source ) ...
    IF EXISTS ( SELECT * FROM Dtx2UDC d2u INNER JOIN AL2UDC a2u ON d2u.UDC = a2u.UDC WHERE a2u.AL = @SourceAL ) 
	BEGIN
        SET @HasDtx = 1   -- mi serve dopo

		-- (4) - per ogni Dtx associato a UDC RX --> registra Dtx in nuovi UDC TT (copia) 
		INSERT INTO Dtx2UDC(DataMatrix, CodStato, UDC, DataOra, CodSoggetto, Particolare)
		SELECT d2u.DataMatrix, @CodStato AS CodStato, dbo.f_genNewCodUDC(d2u.UDC,@Flusso) AS UDC, @DataCreaz AS DataOra, @CodSoggetto AS CodSoggetto, d2u.Particolare
		FROM Dtx2UDC d2u
		INNER JOIN AL2UDC a2u
			ON d2u.UDC = a2u.UDC
		WHERE a2u.AL = @SourceAL
	END

	-- (5a) - Consuma tutti gli UDC RX
	UPDATE	ec
	SET		IdxPosizione = -IdxPosizione
           ,CodSoggetto  = @CodSoggetto 
           ,ModDate      = @DataCreaz
           ,@CodEvento   = 'UDC_CONS'
	FROM	ElencoCartellini ec
	INNER JOIN AL2UDC a2u
		ON	ec.UDC = a2u.UDC
	WHERE	a2u.AL = @SourceAL

	-- (5b) - elimina posizione x UDC RX
	DELETE	puc
	FROM	PosizioneUdcCorrente puc
	INNER JOIN AL2UDC a2u
		ON	puc.UDC = a2u.UDC
	WHERE	a2u.AL = @SourceAL

	-- (6) - Disattiva AL RX
	UPDATE	ElencoAssiemi
	SET		Attivo = 0
	WHERE	AL = @SourceAL
	
	-- (7) - Registra record in ElencoTrattamenti
	INSERT INTO ElencoTrattamenti(Trattamento, AL, Durezza, DataDur, CodSoggettoDur, HasDtx)
	SELECT @NumTratt AS trattamento, @AL AS AL, @Durezza, @DataCreaz, @CodSoggetto, @HasDtx

	
COMMIT TRAN
------------------------------------------------------------------------------------------------------

RETURN