SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROCESSAR_TEMPO_REAL_V2 (
    I_PROGRAMACAO_ID integer)
returns (
    O_TEMPO_FRACAO_MINUTO numeric(18,4))
as
declare variable HISTORICO_ID integer;
declare variable HISTORICO_DATAHORA timestamp;
declare variable HISTORICO_STATUS char(1);
declare variable STATUS_ANTERIOR char(1);
declare variable DATAHORA_ANTERIOR timestamp;
declare variable PROGRAMACAO_ID integer;
declare variable TEMPO_FRACAO_DIA numeric(18,4);
begin
        :PROGRAMACAO_ID = I_PROGRAMACAO_ID;
        /* INICIALIZA O CONTADOR DE TEMPO TOTAL */
        TEMPO_FRACAO_DIA = 0;
    
        /* INICIO DO LACO QUE CONSULTA OS HISTORICOS DA PROGRAMACAO */
        FOR
            SELECT
                R.ID,
                R.DATAHORA,
                R.STATUS
             FROM TBPROGRAMACAO_REGISTRO R
            WHERE R.PROGRAMACAO_ID = :PROGRAMACAO_ID
            and r.justificativa_id <> 888
            ORDER BY DATAHORA
        INTO
            :HISTORICO_ID,
            :HISTORICO_DATAHORA, 
            :HISTORICO_STATUS
        DO
        BEGIN
            
            /* VERIFICA SE EH TEMPO PRODUTIVO */
            /* 0 - INICIADO/REINICIADO; 1 - PARADO; 2 - FINALIZADO */
            IF ( (STATUS_ANTERIOR = '0' AND HISTORICO_STATUS = '1') OR (STATUS_ANTERIOR = '0' AND HISTORICO_STATUS = '2') ) THEN
            BEGIN
                /* CALCULA O TEMPO PRODUTIVO E CONVERTE PARA FRACAO DE MINUTO */
                TEMPO_FRACAO_DIA      = (TEMPO_FRACAO_DIA + HISTORICO_DATAHORA - DATAHORA_ANTERIOR);
                O_TEMPO_FRACAO_MINUTO = TEMPO_FRACAO_DIA*24*60;
            END
    
            /* GUARDA A DATAHORA E O STATUS ATUAL, PARA SER UTILIZADO NO PROXIMO REGISTRO */
            DATAHORA_ANTERIOR = :HISTORICO_DATAHORA;
            STATUS_ANTERIOR   = :HISTORICO_STATUS;

        END

        SUSPEND;

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbprogramacao_b4u for tbprogramacao
active before update position 4
AS
DECLARE VARIABLE CONTADOR BIGINT;
BEGIN

    IF ( OLD.STATUS = '2' AND NEW.STATUS IN ('3','1') ) THEN
    BEGIN
        IF ( COALESCE(NEW.FERRAMENTA_ID,0) = 0 ) THEN
        BEGIN                       
            NEW.TEMPO_REALIZADO = (SELECT FIRST 1 O_TEMPO_FRACAO_MINUTO FROM spc_processar_tempo_real_v2(NEW.ID));
            NEW.TEMPO_OPERACIONAL_REAL = (SELECT FIRST 1 O_TEMPO_FRACAO_MINUTO FROM spc_processar_tempo_op(NEW.ID));
        END

        IF ( COALESCE(NEW.FERRAMENTA_ID,0) > 0 ) THEN
        BEGIN
            NEW.TEMPO_REALIZADO = (SELECT FIRST 1 O_TEMPO_FRACAO_MINUTO FROM spc_programacao_tempo_realizado(NEW.ID,NEW.REQUISICAO_ID));
        END
    END

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PROGRAMACAO_TEMPO_REAL_v2 (
    PROGRAMACAO_ID integer,
    REQUISICAO_ID integer)
returns (
    O_TEMPO_FRACAO_MINUTO numeric(18,4))
