ALTER TABLE TBTURNO ALTER COLUMN DATA
SET DEFAULT current_date
;

ALTER TABLE TBTURNO
    ADD TURNO_CORRENTE2 COMPUTED BY (IIF(

((IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
            <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME),1,0))

     >=
   (CAST('2000.01.01' AS DATE)+HORA_INICIO)
     AND

((IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
            <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME),1,0))


     <=
   (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
 ,'1','0'));

ALTER TABLE TBTURNO
    ADD DATA_PRODUCAO2 COMPUTED BY (IIF(
  TURNO_CORRENTE2 = '1',

CURRENT_DATE-((IIF(HORA_INICIO > HORA_FIM,1,0)) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
          <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME),1,0))
  ,
  NULL
));

SET TERM ^ ;

CREATE OR ALTER function FN_DATA_PRODUCAO
returns date
AS
begin
  /* Function Text */
  return (SELECT FIRST 1 T.DATA_PRODUCAO2 FROM TBTURNO T WHERE T.TURNO_CORRENTE = '1');
end
^

SET TERM ; ^



SET TERM ^ ;

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 ESTOQUE_ID INTEGER ;
DECLARE VARIABLE QUANTIDADE_DEFEITO INTEGER ;
DECLARE VARIABLE QUANTIDADE_SEGUNDA INTEGER ;
DECLARE VARIABLE QUANTIDADE_TERCEIRA INTEGER ;
DECLARE VARIABLE QUANTIDADE_ESTOQUE 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 and coalesce(new.flag_alterar,0) = 0) THEN
        BEGIN
    
            --exception "..." OLD.SITUACAO||' - '||NEW.SITUACAO||' - '||NEW.QUANTIDADE_PRODUCAO;
            /* 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 = fn_data_producao();
                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 "..." '5.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 ( coalesce(NEW.LOCALIZACAO_CODIGO,0) <= 0 ) THEN
                    BEGIN
                        if(coalesce(NEW.LOCALIZACAO_CODIGO,0) <> -2)then
                        begin
                            if (NEW.setor_codigo = 107 or NEW.setor_codigo = 108) then
                            BEGIN
                               NEW.LOCALIZACAO_CODIGO = COALESCE((SELECT FIRST 1 P.LOCALIZACAO_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO),0);
                            END
                        end
                    END

                    IF ( coalesce(NEW.LOCALIZACAO_CODIGO,0) <= 0 ) THEN
                    BEGIN
                        if(coalesce(NEW.LOCALIZACAO_CODIGO,0) <> -2)then
                        begin
                            EXCEPTION "..." 'TALAO SEM LOCALIZACAO DEFINIDA. COD. PRODUTO: ' || NEW.PRODUTO_CODIGO || '. OPERACAO CANCELADA! '||
                                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                        end
                    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;

                    if(coalesce((select first 1 r.origem from tbremessa r where r.numero = new.remessa),0) = 22598)then
                    begin

                        SELECT
                            SUM(F.QUANTIDADE) AS QUANTIDADE,
                            sum(iif(f.classificacao <= 2, f.quantidade,0)) as QUANTIDADE_SEGUNDA,
                            sum(iif(f.classificacao >= 3, f.quantidade,0)) as QUANTIDADE_TERCEIRA
                        FROM TBDEFEITO_TRANSACAO_ITEM F
                        WHERE F.REMESSA = new.remessa
                        AND F.REMESSA_CONTROLE = new.remessa_acumulado_controle
                        AND F.TALAO_DETALHE_ID = new.controle
                        into QUANTIDADE_DEFEITO, QUANTIDADE_SEGUNDA, QUANTIDADE_TERCEIRA;

                        QUANTIDADE_DEFEITO  = coalesce(QUANTIDADE_DEFEITO,0);
                        QUANTIDADE_SEGUNDA  = coalesce(QUANTIDADE_SEGUNDA,0);
                        QUANTIDADE_TERCEIRA = coalesce(QUANTIDADE_TERCEIRA,0);

                        QUANTIDADE_ESTOQUE = new.quantidade_producao - QUANTIDADE_DEFEITO;

                        if(QUANTIDADE_ESTOQUE > 0)then
                        begin

                            --exception "..." 'Estoque';

                            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,
                                :QUANTIDADE_ESTOQUE,
                                '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
                            );
                        end

                    end else
                    begin

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

    
                    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
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_TURNO_CORRENTE
returns integer
AS
begin
  /* Function Text */
  return (SELECT FIRST 1 T.CODIGO FROM TBTURNO T WHERE T.TURNO_CORRENTE2 = '1');
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_processado_b14u for tbremessa_item_processado
active before update position 0
AS
declare variable vinculo integer;
begin
  if(new.entrada_cd is distinct from old.entrada_cd and new.entrada_cd = 1)then
  begin
        vinculo = 0;
        vinculo = coalesce(( select first 1 g.id
                        from tbremessa_consumo v, tbremessa_consumo_vinculo g
                        where v.remessa = new.remessa
                        and v.talao = new.controle
                        and g.consumo_id = v.id),0);
                
        if((new.controle between 6000 and 6999) or (vinculo = 0))then
        begin
            if(new.controle between 6000 and 6999)then
            begin
                new.situacao = 3;

                new.DATA_PRODUCAO = fn_data_producao();
                new.HORA_PRODUCAO = CURRENT_TIMESTAMP;
                new.TURNO         = FN_TURNO_CORRENTE();

                update tbpedido_item_processado p set p.situacao = 3 where p.remessa = new.remessa and p.remessa_acumulado_controle = new.controle;

            end else
            begin
                new.situacao = 2;
                new.DATA_PRODUCAO = (SELECT FIRST 1 T.DATA_PRODUCAO FROM TBTURNO T WHERE T.TURNO_CORRENTE = '1');
                new.HORA_PRODUCAO = CURRENT_TIMESTAMP;
                new.TURNO         = (SELECT FIRST 1 T.CODIGO FROM TBTURNO T WHERE T.TURNO_CORRENTE = '1');

                update tbpedido_item_processado p set p.situacao = 1 where p.remessa = new.remessa and p.remessa_acumulado_controle = new.controle;
            end


        end else
        begin
    
            if(new.situacao = 1)then
            begin
                Exception "..." 'ATENCAO, TALAO NAO CORTADO, OPERACAO CANCELADA!';
            end
        
            if(new.situacao = 3)then
            begin
                Exception "..." 'ATENCAO, TALAO LIBERADO PARA PRODUCAO, OPERACAO CANCELADA!';
            end
    
        end
    
        new.data_entrada_cd = current_timestamp;
        new.data_prod_entrada_cd = fn_data_producao();
  end
