/***************************************
* STORED stp_UAL_insertNewTL
*
* Stored completa x gestione postazione TL e AL:
* (0) - verifico SE ho datamatrix x UDC TT...
* (1) - crea un nuovo record nella tab ElencoAssiemi di tipo TL partendo dal record TT
* (2a) - per ogni UDC dell'AL TT genera un nuovo UDC corrispondente in posizione (Terra TT), stato Trattato
* (2b) - per ogni UDC CREATO fa lo spostamento in cella corretta
* (2c) - per ogni UDC CREATO fa associazione con UDC parent ALT
* (3a) - per ogni UDC creato lo associa all'AL TL creato
* (3b) - per ogni UDC creato aggiunge attributi NumTratt
* (4) - per ogni Dtx associato a UDC TT --> registra in nuovi UDC TL (copia) 
* (5a) - Consuma tutti gli UDC TT
* (5b) - elimina posizione x UDC TT
* (6) - Disattiva AL TT
*
* Steamware, S.E.L.
* mod: 2010.04.17
*
****************************************/
CREATE PROCEDURE [dbo].[stp_UAL_insertNewTL]
(
    @SourceAL		VARCHAR(50), -- AL sorgente
    @TipoAl			CHAR(1), -- tipo AL di dest (L)
    @DataCreaz		DATETIME,
    @CodSoggetto	VARCHAR(17),
    @AL				VARCHAR(50) OUTPUT
)
AS

SET NOCOUNT ON;
SET XACT_ABORT ON;

-- DECLARE iniziali
DECLARE @idxCellaTo		INT = 0,
        @idxPosizioneTo	INT = 0,
        @Flusso			VARCHAR(2)	= 'TL',
        @CodStato		VARCHAR(50) = 'Fin', -- stato nuovi UDC
        @CodEvento		VARCHAR(10) = 'UDC_TL',-- evento nuovi UDC
        @HasDtx			BIT			= 0 -- indica se sia tipo datamatrix

        
------------------------------------------------------------------------------------------------------
-- (0) - verifico SE ho datamatrix x UDC TT...
------------------------------------------------------------------------------------------------------
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
    SET @CodEvento  = 'UDC_TL_DT'   -- mi serve dopo
END

------------------------------------------------------------------------------------------------------
-- 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 TT 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, ec.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, @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 ALT
    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 TL 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, CodAttr, ValAttr, @DataCreaz AS DateAttr, @CodSoggetto AS CodSoggetto
    FROM Attr2UDC ec
    INNER JOIN AL2UDC a2u ON ec.UDC = a2u.UDC
    WHERE a2u.AL = @SourceAL

    -- (4) - per ogni Dtx associato a UDC TT --> registra Dtx in nuovi UDC TT (copia) 
    IF (@HasDtx     = 1)
    BEGIN
        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 TT
    UPDATE	ec
    SET		IdxPosizione = -IdxPosizione
    FROM	ElencoCartellini ec
    INNER JOIN AL2UDC a2u
        ON	ec.UDC = a2u.UDC
    WHERE	a2u.AL = @SourceAL

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

    -- (6) - Disattiva AL TT
    UPDATE	ElencoAssiemi
    SET		Attivo = 0
    WHERE	AL = @SourceAL
    
    
COMMIT TRAN
------------------------------------------------------------------------------------------------------

RETURN