CREATE OR ALTER VIEW VWREMESSA_TALAO(
    ID,
    ESTABELECIMENTO_ID,
    REMESSA_ID,
    REMESSA_TALAO_ID,
    FAMILIA_ID,
    LOCALIZACAO_ID,
    PRODUTO_ID,
    MODELO_ID,
    TAMANHO,
    QUANTIDADE,
    QUANTIDADE_ALTERNATIVA,
    QUANTIDADE_SOBRA,
    GP_ID,
    UP_ID,
    ESTACAO,
    MATRIZ_ID,
    DENSIDADE,
    ESPESSURA,
    STATUS,
    OBSERVACAO,
    DATA_PRODUCAO,
    DATA_LIBERACAO,
    HORA_PRODUCAO,
    HORA_LIBERACAO,
    VIA_ETIQUETA,
    TURNO,
    TALAO_EXTRA,
    PERCENTUAL_EXTRA,
    APROVEITAMENTO_PLACA,
    OPERADOR_LIBERACAO,
    OPERADOR_PRODUCAO,
    OPERADOR_GP,
    CONSUMO_MEDIO,
    TALAO_VINCULO,
    FERRAMENTA_ID,
    FLAG_DATA,
    CHAPAS,
    PLACAS,
    placa_largura,
    placa_comprimento)
AS
SELECT
    R.ID,
    R.ESTABELECIMENTO_CODIGO,
    R.REMESSA,
    R.CONTROLE,
    R.FAMILIA_CODIGO,
    R.LOCALIZACAO_ID,
    R.PRODUTO_CODIGO,
    R.MODELO_CODIGO,
    R.TAMANHO,
    R.QUANTIDADE,
    R.QUANTIDADE_ALTERNATIVA,
    R.QUANTIDADE_SOBRA,
    R.PROGRAMACAO_ESTEIRA,
    R.UP_ID,
    R.PROGRAMACAO_BOCA,
    R.MATRIZ_CODIGO,
    R.DENSIDADE,
    R.ESPESSURA,
    R.SITUACAO,
    R.OBSERVACAO,
    R.DATA_PRODUCAO,
    R.DATA_LIBERACAO,
    R.HORA_PRODUCAO,
    R.HORA_LIBERACAO,
    R.VIA_ETIQUETA,
    R.TURNO,
    R.TALAO_EXTRA,
    R.PERCENTUAL_TALAO_EXTRA,
    R.APROVEITAMENTO,
    R.OPERADOR_LIBERACAO,
    R.OPERADOR_PRODUCAO,
    R.OPERADOR_GP,
    R.CONSUMO_MEDIO,
    R.TALAO_VINCULO,
    R.FERRAMENTA_ID,
    r.flag_data,
    r.CHAPAS,
    r.PLACAS,
    r.placa_largura,
    r.placa_comprimento
FROM TBREMESSA_ITEM_PROCESSADO R
;


CREATE OR ALTER trigger ttbremessa_consumo_b0u_03 for tbremessa_consumo
active before update position 0
AS                                        
DECLARE VARIABLE REMESSA_COMPONENTE CHAR(1) ;   
DECLARE VARIABLE LOCALIZACAO_ID INTEGER ;
DECLARE VARIABLE TABELA_ID INTEGER ;
DECLARE VARIABLE ESTOQUE_ID INTEGER ;
DECLARE VARIABLE OPERACAO_SAIDA VARCHAR(10) ;
DECLARE VARIABLE CCUSTO VARCHAR(10);
DECLARE VARIABLE GP_ID INTEGER;
DECLARE VARIABLE TMP_GP_ID INTEGER;
declare variable perfil_up varchar(50);
DECLARE VARIABLE FAMILIA_ID INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE VINCULO INTEGER;
declare variable VINCULO_QUANTIDADE INTEGER;
declare variable TALOES_PENDENTES VARCHAR(500);
Declare variable REMESSA VARChar(15);
Declare variable RREMESSA VARChar(15);
Declare variable REMESSA_WEB Char(1);
DECLARE VARIABLE REQUISICAO CHAR(1);
Begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0')
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB;

  IF (COALESCE(REMESSA_WEB,'0') = '1' ) THEN
      Begin
        
            /* ESTA TRIGGER SO SERA PROCESSADA NAS NOVAS REMESSAS (GCWEB) */
            IF ( NEW.COMPONENTE = '1' OR NEW.COMPONENTE = '0' ) THEN
            BEGIN
        
                /* 1 - CONFERIDO */
                IF ( OLD.CONFERENCIA = '0' AND NEW.CONFERENCIA = '1' AND NEW.QUANTIDADE_CONFERENCIA > 0) THEN
                BEGIN
        
                    /* GUARDA O VALOR DE UM VINCULO D0 CONSUMO (SE HOUVER) */
                    VINCULO = COALESCE((
                    SELECT FIRST 1 V.ID
                      FROM TBREMESSA_CONSUMO_VINCULO V
                     WHERE V.CONSUMO_ID = NEW.ID
                    ),0);
        
                    /* VERIFICA SE O CONSUMO TEM VINCULO */
                    IF( VINCULO > 0 ) THEN
                    BEGIN
        
                        /* GUARDA OS TALOES PENDETES DE PRODUCAO VINCULADOS A ESTE CONSUMO (SE HOUVER) */
                        SELECT
                            CAST(LIST('[ ' || R.REMESSA || '/' || fn_LPAD(D.REMESSA_TALAO_ID,4,'0') || ' (' ||
                            (CASE
                                D.STATUS
                            WHEN 1 THEN 'EM ABERTO'
                            WHEN 2 THEN 'EM PRODUCAO'
                            WHEN 3 THEN 'PRODUZIDO'
                            WHEN 6 THEN 'ENCERRADO'
                            ELSE 'INDEFINIDO' END) || ') ]',', ') AS VARCHAR(500)) as TALOES_PENDENTES,
                            list(R.REMESSA,', ') as REMESSA
                        
                        FROM
                            TBREMESSA_CONSUMO_VINCULO V,
                            VWREMESSA_TALAO_DETALHE D,
                            VWREMESSA R
                        
                        WHERE
                            V.CONSUMO_ID               = NEW.ID
                        AND V.REMESSA_TALAO_DETALHE_ID = D.ID
                        AND V.REMESSA_ID               = R.REMESSA_ID
                        AND D.STATUS                  IN ('1','2')
                        into TALOES_PENDENTES, RREMESSA;
        
                        --exception "..." RREMESSA||' - '||position('1R', RREMESSA);

                        /* VERIFICA SE HA TALOES VINCULADOS A ESTE CONSUMO QUE AINDA NAO FORAM PRODUZIDO */
                        IF ( TALOES_PENDENTES IS NOT NULL and position('1R', RREMESSA) = 0) THEN
                        BEGIN
                            EXCEPTION "..." 'HA COMPONENTES DESTE TALAO QUE AINDA NAO FORAM PRODUZIDOS: ' || TALOES_PENDENTES || '. OPERACAO CANCELADA! '||
                                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . .';
                        END
        
        
                    END
        
        
                    
        
                    /* VERIFICA SE EH PROJECAO DE COMPONENTE */
                    IF ( NEW.COMPONENTE = '1' ) THEN
                    BEGIN
        
                        /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
                        LOCALIZACAO_ID = COALESCE((SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
                                                   FROM TBPRODUTO P, TBFAMILIA_FICHA F
                                                   WHERE F.FAMILIA_CODIGO         = P.FAMILIA_CODIGO
                                                     AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_ID
                                                     AND P.CODIGO                 = NEW.PRODUTO_ID),0);
        
                        /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
                        IF ( LOCALIZACAO_ID = 0 ) THEN
                        BEGIN
                            EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! '||
                                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                        END
                    END
                    ELSE
                    BEGIN

                        VINCULO_QUANTIDADE = (SELECT COUNT(DISTINCT
                                CASE V.TIPO
                                WHEN 'R' THEN (SELECT FIRST 1 R.LOCALIZACAO_ENTRADA FROM TBREVISAO R WHERE R.ID = V.TABELA_ID)
                                WHEN 'D' THEN (SELECT FIRST 1 D.LOCALIZACAO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.ID = V.TABELA_ID)
                                ELSE 'N#D' END)
                           FROM TBREMESSA_TALAO_VINCULO V
                          WHERE V.CONSUMO_ID = NEW.ID);

                        IF ( VINCULO_QUANTIDADE > 1 ) THEN
                        BEGIN
                            EXCEPTION "..." 'AS PECAS ALOCADAS, POSSUEM LOCALIZACOES DIFERENTES. OPERACAO CANCELADA!';
                        END
                        ELSE
                        IF ( VINCULO_QUANTIDADE = 1) THEN
                        BEGIN

                            VINCULO_QUANTIDADE = coalesce((select first 1
                                                           count(CAMPO)
                                                        from(
                                                            SELECT DISTINCT
                                                                coalesce(CASE V.TIPO
                                                                WHEN 'R' THEN (SELECT FIRST 1 R.LOCALIZACAO_ENTRADA FROM TBREVISAO R WHERE R.ID = V.TABELA_ID)
                                                                WHEN 'D' THEN (SELECT FIRST 1 D.LOCALIZACAO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.ID = V.TABELA_ID)
                                                                ELSE 'N#D' END,0) as CAMPO
                                                            FROM TBREMESSA_TALAO_VINCULO V
                                                            WHERE V.CONSUMO_ID = NEW.ID
                                                        )),0);

                            if(VINCULO_QUANTIDADE > 1)then
                            begin
                                EXCEPTION "..." 'AS PECAS ALOCADAS, POSSUEM LOCALIZACOES DIFERENTES. OPERACAO CANCELADA!';    
                            end
                            
                            /* GUARDA A LOCALIZACAO DA PECAS */
                            LOCALIZACAO_ID = 
                            coalesce((SELECT DISTINCT
                                    CASE V.TIPO
                                    WHEN 'R' THEN (SELECT FIRST 1 R.LOCALIZACAO_ENTRADA FROM TBREVISAO R WHERE R.ID = V.TABELA_ID)
                                    WHEN 'D' THEN (SELECT FIRST 1 D.LOCALIZACAO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.ID = V.TABELA_ID)
                                    ELSE 'N#D' END
                               FROM TBREMESSA_TALAO_VINCULO V
                              WHERE V.CONSUMO_ID = NEW.ID),0);

                        END

                       /*
                        TABELA_ID = (SELECT coalesce(sum(v.tabela_id),0) as tabela_id
                                            FROM TBREMESSA_TALAO_VINCULO V
                                                WHERE V.CONSUMO_ID = NEW.ID);

                        IF ( coalesce(TABELA_ID,0) = 0 ) THEN
                        BEGIN
                            EXCEPTION "..." 'VINCULO COM ERRO. ID PROD.' || NEW.PRODUTO_ID || '. EXCLUA O VINCULO DESTE PRODUTO E TENTE NOVAMENTE! '||
                                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                        END
                        */

                        /* GUARDA A LOCALIZACAO PADRAO */
                        /*LOCALIZACAO_ID = COALESCE((SELECT FIRST 1 P.LOCALIZACAO_CODIGO
                                                   FROM TBPRODUTO P
                                                   WHERE P.CODIGO = NEW.PRODUTO_ID),0); */
        
                        /* VERIFICA SE A LOCALIZACAO PADRAO ESTA CONFIGURADA */
                        /*
                        IF ( coalesce(LOCALIZACAO_ID,0) = 0 ) THEN
                        BEGIN
                            EXCEPTION "..." 'PRODUTO SEM LOCALIZACAO PADRAO DEFINIDA. ID PROD.' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! '||
                                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                        END
                        */

        
                    END
        
                    --Entrada no Estoque
                    ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
        
                    NEW.CONTROLE_ESTOQUE = :ESTOQUE_ID;
        
                    
                    REQUISICAO = COALESCE((SELECT FIRST 1 REQUISICAO
                                             FROM VWREMESSA R
                                            WHERE R.REMESSA_ID = NEW.REMESSA),'0');

                    /* SE FOR CONSUMO DE UMA REMESSA DE REQUISICAO E SE FOR UM CONSUMO DE MATERIA-PRIMA */
                    if ( REQUISICAO = '1' AND NEW.COMPONENTE = '0' ) then
                    BEGIN
                        /* SIGLA DA OPERACAO DE SAIDA DO ESTOQUE PARA REMESSAS DE REQUISICAO */
                        OPERACAO_SAIDA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 95);
                    END
                    ELSE
                    BEGIN
                        IF ( NEW.COMPONENTE = '1') THEN
                        BEGIN
                            /* SIGLA DA OPERACAO DE WORK IN PROCESS SAIDA */
                            OPERACAO_SAIDA = 'WPS';
                        END
                        ELSE
                        BEGIN   
                            /* SIGLA DA OPERACAO DE SAIDA DO ESTOQUE */
                            OPERACAO_SAIDA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 97);
                        END
                    END
        
                    USUARIO_ID = (SELECT US.CODIGO FROM TBUSUARIO US WHERE US.USUARIO = (SELECT FIRST 1 MON$USER FROM MON$ATTACHMENTS WHERE MON$ATTACHMENT_ID = CURRENT_CONNECTION));
        
                    CCUSTO = (SELECT FIRST 1 U.CCUSTO
                              FROM TBUP U
                              WHERE U.ID = (SELECT FIRST 1 T.UP_ID
                                            FROM VWREMESSA_TALAO T
                                            WHERE T.REMESSA_ID = NEW.REMESSA
                                              AND T.REMESSA_TALAO_ID = NEW.TALAO));
        
                    --so da saida se projeção maior do que 0
                    if(NEW.consumo_kg > 0)then
                    begin

                        tmp_gp_id = coalesce(fn_get_context('GP_ESTOQUE'),0);

                        gp_id =  (SELECT FIRST 1 T.gp_id
                                   FROM VWREMESSA_TALAO T
                                  WHERE T.REMESSA_ID = NEW.REMESSA
                                    AND T.REMESSA_TALAO_ID = NEW.TALAO);        
        
                        perfil_up  = coalesce((select first 1 u.perfil from tbup u where u.id =
                                                (SELECT FIRST 1 T.UP_ID
                                                    FROM VWREMESSA_TALAO T
                                                    WHERE T.REMESSA_ID = NEW.REMESSA
                                                  AND T.REMESSA_TALAO_ID = NEW.talao)),'');

                        if ( tmp_gp_id > 0 ) then
                        begin
                            gp_id     = tmp_gp_id;
                            perfil_up = 'U';

                        end

                        familia_id = coalesce((select first 1 familia_codigo from tbproduto p where p.codigo = new.produto_id),0);


                        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                            3,
                            :gp_id,
                            :perfil_up,
                            :familia_id,
                            :localizacao_id,
                            'TBREMESSA_CONSUMO',
                            3,
                            new.id,
                            new.estabelecimento_id,
                            FN_DATA_PRODUCAO(),
                            new.produto_id,
                            new.tamanho,
                            NEW.QUANTIDADE_CONFERENCIA,
                            'S',
                            '1',
                            :CCUSTO,
                            'SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA:' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.TALAO,4,0),
                            :ESTOQUE_ID,
                            NEW.REMESSA,NULL,
                            (SELECT FIRST 1
                                    CASE V.TIPO
                                    WHEN 'D' THEN 'RD'||FN_LPAD(V.TABELA_ID,11,0)
                                    WHEN 'R' THEN 'P'||FN_LPAD(V.TABELA_ID,12,0)
                                    END BARRAS
                               FROM TBREMESSA_TALAO_VINCULO V
                              WHERE V.CONSUMO_ID = NEW.ID)
                        );

                    /*
                    EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
                        NEW.ESTABELECIMENTO_ID,
                        :LOCALIZACAO_ID,
                        NEW.PRODUTO_ID,
                        'S', /* S = SAIDA DO ESTOQUE */

                        --CAST(NEW.datahora_conferencia AS DATE),
                     /*   (SELECT FIRST 1 T.DATA_PRODUCAO
                          FROM TBTURNO T
                         WHERE T.TURNO_CORRENTE = '1'),

                        NEW.QUANTIDADE_CONFERENCIA,
                        IIF(NEW.TAMANHO = 1,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 2,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 3,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 4,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 5,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 6,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 7,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 8,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO = 9,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =10,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =11,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =12,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =13,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =14,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =15,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =16,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =17,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =18,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =19,NEW.QUANTIDADE_CONFERENCIA,0),
                        IIF(NEW.TAMANHO =20,NEW.QUANTIDADE_CONFERENCIA,0),
                        :ESTOQUE_ID,
                        NEW.REMESSA,
                        0,
                        0,
                        :OPERACAO_SAIDA,
                        NEW.ID,
                        0,
                        '1',
                        0,
                        :USUARIO_ID,
                        Current_Date,
                        0,
                        :CCUSTO,
                        'SAIDA POR PROJECAO DE CONSUMO DE REMESSA DE PRODUCAO',
                        '0',
                        0,
                        0,
                        0,
                        0
                    );        */


                end
        
                END ELSE
                BEGIN
                /* 0 - EXCLUSAO DE CONFERENCIA */
                IF ( OLD.CONFERENCIA = '1' AND NEW.CONFERENCIA = '0' ) THEN
                    BEGIN
                    NEW.CONTROLE_ESTOQUE = 0;
                    DELETE FROM TbEstoque_Transacao_Item
                     WHERE CONTROLE               = OLD.CONTROLE_ESTOQUE
                       AND ESTABELECIMENTO_CODIGO = OLD.ESTABELECIMENTO_ID
                       AND PRODUTO_CODIGO         = OLD.PRODUTO_ID;
                    END
                 END
        
            END

      END