end
^

SET TERM ; ^

SET TERM ^ ;

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         = fn_turno_corrente();

                if(coalesce(new.flag_data,0) = 0)then
                begin
                    NEW.HORA_PRODUCAO = current_timestamp;
                    NEW.DATA_PRODUCAO = fn_data_producao();
                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 || ' / ' || fn_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 first 1 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
                    begin

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

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_talao_vinculo_b0u_01 for tbremessa_talao_vinculo
active before update position 0
AS                                        
DECLARE VARIABLE DADOS_TALAO VARCHAR(12);
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE REMESSA_COMPONENTE CHAR(1) ;   
DECLARE VARIABLE LOCALIZACAO_ID_SAIDA INTEGER;
DECLARE VARIABLE LOCALIZACAO_ID_ENTRADA INTEGER;
DECLARE VARIABLE ESTOQUE_ID_SOBRA_SAIDA INTEGER;
DECLARE VARIABLE ESTOQUE_ID_SOBRA_ENTRADA INTEGER;
DECLARE VARIABLE OPERACAO_SOBRA_SAIDA VARCHAR(10);
DECLARE VARIABLE OPERACAO_PRODUCAO_ENTRADA VARCHAR(10);
BEGIN
    
    /* ESTA TRIGGER SO SERA PROCESSADA QUANDO FOR UM VINCULO DE SOBRA E ITEM CONSUMIDO DO ESTOQUE (GCWEB) */
    IF ( NEW.REMESSA_TALAO_DETALHE_ID > 0 AND OLD.STATUS = '0' AND NEW.STATUS = '1' ) THEN
    BEGIN

        IF (NEW.TIPO <> 'R') THEN
        BEGIN
            EXCEPTION "..." 'TIPO DO VINCULO DE SOBRA INVALIDO. ESPERADO "R" RECEBIDO: ' || NEW.TIPO || '. OPERACAO CANCELADA! '||
                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        END

        /* DADOS DO TALAO */
        DADOS_TALAO = (SELECT FIRST 1 LPAD(R.COMPONENTE,1,' ')||R.ESTABELECIMENTO_ID
                       FROM VWREMESSA R, VWREMESSA_TALAO_DETALHE T
                       WHERE
                           R.REMESSA_ID = T.REMESSA_ID
                       AND T.ID = NEW.REMESSA_TALAO_DETALHE_ID);

        /* Guarda o tipo da remessa ( '1' = Componente ) */
        REMESSA_COMPONENTE = CAST(SUBSTRING(DADOS_TALAO FROM 1 FOR 1) AS CHAR(1));

        /* Guarda o estabelecimento da remessa */
        ESTABELECIMENTO_ID = CAST(SUBSTRING(DADOS_TALAO FROM 2) AS INTEGER);

        /* GUARDA A LOCALIZACAO DE SAIDA PADRAO */
        LOCALIZACAO_ID_SAIDA = 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 ( LOCALIZACAO_ID_SAIDA = 0 ) THEN
        BEGIN
            EXCEPTION "..." 'PRODUTO SEM LOCALIZACAO PADRAO DEFINIDA. COD. PRODUTO: ' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! '||
                            ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
        END

        /* VERIFICA SE A REMESSA EH DE COMPONENTE */
        IF ( :REMESSA_COMPONENTE = '1' ) THEN
        BEGIN

            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
            LOCALIZACAO_ID_ENTRADA = COALESCE((SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
                                       FROM TBPRODUTO P, TBFAMILIA_FICHA F
                                       WHERE F.FAMILIA_CODIGO         = P.FAMILIA_CODIGO
                                         AND F.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                                         AND P.CODIGO                 = NEW.PRODUTO_ID),0);

            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
            IF ( LOCALIZACAO_ID_ENTRADA = 0 ) THEN
            BEGIN
                EXCEPTION "..." '1.FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. COD. PRODUTO: ' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! ';
            END
        END
        ELSE
        BEGIN
            /* GUARDA A LOCALIZACAO DE ENTRADA PADRAO */
            LOCALIZACAO_ID_ENTRADA = LOCALIZACAO_ID_SAIDA;
        END

        /* Saida no Estoque */
        ESTOQUE_ID_SOBRA_SAIDA   = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

        /* Entrada no Estoque */
        ESTOQUE_ID_SOBRA_ENTRADA = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

        /* Guarda o id da transacao de saida do estoque */
        NEW.ESTOQUE_ID_SOBRA_SAIDA      = :ESTOQUE_ID_SOBRA_SAIDA;

        /* Guarda o id da transacao de entrada do estoque */
        NEW.ESTOQUE_ID_SOBRA_ENTRADA    = :ESTOQUE_ID_SOBRA_ENTRADA;

        /* SIGLA DA OPERACAO DE SAIDA DE SOBRA DO ESTOQUE */
        OPERACAO_SOBRA_SAIDA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 214);

        /* SIGLA DA OPERACAO DE ENTRADA POR PRODUCAO NO ESTOQUE (EPP) */
        OPERACAO_PRODUCAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);

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

        if(NEW.QUANTIDADE > 0)then
        begin
            /* REGISTRA SAIDA DO ESTOQUE */
            EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID_SAIDA,
                NEW.PRODUTO_ID,
                'S', /* S = SAIDA NO ESTOQUE */
                fn_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_SOBRA_SAIDA,
                NEW.REMESSA_TALAO_DETALHE_ID,
                0,
                0,
                :OPERACAO_SOBRA_SAIDA,
                0,
                0,
                0,
                0,
                0,
                Current_Date,
                0,
                0, --:CCUSTO,
                'SAIDA POR APROVEITAMENTO DE PRODUCAO',
                '0',
                0,
                0,
                0,
                0
            );

            /* REGISTRA ENTRADA NO ESTOQUE */
            EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID_ENTRADA,
                NEW.PRODUTO_ID,
                'E', /* E = ENTRADA NO ESTOQUE */
                fn_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_SOBRA_ENTRADA,
                NEW.REMESSA_TALAO_DETALHE_ID,
                0,
                0,
                :OPERACAO_PRODUCAO_ENTRADA,
                0,
                0,
                0,
                0,
                0,
                Current_Date,
                0,
                0, --:CCUSTO,
                'ENTRADA POR APROVEITAMENTO DE PRODUCAO',
                '0',
                0,
                0,
                0,
                0
            );
        end


        /* AJUSTA SALDO DA SOBRA DE PRODUCAO */
        UPDATE TBREVISAO R
        SET R.SALDO = R.SALDO - NEW.QUANTIDADE
        WHERE R.ID = NEW.TABELA_ID;

    END ELSE
    BEGIN
        IF (NEW.STATUS = '0' AND OLD.STATUS = '1' AND NEW.TIPO = 'R') THEN
        BEGIN
    
            /* DADOS DO TALAO */
            DADOS_TALAO = (SELECT FIRST 1 LPAD(R.COMPONENTE,1,' ')||R.ESTABELECIMENTO_ID
                           FROM VWREMESSA R, VWREMESSA_TALAO_DETALHE T
                           WHERE
                               R.REMESSA_ID = T.REMESSA_ID
                           AND T.ID = NEW.REMESSA_TALAO_DETALHE_ID);
    
            /* Guarda o tipo da remessa ( '1' = Componente ) */
            REMESSA_COMPONENTE = CAST(SUBSTRING(DADOS_TALAO FROM 1 FOR 1) AS CHAR(1));
    
            /* Guarda o estabelecimento da remessa */
            ESTABELECIMENTO_ID = CAST(SUBSTRING(DADOS_TALAO FROM 2) AS INTEGER);
    
            /* GUARDA A LOCALIZACAO DE SAIDA PADRAO */
            LOCALIZACAO_ID_SAIDA = 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 ( LOCALIZACAO_ID_SAIDA = 0 ) THEN
            BEGIN
                EXCEPTION "..." 'PRODUTO SEM LOCALIZACAO PADRAO DEFINIDA. COD. PRODUTO: ' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! '||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
            END
    
            /* VERIFICA SE A REMESSA EH DE COMPONENTE */
            IF ( :REMESSA_COMPONENTE = '1' ) THEN
            BEGIN
    
                /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
                LOCALIZACAO_ID_ENTRADA = COALESCE((SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
                                           FROM TBPRODUTO P, TBFAMILIA_FICHA F
                                           WHERE F.FAMILIA_CODIGO         = P.FAMILIA_CODIGO
                                             AND F.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
                                             AND P.CODIGO                 = NEW.PRODUTO_ID),0);
    
                /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
                IF ( LOCALIZACAO_ID_ENTRADA = 0 ) THEN
                BEGIN
                    EXCEPTION "..." '2.FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. COD. PRODUTO: ' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! ';
                END
            END
            ELSE
            BEGIN
                /* GUARDA A LOCALIZACAO DE ENTRADA PADRAO */
                LOCALIZACAO_ID_ENTRADA = LOCALIZACAO_ID_SAIDA;
            END
    
            /* Saida no Estoque */
            ESTOQUE_ID_SOBRA_SAIDA   = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
            /* Entrada no Estoque */
            ESTOQUE_ID_SOBRA_ENTRADA = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
            /* Guarda o id da transacao de saida do estoque */
            NEW.ESTOQUE_ID_SOBRA_SAIDA      = :ESTOQUE_ID_SOBRA_SAIDA;
    
            /* Guarda o id da transacao de entrada do estoque */
            NEW.ESTOQUE_ID_SOBRA_ENTRADA    = :ESTOQUE_ID_SOBRA_ENTRADA;
    
            /* SIGLA DA OPERACAO DE SAIDA DE SOBRA DO ESTOQUE */
            OPERACAO_SOBRA_SAIDA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 214);
    
            /* SIGLA DA OPERACAO DE ENTRADA POR PRODUCAO NO ESTOQUE (EPP) */
            OPERACAO_PRODUCAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
    
            /*
            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));
            */

            DELETE FROM TbEstoque_Transacao_Item
             WHERE CONTROLE               = OLD.estoque_id_sobra_saida
               AND ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
               AND PRODUTO_CODIGO         = OLD.PRODUTO_ID;

               NEW.estoque_id_sobra_saida = 0;

            DELETE FROM TbEstoque_Transacao_Item
             WHERE CONTROLE               = OLD.estoque_id_sobra_entrada
               AND ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_ID
               AND PRODUTO_CODIGO         = OLD.PRODUTO_ID;

               NEW.estoque_id_sobra_entrada = 0;
    
            /* AJUSTA SALDO DA SOBRA DE PRODUCAO */
            UPDATE TBREVISAO R
            SET R.SALDO = R.SALDO + NEW.QUANTIDADE
            WHERE R.ID = NEW.TABELA_ID;

            new.status = 0;

        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrevisao_b0i_01 for tbrevisao
