ALTER TABLE TBPEDIDO_ITEM_PROCESSADO
    ADD FLAG_DATA INTEGER DEFAULT 0;

ALTER TABLE TBPROGRAMACAO
    ADD FLAG_DATA INTEGER DEFAULT 0;

ALTER TABLE TBREMESSA_ITEM_PROCESSADO
    ADD FLAG_DATA INTEGER DEFAULT 0;
	
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)
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
FROM TBREMESSA_ITEM_PROCESSADO R
;


ALTER TABLE TBREMESSA_CONSUMO
    ADD FLAG_DATA INTEGER DEFAULT 0;
	
	
CREATE OR ALTER trigger ttbpedido_item_proc_b0u_02 for tbpedido_item_processado
active before update position 0
AS
DECLARE VARIABLE UM_ALTERNATIVA CHAR(1);
DECLARE VARIABLE DADOS_APROVEITAMENTO VARCHAR(40);
DECLARE VARIABLE DEFEITOS NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_APROVEIT NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_APROVEIT_ALTERN NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_PRODUCAO NUMERIC(15,4);
DECLARE VARIABLE QUANTIDADE_PRODUCAO_ALTERN NUMERIC(15,4);
DECLARE VARIABLE TALAO_PRODUTO_DESCRICAO VARCHAR(100);
Declare variable WEB Char(1);
Begin

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

        /* ESTA TRIGGER SO SERA PROCESSADA NAS NOVAS REMESSAS (GCWEB) */
        IF ( COALESCE(OLD.FAMILIA_CODIGO,0) = 0 ) THEN
        BEGIN
    
            /* 2 - EM PRODUCAO ; 3 - PRODUZIDO */
            IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 3 AND NEW.situacao <> 6) THEN
            BEGIN
                TALAO_PRODUTO_DESCRICAO = '';

                SELECT FIRST 1
                    P.DESCRICAO
                FROM
                    TBPRODUTO P
                WHERE
                    P.CODIGO = NEW.PRODUTO_CODIGO
                INTO
                    TALAO_PRODUTO_DESCRICAO
                ;
                    
    
                UM_ALTERNATIVA = (SELECT FIRST 1 IIF((TRIM(F.UNIDADEMEDIDA_ALTERNATIVO)='') OR F.UNIDADEMEDIDA_ALTERNATIVO IS NULL,'0','1')
                                  FROM TBFAMILIA F
                                  WHERE F.CODIGO = (SELECT FIRST 1 FAMILIA_CODIGO
                                                    FROM TBPRODUTO P
                                                    WHERE P.CODIGO = OLD.PRODUTO_CODIGO));
    
    
                /* Guarda os valores do aproveitamento */
                DADOS_APROVEITAMENTO = (SELECT FIRST 1
                                            LPAD(COALESCE(V.QUANTIDADE,0),20) ||
                                            LPAD(COALESCE(V.QUANTIDADE_ALTERNATIVA,0),20)
                                        FROM
                                            RDB$DATABASE
                                            LEFT JOIN
                                            TBREMESSA_TALAO_VINCULO V ON
                                            V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                                        AND V.STATUS                   = '0');
    
                QUANTIDADE_APROVEIT        = CAST(SUBSTRING(DADOS_APROVEITAMENTO FROM  1 FOR 20) AS NUMERIC(15,4));
                QUANTIDADE_APROVEIT_ALTERN = CAST(SUBSTRING(DADOS_APROVEITAMENTO FROM 21 FOR 20) AS NUMERIC(15,4));
    
                /* Guarda os valores produzidos */
                QUANTIDADE_PRODUCAO        = OLD.QUANTIDADE_PRODUCAO_TMP + QUANTIDADE_APROVEIT;
                QUANTIDADE_PRODUCAO_ALTERN = OLD.QUANTIDADE_ALTERN_PRODUCAO_TMP + QUANTIDADE_APROVEIT_ALTERN;
    
                /* Zera as quantidades temporarias */
    --            NEW.QUANTIDADE_PRODUCAO_TMP        = 0;
    --            NEW.QUANTIDADE_ALTERN_PRODUCAO_TMP = 0;
    
                /* VERIFICA SE A FAMILIA DO PRODUTO TEM UNIDADE DE MEDIDA ALTERNATIVA CONFIGURADA */
                IF (UM_ALTERNATIVA = '1') THEN
                BEGIN
                    /* VERIFICA SE QUANTIDADE ALTERNATIVA TEMPORARIA PRODUZIDA ESTA MAIOR QUE ZERO */
                    IF ( NOT ( QUANTIDADE_PRODUCAO_ALTERN > 0 ) ) THEN
                    BEGIN
                        EXCEPTION "..." 'FAMILIA DO PRODUTO ' || TALAO_PRODUTO_DESCRICAO || ' CONFIGURADA COM UNIDADE DE MEDIDA ALTERNATIVA. QUANTIDADE ALTERNATIVA DEVERA SER MAIOR QUE ZERO. OPERACAO CANCELADA! ';

                    END
                END

        
                DEFEITOS = COALESCE((
                    SELECT SUM(A.QUANTIDADE)
                    FROM
                        VWREMESSA_TALAO_DETALHE D,
                        TBDEFEITO_TRANSACAO_ITEM A,
                        TBSAC_DEFEITO B
                    WHERE TRUE
                    AND D.ID                = NEW.CONTROLE
                    AND A.REMESSA           = D.REMESSA_ID
                    AND A.REMESSA_CONTROLE  = D.ID
                    AND B.CODIGO            = A.DEFEITO_ID),0);
    
                /* VERIFICA SE QUANTIDADE PRODUZIDA TEMPORARIA ETA MAIOR QUE ZERO */
                IF ( NOT (NEW.QUANTIDADE_PEDIDO = DEFEITOS) AND NOT ((QUANTIDADE_PRODUCAO)  > 0) ) THEN
                BEGIN
                    EXCEPTION "..." 'QUANTIDADE PRODUZIDA DEVERA SER MAIOR QUE ZERO NO PRODUTO ' || TALAO_PRODUTO_DESCRICAO || ', QTD.PED:'||NEW.QUANTIDADE_PEDIDO||', QTD.PROD:'||:QUANTIDADE_PRODUCAO||'. OPERACAO CANCELADA!';

                END
    
                /* Grava os valores produzidos*/
                NEW.QUANTIDADE_PRODUCAO         = QUANTIDADE_PRODUCAO;
                NEW.QUANTIDADE_SALDO            = QUANTIDADE_PRODUCAO;
                NEW.QUANTIDADE_ALTERN_PRODUCAO  = QUANTIDADE_PRODUCAO_ALTERN;
                NEW.QUANTIDADE_ALTERN_SALDO     = QUANTIDADE_PRODUCAO_ALTERN;
    
                /* Grava data e hora de producao */
                /* a fleg he para manter a data na importacao de taloes na espumacao */
                if(coalesce(new.flag_data,0) = 0)then
                begin
                    NEW.DATA_PRODUCAO = CURRENT_DATE;
                    NEW.HORA_PRODUCAO = CURRENT_TIME;
                end
    
                /* GERA SOBRA DE PRODUÇÃO*/
                IF ( OLD.quantidade_sobra_tmp > 0) THEN
                BEGIN

                    UPDATE OR INSERT INTO TBREVISAO (
                        ESTABELECIMENTO_ID,
                        PRODUTO_ID,
                        TAMANHO,
                        DATA_REVISAO,
                        OPERADOR_ID,
                        DATAHORA_COLETA,
                        PESO_LIQUIDO,
                        SALDO,
                        METRAGEM,
                        TALAO_ID,
                        NFE_ID,
                        OB
                    ) VALUES(
                        OLD.ESTABELECIMENTO_CODIGO,
                        OLD.PRODUTO_CODIGO,
                        OLD.TAMANHO,
                        CURRENT_DATE,
                        OLD.OPERADOR,
                        CURRENT_TIMESTAMP,
                        OLD.QUANTIDADE_SOBRA_TMP,
                        OLD.QUANTIDADE_SOBRA_TMP,
                        OLD.QUANTIDADE_SOBRA_TMP,
                        OLD.CONTROLE ,
                        0,
                        0
                    ) MATCHING (TALAO_ID);
                END
    
                NEW.quantidade_sobra      = OLD.QUANTIDADE_SOBRA_TMP;
    
                /* ATUALIZA O STATUS PARA UTILIZADO DO APROVEITAMENTO */
                UPDATE TBREMESSA_TALAO_VINCULO V SET
                    V.STATUS = '1'
                WHERE V.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE;
    
            END
    
        END
      END
