﻿
-- =============================================
-- Author:	 GAR
-- Create date: 2015.11.20
-- Description: Import iniziale dati: Tags
-- =============================================
CREATE PROCEDURE [import].[stp_importMagRic_step3]
AS
BEGIN

SET NOCOUNT ON;

/*
* NOTA: fare in modo che lo esegua in modo "becero" creando TUTTI i tags DISTINCT DESTINAZIONE che esistono (fatto salvo trim e TOP-UPPER x non creare sinonimi solo di errata scrittura), POI da sw farò "il merge" dei tags x riunificarli da WebGIM
*
* per farlo c'è la tabella di "sinonimi" per cui ad un certo Tag --> corrisponde il tag "merge" finale
* 	QUESTO SIGNIFICA che dopo primo import (becero) nei successivi deve guardare la tabella SinonimiTag, ho creato alcuni esempi
* 
* vedi step procedura abbozzati sotto
*
*/

--SELECT * FROM [som_ita].[tmp_ImportRic_A] WHERE Descrizione = ''
--SELECT * FROM dbo.SinonimiTag -- delete FROM dbo.SinonimiTag 
--SELECT * FROM dbo.AnagTags    -- delete FROM dbo.AnagTags 
--SELECT * FROM dbo.Tag2Item    -- DELETE FROM dbo.Tag2Item

DECLARE @Test BIT = 0;  -- se 1 fa il rollback
DECLARE @DataImp AS SMALLDATETIME = GETDATE();
DECLARE @SummaryOfChanges TABLE (Change VARCHAR(50));

BEGIN TRANSACTION;;
    
    -- ==========================================================
    -- NUOVI SINONIMI - se ho sinonimi mancanti li carico in modalità 1=1 TagCodeOrig=TagCode
    -- ==========================================================
    WITH cteImportRicA
    AS (
        SELECT DISTINCT LTRIM(RTRIM(UPPER(Destinazione))) + '#' +
                        LTRIM(RTRIM(UPPER(Gruppo))) AS TagCodeOrig    -- TagCodeOrig
        FROM [som_ita].[tmp_ImportRic_A]
        WHERE Destinazione <> '' OR GRUPPO <> ''
       )
    INSERT dbo.SinonimiTag 
    SELECT cte.TagCodeOrig, cte.TagCodeOrig
    FROM cteImportRicA AS cte
    LEFT JOIN dbo.SinonimiTag AS st ON cte.TagCodeOrig = st.TagCodeOrig
    WHERE cte.TagCodeOrig <> '' AND 
          st.TagCode IS NULL    -- solo nuovi

    SELECT 'NEW SinonimiTag: ' + CAST ( @@ROWCOUNT AS VARCHAR(10) )
    -- ==========================================================
    -- INSERT TAGS NUOVI
    -- ==========================================================
    INSERT dbo.AnagTags
    SELECT DISTINCT st.TagCode,'','' FROM dbo.SinonimiTag AS st
    LEFT JOIN dbo.AnagTags AS at ON st.TagCode = at.TagCode
    WHERE st.TagCode  <> '' AND 
          at.TagCode IS NULL    -- solo nuovi

    SELECT 'NEW AnagTags: ' + CAST ( @@ROWCOUNT AS VARCHAR(10) )

    -- ==========================================================
    -- INSERIMENTO NEW Item-TagCode
    -- ==========================================================
    ;WITH cteImportRicA -- normalizzo campi in ingresso
    AS (
        SELECT   LTRIM(RTRIM(UPPER(Gruppo)))                                 AS Famiglia
                ,LTRIM(RTRIM(UPPER(REPLACE(CASE WHEN ISNULL([Descrizione], '') <> '' 
                                                THEN [Descrizione] 
                                                ELSE [CodCostruttore] 
                                           END, '"', ''))))                 AS Descrizione -- tolgo eventuali "
                ,LTRIM(RTRIM(UPPER(NomeCostruttore)))                       AS NomeCostruttore
                ,LTRIM(RTRIM(UPPER(CodCostruttore)))                        AS CodCostruttore
                ,LTRIM(RTRIM(UPPER(CodSomaschini)))                         AS CodInterno
                ,LTRIM(RTRIM(UPPER(Destinazione))) + '#'
                     + LTRIM(RTRIM(UPPER(Gruppo))) AS TagCodeOrig    -- TagCodeOrig
        FROM [som_ita].[tmp_ImportRic_A]
     )
    ,cteNew AS  -- ricavo idxItem e TagCode effettivo
        (
                SELECT DISTINCT ai.idxItem, st.TagCode 
                FROM cteImportRicA AS tmp
                INNER JOIN dbo.AnagItems AS ai 
                    ON tmp.Famiglia = ai.Famiglia AND tmp.Descrizione = ai.Descrizione AND tmp.NomeCostruttore = ai.NomeCostruttore AND tmp.CodCostruttore = ai.CodCostruttore AND tmp.CodInterno = ai.CodInterno
                INNER JOIN dbo.SinonimiTag AS st ON tmp.TagCodeOrig = st.TagCodeOrig
        )
    --SELECT idxItem, TagCode FROM cteNew 
    -- inserisco new Item-TagCode
    MERGE INTO dbo.Tag2Item AS Target
    USING ( SELECT * FROM cteNew ) AS Source
          ON Target.idxItem = Source.idxItem AND Target.TagCode = Source.TagCode
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (idxItem,TagCode)  VALUES (idxItem,TagCode)
    --  WHEN MATCHED THEN  UPDATE SET Giacenza = Source.Giacenza ,dtLastUpd = GETDATE()
    --  WHEN NOT MATCHED BY SOURCE THEN  DELETE
    OUTPUT $ACTION INTO @SummaryOfChanges;-- carico i cambiamenti in tabella

IF @Test = 1 
     ROLLBACK 
ELSE COMMIT;

-- Carico le modifiche fatte in variabile Testo
SELECT Change + ' Tag2Item: ' + CONVERT(VARCHAR(10), COUNT(*))
FROM @SummaryOfChanges
GROUP BY Change;

END