as
declare variable HISTORICO_ID integer;
declare variable HISTORICO_DATAHORA timestamp;
declare variable HISTORICO_STATUS char(1);
declare variable STATUS_ANTERIOR char(1);
declare variable DATAHORA_ANTERIOR timestamp;
declare variable TEMPO_FRACAO_DIA numeric(18,4);
begin

    REQUISICAO_ID = COALESCE(REQUISICAO_ID,0);
        --:PROGRAMACAO_ID = I_PROGRAMACAO_ID;
        /* INICIALIZA O CONTADOR DE TEMPO TOTAL */
        TEMPO_FRACAO_DIA = 0;
    
        /* INICIO DO LACO QUE CONSULTA OS HISTORICOS DA PROGRAMACAO */
        FOR
            SELECT
                R.ID,
                R.DATAHORA,
                R.STATUS
             FROM TBPROGRAMACAO_REGISTRO R
            WHERE R.PROGRAMACAO_ID = :PROGRAMACAO_ID
              AND COALESCE(R.REQUISICAO_ID,0) = :REQUISICAO_ID
              and r.justificativa_id <> 888
            ORDER BY DATAHORA
        INTO
            :HISTORICO_ID,
            :HISTORICO_DATAHORA, 
            :HISTORICO_STATUS
        DO
        BEGIN
            
            /* VERIFICA SE EH TEMPO PRODUTIVO */
            /* 0 - INICIADO/REINICIADO; 1 - PARADO; 2 - FINALIZADO */
            IF ( (STATUS_ANTERIOR = '0' AND HISTORICO_STATUS = '1') OR (STATUS_ANTERIOR = '0' AND HISTORICO_STATUS = '2') ) THEN
            BEGIN
                /* CALCULA O TEMPO PRODUTIVO E CONVERTE PARA FRACAO DE MINUTO */
                TEMPO_FRACAO_DIA      = (TEMPO_FRACAO_DIA + HISTORICO_DATAHORA - DATAHORA_ANTERIOR);
                O_TEMPO_FRACAO_MINUTO = TEMPO_FRACAO_DIA*24*60;
            END
    
            /* GUARDA A DATAHORA E O STATUS ATUAL, PARA SER UTILIZADO NO PROXIMO REGISTRO */
            DATAHORA_ANTERIOR = :HISTORICO_DATAHORA;
            STATUS_ANTERIOR   = :HISTORICO_STATUS;

        END

        SUSPEND;
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER trigger ttbprogramacao_registro_a0i for tbprogramacao_registro
inactive after insert position 5
AS
DECLARE VARIABLE FERRAMENTA_ID INTEGER;
begin

    IF ( NEW.STATUS IN ('1','2') ) THEN
    BEGIN

        SELECT
            FIRST 1
            COALESCE(P.FERRAMENTA_ID,0)
        FROM
            TBPROGRAMACAO P
        WHERE
            P.ID = NEW.PROGRAMACAO_ID
        INTO
            FERRAMENTA_ID;


        IF ( FERRAMENTA_ID = 0 ) THEN
        BEGIN                       
            UPDATE TBPROGRAMACAO P
               SET P.TEMPO_REALIZADO = (SELECT FIRST 1 O_TEMPO_FRACAO_MINUTO FROM spc_processar_tempo_real_v2(NEW.PROGRAMACAO_ID)),
               P.TEMPO_OPERACIONAL_REAL = (SELECT FIRST 1 O_TEMPO_FRACAO_MINUTO FROM spc_processar_tempo_op(NEW.PROGRAMACAO_ID))
             WHERE P.ID = NEW.PROGRAMACAO_ID;
        END

        IF ( FERRAMENTA_ID > 0 ) THEN
        BEGIN
            UPDATE TBPROGRAMACAO P
               SET P.TEMPO_REALIZADO = (SELECT FIRST 1 O_TEMPO_FRACAO_MINUTO FROM spc_programacao_tempo_realiz_v2(NEW.PROGRAMACAO_ID,COALESCE(NEW.REQUISICAO_ID,0)))
             WHERE P.ID = NEW.PROGRAMACAO_ID
               AND COALESCE(P.REQUISICAO_ID,0) = COALESCE(NEW.REQUISICAO_ID,0);
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbprogramacao_requisicao_b02u for tbprogramacao_requisicao
active before update position 2
AS
begin
  if(new.recalcular_tempos is distinct from old.recalcular_tempos and new.recalcular_tempos > 0)then
  begin

      new.tempo_parado = coalesce((select
               sum(coalesce(TEMPO_PARADO,0)) as TEMPO_PARADO
            from(
                select
                    iif((y.STATUS1 = 1) and (y.STATUS2 = 0) AND (rec = 0), (select sum(cast(PRODUTIVO as integer)) from spc_calendario_estacao(up_id,estacao_id,y.datahora1,y.datahora2)),0) as TEMPO_PARADO
                from
                (
                    SELECT
                        lead(x.status) over (order by x.datahora ascending) STATUS2,
                        lead(x.datahora) over (order by x.datahora ascending) datahora2,
                        iif((coalesce(lag(X.requisicao_id) over (order by X.datahora ascending),0) = X.requisicao_id),0,1) AS rec,
                        x.status as status1,
                        x.datahora as datahora1,
                        u.up_id,
                        u.estacao as estacao_id,
                        u.gp_id
                    FROM tbprogramacao_registro x,
                         tbprogramacao u,
                         tbjustificativa l
                    WHERE x.programacao_id = new.programacao_id
                    AND x.status in (0,1)
                    and x.requisicao_id = new.requisicao_id
                    and u.id = x.programacao_id

                    and l.id = x.justificativa_id
                    and l.tipo = '1'

                    order by x.datahora ascending
                ) y
            )z),0);

        new.tempo_estacao = coalesce((select
            
                (select sum(TEMPO_PARADO_EXTRA) from SPC_PARADA_ESTACAO(j.gp_id,j.up_id,j.estacao_id,j.ANTERIOR,j.DATAHORA) WHERE TEMPO_PARADO_EXTRA > 0) as TEMPO_EXTRA
            
            FROM
            (select first 1
                    k.gp_id,
                    k.up_id,
                    r.*,
            
                    (select first 1
                        
                            s.datahora
                        
                         from tbprogramacao_registro s, tbprogramacao q
                        
                        where s.datahora < r.datahora
                        and s.status = 2
                        and s.estacao_id = r.estacao_id
                        and q.id = s.programacao_id
                        and q.gp_id = k.gp_id
                        and q.up_id = k.up_id
                
                        order by s.id descending
                
                    ) as ANTERIOR
                
                from tbprogramacao_registro r, tbprogramacao k
                
                where r.programacao_id = new.programacao_id
                and r.requisicao_id = new.REQUISICAO_ID
                and ((r.status = '0' and r.justificativa_id = 0) or (r.status = '1' and r.justificativa_id = 888) )
                and k.id = r.programacao_id
                and k.ferramenta_id > 0

                order by r.datahora
            ) j),0);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATAR_REQUISICOES
