
ALTER TABLE TBREMESSA_ITEM_PROCESSADO
    ADD NIVEL_TALAO INTEGER DEFAULT 0,
    ADD ID_ITEM_TALAO INTEGER DEFAULT 0,
    ADD ID_ITEM_PAGAR INTEGER DEFAULT 0;

ALTER TABLE TBROTEIRO_PRODUCAO_GP
    ADD GERAR_MP INTEGER DEFAULT 0;

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_cons_vinc_b0i_02 for tbremessa_consumo_vinculo
active before insert position 0
AS
DECLARE VARIABLE LOCALIZACAO_ID INTEGER ;
DECLARE VARIABLE PRODUTO_ID INTEGER ;
declare variable origem integer;
BEGIN

    :origem = (select first 1 r.origem from tbremessa r where r.numero = NEW.remessa_id) ;

    if(:origem <> '22595' and :origem <> '22584') then
        begin
    

        PRODUTO_ID = COALESCE((select first 1 coalesce(c.produto_id,0) from vwremessa_consumo C WHERE C.id = new.consumo_id),-1);
    
        /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
        LOCALIZACAO_ID = COALESCE((SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
                                   FROM TBPRODUTO P, TBFAMILIA_FICHA F,vwremessa_consumo C
                                   WHERE F.FAMILIA_CODIGO         = P.FAMILIA_CODIGO
                                     AND C.id = new.consumo_id
                                     AND F.ESTABELECIMENTO_CODIGO = c.ESTABELECIMENTO_ID
                                     AND P.CODIGO                 = c.PRODUTO_ID
                                     ),0);
    
        /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
        IF ( LOCALIZACAO_ID = 0 ) THEN
        BEGIN
            EXCEPTION "..." '3.FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || PRODUTO_ID || '. OPERACAO CANCELADA (CONSUMO ID:'||coalesce(new.consumo_id,0)||')! ';
        END
        ELSE
        BEGIN
            UPDATE VWREMESSA_CONSUMO
            SET COMPONENTE = '1',
            LOCALIZACAO_ID = :LOCALIZACAO_ID
            WHERE ID = NEW.CONSUMO_ID;
        END
    END
END
^

SET TERM ; ^

ALTER TABLE TBREMESSA
    ADD ORIGEM_GRUPO_ID INTEGER DEFAULT 0;

CREATE INDEX ITBREMESSA_17
ON TBREMESSA (ORIGEM_GRUPO_ID);


UPDATE TBMENU SET 
    DESCRICAO = 'CADASTRO DE PLANO DE PRODUÇÃO',
    DESCRICAO_RESUMIDA = 'CADASTRO DE PLANO DE PRODUÇÃO'
WHERE (CONTROLE = 22583) AND
      (GRUPO = 'PCP');

SET TERM ^ ;

CREATE OR ALTER procedure SPI_PLANO_CONSUMO (
    ROTEIRO_PRODUCAO_ID integer,
    TIPO_GERA_REMESSA integer,
    MODELO_ID integer,
    COR_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(15,4),
    TALAO_QUANTIDADE numeric(15,4),
    ESTABELECIMENTO_ID integer,
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    REMESSA_TALAO_DETALHE_ID integer,
    FAMILIA_MODELO_ID integer,
    GERAR_MP integer,
    CONTROLE integer)
returns (
    OLD_TALAO_DETALHE_ID integer,
    OLD_DESTINO_FAMILIA_ID integer,
    O_ESTABELECIMENTO_ID integer,
    O_REMESSA_ID integer,
    O_REMESSA_TALAO_ID integer,
    O_CONTROLE integer,
    O_LOCALIZACAO_ID integer,
    O_PRODUTO_ID integer,
    O_TAMANHO integer,
    O_DENSIDADE integer,
    O_ESPESSURA integer,
    O_QUANTIDADE integer,
    O_QUANTIDADE_ALTERNATIVA integer)
