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

/* SQL para criação de grupos */
SELECT
    'INSERT INTO TBGRUPO_PRODUTO (DESCRICAO,
        STATUS,
        FAMILIA_ID,
        TIPOPRODUTO_ID,
        LOCALIZACAO_ID,
        GRADE_ID,
        UNIDADEMEDIDA_SIGLA,
        NCM_CODIGO,
        HABILITA_COMPRA,
        HABILITA_VENDA,
        RENDIMENTO,
        LARGURA,
        COMPOSICAO,
        TOLERANCIA,
        PESOLIQUIDO,
        SEGURANCA,
        CUSTOUNITARIO_MEDIO,
        DESCRICAO_ETIQUETA,
        CUBAGEM_ALTURA,
        CUBAGEM_LARGURA,
        CUBAGEM_COMPRIMENTO,
        CONTROLE_BENEFICIAMENTO,
        INVENTARIO,
        PROGRAMAR_SEM_ESTOQUE,
        GERAR_OC,
        FEEF
    ) VALUES ("'||FN_IS_EMPTY(Y.GRUPO_DESC)||'",
        '||STATUS||',
        '||FAMILIA_ID||',
        '||TIPOPRODUTO_ID||',
        '||LOCALIZACAO_ID||',
        '||GRADE_ID||',
        "'||UNIDADEMEDIDA_SIGLA||'",
        "'||NCM_CODIGO||'",
        '||HABILITA_COMPRA||',
        '||HABILITA_VENDA||',
        '||RENDIMENTO||',
        '||LARGURA||',
        "'||COMPOSICAO||'",
        '||TOLERANCIA||',
        '||PESOLIQUIDO||',
        '||SEGURANCA||',
        '||CUSTOUNITARIO_MEDIO||',
        "'||DESCRICAO_ETIQUETA||'",
        '||CUBAGEM_ALTURA||',
        '||CUBAGEM_LARGURA||',
        '||CUBAGEM_COMPRIMENTO||',
        '||CONTROLE_BENEFICIAMENTO||',
        '||INVENTARIO||',
        '||PROGRAMAR_SEM_ESTOQUE||',
        '||GERAR_OC||',
        '||FEEF||'
    );' AS SQL