as
declare variable PROGRAMACAO_ID integer;
declare variable ABERTOS integer;
declare variable REQUISICAO_ID integer;
begin
  FOR
    select * from (select
    
        p.id as programacao_id,
        P.requisicao_id,
        coalesce((select
            
                count(d.id)
            
            
            from vwremessa_talao_detalhe d
            where 1=1
            and d.remessa_id = r.remessa_id
            and d.remessa_talao_id = r.remessa_talao_id
            and d.data_producao is null),0) as ABERTOS
    
    from tbprogramacao p,
         vwremessa_talao r
    
    where p.status_requisicao = 1
    and p.status < 3
    and r.id = p.tabela_id)
    where ABERTOS = 0

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN
      --DESATIVADA A PEDIDO DO WELLINGTON - 08/01/2020 16:53h - PARA AVERIGUAÇÃO COM A PRODUÇÃO
      --ATIVADA A PEDIDO DO HAROLDO - 08/07/2020 09:35h
    
      update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;
    
      update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
            J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
      WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;
  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((SELECT
                    iif(quantidade = 0 and PLACAS = 0 and SOBRAS > 0,1,0)
                FROM(
                    select
                        coalesce(r.quantidade,0) as quantidade,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(h.quantidade) from tbrequisicao_placa h where h.requisicao_id = r.id),0) as PLACAS
                    from tbrequisicao r
                    where r.id = p.requisicao_id
               )
    
            ),-1) as SOBRA
        
        from tbprogramacao p,
             vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  SOBRA = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 3227 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((
                select
                    count(1)
                from(
                    select
                        r.ID ,
                        r.gp_id,
                        coalesce(r.quantidade,0) as QUANTIDADE,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(p.quantidade) from tbrequisicao_placa p where p.requisicao_id = r.id),0) as PLACAS,
                        r.datahora
                    from tbrequisicao r
                    where r.id = p.requisicao_id
                ) where QUANTIDADE = 0 and SOBRAS = 0 and  PLACAS = 0
             ),0) zeradas
        
        from tbprogramacao p,
         vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  zeradas = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 3228 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

  END

  suspend;