END;



CREATE OR ALTER trigger ttbpedido_item_proc_b0u_03 for tbpedido_item_processado
active before update position 0
AS                                        
DECLARE VARIABLE REMESSA_COMPONENTE CHAR(1) ;   
--DECLARE VARIABLE LOCALIZACAO_ID INTEGER ;
DECLARE VARIABLE ESTOQUE_ID INTEGER ;
DECLARE VARIABLE alternativa INTEGER ;
DECLARE VARIABLE OPERACAO_ENTRADA VARCHAR(10) ;
declare variable PERFIL_UP VARCHAR(50);
DECLARE VARIABLE CCUSTO VARCHAR(10);
DECLARE VARIABLE RETORNO_SP VARCHAR(500);
Declare variable REMESSA VARChar(15);
Declare variable REMESSA_WEB Char(1);
declare variable familia_id integer;
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 ( COALESCE(OLD.FAMILIA_CODIGO,0) = 0 ) THEN
        BEGIN
    
            /* 3 - PRODUZIDO */
            IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 3 AND NEW.QUANTIDADE_PRODUCAO > 0 ) THEN
            BEGIN

                /* a fleg he para manter a data na importacao de taloes na espumacao */
                if(coalesce(new.flag_data,0) = 0)then
                begin
                    NEW.DATA_PRODUCAO = (SELECT FIRST 1 T.DATA_PRODUCAO
                      FROM TBTURNO T
                     WHERE T.TURNO_CORRENTE = '1');
                end
    
                IF ( NOT (NEW.QUANTIDADE_PRODUCAO > 0) ) THEN
                BEGIN
                    EXCEPTION "..." 'HA ITENS COM QUANTIDADE PRODUZIDA IGUAL A ZERO . OPERACAO CANCELADA! '||
                                    ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                END
    
                /* Guarda o tipo da remessa ( '1' = Componente ) */
                REMESSA_COMPONENTE = (SELECT FIRST 1 COMPONENTE FROM VWREMESSA WHERE REMESSA_ID = NEW.REMESSA);
    
                /* VERIFICA SE A REMESSA EH DE COMPONENTE */
                IF ( :REMESSA_COMPONENTE = '1' ) THEN
                BEGIN
    
                    /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
