-- CAMPO CLIENTE ID NO PRODUTO

ALTER TABLE TBPRODUTO
    ADD CLIENTE_ID INTEGER DEFAULT 0 NOT NULL;

COMMENT ON COLUMN TBPRODUTO.CLIENTE_ID IS
'CAMPO PARA CATEGORIZAR INSUMO POR CLIENTE';

-- PARAMETRO DE USAR WHITE LABEL SEAMLESS

UPDATE OR INSERT INTO TBPARAMETRO (ID, TABELA, CODIGO, DESCRICAO, VALOR, GRUPO)
VALUES (GEN_ID(GTBPARAMETRO, 1), 'SISTEMA', 'USA_WHITE_LABEL_SEAMLESS', 'USA_WHITE_LABEL_SEAMLESS', '1', 'WEB27080')
MATCHING (ID);


CREATE OR ALTER VIEW VWREMESSA_TALAO_DETALHE(
    ID,
    ESTABELECIMENTO_ID,
    REMESSA_ID,
    REMESSA_TALAO_ID,
    PECA_CONJUNTO,
    LOCALIZACAO_ID,
    PRODUTO_ID,
    MODELO_ID,
    COR_ID,
    TAMANHO,
    PERFIL,
    QUANTIDADE,
    QUANTIDADE_PRODUCAO,
    QUANTIDADE_PRODUCAO_TMP,
    QUANTIDADE_SALDO,
    QUANTIDADE_ALTERN,
    QUANTIDADE_ALTERN_PRODUCAO,
    QUANTIDADE_ALTERN_PRODUCAO_TMP,
    QUANTIDADE_ALTERN_SALDO,
    STATUS,
    DATA_PRODUCAO,
    DATAHORA_PRODUCAO,
    OPERADOR_ID_PRODUCAO,
    GP_ID,
    ESTOQUE_ID,
    QUANTIDADE_SOBRA,
    QUANTIDADE_SOBRA_TMP,
    LIB,
    ESTOQUE_ID_S_TRANSF,
    ESTOQUE_ID_E_TRANSF,
    VIA_ETIQUETA,
    OBSERVACAO,
    ENDERECAMENTO_ID,
    JUSTIFICATIVA_ID,
    TURNO_PRODUCAO,
    PECA_CONJUNTO_ID,
    PECA_CONJUNTO_SEQ,
    PECA_CONJUNTO_NUM,
    MODELO_ORIGEM,
    KIT,
    FAMILIA_ID,
    PRODUTO_ORIGEM,
    TAMANHO_ORIGEM,
    AGRUPAMENTO_ID,
    CLIENTE_CODIGO,
    PEDIDO)
AS
Select
    P.CONTROLE,
    P.ESTABELECIMENTO_CODIGO,
    P.REMESSA,
    P.REMESSA_ACUMULADO_CONTROLE,
    P.PECA_CONJUNTO,
    P.LOCALIZACAO_CODIGO,
    P.PRODUTO_CODIGO,
    P.MODELO_CODIGO,
    P.COR_ID,
    P.TAMANHO,
    P.PERFIL,
    P.QUANTIDADE_PEDIDO,
    P.QUANTIDADE_PRODUCAO,
    P.QUANTIDADE_PRODUCAO_TMP,
    P.QUANTIDADE_SALDO,
    P.QUANTIDADE_ALTERN,
    P.QUANTIDADE_ALTERN_PRODUCAO,
    P.QUANTIDADE_ALTERN_PRODUCAO_TMP,
    P.QUANTIDADE_ALTERN_SALDO,
    P.SITUACAO,
    P.DATA_PRODUCAO, 
    P.HORA_PRODUCAO,
    P.OPERADOR_ID_PRODUCAO,
    P.PROGRAMACAO_ESTEIRA,
    P.ESTOQUE_ID,
    P.QUANTIDADE_SOBRA,
    P.QUANTIDADE_SOBRA_TMP ,
    P.LIB,
    P.ESTOQUE_ID_S_TRANSF,
    P.ESTOQUE_ID_E_TRANSF,
    P.VIA_ETIQUETA,
    P.OBSERVACAO,
    P.ENDERECAMENTO_ID,
    p.JUSTIFICATIVA_ID,
    p.TURNO_PRODUCAO,
    COALESCE(p.PECA_CONJUNTO_ID,0) AS PECA_CONJUNTO_ID,
    COALESCE(p.PECA_CONJUNTO_SEQ,0) AS PECA_CONJUNTO_SEQ,
    COALESCE(p.PECA_CONJUNTO_NUM,0) AS PECA_CONJUNTO_NUM,
    coalesce(P.modelo_origem,0) AS modelo_origem,
    coalesce(P.kit,0) AS kit,
    p.familia_codigo,
    p.PRODUTO_ORIGEM,
    p.tamanho_origem,
    p.AGRUPAMENTO_ID,
    P.CLIENTE_CODIGO,
    P.PEDIDO
from TBPEDIDO_ITEM_PROCESSADO P
;