end
^

SET TERM ; ^

CREATE TABLE TBHISTORICO_REC_ENC (
    ID INTEGER NOT NULL,
    PROGRAMACAO_ID INTEGER,
    DATAS VARCHAR(3000),
    DATAHORA TIMESTAMP DEFAULT 'NOW');

ALTER TABLE TBHISTORICO_REC_ENC
ADD CONSTRAINT PK_TBHISTORICO_REC_ENC
PRIMARY KEY (ID);

CREATE SEQUENCE GTBHISTORICO_REC_ENC_ID;

SET TERM ^ ;

create trigger ttbhistorico_rec_enc_b01i for tbhistorico_rec_enc
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbhistorico_rec_enc_id,1);
end
^

SET TERM ; ^

ALTER TABLE TBHISTORICO_REC_ENC
    ADD TIPO INTEGER;

ALTER TABLE TBHISTORICO_REC_ENC
    ADD REQUISICAO_ID INTEGER;

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATAR_REQUISICOES
as
declare variable PROGRAMACAO_ID integer;
declare variable ABERTOS integer;
declare variable REQUISICAO_ID integer;
declare variable DATAS varchar(600);
begin
  FOR
    select * from (select
    
        p.id as programacao_id,
        P.requisicao_id,
        coalesce((select
            
                count(d.id)
            
            
            from vwremessa_talao_detalhe d
            where d.remessa_id = r.remessa_id
            and d.remessa_talao_id = r.remessa_talao_id
            and d.data_producao is null),0) as ABERTOS,

       coalesce((select
            
                list('T:'||d.id||'->'||coalesce( d.data_producao,''),', ')
            
            
            from vwremessa_talao_detalhe d
            where d.remessa_id = r.remessa_id
            and d.remessa_talao_id = r.remessa_talao_id
            ),0) as DATAS
    
    from tbprogramacao p,
         vwremessa_talao r
    
    where p.status_requisicao = 1
    and p.status < 3
    and r.id = p.tabela_id)
    where ABERTOS = 0

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS,
    :DATAS
  DO
  BEGIN
      --DESATIVADA A PEDIDO DO WELLINGTON - 08/01/2020 16:53h - PARA AVERIGUAÇÃO COM A PRODUÇÃO
      --ATIVADA A PEDIDO DO HAROLDO - 08/07/2020 09:35h
    
      update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;
    
      update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
            J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
      WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

      insert into TBHISTORICO_REC_ENC (PROGRAMACAO_ID, REQUISICAO_ID, DATAS, DATAHORA, TIPO) values (:PROGRAMACAO_ID, :REQUISICAO_ID, :DATAS, current_timestamp, 1);
  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((SELECT
                    iif(quantidade = 0 and PLACAS = 0 and SOBRAS > 0,1,0)
                FROM(
                    select
                        coalesce(r.quantidade,0) as quantidade,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(h.quantidade) from tbrequisicao_placa h where h.requisicao_id = r.id),0) as PLACAS
                    from tbrequisicao r
                    where r.id = p.requisicao_id
               )
    
            ),-1) as SOBRA
        
        from tbprogramacao p,
             vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  SOBRA = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 3227 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

     insert into TBHISTORICO_REC_ENC (PROGRAMACAO_ID, REQUISICAO_ID, DATAS, DATAHORA, TIPO) values (:PROGRAMACAO_ID, :REQUISICAO_ID, '', current_timestamp, 2);
  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((
                select
                    count(1)
                from(
                    select
                        r.ID ,
                        r.gp_id,
                        coalesce(r.quantidade,0) as QUANTIDADE,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(p.quantidade) from tbrequisicao_placa p where p.requisicao_id = r.id),0) as PLACAS,
                        r.datahora
                    from tbrequisicao r
                    where r.id = p.requisicao_id
                ) where QUANTIDADE = 0 and SOBRAS = 0 and  PLACAS = 0
             ),0) zeradas
        
        from tbprogramacao p,
         vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  zeradas = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 3228 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

     insert into TBHISTORICO_REC_ENC (PROGRAMACAO_ID, REQUISICAO_ID, DATAS, DATAHORA, TIPO) values (:PROGRAMACAO_ID, :REQUISICAO_ID, '', current_timestamp, 3);
  END

  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATAR_REQUISICOES