--                  LOCALIZACAO_ID
                    NEW.LOCALIZACAO_CODIGO = 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_CODIGO
                                                 AND P.CODIGO                 = NEW.PRODUTO_CODIGO),0);
    
                    /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
                    IF ( NEW.LOCALIZACAO_CODIGO = 0 ) THEN
                    BEGIN
                        EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PRODUTO: ' || NEW.PRODUTO_CODIGO || '. OPERACAO CANCELADA! '||
                                        ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                    END

                    /* SIGLA DA OPERACAO DE ENTRADA NO ESTOQUE WORK IN PROCESS ENTRADA */
                    OPERACAO_ENTRADA = 'WPE';
                END
                ELSE
                BEGIN
                    /* GUARDA A LOCALIZACAO PADRAO */
                    --LOCALIZACAO_ID = COALESCE((SELECT FIRST 1 P.LOCALIZACAO_CODIGO
                    --                           FROM TBPRODUTO P
                    --                           WHERE P.CODIGO = NEW.PRODUTO_CODIGO),0);

                    /* VERIFICA SE A LOCALIZACAO PADRAO ESTA CONFIGURADA */
                    IF ( NEW.LOCALIZACAO_CODIGO = 0 ) THEN
                    BEGIN
                        EXCEPTION "..." 'TALAO SEM LOCALIZACAO DEFINIDA. CÓD. PRODUTO: ' || NEW.PRODUTO_CODIGO || '. OPERACAO CANCELADA! '||
                                        ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                    END

                    /* SIGLA DA OPERACAO DE ENTRADA NO ESTOQUE PADRAO */
                    OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
    
                END
    
                IF ( NEW.LOCALIZACAO_CODIGO > 0 ) THEN
                BEGIN
                    --Entrada no Estoque
                    ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
        
                    NEW.ESTOQUE_ID = :ESTOQUE_ID;
        
                    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.REMESSA_ACUMULADO_CONTROLE));
    
                    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.REMESSA_ACUMULADO_CONTROLE)),'');
    
                    familia_id = coalesce((
                        select first 1 familia_codigo
                          from tbproduto
                         where codigo = new.produto_codigo),0);
    
                    NEW.QUANTIDADE_PRODUCAO = CAST(NEW.QUANTIDADE_PRODUCAO AS NUMERIC(15,4));
    --              NEW.LOCALIZACAO_CODIGO  = :LOCALIZACAO_ID;
    
    
                    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                        5,
                        new.programacao_esteira,
                        :perfil_up,
                        :familia_id,
                        new.localizacao_codigo,
                        'TBPEDIDO_ITEM_PROCESSADO',
                        1,
                        new.controle,
                        new.estabelecimento_codigo,
                        NEW.DATA_PRODUCAO,
                        new.produto_codigo,
                        new.tamanho,
                        new.quantidade_producao,
                        'E',
                        '0',
                        :CCUSTO,
                        'ENTRADA POR REMESSA DE PRODUCAO. REMESSA:' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                        :ESTOQUE_ID,
                        NEW.REMESSA,
                        new.controle
                    );
    
                    NEW.LOCALIZACAO_CODIGO = COALESCE(FN_GET_CONTEXT_TEMPORARY('REGRA_LOCALIZACAO_ID'),NEW.LOCALIZACAO_CODIGO);
                END

            END else
            begin
                IF ( OLD.SITUACAO = 3 AND NEW.SITUACAO = 2 ) THEN
                BEGIN
                DELETE FROM TbEstoque_Transacao_Item
                 WHERE CONTROLE               = OLD.estoque_id
                   AND ESTABELECIMENTO_CODIGO = OLD.estabelecimento_codigo
                   AND PRODUTO_CODIGO         = OLD.produto_codigo;
                END
             END
    
        END

      END