END;


CREATE OR ALTER trigger ttbremessa_item_processado_b3u for tbremessa_item_processado
active before update position 5
AS
Declare variable LOCALIZACAO_PROCESSO integer;
Declare variable ESTOQUE_ID integer;
Declare variable perfil_up varchar(10);
Declare variable ccusto varchar(50);
Declare variable RREMESSA integer;
Declare variable WEB Char(1);
declare variable SALDO_TESTE NUMERIC(15,4);
Begin

  WEB = Coalesce((Select First 1 R.WEB From TbRemessa R Where R.Numero = New.Remessa),'0');

--Registra no estoque WIP o bojo cortado - para remessas do GC-WEB
--Baixa do WIP os componentes (EDC)
  IF (COALESCE(WEB,'0') = '1' ) THEN
      Begin

          If (NEW.FAMILIA_CODIGO > 0) then
              BEGIN
                      
                --INSERT INTO TMPGP_ESTOQUE (GP_ID) VALUES (100);

                fn_set_context('GP_ESTOQUE', new.programacao_esteira);

                if ((Old.Situacao = 1 and New.Situacao = 2) or
                    (Old.Situacao = 2 and New.Situacao = 1)) Then
                    Begin
        
                    LOCALIZACAO_PROCESSO = Coalesce((Select First 1 Localizacao_Processo From TbFamilia_Ficha
                                                      Where Familia_Codigo = Old.Familia_Codigo
                                                        and Estabelecimento_Codigo = Old.Estabelecimento_Codigo),0);
        

                    if (LOCALIZACAO_PROCESSO > 0) then
                        Begin
        
                                --Entra no Estoque em Processo
                                If (Old.Situacao = 1 and New.Situacao = 2 and Coalesce(OLD.ESTOQUE_ID,0) = 0) Then
                                    Begin

                                    RREMESSA = coalesce((select first 1 r.remessa_id from vwremessa r where r.remessa = '1R'||NEW.REMESSA),0);

                                    if (OLD.CONTROLE < 6000 and NEW.QUANTIDADE > 0 and RREMESSA = 0) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                        BEGIN
                                            ESTOQUE_ID = Coalesce((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
                                            perfil_up  = coalesce((select first 1 u.perfil from tbup u where u.id = new.up_id),'');
                                            CCUSTO     = (SELECT FIRST 1 U.CCUSTO FROM TBUP U WHERE U.ID = new.up_id);

                                            EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                                                5,
                                                100, --GP: CORTE
                                                'U',--:perfil_up,
                                                new.familia_codigo,
                                                new.localizacao_id,
                                                'TBREMESSA_ITEM_PROCESSADO',
                                                0,
                                                new.id,
                                                new.estabelecimento_codigo,
                                                NEW.DATA_PRODUCAO,
                                                new.produto_codigo,
                                                new.tamanho,
                                                new.quantidade,
                                                'E',
                                                '0',
                                                :CCUSTO,
                                                'Talao: ' || COALESCE(FN_LPAD(NEW.CONTROLE,4,0),''),
                                                :ESTOQUE_ID,
                                                NEW.REMESSA,
                                                OLD.ID
                                            );
                                            /*
                                            EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
                                            NEW.ESTABELECIMENTO_CODIGO,:LOCALIZACAO_PROCESSO, NEW.PRODUTO_CODIGO,
                                            'E',NEW.DATA_PRODUCAO,NEW.QUANTIDADE,
                                            IIF(NEW.TAMANHO = 1,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 2,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 3,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 4,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 5,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 6,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 7,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 8,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO = 9,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =10,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =11,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =12,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =13,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =14,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =15,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =16,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =17,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =18,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =19,NEW.QUANTIDADE,0),
                                            IIF(NEW.TAMANHO =20,NEW.QUANTIDADE,0),
                                            :ESTOQUE_ID,NEW.REMESSA,0,0,'WPE',OLD.ID,0,0,0,0,
                                            Current_Date,0,null,'','0',0,0,0,0);
                                            --*/
                                            NEW.ESTOQUE_ID = :ESTOQUE_ID;
                                        End

                                    UPDATE VWREMESSA_CONSUMO RC SET
                                    RC.Quantidade_consumo = RC.quantidade,
                                    RC.quantidade_alternativa_consumo = RC.quantidade_alternativa,
                                    RC.datahora_conferencia = NEW.DATA_PRODUCAO,
                                    RC.status = '1'
                                    Where RC.estabelecimento_id = NEW.ESTABELECIMENTO_CODIGO
                                      AND RC.REMESSA_ID = NEW.REMESSA
                                      AND RC.remessa_talao_id = NEW.CONTROLE;

                            End Else
                        --Exclui do Estoque em Processo
                        If (Old.Situacao = 2 and New.Situacao = 1 and Old.Estoque_Id > 0) Then
                            Begin

                             NEW.ESTOQUE_ID = 0;

                             DELETE FROM TbEstoque_Transacao_Item
                              WHERE TRANSACAO_CONTROLE     = 0
                                AND CONTROLE               = OLD.ESTOQUE_ID
                                AND ESTABELECIMENTO_CODIGO = OLD.ESTABELECIMENTO_CODIGO
                                AND LOCALIZACAO_CODIGO     = :LOCALIZACAO_PROCESSO
                                AND PRODUTO_CODIGO         = OLD.PRODUTO_CODIGO;

                            UPDATE VWREMESSA_CONSUMO RC SET
                            RC.Quantidade_consumo = 0,
                            RC.quantidade_alternativa_consumo = 0,
                            RC.datahora_conferencia = null,
                            RC.status = '0'
                            Where RC.estabelecimento_id = NEW.ESTABELECIMENTO_CODIGO
                              AND RC.REMESSA_ID = NEW.REMESSA
                              AND RC.remessa_talao_id = NEW.CONTROLE;

                            End
                        End

                    End
        
        
                if (Old.Situacao = New.Situacao and Old.Estoque_Id > 0 and NEW.QUANTIDADE <> OLD.QUANTIDADE) Then
                    Begin
        
                    LOCALIZACAO_PROCESSO = Coalesce((Select First 1 Localizacao_Processo From TbFamilia_Ficha
                                                      Where Familia_Codigo = Old.Familia_Codigo
                                                        and Estabelecimento_Codigo = Old.Estabelecimento_Codigo),0);
        
        
                       if (LOCALIZACAO_PROCESSO > 0) then
                           Begin

                                if (OLD.CONTROLE < 8000 and NEW.QUANTIDADE > 0) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                BEGIN

                                    ESTOQUE_ID = Coalesce((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
                                    perfil_up  = coalesce((select first 1 u.perfil from tbup u where u.id = new.up_id),'');
                                    CCUSTO     = (SELECT FIRST 1 U.CCUSTO FROM TBUP U WHERE U.ID = new.up_id);

                                    SALDO_TESTE = FN_ESTOQUE_SALDO_DISPONIVEL(new.estabelecimento_codigo,:LOCALIZACAO_PROCESSO,new.produto_codigo,new.tamanho);
--                                    EXCEPTION "..." LOCALIZACAO_PROCESSO;
                                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                                        5,
                                        100, -- GP: CORTE
                                        'U',--:perfil_up,
                                        new.familia_codigo,
                                        :LOCALIZACAO_PROCESSO,
                                        'TBREMESSA_ITEM_PROCESSADO',
                                        0,
                                        new.id,
                                        new.estabelecimento_codigo,
                                        NEW.DATA_PRODUCAO,
                                        new.produto_codigo,
                                        new.tamanho,
                                        new.quantidade,
                                        'E',
                                        '0',
                                        :CCUSTO,
                                        'Entra no Estoque em Processo',
                                        :ESTOQUE_ID,
                                        NEW.REMESSA,
                                        old.controle
                                    );

--                                    EXCEPTION "..." FN_ESTOQUE_SALDO_DISPONIVEL(new.estabelecimento_codigo,:LOCALIZACAO_PROCESSO,new.produto_codigo,new.tamanho) || ' - ANTES: ' || SALDO_TESTE;
                                    /*
                                  --Entra no Estoque em Processo
                                    EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
                                    NEW.ESTABELECIMENTO_CODIGO,:LOCALIZACAO_PROCESSO, NEW.PRODUTO_CODIGO,
                                    'E',NEW.DATA_PRODUCAO,NEW.QUANTIDADE,
                                    IIF(NEW.TAMANHO = 1,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 2,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 3,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 4,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 5,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 6,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 7,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 8,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO = 9,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =10,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =11,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =12,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =13,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =14,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =15,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =16,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =17,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =18,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =19,NEW.QUANTIDADE,0),
                                    IIF(NEW.TAMANHO =20,NEW.QUANTIDADE,0),
                                    :ESTOQUE_ID,NEW.REMESSA,0,0,'WPE',OLD.CONTROLE,0,0,0,0,
                                    Current_Date,0,null,'','0',0,0,0,0);
                                    --*/

                                    NEW.ESTOQUE_ID = :ESTOQUE_ID;

                                END else
                                if (OLD.CONTROLE < 8000 and NEW.QUANTIDADE <= 0) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                    begin
                                    NEW.ESTOQUE_ID = 0;
                                    end

                                if (OLD.CONTROLE < 8000) then --SOMENTE TALOES DE REMESSAS NORMAIS
                                    BEGIN
                                  --Exclui do Estoque em Processo
                                     DELETE FROM TbEstoque_Transacao_Item
                                      WHERE TRANSACAO_CONTROLE     = 0
                                        AND CONTROLE               = OLD.ESTOQUE_ID
                                        AND ESTABELECIMENTO_CODIGO = OLD.ESTABELECIMENTO_CODIGO
                                        AND LOCALIZACAO_CODIGO     = :LOCALIZACAO_PROCESSO
                                        AND PRODUTO_CODIGO         = OLD.PRODUTO_CODIGO;
                                    End
        
                           End
                    End
        
      End

      End
End;

CREATE OR ALTER trigger ttbpedido_item_processado_b9u for tbpedido_item_processado
active before update position 9
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_REQUISICAO VARCHAR(15);
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_FAMILIA_ID INTEGER;
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,5);         
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;

DECLARE VARIABLE VINCULO_COMPONENTE CHAR(1) ;
declare variable VINCULO_COMPONENTES VARCHAR(500) ;
DECLARE VARIABLE VINCULO_TALAO_ID INTEGER ;
DECLARE VARIABLE VINCULO_CONSUMO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_DESCRICAO VARCHAR(100) ;
DECLARE VARIABLE VINCULO_TIPO CHAR(1) ;
DECLARE VARIABLE VINCULO_TABELA_ID INTEGER ;  
DECLARE VARIABLE VINCULO_QUANTIDADE NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_SOBRA NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_ALTERNATIVA NUMERIC(15,4) ;

DECLARE VARIABLE VINCULO_REMESSA_ID INTEGER;
DECLARE VARIABLE VINCULO_REMESSA_TALAO_ID INTEGER;

DECLARE VARIABLE QUANTIDADE_CONSUMO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_CONSUMO_ALTERNATIVO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_FINAL NUMERIC(18,4);
DECLARE VARIABLE calcTemp NUMERIC(15,4);

begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           COALESCE(R.REQUISICAO,0)
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_REQUISICAO;

    IF ( REMESSA_WEB = '3' AND OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO ) THEN
    BEGIN

        /* REGISTRAR PRODUCAO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
    
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN

                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = iif( coalesce(t.flag_data,0) = 0, FN_DATA_PRODUCAO() , T.DATA_PRODUCAO)
                 WHERE T.ID     = :TALAO_ID;
    
                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3'
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                UPDATE TBUP_ESTACAO
                   SET TALAO_ID = :TALAO_ID,
                       INCREMENTO = 1
                 WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
    
    
            SELECT FIRST 1
                   P.LOCALIZACAO_CODIGO,
                   P.FAMILIA_CODIGO
              FROM TBPRODUTO P
             WHERE P.CODIGO = NEW.PRODUTO_CODIGO
              INTO TALAO_LOCALIZACAO_ID,
                   TALAO_FAMILIA_ID;
    
            TALAO_FAMILIA_ID     = COALESCE(TALAO_FAMILIA_ID    ,0);
            TALAO_LOCALIZACAO_ID = COALESCE(TALAO_LOCALIZACAO_ID,0);
    
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            
    
            /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
            TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO = FN_DATA_PRODUCAO();
    
            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            NEW.QUANTIDADE_PRODUCAO = NEW.quantidade_producao_tmp;
            NEW.QUANTIDADE_SALDO    = NEW.quantidade_producao_tmp;
    
    
            /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
            NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    

            VINCULO_REMESSA_TALAO_ID = COALESCE((
                SELECT FIRST 1 C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID),0);
            

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and not(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and VINCULO_REMESSA_TALAO_ID between 5500 and 5999) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    fn_parametro('SISTEMA.GP_TALAO_PLACA'),
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END
    

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN
    
                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 3,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                end else
                begin
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                end
				
            END

                

    
            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
    
                /* CALCULA AS QUANTIDADES CONSUMIDAS */
                QUANTIDADE_CONSUMO             = VINCULO_QUANTIDADE - VINCULO_QUANTIDADE_SOBRA;
                QUANTIDADE_CONSUMO_ALTERNATIVO = VINCULO_QUANTIDADE_ALTERNATIVA;
    
                /* ATUALIZA O STATUS DO VINCULO PARA 1 (UTILIZADO) */
                UPDATE TBREMESSA_TALAO_VINCULO V
                   SET V.STATUS = '1'
                 WHERE TALAO_ID = :TALAO_ID
                   AND CONSUMO_ID = :VINCULO_CONSUMO_ID;
    
                /* ATUALIZA A QUANTIDADE UTILIZADA NO CONSUMO */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO             = :QUANTIDADE_CONSUMO, --:VINCULO_QUANTIDADE,
                       C.QUANTIDADE_ALTERNATIVA_CONSUMO = :VINCULO_QUANTIDADE_ALTERNATIVA,
                       C.DATAHORA_CONFERENCIA           = CURRENT_TIMESTAMP,
                       C.STATUS                         = '1'
                 WHERE ID = :VINCULO_CONSUMO_ID;
    
                IF ( :VINCULO_COMPONENTE = '1' AND :VINCULO_COMPONENTES <> '' ) THEN
                BEGIN
                    EXCEPTION "..." 'HA COMPONENTES PENDENTES DE ALOCACAO. REMESSA/TALAO ESPERADO: ' || :VINCULO_COMPONENTES;
                END
                ELSE
                /* VERIFICA SE HA ITENS SEM MATERIA-PRIMA/COMPONENTE ALOCADO */
                IF ( :VINCULO_TALAO_ID IS NULL AND :CONSUMO_QUANTIDADE > 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'HA ITENS DA PROJECAO DE CONSUMO SEM MATERIA-PRIMA ALOCADA. PRODUTO: ' ||  coalesce(:VINCULO_PRODUTO_ID,0) || ' - ' || coalesce(:VINCULO_PRODUTO_DESCRICAO,0) || '. OPERACAO CANCELADA! ';
                END
    
    
            END


    
        END
        ELSE
        /* REABRIR TALAO */
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 1 ) THEN
        BEGIN
        
            SELECT FIRST 1
                   T.ID,
                   P.ID,
                   P.STATUS
              FROM VWREMESSA_TALAO T,
                   TBPROGRAMACAO P
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
               AND P.TIPO             = 'A'
               AND P.TABELA_ID        = T.ID
              INTO :TALAO_ID,
                   :PROGRAMACAO_ID,
                   :PROGRAMACAO_STATUS;

            IF ( PROGRAMACAO_STATUS = 2 ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO EM PRODUCAO. OPERACAO NAO PERMITIDA.';
            END

                             
            /* DESFAZER OPERAÇÃO DE FINALIZAR TALÃO */
            UPDATE TBPROGRAMACAO O
               SET O.STATUS = '1'
              WHERE O.ID    = :PROGRAMACAO_ID;

            UPDATE VWREMESSA_TALAO R
               SET R.STATUS = 1
             WHERE R.ID     = :TALAO_ID;


            NEW.QUANTIDADE_PRODUCAO        = 0;
            NEW.QUANTIDADE_SALDO           = 0;
            NEW.QUANTIDADE_ALTERN_PRODUCAO = 0;
            NEW.QUANTIDADE_ALTERN_SALDO    = 0;
            NEW.DATA_PRODUCAO              = NULL;
            NEW.HORA_PRODUCAO              = NULL;

                                     
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = NEW.ESTOQUE_ID;

            UPDATE TBREMESSA_CONSUMO C
               SET C.DATAHORA_CONFERENCIA   = NULL,
                   C.QUANTIDADE_CONFERENCIA = 0,
                   C.CONFERENCIA            = '0'
             WHERE C.TALAO_DETALHE_ID       = NEW.CONTROLE;

            UPDATE TBREMESSA_TALAO_VINCULO V
               SET V.STATUS   = '0'
             WHERE V.TALAO_ID = :TALAO_ID;

            DELETE FROM TBREVISAO R
             WHERE R.TALAO_ID = NEW.CONTROLE;

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN
    
                UPDATE TBREMESSA_ITEM_PROCESSADO
                   SET SITUACAO          = 1,
                       DATA_PRODUCAO     = NULL,
                       HORA_PRODUCAO     = NULL
                 WHERE REMESSA  = :VINCULO_REMESSA_ID
                   AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
            END

            EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',NEW.REMESSA,'DETALHAMENTO: ' || NEW.CONTROLE || ' REABERTO');

        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO PERMITIDA PARA ESTE TALAO DO CORTE.';

        END
    END
end;

CREATE OR ALTER trigger ttbremessa_item_proc_b0u_05 for tbremessa_item_processado
active before update position 1
AS
DECLARE VARIABLE ID Integer;
Begin

  if (OLD.FAMILIA_CODIGO > 0) then
      BEGIN
      if (Old.Situacao = 3 and New.Situacao = 1 and not (new.controle between 5500 and 5999)) then
          Begin
          Exception "..." 'ATENÇÃO, O TALÃO JÁ ESTÁ LIBERADO PARA PRODUÇÃO DESDE '||coalesce( Cast(OLD.HORA_LIBERACAO as VarChar(30)), '')||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          End

      if (Old.Situacao = 3 and New.Situacao = 2) then
          Begin

            For
            Select First 1 Controle From TBPedido_Item_Processado
            Where REMESSA = OLD.REMESSA
              and REMESSA_ACUMULADO_CONTROLE = OLD.CONTROLE
              and DATA_PRODUCAO is not null
            Into :id
            Do
            Begin
              if (Id > 0) Then
                  Begin
                    Exception "..." 'ATENÇÃO, HÁ TALÕES JÁ REGISTRADOS NA PRODUÇÃO. OPERAÇÃO CANCELADA! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                  End
            End

          End
      END
End;

CREATE OR ALTER procedure SPI_REMESSA_INTERMEDIARIA
returns (
    REMESSA_ID integer)
as
declare variable REMESSA_ID_ORIGEM integer;
declare variable REMESSA_ID_VINCULO integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable OBSERVACAO varchar(200);
declare variable GP_ID integer;
declare variable TALAO_ID integer;
declare variable TALAO_PRODUTO_DESCRICAO varchar(400);
declare variable TALAO_PERFIL_SKU varchar(10);
declare variable TALAO_PERFIL_SKU_DESCRICAO varchar(80);
declare variable TALAO_COR_CLASSE varchar(10);
declare variable TALAO_COR_SUBCLASSE integer;
declare variable TALAO_CONTROLE varchar(4000);
declare variable TALAO_MODELO_ID integer;
declare variable TALAO_MODELO_DESCRICAO varchar(200);
declare variable TALAO_TAMANHO integer;
declare variable TALAO_PRODUTO_ID integer;
declare variable TALAO_TAMANHO_DESCRICAO varchar(200);
declare variable TALAO_QUANTIDADE numeric(18,5);
declare variable PRODUTO_DESCRICAO varchar(400);
declare variable TAMANHO_DESCRICAO varchar(200);
declare variable UM varchar(12);
declare variable LARGURA numeric(18,5);
declare variable COMPRIMENTO numeric(18,5);
declare variable COR_CLASSE varchar(10);
declare variable COR_SUBCLASSE integer;
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable QUANTIDADE_ALTERNATIVA numeric(18,4);
declare variable QUANTIDADE_SOBRA numeric(18,4);
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(18,2);
declare variable STATUS integer;
declare variable DATA_PRODUCAO date;
declare variable DATA_LIBERACAO date;
declare variable HORA_PRODUCAO timestamp;
declare variable HORA_LIBERACAO timestamp;
declare variable VIA_ETIQUETA integer;
declare variable TURNO char(4);
declare variable TALAO_EXTRA integer;
declare variable PERCENTUAL_EXTRA numeric(18,4);
declare variable UP_ID integer;
declare variable ESTACAO integer;
declare variable DATA date;
declare variable CONSUMO_ID integer;
declare variable CONSUMO_QUANTIDADE numeric(15,5);
declare variable C_ID_OLD integer;
declare variable C_ID integer;
declare variable C_ESTABELECIMENTO_ID integer;
declare variable C_REMESSA_ID integer;
declare variable C_REMESSA_TALAO_ID integer;
declare variable C_REMESSA_TALAO_DETALHE_ID integer;
declare variable C_CONTROLE integer;
declare variable C_LOCALIZACAO_ID integer;
declare variable C_PRODUTO_ID integer;
declare variable C_TAMANHO integer;
declare variable C_DENSIDADE integer;
declare variable C_ESPESSURA numeric(18,2);
declare variable C_QUANTIDADE_ORIGINAL numeric(18,4);
declare variable C_QUANTIDADE_NECES numeric(18,4);
declare variable C_QUANTIDADE_NECES_ALTERN numeric(18,4);
declare variable C_FATOR_UNIDADE numeric(18,8);
declare variable C_FATOR_UNIDADE_ALTERN numeric(18,8);
declare variable C_QUANTIDADE numeric(18,4);
declare variable C_QUANTIDADE_CONSUMO numeric(18,4);
declare variable C_QUANTIDADE_SALDO numeric(18,4);
declare variable C_QUANTIDADE_ALTERNATIVA numeric(18,4);
declare variable C_QUANTIDADE_SOBRA numeric(18,4);
declare variable C_STATUS char(4);
declare variable C_QUANTIDADE_ALTERNATIVA_CONS numeric(18,4);
declare variable C_QUANTIDADE_ALTERNATIVA_SALDO numeric(18,4);
declare variable C_DATAHORA_CONFERENCIA timestamp;
declare variable C_COMPONENTE smallint;
declare variable C_ESTOQUE_ID integer;
declare variable C_SALDO_BAIXAR numeric(18,4);
declare variable TEMPO_TOTAL numeric(15,4);
declare variable QUANTIDADE_DETALHE numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
declare variable QTD_INTERMEDIARIA numeric(15,4);
declare variable CONSUMO_INTERMEDIARIA numeric(15,4);
declare variable CONSUMO_COMPONENTE numeric(15,4);
declare variable QTD numeric(15,4);
declare variable LINHA_INTERMEDIARIA numeric(15,4);
declare variable SOBRA_CONSUMO numeric(15,4);
declare variable ACRECIMO_CONSUMO numeric(15,4);
declare variable ACRECIMO_ADD numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (

                select
                    z.*,
        
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_largura    , fn_array(LARGURA_COMPRIMENTO, 1, '|')) as numeric(15,4)) as LARGURA,
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_comprimento, fn_array(LARGURA_COMPRIMENTO, 2, '|')) as numeric(15,4)) COMPRIMENTO
                from(
                    SELECT
                        FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                        T2.MODELO_ID TALAO_MODELO_ID,
                        M.DESCRICAO TALAO_MODELO_DESCRICAO,
                        (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                        (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                        FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                        SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                        P.DESCRICAO PRODUTO_DESCRICAO,
                        FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                        P.UNIDADEMEDIDA_SIGLA UM,
                        --MT.LARGURA,
                        --MT.COMPRIMENTO,
                        C2.CLASSE COR_CLASSE,
                        C2.SUBCLASSE COR_SUBCLASSE,
                        T1.ID,
                        T1.ESTABELECIMENTO_ID,
                        T1.REMESSA_ID,
                        T1.REMESSA_TALAO_ID,
                        T1.LOCALIZACAO_ID,
                        T1.PRODUTO_ID,
                        T1.MODELO_ID,
                        P.COR_CODIGO COR_ID,
                        T1.TAMANHO,
                        T1.QUANTIDADE,
                        T1.QUANTIDADE_ALTERNATIVA,
                        T1.QUANTIDADE_SOBRA,
                        T1.GP_ID,
                        T1.UP_ID,
                        T1.ESTACAO,
                        T1.DENSIDADE,
                        T1.ESPESSURA,
                        T1.STATUS,
                        T1.OBSERVACAO,
                        T1.DATA_PRODUCAO,
                        T1.DATA_LIBERACAO,
                        T1.HORA_PRODUCAO,
                        T1.HORA_LIBERACAO,
                        T1.VIA_ETIQUETA,
                        T1.TURNO,
                        T1.TALAO_EXTRA,
                        T1.PERCENTUAL_EXTRA,
                        T1.placa_largura,
                        T1.placa_comprimento,
        
                        coalesce(( select MT.LARGURA||'|'||MT.COMPRIMENTO from SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT), '0|0') LARGURA_COMPRIMENTO
        
            
                    FROM
                        VWREMESSA_TALAO T1,
                        VWREMESSA_CONSUMO C,
                        TBREMESSA_CONSUMO_VINCULO V,
                        VWREMESSA_TALAO T2,
                        TBPRODUTO P,
                        TBMODELO M,
                        TBMODELO M2,
                        --SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                        TBCOR C2
            
                    WHERE
                        T1.REMESSA_ID = C.REMESSA_ID
                    AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                    AND V.CONSUMO_ID = C.ID
                    AND T2.REMESSA_ID = V.REMESSA_ID
                    AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
                    AND P.CODIGO = T1.PRODUTO_ID
                    AND M.CODIGO = T2.MODELO_ID
                    AND M2.CODIGO = P.MODELO_CODIGO
                    AND C2.CODIGO = P.COR_CODIGO
                    AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
                    AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
                 ) Z
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   iif(coalesce(d.quantidade_altern,0) = 0, D.QUANTIDADE, d.quantidade_altern) as QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
        into :TEMPO_TOTAL, :TEMPO_SETUP;

        TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
        TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA,
            :TEMPO_SETUP
        );
    END

    --exception "..." 'Rem:'||coalesce(:REMESSA_ID_VINCULO,0);

    FOR
        select
            y.*,
            --(SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)) as RESTO,
            iif(LINHA_INTERMEDIARIA >= QTD_INTERMEDIARIA, ACRECIMO_CONSUMO + (SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)), ACRECIMO_CONSUMO) as ACRECIMO_ADD
        
        from(
            select
                x.*,
            
                CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA as SOBRA_CONSUMO,
                cast((CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA) / QTD_INTERMEDIARIA as numeric(15,2)) as ACRECIMO_CONSUMO
            from(
                SELECT
                    C.ID ID_OLD,
                    GEN_ID(GTBREMESSA_CONSUMO,1) as NEW_ID,
                    C.ESTABELECIMENTO_ID,
                    :REMESSA_ID as REMESSA_ID,
                    V.REMESSA_TALAO_ID,
                    C.REMESSA_TALAO_DETALHE_ID,
                    C.CONTROLE,
                    C.LOCALIZACAO_ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.DENSIDADE,
                    C.ESPESSURA,
                    C.QUANTIDADE_ORIGINAL,
                    C.QUANTIDADE_NECES,
                    C.QUANTIDADE_NECES_ALTERN,
                    C.FATOR_UNIDADE,
                    C.FATOR_UNIDADE_ALTERN,
                    C.QUANTIDADE,
                    C.QUANTIDADE_CONSUMO,
                    C.QUANTIDADE_SALDO,
                    C.QUANTIDADE_ALTERNATIVA,
                    C.QUANTIDADE_SOBRA,
                    C.STATUS,
                    C.QUANTIDADE_ALTERNATIVA_CONSUMO,
                    C.QUANTIDADE_ALTERNATIVA_SALDO,
                    C.DATAHORA_CONFERENCIA,
                    C.COMPONENTE,
                    C.ESTOQUE_ID,
                    C.SALDO_BAIXAR,
        
                    row_number() over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as LINHA_INTERMEDIARIA,
                    count(C.QUANTIDADE_NECES) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as QTD_INTERMEDIARIA,
                    sum(v.quantidade) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as CONSUMO_INTERMEDIARIA,
                    coalesce((select SUM(D.quantidade) FROM vwremessa_talao_detalhe D WHERE D.remessa_id = V.remessa_id AND D.remessa_talao_id = V.remessa_talao_id AND D.produto_id = C.produto_id),0) AS CONSUMO_COMPONENTE
                
                FROM
                    VWREMESSA_CONSUMO C,
                    TBREMESSA_CONSUMO_VINCULO V
                
                WHERE   
                    V.REMESSA_ID = :REMESSA_ID_VINCULO
                AND V.CONSUMO_ID = C.ID
                ORDER BY C.ID
            ) x
        ) y
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR,

        LINHA_INTERMEDIARIA,
        QTD_INTERMEDIARIA,
        CONSUMO_INTERMEDIARIA,
        CONSUMO_COMPONENTE,
        SOBRA_CONSUMO,
        ACRECIMO_CONSUMO,
        ACRECIMO_ADD

    DO
    BEGIN

        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        QTD = C_QUANTIDADE_NECES + ACRECIMO_ADD;

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            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_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :QTD, --:C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :QTD, --:C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end;

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_consumo_vinculo_b0u for tbremessa_consumo_vinculo
active before update position 0
AS
declare variable TALAO_DETALHE_QUANTIDADE NUMERIC(15,4);
declare variable TALAO_DETALHE_STATUS INTEGER;   
declare variable remessa INTEGER;
declare variable web varchar(500);
declare variable ACRESCIMO NUMERIC(15,4);
declare variable RETORNO_SP varchar(500);
begin

    if ( OLD.QUANTIDADE <> NEW.QUANTIDADE ) then
    BEGIN

        SELECT FIRST 1
               d.remessa_id,
               f.web,
               D.QUANTIDADE,
               D.STATUS,
               IIF( (SELECT FIRST 1 N.VALOR_EXT FROM TBCONTROLE_N N WHERE N.ID = 231) = P.FAMILIA_CODIGO, M.ACRESCIMO, 0)ACRESCIMO
          FROM VWREMESSA_TALAO_DETALHE D,
               TBPRODUTO P,
               TBMODELO M,
               tbremessa f
         WHERE D.PRODUTO_ID = P.CODIGO
           AND P.MODELO_CODIGO = M.CODIGO
           AND D.ID = OLD.REMESSA_TALAO_DETALHE_ID
           and f.numero = d.remessa_id
          INTO :REMESSA, :WEB, :TALAO_DETALHE_QUANTIDADE, :TALAO_DETALHE_STATUS, :ACRESCIMO;

        IF ( TALAO_DETALHE_STATUS < 3 and :WEB <> '3') THEN
        BEGIN

            UPDATE VWREMESSA_TALAO_DETALHE D
               SET D.QUANTIDADE = IIF(D.QUANTIDADE - OLD.QUANTIDADE + NEW.QUANTIDADE - :ACRESCIMO <= 0, 0, D.QUANTIDADE - OLD.QUANTIDADE + NEW.QUANTIDADE),
                   D.QUANTIDADE_ALTERN = IIF( D.QUANTIDADE = 0 , 0, (D.QUANTIDADE - OLD.QUANTIDADE + NEW.QUANTIDADE) * D.QUANTIDADE_ALTERN / D.QUANTIDADE)
             WHERE D.ID = OLD.REMESSA_TALAO_DETALHE_ID;

            RETORNO_SP = (SELECT LIST(O_CONS_QUANTIDADE)
                            FROM SPI_REM_CONSUMO_INSUMO6_VS2(
                                 OLD.REMESSA_ID,
                                 OLD.REMESSA_TALAO_ID,
                                 OLD.REMESSA_TALAO_DETALHE_ID,
                                 'PJT'));

        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b9u for tbpedido_item_processado