as
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(15,4);
declare variable FATOR_DIV numeric(15,4);
declare variable DESTINO_FAMILIA_ID integer;
declare variable UM_ALTERNATIVA varchar(10);
declare variable ACUMULA_PROJECAO char(1);
declare variable GERAR integer;
declare variable SETOR_ID integer;
declare variable PECA_CONJUNTO integer;
declare variable MODELO_CONSUMO_ID integer;
declare variable COR_CONSUMO_ID integer;
declare variable INCREMENTO integer;
declare variable CONSUMO_QUANTIDADE2 numeric(15,4);
declare variable CONSUMO_ALTERNATIVO2 numeric(15,4);
declare variable OLD_VALORES numeric(15,2);
declare variable OLD_QUANTIDADE_ORIGINAL integer;
declare variable OLD_QUANTIDADE integer;
declare variable OLD_QUANTIDADE_ALTERNATIVA integer;
declare variable DENSIDADE integer = 0;
declare variable ESPESSURA integer = 0;
declare variable VROTEIRO_PRODUCAO_ID integer;
declare variable VTIPO_GERA_REMESSA integer;
declare variable GP_ID integer;
declare variable FAMILIA_GP integer;
begin
        GP_ID = coalesce((select first 1 r.gp_id from tbremessa r where r.numero = :REMESSA_ID),0);
        FAMILIA_GP = coalesce((select first 1 e.familia_codigo from tbesteira e where e.codigo = :GP_ID),0);

        /**
         * 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 fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE     AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 1) and (B.CONSUMO_QUANTIDADE_T01 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T01 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 2) and (B.CONSUMO_QUANTIDADE_T02 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T02 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 3) and (B.CONSUMO_QUANTIDADE_T03 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T03 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 4) and (B.CONSUMO_QUANTIDADE_T04 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T04 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 5) and (B.CONSUMO_QUANTIDADE_T05 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T05 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 6) and (B.CONSUMO_QUANTIDADE_T06 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T06 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 7) and (B.CONSUMO_QUANTIDADE_T07 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T07 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 8) and (B.CONSUMO_QUANTIDADE_T08 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T08 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 9) and (B.CONSUMO_QUANTIDADE_T09 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T09 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=10) and (B.CONSUMO_QUANTIDADE_T10 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T10 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=11) and (B.CONSUMO_QUANTIDADE_T11 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T11 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=12) and (B.CONSUMO_QUANTIDADE_T12 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T12 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=13) and (B.CONSUMO_QUANTIDADE_T13 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T13 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=14) and (B.CONSUMO_QUANTIDADE_T14 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T14 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=15) and (B.CONSUMO_QUANTIDADE_T15 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T15 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=16) and (B.CONSUMO_QUANTIDADE_T16 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T16 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=17) and (B.CONSUMO_QUANTIDADE_T17 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T17 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=18) and (B.CONSUMO_QUANTIDADE_T18 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T18 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=19) and (B.CONSUMO_QUANTIDADE_T19 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T19 AS NUMERIC(15,8)), '*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=20) and (B.CONSUMO_QUANTIDADE_T20 > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)) , CAST(B.CONSUMO_QUANTIDADE_T20 AS NUMERIC(15,8)), '*') else 0 end)) as Numeric(15,4))  Projecao,
                1 FATOR_MATRIZ,
                B.FATOR_CONVERSAO,
                P.FAMILIA_CODIGO as FAMILIA_MODELO_ID,
                --FMA.FAMILIA_MODELO_ID,
                (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                --FMA.ACUMULA_PROJECAO,
                0 as ACUMULA_PROJECAO,

                coalesce((SELECT FIRST 1 1
                       FROM TBFAMILIA_MODELO_ALOCACAO A
                       WHERE A.FAMILIA_ID        = :FAMILIA_GP
                         AND A.FAMILIA_MODELO_ID = P.FAMILIA_CODIGO
                         and (A.GP_ORIGEM = :GP_ID or iif(:GERAR_MP = 1, coalesce(A.GP_ORIGEM,0) = 0, false))
                 ),0) GERAR,

                b.setor_codigo as SETOR_ID,
                b.peca_conjunto,
                p.modelo_codigo as modelo_id,
                p.cor_codigo as cor_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 b.nivel = 0
            --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 fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.QUANTIDADE   AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 1) and (B.T01         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T01             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 2) and (B.T02         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T02             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 3) and (B.T03         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T03             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 4) and (B.T04         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T04             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 5) and (B.T05         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T05             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 6) and (B.T06         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T06             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 7) and (B.T07         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T07             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 8) and (B.T08         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T08             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)= 9) and (B.T09         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T09             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=10) and (B.T10         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T10             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=11) and (B.T11         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T11             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=12) and (B.T12         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T12             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=13) and (B.T13         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T13             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=14) and (B.T14         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T14             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=15) and (B.T15         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T15             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=16) and (B.T16         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T16             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=17) and (B.T17         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T17             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=18) and (B.T18         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T18             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=19) and (B.T19         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T19             AS NUMERIC(15,8)) ,'*') else 0 end) +
                (Case When (Cast(:Tamanho as integer)=20) and (B.T20         > 0) Then fn_calc_precision_v2( Cast(:Quantidade as Numeric(15,4)), CAST(B.T20             AS NUMERIC(15,8)) ,'*') else 0 end)) as Numeric(15,8)) Projecao,
                B.FATOR_MATRIZ,
                B.FATOR_CONVERSAO,
                P.FAMILIA_CODIGO as FAMILIA_MODELO_ID,
                --FMA.FAMILIA_MODELO_ID,
                (SELECT FIRST 1 UNIDADEMEDIDA_ALTERNATIVO FROM TBFAMILIA WHERE CODIGO = P.FAMILIA_CODIGO)UM_ALTERNATIVA,
                --FMA.ACUMULA_PROJECAO,
                0 as ACUMULA_PROJECAO,

                coalesce((SELECT FIRST 1 1
                       FROM TBFAMILIA_MODELO_ALOCACAO A
                       WHERE A.FAMILIA_ID        = :FAMILIA_GP
                         AND A.FAMILIA_MODELO_ID = P.FAMILIA_CODIGO
                         and (A.GP_ORIGEM = :GP_ID or iif(:GERAR_MP = 1, coalesce(A.GP_ORIGEM,0) = 0, false))
                 ),0) GERAR,

               b.SETOR_ID as SETOR_ID,
               b.peca_conjunto,
               p.modelo_codigo as modelo_id,
               p.cor_codigo as cor_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 b.nivel = 0
            --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,
            :MODELO_CONSUMO_ID,
            :COR_CONSUMO_ID
        DO
        BEGIN

            --ao gerar consumo essa parte é da producao interna por isso tipo = 1
            SELECT first 1
                R.ROTEIRO_PRODUCAO_ID,
                COALESCE(R.TIPO_GERA_REMESSA,0) AS TIPO_GERA_REMESSA,
                COALESCE(M.GERAR_MP,0) AS GERAR_MP
            FROM TBMODELO_ROTEIRO_PRODUCAO R, TBROTEIRO_PRODUCAO S, TBROTEIRO_PRODUCAO_GP M
            WHERE R.MODELO_ID = :MODELO_ID
            and S.ID = R.ROTEIRO_PRODUCAO_ID
            and m.gp_id = :GP_ID
            and m.roteiro_producao = s.id
            and s.tipo_id = 1
            into :ROTEIRO_PRODUCAO_ID, :TIPO_GERA_REMESSA, :GERAR_MP;

            IF(VTIPO_GERA_REMESSA = 2)THEN
            begin
                exception "..." 'AAA';

                SELECT
                    OLD_TALAO_DETALHE_ID,
                    OLD_DESTINO_FAMILIA_ID,
                    O_ESTABELECIMENTO_ID,
                    O_REMESSA_ID,
                    O_REMESSA_TALAO_ID,
                    O_CONTROLE,
                    O_LOCALIZACAO_ID,
                    O_PRODUTO_ID,
                    O_TAMANHO,
                    O_DENSIDADE,
                    O_ESPESSURA,
                    O_QUANTIDADE,
                    O_QUANTIDADE_ALTERNATIVA
                FROM SPI_PLANO_CONSUMO(
                    :ROTEIRO_PRODUCAO_ID,
                    :TIPO_GERA_REMESSA,
                    :MODELO_CONSUMO_ID,
                    :COR_CONSUMO_ID,
                    :PROJECAO_TAMANHO,
                    :PROJECAO_QUANTIDADE,
                    :TALAO_QUANTIDADE,
                    :ESTABELECIMENTO_ID,
                    :REMESSA_ID,
                    :REMESSA_TALAO_ID,
                    :REMESSA_TALAO_DETALHE_ID,
                    :DESTINO_FAMILIA_ID,
                    :GERAR_MP,
                    :CONTROLE
                ) INTO
                    OLD_TALAO_DETALHE_ID,
                    OLD_DESTINO_FAMILIA_ID,
                    O_ESTABELECIMENTO_ID,
                    O_REMESSA_ID,
                    O_REMESSA_TALAO_ID,
                    O_CONTROLE,
                    O_LOCALIZACAO_ID,
                    O_PRODUTO_ID,
                    O_TAMANHO,
                    O_DENSIDADE,
                    O_ESPESSURA,
                    O_QUANTIDADE,
                    O_QUANTIDADE_ALTERNATIVA;
        
                    CONTROLE = O_CONTROLE;
            end else
            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
                        CONTROLE = COALESCE(CONTROLE,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.0001)then
                            begin
                                CONSUMO_QUANTIDADE2 = 0.0001;
                            end
    
                            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));
    
                                    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,
                                        :CONTROLE,
                                        :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,  
                                        :CONTROLE,
                                        :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
                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                      = :CONTROLE                ;
                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    ;
                O_CONTROLE                      = :CONTROLE                ;
            END
        END

        suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_CONSUMO_INSUMO_PLANO (
    REMESSA_ID integer,
    TALAO_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_CONSUMO_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 MODELO_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable ROTEIRO_PRODUCAO_ID integer;
declare variable TIPO_GERA_REMESSA integer;
declare variable GERAR_MP integer;
declare variable ORDEM_GERACAO 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);

    if(TALAO_ID > 0)then
    begin
        DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID and coalesce(a.fixo,0) = 0 and a.REMESSA_TALAO_ID = :TALAO_ID;
    end else
    begin
        DELETE FROM VWREMESSA_CONSUMO A WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_ID AND A.REMESSA_ID = :REMESSA_ID and coalesce(a.fixo,0) = 0;
    end

    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
        and iif(:TALAO_ID > 0, t.REMESSA_TALAO_ID = :TALAO_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
    DO
    BEGIN
         PECA_CONJUNTO_SEQ = coalesce(PECA_CONJUNTO_SEQ,0);
         DENSIDADE = coalesce(DENSIDADE,0);
         ESPESSURA = coalesce(ESPESSURA,0);
          
        /**
         * Codigo que ira referenciar pares de insumo
         */
        CONTROLE1            = COALESCE(CONTROLE1,0)+1;
        CONSUMO_QUANTIDADE1  = :QUANTIDADE;
        CONSUMO_ALTERNATIVO1 = :QUANTIDADE_ALTERNATIVA;

        --exception "..." MODELO_ID||' | '||:GP_ID;

        --ao gerar consumo essa parte é do que esta no pedido por isso tipo = 2
        SELECT first 1
            R.ROTEIRO_PRODUCAO_ID,
            COALESCE(R.TIPO_GERA_REMESSA,0) AS TIPO_GERA_REMESSA,
            COALESCE(M.GERAR_MP,0) AS GERAR_MP,
            COALESCE(M.ORDEM,0) AS ORDEM
        FROM TBMODELO_ROTEIRO_PRODUCAO R, TBROTEIRO_PRODUCAO S, TBROTEIRO_PRODUCAO_GP M
        WHERE R.MODELO_ID = :MODELO_ID
        and S.ID = R.ROTEIRO_PRODUCAO_ID
        and m.gp_id = :GP_ID
        and m.roteiro_producao = s.id
        and s.tipo_id = 2
        into :ROTEIRO_PRODUCAO_ID, :TIPO_GERA_REMESSA, :GERAR_MP, ORDEM_GERACAO;

        SELECT
            OLD_TALAO_DETALHE_ID,
            OLD_DESTINO_FAMILIA_ID,
            O_ESTABELECIMENTO_ID,
            O_REMESSA_ID,
            O_REMESSA_TALAO_ID,
            O_CONTROLE,
            O_LOCALIZACAO_ID,
            O_PRODUTO_ID,
            O_TAMANHO,
            O_DENSIDADE,
            O_ESPESSURA,
            O_QUANTIDADE,
            O_QUANTIDADE_ALTERNATIVA
        FROM SPI_PLANO_CONSUMO(
            :ROTEIRO_PRODUCAO_ID,
            :TIPO_GERA_REMESSA,
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE,
            :TALAO_QUANTIDADE,
            :ESTABELECIMENTO_ID,
            :REMESSA_ID,
            :REMESSA_TALAO_ID,
            :REMESSA_TALAO_DETALHE_ID,
            :FAMILIA_ID,
            :GERAR_MP,
            :CONTROLE2
        ) INTO
            OLD_TALAO_DETALHE_ID,
            OLD_DESTINO_FAMILIA_ID,
            O_ESTABELECIMENTO_ID,
            O_REMESSA_ID,
            O_REMESSA_TALAO_ID,
            O_CONTROLE,
            O_LOCALIZACAO_ID,
            O_PRODUTO_ID,
            O_TAMANHO,
            O_DENSIDADE,
            O_ESPESSURA,
            O_QUANTIDADE,
            O_QUANTIDADE_ALTERNATIVA;

            CONTROLE2 = O_CONTROLE;

        if(ORDEM_GERACAO > 1)then
        begin
            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,
                1,
                :PRODUTO_ID,
                :TAMANHO,
                :DENSIDADE,
                :ESPESSURA,
                :QUANTIDADE,
                :QUANTIDADE,
                0,
                :QUANTIDADE,
                0,
                :QUANTIDADE,
                '1',
                0
            );
        end

    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REM_VINCULO_PLANO (
    REMESSA_ID integer,
    TALAO_ID integer = 0)