END;





CREATE OR ALTER trigger ttbprogramacao_registro_b9i for tbprogramacao_registro
active before insert position 9
AS
begin
    IF ( NEW.STATUS = 2 ) THEN
    BEGIN
        UPDATE TBPROGRAMACAO P
           SET P.DATAHORA_FINALIZADO = NEW.DATAHORA
         WHERE P.ID = NEW.PROGRAMACAO_ID
         and coalesce(p.flag_data,0) = 0;
    END
end;

CREATE OR ALTER trigger ttbpedido_item_processado_b8u for tbpedido_item_processado
active before update position 8
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_FAMILIA_ID INTEGER;
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_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable PROGRAMACAO_ID INTEGER;
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,8);
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 PRODUCAO_TOTAL BOOLEAN;
declare variable CONSUMO_PRODUTO_TALAO INTEGER;
begin

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

    IF ( REMESSA_WEB = '2' ) THEN
    BEGIN
        /* FINALIZANDO O TALAO DETALHADO */
        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;
    
            IF ( NOT FN_GP_REMESSA_LIBERADA(NEW.REMESSA,:TALAO_GP_ID,:TALAO_UP_ID) ) THEN
            BEGIN
                EXCEPTION "..." 'REMESSA BLOQUEADA PARA PRODUCAO.';
            END
    
    
            /* 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 ID,
                   STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_ID,
                   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 TBPROGRAMACAO P
                   SET P.STATUS = '3',
                       P.DATAHORA_FINALIZADO = iif(coalesce(p.flag_data,0) = 0, CURRENT_TIMESTAMP, P.DATAHORA_FINALIZADO)
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                INSERT INTO TBPROGRAMACAO_REGISTRO (
                    PROGRAMACAO_ID,
                    STATUS,
                    OPERADOR_ID
                ) VALUES (
                   :PROGRAMACAO_ID,       
                   2,
                   NEW.OPERADOR_ID_PRODUCAO
                );
    
                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = FN_DATA_PRODUCAO()
                 WHERE T.ID     = :TALAO_ID;
    
    --            UPDATE TBUP_ESTACAO
    --               SET TALAO_ID = 0,
    --                   INCREMENTO = 1
    --             WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                
                EXECUTE PROCEDURE SPU_PROCESSAR_TEMPO_REALIZAD_V2((
                    SELECT FIRST 1 ID
                      FROM TBPROGRAMACAO P
                     WHERE P.TABELA_ID = :TALAO_ID));
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
            TALAO_LOCALIZACAO_ID = COALESCE(( SELECT FIRST 1 P.LOCALIZACAO_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO ),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;
            

            
            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 */
            IF ( NOT (COALESCE(NEW.QUANTIDADE_PRODUCAO,0) > 0) ) THEN
            BEGIN
                NEW.QUANTIDADE_PRODUCAO = NEW.QUANTIDADE_PEDIDO;
            END

            IF ( NEW.QUANTIDADE_PRODUCAO <> NEW.QUANTIDADE_PEDIDO ) THEN
            BEGIN
                FN_OPERADOR_AUTENTICACAO(NEW.OPERADOR_ID_PRODUCAO,34); /* REGISTRAR PRODUCAO PARCIAL */
            END

            NEW.QUANTIDADE_SALDO    = NEW.QUANTIDADE_PRODUCAO;


            PRODUCAO_TOTAL = COALESCE((SELECT IIF(SUM(P.QUANTIDADE_PEDIDO) = (SUM(P.QUANTIDADE_PRODUCAO)+NEW.QUANTIDADE_PRODUCAO),TRUE,FALSE)
                                             FROM TBPEDIDO_ITEM_PROCESSADO P
                                            WHERE P.REMESSA = NEW.REMESSA
                                              AND P.REMESSA_ACUMULADO_CONTROLE = NEW.REMESSA_ACUMULADO_CONTROLE),TRUE);
    
    
    ---------------- NAO SERA MAIS APLICADO --------------
    ---------- ENTRADA VIA CONFERENCIA DO COLETOR --------
    ------------------------------------------------------    
    --        /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
    --        TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    --        /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
    --        NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    --        /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
    --        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
    --            'TBPEDIDO_ITEM_PROCESSADO',
    --            0,
    --            NEW.CONTROLE,
    --            NEW.ESTABELECIMENTO_CODIGO,
    --            :TALAO_LOCALIZACAO_ID,
    --            NEW.DATA_PRODUCAO,
    --            NEW.PRODUTO_CODIGO,
    --            NEW.TAMANHO,
    --            NEW.QUANTIDADE_PRODUCAO,
    --            'E',
    --            OPERACAO_ENTRADA,
    --            '0',
    --            :CCUSTO,
    --            'WEB22180 - ENTRADA POR REMESSA DE PRODUCAO',
    --            NEW.ESTOQUE_ID
    --        );
    
        
    
            /* REALIZA AS BAIXAS DE CONSUMO GERAL AO TALAO */
            FOR
                SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.FATOR_UNIDADE,
                    C.QUANTIDADE_SALDO,
                    P.UNIDADEMEDIDA_SIGLA,
                    P.FAMILIA_CODIGO,
                    P.LOCALIZACAO_CODIGO
                FROM
                    VWREMESSA_CONSUMO C,
                    TBPRODUTO P
                WHERE
                    P.CODIGO = C.PRODUTO_ID
                AND C.REMESSA_ID = NEW.REMESSA
                AND C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                AND COALESCE(C.REMESSA_TALAO_DETALHE_ID,0) = 0
                AND C.STATUS = '0'
                AND C.COMPONENTE = '0'
            INTO
                CONSUMO_ID,
                CONSUMO_PRODUTO_ID,
                CONSUMO_TAMANHO,
                CONSUMO_FATOR_UNIDADE,
                CONSUMO_QUANTIDADE_SALDO,
                CONSUMO_UM,
                CONSUMO_FAMILIA_ID,
                CONSUMO_LOCALIZACAO_ID
            DO
            BEGIN
    
                /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
                CONSUMO_PERMITE_FRACAO = COALESCE((
                    SELECT U.PODE_FRACIONAR
                      FROM TbUnidadeMedida U
                     WHERE U.SIGLA = :CONSUMO_UM),'N');
    
                /* GERA O ID DA TRANSACAO DE SAIDA DO CONSUMO */
                CONSUMO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                /* REALIZA O CALCULO DE CONSUMO */
                /*
                   OBS1:
                       SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                       SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
                   OBS2:
                       SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
                */            
                CONSUMO_PRODUTO_TALAO = (
                    SELECT FIRST 1 Z.ID
                      FROM TBREMESSA_CONSUMO_TALAO Z
                     WHERE Z.TIPO = 1
                       AND Z.FAMILIA_ID = :REMESSA_FAMILIA_ID
                       AND (Z.INSUMO_PRODUTO_ID = :CONSUMO_PRODUTO_ID OR Z.INSUMO_FAMILIA_ID = :CONSUMO_FAMILIA_ID));
                CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO AND PRODUCAO_TOTAL,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(IIF(CONSUMO_PRODUTO_TALAO > 0,NEW.QUANTIDADE_PEDIDO, NEW.QUANTIDADE_PRODUCAO) * CONSUMO_FATOR_UNIDADE,0));
                CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));
    
    
                IF ( CONSUMO_QUANTIDADE <= 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida deverá ser maior que zero. Produto: ' || CONSUMO_PRODUTO_ID || ' Operação cancelada.';
                END
    
    
                /* VERIFICA SE O CONSUMO ESTÁ MAIOR QUE O PROJETADO. */
                /*
                    OBS: ESSE ERRO SO DEVE DISPARAR SE HOUVER PROBLEMA COM O FATOR UNIDADE OU SE O PRODUTO NAO PERMITIR FRACAO PARA CONSUMO
                 */
                IF ( CONSUMO_QUANTIDADE > CONSUMO_QUANTIDADE_SALDO ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida não deve ser maior que o saldo da projeção. Produto: ' || CONSUMO_PRODUTO_ID || ' QTD. CONS.:'||CONSUMO_QUANTIDADE||' QTD. SAL. CONS.:'||CONSUMO_QUANTIDADE_SALDO||' Operação cancelada.';
                END
    
                /* ATUALIZA A QUANTIDADE CONSUMIDA */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO = COALESCE(C.QUANTIDADE_CONSUMO,0) + :CONSUMO_QUANTIDADE,
                       C.ESTOQUE_ID = :CONSUMO_ESTOQUE_ID,
                       C.STATUS = IIF(:ULTIMO_TALAO,1,C.STATUS)
                 WHERE C.ID = :CONSUMO_ID;
    
    
    
    --            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
    --            CONSUMO_LOCALIZACAO_ID = COALESCE((
    --                SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
    --                  FROM TBFAMILIA_FICHA F
    --                 WHERE F.FAMILIA_CODIGO         = :CONSUMO_FAMILIA_ID
    --                   AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0);
    --
    --            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
    --            IF ( CONSUMO_LOCALIZACAO_ID = 0 ) THEN
    --            BEGIN
    --                EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || CONSUMO_PRODUTO_ID || '. OPERACAO CANCELADA! ';
    --            END            
    
                /* REALIZA A TRANSACAO DE SAIDA DO CONSUMO */
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    3,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :CONSUMO_FAMILIA_ID,  
                    :CONSUMO_LOCALIZACAO_ID,
                    'TBREMESSA_CONSUMO',
                    2,
                    :CONSUMO_ID,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    :CONSUMO_PRODUTO_ID,
                    :CONSUMO_TAMANHO,
                    :CONSUMO_QUANTIDADE,
                    'S',
                    '1',
                    :UP_CCUSTO,
                    'WEB22180 - SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA: ' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    :CONSUMO_ESTOQUE_ID,
                    NEW.REMESSA,
                    NEW.CONTROLE
                );
    
            END
    
    
            /* REALIZA AS BAIXAS DE CONSUMO GERAL AO TALAO */
            FOR
                SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.FATOR_UNIDADE,
                    C.QUANTIDADE_SALDO,
                    P.UNIDADEMEDIDA_SIGLA,
                    P.FAMILIA_CODIGO,
                    P.LOCALIZACAO_CODIGO
                FROM
                    VWREMESSA_CONSUMO C,
                    TBPRODUTO P
                WHERE
                    P.CODIGO = C.PRODUTO_ID
                AND C.REMESSA_ID = NEW.REMESSA
                AND C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                AND C.STATUS = '0'
                AND C.COMPONENTE = '0'
            INTO
                CONSUMO_ID,
                CONSUMO_PRODUTO_ID,
                CONSUMO_TAMANHO,
                CONSUMO_FATOR_UNIDADE,
                CONSUMO_QUANTIDADE_SALDO,
                CONSUMO_UM,
                CONSUMO_FAMILIA_ID,
                CONSUMO_LOCALIZACAO_ID
            DO
            BEGIN
    
                /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
                CONSUMO_PERMITE_FRACAO = COALESCE((
                    SELECT U.PODE_FRACIONAR
                      FROM TbUnidadeMedida U
                     WHERE U.SIGLA = :CONSUMO_UM),'N');
    
                /* GERA O ID DA TRANSACAO DE SAIDA DO CONSUMO */
                CONSUMO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                /* REALIZA O CALCULO DE CONSUMO */
                /*
                   OBS1:
                       SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                       SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
                   OBS2:
                       SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
                */
                CONSUMO_PRODUTO_TALAO = (
                    SELECT FIRST 1 Z.ID
                      FROM TBREMESSA_CONSUMO_TALAO Z
                     WHERE Z.TIPO = 1
                       AND Z.FAMILIA_ID = :REMESSA_FAMILIA_ID
                       AND (Z.INSUMO_PRODUTO_ID = :CONSUMO_PRODUTO_ID OR Z.INSUMO_FAMILIA_ID = :CONSUMO_FAMILIA_ID));
                CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO AND PRODUCAO_TOTAL,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(IIF(CONSUMO_PRODUTO_TALAO > 0,NEW.QUANTIDADE_PEDIDO, NEW.QUANTIDADE_PRODUCAO) * CONSUMO_FATOR_UNIDADE,0));
                CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));
    
    
                IF ( CONSUMO_QUANTIDADE <= 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida deverá ser maior que zero. Produto: ' || CONSUMO_PRODUTO_ID || ' Operação cancelada.';
                END
    
    
                /* VERIFICA SE O CONSUMO ESTÁ MAIOR QUE O PROJETADO. */
                /*
                    OBS: ESSE ERRO SO DEVE DISPARAR SE HOUVER PROBLEMA COM O FATOR UNIDADE OU SE O PRODUTO NAO PERMITIR FRACAO PARA CONSUMO
                 */
                IF ( CONSUMO_QUANTIDADE > CONSUMO_QUANTIDADE_SALDO ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida não deve ser maior que o saldo da projeção. Produto: ' || CONSUMO_PRODUTO_ID || ' QTD. CONS.:'||CONSUMO_QUANTIDADE||' QTD. SAL. CONS.:'||CONSUMO_QUANTIDADE_SALDO||' Operação cancelada.';
                END
    
                /* ATUALIZA A QUANTIDADE CONSUMIDA */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO = COALESCE(C.QUANTIDADE_CONSUMO,0) + :CONSUMO_QUANTIDADE,
                       C.ESTOQUE_ID = :CONSUMO_ESTOQUE_ID,
                       C.STATUS = 1
                 WHERE C.ID = :CONSUMO_ID;
    
    
    
    --            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
    --            CONSUMO_LOCALIZACAO_ID = COALESCE((
    --                SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
    --                  FROM TBFAMILIA_FICHA F
    --                 WHERE F.FAMILIA_CODIGO         = :CONSUMO_FAMILIA_ID
    --                   AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0);
    --
    --            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
    --            IF ( CONSUMO_LOCALIZACAO_ID = 0 ) THEN
    --            BEGIN
    --                EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || CONSUMO_PRODUTO_ID || '. OPERACAO CANCELADA! ';
    --            END            
    
                /* REALIZA A TRANSACAO DE SAIDA DO CONSUMO */
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    3,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :CONSUMO_FAMILIA_ID,  
                    :CONSUMO_LOCALIZACAO_ID,
                    'TBREMESSA_CONSUMO',
                    2,
                    :CONSUMO_ID,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    :CONSUMO_PRODUTO_ID,
                    :CONSUMO_TAMANHO,
                    :CONSUMO_QUANTIDADE,
                    'S',
                    '1',
                    :UP_CCUSTO,
                    'WEB22180 - SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA: ' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    :CONSUMO_ESTOQUE_ID,
                    NEW.REMESSA,
                    NEW.CONTROLE
                );
    
            END
    
    
    
        END
        ELSE
        /* CANCELANDO PRODUCAO */
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 1 ) THEN
        BEGIN

            FN_OPERADOR_AUTENTICACAO(NEW.OPERADOR_ID_PRODUCAO,31); /* CANCELAR PRODUCAO */


            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;

    
            SELECT ID,
                   STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_ID,
                   PROGRAMACAO_STATUS;


            IF ( PROGRAMACAO_STATUS <> 2 ) THEN
            BEGIN       
                UPDATE TBPROGRAMACAO P SET P.STATUS = 2 WHERE P.TIPO = 'A' AND P.TABELA_ID = :TALAO_ID;
    
                INSERT INTO TBPROGRAMACAO_REGISTRO (
                    PROGRAMACAO_ID,
                    STATUS,
                    OPERADOR_ID
                ) VALUES (
                   :PROGRAMACAO_ID,       
                   0,
                   NEW.OPERADOR_ID_PRODUCAO
                );
            END


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


            FOR
                SELECT I.CONTROLE,
                       I.TABELA_ID,
                       I.QUANTIDADE
                  FROM TBESTOQUE_TRANSACAO_ITEM I
                 WHERE I.DOCUMENTO = NEW.REMESSA
                   AND I.REMESSA_ITEM_CONTROLE = NEW.CONTROLE
                   AND I.TABELA = 'TBREMESSA_CONSUMO'
                   AND I.TIPO = 'S'
                   AND I.TABELA_NIVEL = 2
            INTO
                CONSUMO_ESTOQUE_ID,
                CONSUMO_ID,
                CONSUMO_QUANTIDADE
            DO
            BEGIN
                UPDATE VWREMESSA_CONSUMO X
                   SET X.STATUS = '0',
                       X.ESTOQUE_ID = 0,
                       X.QUANTIDADE_CONSUMO = X.QUANTIDADE_CONSUMO - :CONSUMO_QUANTIDADE
                 WHERE X.ID = :CONSUMO_ID;

                 DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :CONSUMO_ESTOQUE_ID;

            END

        END
        ELSE
        IF ( OLD.SITUACAO = 3 AND NEW.SITUACAO = 1  ) THEN
        BEGIN
            EXCEPTION "..." 'TALAO JA COLETADO PARA A EXPEDICAO, OPERACAO NAO PERMITIDA.';
        END
        ELSE
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 3 ) THEN
        BEGIN
            /* O TALAO ESTA SENDO COLETADO NA EXPEDICAO */
        END
        ELSE
        IF ( OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO  ) THEN
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO DISPONIVEL PARA ESTE TALAO. ENTRE EM CONTATO COM SUPORTE TECNICO, RAMAL 27 E INFORME A OPERACAO A SER REALIZADA.';
        END
    END