active before update position 9
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_REQUISICAO VARCHAR(15);
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_FAMILIA_ID INTEGER;
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,5);         
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;

DECLARE VARIABLE VINCULO_COMPONENTE CHAR(1) ;
declare variable VINCULO_COMPONENTES VARCHAR(500) ;
DECLARE VARIABLE VINCULO_TALAO_ID INTEGER ;
DECLARE VARIABLE VINCULO_CONSUMO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_DESCRICAO VARCHAR(100) ;
DECLARE VARIABLE VINCULO_TIPO CHAR(1) ;
DECLARE VARIABLE VINCULO_TABELA_ID INTEGER ;  
DECLARE VARIABLE VINCULO_QUANTIDADE NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_SOBRA NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_ALTERNATIVA NUMERIC(15,4) ;

DECLARE VARIABLE VINCULO_REMESSA_ID INTEGER;
DECLARE VARIABLE VINCULO_REMESSA_TALAO_ID INTEGER;

DECLARE VARIABLE QUANTIDADE_CONSUMO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_CONSUMO_ALTERNATIVO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_FINAL NUMERIC(18,4);
DECLARE VARIABLE calcTemp NUMERIC(15,4);
DECLARE VARIABLE QTD_CONSUMO NUMERIC(15,4);

begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           COALESCE(R.REQUISICAO,0)
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_REQUISICAO;

    IF ( REMESSA_WEB = '3' AND OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO ) THEN
    BEGIN

        /* REGISTRAR PRODUCAO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
    
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN

                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = iif( coalesce(t.flag_data,0) = 0, FN_DATA_PRODUCAO() , T.DATA_PRODUCAO)
                 WHERE T.ID     = :TALAO_ID;
    
                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3'
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                UPDATE TBUP_ESTACAO
                   SET TALAO_ID = :TALAO_ID,
                       INCREMENTO = 1
                 WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
    
    
            SELECT FIRST 1
                   P.LOCALIZACAO_CODIGO,
                   P.FAMILIA_CODIGO
              FROM TBPRODUTO P
             WHERE P.CODIGO = NEW.PRODUTO_CODIGO
              INTO TALAO_LOCALIZACAO_ID,
                   TALAO_FAMILIA_ID;
    
            TALAO_FAMILIA_ID     = COALESCE(TALAO_FAMILIA_ID    ,0);
            TALAO_LOCALIZACAO_ID = COALESCE(TALAO_LOCALIZACAO_ID,0);
    
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            
    
            /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
            TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO = FN_DATA_PRODUCAO();
    
            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            NEW.QUANTIDADE_PRODUCAO = NEW.quantidade_producao_tmp;
            NEW.QUANTIDADE_SALDO    = NEW.quantidade_producao_tmp;
    
    
            /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
            NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    

            VINCULO_REMESSA_TALAO_ID = COALESCE((
                SELECT FIRST 1 C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID),0);
            

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and not(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and VINCULO_REMESSA_TALAO_ID between 5500 and 5999) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    fn_parametro('SISTEMA.GP_TALAO_PLACA'),
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END
    
            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
                select v.consumo_id from tbremessa_consumo_vinculo v where v.remessa_talao_detalhe_id = NEW.CONTROLE into :QTD_CONSUMO;

                update tbremessa_consumo n set
                    n.quantidade_conferencia = :CONSUMO_QUANTIDADE,
                    --N.quantidade = :CONSUMO_QUANTIDADE,
                    n.consumo_kg = :CONSUMO_QUANTIDADE
                where n.id = :QTD_CONSUMO;

            END

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    --registra a inicio da producao do talao acumulado de placa
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
					
					/*
                     --registra a producao do talao acumulado de placa
                     UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 3,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
					*/
					
                    --atualiza quanidade produzida nos taloes de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.quantidade_producao     = new.quantidade_producao_tmp,
                           y.quantidade_saldo        = new.quantidade_producao_tmp
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;

                     --registra producao nos taloes detalhado de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.status                  = 3,
                           y.quantidade_producao_tmp = new.quantidade_producao_tmp,
                           y.DATA_PRODUCAO           = FN_DATA_PRODUCAO(),
                           y.DATAHORA_PRODUCAO       = CURRENT_TIMESTAMP,
                           y.OPERADOR_ID_PRODUCAO    = NEW.OPERADOR_ID_PRODUCAO
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;

                end else
                begin
                    --status como cortado nos taloes detalhado
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                end

                NEW.situacao = 3;
            END
    
            --exception "..."  ''||NEW.CONTROLE;

            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN

                /* CALCULA AS QUANTIDADES CONSUMIDAS */
                QUANTIDADE_CONSUMO             = VINCULO_QUANTIDADE - VINCULO_QUANTIDADE_SOBRA;
                QUANTIDADE_CONSUMO_ALTERNATIVO = VINCULO_QUANTIDADE_ALTERNATIVA;
    
                /* ATUALIZA O STATUS DO VINCULO PARA 1 (UTILIZADO) */
                UPDATE TBREMESSA_TALAO_VINCULO V
                   SET V.STATUS = '1'
                 WHERE TALAO_ID = :TALAO_ID
                   AND CONSUMO_ID = :VINCULO_CONSUMO_ID;
    
                /* ATUALIZA A QUANTIDADE UTILIZADA NO CONSUMO */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO             = :QUANTIDADE_CONSUMO, --:VINCULO_QUANTIDADE,
                       C.QUANTIDADE_ALTERNATIVA_CONSUMO = :VINCULO_QUANTIDADE_ALTERNATIVA,
                       C.DATAHORA_CONFERENCIA           = CURRENT_TIMESTAMP,
                       C.STATUS                         = '1'
                 WHERE ID = :VINCULO_CONSUMO_ID;
    
                IF ( :VINCULO_COMPONENTE = '1' AND :VINCULO_COMPONENTES <> '' ) THEN
                BEGIN
                    EXCEPTION "..." 'HA COMPONENTES PENDENTES DE ALOCACAO. REMESSA/TALAO ESPERADO: ' || :VINCULO_COMPONENTES;
                END
                ELSE
                /* VERIFICA SE HA ITENS SEM MATERIA-PRIMA/COMPONENTE ALOCADO */
                IF ( :VINCULO_TALAO_ID IS NULL AND :CONSUMO_QUANTIDADE > 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'HA ITENS DA PROJECAO DE CONSUMO SEM MATERIA-PRIMA ALOCADA. PRODUTO: ' ||  coalesce(:VINCULO_PRODUTO_ID,0) || ' - ' || coalesce(:VINCULO_PRODUTO_DESCRICAO,0) || '. OPERACAO CANCELADA! ';
                END
    
    
            END


    
        END
        ELSE
        /* REABRIR TALAO */
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 1 ) THEN
        BEGIN
        
            SELECT FIRST 1
                   T.ID,
                   P.ID,
                   P.STATUS
              FROM VWREMESSA_TALAO T,
                   TBPROGRAMACAO P
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
               AND P.TIPO             = 'A'
               AND P.TABELA_ID        = T.ID
              INTO :TALAO_ID,
                   :PROGRAMACAO_ID,
                   :PROGRAMACAO_STATUS;

            IF ( PROGRAMACAO_STATUS = 2 ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO EM PRODUCAO. OPERACAO NAO PERMITIDA.';
            END

                             
            /* DESFAZER OPERAÇÃO DE FINALIZAR TALÃO */
            UPDATE TBPROGRAMACAO O
               SET O.STATUS = '1'
              WHERE O.ID    = :PROGRAMACAO_ID;

            UPDATE VWREMESSA_TALAO R
               SET R.STATUS = 1
             WHERE R.ID     = :TALAO_ID;


            NEW.QUANTIDADE_PRODUCAO        = 0;
            NEW.QUANTIDADE_SALDO           = 0;
            NEW.QUANTIDADE_ALTERN_PRODUCAO = 0;
            NEW.QUANTIDADE_ALTERN_SALDO    = 0;
            NEW.DATA_PRODUCAO              = NULL;
            NEW.HORA_PRODUCAO              = NULL;

                                     
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = NEW.ESTOQUE_ID;

            UPDATE TBREMESSA_CONSUMO C
               SET C.DATAHORA_CONFERENCIA   = NULL,
                   C.QUANTIDADE_CONFERENCIA = 0,
                   C.CONFERENCIA            = '0'
             WHERE C.TALAO_DETALHE_ID       = NEW.CONTROLE;

            UPDATE TBREMESSA_TALAO_VINCULO V
               SET V.STATUS   = '0'
             WHERE V.TALAO_ID = :TALAO_ID;

            DELETE FROM TBREVISAO R
             WHERE R.TALAO_ID = NEW.CONTROLE;

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                UPDATE TBREMESSA_ITEM_PROCESSADO
                   SET SITUACAO          = 1,
                       DATA_PRODUCAO     = NULL,
                       HORA_PRODUCAO     = NULL
                 WHERE REMESSA  = :VINCULO_REMESSA_ID
                   AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    UPDATE vwremessa_talao_detalhe y
                           SET y.status               = 1,
                               y.DATA_PRODUCAO        = NULL,
                               y.DATAHORA_PRODUCAO    = NULL
                         WHERE y.remessa_id           = :VINCULO_REMESSA_ID
                           AND y.remessa_talao_id     = :VINCULO_REMESSA_TALAO_ID;
                end
            END

            EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',NEW.REMESSA,'DETALHAMENTO: ' || NEW.CONTROLE || ' REABERTO');

        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO PERMITIDA PARA ESTE TALAO DO CORTE.';

        END
    END

   -- exception "..." 'Não';
end
^

SET TERM ; ^

CREATE OR ALTER PROCEDURE SPI_REMESSA_INTERMEDIARIA
RETURNS (
    REMESSA_ID INTEGER)
AS
DECLARE VARIABLE REMESSA_ID_ORIGEM              INTEGER;
DECLARE VARIABLE REMESSA_ID_VINCULO             INTEGER;
DECLARE VARIABLE REMESSA_TALAO_DETALHE_ID       INTEGER;
DECLARE VARIABLE OBSERVACAO                     VARCHAR(200);
DECLARE VARIABLE GP_ID                          INTEGER;
DECLARE VARIABLE TALAO_ID                       INTEGER;
DECLARE VARIABLE TALAO_PRODUTO_DESCRICAO        VARCHAR(400);
DECLARE VARIABLE TALAO_PERFIL_SKU               VARCHAR(10);
DECLARE VARIABLE TALAO_PERFIL_SKU_DESCRICAO     VARCHAR(80);
DECLARE VARIABLE TALAO_COR_CLASSE               VARCHAR(10);
DECLARE VARIABLE TALAO_COR_SUBCLASSE            INTEGER;
DECLARE VARIABLE TALAO_CONTROLE                 VARCHAR(4000);
DECLARE VARIABLE TALAO_MODELO_ID                INTEGER;
DECLARE VARIABLE TALAO_MODELO_DESCRICAO         VARCHAR(200);
DECLARE VARIABLE TALAO_TAMANHO                  INTEGER;
DECLARE VARIABLE TALAO_PRODUTO_ID               INTEGER;
DECLARE VARIABLE TALAO_TAMANHO_DESCRICAO        VARCHAR(200);
DECLARE VARIABLE TALAO_QUANTIDADE               NUMERIC(18,5);
DECLARE VARIABLE PRODUTO_DESCRICAO              VARCHAR(400);
DECLARE VARIABLE TAMANHO_DESCRICAO              VARCHAR(200);
DECLARE VARIABLE UM                             VARCHAR(12);
DECLARE VARIABLE LARGURA                        NUMERIC(18,5);
DECLARE VARIABLE COMPRIMENTO                    NUMERIC(18,5);
DECLARE VARIABLE COR_CLASSE                     VARCHAR(10);
DECLARE VARIABLE COR_SUBCLASSE                  INTEGER;
DECLARE VARIABLE ID                             INTEGER;
DECLARE VARIABLE ESTABELECIMENTO_ID             INTEGER;
DECLARE VARIABLE REMESSA_TALAO_ID               INTEGER;
DECLARE VARIABLE LOCALIZACAO_ID                 INTEGER;
DECLARE VARIABLE PRODUTO_ID                     INTEGER;
DECLARE VARIABLE MODELO_ID                      INTEGER;
DECLARE VARIABLE COR_ID                         INTEGER;
DECLARE VARIABLE TAMANHO                        INTEGER;
DECLARE VARIABLE QUANTIDADE                     NUMERIC(18,5);
DECLARE VARIABLE QUANTIDADE_ALTERNATIVA         NUMERIC(18,4);
DECLARE VARIABLE QUANTIDADE_SOBRA               NUMERIC(18,4);
DECLARE VARIABLE DENSIDADE                      SMALLINT;
DECLARE VARIABLE ESPESSURA                      NUMERIC(18,2);
DECLARE VARIABLE STATUS                         INTEGER;
DECLARE VARIABLE DATA_PRODUCAO                  DATE;
DECLARE VARIABLE DATA_LIBERACAO                 DATE;
DECLARE VARIABLE HORA_PRODUCAO                  TIMESTAMP;
DECLARE VARIABLE HORA_LIBERACAO                 TIMESTAMP;
DECLARE VARIABLE VIA_ETIQUETA                   INTEGER;
DECLARE VARIABLE TURNO                          CHAR(4);
DECLARE VARIABLE TALAO_EXTRA                    INTEGER;
DECLARE VARIABLE PERCENTUAL_EXTRA               NUMERIC(18,4);
DECLARE VARIABLE UP_ID                          INTEGER;
DECLARE VARIABLE ESTACAO                        INTEGER;
DECLARE VARIABLE DATA                           DATE;
DECLARE VARIABLE CONSUMO_ID                     INTEGER;
DECLARE VARIABLE CONSUMO_QUANTIDADE             NUMERIC(15,5);
DECLARE VARIABLE C_ID_OLD                       INTEGER;
DECLARE VARIABLE C_ID                           INTEGER;
DECLARE VARIABLE C_ESTABELECIMENTO_ID           INTEGER;
DECLARE VARIABLE C_REMESSA_ID                   INTEGER;
DECLARE VARIABLE C_REMESSA_TALAO_ID             INTEGER;
DECLARE VARIABLE C_REMESSA_TALAO_DETALHE_ID     INTEGER;
DECLARE VARIABLE C_CONTROLE                     INTEGER;
DECLARE VARIABLE C_LOCALIZACAO_ID               INTEGER;
DECLARE VARIABLE C_PRODUTO_ID                   INTEGER;
DECLARE VARIABLE C_TAMANHO                      INTEGER;
DECLARE VARIABLE C_DENSIDADE                    INTEGER;
DECLARE VARIABLE C_ESPESSURA                    NUMERIC(18,2);
DECLARE VARIABLE C_QUANTIDADE_ORIGINAL          NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_NECES             NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_NECES_ALTERN      NUMERIC(18,4);
DECLARE VARIABLE C_FATOR_UNIDADE                NUMERIC(18,8);
DECLARE VARIABLE C_FATOR_UNIDADE_ALTERN         NUMERIC(18,8);
DECLARE VARIABLE C_QUANTIDADE                   NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_CONSUMO           NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_SALDO             NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_ALTERNATIVA       NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_SOBRA             NUMERIC(18,4);
DECLARE VARIABLE C_STATUS                       CHAR(4);
DECLARE VARIABLE C_QUANTIDADE_ALTERNATIVA_CONS  NUMERIC(18,4);
DECLARE VARIABLE C_QUANTIDADE_ALTERNATIVA_SALDO NUMERIC(18,4);
DECLARE VARIABLE C_DATAHORA_CONFERENCIA         TIMESTAMP;
DECLARE VARIABLE C_COMPONENTE                   SMALLINT;
DECLARE VARIABLE C_ESTOQUE_ID                   INTEGER;
DECLARE VARIABLE C_SALDO_BAIXAR                 NUMERIC(18,4);
DECLARE VARIABLE TEMPO_TOTAL                    NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_DETALHE             NUMERIC(15,4);
DECLARE VARIABLE TEMPO_SETUP                    NUMERIC(15,4);
DECLARE VARIABLE QTD_INTERMEDIARIA              NUMERIC(15,4);
DECLARE VARIABLE CONSUMO_INTERMEDIARIA          NUMERIC(15,4);
DECLARE VARIABLE CONSUMO_COMPONENTE             NUMERIC(15,4);
DECLARE VARIABLE QTD                            NUMERIC(15,4);
DECLARE VARIABLE LINHA_INTERMEDIARIA            NUMERIC(15,4);
DECLARE VARIABLE SOBRA_CONSUMO                  NUMERIC(15,4);
DECLARE VARIABLE ACRECIMO_CONSUMO               NUMERIC(15,4);
DECLARE VARIABLE ACRECIMO_ADD                   NUMERIC(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '1',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (

                select
                    z.*,
        
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_largura    , fn_array(LARGURA_COMPRIMENTO, 1, '|')) as numeric(15,4)) as LARGURA,
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_comprimento, fn_array(LARGURA_COMPRIMENTO, 2, '|')) as numeric(15,4)) COMPRIMENTO
                from(
                    SELECT
                        FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                        T2.MODELO_ID TALAO_MODELO_ID,
                        M.DESCRICAO TALAO_MODELO_DESCRICAO,
                        (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                        (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                        FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                        SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                        P.DESCRICAO PRODUTO_DESCRICAO,
                        FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                        P.UNIDADEMEDIDA_SIGLA UM,
                        --MT.LARGURA,
                        --MT.COMPRIMENTO,
                        C2.CLASSE COR_CLASSE,
                        C2.SUBCLASSE COR_SUBCLASSE,
                        T1.ID,
                        T1.ESTABELECIMENTO_ID,
                        T1.REMESSA_ID,
                        T1.REMESSA_TALAO_ID,
                        T1.LOCALIZACAO_ID,
                        T1.PRODUTO_ID,
                        T1.MODELO_ID,
                        P.COR_CODIGO COR_ID,
                        T1.TAMANHO,
                        T1.QUANTIDADE,
                        T1.QUANTIDADE_ALTERNATIVA,
                        T1.QUANTIDADE_SOBRA,
                        T1.GP_ID,
                        T1.UP_ID,
                        T1.ESTACAO,
                        T1.DENSIDADE,
                        T1.ESPESSURA,
                        T1.STATUS,
                        T1.OBSERVACAO,
                        T1.DATA_PRODUCAO,
                        T1.DATA_LIBERACAO,
                        T1.HORA_PRODUCAO,
                        T1.HORA_LIBERACAO,
                        T1.VIA_ETIQUETA,
                        T1.TURNO,
                        T1.TALAO_EXTRA,
                        T1.PERCENTUAL_EXTRA,
                        T1.placa_largura,
                        T1.placa_comprimento,
        
                        coalesce(( select MT.LARGURA||'|'||MT.COMPRIMENTO from SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT), '0|0') LARGURA_COMPRIMENTO
        
            
                    FROM
                        VWREMESSA_TALAO T1,
                        VWREMESSA_CONSUMO C,
                        TBREMESSA_CONSUMO_VINCULO V,
                        VWREMESSA_TALAO T2,
                        TBPRODUTO P,
                        TBMODELO M,
                        TBMODELO M2,
                        --SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                        TBCOR C2
            
                    WHERE
                        T1.REMESSA_ID = C.REMESSA_ID
                    AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                    AND V.CONSUMO_ID = C.ID
                    AND T2.REMESSA_ID = V.REMESSA_ID
                    AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
                    AND P.CODIGO = T1.PRODUTO_ID
                    AND M.CODIGO = T2.MODELO_ID
                    AND M2.CODIGO = P.MODELO_CODIGO
                    AND C2.CODIGO = P.COR_CODIGO
                    AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
                    AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
                 ) Z
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   iif(coalesce(d.quantidade_altern,0) = 0, D.QUANTIDADE, d.quantidade_altern) as QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
        into :TEMPO_TOTAL, :TEMPO_SETUP;

        TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
        TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA,
            :TEMPO_SETUP
        );
    END

    --exception "..." 'Rem:'||coalesce(:REMESSA_ID_VINCULO,0);

    FOR
        select
            y.*,
            --(SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)) as RESTO,
            iif(LINHA_INTERMEDIARIA >= QTD_INTERMEDIARIA, ACRECIMO_CONSUMO + (SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)), ACRECIMO_CONSUMO) as ACRECIMO_ADD
        
        from(
            select
                x.*,
            
                CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA as SOBRA_CONSUMO,
                cast((CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA) / QTD_INTERMEDIARIA as numeric(15,2)) as ACRECIMO_CONSUMO
            from(
                SELECT
                    C.ID ID_OLD,
                    GEN_ID(GTBREMESSA_CONSUMO,1) as NEW_ID,
                    C.ESTABELECIMENTO_ID,
                    :REMESSA_ID as REMESSA_ID,
                    V.REMESSA_TALAO_ID,
                    C.REMESSA_TALAO_DETALHE_ID,
                    C.CONTROLE,
                    C.LOCALIZACAO_ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.DENSIDADE,
                    C.ESPESSURA,
                    C.QUANTIDADE_ORIGINAL,
                    C.QUANTIDADE_NECES,
                    C.QUANTIDADE_NECES_ALTERN,
                    C.FATOR_UNIDADE,
                    C.FATOR_UNIDADE_ALTERN,
                    C.QUANTIDADE,
                    C.QUANTIDADE_CONSUMO,
                    C.QUANTIDADE_SALDO,
                    C.QUANTIDADE_ALTERNATIVA,
                    C.QUANTIDADE_SOBRA,
                    C.STATUS,
                    C.QUANTIDADE_ALTERNATIVA_CONSUMO,
                    C.QUANTIDADE_ALTERNATIVA_SALDO,
                    C.DATAHORA_CONFERENCIA,
                    C.COMPONENTE,
                    C.ESTOQUE_ID,
                    C.SALDO_BAIXAR,
        
                    row_number() over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as LINHA_INTERMEDIARIA,
                    count(C.QUANTIDADE_NECES) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as QTD_INTERMEDIARIA,
                    sum(v.quantidade) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as CONSUMO_INTERMEDIARIA,
                    coalesce((select SUM(D.quantidade) FROM vwremessa_talao_detalhe D WHERE D.remessa_id = V.remessa_id AND D.remessa_talao_id = V.remessa_talao_id AND D.produto_id = C.produto_id),0) AS CONSUMO_COMPONENTE
                
                FROM
                    VWREMESSA_CONSUMO C,
                    TBREMESSA_CONSUMO_VINCULO V
                
                WHERE   
                    V.REMESSA_ID = :REMESSA_ID_VINCULO
                AND V.CONSUMO_ID = C.ID
                ORDER BY C.ID
            ) x
        ) y
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR,

        LINHA_INTERMEDIARIA,
        QTD_INTERMEDIARIA,
        CONSUMO_INTERMEDIARIA,
        CONSUMO_COMPONENTE,
        SOBRA_CONSUMO,
        ACRECIMO_CONSUMO,
        ACRECIMO_ADD

    DO
    BEGIN

        QTD = C_QUANTIDADE_NECES + ACRECIMO_ADD;

        --seta novo vinculo com a dublagem
        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        --consulta REMESSA_TALAO_DETALHE usando o vinculo com o talao do bojo
        select
            v.REMESSA_TALAO_DETALHE_ID
        from tbremessa_consumo_vinculo v
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID
        into :C_REMESSA_TALAO_DETALHE_ID;

        /*
        --atualiza o vinculo do talao do bojo com a nova quantidade
        update tbremessa_consumo_vinculo v
        set v.quantidade = :QTD
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID;
        */
         /*
        --atualizar consumo do bojo
        update tbremessa_consumo k
        set k.quantidade = :QTD
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID;  */

        C_REMESSA_TALAO_DETALHE_ID = coalesce(C_REMESSA_TALAO_DETALHE_ID, 0);

        if(C_REMESSA_TALAO_DETALHE_ID = 0)then
        begin
            exception "..." 'Vínculo com remessa intermediária não encontrado';
        end

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            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_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :QTD, --:C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :QTD, --:C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :QTD --:C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end;

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b9u for tbpedido_item_processado
active before update position 9
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_REQUISICAO VARCHAR(15);
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_FAMILIA_ID INTEGER;
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,5);         
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;

