/***************************************
* STORED stp_AL2UDC_moveUdcDtx
*
* sposta gli UDC di tipo DataMatrix tra due AL (se particolari differenti) oppure sposta i singoli DataMatrix tra 2 UDC
*
* Steamware, S.E.L.
* mod: 2014.03.13
*
****************************************/
CREATE PROCEDURE [dbo].[stp_AL2UDC_moveUdcDtx]
(
    @SourceAL	NVARCHAR(50),
    @DestAL		NVARCHAR(50)
)
AS

SET NOCOUNT ON;
SET XACT_ABORT ON;

-- Solo se i due AL esistono, sono attivi e dello stesso tipo faccio spostamento
IF SUBSTRING(@SourceAL,(3),(1)) = SUBSTRING(@DestAL,(3),(1))
   AND ( SELECT SUM( CONVERT(INT, Attivo) ) FROM dbo.ElencoAssiemi WHERE AL = @SourceAL OR AL = @DestAL ) = 2    -- così controllo che esistano entrambi e siano attivi
BEGIN

    BEGIN TRY;
     BEGIN TRANSACTION;

        -- dichiaro temp table
        DECLARE @TempUdcTrasf TABLE (
            SourceUDC NVARCHAR(50) NOT NULL
            , DestUdc NVARCHAR(50) NOT NULL
            , Particolare NVARCHAR(15) NULL
            );

        -- recupero in CTE gli UDC compresi x trasferimento
        WITH cteSource
        AS (
            SELECT DISTINCT d2u.UDC, d2u.Particolare
            FROM AL2UDC a2u
            INNER JOIN Dtx2UDC d2u
                ON d2u.UDC = a2u.UDC
            WHERE a2u.AL = @SourceAL
            )
        , cteDest
        AS (
            SELECT DISTINCT d2u.UDC, d2u.Particolare
            FROM AL2UDC a2u
            INNER JOIN Dtx2UDC d2u
                ON d2u.UDC = a2u.UDC
            WHERE a2u.AL = @DestAL
            )
        , cteUdcTrasf
        AS (
            SELECT s.UDC AS SourceUDC, d.UDC AS DestUdc
                , ISNULL(s.Particolare, d.Particolare) AS Particolare
            FROM cteSource s
            INNER JOIN cteDest d
                ON s.particolare = d.Particolare
            )
    
        -- salvo in temp table i risultati
        INSERT INTO @TempUdcTrasf
        SELECT * FROM cteUdcTrasf

        -- per prima cosa sposto i datamatrix che appartengono a UDC con lo stesso particolare tra sorgente e destinazione
        UPDATE d2u
        SET UDC = cte.DestUdc
        FROM Dtx2UDC d2u
        INNER JOIN @TempUdcTrasf cte
            ON d2u.UDC = cte.SourceUDC

        -- poi aggiorno le quantità degli UDC con lo stesso particolare tra sorgente e destinazione dato numero DataMatrix associati (e li consumo)
        UPDATE ec
        SET Qta = 0,
            IdxPosizione = - IdxPosizione
        FROM ElencoCartellini ec
        INNER JOIN @TempUdcTrasf cte
            ON ec.UDC = cte.SourceUDC

        -- elimino anche la locazione degli UDC consumati
        DELETE dbo.PosizioneUdcCorrente
        FROM dbo.PosizioneUdcCorrente AS pc
        INNER JOIN @TempUdcTrasf cte
            ON pc.UDC = cte.SourceUDC

        -- aggiorno qta UDC destinazione
        UPDATE ec
        SET Qta = conteggio.qty
        FROM dbo.ElencoCartellini ec
        INNER JOIN ( SELECT d2c.UDC
                            , COUNT(d2c.DataMatrix) AS qty
                     FROM Dtx2UDC d2c
                     INNER JOIN @TempUdcTrasf cte
                         ON d2c.UDC = cte.DestUdc
                     GROUP BY d2c.UDC
            ) AS conteggio
            ON ec.UDC = conteggio.UDC

        -- ora sposto TUTTI gli UDC con qta > 0 da sorgente a destinatario	
        UPDATE a2u
        SET AL = @DestAL
        FROM AL2UDC a2u
        INNER JOIN ElencoCartellini ec
            ON a2u.UDC = ec.UDC
        WHERE a2u.AL = @SourceAL
              AND ec.Qta > 0

        -- ora indico come Attivo = 0 il mio AL di origine (svuotato...)
        UPDATE	ElencoAssiemi
        SET Attivo = 0
        WHERE AL = @SourceAL

     COMMIT TRANSACTION;

    END TRY
    -- ====================================
    --  GESTIONE ERRORI
    -- ====================================
    BEGIN CATCH

        DECLARE @ErrorMessage NVARCHAR(4000);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState  INT;
        DECLARE @ErrorNumber INT;

        SELECT @ErrorMessage  = ERROR_MESSAGE() + ' Error Number : ' + CONVERT( Varchar(10) , ERROR_NUMBER()) + ' : ' + ISNULL(OBJECT_NAME(@@PROCID),'stored?'),
               @ErrorNumber   = ERROR_NUMBER(),
               @ErrorSeverity = ERROR_SEVERITY(),
               @ErrorState    = ERROR_STATE();

        IF (XACT_STATE()) <> 0 -- XACT_STATE = 0 means there is no transaction and a commit or rollback operation would generate an error.
        BEGIN
            -- PRINT N'stp_PostRxDt_addDtx error - ' + 'Rolling back transaction.'   -- non lo trovo in nessun log
            ROLLBACK TRANSACTION;
        END;

        -- Use RAISERROR inside the CATCH block to return error information about the original error that caused execution to jump to the CATCH block.
        RAISERROR (@ErrorMessage,   -- Message text.
                   @ErrorSeverity,  -- Severity.
                   @ErrorState      -- State.
                   ) WITH LOG;      -- Scrivo nel LOG di SQL ( e application log )

    END CATCH;
END;