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 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
                 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 ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbprogramacao_b5u for tbprogramacao
active before update position 5
AS
declare variable status1 varchar(100);
declare variable status2 varchar(100);
begin

    if(OLD.STATUS IS distinct FROM NEW.status)then
    begin
    
       if(OLD.STATUS = 0)then begin status1 = '0 - PARADO'; end
       if(OLD.STATUS = 1)then begin status1 = '1 - INICIADO/PARADO'; end
       if(OLD.STATUS = 2)then begin status1 = '2 - EM ANDAMENTO'; end
       if(OLD.STATUS = 3)then begin status1 = '3 - FINALIZADO'; end
       if(OLD.STATUS = 6)then begin status1 = '6 - ENCERRADO'; end

       if(NEW.STATUS = 0)then begin status2 = '0 - PARADO'; end
       if(NEW.STATUS = 1)then begin status2 = '1 - INICIADO/PARADO'; end
       if(NEW.STATUS = 2)then begin status2 = '2 - EM ANDAMENTO'; end
       if(NEW.STATUS = 3)then begin status2 = '3 - FINALIZADO'; end
       if(NEW.STATUS = 6)then begin status2 = '6 - ENCERRADO'; end

       if(NEW.STATUS = 2)then
       begin
            new.status_solicitacao = 0;
       end

       execute procedure spi_historico('TBPROGRAMACAO', new.id, 'STATUS : '||status1||'->'||status2);
    end

    if(OLD.status_requisicao IS distinct FROM NEW.status_requisicao)then
    begin
    
       status1 = '';
       if(coalesce(NEW.status_requisicao,0) = 0)then begin status1 = 'REQUISICAO REMOVIDA'; end
       if(coalesce(NEW.status_requisicao,0) = 1)then begin status1 = 'REQUISICAO INSERIDA'; end

       new.status_solicitacao = 0;

       execute procedure spi_historico('TBPROGRAMACAO', new.id, status1);
    end


    IF ( NEW.FERRAMENTA_ID > 0 AND OLD.STATUS IS distinct FROM NEW.status AND NEW.STATUS = '3' ) THEN
    BEGIN

        new.status_solicitacao = 0;

        UPDATE OR INSERT INTO TBPROGRAMACAO_REQUISICAO (
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            STATUS,
            FERRAMENTA_ID,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_OPERACIONAL,
            TEMPO_SETUP_FERRAMENTA,
            TEMPO_SETUP_AQUECIMENTO,
            TEMPO_SETUP_COR,
            TEMPO_SETUP_APROVACAO,
            DATAHORA_INICIO,
            DATAHORA_FIM,
            DATAHORA_REALIZADO_INICIO,
            DATAHORA_REALIZADO_FIM,
            QUANTIDADE,
            tempo_parado,
            tempo_estacao
        ) VALUES (
            NEW.ID,
            NEW.REQUISICAO_ID,
            NEW.STATUS,
            NEW.FERRAMENTA_ID,
            NEW.TEMPO,
            NEW.TEMPO_REALIZADO,
            NEW.TEMPO_OPERACIONAL, 
            NEW.TEMPO_SETUP_FERRAMENTA,
            NEW.TEMPO_SETUP_AQUECIMENTO,
            NEW.TEMPO_SETUP_COR,
            NEW.TEMPO_SETUP_APROVACAO,
            NEW.DATAHORA_INICIO,
            NEW.DATAHORA_FIM,
            --tempo parado
           (SELECT FIRST 1 R.DATAHORA
              FROM TBPROGRAMACAO_REGISTRO R
             WHERE R.PROGRAMACAO_ID = NEW.ID
               AND R.REQUISICAO_ID  = NEW.REQUISICAO_ID
               AND R.STATUS         = 0
             ORDER BY R.DATAHORA),
            CURRENT_TIMESTAMP,
            NEW.QUANTIDADE,

            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((lag(X.requisicao_id) over (order by X.datahora ascending) = 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.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),

               --tempo parado estacao
               coalesce((select
                        
                            (select sum(TEMPO_PARADO_EXTRA) from SPC_PARADA_ESTACAO(new.gp_id,new.up_id,j.estacao_id,j.ANTERIOR,j.DATAHORA) WHERE TEMPO_PARADO_EXTRA > 0) as TEMPO_EXTRA
                        
                        FROM
                        (select first 1
                            
                                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 = new.gp_id
                                    and q.up_id = new.up_id
                            
                                    order by s.id descending
                            
                                ) as ANTERIOR
                            
                            from tbprogramacao_registro r
                            
                            where r.programacao_id = new.ID
                            and r.requisicao_id = new.REQUISICAO_ID
                            and r.status <= 1
                            order by r.datahora
                        ) j),0)

        ) MATCHING (
            PROGRAMACAO_ID,
            REQUISICAO_ID
        );

    END
end
^

SET TERM ; ^

CREATE INDEX ITBPROGRAMACAO_REGISTRO_15
ON TBPROGRAMACAO_REGISTRO (PROGRAMACAO_ID,REQUISICAO_ID);

CREATE INDEX ITBPROGRAMACAO_REGISTRO_16
ON TBPROGRAMACAO_REGISTRO (PROGRAMACAO_ID,REQUISICAO_ID,STATUS);