active before insert position 0
AS
DECLARE VARIABLE LOCALIZACAO_ID INTEGER;
DECLARE VARIABLE ESTOQUE_ID INTEGER;
DECLARE VARIABLE OPERACAO_ENTRADA VARCHAR(255);
DECLARE VARIABLE DADOS_TALAO VARCHAR(30);
DECLARE VARIABLE CCUSTO VARCHAR(10);
DECLARE VARIABLE REMESSA_ID INTEGER;
begin
    
    /* SE TALAO_ID > 0 ESTE REGISTRO EH UMA SOBRA DE PRODUCAO */
    IF (NEW.TALAO_ID > 0) THEN
    BEGIN


     if (Coalesce(New.Localizacao_Entrada,0) = 0) then
         Begin
            :LOCALIZACAO_ID = Coalesce((Select First 1 P.Localizacao_Codigo From TbProduto P
                                            Where P.Codigo = New.Produto_Id),0);
    
            if (:LOCALIZACAO_ID = 0) Then
                Begin
                EXCEPTION "..." 'SOBRA DE PRODUCAO SEM LOCALIZACAO PADRAO DEFINIDA. COD. PRODUTO: ' || NEW.PRODUTO_ID || '. OPERACAO CANCELADA! '||
                                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                End

            New.Localizacao_Entrada = :LOCALIZACAO_ID;
         End else
         Begin
            :LOCALIZACAO_ID = New.Localizacao_Entrada;
         End

        DADOS_TALAO = (SELECT LPAD(U.CCUSTO,10,' ') || LPAD(D.REMESSA_ID,20,' ')
                         FROM VWREMESSA_TALAO_DETALHE D, VWREMESSA_TALAO T, TBUP U
                        WHERE D.REMESSA_ID       = T.REMESSA_ID
                          AND D.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID
                          AND T.UP_ID            = U.ID
                          AND D.ID = NEW.TALAO_ID);

        /* C.CUSTO DA UNIDADE PRODUTIVA QUE GEROU ESTA SOBRA */
        CCUSTO     = CAST(SUBSTRING(DADOS_TALAO FROM  1 FOR 10) AS VARCHAR(10));

        /* NUMERO DA REMESSA QUE ORIGINOU ESTA SOBRA */
        REMESSA_ID = CAST(SUBSTRING(DADOS_TALAO FROM 11 FOR 20) AS INTEGER);
         
        --Entrada no Estoque
        ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);

        NEW.ESTOQUE_ID_SOBRA = :ESTOQUE_ID;

        /* SIGLA DA OPERACAO DE ENTRADA NO ESTOQUE */
        OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);

        --EXCEPTION "..." 'ESTOQUE_ID'||ESTOQUE_ID||' OPERACAO_ENTRADA'||OPERACAO_ENTRADA||''||''||''||''||'';

        if(NEW.PESO_LIQUIDO > 0)then
        begin
        EXECUTE PROCEDURE SPU_ESTOQUE_SALDO4 (
            NEW.ESTABELECIMENTO_ID,
            :LOCALIZACAO_ID,
            NEW.PRODUTO_ID,
            'E', /* E = ENTRADA NO ESTOQUE */
            fn_data_producao(),
            NEW.PESO_LIQUIDO,
            IIF(NEW.TAMANHO = 1,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 2,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 3,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 4,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 5,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 6,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 7,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 8,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO = 9,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =10,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =11,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =12,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =13,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =14,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =15,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =16,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =17,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =18,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =19,NEW.PESO_LIQUIDO,0),
            IIF(NEW.TAMANHO =20,NEW.PESO_LIQUIDO,0),
            :ESTOQUE_ID,
            REMESSA_ID,
            0,
            0,
            :OPERACAO_ENTRADA,
            0,
            0,
            0,
            0,
            0,
            CURRENT_DATE,
            0,
            CCUSTO,
            'ENTRADA POR SOBRA DE PRODUCAO',
            '0',
            0,
            NEW.ID,
            0,
            0
        );
     end
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbremessa_item_processado_b14u for tbremessa_item_processado
active before update position 0
AS
declare variable vinculo integer;
begin
  if(new.entrada_cd is distinct from old.entrada_cd and new.entrada_cd = 1)then
  begin
        vinculo = 0;
        vinculo = coalesce(( select first 1 g.id
                        from tbremessa_consumo v, tbremessa_consumo_vinculo g
                        where v.remessa = new.remessa
                        and v.talao = new.controle
                        and g.consumo_id = v.id),0);
                
        if((new.controle between 6000 and 6999) or (vinculo = 0))then
        begin
            if(new.controle between 6000 and 6999)then
            begin
                new.situacao = 3;

                new.DATA_PRODUCAO = fn_data_producao();
                new.HORA_PRODUCAO = CURRENT_TIMESTAMP;
                new.TURNO         = FN_TURNO_CORRENTE();

                update tbpedido_item_processado p set p.situacao = 3 where p.remessa = new.remessa and p.remessa_acumulado_controle = new.controle;

            end else
            begin
                new.situacao = 2;
                new.DATA_PRODUCAO = fn_data_producao();
                new.HORA_PRODUCAO = CURRENT_TIMESTAMP;
                new.TURNO         = FN_TURNO_CORRENTE();

                update tbpedido_item_processado p set p.situacao = 1 where p.remessa = new.remessa and p.remessa_acumulado_controle = new.controle;
            end


        end else
        begin
    
            if(new.situacao = 1)then
            begin
                Exception "..." 'ATENCAO, TALAO NAO CORTADO, OPERACAO CANCELADA!';
            end
        
            if(new.situacao = 3)then
            begin
                Exception "..." 'ATENCAO, TALAO LIBERADO PARA PRODUCAO, OPERACAO CANCELADA!';
            end
    
        end
    
        new.data_entrada_cd = current_timestamp;
        new.data_prod_entrada_cd = fn_data_producao();
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_proc_b3u_01 for tbpedido_item_processado
active before update position 4
AS
Begin

  if ((old.DATA_PRODUCAO IS NULL) and (new.data_producao is not null)) Then
  begin
    NEW.turno_producao = fn_turno_corrente();
    NEW.turno = fn_turno_corrente();
  end

  if (NEW.DATA_PRODUCAO IS NULL and NEW.STATUS_PRODUCAO = '1') Then
      Begin
      NEW.STATUS_PRODUCAO = '0';
      End else
      Begin
      NEW.STATUS_PRODUCAO = '1';
      End

  if (NEW.DATA_EXPEDICAO IS NULL and NEW.COLETA_ID <> 0) Then
      Begin
      NEW.COLETA_ID = 0;
      End 

  if (OLD.COLETA_ID > 0 AND NEW.COLETA_ID > 0 AND NEW.COLETA_ID <> OLD.COLETA_ID and OLD.DATA_EXPEDICAO IS NOT NULL) Then
      Begin
        Exception "..." 'Talão já coletado, operação abortada! ID da coleta: '||OLD.COLETA_ID||', COL.2:'||new.coleta_id||'......................................................................................................................................................................................................................................................';
      End

End
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER function FN_DATA_PRODUCAO
returns date
AS
begin
  /* Function Text */
  return (SELECT FIRST 1 T.DATA_PRODUCAO2 FROM TBTURNO T WHERE T.TURNO_CORRENTE2 = '1');
end
^

SET TERM ; ^

ALTER TABLE TBTURNO DROP DATA_PRODUCAO;
ALTER TABLE TBTURNO DROP TURNO_CORRENTE;

ALTER TABLE TBTURNO
    ADD TURNO_CORRENTE COMPUTED BY (IIF(

((IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
            <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME),1,0))

     >=
   (CAST('2000.01.01' AS DATE)+HORA_INICIO)
     AND

((IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
            <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME),1,0))


     <=
   (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
 ,'1','0'));

ALTER TABLE TBTURNO
    ADD DATA_PRODUCAO COMPUTED BY (IIF(
  TURNO_CORRENTE = '1',

CURRENT_DATE-((IIF(HORA_INICIO > HORA_FIM,1,0)) -
    IIF((
        IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE)+HORA_FIM)
          <
        (IIF(HORA_INICIO > HORA_FIM,1,0)+CAST('2000.01.01' AS DATE) + LOCALTIME),1,0))
  ,
  NULL
));

SET TERM ^ ;