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);
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
            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

        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

        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

        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)

    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,
        :PRODUTO_ORIGEM,
        :TAMANHO_ORIGEM
    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
            from tbproduto p, tbmodelo m
            where p.codigo = :PRODUTO_ORIGEM
            and p.modelo_codigo = m.codigo
            into VMODELO, VCOR, VFAMILIA;

            --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);
         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
            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

END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_MULT_AGP (
    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 ORDEM_PROD integer;
declare variable TIPO_CONSUMO_PROD integer;
declare variable ORDEM_ANTERIOR integer;
declare variable TIPO_CONSUMO_ANTERIOR integer;
declare variable TAMANHO_ORIGEM integer;
declare variable PRODUTO_ORIGEM_ID integer;
declare variable MODELO_ORIGEM_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) = 1;

    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_acumulado_controle REMESSA_TALAO_ID,
            D.controle REMESSA_TALAO_DETALHE_ID,
            D.modelo_codigo MODELO_ID,
            D.COR_ID,
            D.TAMANHO,
            D.TAMANHO_ORIGEM,
            T.DENSIDADE,
            T.ESPESSURA,
            T.QUANTIDADE TALAO_QUANTIDADE,
            D.quantidade_pedido QUANTIDADE,
            D.QUANTIDADE_ALTERN,
            P.FAMILIA_CODIGO,
            D.produto_codigo PRODUTO_ID,
            D.produto_origem PRODUTO_ORIGEM_ID,
            p2.modelo_codigo as MODELO_ORIGEM_ID,
            i.CONS_LOCALIZACAO_ID LOCALIZACAO_ID,
            T.GP_ID,
            d.kit,

            i.ordem,
            i.tipo_consumo,

            coalesce(i2.ordem,0) as ordem_ant,
            coalesce(i2.tipo_consumo,0) as tipo_consumo_ant

        FROM
            tbpedido_item_processado D,
            VWREMESSA_TALAO T,
            TBPRODUTO P,
            TBMODELO M,
            TBPRODUTO P2,
            TBMODELO M2,
            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
            D.remessa                       = T.REMESSA_ID
        AND D.remessa_acumulado_controle    = T.REMESSA_TALAO_ID
        AND P.CODIGO                        = D.produto_codigo
        AND D.estabelecimento_codigo        = :Estabelecimento_Id
        AND D.remessa                       = :REMESSA_ID
        AND M.CODIGO                        = P.MODELO_CODIGO
        AND iif(:TALAO_DETALHE_ID > 0, d.controle = :TALAO_DETALHE_ID, true)

        and i.gp_id = t.gp_id
        and p2.codigo = d.produto_origem
        and p2.modelo_codigo = m2.codigo
        and i.confi_alocacao_id  = m2.conf_agrupamento_id

    INTO
        :FAMILIA_MODELO_ID,
        :REMESSA_TALAO_ID,
        :REMESSA_TALAO_DETALHE_ID,
        :MODELO_ID,
        :COR_ID,
        :TAMANHO,
        :TAMANHO_ORIGEM,
        :DENSIDADE,
        :ESPESSURA,
        :TALAO_QUANTIDADE,
        :QUANTIDADE,
        :QUANTIDADE_ALTERNATIVA,
        :FAMILIA_ID,
        :PRODUTO_ID,
        :PRODUTO_ORIGEM_ID,
        :MODELO_ORIGEM_ID,
        :LOCALIZACAO_ID,
        :GP_ID,
        :KIT,
        :ORDEM_PROD,
        :TIPO_CONSUMO_PROD,
        :ORDEM_ANTERIOR,
        :TIPO_CONSUMO_ANTERIOR
    DO BEGIN
        /**
         * Codigo que ira referenciar pares de insumo
         */
        CONTROLE1            = COALESCE(CONTROLE1,0)+1;
        CONSUMO_QUANTIDADE1  = :QUANTIDADE;
        CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

        if(ORDEM_PROD > 1)then
        begin

            if(TIPO_CONSUMO_PROD = 0)then
            begin
                select
                    p.codigo,
                    p.cor_codigo
                from tbproduto p
                where p.modelo_codigo = :MODELO_ID
                and p.cor_codigo = fn_parametro('SISTEMA.COR_TECELAGEM_SEAMLESS')
                into :PRODUTO_ID, :COR_ID;
            end


            /* Atualiza ou insere o consumo na tabela (PROJECAO ACUMULADA) */
            UPDATE OR 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,
                FIXO
            ) VALUES (
                :ESTABELECIMENTO_ID,
                :REMESSA_ID,
                :REMESSA_TALAO_ID,
                :REMESSA_TALAO_DETALHE_ID,
                :CONTROLE1,
                :LOCALIZACAO_ID,
                :PRODUTO_ID,
                :TAMANHO,
                :DENSIDADE,
                :ESPESSURA,  
                :TALAO_QUANTIDADE,
                :CONSUMO_QUANTIDADE1,
                :CONSUMO_ALTERNATIVO1,
                :CONSUMO_QUANTIDADE1,
                :CONSUMO_ALTERNATIVO1,
                :CONSUMO_QUANTIDADE1,
                '0',
                1
            ) MATCHING (
                ESTABELECIMENTO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                PRODUTO_ID,
                TAMANHO
            );
        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
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_ALOCAR_CONSUMO (
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer,
    REMESSA_ID integer,
    BLOQUEAR integer = 0,
    TALAO_DETALHE_ID integer = 0)
