SET TERM ^ ;

CREATE OR ALTER procedure SPU_CATALOGO_PRODUTO_IMPORT (
    ICATALOGO_PRODUTO_ID integer not null = 0)
as
declare variable VID integer;
declare variable VCATALOGO_PRODUTO_ID integer;
declare variable VSTATUS integer;
declare variable VMODELO_ID integer;
declare variable VMODELO_DESCRICAO varchar(200);
declare variable VCORES blob sub_type 1 segment size 80;
declare variable VPRODUTOS blob sub_type 1 segment size 80;
declare variable VTAMANHOS blob sub_type 1 segment size 80;
declare variable VPRECO_VENDA numeric(15,2);
declare variable VPRECO_VENDA_ESP numeric(15,2);
declare variable VPRECO_RECOMENDADO numeric(15,2);
BEGIN


    FOR
        SELECT
            T.ID,
            T.CATALOGO_PRODUTO_ID,
            T.MODELO_ID,
            COALESCE((SELECT FIRST 1 M.DESCRICAO FROM TBMODELO M WHERE M.CODIGO = T.MODELO_ID), '') AS MODELO_DESCRICAO

        FROM TBCATALOGO_PRODUTO_IMPORT T
        INNER JOIN TBCATALOGO_PRODUTO A ON A.ID = T.CATALOGO_PRODUTO_ID
        WHERE T.ID > 0
        AND CURRENT_DATE BETWEEN A.DATA_INICIAL AND A.DATA_FIM
        AND A.ORIGEM = '12461'

        AND IIF(COALESCE(:ICATALOGO_PRODUTO_ID, 0) > 0, T.CATALOGO_PRODUTO_ID = COALESCE(:ICATALOGO_PRODUTO_ID, 0), TRUE = TRUE)

    INTO
        :VID,
        :VCATALOGO_PRODUTO_ID,
        :VMODELO_ID,
        :VMODELO_DESCRICAO

    DO
    BEGIN
        
        :VCORES = '['||COALESCE((SELECT
                                    LIST(
                                        FN_TO_JSON_V2(
                                            FN_TO_PAR_JSON_V3('ID', C.COR_ID),
                                            FN_TO_PAR_JSON_V3('DESCRICAO', CC.DESCRICAO),
                                            FN_TO_PAR_JSON_V3('ABREVIADO', CC.ABREVIADO),
                                            FN_TO_PAR_JSON_V3('AMOSTRA', TCOLORTOHEX(CC.AMOSTRA)),
                                            FN_TO_PAR_JSON_V3('AMOSTRA_IMAGEM', CC.AMOSTRA_IMAGEM),
                                            FN_TO_PAR_JSON_V3('PRODUTO_ID', CP.CODIGO)
                                            )
                                        )
            
                                FROM TBMODELO_COR C
                                INNER JOIN TBCOR CC ON CC.CODIGO = C.COR_ID
                                INNER JOIN TBPRODUTO CP ON CP.MODELO_CODIGO = C.MODELO_ID AND CP.COR_CODIGO = CC.CODIGO
                                WHERE C.MODELO_ID = :VMODELO_ID
                                AND C.STATUS = '1'
                                AND CC.STATUS = '1'
                                AND CP.STATUS = '1'
                            ), '')||']';

        :VPRODUTOS = '['||COALESCE((SELECT
                                        LIST(
                                            FN_TO_JSON_V2(
                                                FN_TO_PAR_JSON_V3('ID', CP.CODIGO),
                                                FN_TO_PAR_JSON_V3('DESCRICAO', CP.DESCRICAO),
                                                FN_TO_PAR_JSON_V3('COR_ID', CC.CODIGO)
                                                )
                                            )

                                    FROM TBMODELO_COR C
                                    INNER JOIN TBCOR CC ON CC.CODIGO = C.COR_ID
                                    INNER JOIN TBPRODUTO CP ON CP.MODELO_CODIGO = C.MODELO_ID AND CP.COR_CODIGO = CC.CODIGO
                                    WHERE C.MODELO_ID = :VMODELO_ID
                                    AND C.STATUS = '1'
                                    AND CC.STATUS = '1'
                                    AND CP.STATUS = '1'
                            ), '')||']';

        :VTAMANHOS = '['||COALESCE((SELECT
                                        LIST(
                                            FN_TO_JSON_V2(
                                                FN_TO_PAR_JSON_V3('TAMANHO', TM.TAMANHO),
                                                FN_TO_PAR_JSON_V3('DESCRICAO', TM.DESCRICAO)
                                                )
                                            )

                                    FROM (
                                        SELECT
                                            1 AS TAMANHO,
                                            TG.T01 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T01 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            2 AS TAMANHO,
                                            TG.T02 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T02 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            3 AS TAMANHO,
                                            TG.T03 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T03 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            4 AS TAMANHO,
                                            TG.T04 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T04 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            5 AS TAMANHO,
                                            TG.T05 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T05 = '1'
                                        
                                        UNION ALL

                                        SELECT
                                            6 AS TAMANHO,
                                            TG.T06 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T06 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            7 AS TAMANHO,
                                            TG.T07 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T07 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            8 AS TAMANHO,
                                            TG.T08 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T08 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            9 AS TAMANHO,
                                            TG.T09 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T09 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            10 AS TAMANHO,
                                            TG.T10 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T10 = '1'
                                        
                                        UNION ALL

                                        SELECT
                                            11 AS TAMANHO,
                                            TG.T11 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T11 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            12 AS TAMANHO,
                                            TG.T12 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T12 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            13 AS TAMANHO,
                                            TG.T13 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T13 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            14 AS TAMANHO,
                                            TG.T14 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T14 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            15 AS TAMANHO,
                                            TG.T15 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T15 = '1'
                                        
                                        UNION ALL

                                        SELECT
                                            16 AS TAMANHO,
                                            TG.T16 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T16 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            17 AS TAMANHO,
                                            TG.T17 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T17 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            18 AS TAMANHO,
                                            TG.T18 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T18 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            19 AS TAMANHO,
                                            TG.T19 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T19 = '1'
                                        
                                        UNION ALL
                                        
                                        SELECT
                                            20 AS TAMANHO,
                                            TG.T20 AS DESCRICAO
                                        
                                        FROM TBMODELO TT
                                        INNER JOIN TBGRADE TG ON TG.CODIGO = TT.GRADE_CODIGO
                                        WHERE TT.CODIGO = :VMODELO_ID
                                        AND TT.T20 = '1'
                                    ) TM
                            ), '')||']';


        /**********************************************************************/

        :VPRECO_VENDA = COALESCE((SELECT FIRST 1
                                        IIF(XY.PERCENTUAL_BASE > 0.00, ROUND(((CAST(XY.PERCENTUAL_BASE AS DOUBLE PRECISION) / 100.00) * CAST(COALESCE(XY2.PRECO_VENDA, 0) AS DOUBLE PRECISION)), XY.DECIMAIS_BASE), COALESCE(XY2.PRECO_VENDA, 0))
            
                                    FROM (
                                        SELECT
                                            IIF(COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1, COALESCE(TP.PERCENTUAL_BASE, 0.00), 0.00) AS PERCENTUAL_BASE,
                                            COALESCE(TP.DECIMAIS_BASE, 2) AS DECIMAIS_BASE,
                                            IIF(COALESCE(TP.TABELA_PRECO_ID_BASE, 0) > 0 AND COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1, COALESCE(TP.TABELA_PRECO_ID_BASE, 0), COALESCE(CPD.TABELA_PRECO_ID, 0)) AS TAB_PRECO_ID_F,
                            
                                            IIF(COALESCE(TP.TABELA_PRECO_ID_BASE, 0) > 0 AND COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1,
                                                COALESCE((SELECT FIRST 1
                                                    Y.ID
                                                FROM TBTABELA_PRECO Y2
                                                INNER JOIN TBMODELO_PRECO Y ON Y.TABELA_ID = Y2.ID
                                                WHERE Y2.ID = COALESCE(TP.TABELA_PRECO_ID_BASE, 0) AND Y.MODELO_CODIGO = :VMODELO_ID), 0),
                                                COALESCE((SELECT FIRST 1
                                                    Y.ID
                                                FROM TBTABELA_PRECO Y2
                                                INNER JOIN TBMODELO_PRECO Y ON Y.TABELA_ID = Y2.ID
                                                WHERE Y2.ID = CPD.TABELA_PRECO_ID AND Y.MODELO_CODIGO = :VMODELO_ID), 0)
                                                ) AS MODELO_PRECO_ID
                            
                                        FROM TBCATALOGO_PRODUTO CPD, TBTABELA_PRECO TP
                                        WHERE CPD.TABELA_PRECO_ID = TP.ID
                                        AND CPD.ID = :VCATALOGO_PRODUTO_ID
                                        AND CPD.ORIGEM = '12461'
                                    ) XY
                                    LEFT JOIN TBMODELO_PRECO XY2 ON XY2.ID = XY.MODELO_PRECO_ID AND XY2.TABELA_ID = XY.TAB_PRECO_ID_F
                                    WHERE XY.MODELO_PRECO_ID > 0
                            ), 0);

        :VPRECO_VENDA_ESP = COALESCE((SELECT FIRST 1
                                        IIF(XY.PERCENTUAL_BASE > 0.00, ROUND(((CAST(XY.PERCENTUAL_BASE AS DOUBLE PRECISION) / 100.00) * CAST(COALESCE(XY2.PRECO_VENDA, 0) AS DOUBLE PRECISION)), XY.DECIMAIS_BASE), COALESCE(XY2.PRECO_VENDA, 0))
            
                                    FROM (
                                        SELECT
                                            IIF(COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1, COALESCE(TP.PERCENTUAL_BASE, 0.00), 0.00) AS PERCENTUAL_BASE,
                                            COALESCE(TP.DECIMAIS_BASE, 2) AS DECIMAIS_BASE,
                                            IIF(COALESCE(TP.TABELA_PRECO_ID_BASE, 0) > 0 AND COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1, COALESCE(TP.TABELA_PRECO_ID_BASE, 0), COALESCE(CPD.TABELA_PRECO_ESP_ID, 0)) AS TAB_PRECO_ID_F,
                            
                                            IIF(COALESCE(TP.TABELA_PRECO_ID_BASE, 0) > 0 AND COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1,
                                                COALESCE((SELECT FIRST 1
                                                    Y.ID
                                                FROM TBTABELA_PRECO Y2
                                                INNER JOIN TBMODELO_PRECO Y ON Y.TABELA_ID = Y2.ID
                                                WHERE Y2.ID = COALESCE(TP.TABELA_PRECO_ID_BASE, 0) AND Y.MODELO_CODIGO = :VMODELO_ID), 0),
                                                COALESCE((SELECT FIRST 1
                                                    Y.ID
                                                FROM TBTABELA_PRECO Y2
                                                INNER JOIN TBMODELO_PRECO Y ON Y.TABELA_ID = Y2.ID
                                                WHERE Y2.ID = CPD.TABELA_PRECO_ESP_ID AND Y.MODELO_CODIGO = :VMODELO_ID), 0)
                                                ) AS MODELO_PRECO_ID
                            
                                        FROM TBCATALOGO_PRODUTO CPD, TBTABELA_PRECO TP
                                        WHERE CPD.TABELA_PRECO_ESP_ID = TP.ID
                                        AND CPD.ID = :VCATALOGO_PRODUTO_ID
                                        AND CPD.ORIGEM = '12461'
                                    ) XY
                                    LEFT JOIN TBMODELO_PRECO XY2 ON XY2.ID = XY.MODELO_PRECO_ID AND XY2.TABELA_ID = XY.TAB_PRECO_ID_F
                                    WHERE XY.MODELO_PRECO_ID > 0
                            ), 0);

        :VPRECO_RECOMENDADO = COALESCE((SELECT FIRST 1
                                        IIF(XY.PERCENTUAL_BASE > 0.00, ROUND(((CAST(XY.PERCENTUAL_BASE AS DOUBLE PRECISION) / 100.00) * CAST(COALESCE(XY2.PRECO_VENDA, 0) AS DOUBLE PRECISION)), XY.DECIMAIS_BASE), COALESCE(XY2.PRECO_VENDA, 0))
            
                                    FROM (
                                        SELECT
                                            IIF(COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1, COALESCE(TP.PERCENTUAL_BASE, 0.00), 0.00) AS PERCENTUAL_BASE,
                                            COALESCE(TP.DECIMAIS_BASE, 2) AS DECIMAIS_BASE,
                                            IIF(COALESCE(TP.TABELA_PRECO_ID_BASE, 0) > 0 AND COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1, COALESCE(TP.TABELA_PRECO_ID_BASE, 0), COALESCE(CPD.TABELA_PRECO_REC_ID, 0)) AS TAB_PRECO_ID_F,
                            
                                            IIF(COALESCE(TP.TABELA_PRECO_ID_BASE, 0) > 0 AND COALESCE(TP.ORIGEM_PRECO_BASE, 0) = 1,
                                                COALESCE((SELECT FIRST 1
                                                    Y.ID
                                                FROM TBTABELA_PRECO Y2
                                                INNER JOIN TBMODELO_PRECO Y ON Y.TABELA_ID = Y2.ID
                                                WHERE Y2.ID = COALESCE(TP.TABELA_PRECO_ID_BASE, 0) AND Y.MODELO_CODIGO = :VMODELO_ID), 0),
                                                COALESCE((SELECT FIRST 1
                                                    Y.ID
                                                FROM TBTABELA_PRECO Y2
                                                INNER JOIN TBMODELO_PRECO Y ON Y.TABELA_ID = Y2.ID
                                                WHERE Y2.ID = CPD.TABELA_PRECO_REC_ID AND Y.MODELO_CODIGO = :VMODELO_ID), 0)
                                                ) AS MODELO_PRECO_ID
                            
                                        FROM TBCATALOGO_PRODUTO CPD, TBTABELA_PRECO TP
                                        WHERE CPD.TABELA_PRECO_REC_ID = TP.ID
                                        AND CPD.ID = :VCATALOGO_PRODUTO_ID
                                        AND CURRENT_DATE BETWEEN TP.DATA_INICIAL AND TP.DATA_FINAL
                                        AND CPD.ORIGEM = '12461'
                                    ) XY
                                    LEFT JOIN TBMODELO_PRECO XY2 ON XY2.ID = XY.MODELO_PRECO_ID AND XY2.TABELA_ID = XY.TAB_PRECO_ID_F
                                    WHERE XY.MODELO_PRECO_ID > 0
                            ), 0);

        /**********************************************************************/

        :VSTATUS = 1;
        IF (:VPRECO_VENDA <= 0 AND :VPRECO_VENDA_ESP <= 0) THEN
        BEGIN

            :VSTATUS = 0;

            EXECUTE PROCEDURE SPI_HISTORICO('TBCATALOGO_PRODUTO', :VCATALOGO_PRODUTO_ID, ('MODELO '||FN_LPAD(:VMODELO_ID, 6, '0')||' INATIVADO VIA AUTOMACAO (NENHUM PRECO ENCONTRADO)'));

        END ELSE
        IF (:VCORES = '[]') THEN
        BEGIN

            :VSTATUS = 0;

            EXECUTE PROCEDURE SPI_HISTORICO('TBCATALOGO_PRODUTO', :VCATALOGO_PRODUTO_ID, ('MODELO '||FN_LPAD(:VMODELO_ID, 6, '0')||' INATIVADO VIA AUTOMACAO (NENHUMA COR ENCONTRADA)'));

        END ELSE
        IF (:VTAMANHOS = '[]') THEN
        BEGIN

            :VSTATUS = 0;

            EXECUTE PROCEDURE SPI_HISTORICO('TBCATALOGO_PRODUTO', :VCATALOGO_PRODUTO_ID, ('MODELO '||FN_LPAD(:VMODELO_ID, 6, '0')||' INATIVADO VIA AUTOMACAO (NENHUM TAMANHO ENCONTRADO)'));

        END


        UPDATE TBCATALOGO_PRODUTO_IMPORT
            SET MODELO_DESCRICAO = :VMODELO_DESCRICAO,
                CORES = :VCORES,
                PRODUTOS = :VPRODUTOS,
                TAMANHOS = :VTAMANHOS,
                PRECO_VENDA = :VPRECO_VENDA,
                PRECO_VENDA_ESP = :VPRECO_VENDA_ESP,
                PRECO_RECOMENDADO = :VPRECO_RECOMENDADO,
                STATUS = :VSTATUS

            WHERE ID = :VID
            AND CATALOGO_PRODUTO_ID = :VCATALOGO_PRODUTO_ID;
         
    END
END
^

SET TERM ; ^