FROM (
    SELECT
        X.GRUPO_DESC,
    
        LIST(X.COR_ID) AS LIST_COR_ID,
        LIST(X.ID) AS LIST_PRODUTO_ID,

        COUNT(X.ID) AS COUNT_PRODUTOS,
    
        X.STATUS,
        X.FAMILIA_ID,
        X.TIPOPRODUTO_ID,
        X.LOCALIZACAO_ID,
        X.GRADE_ID,
        X.UNIDADEMEDIDA_SIGLA,
        X.NCM_CODIGO,
        MAX(X.HABILITA_COMPRA) AS HABILITA_COMPRA,
        MAX(X.HABILITA_VENDA) AS HABILITA_VENDA,
        MAX(X.RENDIMENTO) AS RENDIMENTO,
        MAX(X.LARGURA) AS LARGURA,
        X.COMPOSICAO,
        MAX(X.TOLERANCIA) AS TOLERANCIA,
        MAX(X.PESOLIQUIDO) AS PESOLIQUIDO,
        MAX(X.SEGURANCA) AS SEGURANCA,
        MAX(X.CUSTOUNITARIO_MEDIO) AS CUSTOUNITARIO_MEDIO,
        X.DESCRICAO_ETIQUETA,
        MAX(X.CUBAGEM_ALTURA) AS CUBAGEM_ALTURA,
        MAX(X.CUBAGEM_LARGURA) AS CUBAGEM_LARGURA,
        MAX(X.CUBAGEM_COMPRIMENTO) AS CUBAGEM_COMPRIMENTO,
        MAX(X.CONTROLE_BENEFICIAMENTO) AS CONTROLE_BENEFICIAMENTO,
        MAX(X.INVENTARIO) AS INVENTARIO,
        MAX(X.PROGRAMAR_SEM_ESTOQUE) AS PROGRAMAR_SEM_ESTOQUE,
        MAX(X.GERAR_OC) AS GERAR_OC,
        MAX(X.FEEF) AS FEEF
    
    FROM (
        SELECT
            REPLACE(T.DESCRICAO, FN_IS_EMPTY(C.DESCRICAO), '') AS GRUPO_DESC,
    
            T.COR_CODIGO AS COR_ID,
            C.DESCRICAO AS COR_DESC,
        
            T.CODIGO AS ID,
            T.DESCRICAO,
            T.STATUS,
            COALESCE(T.FAMILIA_CODIGO, 0) AS FAMILIA_ID,
            COALESCE(T.TIPOPRODUTO_CODIGO, 0) AS TIPOPRODUTO_ID,
            COALESCE(T.LOCALIZACAO_CODIGO, 0) AS LOCALIZACAO_ID,
            COALESCE(T.GRADE_CODIGO, 0) AS GRADE_ID,
            COALESCE(T.UNIDADEMEDIDA_SIGLA, '') AS UNIDADEMEDIDA_SIGLA,
            COALESCE(T.NCM_CODIGO, '') AS NCM_CODIGO,
            COALESCE(T.HABILITA_COMPRA, 0) AS HABILITA_COMPRA,
            COALESCE(T.HABILITA_VENDA, 0) AS HABILITA_VENDA,
            COALESCE(B.RENDIMENTO, 0) AS RENDIMENTO,
            COALESCE(T.LARGURA, 0) AS LARGURA,
            COALESCE(B.COMPOSICAO, '') AS COMPOSICAO,
            COALESCE(T.TOLERANCIA, 0) AS TOLERANCIA,
            COALESCE(B.PESOLIQUIDO, 0) AS PESOLIQUIDO,
            COALESCE(T.SEGURANCA, 0) AS SEGURANCA,
            COALESCE(A.CUSTOUNITARIO_MEDIO, 0) AS CUSTOUNITARIO_MEDIO,
            COALESCE(T.DESCRICAO_ETIQUETA, '') AS DESCRICAO_ETIQUETA,
            COALESCE(B.CUBAGEM_ALTURA, 0) AS CUBAGEM_ALTURA,
            COALESCE(B.CUBAGEM_LARGURA, 0) AS CUBAGEM_LARGURA,
            COALESCE(B.CUBAGEM_COMPRIMENTO, 0) AS CUBAGEM_COMPRIMENTO,
            COALESCE(B.CONTROLE_BENEFICIAMENTO, 0) AS CONTROLE_BENEFICIAMENTO,
            COALESCE(T.INVENTARIO, 0) AS INVENTARIO,
            COALESCE(T.PROGRAMAR_SEM_ESTOQUE, 0) AS PROGRAMAR_SEM_ESTOQUE,
            COALESCE(T.GERAR_OC, 0) AS GERAR_OC,
            COALESCE(T.FEEF, 0) AS FEEF
        
        FROM TBPRODUTO T
        LEFT JOIN TBPRODUTO_CONTABIL A ON A.PRODUTO_CODIGO = T.CODIGO
        LEFT JOIN TBPRODUTO_FICHA B ON B.PRODUTO_CODIGO = T.CODIGO
        INNER JOIN TBCOR C ON C.CODIGO = T.COR_CODIGO
        WHERE T.STATUS = '1'
        AND T.CODIGO > 0
        AND T.COR_CODIGO > 0
        AND COALESCE(T.MODELO_CODIGO, 0) = 0
		AND COALESCE(T.GRUPO_PRODUTO_ID, 0) = 0
    
    ) X
    
    GROUP BY
        X.GRUPO_DESC,
        X.STATUS,
        X.FAMILIA_ID,
        X.TIPOPRODUTO_ID,
        X.LOCALIZACAO_ID,
        X.GRADE_ID,
        X.UNIDADEMEDIDA_SIGLA,
        X.NCM_CODIGO,
    
        X.COMPOSICAO,
        X.DESCRICAO_ETIQUETA

) Y


/**
 * Após copiar o SQL, substituir somente as aspas duplas (") por aspas simples (')
 * 
 * Obs.: Manter aspas duplas que estiverem dentro das strings
 * 
 **/
 
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/

/* Procedimento executado após criação de grupos */