as
declare variable ESTABELECIMENTO_ID integer;
declare variable FAMILIA_MODELO_ID integer;
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 integer;
declare variable ESPESSURA integer;
declare variable TALAO_QUANTIDADE integer;
declare variable QUANTIDADE integer;
declare variable QUANTIDADE_ALTERNATIVA integer;
declare variable FAMILIA_ID integer;
declare variable PRODUTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable GP_ID integer;
declare variable KIT integer;
declare variable PECA_CONJUNTO_SEQ integer;
declare variable ID_ITEM_TALAO integer;
declare variable REMESSA_ORIGEM integer;
declare variable PRODUTO_CONSUMO integer;
declare variable MODELO_CONSUMO integer;
declare variable COR_CONSUMO integer;
declare variable TAMANHO_CONSUMO integer;
declare variable QUANTIDADE_CONSUMO numeric(15,4);
declare variable O_REMESSA integer;
declare variable O_TALAO_ID integer;
declare variable O_TALAO_DETALHE_ID integer;
declare variable CONSUMO_ID integer;
declare variable ORIGEM_GRUPO_ID integer;
begin

    ESTABELECIMENTO_ID = coalesce((select first 1 r.estabelecimento_codigo from tbremessa r where r.numero = :REMESSA_ID),0);

    /**
     * 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.programacao_esteira GP_ID,
            d.kit,
            d.peca_conjunto_seq,
            r.remessa_origem,
            t.id_item_talao,
            r.origem_grupo_id

        FROM
            VWREMESSA_TALAO_DETALHE D, --VWREMESSA_TALAO
            TBREMESSA_ITEM_PROCESSADO T,
            TBREMESSA R,
            TBPRODUTO P,
            TBMODELO M

        WHERE
            D.REMESSA_ID         = T.remessa
        AND D.REMESSA_TALAO_ID   = T.controle
        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 r.numero = t.remessa
        and iif(:TALAO_ID > 0, t.controle = :TALAO_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,
        :remessa_origem,
        :id_item_talao,
        :origem_grupo_id
    DO
    BEGIN
        
        /* encontrar os consumos do talao detalhado */
        for
            select
                c.id,
                c.produto_id,
                m.modelo_codigo as modelo_id,
                m.cor_codigo as cor_id,
                c.tamanho,
                c.quantidade
            from tbremessa_consumo c, tbproduto m
            where c.remessa = :REMESSA_ID
            and c.talao = :REMESSA_TALAO_ID
            and m.codigo = c.produto_id
            and c.talao_detalhe_id = :REMESSA_TALAO_DETALHE_ID
        into
            :consumo_id,
            :produto_consumo,
            :modelo_consumo,
            :cor_consumo,
            :tamanho_consumo,
            :quantidade_consumo
        do begin

            delete from TBREMESSA_CONSUMO_VINCULO f where f.consumo_id = :consumo_id;

            /* se consumo for igual produto, tamanho ao talao detalhado deve vincular a remessa que foi originada desse talao*/
            if( produto_consumo = PRODUTO_ID and
                tamanho_consumo = TAMANHO    and
                QUANTIDADE      = QUANTIDADE_CONSUMO )then
            begin
                
                /* encontrar talao que foi originado desse detalhe*/
                for
                    select
                        p.remessa,
                        c.controle as talao_id,
                        p.controle as talao_detalhe_id
                    from tbremessa r, tbpedido_item_processado p, tbremessa_item_processado c
                    where r.remessa_origem = :REMESSA_ID
                    and p.remessa = r.numero
                    and p.remessa_acumulado_controle = c.controle
                    and c.remessa = r.numero
                    and c.id_item_talao = :id_item_talao
                    and p.produto_codigo = :produto_id
                    and p.tamanho = :tamanho
               into
                  :O_REMESSA,
                  :O_TALAO_ID,
                  :O_TALAO_DETALHE_ID
               do begin

                  insert into TBREMESSA_CONSUMO_VINCULO (CONSUMO_ID, REMESSA_ID, REMESSA_TALAO_ID, REMESSA_TALAO_DETALHE_ID, QUANTIDADE, ETIQUETA)
                  values (:CONSUMO_ID, :O_REMESSA, :O_TALAO_ID, :O_TALAO_DETALHE_ID, :TALAO_QUANTIDADE, '1');

               end

            end else
            begin
                for
                    select first 1
                        r.numero as remessa_id,
                        p.controle as talao_id,
                        j.controle as talao_detalhe_id
                    from tbremessa_item_processado p, tbremessa r, tbpedido_item_processado j
                    where p.remessa = r.numero
                    and p.id_item_pagar = :id_item_talao
                    and p.produto_codigo = :produto_consumo
                    and p.tamanho = :tamanho_consumo
                    and j.remessa = r.numero
                    and j.remessa_acumulado_controle = p.controle
                    and j.quantidade_pedido = :quantidade_consumo
                    
                    and r.origem_grupo_id = :origem_grupo_id
                    
                    order by r.numero asc
                into
                  :O_REMESSA,
                  :O_TALAO_ID,
                  :O_TALAO_DETALHE_ID
                do begin

                   insert into TBREMESSA_CONSUMO_VINCULO (CONSUMO_ID, REMESSA_ID, REMESSA_TALAO_ID, REMESSA_TALAO_DETALHE_ID, QUANTIDADE, ETIQUETA)
                   values (:CONSUMO_ID, :O_REMESSA, :O_TALAO_ID, :O_TALAO_DETALHE_ID, :TALAO_QUANTIDADE, '1');

                end
            end

        end

    END

    --suspend;
end
^

SET TERM ; ^



--------SPI_REM_CONSUMO_INSUMO_PLANO
--------SPI_PLANO_CONSUMO
--------SPI_REM_VINCULO_PLANO
--------execute procedure SPI_REM_CONSUMO_INSUMO_PLANO(44);
--------execute procedure SPI_REM_VINCULO_PLANO(50);