UPDATE OR INSERT INTO TBPARAMETRO (ID, TABELA, CODIGO, DESCRICAO, VALOR, GRUPO)
VALUES (GEN_ID(GTBPARAMETRO, 1), 'SISTEMA', 'TRANSFER_WHITE_LABEL_SEAMLESS', 'TRANSFER_WHITE_LABEL_SEAMLESS', 163341, 'WEB22595')
MATCHING (ID);

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO_SEAMLESS (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    TALAO_DETALHE_ID integer = 0)
as
declare variable O_ESTABELECIMENTO_ID integer;
declare variable O_REMESSA_ID integer;
declare variable O_REMESSA_TALAO_ID integer;
declare variable O_CONTROLE integer;
declare variable O_LOCALIZACAO_ID integer;
declare variable O_PRODUTO_ID integer;
declare variable O_TAMANHO integer;
declare variable O_DENSIDADE numeric(15,2);
declare variable O_ESPESSURA numeric(15,2);
declare variable O_QUANTIDADE numeric(15,4);
declare variable O_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable REMESSA_TALAO_ID integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(15,4);
declare variable TALAO_QUANTIDADE numeric(15,4);
declare variable QUANTIDADE numeric(15,4);
declare variable QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_PRODUTO_ID integer;
declare variable PROJECAO_TAMANHO integer;
declare variable PROJECAO_LOCALIZACAO_ID integer;
declare variable PROJECAO_QUANTIDADE numeric(15,4);
declare variable FATOR_MULT numeric(10,1);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(10);
declare variable INCREMENTO integer;
declare variable CONTROLE2 integer;
declare variable OLD_TALAO_DETALHE_ID integer;
declare variable OLD_DESTINO_FAMILIA_ID integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable ACUMULA_PROJECAO char(1);
declare variable OLD_VALORES varchar(500);
declare variable OLD_QUANTIDADE_ORIGINAL numeric(15,4);
declare variable OLD_QUANTIDADE numeric(15,4);
declare variable OLD_QUANTIDADE_ALTERNATIVA numeric(15,4);
declare variable PROJECAO_DIRETA integer;
declare variable PROJECAO_GP integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable CONSUMO_QUANTIDADE1 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO1 numeric(15,4);
declare variable CONTROLE1 integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
declare variable UM varchar(10);
declare variable CONSUMO_PERMITE_FRACAO varchar(10);
declare variable FAMILIA_MODELO_ID integer;
declare variable GERAR integer;
declare variable SETOR_ID integer;
declare variable KIT integer;
declare variable PECA_CONJUNTO integer;
declare variable PECA_CONJUNTO_SEQ integer;
declare variable PRODUTO_ORIGEM integer;
declare variable TAMANHO_ORIGEM integer;
declare variable VMODELO integer;
declare variable VCOR integer;
declare variable VFAMILIA integer;
declare variable VTESTE varchar(500);
declare variable VMODELO_TALAO integer;
declare variable VPRODUTO_TALAO integer;
declare variable CONFI_ALOC_ID integer;
declare variable CONSUMOS_DO_FIXO integer;
declare variable CLIENTE_CODIGO integer;
declare variable CLIENTE_ID integer;
BEGIN
    /**
     * LIMPA OS REGISTROS ATUAIS PARA PODER RECALCULAR
     */

    ESTABELECIMENTO_ID = COALESCE((SELECT FIRST 1 R.ESTABELECIMENTO_CODIGO FROM TBREMESSA R WHERE R.NUMERO = :REMESSA_ID),0);

    DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND IIF(:TALAO_DETALHE_ID > 0, A.REMESSA_TALAO_DETALHE_ID = :TALAO_DETALHE_ID, TRUE) AND A.REMESSA_ID = :REMESSA_ID AND COALESCE(A.FIXO,0) = 0;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * INICIO DO LOOP QUE CARREGA TODOS OS TALOES DETALHADOS DA REMESSA QUE FOI PARAMETRIZADA
     */
    FOR

        SELECT
            FAMILIA_MODELO_ID,
            CLIENTE_CODIGO,
            REMESSA_TALAO_ID,
            REMESSA_TALAO_DETALHE_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            DENSIDADE,
            ESPESSURA,
            QUANTIDADE TALAO_QUANTIDADE,
            QUANTIDADE,
            QUANTIDADE_ALTERN,
            FAMILIA_CODIGO,
            PRODUTO_ID,
            LOCALIZACAO_ID,
            GP_ID,
            KIT,
            PECA_CONJUNTO_SEQ,
            PRODUTO_ORIGEM,
            TAMANHO_ORIGEM,
            CONF_AGRUPAMENTO_ID AS CONFI_ALOC_ID,
            (
                SELECT FIRST 1
                    IIF(I.GERAR_CONJUNTOS = 0 AND I2.GERAR_CONJUNTOS =  1, 1, 0) as DECISAO
                FROM TBCONFI_ALOCACAO_MODELO_ITENS I
                LEFT JOIN TBCONFI_ALOCACAO_MODELO_ITENS I2 ON I2.CONFI_ALOCACAO_ID = I.CONFI_ALOCACAO_ID AND I2.ORDEM = (I.ORDEM - 1)
                WHERE I.GP_ID = X.GP_ID
                AND I.CONFI_ALOCACAO_ID = CONF_AGRUPAMENTO_ID
            ) CONSUMOS_DO_FIXO
        FROM(
        SELECT
            M.FAMILIA_CODIGO AS FAMILIA_MODELO_ID,
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID,
            D.KIT,
            D.PECA_CONJUNTO_SEQ,
            D.PRODUTO_ORIGEM,
            D.TAMANHO_ORIGEM,
            M.CONF_AGRUPAMENTO_ID,
            D.CLIENTE_CODIGO

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P,
            TBMODELO M

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
        AND D.REMESSA_ID         = :REMESSA_ID
        AND M.CODIGO             = P.MODELO_CODIGO
        AND IIF(:TALAO_DETALHE_ID > 0, D.ID = :TALAO_DETALHE_ID, TRUE)

        UNION ALL

        SELECT
            M.FAMILIA_CODIGO AS FAMILIA_MODELO_ID,
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.MODELO_ORIGEM AS MODELO_ID,
            D.COR_ID,
            COALESCE((SELECT FIRST 1 K.TAMANHO FROM TBMODELO_KIT K WHERE K.ID = D.KIT),0) TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID,
            D.KIT,
            D.PECA_CONJUNTO_SEQ,
            D.PRODUTO_ORIGEM,
            D.TAMANHO_ORIGEM ,
            M.CONF_AGRUPAMENTO_ID,
            D.CLIENTE_CODIGO

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P,
            TBPRODUTO P2,
            TBMODELO M

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND P.MODELO_CODIGO      = D.MODELO_ORIGEM
        AND P.COR_CODIGO         = D.COR_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = P2.CODIGO
        AND D.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
        AND D.REMESSA_ID         = :REMESSA_ID
        AND M.CODIGO             = P.MODELO_CODIGO
        AND D.MODELO_ORIGEM      > 0
        AND IIF(:TALAO_DETALHE_ID > 0, D.ID = :TALAO_DETALHE_ID, TRUE)

        UNION ALL

        SELECT
            M.FAMILIA_CODIGO AS FAMILIA_MODELO_ID,
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            I.MODELO_ID MODELO_ID,
            I.COR_ID COR_ID,
            I.TAMANHO TAMANHO,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.PRODUTO_ID,
            D.LOCALIZACAO_ID,
            T.GP_ID,
            D.KIT,
            D.PECA_CONJUNTO_SEQ,
            D.PRODUTO_ORIGEM,
            D.TAMANHO_ORIGEM,
            M.CONF_AGRUPAMENTO_ID,
            D.CLIENTE_CODIGO

        FROM
            VWREMESSA_TALAO_DETALHE D,
            VWREMESSA_TALAO T,
            TBPRODUTO P,
            TBMODELO M,
            TBMODELO_KIT K,
            TBMODELO_KIT_ITEM I

        WHERE
            D.REMESSA_ID         = T.REMESSA_ID
        AND D.REMESSA_TALAO_ID   = T.REMESSA_TALAO_ID
        AND P.CODIGO             = D.PRODUTO_ID
        AND D.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
        AND D.REMESSA_ID         = :REMESSA_ID
        AND M.CODIGO             = P.MODELO_CODIGO
        AND D.KIT                > 0
        AND D.PECA_CONJUNTO_ID   = 0
        AND K.ID                 = D.KIT
        AND I.MODELO_KIT_ID      = K.ID
        AND IIF(:TALAO_DETALHE_ID > 0, D.ID = :TALAO_DETALHE_ID, TRUE)
         )X
    INTO
        :FAMILIA_MODELO_ID,
        :CLIENTE_CODIGO,
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :DENSIDADE,
        :ESPESSURA,
        :TALAO_QUANTIDADE,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :LOCALIZACAO_ID,
        :GP_ID,
        :KIT,
        :PECA_CONJUNTO_SEQ,
        :PRODUTO_ORIGEM,
        :TAMANHO_ORIGEM,
        :CONFI_ALOC_ID,
        :CONSUMOS_DO_FIXO
    DO
    BEGIN
         PECA_CONJUNTO_SEQ = COALESCE(PECA_CONJUNTO_SEQ,0);
         DENSIDADE = COALESCE(DENSIDADE,0);
         ESPESSURA = COALESCE(ESPESSURA,0);

         DELETE FROM TMP22040;

         INSERT INTO TMP22040 (UP_ID, PRODUTO_ID, MODELO_ID, COR_ID, TAMANHO, FAMILIA_ID) VALUES (0, :PRODUTO_ID, :MODELO_ID, :COR_ID, :TAMANHO, :FAMILIA_ID);

         IF(COALESCE(PRODUTO_ORIGEM,0) > 0 AND PRODUTO_ORIGEM <> PRODUTO_ID)THEN
         BEGIN

            SELECT
                M.CODIGO,
                P.COR_CODIGO,
                P.FAMILIA_CODIGO,
                J2.CODIGO AS VPRODUTO_TALAO,
                J2.MODELO_CODIGO
            FROM TBPRODUTO P, TBMODELO M, TBPRODUTO J, TBPRODUTO J2
            WHERE P.CODIGO = :PRODUTO_ORIGEM
            AND P.MODELO_CODIGO = M.CODIGO
            AND J.CODIGO = :PRODUTO_ID
            AND J2.MODELO_CODIGO = J.MODELO_CODIGO
            AND J2.COR_CODIGO = P.COR_CODIGO                                
            INTO VMODELO, VCOR, VFAMILIA, VPRODUTO_TALAO, VMODELO_TALAO;

            --PEGA CONSUMOS DA CAPA NA COR
            --SE COMENTAR A LINHA A BAIXO, EVITA GERACAO DUPLICADA CASO CONSUMO EM TODAS AS CORES, MAIS REMOVE A POSIBILIDADE DE CONSUMO ESPECIFICO DA COR
            INSERT INTO TMP22040 (UP_ID, PRODUTO_ID, MODELO_ID, COR_ID, TAMANHO, FAMILIA_ID) VALUES (0,:PRODUTO_ORIGEM, :VMODELO, :VCOR, :TAMANHO_ORIGEM, :VFAMILIA);

            --ADICIONADO PARA PODER PEGAR PRODUTOS DO TUBO E DO FORRO NA COR
            INSERT INTO TMP22040 (UP_ID, PRODUTO_ID, MODELO_ID, COR_ID, TAMANHO, FAMILIA_ID) VALUES (0,:VPRODUTO_TALAO, :VMODELO_TALAO, :VCOR, :TAMANHO, :VFAMILIA);

         END

         FOR
            SELECT DISTINCT
                PRODUTO_ID,
                MODELO_ID,
                COR_ID,
                TAMANHO,
                FAMILIA_ID
            FROM TMP22040
         INTO
            :PRODUTO_ID,
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :FAMILIA_ID
         DO BEGIN


            /**
             * VARIAVEL QUE VAI VERIFICAR SE SERA GERADA PROJECAO DE CONSUMO DIRETO DO PROPRIO TALAO (FAMILIA PROJECAO = FAMILIA TALAO)
             */
            PROJECAO_DIRETA = COALESCE((SELECT FIRST 1 ACUMULA_PROJECAO
                               FROM TBFAMILIA_MODELO_ALOCACAO A
                               WHERE A.FAMILIA_ID        = :FAMILIA_ID
                                 AND A.FAMILIA_MODELO_ID = :FAMILIA_ID  
                                 AND A.GP_ORIGEM         = :GP_ID
                               ),0);
    
            /* VERIFICA SE O ITEM TEM PROJECAO DE SI MESMO (CACHARREL / EDC DIV. ESPUMAS) */
            IF (PROJECAO_DIRETA > 0) THEN
            BEGIN

    
                /**
                 * CODIGO QUE IRA REFERENCIAR PARES DE INSUMO
                 */
                CONTROLE1            = COALESCE(CONTROLE1,0)+1;
                CONSUMO_QUANTIDADE1  = :QUANTIDADE;
                CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;
    
                /**
                 * VERIFICA SE ACUMULA PROJECAO
                 */
                IF (PROJECAO_DIRETA = '1') THEN
                BEGIN

                    OLD_VALORES =
                    (SELECT FIRST 1
                           (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                            LPAD(COALESCE(QUANTIDADE            ,0),20)||
                            LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                    FROM  VWREMESSA_CONSUMO
                    WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                      AND REMESSA_ID         = :REMESSA_ID
                      AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                      AND PRODUTO_ID         = :PRODUTO_ID
                      AND TAMANHO            = :TAMANHO
                    );
    
                    OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                    OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                    OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                        
                    CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
                    CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;
        
                    /* ATUALIZA OU INSERE O CONSUMO NA TABELA (PROJECAO ACUMULADA) */
                    UPDATE OR INSERT INTO
                    VWREMESSA_CONSUMO (
                        ESTABELECIMENTO_ID,
                        REMESSA_ID,
                        REMESSA_TALAO_ID,
                        CONTROLE,
                        LOCALIZACAO_ID,
                        PRODUTO_ID,
                        TAMANHO,
                        DENSIDADE,
                        ESPESSURA,
                        QUANTIDADE_ORIGINAL,
                        QUANTIDADE_NECES,
                        QUANTIDADE_NECES_ALTERN,
                        QUANTIDADE,
                        QUANTIDADE_ALTERNATIVA,
                        SALDO_BAIXAR,
                        COMPONENTE
                    ) VALUES (
                        :ESTABELECIMENTO_ID,
                        :REMESSA_ID,
                        :REMESSA_TALAO_ID,
                        :CONTROLE1,
                        :LOCALIZACAO_ID,
                        :PRODUTO_ID,
                        :TAMANHO,
                        :DENSIDADE,
                        :ESPESSURA,  
                        :TALAO_QUANTIDADE,
                        :CONSUMO_QUANTIDADE1,
                        :CONSUMO_ALTERNATIVO1,
                        :CONSUMO_QUANTIDADE1,
                        :CONSUMO_ALTERNATIVO1,
                        :CONSUMO_QUANTIDADE1,
                        '0'
                    ) MATCHING (
                        ESTABELECIMENTO_ID,
                        REMESSA_ID,
                        REMESSA_TALAO_ID,
                        PRODUTO_ID,
                        TAMANHO
                    );
                END
                ELSE
                BEGIN
    
                    /* INSERE O CONSUMO NA TABELA (PROJECAO NAO ACUMULADA) */
                    INSERT INTO
                    VWREMESSA_CONSUMO (
                        ESTABELECIMENTO_ID,
                        REMESSA_ID,
                        REMESSA_TALAO_ID,
                        REMESSA_TALAO_DETALHE_ID,      
                        CONTROLE,
                        LOCALIZACAO_ID,
                        PRODUTO_ID,
                        TAMANHO,
                        DENSIDADE,
                        ESPESSURA,
                        QUANTIDADE_ORIGINAL,
                        QUANTIDADE_NECES,
                        QUANTIDADE_NECES_ALTERN,
                        QUANTIDADE,
                        QUANTIDADE_ALTERNATIVA,
                        SALDO_BAIXAR,
                        COMPONENTE
                    ) VALUES (
                        :ESTABELECIMENTO_ID,
                        :REMESSA_ID,
                        :REMESSA_TALAO_ID,
                        :REMESSA_TALAO_DETALHE_ID,  
                        :CONTROLE1,
                        :LOCALIZACAO_ID,
                        :PRODUTO_ID,
                        :TAMANHO,
                        :DENSIDADE,
                        :ESPESSURA,    
                        :QUANTIDADE,
                        :CONSUMO_QUANTIDADE1,
                        :CONSUMO_ALTERNATIVO1, 
                        :CONSUMO_QUANTIDADE1,
                        :CONSUMO_ALTERNATIVO1, 
                        :CONSUMO_QUANTIDADE1,
                        '0'
                    );
                END
    
            END
            ELSE
            IF(:consumos_do_fixo = 1) THEN
            BEGIN
                               

                FOR
                    SELECT
                        P.MODELO_CODIGO,
                        C.tamanho,
                        P.cor_codigo,
                        COALESCE(P.CLIENTE_ID, 0) CLIENTE_ID

                    FROM VWREMESSA_CONSUMO C, TBPRODUTO P
                    WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                        AND P.CODIGO = C.PRODUTO_ID
                        AND REMESSA_ID         = :REMESSA_ID
                        AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                        AND TAMANHO            = :TAMANHO
                        AND FIXO               = 1
                 into
                    :modelo_id,
                    :tamanho,
                    :cor_id,
                    :CLIENTE_ID
                 DO BEGIN
                    /**
                     * INICIALIZA O LOOP QUE CARREGA E CALCULA A PROJECAO DE CONSUMO DO TALAO DETALHADO
                     */
                    FOR
                        /* CONSULTA DE INSUMOS INDEPENDENTE DE COR */
                        SELECT
                            *
                        FROM(
                            SELECT
                                *
                            FROM(
                                SELECT
                                    IIF(MAX(p.cliente_id) OVER() > 0 AND MAX(p.cliente_id) OVER() = :CLIENTE_CODIGO AND CAST(B.CONSUMO_PRODUTO_CODIGO AS INTEGER) = CAST(FN_PARAMETRO('SISTEMA.TRANSFER_WHITE_LABEL_SEAMLESS') AS INTEGER), -1, P.CLIENTE_ID) AS CLIENTE_ID,
                                    B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                                    B.TAM TAMANHO,
                                    P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                                    CAST((
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 0) AND (B.CONSUMO_QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 1) AND (B.CONSUMO_QUANTIDADE_T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 2) AND (B.CONSUMO_QUANTIDADE_T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 3) AND (B.CONSUMO_QUANTIDADE_T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 4) AND (B.CONSUMO_QUANTIDADE_T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 5) AND (B.CONSUMO_QUANTIDADE_T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 6) AND (B.CONSUMO_QUANTIDADE_T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 7) AND (B.CONSUMO_QUANTIDADE_T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 8) AND (B.CONSUMO_QUANTIDADE_T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 9) AND (B.CONSUMO_QUANTIDADE_T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=10) AND (B.CONSUMO_QUANTIDADE_T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=11) AND (B.CONSUMO_QUANTIDADE_T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=12) AND (B.CONSUMO_QUANTIDADE_T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=13) AND (B.CONSUMO_QUANTIDADE_T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=14) AND (B.CONSUMO_QUANTIDADE_T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=15) AND (B.CONSUMO_QUANTIDADE_T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=16) AND (B.CONSUMO_QUANTIDADE_T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=17) AND (B.CONSUMO_QUANTIDADE_T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=18) AND (B.CONSUMO_QUANTIDADE_T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=19) AND (B.CONSUMO_QUANTIDADE_T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=20) AND (B.CONSUMO_QUANTIDADE_T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4))  PROJECAO,
                                    1 FATOR_MATRIZ,
                                    B.FATOR_CONVERSAO,
                                    FMA.FAMILIA_MODELO_ID,
                                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                                    FMA.ACUMULA_PROJECAO,
                
                                    COALESCE((SELECT FIRST 1 1
                                           FROM TBFAMILIA_MODELO_ALOCACAO A
                                           WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                                             AND A.FAMILIA_MODELO_ID = P.FAMILIA_CODIGO
                                             AND (A.GP_ORIGEM         = :GP_ID OR COALESCE(A.GP_ORIGEM,0) = 0)
                                             ),0) AS GERAR,
                
                                    B.SETOR_CODIGO AS SETOR_ID,
                                    B.PECA_CONJUNTO
                    
                                FROM
                                    TBMODELO_CONSUMO B,
                                    TBMODELO M,
                                    TBPRODUTO P,
                                    TBFAMILIA_MODELO_ALOCACAO FMA
                    
                                WHERE
                                    B.MODELO_CODIGO          = :MODELO_ID
                                AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                                AND B.MODELO_CODIGO          = M.CODIGO
                                AND B.HABILITA_GERAR_CONSUMO = '1'
                                AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                                AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                                AND FMA.CONSUMO              = '1' /* CARREGA SOMENTE FAMILIAS QUE GERAM CONSUMO */
                                
                                UNION
                                /* CONSULTA DE INSUMOS POR COR */
                                SELECT
                                    IIF(MAX(p.cliente_id) OVER() > 0 AND MAX(p.cliente_id) OVER() = :CLIENTE_CODIGO AND CAST(B.PRODUTO_ID AS INTEGER) = CAST(FN_PARAMETRO('SISTEMA.TRANSFER_WHITE_LABEL_SEAMLESS') AS INTEGER), -1, P.CLIENTE_ID) AS CLIENTE_ID,
                                    B.PRODUTO_ID,
                                    B.TAM TAMANHO,
                                    P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                                    CAST((
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 0) AND (B.QUANTIDADE > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 1) AND (B.T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 2) AND (B.T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 3) AND (B.T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 4) AND (B.T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 5) AND (B.T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 6) AND (B.T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 7) AND (B.T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 8) AND (B.T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 9) AND (B.T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=10) AND (B.T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=11) AND (B.T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=12) AND (B.T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=13) AND (B.T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=14) AND (B.T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=15) AND (B.T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=16) AND (B.T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=17) AND (B.T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=18) AND (B.T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=19) AND (B.T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                    (CASE WHEN (CAST(:TAMANHO AS INTEGER)=20) AND (B.T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4)) PROJECAO,
                                    B.FATOR_MATRIZ,
                                    B.FATOR_CONVERSAO,
                                    FMA.FAMILIA_MODELO_ID,
                                    (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                                    FMA.ACUMULA_PROJECAO,
                
                                    COALESCE((SELECT FIRST 1 1
                                           FROM TBFAMILIA_MODELO_ALOCACAO A
                                           WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                                             AND A.FAMILIA_MODELO_ID = P.FAMILIA_CODIGO
                                             AND (A.GP_ORIGEM        = :GP_ID OR COALESCE(A.GP_ORIGEM,0) = 0)
                                             ),0) AS GERAR,
                    
                                   B.SETOR_ID AS SETOR_ID,
                                   B.PECA_CONJUNTO
                
                
                                FROM
                                    TBMODELO_CONSUMO_COR B,
                                    TBMODELO M,
                                    TBPRODUTO P,
                                    TBFAMILIA_MODELO_ALOCACAO FMA
                    
                                WHERE
                                    B.MODELO_ID      = :MODELO_ID
                                AND B.COR_ID         = :COR_ID
                                AND B.PRODUTO_ID     = P.CODIGO
                                AND B.MODELO_ID      = M.CODIGO      
                                AND B.HABILITA_GERAR_CONSUMO = '1'
                                AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                                AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                                AND FMA.CONSUMO      = '1' /* CARREGA SOMENTE FAMILIAS QUE GERAM CONSUMO */
                            )
                                WHERE PROJECAO > 0
                                AND
                                (CLIENTE_ID = :CLIENTE_CODIGO or CLIENTE_ID = 0)
                        ) WHERE CLIENTE_ID > -1
                    INTO
                        :cliente_id,
                        :PROJECAO_PRODUTO_ID,
                        :PROJECAO_TAMANHO,
                        :PROJECAO_LOCALIZACAO_ID,
                        :PROJECAO_QUANTIDADE,
                        :FATOR_MULT,
                        :FATOR_DIV,
                        :DESTINO_FAMILIA_ID,
                        :UM_ALTERNATIVA,
                        :ACUMULA_PROJECAO,
                        :GERAR,
                        :SETOR_ID,
                        :PECA_CONJUNTO
                    DO
                    BEGIN

--                        exception "..." 'MODELO '||COALESCE(:MODELO_ID, 0)||'COR '||COALESCE(:cor_id, 0)||'tamanho '||COALESCE(:tamanho, 0);

                        IF(GERAR = 1 AND (PECA_CONJUNTO = 0 OR PECA_CONJUNTO_SEQ = 0 OR (PECA_CONJUNTO > 0 AND PECA_CONJUNTO_SEQ > 0 AND PECA_CONJUNTO_SEQ = :PECA_CONJUNTO)))THEN
                        BEGIN
                            /**
                             * CODIGO QUE IRA REFERENCIAR PARES DE INSUMO
                             */
                            IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                                (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                            THEN
                            BEGIN
                                CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                            END
                            /**
                             * INICIO DO LOOP QUE FORMA OS PARES DE INSUMO CASO FATOR_MULT FOR MAIOR QUE 1
                             */
                            INCREMENTO = 1;
                            WHILE (INCREMENTO <= :FATOR_MULT) DO
                            BEGIN
                                /**
                                 * VERIFICA SE HOUVE ALGUMA PROJECAO GERADA
                                 */
                                IF (:PROJECAO_QUANTIDADE > 0) THEN
                                BEGIN
                                    /* CALCULA AS PROJECAES DE CONSUMO */
                                    CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                                    CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);

                                    IF(CONSUMO_QUANTIDADE2 > 0.0000999)THEN
                                    BEGIN
                                        IF (ACUMULA_PROJECAO = '1') THEN
                                        BEGIN
                
                                            OLD_VALORES =
                                            (SELECT FIRST 1
                                                   (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                                    LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                                    LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                                            FROM  VWREMESSA_CONSUMO
                                            WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                              AND REMESSA_ID         = :REMESSA_ID
                                              AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                              AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                              AND TAMANHO            = :PROJECAO_TAMANHO
                                            );
                    
                                            OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                                            OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                                            OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                                
                --                            QUANTIDADE           = TALAO_QUANTIDADE;
                                            --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                                            CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                                            CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;
                
                                            /* ATUALIZA OU INSERE O CONSUMO NA TABELA (PROJECAO ACUMULADA) */
                                            UPDATE OR INSERT INTO
                                            VWREMESSA_CONSUMO_V2 (
                                                ESTABELECIMENTO_ID,
                                                REMESSA_ID,
                                                REMESSA_TALAO_ID,
                                                CONTROLE,
                                                LOCALIZACAO_ID,
                                                PRODUTO_ID,
                                                TAMANHO,
                                                DENSIDADE,
                                                ESPESSURA,
                                                QUANTIDADE_ORIGINAL,
                                                QUANTIDADE_NECES,
                                                QUANTIDADE_NECES_ALTERN,
                                                QUANTIDADE,
                                                QUANTIDADE_ALTERNATIVA,
                                                SALDO_BAIXAR,
                                                COMPONENTE,
                                                SETOR_ID
                                            ) VALUES (
                                                :ESTABELECIMENTO_ID,
                                                :REMESSA_ID,
                                                :REMESSA_TALAO_ID,
                                                :CONTROLE2,
                                                :PROJECAO_LOCALIZACAO_ID,
                                                :PROJECAO_PRODUTO_ID,
                                                :PROJECAO_TAMANHO,
                                                :DENSIDADE,
                                                :ESPESSURA,
                                                :TALAO_QUANTIDADE,
                                                :CONSUMO_QUANTIDADE2,
                                                :CONSUMO_ALTERNATIVO2, 
                                                :CONSUMO_QUANTIDADE2,
                                                :CONSUMO_ALTERNATIVO2, 
                                                :CONSUMO_QUANTIDADE2,
                                                '0',
                                                :SETOR_ID
                                            ) MATCHING (
                                                ESTABELECIMENTO_ID,
                                                REMESSA_ID,
                                                REMESSA_TALAO_ID,
                                                PRODUTO_ID,
                                                TAMANHO
                                            );
                                        END
                                        ELSE
                                        BEGIN
                                            /* INSERE O CONSUMO NA TABELA (PROJECAO NAO ACUMULADA) */
                                            INSERT INTO
                                            VWREMESSA_CONSUMO_V2 (
                                                ESTABELECIMENTO_ID,
                                                REMESSA_ID,
                                                REMESSA_TALAO_ID,
                                                REMESSA_TALAO_DETALHE_ID,      
                                                CONTROLE,
                                                LOCALIZACAO_ID,
                                                PRODUTO_ID,
                                                TAMANHO,
                                                DENSIDADE,
                                                ESPESSURA,
                                                QUANTIDADE_ORIGINAL,  
                                                QUANTIDADE_NECES,
                                                QUANTIDADE_NECES_ALTERN,
                                                QUANTIDADE,
                                                QUANTIDADE_ALTERNATIVA,   
                                                SALDO_BAIXAR,
                                                COMPONENTE,
                                                SETOR_ID
                                            ) VALUES (
                                                :ESTABELECIMENTO_ID,
                                                :REMESSA_ID,
                                                :REMESSA_TALAO_ID,
                                                :REMESSA_TALAO_DETALHE_ID,  
                                                :CONTROLE2,
                                                :PROJECAO_LOCALIZACAO_ID,
                                                :PROJECAO_PRODUTO_ID,
                                                :PROJECAO_TAMANHO,
                                                :DENSIDADE,
                                                :ESPESSURA,
                                                :QUANTIDADE,     
                                                :CONSUMO_QUANTIDADE2,
                                                :CONSUMO_ALTERNATIVO2, 
                                                :CONSUMO_QUANTIDADE2,
                                                :CONSUMO_ALTERNATIVO2, 
                                                :CONSUMO_QUANTIDADE2,
                                                '0',
                                                :SETOR_ID
                                            );
                                        END
                                    END ELSE
                                    BEGIN
                                        --EXCEPTION "..."  CONSUMO_QUANTIDADE2;
                                    END
                                END
                                INCREMENTO = INCREMENTO+1;
                            END
                            OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                            OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                              
                            O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                            O_REMESSA_ID                    = :REMESSA_ID              ;
                            O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                            O_CONTROLE                      = :CONTROLE2               ;
                            O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                            O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                            O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                            O_DENSIDADE                     = :DENSIDADE               ;
                            O_ESPESSURA                     = :ESPESSURA               ;
                            O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                            O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
                        END
                    END
                END

            END
            ELSE
            BEGIN
                /**
                 * INICIALIZA O LOOP QUE CARREGA E CALCULA A PROJECAO DE CONSUMO DO TALAO DETALHADO
                 */
                FOR
                    /* CONSULTA DE INSUMOS INDEPENDENTE DE COR */
                    SELECT
                        *
                    FROM(
                        SELECT
                            *
                        FROM(
                            SELECT
                                IIF(MAX(p.cliente_id) OVER() > 0 AND MAX(p.cliente_id) OVER() = :CLIENTE_CODIGO AND CAST(B.CONSUMO_PRODUTO_CODIGO AS INTEGER) = CAST(FN_PARAMETRO('SISTEMA.TRANSFER_WHITE_LABEL_SEAMLESS') AS INTEGER), -1, P.CLIENTE_ID) AS CLIENTE_ID,
                                B.CONSUMO_PRODUTO_CODIGO PRODUTO_ID,
                                B.TAM TAMANHO,
                                P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                                CAST((
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 0) AND (B.CONSUMO_QUANTIDADE     > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 1) AND (B.CONSUMO_QUANTIDADE_T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 2) AND (B.CONSUMO_QUANTIDADE_T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 3) AND (B.CONSUMO_QUANTIDADE_T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 4) AND (B.CONSUMO_QUANTIDADE_T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 5) AND (B.CONSUMO_QUANTIDADE_T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 6) AND (B.CONSUMO_QUANTIDADE_T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 7) AND (B.CONSUMO_QUANTIDADE_T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 8) AND (B.CONSUMO_QUANTIDADE_T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 9) AND (B.CONSUMO_QUANTIDADE_T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=10) AND (B.CONSUMO_QUANTIDADE_T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=11) AND (B.CONSUMO_QUANTIDADE_T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=12) AND (B.CONSUMO_QUANTIDADE_T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=13) AND (B.CONSUMO_QUANTIDADE_T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=14) AND (B.CONSUMO_QUANTIDADE_T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=15) AND (B.CONSUMO_QUANTIDADE_T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=16) AND (B.CONSUMO_QUANTIDADE_T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=17) AND (B.CONSUMO_QUANTIDADE_T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=18) AND (B.CONSUMO_QUANTIDADE_T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=19) AND (B.CONSUMO_QUANTIDADE_T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=20) AND (B.CONSUMO_QUANTIDADE_T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4))  PROJECAO,
                                1 FATOR_MATRIZ,
                                B.FATOR_CONVERSAO,
                                FMA.FAMILIA_MODELO_ID,
                                (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                                FMA.ACUMULA_PROJECAO,
            
                                COALESCE((SELECT FIRST 1 1
                                       FROM TBFAMILIA_MODELO_ALOCACAO A
                                       WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                                         AND A.FAMILIA_MODELO_ID = P.FAMILIA_CODIGO
                                         AND (A.GP_ORIGEM         = :GP_ID OR COALESCE(A.GP_ORIGEM,0) = 0)
                                         ),0) AS GERAR,
            
                                B.SETOR_CODIGO AS SETOR_ID,
                                B.PECA_CONJUNTO
                
                            FROM
                                TBMODELO_CONSUMO B,
                                TBMODELO M,
                                TBPRODUTO P,
                                TBFAMILIA_MODELO_ALOCACAO FMA
                
                            WHERE
                                B.MODELO_CODIGO          = :MODELO_ID
                            AND B.CONSUMO_PRODUTO_CODIGO = P.CODIGO
                            AND B.MODELO_CODIGO          = M.CODIGO
                            AND B.HABILITA_GERAR_CONSUMO = '1'
                            AND M.FAMILIA_CODIGO         = FMA.FAMILIA_ID
                            AND P.FAMILIA_CODIGO         = FMA.FAMILIA_MODELO_ID
                            AND FMA.CONSUMO              = '1' /* CARREGA SOMENTE FAMILIAS QUE GERAM CONSUMO */
                            
                            UNION
                            /* CONSULTA DE INSUMOS POR COR */
                            SELECT
                                IIF(MAX(p.cliente_id) OVER() > 0 AND MAX(p.cliente_id) OVER() = :CLIENTE_CODIGO AND CAST(B.PRODUTO_ID AS INTEGER) = CAST(FN_PARAMETRO('SISTEMA.TRANSFER_WHITE_LABEL_SEAMLESS') AS INTEGER), -1, P.CLIENTE_ID) AS CLIENTE_ID,
                                B.PRODUTO_ID,
                                B.TAM TAMANHO,
                                P.LOCALIZACAO_CODIGO LOCALIZACAO_ID,
                                CAST((
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 0) AND (B.QUANTIDADE > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.QUANTIDADE AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 1) AND (B.T01 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T01 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 2) AND (B.T02 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T02 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 3) AND (B.T03 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T03 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 4) AND (B.T04 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T04 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 5) AND (B.T05 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T05 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 6) AND (B.T06 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T06 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 7) AND (B.T07 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T07 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 8) AND (B.T08 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T08 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)= 9) AND (B.T09 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T09 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=10) AND (B.T10 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T10 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=11) AND (B.T11 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T11 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=12) AND (B.T12 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T12 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=13) AND (B.T13 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T13 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=14) AND (B.T14 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T14 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=15) AND (B.T15 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T15 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=16) AND (B.T16 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T16 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=17) AND (B.T17 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T17 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=18) AND (B.T18 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T18 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=19) AND (B.T19 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T19 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END) +
                                (CASE WHEN (CAST(:TAMANHO AS INTEGER)=20) AND (B.T20 > 0) THEN CAST( (CAST(:QUANTIDADE AS NUMERIC(15,4)) * CAST(B.T20 AS NUMERIC(15,8))) AS NUMERIC(15,4)) ELSE 0 END)) AS NUMERIC(15,4)) PROJECAO,
                                B.FATOR_MATRIZ,
                                B.FATOR_CONVERSAO,
                                FMA.FAMILIA_MODELO_ID,
                                (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                                FMA.ACUMULA_PROJECAO,
            
                                COALESCE((SELECT FIRST 1 1
                                       FROM TBFAMILIA_MODELO_ALOCACAO A
                                       WHERE A.FAMILIA_ID        = :FAMILIA_MODELO_ID
                                         AND A.FAMILIA_MODELO_ID = P.FAMILIA_CODIGO
                                         AND (A.GP_ORIGEM        = :GP_ID OR COALESCE(A.GP_ORIGEM,0) = 0)
                                         ),0) AS GERAR,
                
                               B.SETOR_ID AS SETOR_ID,
                               B.PECA_CONJUNTO
                            FROM
                                TBMODELO_CONSUMO_COR B,
                                TBMODELO M,
                                TBPRODUTO P,
                                TBFAMILIA_MODELO_ALOCACAO FMA
                
                            WHERE
                                B.MODELO_ID      = :MODELO_ID
                            AND B.COR_ID         = :COR_ID
                            AND B.PRODUTO_ID     = P.CODIGO
                            AND B.MODELO_ID      = M.CODIGO      
                            AND B.HABILITA_GERAR_CONSUMO = '1'
                            AND M.FAMILIA_CODIGO = FMA.FAMILIA_ID
                            AND P.FAMILIA_CODIGO = FMA.FAMILIA_MODELO_ID
                            AND FMA.CONSUMO      = '1' /* CARREGA SOMENTE FAMILIAS QUE GERAM CONSUMO */
                            ) WHERE PROJECAO > 0 
                                AND
                                (CLIENTE_ID = :CLIENTE_CODIGO or CLIENTE_ID = 0)
                        ) WHERE CLIENTE_ID > -1
                INTO
                    :CLIENTE_ID,
                    :PROJECAO_PRODUTO_ID,
                    :PROJECAO_TAMANHO,
                    :PROJECAO_LOCALIZACAO_ID,
                    :PROJECAO_QUANTIDADE,
                    :FATOR_MULT,
                    :FATOR_DIV,
                    :DESTINO_FAMILIA_ID,
                    :UM_ALTERNATIVA,
                    :ACUMULA_PROJECAO,
                    :GERAR,
                    :SETOR_ID,
                    :PECA_CONJUNTO
                DO
                BEGIN


                    IF(GERAR = 1 AND (PECA_CONJUNTO = 0 OR PECA_CONJUNTO_SEQ = 0 OR (PECA_CONJUNTO > 0 AND PECA_CONJUNTO_SEQ > 0 AND PECA_CONJUNTO_SEQ = :PECA_CONJUNTO)))THEN
                    BEGIN
                        /**
                         * CODIGO QUE IRA REFERENCIAR PARES DE INSUMO
                         */
                        IF ((OLD_TALAO_DETALHE_ID   <> :REMESSA_TALAO_DETALHE_ID) OR
                            (OLD_DESTINO_FAMILIA_ID <> :DESTINO_FAMILIA_ID))
                        THEN
                        BEGIN
                            CONTROLE2 = COALESCE(CONTROLE2,0)+1;
                        END
        
                        /**
                         * INICIO DO LOOP QUE FORMA OS PARES DE INSUMO CASO FATOR_MULT FOR MAIOR QUE 1
                         */
                        INCREMENTO = 1;
                        WHILE (INCREMENTO <= :FATOR_MULT) DO
                        BEGIN
        
                            /**
                             * VERIFICA SE HOUVE ALGUMA PROJECAO GERADA
                             */
                            IF (:PROJECAO_QUANTIDADE > 0) THEN
                            BEGIN
                                /* CALCULA AS PROJECAES DE CONSUMO */
                                CONSUMO_QUANTIDADE2  = :PROJECAO_QUANTIDADE / :FATOR_DIV / :FATOR_MULT;
                                CONSUMO_ALTERNATIVO2 = IIF((TRIM(UM_ALTERNATIVA)='') OR UM_ALTERNATIVA IS NULL,0,:PROJECAO_QUANTIDADE / :FATOR_MULT);

                                IF(CONSUMO_QUANTIDADE2 > 0.0000999)THEN
                                BEGIN
                                    IF (ACUMULA_PROJECAO = '1') THEN
                                    BEGIN
            
                                        OLD_VALORES =
                                        (SELECT FIRST 1
                                               (LPAD(COALESCE(QUANTIDADE_ORIGINAL   ,0),20)||
                                                LPAD(COALESCE(QUANTIDADE            ,0),20)||
                                                LPAD(COALESCE(QUANTIDADE_ALTERNATIVA,0),20))
                                        FROM  VWREMESSA_CONSUMO
                                        WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID
                                          AND REMESSA_ID         = :REMESSA_ID
                                          AND REMESSA_TALAO_ID   = :REMESSA_TALAO_ID
                                          AND PRODUTO_ID         = :PROJECAO_PRODUTO_ID
                                          AND TAMANHO            = :PROJECAO_TAMANHO
                                        );
                
                                        OLD_QUANTIDADE_ORIGINAL    = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM  1 FOR 20),0) AS NUMERIC(15,4));
                                        OLD_QUANTIDADE             = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 21 FOR 20),0) AS NUMERIC(15,4));
                                        OLD_QUANTIDADE_ALTERNATIVA = CAST(COALESCE(SUBSTRING(OLD_VALORES FROM 41 FOR 20),0) AS NUMERIC(15,4));
                                                            
            --                            QUANTIDADE           = TALAO_QUANTIDADE;
                                        --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                                        CONSUMO_QUANTIDADE2  = CONSUMO_QUANTIDADE2  + OLD_QUANTIDADE;
                                        CONSUMO_ALTERNATIVO2 = CONSUMO_ALTERNATIVO2 + OLD_QUANTIDADE_ALTERNATIVA;
            
                                        /* ATUALIZA OU INSERE O CONSUMO NA TABELA (PROJECAO ACUMULADA) */
                                        UPDATE OR INSERT INTO
                                        VWREMESSA_CONSUMO_V2 (
                                            ESTABELECIMENTO_ID,
                                            REMESSA_ID,
                                            REMESSA_TALAO_ID,
                                            CONTROLE,
                                            LOCALIZACAO_ID,
                                            PRODUTO_ID,
                                            TAMANHO,
                                            DENSIDADE,
                                            ESPESSURA,
                                            QUANTIDADE_ORIGINAL,
                                            QUANTIDADE_NECES,
                                            QUANTIDADE_NECES_ALTERN,
                                            QUANTIDADE,
                                            QUANTIDADE_ALTERNATIVA,
                                            SALDO_BAIXAR,
                                            COMPONENTE,
                                            SETOR_ID
                                        ) VALUES (
                                            :ESTABELECIMENTO_ID,
                                            :REMESSA_ID,
                                            :REMESSA_TALAO_ID,
                                            :CONTROLE2,
                                            :PROJECAO_LOCALIZACAO_ID,
                                            :PROJECAO_PRODUTO_ID,
                                            :PROJECAO_TAMANHO,
                                            :DENSIDADE,
                                            :ESPESSURA,
                                            :TALAO_QUANTIDADE,
                                            :CONSUMO_QUANTIDADE2,
                                            :CONSUMO_ALTERNATIVO2, 
                                            :CONSUMO_QUANTIDADE2,
                                            :CONSUMO_ALTERNATIVO2, 
                                            :CONSUMO_QUANTIDADE2,
                                            '0',
                                            :SETOR_ID
                                        ) MATCHING (
                                            ESTABELECIMENTO_ID,
                                            REMESSA_ID,
                                            REMESSA_TALAO_ID,
                                            PRODUTO_ID,
                                            TAMANHO
                                        );
                                    END
                                    ELSE
                                    BEGIN
                                        /* INSERE O CONSUMO NA TABELA (PROJECAO NAO ACUMULADA) */
                                        INSERT INTO
                                        VWREMESSA_CONSUMO_V2 (
                                            ESTABELECIMENTO_ID,
                                            REMESSA_ID,
                                            REMESSA_TALAO_ID,
                                            REMESSA_TALAO_DETALHE_ID,      
                                            CONTROLE,
                                            LOCALIZACAO_ID,
                                            PRODUTO_ID,
                                            TAMANHO,
                                            DENSIDADE,
                                            ESPESSURA,
                                            QUANTIDADE_ORIGINAL,  
                                            QUANTIDADE_NECES,
                                            QUANTIDADE_NECES_ALTERN,
                                            QUANTIDADE,
                                            QUANTIDADE_ALTERNATIVA,   
                                            SALDO_BAIXAR,
                                            COMPONENTE,
                                            SETOR_ID
                                        ) VALUES (
                                            :ESTABELECIMENTO_ID,
                                            :REMESSA_ID,
                                            :REMESSA_TALAO_ID,
                                            :REMESSA_TALAO_DETALHE_ID,  
                                            :CONTROLE2,
                                            :PROJECAO_LOCALIZACAO_ID,
                                            :PROJECAO_PRODUTO_ID,
                                            :PROJECAO_TAMANHO,
                                            :DENSIDADE,
                                            :ESPESSURA,
                                            :QUANTIDADE,     
                                            :CONSUMO_QUANTIDADE2,
                                            :CONSUMO_ALTERNATIVO2, 
                                            :CONSUMO_QUANTIDADE2,
                                            :CONSUMO_ALTERNATIVO2, 
                                            :CONSUMO_QUANTIDADE2,
                                            '0',
                                            :SETOR_ID
                                        );
                                    END
                                END ELSE
                                BEGIN
                                    --EXCEPTION "..."  CONSUMO_QUANTIDADE2;
                                END
                            END
    
                            INCREMENTO = INCREMENTO+1;
                        END
                
                        OLD_TALAO_DETALHE_ID   = :REMESSA_TALAO_DETALHE_ID;
                        OLD_DESTINO_FAMILIA_ID = :DESTINO_FAMILIA_ID;
                          
                        O_ESTABELECIMENTO_ID            = :ESTABELECIMENTO_ID      ;
                        O_REMESSA_ID                    = :REMESSA_ID              ;
                        O_REMESSA_TALAO_ID              = :REMESSA_TALAO_ID        ;
                        O_CONTROLE                      = :CONTROLE2               ;
                        O_LOCALIZACAO_ID                = :PROJECAO_LOCALIZACAO_ID ;
                        O_PRODUTO_ID                    = :PROJECAO_PRODUTO_ID     ;
                        O_TAMANHO                       = :PROJECAO_TAMANHO        ;
                        O_DENSIDADE                     = :DENSIDADE               ;
                        O_ESPESSURA                     = :ESPESSURA               ;
                        O_QUANTIDADE                    = :CONSUMO_QUANTIDADE2     ;
                        O_QUANTIDADE_ALTERNATIVA        = :CONSUMO_ALTERNATIVO2    ;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