DECLARE VARIABLE VINCULO_COMPONENTE CHAR(1) ;
declare variable VINCULO_COMPONENTES VARCHAR(500) ;
DECLARE VARIABLE VINCULO_TALAO_ID INTEGER ;
DECLARE VARIABLE VINCULO_CONSUMO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_DESCRICAO VARCHAR(100) ;
DECLARE VARIABLE VINCULO_TIPO CHAR(1) ;
DECLARE VARIABLE VINCULO_TABELA_ID INTEGER ;  
DECLARE VARIABLE VINCULO_QUANTIDADE NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_SOBRA NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_ALTERNATIVA NUMERIC(15,4) ;

DECLARE VARIABLE VINCULO_REMESSA_ID INTEGER;
DECLARE VARIABLE VINCULO_REMESSA_TALAO_ID INTEGER;

DECLARE VARIABLE QUANTIDADE_CONSUMO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_CONSUMO_ALTERNATIVO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_FINAL NUMERIC(18,4);
DECLARE VARIABLE calcTemp NUMERIC(15,4);
DECLARE VARIABLE QTD_CONSUMO NUMERIC(15,4);

begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           COALESCE(R.REQUISICAO,0)
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_REQUISICAO;

    IF ( REMESSA_WEB = '3' AND OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO ) THEN
    BEGIN

        /* REGISTRAR PRODUCAO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
    
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN

                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = iif( coalesce(t.flag_data,0) = 0, FN_DATA_PRODUCAO() , T.DATA_PRODUCAO)
                 WHERE T.ID     = :TALAO_ID;
    
                SELECT p.id FROM TBPROGRAMACAO P
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A'
                into :PROGRAMACAO_ID;
                
                INSERT INTO TBPROGRAMACAO_REGISTRO (PROGRAMACAO_ID, DATAHORA, STATUS, OPERADOR_ID, JUSTIFICATIVA_ID, REQUISICAO_ID, ESTACAO_ID, TEMPO_PARADO)
                            VALUES (:PROGRAMACAO_ID, current_timestamp, '2', new.operador_id_producao, NULL, 0, NULL, NULL);

                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3'
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                UPDATE TBUP_ESTACAO
                   SET TALAO_ID = :TALAO_ID,
                       INCREMENTO = 1
                 WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
    
    
            SELECT FIRST 1
                   P.LOCALIZACAO_CODIGO,
                   P.FAMILIA_CODIGO
              FROM TBPRODUTO P
             WHERE P.CODIGO = NEW.PRODUTO_CODIGO
              INTO TALAO_LOCALIZACAO_ID,
                   TALAO_FAMILIA_ID;
    
            TALAO_FAMILIA_ID     = COALESCE(TALAO_FAMILIA_ID    ,0);
            TALAO_LOCALIZACAO_ID = COALESCE(TALAO_LOCALIZACAO_ID,0);
    
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            
    
            /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
            TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO = FN_DATA_PRODUCAO();
    
            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            NEW.QUANTIDADE_PRODUCAO = NEW.quantidade_producao_tmp;
            NEW.QUANTIDADE_SALDO    = NEW.quantidade_producao_tmp;
    
    
            /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
            NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    

            VINCULO_REMESSA_TALAO_ID = COALESCE((
                SELECT FIRST 1 C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID),0);
            

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and not(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and VINCULO_REMESSA_TALAO_ID between 5500 and 5999) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    fn_parametro('SISTEMA.GP_TALAO_PLACA'),
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END
    
            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
                select v.consumo_id from tbremessa_consumo_vinculo v where v.remessa_talao_detalhe_id = NEW.CONTROLE into :QTD_CONSUMO;

                update tbremessa_consumo n set
                    n.quantidade_conferencia = :CONSUMO_QUANTIDADE,
                    --N.quantidade = :CONSUMO_QUANTIDADE,
                    n.consumo_kg = :CONSUMO_QUANTIDADE
                where n.id = :QTD_CONSUMO;

            END

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    --registra a inicio da producao do talao acumulado de placa
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                     /*
                     --registra a producao do talao acumulado de placa
                     UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 3,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                    */

                    --atualiza quanidade produzida nos taloes de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.quantidade_producao     = new.quantidade_producao_tmp,
                           y.quantidade_saldo        = new.quantidade_producao_tmp
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;

                     --registra producao nos taloes detalhado de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.status                  = 3,
                           y.quantidade_producao_tmp = new.quantidade_producao_tmp,
                           y.DATA_PRODUCAO           = FN_DATA_PRODUCAO(),
                           y.DATAHORA_PRODUCAO       = CURRENT_TIMESTAMP,
                           y.OPERADOR_ID_PRODUCAO    = NEW.OPERADOR_ID_PRODUCAO
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;



                end else
                begin
                    --status como cortado nos taloes detalhado
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                end

                NEW.situacao = 3;
            END
    
            --exception "..."  ''||NEW.CONTROLE;

            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN

                /* CALCULA AS QUANTIDADES CONSUMIDAS */
                QUANTIDADE_CONSUMO             = VINCULO_QUANTIDADE - VINCULO_QUANTIDADE_SOBRA;
                QUANTIDADE_CONSUMO_ALTERNATIVO = VINCULO_QUANTIDADE_ALTERNATIVA;
    
                /* ATUALIZA O STATUS DO VINCULO PARA 1 (UTILIZADO) */
                UPDATE TBREMESSA_TALAO_VINCULO V
                   SET V.STATUS = '1'
                 WHERE TALAO_ID = :TALAO_ID
                   AND CONSUMO_ID = :VINCULO_CONSUMO_ID;
    
                /* ATUALIZA A QUANTIDADE UTILIZADA NO CONSUMO */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO             = :QUANTIDADE_CONSUMO, --:VINCULO_QUANTIDADE,
                       C.QUANTIDADE_ALTERNATIVA_CONSUMO = :VINCULO_QUANTIDADE_ALTERNATIVA,
                       C.DATAHORA_CONFERENCIA           = CURRENT_TIMESTAMP,
                       C.STATUS                         = '1'
                 WHERE ID = :VINCULO_CONSUMO_ID;
    
                IF ( :VINCULO_COMPONENTE = '1' AND :VINCULO_COMPONENTES <> '' ) THEN
                BEGIN
                    EXCEPTION "..." 'HA COMPONENTES PENDENTES DE ALOCACAO. REMESSA/TALAO ESPERADO: ' || :VINCULO_COMPONENTES;
                END
                ELSE
                /* VERIFICA SE HA ITENS SEM MATERIA-PRIMA/COMPONENTE ALOCADO */
                IF ( :VINCULO_TALAO_ID IS NULL AND :CONSUMO_QUANTIDADE > 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'HA ITENS DA PROJECAO DE CONSUMO SEM MATERIA-PRIMA ALOCADA. PRODUTO: ' ||  coalesce(:VINCULO_PRODUTO_ID,0) || ' - ' || coalesce(:VINCULO_PRODUTO_DESCRICAO,0) || '. OPERACAO CANCELADA! ';
                END
    
    
            END


    
        END
        ELSE
        /* REABRIR TALAO */
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 1 ) THEN
        BEGIN
        
            SELECT FIRST 1
                   T.ID,
                   P.ID,
                   P.STATUS
              FROM VWREMESSA_TALAO T,
                   TBPROGRAMACAO P
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
               AND P.TIPO             = 'A'
               AND P.TABELA_ID        = T.ID
              INTO :TALAO_ID,
                   :PROGRAMACAO_ID,
                   :PROGRAMACAO_STATUS;

            IF ( PROGRAMACAO_STATUS = 2 ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO EM PRODUCAO. OPERACAO NAO PERMITIDA.';
            END

                             
            /* DESFAZER OPERAÇÃO DE FINALIZAR TALÃO */
            UPDATE TBPROGRAMACAO O
               SET O.STATUS = '1'
              WHERE O.ID    = :PROGRAMACAO_ID;

            UPDATE VWREMESSA_TALAO R
               SET R.STATUS = 1
             WHERE R.ID     = :TALAO_ID;


            NEW.QUANTIDADE_PRODUCAO        = 0;
            NEW.QUANTIDADE_SALDO           = 0;
            NEW.QUANTIDADE_ALTERN_PRODUCAO = 0;
            NEW.QUANTIDADE_ALTERN_SALDO    = 0;
            NEW.DATA_PRODUCAO              = NULL;
            NEW.HORA_PRODUCAO              = NULL;

                                     
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = NEW.ESTOQUE_ID;

            UPDATE TBREMESSA_CONSUMO C
               SET C.DATAHORA_CONFERENCIA   = NULL,
                   C.QUANTIDADE_CONFERENCIA = 0,
                   C.CONFERENCIA            = '0'
             WHERE C.TALAO_DETALHE_ID       = NEW.CONTROLE;

            UPDATE TBREMESSA_TALAO_VINCULO V
               SET V.STATUS   = '0'
             WHERE V.TALAO_ID = :TALAO_ID;

            DELETE FROM TBREVISAO R
             WHERE R.TALAO_ID = NEW.CONTROLE;

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                UPDATE TBREMESSA_ITEM_PROCESSADO
                   SET SITUACAO          = 1,
                       DATA_PRODUCAO     = NULL,
                       HORA_PRODUCAO     = NULL
                 WHERE REMESSA  = :VINCULO_REMESSA_ID
                   AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    UPDATE vwremessa_talao_detalhe y
                           SET y.status               = 1,
                               y.DATA_PRODUCAO        = NULL,
                               y.DATAHORA_PRODUCAO    = NULL
                         WHERE y.remessa_id           = :VINCULO_REMESSA_ID
                           AND y.remessa_talao_id     = :VINCULO_REMESSA_TALAO_ID;
                end
            END

            EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',NEW.REMESSA,'DETALHAMENTO: ' || NEW.CONTROLE || ' REABERTO');

        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO PERMITIDA PARA ESTE TALAO DO CORTE.';

        END
    END

   -- exception "..." 'Não';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPI_REMESSA_INTERMEDIARIA
returns (
    REMESSA_ID integer)
as
declare variable REMESSA_ID_ORIGEM integer;
declare variable REMESSA_ID_VINCULO integer;
declare variable REMESSA_TALAO_DETALHE_ID integer;
declare variable OBSERVACAO varchar(200);
declare variable GP_ID integer;
declare variable TALAO_ID integer;
declare variable TALAO_PRODUTO_DESCRICAO varchar(400);
declare variable TALAO_PERFIL_SKU varchar(10);
declare variable TALAO_PERFIL_SKU_DESCRICAO varchar(80);
declare variable TALAO_COR_CLASSE varchar(10);
declare variable TALAO_COR_SUBCLASSE integer;
declare variable TALAO_CONTROLE varchar(4000);
declare variable TALAO_MODELO_ID integer;
declare variable TALAO_MODELO_DESCRICAO varchar(200);
declare variable TALAO_TAMANHO integer;
declare variable TALAO_PRODUTO_ID integer;
declare variable TALAO_TAMANHO_DESCRICAO varchar(200);
declare variable TALAO_QUANTIDADE numeric(18,5);
declare variable PRODUTO_DESCRICAO varchar(400);
declare variable TAMANHO_DESCRICAO varchar(200);
declare variable UM varchar(12);
declare variable LARGURA numeric(18,5);
declare variable COMPRIMENTO numeric(18,5);
declare variable COR_CLASSE varchar(10);
declare variable COR_SUBCLASSE integer;
declare variable ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable REMESSA_TALAO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable PRODUTO_ID integer;
declare variable MODELO_ID integer;
declare variable COR_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(18,5);
declare variable QUANTIDADE_ALTERNATIVA numeric(18,4);
declare variable QUANTIDADE_SOBRA numeric(18,4);
declare variable DENSIDADE smallint;
declare variable ESPESSURA numeric(18,2);
declare variable STATUS integer;
declare variable DATA_PRODUCAO date;
declare variable DATA_LIBERACAO date;
declare variable HORA_PRODUCAO timestamp;
declare variable HORA_LIBERACAO timestamp;
declare variable VIA_ETIQUETA integer;
declare variable TURNO char(4);
declare variable TALAO_EXTRA integer;
declare variable PERCENTUAL_EXTRA numeric(18,4);
declare variable UP_ID integer;
declare variable ESTACAO integer;
declare variable DATA date;
declare variable CONSUMO_ID integer;
declare variable CONSUMO_QUANTIDADE numeric(15,5);
declare variable C_ID_OLD integer;
declare variable C_ID integer;
declare variable C_ESTABELECIMENTO_ID integer;
declare variable C_REMESSA_ID integer;
declare variable C_REMESSA_TALAO_ID integer;
declare variable C_REMESSA_TALAO_DETALHE_ID integer;
declare variable C_CONTROLE integer;
declare variable C_LOCALIZACAO_ID integer;
declare variable C_PRODUTO_ID integer;
declare variable C_TAMANHO integer;
declare variable C_DENSIDADE integer;
declare variable C_ESPESSURA numeric(18,2);
declare variable C_QUANTIDADE_ORIGINAL numeric(18,4);
declare variable C_QUANTIDADE_NECES numeric(18,4);
declare variable C_QUANTIDADE_NECES_ALTERN numeric(18,4);
declare variable C_FATOR_UNIDADE numeric(18,8);
declare variable C_FATOR_UNIDADE_ALTERN numeric(18,8);
declare variable C_QUANTIDADE numeric(18,4);
declare variable C_QUANTIDADE_CONSUMO numeric(18,4);
declare variable C_QUANTIDADE_SALDO numeric(18,4);
declare variable C_QUANTIDADE_ALTERNATIVA numeric(18,4);
declare variable C_QUANTIDADE_SOBRA numeric(18,4);
declare variable C_STATUS char(4);
declare variable C_QUANTIDADE_ALTERNATIVA_CONS numeric(18,4);
declare variable C_QUANTIDADE_ALTERNATIVA_SALDO numeric(18,4);
declare variable C_DATAHORA_CONFERENCIA timestamp;
declare variable C_COMPONENTE smallint;
declare variable C_ESTOQUE_ID integer;
declare variable C_SALDO_BAIXAR numeric(18,4);
declare variable TEMPO_TOTAL numeric(15,4);
declare variable QUANTIDADE_DETALHE numeric(15,4);
declare variable TEMPO_SETUP numeric(15,4);
declare variable QTD_INTERMEDIARIA numeric(15,4);
declare variable CONSUMO_INTERMEDIARIA numeric(15,4);
declare variable CONSUMO_COMPONENTE numeric(15,4);
declare variable QTD numeric(15,4);
declare variable LINHA_INTERMEDIARIA numeric(15,4);
declare variable SOBRA_CONSUMO numeric(15,4);
declare variable ACRECIMO_CONSUMO numeric(15,4);
declare variable ACRECIMO_ADD numeric(15,4);
begin

    REMESSA_ID = GEN_ID(GTBREMESSA,1);


    SELECT FIRST 1
           T.OBSERVACAO,
           T.GP_ID
      FROM VWREMESSA_TALAO T
     WHERE T.REMESSA_ID = -99999--:REMESSA_ID
      INTO OBSERVACAO,
           GP_ID;
                    
    UPDATE VWREMESSA_TALAO T
       SET T.REMESSA_ID = :REMESSA_ID,
           T.GP_ID      = :GP_ID
     WHERE T.REMESSA_ID = -99999;


    REMESSA_ID_ORIGEM  = (SELECT FIRST 1 SKIP 0 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));
    REMESSA_ID_VINCULO = (SELECT FIRST 1 SKIP 1 OSPLIT FROM SPLIT(:OBSERVACAO,'-'));


    INSERT INTO VWREMESSA
    SELECT ESTABELECIMENTO_ID,
           FAMILIA_ID,
           FAMILIA_ID_MP,
           :REMESSA_ID,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO),
           DATA,
           PERFIL,
           STATUS,
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,1),
           '3',
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,2),
           FN_REMESSA_DESCRICAO(ESTABELECIMENTO_ID,:GP_ID,REMESSA,REQUISICAO,3),
           :GP_ID,
           FN_CURRENT_USER_ID(),
           AMOSTRA,
           'REMESSA INTERMEDIARIA',
           DATA,
           CURRENT_TIMESTAMP,
           ''
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = :REMESSA_ID_ORIGEM;



    SELECT FIRST 1
        R.ESTABELECIMENTO_ID
    FROM
        VWREMESSA R
    WHERE
        R.REMESSA_ID = :REMESSA_ID
    INTO
        ESTABELECIMENTO_ID;

    FOR

        SELECT
            P2.DESCRICAO TALAO_PRODUTO_DESCRICAO,
            TRIM(S.PERFIL) TALAO_PERFIL_SKU,
            PF.DESCRICAO TALAO_PERFIL_SKU_DESCRICAO,
            C.CLASSE TALAO_COR_CLASSE,
            C.SUBCLASSE TALAO_COR_SUBCLASSE,
            X.TALAO_CONTROLE,
            X.TALAO_MODELO_ID,
            X.TALAO_MODELO_DESCRICAO,
            X.TALAO_TAMANHO,
            X.TALAO_PRODUTO_ID,
            X.TALAO_TAMANHO_DESCRICAO,
            X.TALAO_QUANTIDADE,
            X.PRODUTO_DESCRICAO,
            X.TAMANHO_DESCRICAO,
            X.UM,
            X.LARGURA,
            X.COMPRIMENTO,
            X.COR_CLASSE,
            X.COR_SUBCLASSE,
            X.ID,
            X.REMESSA_TALAO_ID,
            X.LOCALIZACAO_ID,
            X.PRODUTO_ID,
            X.MODELO_ID,
            X.COR_ID,
            X.TAMANHO,
            X.QUANTIDADE,
            X.QUANTIDADE_ALTERNATIVA,
            X.QUANTIDADE_SOBRA,
            X.DENSIDADE,
            X.ESPESSURA,
            X.STATUS,
            X.DATA_PRODUCAO,
            X.DATA_LIBERACAO,
            X.HORA_PRODUCAO,
            X.HORA_LIBERACAO,
            X.VIA_ETIQUETA,
            X.TURNO,
            X.TALAO_EXTRA,
            X.PERCENTUAL_EXTRA
    
        FROM (

                select
                    z.*,
        
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_largura    , fn_array(LARGURA_COMPRIMENTO, 1, '|')) as numeric(15,4)) as LARGURA,
                    cast( iif(z.remessa_talao_id > 5000 and z.remessa_talao_id < 6000, z.placa_comprimento, fn_array(LARGURA_COMPRIMENTO, 2, '|')) as numeric(15,4)) COMPRIMENTO
                from(
                    SELECT
                        FN_LPAD(T2.REMESSA_TALAO_ID,4,0) TALAO_CONTROLE,
                        T2.MODELO_ID TALAO_MODELO_ID,
                        M.DESCRICAO TALAO_MODELO_DESCRICAO,
                        (SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_TAMANHO,
                        (SELECT FIRST 1 PRODUTO_ID FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID) TALAO_PRODUTO_ID,
                        FN_TAMANHO_GRADE(M.GRADE_CODIGO,(SELECT FIRST 1 TAMANHO FROM VWREMESSA_TALAO_DETALHE D WHERE D.REMESSA_ID = V.REMESSA_ID AND D.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID)) TALAO_TAMANHO_DESCRICAO,
                        SUM(T1.QUANTIDADE) OVER (PARTITION BY V.REMESSA_TALAO_ID) TALAO_QUANTIDADE,
                        P.DESCRICAO PRODUTO_DESCRICAO,
                        FN_TAMANHO_GRADE(P.GRADE_CODIGO,T1.TAMANHO) TAMANHO_DESCRICAO,                    
                        P.UNIDADEMEDIDA_SIGLA UM,
                        --MT.LARGURA,
                        --MT.COMPRIMENTO,
                        C2.CLASSE COR_CLASSE,
                        C2.SUBCLASSE COR_SUBCLASSE,
                        T1.ID,
                        T1.ESTABELECIMENTO_ID,
                        T1.REMESSA_ID,
                        T1.REMESSA_TALAO_ID,
                        T1.LOCALIZACAO_ID,
                        T1.PRODUTO_ID,
                        T1.MODELO_ID,
                        P.COR_CODIGO COR_ID,
                        T1.TAMANHO,
                        T1.QUANTIDADE,
                        T1.QUANTIDADE_ALTERNATIVA,
                        T1.QUANTIDADE_SOBRA,
                        T1.GP_ID,
                        T1.UP_ID,
                        T1.ESTACAO,
                        T1.DENSIDADE,
                        T1.ESPESSURA,
                        T1.STATUS,
                        T1.OBSERVACAO,
                        T1.DATA_PRODUCAO,
                        T1.DATA_LIBERACAO,
                        T1.HORA_PRODUCAO,
                        T1.HORA_LIBERACAO,
                        T1.VIA_ETIQUETA,
                        T1.TURNO,
                        T1.TALAO_EXTRA,
                        T1.PERCENTUAL_EXTRA,
                        T1.placa_largura,
                        T1.placa_comprimento,
        
                        coalesce(( select MT.LARGURA||'|'||MT.COMPRIMENTO from SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT), '0|0') LARGURA_COMPRIMENTO
        
            
                    FROM
                        VWREMESSA_TALAO T1,
                        VWREMESSA_CONSUMO C,
                        TBREMESSA_CONSUMO_VINCULO V,
                        VWREMESSA_TALAO T2,
                        TBPRODUTO P,
                        TBMODELO M,
                        TBMODELO M2,
                        --SPC_REMESSA_CONSUMO_MATRIZ(M2.MATRIZ_CODIGO,M2.GRADE_CODIGO,T1.TAMANHO) MT,
                        TBCOR C2
            
                    WHERE
                        T1.REMESSA_ID = C.REMESSA_ID
                    AND T1.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                    AND V.CONSUMO_ID = C.ID
                    AND T2.REMESSA_ID = V.REMESSA_ID
                    AND T2.REMESSA_TALAO_ID = V.REMESSA_TALAO_ID
                    AND P.CODIGO = T1.PRODUTO_ID
                    AND M.CODIGO = T2.MODELO_ID
                    AND M2.CODIGO = P.MODELO_CODIGO
                    AND C2.CODIGO = P.COR_CODIGO
                    AND T1.REMESSA_ID = :REMESSA_ID_ORIGEM
                    AND T2.REMESSA_ID = :REMESSA_ID_VINCULO
                 ) Z
            ) X,
            TBPRODUTO P2,
            VWSKU S,
            TBPERFIL PF,
            TBCOR C
        WHERE
            P2.CODIGO = TALAO_PRODUTO_ID
        AND S.MODELO_ID = P2.MODELO_CODIGO
        AND S.COR_ID = P2.COR_CODIGO
        AND S.TAMANHO = TALAO_TAMANHO
        AND PF.TABELA = 'SKU'
        AND PF.ID = S.PERFIL
        AND C.CODIGO = P2.COR_CODIGO
    INTO
        TALAO_PRODUTO_DESCRICAO,
        TALAO_PERFIL_SKU,
        TALAO_PERFIL_SKU_DESCRICAO,
        TALAO_COR_CLASSE,
        TALAO_COR_SUBCLASSE,
        TALAO_CONTROLE,
        TALAO_MODELO_ID,
        TALAO_MODELO_DESCRICAO,
        TALAO_TAMANHO,
        TALAO_PRODUTO_ID,
        TALAO_TAMANHO_DESCRICAO,
        TALAO_QUANTIDADE,
        PRODUTO_DESCRICAO,
        TAMANHO_DESCRICAO,
        UM,
        LARGURA,
        COMPRIMENTO,
        COR_CLASSE,
        COR_SUBCLASSE,
        ID,
        REMESSA_TALAO_ID,
        LOCALIZACAO_ID,
        PRODUTO_ID,
        MODELO_ID,
        COR_ID,
        TAMANHO,
        QUANTIDADE,
        QUANTIDADE_ALTERNATIVA,
        QUANTIDADE_SOBRA,
        DENSIDADE,
        ESPESSURA,
        STATUS,
        DATA_PRODUCAO,
        DATA_LIBERACAO,
        HORA_PRODUCAO,
        HORA_LIBERACAO,
        VIA_ETIQUETA,
        TURNO,
        TALAO_EXTRA,
        PERCENTUAL_EXTRA
    DO
    BEGIN
        UPDATE VWREMESSA_TALAO T
           SET T.PRODUTO_ID = NULL,
               T.DENSIDADE = :DENSIDADE,
               T.ESPESSURA = :ESPESSURA
         WHERE T.REMESSA_ID = :REMESSA_ID
           AND T.REMESSA_TALAO_ID = :TALAO_CONTROLE;


        REMESSA_TALAO_DETALHE_ID = GEN_ID(GERADOR1_ID, 1);

        FOR
            SELECT
                C.ID,
                C.QUANTIDADE
            FROM
                VWREMESSA_CONSUMO C
            WHERE
                C.REMESSA_ID = :REMESSA_ID_ORIGEM
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
        INTO
            CONSUMO_ID,
            CONSUMO_QUANTIDADE
        DO
        BEGIN

            INSERT INTO TBREMESSA_CONSUMO_VINCULO (
                CONSUMO_ID,
                REMESSA_ID,
                REMESSA_TALAO_ID,
                REMESSA_TALAO_DETALHE_ID,
                QUANTIDADE
            ) VALUES (
                :CONSUMO_ID,
                :REMESSA_ID,
                :TALAO_CONTROLE,
                :REMESSA_TALAO_DETALHE_ID,
                :CONSUMO_QUANTIDADE
            );

        END

        INSERT INTO VWREMESSA_TALAO_DETALHE (
            ESTABELECIMENTO_ID,
            REMESSA_ID,
            REMESSA_TALAO_ID,
            ID,
            PRODUTO_ID,
            MODELO_ID,
            COR_ID,
            TAMANHO,
            QUANTIDADE,
            QUANTIDADE_PRODUCAO,
            QUANTIDADE_SALDO,
--            QUANTIDADE_ALTERN,
            QUANTIDADE_ALTERN_PRODUCAO,
            QUANTIDADE_ALTERN_SALDO,
            GP_ID,
            STATUS
        ) VALUES (
           :ESTABELECIMENTO_ID,
           :REMESSA_ID,
           :TALAO_CONTROLE,
           :REMESSA_TALAO_DETALHE_ID,
           :PRODUTO_ID,
           :MODELO_ID,
           :COR_ID,
           :TAMANHO,
           :QUANTIDADE,
           0,
           0,
--           :QUANTIDADE_ALTERN,
           0,
           0,
           :GP_ID,
           1
        );

    END


    FOR
        SELECT
            T.GP_ID,
            T.UP_ID,
            T.ESTACAO,
            T.ID,
            T.REMESSA_TALAO_ID,
            T.QUANTIDADE,
            T.REMESSA_ID,
            R.DATA

        FROM
            VWREMESSA_TALAO T,
            VWREMESSA R

        WHERE
            R.REMESSA_ID = T.REMESSA_ID
        AND T.REMESSA_ID = :REMESSA_ID
    INTO
        :GP_ID,
        :UP_ID,
        :ESTACAO,
        :TALAO_ID,
        :REMESSA_TALAO_ID,
        :QUANTIDADE,
        :REMESSA_ID,
        :DATA
    DO
    BEGIN
        TEMPO_TOTAL = 0;
        DELETE FROM TMP22040;

        FOR
            SELECT P.MODELO_CODIGO,
                   P.COR_CODIGO,
                   D.TAMANHO,
                   iif(coalesce(d.quantidade_altern,0) = 0, D.QUANTIDADE, d.quantidade_altern) as QUANTIDADE
              FROM VWREMESSA_TALAO_DETALHE D,
                   TBPRODUTO P
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND P.CODIGO = D.PRODUTO_ID
        INTO
            :MODELO_ID,
            :COR_ID,
            :TAMANHO,
            :QUANTIDADE_DETALHE
        DO
        BEGIN
            INSERT INTO
            TMP22040 (
                UP_ID, 
                MODELO_ID, 
                COR_ID, 
                TAMANHO, 
                QUANTIDADE
            ) VALUES (
               :UP_ID, 
               :MODELO_ID, 
               :COR_ID, 
               :TAMANHO, 
               :QUANTIDADE_DETALHE
            );
                     