as
declare variable PROGRAMACAO_ID integer;
declare variable ABERTOS integer;
declare variable REQUISICAO_ID integer;
declare variable DATAS varchar(3000);
begin
  FOR
    select * from (select
    
        p.id as programacao_id,
        P.requisicao_id,
        coalesce((select
            
                count(d.id)
            
            
            from vwremessa_talao_detalhe d
            where d.remessa_id = r.remessa_id
            and d.remessa_talao_id = r.remessa_talao_id
            and d.data_producao is null),0) as ABERTOS,

       coalesce((select
            
                list('T:'||d.id||'->'||coalesce( d.data_producao,''),', ')
            
            
            from vwremessa_talao_detalhe d
            where d.remessa_id = r.remessa_id
            and d.remessa_talao_id = r.remessa_talao_id
            ),0) as DATAS
    
    from tbprogramacao p,
         vwremessa_talao r
    
    where p.status_requisicao = 1
    and p.status < 3
    and r.id = p.tabela_id)
    where ABERTOS = 0

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS,
    :DATAS
  DO
  BEGIN
      --DESATIVADA A PEDIDO DO WELLINGTON - 08/01/2020 16:53h - PARA AVERIGUAÇÃO COM A PRODUÇÃO
      --ATIVADA A PEDIDO DO HAROLDO - 08/07/2020 09:35h
    
      update tbprogramacao P SET P.status = 3, p.operador_id = 2715 WHERE P.id = :PROGRAMACAO_ID;
    
      update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
            J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
      WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

      insert into TBHISTORICO_REC_ENC (PROGRAMACAO_ID, REQUISICAO_ID, DATAS, DATAHORA, TIPO) values (:PROGRAMACAO_ID, :REQUISICAO_ID, :DATAS, current_timestamp, 1);
  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((SELECT
                    iif(quantidade = 0 and PLACAS = 0 and SOBRAS > 0,1,0)
                FROM(
                    select
                        coalesce(r.quantidade,0) as quantidade,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(h.quantidade) from tbrequisicao_placa h where h.requisicao_id = r.id),0) as PLACAS
                    from tbrequisicao r
                    where r.id = p.requisicao_id
               )
    
            ),-1) as SOBRA
        
        from tbprogramacao p,
             vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  SOBRA = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 3227 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

     insert into TBHISTORICO_REC_ENC (PROGRAMACAO_ID, REQUISICAO_ID, DATAS, DATAHORA, TIPO) values (:PROGRAMACAO_ID, :REQUISICAO_ID, '', current_timestamp, 2);
  END

  FOR
    select * from
    (
        select
            p.id as programacao_id,
            P.requisicao_id,
            coalesce((
                select
                    count(1)
                from(
                    select
                        r.ID ,
                        r.gp_id,
                        coalesce(r.quantidade,0) as QUANTIDADE,
                        coalesce((select sum(s.quantidade) from tbrequisicao_sobra s where s.requisicao_id = r.id),0) as SOBRAS,
                        coalesce((select sum(p.quantidade) from tbrequisicao_placa p where p.requisicao_id = r.id),0) as PLACAS,
                        r.datahora
                    from tbrequisicao r
                    where r.id = p.requisicao_id
                ) where QUANTIDADE = 0 and SOBRAS = 0 and  PLACAS = 0
             ),0) zeradas
        
        from tbprogramacao p,
         vwremessa_talao r
        where p.status_requisicao = 1
        and p.status < 3
        and r.id = p.tabela_id
    ) where  zeradas = 1

  INTO
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :ABERTOS
  DO
  BEGIN

     update tbprogramacao P SET P.status = 3, p.operador_id = 3228 WHERE P.id = :PROGRAMACAO_ID;
     update tbprogramacao_requisicao J SET J.tempo_previsto = 0, J.tempo_realizado = 0, J.tempo_operacional = 0,
        J.tempo_setup_ferramenta = 0, J.tempo_setup_aquecimento = 0, J.tempo_setup_cor = 0, J.tempo_setup_aprovacao = 0, j.datahora_realizado_inicio = j.datahora_realizado_fim
        WHERE J.programacao_id = :PROGRAMACAO_ID AND J.requisicao_id = :REQUISICAO_ID;

     insert into TBHISTORICO_REC_ENC (PROGRAMACAO_ID, REQUISICAO_ID, DATAS, DATAHORA, TIPO) values (:PROGRAMACAO_ID, :REQUISICAO_ID, '', current_timestamp, 3);
  END

  suspend;
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbprogramacao_requisicao_b02u for tbprogramacao_requisicao
active before update position 2
AS
begin
  if(new.recalcular_tempos is distinct from old.recalcular_tempos and new.recalcular_tempos > 0)then
  begin

      new.tempo_parado = coalesce((select
               sum(coalesce(TEMPO_PARADO,0)) as TEMPO_PARADO
            from(
                select
                    iif(((y.STATUS1 = 1 and y.STATUS2 = 0) or (y.STATUS1 = 1 and y.STATUS2 = 1) ) AND (rec = 0) and coalesce(JUSTIFICATIVA_ID,0) <> 888, (select sum(cast(PRODUTIVO as integer)) from spc_calendario_estacao(up_id,estacao_id,y.datahora1,y.datahora2)),0) as TEMPO_PARADO
                from
                (
                    SELECT
                        lead(x.status) over (order by x.datahora ascending) STATUS2,
                        lead(x.datahora) over (order by x.datahora ascending) datahora2,
                        iif((coalesce(lag(X.requisicao_id) over (order by X.datahora ascending),0) = X.requisicao_id),0,1) AS rec,
                        x.status as status1,
                        x.datahora as datahora1,
                        u.up_id,
                        u.estacao as estacao_id,
                        u.gp_id,
                        X.justificativa_id
                    FROM tbprogramacao_registro x,
                         tbprogramacao u,
                         tbjustificativa l
                    WHERE x.programacao_id = new.programacao_id
                    AND x.status in (0,1)
                    and x.requisicao_id = new.requisicao_id
                    and u.id = x.programacao_id

                    and l.id = x.justificativa_id
                    and l.tipo = '1'

                    order by x.datahora ascending
                ) y
            )z),0);

        new.tempo_estacao = coalesce((select
            
                (select sum(TEMPO_PARADO_EXTRA) from SPC_PARADA_ESTACAO(j.gp_id,j.up_id,j.estacao_id,j.ANTERIOR,j.DATAHORA) WHERE TEMPO_PARADO_EXTRA > 0) as TEMPO_EXTRA
            
            FROM
            (select first 1
                    k.gp_id,
                    k.up_id,
                    r.*,
            
                    (select first 1
                        
                            s.datahora
                        
                         from tbprogramacao_registro s, tbprogramacao q
                        
                        where s.datahora < r.datahora
                        and s.status = 2
                        and s.estacao_id = r.estacao_id
                        and q.id = s.programacao_id
                        and q.gp_id = k.gp_id
                        and q.up_id = k.up_id
                
                        order by s.id descending
                
                    ) as ANTERIOR
                
                from tbprogramacao_registro r, tbprogramacao k
                
                where r.programacao_id = new.programacao_id
                and r.requisicao_id = new.REQUISICAO_ID
                and ((r.status = '0' and r.justificativa_id = 0) or (r.status = '1' and r.justificativa_id = 888) )
                and k.id = r.programacao_id
                and k.ferramenta_id > 0

                order by r.datahora
            ) j),0);
  end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger tbrequisicao_b3i_01 for tbrequisicao
