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)
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
from TBPEDIDO_ITEM_PROCESSADO P
;

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;
BEGIN
    /**
     * Limpa os registros atuais para poder recalcular
     */
    DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID;

    CONTROLE1 = 0;
    CONTROLE2 = 1;

    /**
     * Inicio do loop que carrega todos os taloes detalhados da remessa que foi parametrizada
     */
    FOR
        SELECT
            M.FAMILIA_CODIGO,
            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

        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,
            D.REMESSA_TALAO_ID,
            D.ID REMESSA_TALAO_DETALHE_ID,
            D.modelo_origem as 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

        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

    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
    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));
                                    
--                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
                    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
    
                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
                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 */
            
            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
        
            DO
            BEGIN
    
                IF(GERAR = 1)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 (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
        
                        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 ; ^