--            TEMPO_TOTAL = TEMPO_TOTAL + COALESCE((SELECT FIRST 1 T.TOTAL FROM SPC_PROGRAMACAO_TEMPO_NOVO T),0);
    
--            IF ( TEMPO_TOTAL = 0 ) THEN
--            BEGIN
--                EXCEPTION "..." 'TEMPO NAO LOCALIZADO PARA UP:' || :UP_ID || ' MODELO: ' || :MODELO_ID || ' COR: ' || :COR_ID || ' TAM.: ' || :TAMANHO || ' QTD. ' || :QUANTIDADE_DETALHE;
--            END
        END
          
        SELECT FIRST 1 T.TOTAL, t.totalsetup FROM SPC_PROGRAMACAO_TEMPO_NOVO T
        into :TEMPO_TOTAL, :TEMPO_SETUP;

        TEMPO_TOTAL = COALESCE(:TEMPO_TOTAL,1);
        TEMPO_SETUP = COALESCE(:TEMPO_SETUP,0);

        IF ( TEMPO_TOTAL = 0 ) THEN
        BEGIN
            TEMPO_TOTAL = 1;
        END

        EXECUTE PROCEDURE SPI_PROGRAMACAO2(
            :ESTABELECIMENTO_ID,
            'A',
            :GP_ID,
            :UP_ID,
            :ESTACAO,
            :TALAO_ID,
            0,
            0,
            :QUANTIDADE,
            :TEMPO_TOTAL,
            :REMESSA_ID,
            :DATA,
            :TEMPO_SETUP
        );
    END

    --exception "..." 'Rem:'||coalesce(:REMESSA_ID_VINCULO,0);

    FOR
        select
            y.*,
            --(SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)) as RESTO,
            iif(LINHA_INTERMEDIARIA >= QTD_INTERMEDIARIA, ACRECIMO_CONSUMO + (SOBRA_CONSUMO - (ACRECIMO_CONSUMO * QTD_INTERMEDIARIA)), ACRECIMO_CONSUMO) as ACRECIMO_ADD
        
        from(
            select
                x.*,
            
                CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA as SOBRA_CONSUMO,
                cast((CONSUMO_COMPONENTE - CONSUMO_INTERMEDIARIA) / QTD_INTERMEDIARIA as numeric(15,2)) as ACRECIMO_CONSUMO
            from(
                SELECT
                    C.ID ID_OLD,
                    GEN_ID(GTBREMESSA_CONSUMO,1) as NEW_ID,
                    C.ESTABELECIMENTO_ID,
                    :REMESSA_ID as REMESSA_ID,
                    V.REMESSA_TALAO_ID,
                    C.REMESSA_TALAO_DETALHE_ID,
                    C.CONTROLE,
                    C.LOCALIZACAO_ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.DENSIDADE,
                    C.ESPESSURA,
                    C.QUANTIDADE_ORIGINAL,
                    C.QUANTIDADE_NECES,
                    C.QUANTIDADE_NECES_ALTERN,
                    C.FATOR_UNIDADE,
                    C.FATOR_UNIDADE_ALTERN,
                    C.QUANTIDADE,
                    C.QUANTIDADE_CONSUMO,
                    C.QUANTIDADE_SALDO,
                    C.QUANTIDADE_ALTERNATIVA,
                    C.QUANTIDADE_SOBRA,
                    C.STATUS,
                    C.QUANTIDADE_ALTERNATIVA_CONSUMO,
                    C.QUANTIDADE_ALTERNATIVA_SALDO,
                    C.DATAHORA_CONFERENCIA,
                    C.COMPONENTE,
                    C.ESTOQUE_ID,
                    C.SALDO_BAIXAR,
        
                    row_number() over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as LINHA_INTERMEDIARIA,
                    count(C.QUANTIDADE_NECES) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as QTD_INTERMEDIARIA,
                    sum(v.quantidade) over(partition by V.REMESSA_TALAO_ID, C.PRODUTO_ID) as CONSUMO_INTERMEDIARIA,
                    coalesce((select SUM(D.quantidade) FROM vwremessa_talao_detalhe D WHERE D.remessa_id = V.remessa_id AND D.remessa_talao_id = V.remessa_talao_id AND D.produto_id = C.produto_id),0) AS CONSUMO_COMPONENTE
                
                FROM
                    VWREMESSA_CONSUMO C,
                    TBREMESSA_CONSUMO_VINCULO V
                
                WHERE   
                    V.REMESSA_ID = :REMESSA_ID_VINCULO
                AND V.CONSUMO_ID = C.ID
                ORDER BY C.ID
            ) x
        ) y
    INTO
        C_ID_OLD,
        C_ID,
        C_ESTABELECIMENTO_ID,
        C_REMESSA_ID,
        C_REMESSA_TALAO_ID,
        C_REMESSA_TALAO_DETALHE_ID,
        C_CONTROLE,
        C_LOCALIZACAO_ID,
        C_PRODUTO_ID,
        C_TAMANHO,
        C_DENSIDADE,
        C_ESPESSURA,
        C_QUANTIDADE_ORIGINAL,
        C_QUANTIDADE_NECES,
        C_QUANTIDADE_NECES_ALTERN,
        C_FATOR_UNIDADE,
        C_FATOR_UNIDADE_ALTERN,
        C_QUANTIDADE,
        C_QUANTIDADE_CONSUMO,
        C_QUANTIDADE_SALDO,
        C_QUANTIDADE_ALTERNATIVA,
        C_QUANTIDADE_SOBRA,
        C_STATUS,
        C_QUANTIDADE_ALTERNATIVA_CONS,
        C_QUANTIDADE_ALTERNATIVA_SALDO,
        C_DATAHORA_CONFERENCIA,
        C_COMPONENTE,
        C_ESTOQUE_ID,
        C_SALDO_BAIXAR,

        LINHA_INTERMEDIARIA,
        QTD_INTERMEDIARIA,
        CONSUMO_INTERMEDIARIA,
        CONSUMO_COMPONENTE,
        SOBRA_CONSUMO,
        ACRECIMO_CONSUMO,
        ACRECIMO_ADD

    DO
    BEGIN

        QTD = C_QUANTIDADE_NECES + ACRECIMO_ADD;

        --seta novo vinculo com a dublagem
        UPDATE TBREMESSA_CONSUMO_VINCULO
           SET CONSUMO_ID = :C_ID
         WHERE CONSUMO_ID = :C_ID_OLD
           AND REMESSA_ID = :REMESSA_ID_VINCULO;

        --consulta REMESSA_TALAO_DETALHE usando o vinculo com o talao do bojo
        select
            v.REMESSA_TALAO_DETALHE_ID
        from tbremessa_consumo_vinculo v
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID
        into :C_REMESSA_TALAO_DETALHE_ID;

        /*
        --atualiza o vinculo do talao do bojo com a nova quantidade
        update tbremessa_consumo_vinculo v
        set v.quantidade = :QTD
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID;
        */
         /*
        --atualizar consumo do bojo
        update tbremessa_consumo k
        set k.quantidade = :QTD
            where v.consumo_id      = :C_ID_OLD
            and v.REMESSA_ID        = :C_REMESSA_ID
            and v.REMESSA_TALAO_ID  = :C_REMESSA_TALAO_ID;  */

        C_REMESSA_TALAO_DETALHE_ID = coalesce(C_REMESSA_TALAO_DETALHE_ID, 0);

        if(C_REMESSA_TALAO_DETALHE_ID = 0)then
        begin
            exception "..." 'Vínculo com remessa intermediária não encontrado';
        end

        INSERT INTO VWREMESSA_CONSUMO (
            ID,
            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_CONSUMO,
            QUANTIDADE_ALTERNATIVA,
            QUANTIDADE_SOBRA,
            STATUS,
            QUANTIDADE_ALTERNATIVA_CONSUMO,
            DATAHORA_CONFERENCIA,
            COMPONENTE,
            ESTOQUE_ID,
            SALDO_BAIXAR
        ) VALUES (
            :C_ID,
            :C_ESTABELECIMENTO_ID,
            :C_REMESSA_ID,
            :C_REMESSA_TALAO_ID,
            :C_REMESSA_TALAO_DETALHE_ID,
            :C_CONTROLE,
            :C_LOCALIZACAO_ID,
            :C_PRODUTO_ID,
            :C_TAMANHO,
            :C_DENSIDADE,
            :C_ESPESSURA,
            :C_QUANTIDADE_ORIGINAL,
            :QTD, --:C_QUANTIDADE_NECES,
            :C_QUANTIDADE_NECES_ALTERN,
            :QTD, --:C_QUANTIDADE,
            :C_QUANTIDADE_CONSUMO,
            :C_QUANTIDADE_ALTERNATIVA,
            :C_QUANTIDADE_SOBRA,
            :C_STATUS,
            :C_QUANTIDADE_ALTERNATIVA_CONS,
            :C_DATAHORA_CONFERENCIA,
            :C_COMPONENTE,
            :C_ESTOQUE_ID,
            :QTD --:C_SALDO_BAIXAR
        );

    END




  /* Procedure Text */