active before insert position 0
AS
DECLARE VARIABLE PROGRAMACAO_ID INTEGER;
DECLARE VARIABLE talao varchar(10);
DECLARE VARIABLE STATUS INTEGER;
DECLARE VARIABLE LINHA INTEGER;
DECLARE VARIABLE requisitado INTEGER;
DECLARE VARIABLE STATUS_TALAO INTEGER;
DECLARE VARIABLE QUANTIDADE numeric(15,4);
BEGIN

  requisitado = 0;

  FOR
     SELECT
        ID,
        STATUS,
        talao,
        ROW_NUMBER() OVER (order by ORDEM ascending, STATUS_TALAO descending, ID descending) AS LINHA,
        STATUS_TALAO
     FROM(
        /*
         select
            ORDEM,
            ID,
            STATUS,
            TALAO,
            coalesce((select first 1 1 from tbPEDIDO_item_processado g where g.remessa = p.remessa_id and g.remessa_acumulado_controle = TALAO AND G.situacao < 3),0) STATUS_TALAO
        FROM(
            SELECT
                 1 AS ORDEM,
                 P.ID,
                 P.STATUS,
                 P.remessa_id,
                 fn_lpad(coalesce((select first 1 g.controle from tbremessa_item_processado g where g.remessa = p.remessa_id and g.id = p.tabela_id),0),4,'0') talao
             FROM TBPROGRAMACAO P
             WHERE P.GP_ID    = NEW.gp_id
             AND P.REMESSA_ID = NEW.remessa
             AND P.PRODUTO_ID = NEW.produto_id
             AND P.TAMANHO    = NEW.tamanho
         ) P WHERE CAST(P.talao AS INTEGER) = coalesce(NEW.remessa_talao_id,0)
         AND P.TALAO > 0

         union all
         */

        SELECT
            ORDEM,
            ID,
            STATUS,
            TALAO,
            coalesce((select first 1 1
                from vwremessa_talao_detalhe d
                where d.remessa_id = P.remessa_id
                and d.remessa_talao_id = P.talao
                and d.data_producao is null
            ),0) STATUS_TALAO

        FROM(
            SELECT
                 2 AS ORDEM,
                 P.ID,
                 P.STATUS,
                 P.remessa_id,
                 fn_lpad(coalesce((select first 1 g.controle from tbremessa_item_processado g where g.remessa = p.remessa_id and g.id = p.tabela_id),0),4,'0') talao
             FROM TBPROGRAMACAO P
             WHERE P.GP_ID    = NEW.gp_id
             AND P.REMESSA_ID = NEW.remessa
             AND P.PRODUTO_ID = NEW.produto_id
             AND P.TAMANHO    = NEW.tamanho
         ) P
        
      ) order by ORDEM ascending,STATUS_TALAO descending, ID descending

  INTO
    :PROGRAMACAO_ID,
    :STATUS,
    :talao,
    :LINHA,
    :STATUS_TALAO
  DO
  BEGIN

    --NAO PERMITE REGISTRAR REQUISICAO SE SKU EM ABERTO NA REMESSA
    IF(:STATUS < 3)THEN
    BEGIN
        EXCEPTION "..." 'REQUISICAO NAO PERMITIDA, HA TALOES DESTE SKU EM ABERTO NA CONFORMACAO, REMESSA:'||:NEW.REMESSA||'/'||talao||' GP:'||NEW.GP_ID||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
    END

    --MARCA O PRIMEIRO GEGISTRO COMO AGUARDANDO REQUISICAO
    IF(:LINHA = 1 AND STATUS_TALAO = 1)THEN
    BEGIN

        requisitado = 1;
        QUANTIDADE  = coalesce(NEW.QUANTIDADE,0);
        QUANTIDADE  = QUANTIDADE + coalesce((select sum(j.pares) from tbrequisicao_placa j where j.requisicao_id = new.id and j.status < 3),0);

        UPDATE TBPROGRAMACAO P
           SET P.STATUS             = 1,
               P.STATUS_REQUISICAO  = 1,
               P.STATUS_SOLICITACAO = 0,
               P.REQUISICAO_ID      = NEW.ID,
               P.QUANTIDADE         = :QUANTIDADE
         WHERE P.ID = :PROGRAMACAO_ID;

    END
  END

  if(requisitado = 0)then
  begin
      --EXCEPTION "..." 'REQUISICAO NAO PERMITIDA, NAO HA TALOES DESTE SKU EM ABERTO NA PRODUCAO, REMESSA:'||:NEW.REMESSA||'/'||talao||' GP:'||NEW.GP_ID||'';
  end

END
^

SET TERM ; ^

