SET TERM ^ ;

CREATE OR ALTER procedure SPU_BLOQUEIO_ITENS_CATALOGO (
    ICATALOGO_ID integer = 0)
as
declare variable CAT_ID integer;
declare variable CAT_DESCRICAO varchar(400);
declare variable CAT_DATA_INICIAL date;
declare variable CAT_DATA_FIM date;
declare variable CAT_ESTABELECIMENTO_ID integer;
declare variable CAT_LOCALIZACAO_ID integer;
declare variable CAT_TABELA_PRECO_ID integer;
declare variable CAT_CONTATO_VENDEDOR varchar(200);
declare variable CAT_LINK varchar(2000);
declare variable CAT_UTILIZADO varchar(10);
declare variable CAT_ALOCAR varchar(10);
declare variable CAT_ESTOQUE integer;
declare variable CAT_CANAL_VENDAS_ID integer;
declare variable CAT_VISUALIZACAO_COR integer;
declare variable CAT_VISUALIZACAO_GRADE integer;
declare variable CAT_TABELA_PRECO_ESP_ID integer;
declare variable CAT_HABILITA_ESTOQUE varchar(10);
declare variable CATI_ID integer;
declare variable CATI_CATALOGO_PRODUTO_ID integer;
declare variable CATI_ATIVO varchar(10);
declare variable CATI_MODELO_ID integer;
declare variable CATI_MODELO_DESC varchar(200);
declare variable CATI_MODELO_STATUS varchar(10);
declare variable CATI_GRADE blob sub_type 1 segment size 80;
declare variable CATC_ID integer;
declare variable CATC_CATALOGO_PRODUTO_ID integer;
declare variable CATC_MODELO_ID integer;
declare variable CATC_MODELO_DESC varchar(200);
declare variable CATC_MODELO_STATUS varchar(10);
declare variable CATC_COR_ID integer;
declare variable CATC_COR_DESC varchar(80);
declare variable CATC_COR_STATUS varchar(10);
declare variable CATC_VISIVEL integer;
declare variable CATC_ATIVO varchar(10);
declare variable ID_ITEM integer;
declare variable ESTOQUE_DISP numeric(15,8);
BEGIN
    
    IF (FN_IS_EMPTY(:ICATALOGO_ID, '0') = '0') THEN
    BEGIN
        :ICATALOGO_ID = 0;
    END

    FOR
        SELECT
            T.ID,
            T.DESCRICAO,
            T.DATA_INICIAL,
            T.DATA_FIM,
            T.ESTABELECIMENTO_ID,
            T.LOCALIZACAO_ID,
            T.TABELA_PRECO_ID,
            T.CONTATO_VENDEDOR,
            T.LINK,
            T.UTILIZADO,
            T.ALOCAR,
            T.ESTOQUE,
            T.CANAL_VENDAS_ID,
            T.VISUALIZACAO_COR,
            T.VISUALIZACAO_GRADE,
            T.TABELA_PRECO_ESP_ID,
            T.HABILITA_ESTOQUE
        
        FROM TBCATALOGO_PRODUTO T
        WHERE T.ID > 0
        AND CURRENT_DATE BETWEEN T.DATA_INICIAL AND T.DATA_FIM
        AND IIF(COALESCE(:ICATALOGO_ID, 0) > 0, (T.ID = :ICATALOGO_ID), (true = true))
        
        ORDER BY T.ID   

    INTO
        :CAT_ID,
        :CAT_DESCRICAO,
        :CAT_DATA_INICIAL,
        :CAT_DATA_FIM,
        :CAT_ESTABELECIMENTO_ID,
        :CAT_LOCALIZACAO_ID,
        :CAT_TABELA_PRECO_ID,
        :CAT_CONTATO_VENDEDOR,
        :CAT_LINK,
        :CAT_UTILIZADO,
        :CAT_ALOCAR,
        :CAT_ESTOQUE,
        :CAT_CANAL_VENDAS_ID,
        :CAT_VISUALIZACAO_COR,
        :CAT_VISUALIZACAO_GRADE,
        :CAT_TABELA_PRECO_ESP_ID,
        :CAT_HABILITA_ESTOQUE

    DO
    BEGIN

        IF (COALESCE(:CAT_HABILITA_ESTOQUE, '0') = '1') THEN
        BEGIN

            FOR
                SELECT
                    T.ID,
                    T.CATALOGO_PRODUTO_ID,
                    T.ATIVO,
                
                    T.MODELO_ID,
                    A.DESCRICAO AS MODELO_DESC,
                    A.STATUS AS MODELO_STATUS,
    
                    MAX(
                        IIF(COALESCE(A.T01, '0') = '1', COALESCE(B.T01, '')||',', '')||
                        IIF(COALESCE(A.T02, '0') = '1', COALESCE(B.T02, '')||',', '')||
                        IIF(COALESCE(A.T03, '0') = '1', COALESCE(B.T03, '')||',', '')||
                        IIF(COALESCE(A.T04, '0') = '1', COALESCE(B.T04, '')||',', '')||
                        IIF(COALESCE(A.T05, '0') = '1', COALESCE(B.T05, '')||',', '')||
                        IIF(COALESCE(A.T06, '0') = '1', COALESCE(B.T06, '')||',', '')||
                        IIF(COALESCE(A.T07, '0') = '1', COALESCE(B.T07, '')||',', '')||
                        IIF(COALESCE(A.T08, '0') = '1', COALESCE(B.T08, '')||',', '')||
                        IIF(COALESCE(A.T09, '0') = '1', COALESCE(B.T09, '')||',', '')||
                        IIF(COALESCE(A.T10, '0') = '1', COALESCE(B.T10, '')||',', '')||
                        IIF(COALESCE(A.T11, '0') = '1', COALESCE(B.T11, '')||',', '')||
                        IIF(COALESCE(A.T12, '0') = '1', COALESCE(B.T12, '')||',', '')||
                        IIF(COALESCE(A.T13, '0') = '1', COALESCE(B.T13, '')||',', '')||
                        IIF(COALESCE(A.T14, '0') = '1', COALESCE(B.T14, '')||',', '')||
                        IIF(COALESCE(A.T15, '0') = '1', COALESCE(B.T15, '')||',', '')||
                        IIF(COALESCE(A.T16, '0') = '1', COALESCE(B.T16, '')||',', '')||
                        IIF(COALESCE(A.T17, '0') = '1', COALESCE(B.T17, '')||',', '')||
                        IIF(COALESCE(A.T18, '0') = '1', COALESCE(B.T18, '')||',', '')||
                        IIF(COALESCE(A.T19, '0') = '1', COALESCE(B.T19, '')||',', '')||
                        IIF(COALESCE(A.T20, '0') = '1', COALESCE(B.T20, '')||',', '')
                        ) AS GRADE
                
                FROM TBCATALOGO_PRODUTO_ITENS T
                INNER JOIN TBMODELO A ON A.CODIGO = T.MODELO_ID
                LEFT JOIN TBGRADE B ON B.CODIGO = A.GRADE_CODIGO
                WHERE T.ID > 0
                AND T.CATALOGO_PRODUTO_ID = :CAT_ID
                
                GROUP BY
                    T.ID,
                    T.CATALOGO_PRODUTO_ID,
                    T.ATIVO,
                
                    T.MODELO_ID,
                    A.CODIGO,
                    A.DESCRICAO,
                    A.STATUS,
                    A.GRADE_CODIGO,
    
                    A.T01, A.T02, A.T03, A.T04, A.T05,
                    A.T06, A.T07, A.T08, A.T09, A.T10,
                    A.T11, A.T12, A.T13, A.T14, A.T15,
                    A.T16, A.T17, A.T18, A.T19, A.T20,
    
                    B.T01, B.T02, B.T03, B.T04, B.T05,
                    B.T06, B.T07, B.T08, B.T09, B.T10,
                    B.T11, B.T12, B.T13, B.T14, B.T15,
                    B.T16, B.T17, B.T18, B.T19, B.T20
    
                ORDER BY A.CODIGO
    
            INTO
                :CATI_ID,
                :CATI_CATALOGO_PRODUTO_ID,
                :CATI_ATIVO,
                :CATI_MODELO_ID,
                :CATI_MODELO_DESC,
                :CATI_MODELO_STATUS,
                :CATI_GRADE
    
            DO
            BEGIN
    
                FOR
                    SELECT
                        T.ID,
                        T.CATALOGO_PRODUTO_ID,
                    
                        T.MODELO_ID,
                        A.DESCRICAO AS MODELO_DESC,
                        A.STATUS AS MODELO_STATUS,
                    
                        T.COR_ID,
                        B.DESCRICAO AS COR_DESC,
                        B.STATUS AS COR_STATUS,
                    
                        T.VISIVEL,
                        T.ATIVO
                    
                    FROM TBCATALOGO_PRODUTO_CORES T
                    INNER JOIN TBMODELO A ON A.CODIGO = T.MODELO_ID
                    INNER JOIN TBCOR B ON B.CODIGO = T.COR_ID
                    WHERE T.ID > 0
                    AND T.CATALOGO_PRODUTO_ID = :CAT_ID
                    AND T.MODELO_ID = :CATI_MODELO_ID
    
                INTO
                    :CATC_ID,
                    :CATC_CATALOGO_PRODUTO_ID,
                    :CATC_MODELO_ID,
                    :CATC_MODELO_DESC,
                    :CATC_MODELO_STATUS,
                    :CATC_COR_ID,
                    :CATC_COR_DESC,
                    :CATC_COR_STATUS,
                    :CATC_VISIVEL,
                    :CATC_ATIVO
    
                DO
                BEGIN
    
                    :ESTOQUE_DISP = COALESCE(
                        (SELECT
                            COALESCE(Y.SALDO_TOTAL, 0) AS ESTOQUE_DISP
                        FROM (
                            SELECT FIRST 1
                                X.MODELO_ID,
                                IIF(:CAT_ESTOQUE = 1, X.SALDO_TOTAL_1,
                                IIF(:CAT_ESTOQUE = 2, X.SALDO_TOTAL_2, 0)) AS SALDO_TOTAL
                            FROM SPC_ESTOQUE_MODELO_SALDO_DISP(:CATC_MODELO_ID, :CAT_ESTABELECIMENTO_ID, :CAT_LOCALIZACAO_ID, :CATC_COR_ID) X
                        ) Y
                        WHERE Y.MODELO_ID = :CATI_MODELO_ID), 0);
    
                    IF (COALESCE(:ESTOQUE_DISP, 0) = 0) THEN
                    BEGIN
    
                        UPDATE TBCATALOGO_PRODUTO_CORES
                            SET ATIVO = '0'
                            WHERE ID = :CATC_ID;
    
                    END ELSE
                    BEGIN
    
                        UPDATE TBCATALOGO_PRODUTO_CORES
                            SET ATIVO = '1'
                            WHERE ID = :CATC_ID;
    
                    END
    
                END
    
                :ID_ITEM = COALESCE((SELECT FIRST 1 Z.ID FROM TBCATALOGO_PRODUTO_CORES Z WHERE Z.ID > 0 AND Z.CATALOGO_PRODUTO_ID = :CATI_CATALOGO_PRODUTO_ID AND Z.MODELO_ID = :CATI_MODELO_ID AND Z.ATIVO = '1'), 0);
    
                IF (COALESCE(:ID_ITEM, 0) = 0) THEN
                BEGIN
    
                    UPDATE TBCATALOGO_PRODUTO_ITENS
                        SET ATIVO = '0'
                        WHERE ID = :CATI_ID;
    
                END ELSE
                BEGIN
    
                    UPDATE TBCATALOGO_PRODUTO_ITENS
                        SET ATIVO = '1'
                        WHERE ID = :CATI_ID;    
    
                END
    
            END
        END
    END
END
^

SET TERM ; ^

