ALTER TABLE TBMODELO_SETOR
    ADD PECA_ID INTEGER;

ALTER TABLE TBMODELO_SETOR ALTER COLUMN PECA_ID
SET DEFAULT 0;

ALTER trigger ttbmodelo_setor_b01iu inactive;
update TBMODELO_SETOR s set s.peca_id = 0;
ALTER trigger ttbmodelo_setor_b01iu inactive;

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_ITEM_ALOCACAO (
    REMESSA_ID integer,
    AGRUPAMENTO_ID integer)
as
declare variable ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable REMESSA integer;
declare variable TALAO integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable TIPO char(1);
declare variable SALDO numeric(18,5);
declare variable DATAHORA date;
declare variable USUARIO integer;
declare variable QUANTIDADE_ORIGINAL numeric(18,5);
declare variable VAGR_REM_ID integer;
declare variable TEMPO numeric(15,4);
declare variable UP_ID integer;
declare variable AGRUP_UP_ID integer;
declare variable ORIGEM_PRODUTO_ID integer;
begin

    --VERIFICAR SE REMESSA JA TEM VINCULOS
    select first 1
        s.id
    from TBREMESSA_ITEM_ALOCACAO s
    where s.remessa = :REMESSA_ID
    and s.tabela_id > 0
    into :ITEM_ID;
    
    ITEM_ID = coalesce(ITEM_ID,0);
    
    if(ITEM_ID > 0)then
    begin
        exception "..." 'ITENS DA ALOCACAO DA REMESSA COM PEDIDOS VINCULADOS';
    end

    --REMOVER AS BAIXA DE SALDO
    FOR
        select
            s.id
        from TBREMESSA_ITEM_ALOCACAO s
        where s.remessa = :REMESSA_ID
    into
        :VAGR_REM_ID
    DO begin
        DELETE FROM TBAGRUPAMENTO_CARGA_SKU_UP WHERE TIPO = 2 AND AGRUP_PED_ID = :VAGR_REM_ID;
    END

    --REMOVER A ALOCACAO DA REMESSA
    DELETE FROM TBREMESSA_ITEM_ALOCACAO S WHERE s.remessa = :REMESSA_ID;

    if(AGRUPAMENTO_ID > 0)then
    begin
        FOR
            select
                SETOR_CODIGO,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                DATAHORA,
                USUARIO,
                QUANTIDADE_ORIGINAL,
                TEMPO,
                ORIGEM_PRODUTO_ID
            from(
                select
                    p.setor_codigo,
                    P.estabelecimento_codigo ESTABELECIMENTO_ID,
                    P.localizacao_codigo LOCALIZACAO_ID,
                    0 TABELA_ID,
                    0 TAB_ITEM_ID,
                    P.remessa REMESSA,
                    P.controle TALAO,
                    P.produto_codigo PRODUTO_ID,
                    p.tamanho TAMANHO,
                    p.quantidade_pedido QUANTIDADE,
                    'R' TIPO,
                    p.quantidade_pedido SALDO,
                    current_date DATAHORA,
                    fn_current_user_id() USUARIO,
                    p.quantidade_pedido QUANTIDADE_ORIGINAL,
                    s.tempo * s.colaboradores as tempo,
                    P.remessa_acumulado_controle,
                    p.produto_codigo as ORIGEM_PRODUTO_ID
                FROM tbpedido_item_processado P, tbremessa R, tbprogramacao s
                WHERE P.remessa = :REMESSA_ID
                AND R.numero = P.remessa
                and s.remessa_id = p.remessa
                and s.tabela_id = p.controle
                and s.tipo = 'D'
                and coalesce(p.modelo_origem,0) = 0
                and p.peca_conjunto_id = 0
        
                union all
    
                select
                    p.setor_codigo,
                    P.estabelecimento_codigo ESTABELECIMENTO_ID,
                    P.localizacao_codigo LOCALIZACAO_ID,
                    0 TABELA_ID,
                    0 TAB_ITEM_ID,
                    P.remessa REMESSA,
                    P.controle TALAO,
                    k1.codigo PRODUTO_ID,
                    p.tamanho TAMANHO,
                    p.quantidade_pedido QUANTIDADE,
                    'R' TIPO,
                    p.quantidade_pedido SALDO,
                    current_date DATAHORA,
                    fn_current_user_id() USUARIO,
                    p.quantidade_pedido QUANTIDADE_ORIGINAL,
                    s.tempo * s.colaboradores as tempo,
                    P.remessa_acumulado_controle,
                    coalesce(k2.codigo,0) as ORIGEM_PRODUTO_ID
                FROM tbremessa R, tbprogramacao s, tbproduto k1, tbpedido_item_processado P
                left join tbproduto k2 on k2.modelo_codigo = p.modelo_origem and p.cor_id = k2.cor_codigo and p.modelo_origem > 0

                WHERE P.remessa = :REMESSA_ID
                AND R.numero = P.remessa
                and s.remessa_id = p.remessa
                and s.tabela_id = p.controle
                and s.tipo = 'D'
                and k1.modelo_codigo = p.modelo_codigo
                and p.cor_id = k1.cor_codigo
                and p.peca_conjunto_id > 0

            ) ORDER BY remessa_acumulado_controle
        into
            UP_ID,
            ESTABELECIMENTO_ID,
            LOCALIZACAO_ID,
            TABELA_ID,
            TAB_ITEM_ID,
            REMESSA,
            TALAO,
            PRODUTO_ID,
            TAMANHO,
            QUANTIDADE,
            TIPO,
            SALDO,
            DATAHORA,
            USUARIO,
            QUANTIDADE_ORIGINAL,
            TEMPO,
            ORIGEM_PRODUTO_ID
        do begin
        
           VAGR_REM_ID = GEN_ID(Gtbremessa_item_alocacao,1);
            
           --AGRUP_UP_ID = coalesce((select first 1 u.id from TBAGRUPAMENTO_CARGA_UP u where u.up_id = :UP_ID and u.agrupamento_id = :AGRUPAMENTO_ID),0);
    
           --if(AGRUP_UP_ID = 0)then
           --begin
           --     exception "..." 'AGRUPAMENTO DA UP '||:UP_ID||' NAO FOI ENCONTRADO.';
           --end
    
           --BAIXAR SALDO
           --INSERT INTO TBAGRUPAMENTO_CARGA_SKU_UP (AGRUPAMENTO_ID , AGRUP_PED_ID,  AGRUP_UP_ID,  QUANTIDADE, NECESSIDADE, TIPO) VALUES (:AGRUPAMENTO_ID, :VAGR_REM_ID, :AGRUP_UP_ID, :QUANTIDADE, :TEMPO, 2);
    
           --ALOCAR REMESSA
           INSERT INTO TBREMESSA_ITEM_ALOCACAO (
                ID,
                ESTABELECIMENTO_ID,
                LOCALIZACAO_ID,
                TABELA_ID,
                TAB_ITEM_ID,
                REMESSA,
                TALAO,
                PRODUTO_ID,
                TAMANHO,
                QUANTIDADE,
                TIPO,
                SALDO,
                USUARIO,
                AGRUPAMENTO_ID,
                TEMPO,
                QTD_BAIXA,
                SALDO_BAIXA,
                TIPO_REMESSA,
                ORIGEM_PRODUTO_ID
           ) VALUES (
                :VAGR_REM_ID,
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                :TABELA_ID,
                :TAB_ITEM_ID,
                :REMESSA,
                :TALAO,
                :PRODUTO_ID,
                :TAMANHO,
                :QUANTIDADE,
                :TIPO,
                :SALDO,
                :USUARIO,
                :AGRUPAMENTO_ID,
                :TEMPO,
                0,
                0,
                '22600',
                :ORIGEM_PRODUTO_ID
           );
    
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO_GP_V2 (
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer)
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;
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 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
            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

        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

        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

        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

        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

        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


    INTO
        :FAMILIA_MODELO_ID,
        :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
    DO
    BEGIN
         PECA_CONJUNTO_SEQ = coalesce(PECA_CONJUNTO_SEQ,0);

        /**
         * 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));
                                    
--                QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
--                CONSUMO_QUANTIDADE1  = CONSUMO_QUANTIDADE1  + OLD_QUANTIDADE;
--                CONSUMO_ALTERNATIVO1 = CONSUMO_ALTERNATIVO1 + OLD_QUANTIDADE_ALTERNATIVA;

--                QUANTIDADE           = TALAO_QUANTIDADE;
                --QUANTIDADE           = QUANTIDADE           + OLD_QUANTIDADE_ORIGINAL;
                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
        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
                    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
                    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
            INTO
                :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
                        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
^

SET TERM ; ^