end;


CREATE OR ALTER trigger ttbremessa_item_proc_b0u_06 for tbremessa_item_processado
active before update position 0
AS
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 QUANTIDADE_CONSUMO NUMERIC(15,4) ;
DECLARE VARIABLE QUANTIDADE_CONSUMO_ALTERNATIVO NUMERIC(15,4) ;
DECLARE VARIABLE CONSUMO_QUANTIDADE NUMERIC(18,4);
DECLARE VARIABLE QUANTIDADE_FINAL NUMERIC(18,4);
DECLARE VARIABLE calcTemp NUMERIC(15,4);
Declare variable WEB Char(1);
Begin

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

        /* ESTA TRIGGER SO SERA PROCESSADA NAS NOVAS REMESSAS (GCWEB) */
        IF ( COALESCE(OLD.FAMILIA_CODIGO,0) = 0 ) THEN
        BEGIN
    
            /* 1 - EM ABERTO ; 2 - PRODUZIDO */
            IF ( OLD.SITUACAO = 1 AND NEW.SITUACAO = 2 ) THEN
            BEGIN

                NEW.TURNO         = (SELECT FIRST 1 T.CODIGO FROM TBTURNO T WHERE T.TURNO_CORRENTE = '1');

                if(coalesce(new.flag_data,0) = 0)then
                begin
                    NEW.HORA_PRODUCAO = 'NOW';
                    NEW.DATA_PRODUCAO = (SELECT FIRST 1 T.DATA_PRODUCAO  FROM TBTURNO T WHERE T.TURNO_CORRENTE = '1');
                end
    
                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 C.REMESSA_ID       = NEW.REMESSA
                                       AND C.REMESSA_TALAO_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 C.REMESSA_ID       = NEW.REMESSA
                          AND C.REMESSA_TALAO_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 = NEW.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
    
        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_PEDIDO;
            NEW.QUANTIDADE_SALDO    = NEW.QUANTIDADE_PEDIDO;
    
    
            /* 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 ) 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
    

            /* 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 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

                

    
            /* 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_03 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 = 1 and New.Situacao = 2) then 
          NEW.HORA_LIBERACAO = Current_TimeStamp;
      if (Old.Situacao = 2 and New.Situacao = 3 and coalesce(new.flag_data,0) = 0) then
          NEW.HORA_PRODUCAO = Current_TimeStamp;
      if (Old.Situacao = 3 and New.Situacao = 2) then
          NEW.HORA_PRODUCAO = NULL;
      if (Old.Situacao = 2 and New.Situacao = 1) then
          NEW.HORA_LIBERACAO = NULL;
      END

For
Select First 1 Id From TBRemessa_Setor
Where REMESSA = OLD.REMESSA
  and REMESSA_ACUMULADO_ID = OLD.CONTROLE
  and SITUACAO = 0
Into :id
Do
Begin
  if (Id > 0) Then
      Begin
        if (Old.Situacao = 2 and New.Situacao = 3) then
            Begin
            Exception "..." 'ATENÇÃO, HÁ TALÕES NÃO REGISTRADOS. ENCERRAMENTO NÃO PERMITIDO! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
            End
      End 
End
End;