--------------------------------------


CREATE TABLE TBPRODUTO_CLIENTE (
    ID INTEGER DEFAULT 0 NOT NULL,
    PRODUTO_ID INTEGER DEFAULT 0 NOT NULL,
    CLIENTE_ID INTEGER DEFAULT 0 NOT NULL,
    DATAHORA TIMESTAMP DEFAULT LOCALTIMESTAMP NOT NULL);

CREATE SEQUENCE GTBPRODUTO_CLIENTE;

SET TERM ^ ;

create trigger ttbproduto_cliente_b01i for tbproduto_cliente
active before insert position 1
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbproduto_cliente,1);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbproduto_cliente_b01i for tbproduto_cliente
active before insert position 1
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbproduto_cliente,1);
end
^

SET TERM ; ^

COMMENT ON TRIGGER TTBPRODUTO_CLIENTE_B01I IS 'GERA O ID CASO NÃO TENHA SIDO ENVIADO';

CREATE UNIQUE INDEX ITBPRODUTO_CLIENTE_01
ON TBPRODUTO_CLIENTE (ID);

CREATE INDEX ITBPRODUTO_CLIENTE_02
ON TBPRODUTO_CLIENTE (PRODUTO_ID);

CREATE INDEX ITBPRODUTO_CLIENTE_03
ON TBPRODUTO_CLIENTE (CLIENTE_ID);

ALTER TABLE TBPRODUTO_CLIENTE
    ADD PRODUTO_GENERICO_ID INTEGER DEFAULT 0 NOT NULL;

alter table TBPRODUTO_CLIENTE
alter ID position 1;

alter table TBPRODUTO_CLIENTE
alter PRODUTO_GENERICO_ID position 2;

alter table TBPRODUTO_CLIENTE
alter PRODUTO_ID position 3;

alter table TBPRODUTO_CLIENTE
alter CLIENTE_ID position 4;

alter table TBPRODUTO_CLIENTE
alter DATAHORA position 5;

CREATE INDEX ITBPRODUTO_CLIENTE_04
ON TBPRODUTO_CLIENTE (PRODUTO_GENERICO_ID);