SELECT
    'UPDATE TBPRODUTO
        SET GRUPO_PRODUTO_ID = '||Y.GRUPO_ID||'
        WHERE CODIGO = '||Y.ID||';' AS SQL

FROM (
    SELECT
        COALESCE((SELECT FIRST 1 F.ID FROM TBGRUPO_PRODUTO F WHERE FN_IS_EMPTY(F.DESCRICAO) = FN_IS_EMPTY(X.GRUPO_DESC)), 0) AS GRUPO_ID,
    
        X.*
    
    FROM (
        SELECT
            FN_IS_EMPTY(REPLACE(T.DESCRICAO, FN_IS_EMPTY(C.DESCRICAO), '')) AS GRUPO_DESC,
        
            T.COR_CODIGO AS COR_ID,
            C.DESCRICAO AS COR_DESC,
        
            T.CODIGO AS ID,
            T.DESCRICAO,
            T.STATUS,
            COALESCE(T.FAMILIA_CODIGO, 0) AS FAMILIA_ID,
            COALESCE(T.TIPOPRODUTO_CODIGO, 0) AS TIPOPRODUTO_ID,
            COALESCE(T.LOCALIZACAO_CODIGO, 0) AS LOCALIZACAO_ID,
            COALESCE(T.GRADE_CODIGO, 0) AS GRADE_ID,
            COALESCE(T.UNIDADEMEDIDA_SIGLA, '') AS UNIDADEMEDIDA_SIGLA,
            COALESCE(T.NCM_CODIGO, '') AS NCM_CODIGO,
            COALESCE(T.HABILITA_COMPRA, 0) AS HABILITA_COMPRA,
            COALESCE(T.HABILITA_VENDA, 0) AS HABILITA_VENDA,
            COALESCE(B.RENDIMENTO, 0) AS RENDIMENTO,
            COALESCE(T.LARGURA, 0) AS LARGURA,
            COALESCE(B.COMPOSICAO, '') AS COMPOSICAO,
            COALESCE(T.TOLERANCIA, 0) AS TOLERANCIA,
            COALESCE(B.PESOLIQUIDO, 0) AS PESOLIQUIDO,
            COALESCE(T.SEGURANCA, 0) AS SEGURANCA,
            COALESCE(A.CUSTOUNITARIO_MEDIO, 0) AS CUSTOUNITARIO_MEDIO,
            COALESCE(T.DESCRICAO_ETIQUETA, '') AS DESCRICAO_ETIQUETA,
            COALESCE(B.CUBAGEM_ALTURA, 0) AS CUBAGEM_ALTURA,
            COALESCE(B.CUBAGEM_LARGURA, 0) AS CUBAGEM_LARGURA,
            COALESCE(B.CUBAGEM_COMPRIMENTO, 0) AS CUBAGEM_COMPRIMENTO,
            COALESCE(B.CONTROLE_BENEFICIAMENTO, 0) AS CONTROLE_BENEFICIAMENTO,
            COALESCE(T.INVENTARIO, 0) AS INVENTARIO,
            COALESCE(T.PROGRAMAR_SEM_ESTOQUE, 0) AS PROGRAMAR_SEM_ESTOQUE,
            COALESCE(T.GERAR_OC, 0) AS GERAR_OC,
            COALESCE(T.FEEF, 0) AS FEEF
        
        FROM TBPRODUTO T
        LEFT JOIN TBPRODUTO_CONTABIL A ON A.PRODUTO_CODIGO = T.CODIGO
        LEFT JOIN TBPRODUTO_FICHA B ON B.PRODUTO_CODIGO = T.CODIGO
        INNER JOIN TBCOR C ON C.CODIGO = T.COR_CODIGO
        WHERE T.STATUS = '1'
        AND T.CODIGO > 0
        AND T.COR_CODIGO > 0
        AND COALESCE(T.MODELO_CODIGO, 0) = 0
		AND COALESCE(T.GRUPO_PRODUTO_ID, 0) = 0
    
    ) X
) Y




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

/* Procedure para Ajuste dos Consumos - Utilizar os Grupos de Produtos */

EXECUTE PROCEDURE SPU_CONSUMO_GRUPO_VINCULO;