--  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b9u for tbpedido_item_processado
active before update position 9
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_REQUISICAO VARCHAR(15);
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_FAMILIA_ID INTEGER;
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,5);         
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;

DECLARE VARIABLE VINCULO_COMPONENTE CHAR(1) ;
declare variable VINCULO_COMPONENTES VARCHAR(500) ;
DECLARE VARIABLE VINCULO_TALAO_ID INTEGER ;
DECLARE VARIABLE VINCULO_CONSUMO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_ID INTEGER ;
DECLARE VARIABLE VINCULO_PRODUTO_DESCRICAO VARCHAR(100) ;
DECLARE VARIABLE VINCULO_TIPO CHAR(1) ;
DECLARE VARIABLE VINCULO_TABELA_ID INTEGER ;  
DECLARE VARIABLE VINCULO_QUANTIDADE NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_SOBRA NUMERIC(15,4) ;
DECLARE VARIABLE VINCULO_QUANTIDADE_ALTERNATIVA NUMERIC(15,4) ;

DECLARE VARIABLE VINCULO_REMESSA_ID INTEGER;
DECLARE VARIABLE VINCULO_REMESSA_TALAO_ID INTEGER;

DECLARE VARIABLE QUANTIDADE_CONSUMO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_CONSUMO_ALTERNATIVO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_FINAL NUMERIC(18,4);
DECLARE VARIABLE calcTemp NUMERIC(15,4);
DECLARE VARIABLE QTD_CONSUMO NUMERIC(15,4);

begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           COALESCE(R.REQUISICAO,0)
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_REQUISICAO;

    IF ( REMESSA_WEB = '3' AND OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO ) THEN
    BEGIN

        /* REGISTRAR PRODUCAO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
    
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN

                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = iif( coalesce(t.flag_data,0) = 0, FN_DATA_PRODUCAO() , T.DATA_PRODUCAO)
                 WHERE T.ID     = :TALAO_ID;
    
                SELECT p.id FROM TBPROGRAMACAO P
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A'
                into :PROGRAMACAO_ID;
                
                INSERT INTO TBPROGRAMACAO_REGISTRO (PROGRAMACAO_ID, DATAHORA, STATUS, OPERADOR_ID, JUSTIFICATIVA_ID, REQUISICAO_ID, ESTACAO_ID, TEMPO_PARADO)
                            VALUES (:PROGRAMACAO_ID, current_timestamp, '2', new.operador_id_producao, NULL, 0, NULL, NULL);

                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3'
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                UPDATE TBUP_ESTACAO
                   SET TALAO_ID = :TALAO_ID,
                       INCREMENTO = 1
                 WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
    
    
            SELECT FIRST 1
                   P.LOCALIZACAO_CODIGO,
                   P.FAMILIA_CODIGO
              FROM TBPRODUTO P
             WHERE P.CODIGO = NEW.PRODUTO_CODIGO
              INTO TALAO_LOCALIZACAO_ID,
                   TALAO_FAMILIA_ID;
    
            TALAO_FAMILIA_ID     = COALESCE(TALAO_FAMILIA_ID    ,0);
            TALAO_LOCALIZACAO_ID = COALESCE(TALAO_LOCALIZACAO_ID,0);
    
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            
    
            /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
            TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO = FN_DATA_PRODUCAO();
    
            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            NEW.QUANTIDADE_PRODUCAO = NEW.quantidade_producao_tmp;
            NEW.QUANTIDADE_SALDO    = NEW.quantidade_producao_tmp;
    
    
            /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
            NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    

            VINCULO_REMESSA_TALAO_ID = COALESCE((
                SELECT FIRST 1 C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID),0);
            

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and not(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END

            /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
            /* ATENCAO: O ESTOQUE SO DEVE SER REGISTRADO SE ***NAO*** FOR UMA REQUISICAO OU TALAO EXTRA */
            if ( REMESSA_REQUISICAO = 0 AND VINCULO_REMESSA_TALAO_ID < 8000 and VINCULO_REMESSA_TALAO_ID between 5500 and 5999) then
            BEGIN
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    5,
                    fn_parametro('SISTEMA.GP_TALAO_PLACA'),
                    :UP_PERFIL,
                    :TALAO_FAMILIA_ID,
                    :TALAO_LOCALIZACAO_ID,
                    'TBPEDIDO_ITEM_PROCESSADO',
                    3,
                    NEW.CONTROLE,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    NEW.PRODUTO_CODIGO,
                    NEW.TAMANHO,
                    NEW.QUANTIDADE_PRODUCAO,
                    'E',
                    '0',
                    :UP_CCUSTO,
                    'WEB22190 - REGISTRO DE PRODUCAO - CORTE. REMESSA: ' || :REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    NEW.ESTOQUE_ID,
                    NEW.REMESSA,  
                    NEW.CONTROLE
                );
            END
    
            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
                select v.consumo_id from tbremessa_consumo_vinculo v where v.remessa_talao_detalhe_id = NEW.CONTROLE into :QTD_CONSUMO;

                update tbremessa_consumo n set
                    n.quantidade_conferencia = :CONSUMO_QUANTIDADE,
                    --N.quantidade = :CONSUMO_QUANTIDADE,
                    n.consumo_kg = :CONSUMO_QUANTIDADE
                where n.id = :QTD_CONSUMO;

            END

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    --registra a inicio da producao do talao acumulado de placa
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                     /*
                     --registra a producao do talao acumulado de placa
                     UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 3,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                    */

                    --atualiza quanidade produzida nos taloes de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.quantidade_producao     = new.quantidade_producao_tmp,
                           y.quantidade_saldo        = new.quantidade_producao_tmp
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;

                     --registra producao nos taloes detalhado de placa
                     UPDATE vwremessa_talao_detalhe y
                       SET y.status                  = 3,
                           y.quantidade_producao_tmp = new.quantidade_producao_tmp,
                           y.DATA_PRODUCAO           = FN_DATA_PRODUCAO(),
                           y.DATAHORA_PRODUCAO       = CURRENT_TIMESTAMP,
                           y.OPERADOR_ID_PRODUCAO    = NEW.OPERADOR_ID_PRODUCAO
                     WHERE y.remessa_id              = :VINCULO_REMESSA_ID
                       AND y.remessa_talao_id        = :VINCULO_REMESSA_TALAO_ID;



                end else
                begin
                    --status como cortado nos taloes detalhado
                    UPDATE TBREMESSA_ITEM_PROCESSADO X
                       SET SITUACAO          = 2,
                           DATA_PRODUCAO     = FN_DATA_PRODUCAO(),
                           HORA_PRODUCAO     = CURRENT_TIMESTAMP,
                           OPERADOR_PRODUCAO = NEW.OPERADOR_ID_PRODUCAO
                     WHERE REMESSA  = :VINCULO_REMESSA_ID
                       AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;
                end

                NEW.situacao = 3;
            END
    
            --exception "..."  ''||NEW.CONTROLE;

            /* BAIXA DE CONSUMO */
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN

                /* CALCULA AS QUANTIDADES CONSUMIDAS */
                QUANTIDADE_CONSUMO             = VINCULO_QUANTIDADE - VINCULO_QUANTIDADE_SOBRA;
                QUANTIDADE_CONSUMO_ALTERNATIVO = VINCULO_QUANTIDADE_ALTERNATIVA;
    
                /* ATUALIZA O STATUS DO VINCULO PARA 1 (UTILIZADO) */
                UPDATE TBREMESSA_TALAO_VINCULO V
                   SET V.STATUS = '1'
                 WHERE TALAO_ID = :TALAO_ID
                   AND CONSUMO_ID = :VINCULO_CONSUMO_ID;
    
                /* ATUALIZA A QUANTIDADE UTILIZADA NO CONSUMO */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO             = :QUANTIDADE_CONSUMO, --:VINCULO_QUANTIDADE,
                       C.QUANTIDADE_ALTERNATIVA_CONSUMO = :VINCULO_QUANTIDADE_ALTERNATIVA,
                       C.DATAHORA_CONFERENCIA           = CURRENT_TIMESTAMP,
                       C.STATUS                         = '1'
                 WHERE ID = :VINCULO_CONSUMO_ID;
    
                IF ( :VINCULO_COMPONENTE = '1' AND :VINCULO_COMPONENTES <> '' ) THEN
                BEGIN
                    EXCEPTION "..." 'HA COMPONENTES PENDENTES DE ALOCACAO. REMESSA/TALAO ESPERADO: ' || :VINCULO_COMPONENTES;
                END
                ELSE
                /* VERIFICA SE HA ITENS SEM MATERIA-PRIMA/COMPONENTE ALOCADO */
                IF ( :VINCULO_TALAO_ID IS NULL AND :CONSUMO_QUANTIDADE > 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'HA ITENS DA PROJECAO DE CONSUMO SEM MATERIA-PRIMA ALOCADA. PRODUTO: ' ||  coalesce(:VINCULO_PRODUTO_ID,0) || ' - ' || coalesce(:VINCULO_PRODUTO_DESCRICAO,0) || '. OPERACAO CANCELADA! ';
                END
    
    
            END


    
        END
        ELSE
        /* REABRIR TALAO */
        --exception "..." OLD.SITUACAO||' - '||NEW.SITUACAO;

        IF ( (OLD.SITUACAO = 2 AND NEW.SITUACAO = 1) or (OLD.SITUACAO = 3 AND NEW.SITUACAO = 1)) THEN
        BEGIN
        
            SELECT FIRST 1
                   T.ID,
                   P.ID,
                   P.STATUS
              FROM VWREMESSA_TALAO T,
                   TBPROGRAMACAO P
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
               AND P.TIPO             = 'A'
               AND P.TABELA_ID        = T.ID
              INTO :TALAO_ID,
                   :PROGRAMACAO_ID,
                   :PROGRAMACAO_STATUS;

            IF ( PROGRAMACAO_STATUS = 2 ) THEN
            BEGIN
                EXCEPTION "..." 'TALAO EM PRODUCAO. OPERACAO NAO PERMITIDA.';
            END

                             
            /* DESFAZER OPERAÇÃO DE FINALIZAR TALÃO */
            UPDATE TBPROGRAMACAO O
               SET O.STATUS = '1'
              WHERE O.ID    = :PROGRAMACAO_ID;

            UPDATE VWREMESSA_TALAO R
               SET R.STATUS = 1
             WHERE R.ID     = :TALAO_ID;


            NEW.QUANTIDADE_PRODUCAO        = 0;
            NEW.QUANTIDADE_SALDO           = 0;
            NEW.QUANTIDADE_ALTERN_PRODUCAO = 0;
            NEW.QUANTIDADE_ALTERN_SALDO    = 0;
            NEW.DATA_PRODUCAO              = NULL;
            NEW.HORA_PRODUCAO              = NULL;

                                     
            DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = NEW.ESTOQUE_ID;

            UPDATE TBREMESSA_CONSUMO C
               SET C.DATAHORA_CONFERENCIA   = NULL,
                   C.QUANTIDADE_CONFERENCIA = 0,
                   C.CONFERENCIA            = '0'
             WHERE C.TALAO_DETALHE_ID       = NEW.CONTROLE;

            UPDATE TBREMESSA_TALAO_VINCULO V
               SET V.STATUS   = '0'
             WHERE V.TALAO_ID = :TALAO_ID;

            DELETE FROM TBREVISAO R
             WHERE R.TALAO_ID = NEW.CONTROLE;

            /* CONTROLE DE PRODUCAO DA REMESSA PAI (BOJO) */
            FOR
                SELECT C.REMESSA_ID,
                       C.REMESSA_TALAO_ID
                  FROM TBREMESSA_CONSUMO_VINCULO V,
                       VWREMESSA_CONSUMO C
                 WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                   AND C.ID = V.CONSUMO_ID
            INTO
                VINCULO_REMESSA_ID,
                VINCULO_REMESSA_TALAO_ID
            DO
            BEGIN

                UPDATE TBREMESSA_ITEM_PROCESSADO
                   SET SITUACAO          = 1,
                       DATA_PRODUCAO     = NULL,
                       HORA_PRODUCAO     = NULL
                 WHERE REMESSA  = :VINCULO_REMESSA_ID
                   AND CONTROLE = :VINCULO_REMESSA_TALAO_ID;

                if(VINCULO_REMESSA_TALAO_ID between 5500 and 5999)then
                begin
                    UPDATE vwremessa_talao_detalhe y
                           SET y.status               = 1,
                               y.DATA_PRODUCAO        = NULL,
                               y.DATAHORA_PRODUCAO    = NULL
                         WHERE y.remessa_id           = :VINCULO_REMESSA_ID
                           AND y.remessa_talao_id     = :VINCULO_REMESSA_TALAO_ID;
                end
            END



            /* DESFAZER BAIXA DE CONSUMO DA REMESSA DO BOJO*/
            FOR
                SELECT
                    COMPONENTE,
                    COMPONENTES,
                    TALAO_ID,
                    CONSUMO_ID,
                    PRODUTO_ID,
                    PRODUTO_DESCRICAO,
                    QUANTIDADE,
                    QUANTIDADE_ALTERNATIVA,
                    QUANTIDADE_SOBRA,
                    QUANTIDADE_PROJECAO
                FROM (
                  SELECT C.COMPONENTE,
                            COALESCE(IIF(C.COMPONENTE = '1',
                            (
                            SELECT LIST(DISTINCT '[' || REMESSA || ' / ' || LPAD(REMESSA_TALAO_ID,4,'0') || ']', ', ')
                              FROM (
                                SELECT CV.CONSUMO_ID,
                                       R.REMESSA,
                                       CV.REMESSA_ID,
                                       CV.REMESSA_TALAO_ID,
                                       CV.REMESSA_TALAO_DETALHE_ID,
                                      (SELECT V.ID
                                         FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE V.CONSUMO_ID = CV.CONSUMO_ID
                                          AND V.TABELA_ID  = CV.REMESSA_TALAO_DETALHE_ID) VINCULO
                                  FROM VWREMESSA_CONSUMO C,
                                       VWREMESSA_TALAO T,
                                       TBREMESSA_CONSUMO_VINCULO CV,
                                       VWREMESSA R
                                  WHERE TRUE
                                   AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                   AND T.REMESSA_ID       = C.REMESSA_ID
                                   AND T.REMESSA_TALAO_ID = C.REMESSA_TALAO_ID
                                   AND C.ID               = CV.CONSUMO_ID
                                   AND CV.REMESSA_ID      = R.REMESSA_ID
                           ) WHERE VINCULO IS NULL
                         ),''),'')COMPONENTES,
                         V.TALAO_ID,
                         V.CONSUMO_ID,
                         LPAD(P.CODIGO,5,'0') PRODUTO_ID,
                         P.DESCRICAO PRODUTO_DESCRICAO,
                         SUM(COALESCE(V.QUANTIDADE,0))QUANTIDADE,
                         SUM(COALESCE(V.QUANTIDADE_ALTERNATIVA,0))QUANTIDADE_ALTERNATIVA,
                         AVG(COALESCE(C.QUANTIDADE_SOBRA,0))QUANTIDADE_SOBRA,
                         AVG(COALESCE(C.QUANTIDADE,0)) QUANTIDADE_PROJECAO
                    FROM VWREMESSA_CONSUMO C
                         LEFT JOIN TBREMESSA_TALAO_VINCULO V ON V.CONSUMO_ID = C.ID,
                         TBPRODUTO P, TBFAMILIA F
                    WHERE TRUE
                      AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                      AND P.CODIGO           = C.PRODUTO_ID
                      AND P.FAMILIA_CODIGO   = F.CODIGO
                      AND F.CONTROLE_PECA    = '1'
                    GROUP BY COMPONENTE, TALAO_ID, CONSUMO_ID,PRODUTO_ID,PRODUTO_DESCRICAO
                    ) X
    
            INTO
                :VINCULO_COMPONENTE,
                :VINCULO_COMPONENTES,
                :VINCULO_TALAO_ID,
                :VINCULO_CONSUMO_ID,
                :VINCULO_PRODUTO_ID,
                :VINCULO_PRODUTO_DESCRICAO,
                :VINCULO_QUANTIDADE,
                :VINCULO_QUANTIDADE_ALTERNATIVA,
                :VINCULO_QUANTIDADE_SOBRA,
                :CONSUMO_QUANTIDADE
            DO
            BEGIN
                select v.consumo_id from tbremessa_consumo_vinculo v where v.remessa_talao_detalhe_id = NEW.CONTROLE into :QTD_CONSUMO;

                update tbremessa_consumo n set
                    n.quantidade_conferencia = 0,
                    n.consumo_kg = :CONSUMO_QUANTIDADE,
                    n.conferencia = '0'
                where n.id = :QTD_CONSUMO;

            END

            EXECUTE PROCEDURE SPI_HISTORICO('TBREMESSA',NEW.REMESSA,'DETALHAMENTO: ' || NEW.CONTROLE || ' REABERTO');

        END
        ELSE
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO PERMITIDA PARA ESTE TALAO DO CORTE.';
        END
    END

   -- exception "..." 'Não';
end
^

SET TERM ; ^