as
declare variable CONSUMO_ID integer;
declare variable PRODUTO_ID integer;
declare variable LOCALIZACAO_PROCESSO integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable SALDO_ESTOQUE numeric(15,4);
begin

    if(:TALAO_DETALHE_ID = 0)then
    begin
        DELETE FROM TBESTOQUE_DETALHE_ALOCACAO a WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID and TABELA_ID = :REMESSA_ID AND TIPO = 'R';
    end else
    begin
        for
            select
                c.id
            from tbremessa_consumo c
            where c.talao_detalhe_id = :TALAO_DETALHE_ID
        into
            :CONSUMO_ID
        do begin
            DELETE FROM TBESTOQUE_DETALHE_ALOCACAO a WHERE ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID and TABELA_ID = :REMESSA_ID AND TIPO = 'R' AND a.tab_item_id = :CONSUMO_ID;
        end
    end

    for
      select
         c.id,
         c.produto_id,
         c.tamanho,
         c.consumo_kg quantidade,
         F.LOCALIZACAO_PROCESSO
      from tbremessa_consumo c
      LEFT JOIN TBPRODUTO J ON J.CODIGO = C.PRODUTO_ID
      LEFT JOIN TBFAMILIA_FICHA F ON F.FAMILIA_CODIGO = J.FAMILIA_CODIGO AND F.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
      where c.estabelecimento_id = :ESTABELECIMENTO_ID
      and c.remessa = :REMESSA_ID
      and iif(:TALAO_DETALHE_ID > 0, c.talao_detalhe_id = :TALAO_DETALHE_ID, true)
    into
        :CONSUMO_ID,
        :PRODUTO_ID,
        :TAMANHO,
        :QUANTIDADE,
        :LOCALIZACAO_PROCESSO
    do begin
        if(LOCALIZACAO_ID = 0)then
        begin
            LOCALIZACAO_ID = LOCALIZACAO_PROCESSO;
        end

        SALDO_ESTOQUE = fn_estoque_saldo_disponivel(:estabelecimento_id, :LOCALIZACAO_ID, :produto_id, :tamanho);

        if((:SALDO_ESTOQUE >= :QUANTIDADE) or (:BLOQUEAR = 1))then
        begin
            insert into TBESTOQUE_DETALHE_ALOCACAO (estabelecimento_id,tabela_id,tab_item_id,tipo, localizacao_id, produto_id, tamanho, tamanho_item, quantidade, saldo)
                values (:ESTABELECIMENTO_ID, :REMESSA_ID, :CONSUMO_ID, 'R', :LOCALIZACAO_ID, :PRODUTO_ID, :TAMANHO, 0, :QUANTIDADE, :QUANTIDADE);
        end
    end

end
^

SET TERM ; ^

