SET TERM ^ ;

CREATE OR ALTER procedure SPC_PRODUCAO_CONFORMACAO_V2 (
    I_GP_ID integer,
    I_UP_ID integer,
    I_ESTACAO varchar(500),
    I_DATA_INICIO date,
    I_DATA_FIM date,
    I_FLAG integer)
returns (
    PERDAS_PERC numeric(15,2),
    EFICIENCIA numeric(15,2),
    SETUP_PREVISTO numeric(15,2),
    SETUP_REALIZADO numeric(15,2),
    COR_EFIC integer,
    JUSTIFICATIVA varchar(1000),
    PROGRAMACAO_ID integer,
    REQUISICAO_ID integer,
    GP_ID integer,
    GP_DESCRICAO varchar(500),
    UP_ID integer,
    UP_DESCRICAO varchar(500),
    ESTACAO integer,
    ESTACAO_DESCRICAO varchar(500),
    REMESSA integer,
    REMESSA_ID integer,
    REMESSA_DATA date,
    REMESSA_TALAO_ID integer,
    TALAO_ID integer,
    PRODUTO_ID integer,
    PRODUTO_DESCRICAO varchar(500),
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(500),
    COR_ID integer,
    COR_DESCRICAO varchar(500),
    TAMANHO integer,
    TAMANHO_DESCRICAO varchar(500),
    QUANTIDADE numeric(15,2),
    UM varchar(500),
    FERRAMENTA_ID integer,
    FERRAMENTA_DESCICAO varchar(500),
    DATAHORA_REALIZADO_INICIO varchar(20),
    DATAHORA_REALIZADO_FIM varchar(20),
    TEMPO_PREVISTO numeric(15,2),
    TEMPO_REALIZADO numeric(15,2),
    TEMPO_PREVISTO_OPERACIONAL numeric(15,2),
    TEMPO_PREVISTO_FERRAMENTA numeric(15,2),
    TEMPO_PREVISTO_AQUECIMENTO numeric(15,2),
    TEMPO_PREVISTO_APROVACAO numeric(15,2),
    TEMPO_REALIZADO_OPERACIONAL numeric(15,2),
    TEMPO_REALIZADO_FERRAMENTA numeric(15,2),
    TEMPO_REALIZADO_AQUECIMENTO numeric(15,2),
    TEMPO_REALIZADO_APROVACAO numeric(15,2),
    PERFIL_SKU varchar(10),
    TEMPO_PARADO numeric(15,2),
    PERDAS numeric(15,2),
    PERFIL_SKU_DESCRICAO varchar(500),
    PERDAS_PERC1 numeric(15,2),
    EFICIENCIA_MINIMA numeric(15,2),
    EFICIENCIA_A numeric(15,2),
    EFICIENCIA_B numeric(15,2),
    PERDAS_A numeric(15,2),
    PERDAS_B numeric(15,2),
    TEMPO_EXTRA numeric(15,2),
    TEMPO_EFIC numeric(15,2),
    TURNO integer,
    EFIC numeric(15,2))
as
begin

  for
    SELECT
    
            iif(PERDAS_PERC > 100,100,PERDAS_PERC) as PERDAS_PERC,
    
            iif(z.efic > 100,100,z.efic) as eficiencia,
            (TEMPO_PREVISTO_FERRAMENTA+
            TEMPO_PREVISTO_AQUECIMENTO+
            TEMPO_PREVISTO_APROVACAO) as SETUP_PREVISTO,
    
            (TEMPO_REALIZADO_FERRAMENTA+
            TEMPO_REALIZADO_AQUECIMENTO+
            TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
    
            iif(z.efic < EFICIENCIA_A,1,
            iif(z.efic >= EFICIENCIA_A and z.efic <= EFICIENCIA_B,2,
            iif(z.efic > EFICIENCIA_B,3,0))) as cor_efic,
    
            coalesce((SELECT
                        list(j.descricao||': '||coalesce(p.observacao,''),',<br>') from
                    TBREGISTRO_PARADA P,
                    tbjustificativa J
                    where p.tabela = 'INEFICIENCIA'
                    and p.tabela_id = z.PROGRAMACAO_ID
                    and j.id = p.status)
    
            ,'') as JUSTIFICATIVA,
    
            z.*
    
        from(
        SELECT
            PROGRAMACAO_ID,
            REQUISICAO_ID,
            GP_ID,
            GP_DESCRICAO,
            UP_ID,
            UP_DESCRICAO,
            ESTACAO,
            ESTACAO_DESCRICAO,
            REMESSA,
            REMESSA_ID,
            REMESSA_DATA,
            REMESSA_TALAO_ID,
            TALAO_ID,
            PRODUTO_ID,
            PRODUTO_DESCRICAO,
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAMANHO,
            TAMANHO_DESCRICAO,
            QUANTIDADE,
            UM,
            FERRAMENTA_ID,
            FERRAMENTA_DESCICAO,
            formatdatetime(DATAHORA_REALIZADO_INICIO) as DATAHORA_REALIZADO_INICIO,
            formatdatetime(DATAHORA_REALIZADO_FIM) as DATAHORA_REALIZADO_FIM,
            TEMPO_PREVISTO,
            TEMPO_REALIZADO,
            TEMPO_PREVISTO_OPERACIONAL,
            TEMPO_PREVISTO_FERRAMENTA,
            TEMPO_PREVISTO_AQUECIMENTO,
            TEMPO_PREVISTO_APROVACAO,
            IIF( TEMPO_REALIZADO_OPERACIONAL < 0, 0, TEMPO_REALIZADO_OPERACIONAL) TEMPO_REALIZADO_OPERACIONAL,
            TEMPO_REALIZADO_FERRAMENTA,
            TEMPO_REALIZADO_AQUECIMENTO,
            TEMPO_REALIZADO_APROVACAO,
            PERFIL_SKU,
            TEMPO_PARADO,
            TEMPO_EXTRA,
            PERDAS,
            PERFIL_SKU_DESCRICAO,
            cast(((PERDAS / iif(QUANTIDADE > 0,QUANTIDADE,1)) * 100) as numeric(15,2)) PERDAS_PERC,
            EFICIENCIA_MINIMA,
            EFICIENCIA_A,
            EFICIENCIA_B,
            PERDAS_A,
            PERDAS_B,
            iif(TEMPO_EFIC > 0, TEMPO_EFIC,0) as TEMPO_EFIC,

            (select first 1 b.codigo from tbturno_producao b where (COMPARE_HORA(b.hora_inicio,b.hora_fim,gethora(DATAHORA_REALIZADO_FIM))) = 1 and b.dia_semana = iif(gethora(DATAHORA_REALIZADO_FIM) < '07:00:00', (extract(weekday from DATAHORA_REALIZADO_FIM)-1),extract(weekday from DATAHORA_REALIZADO_FIM))) as turno,
            (TEMPO_PREVISTO_OPERACIONAL / iif(TEMPO_EFIC>0,TEMPO_EFIC,1) * 100) as efic
        
        FROM (
            SELECT
                ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC,
                PROGRAMACAO_ID,
                REQUISICAO_ID,
                GP_ID,
                GP_DESCRICAO,
                UP_ID,
                UP_DESCRICAO,
                ESTACAO,
                ESTACAO_DESCRICAO,
                REMESSA,
                REMESSA_ID,
                REMESSA_DATA,
                REMESSA_TALAO_ID,
                TALAO_ID,
                PRODUTO_ID,
                PRODUTO_DESCRICAO,
                MODELO_ID,
                MODELO_DESCRICAO,
                COR_ID,
                COR_DESCRICAO,
                TAMANHO,
                TAMANHO_DESCRICAO,
                QUANTIDADE,
                UM,
                FERRAMENTA_ID,
                FERRAMENTA_DESCICAO,
                DATAHORA_REALIZADO_INICIO,
                DATAHORA_REALIZADO_FIM,
                TEMPO_PREVISTO,
                TEMPO_REALIZADO,
                TEMPO_PREVISTO_OPERACIONAL,
                TEMPO_PREVISTO_FERRAMENTA,
                TEMPO_PREVISTO_AQUECIMENTO,
                TEMPO_PREVISTO_APROVACAO,
                (TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) TEMPO_REALIZADO_OPERACIONAL,
                TEMPO_REALIZADO_FERRAMENTA,
                TEMPO_REALIZADO_AQUECIMENTO,
                TEMPO_REALIZADO_APROVACAO,
                TEMPO_PARADO,
                PERFIL_SKU,
                PERDAS,
                PF.descricao as PERFIL_SKU_DESCRICAO,
                PF.efic_minima as EFICIENCIA_MINIMA,
                PF.efic_a as EFICIENCIA_A,
                PF.efic_b as EFICIENCIA_B,
                PF.perda_a as PERDAS_A,
                PF.perda_b as PERDAS_B,
                TEMPO_EXTRA
            
            FROM (
                SELECT
                    P.ID                                            AS PROGRAMACAO_ID,   
                    A.REQUISICAO_ID                                 AS REQUISICAO_ID,
                    G.ID                                            AS GP_ID,
                    G.DESCRICAO                                     AS GP_DESCRICAO,
                    U.ID                                            AS UP_ID,
                    U.DESCRICAO                                     AS UP_DESCRICAO,
                    P.ESTACAO                                       AS ESTACAO,
                    SU.DESCRICAO                                    AS ESTACAO_DESCRICAO,
                    R.REMESSA                                       AS REMESSA,
                    T.REMESSA_ID                                    AS REMESSA_ID,
                    R.DATA                                          AS REMESSA_DATA,
                    T.REMESSA_TALAO_ID                              AS REMESSA_TALAO_ID,
                    T.ID                                            AS TALAO_ID,
                    PR.CODIGO                                       AS PRODUTO_ID,
                    PR.DESCRICAO                                    AS PRODUTO_DESCRICAO,
                    M.CODIGO                                        AS MODELO_ID,
                    M.DESCRICAO                                     AS MODELO_DESCRICAO,
                    C.CODIGO                                        AS COR_ID,
                    C.DESCRICAO                                     AS COR_DESCRICAO,
                    P.TAMANHO                                       AS TAMANHO,
                    TAMANHO_GRADE(GR.CODIGO,P.TAMANHO)              AS TAMANHO_DESCRICAO,
                    A.QUANTIDADE                                    AS QUANTIDADE,
                    PR.UNIDADEMEDIDA_SIGLA                          AS UM,
                    A.datahora_realizado_inicio                     AS DATAHORA_REALIZADO_INICIO,
                    A.DATAHORA_REALIZADO_FIM                        AS DATAHORA_REALIZADO_FIM,
                    P.TEMPO                                         AS TEMPO_PREVISTO,
                    A.TEMPO_REALIZADO                               AS TEMPO_REALIZADO,
                    A.TEMPO_OPERACIONAL                             AS TEMPO_PREVISTO_OPERACIONAL,
                    A.TEMPO_SETUP_FERRAMENTA                        AS TEMPO_PREVISTO_FERRAMENTA,
                    (A.TEMPO_SETUP_AQUECIMENTO + A.TEMPO_SETUP_COR) AS TEMPO_PREVISTO_AQUECIMENTO,
                    A.TEMPO_SETUP_APROVACAO                         AS TEMPO_PREVISTO_APROVACAO,
                    coalesce(a.tempo_parado,0)                      AS TEMPO_PARADO,
                    coalesce(a.tempo_estacao,0)                     AS TEMPO_EXTRA,

                
                    CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                     FROM TBREGISTRO_SETUP S
                                    WHERE S.TALAO_ID = P.TABELA_ID
                                      AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                      AND S.SETUP_ID = 1
                                      and S.DATAHORA_FIM > S.DATAHORA_INICIO),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_FERRAMENTA,
                
                
                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 2
                                     and S.DATAHORA_FIM > S.DATAHORA_INICIO),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_AQUECIMENTO,
                

                   CAST(COALESCE((SELECT FIRST 1 DATEDIFF(MINUTE, S.DATAHORA_INICIO, S.DATAHORA_FIM)
                                    FROM TBREGISTRO_SETUP S
                                   WHERE S.TALAO_ID = P.TABELA_ID
                                     AND S.REQUISICAO_ID = A.REQUISICAO_ID
                                     AND S.SETUP_ID = 3
                                     and S.DATAHORA_FIM > S.DATAHORA_INICIO),0) AS NUMERIC(15,4)) AS TEMPO_REALIZADO_APROVACAO,
            
                  (SELECT FIRST 1 SK.PERFIL
                     FROM VWSKU SK
                    WHERE SK.MODELO_ID = M.CODIGO
                     AND SK.COR_ID    = C.CODIGO
                     AND SK.TAMANHO   = T.TAMANHO) PERFIL_SKU,
        
                    A.FERRAMENTA_ID,
        
                    (SELECT FIRST 1 LPAD(F.SERIE,4,'0') || ' - ' || DESCRICAO FROM TBFERRAMENTARIA F WHERE F.ID = A.FERRAMENTA_ID) FERRAMENTA_DESCICAO,
    
                    coalesce((SELECT
                        SUM(D.quantidade) AS quantidade
                    FROM
                        TbDefeito_Transacao_Item D,
                        tbsac_defeito j
                    WHERE d.remessa           = r.remessa_id
                        AND d.remessa_controle  = t.remessa_talao_id
                        and d.defeito_id        = j.codigo
                        and j.conformacao       = '1'
                    ),0) as PERDAS
                
                FROM
                    TBPROGRAMACAO_REQUISICAO A,
                    TBPROGRAMACAO P,
                    VWREMESSA_TALAO T,
                    VWREMESSA R,
                    TBGP G,
                    TBUP U,
                    TBSUB_UP SU,
                    TBPRODUTO PR,
                    TBMODELO M,
                    TBCOR C,
                    TBGRADE GR
                
                WHERE p.gp_id    = :I_GP_ID
                and p.up_id    = :I_UP_ID
                AND P.ESTACAO  in(select * from split(:I_estacao,','))
        
                AND P.ID            = A.PROGRAMACAO_ID
                AND P.FERRAMENTA_ID > 0
                AND A.STATUS        = 3
                AND P.TIPO          = 'A'
                AND P.TABELA_ID     = T.ID
                AND R.REMESSA_ID    = T.REMESSA_ID
                AND G.ID            = P.GP_ID
                AND U.ID            = P.UP_ID
                AND SU.UP_ID        = P.UP_ID
                AND SU.ID           = P.ESTACAO
                AND PR.CODIGO       = P.PRODUTO_ID
                AND M.CODIGO        = PR.MODELO_CODIGO
                AND C.CODIGO        = PR.COR_CODIGO
                AND GR.CODIGO       = PR.GRADE_CODIGO
                AND A.DATAHORA_REALIZADO_FIM >= iif(:I_FLAG = 1, cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),
                                                                 cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp))
                and iif(:i_flag = 1,
                    A.DATAHORA_REALIZADO_FIM BETWEEN

                    cast(cast(:i_data_inicio as date) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp)
                    and
                    cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 tt.hora_inicio - 0.0000001 from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp),


                    A.DATAHORA_REALIZADO_FIM >= cast((select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao from tbturno_producao k where k.turno_corrente = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y
    )Z
    order by z.estacao,z.datahora_realizado_fim

  into
    :PERDAS_PERC,
    :EFICIENCIA,
    :SETUP_PREVISTO,
    :SETUP_REALIZADO,
    :COR_EFIC,
    :JUSTIFICATIVA,
    :PROGRAMACAO_ID,
    :REQUISICAO_ID,
    :GP_ID,
    :GP_DESCRICAO,
    :UP_ID,
    :UP_DESCRICAO,
    :ESTACAO,
    :ESTACAO_DESCRICAO,
    :REMESSA,
    :REMESSA_ID,
    :REMESSA_DATA,
    :REMESSA_TALAO_ID,
    :TALAO_ID,
    :PRODUTO_ID,
    :PRODUTO_DESCRICAO,
    :MODELO_ID,
    :MODELO_DESCRICAO,
    :COR_ID,
    :COR_DESCRICAO,
    :TAMANHO,
    :TAMANHO_DESCRICAO,
    :QUANTIDADE,
    :UM,
    :FERRAMENTA_ID,
    :FERRAMENTA_DESCICAO,
    :DATAHORA_REALIZADO_INICIO,
    :DATAHORA_REALIZADO_FIM,
    :TEMPO_PREVISTO,
    :TEMPO_REALIZADO,
    :TEMPO_PREVISTO_OPERACIONAL,
    :TEMPO_PREVISTO_FERRAMENTA,
    :TEMPO_PREVISTO_AQUECIMENTO,
    :TEMPO_PREVISTO_APROVACAO,
    :TEMPO_REALIZADO_OPERACIONAL,
    :TEMPO_REALIZADO_FERRAMENTA,
    :TEMPO_REALIZADO_AQUECIMENTO,
    :TEMPO_REALIZADO_APROVACAO,
    :PERFIL_SKU,
    :TEMPO_PARADO,
    :TEMPO_EXTRA,
    :PERDAS,
    :PERFIL_SKU_DESCRICAO,
    :PERDAS_PERC1,
    :EFICIENCIA_MINIMA,
    :EFICIENCIA_A,
    :EFICIENCIA_B,
    :PERDAS_A,
    :PERDAS_B,
    :TEMPO_EFIC,
    :TURNO,
    :EFIC
  do
  begin
    suspend;
  end

end
^

SET TERM ; ^

SET TERM ^ ;

SET TERM ^ ;

CREATE OR ALTER trigger ttbregistro_setup_b02u for tbregistro_setup
active before update position 0
AS
begin
  if(old.datahora_fim is distinct from new.datahora_fim and new.datahora_inicio IS not null)then
  begin
    if(new.datahora_fim < new.datahora_inicio)then
    begin
        exception "..." 'DATA FIM DO SETUP NAO PODE SER MENOR QUE A DATA DE INICIO. ('||formatdatetime(new.datahora_fim)||' -> '||formatdatetime(new.datahora_inicio)||')';
    end
  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 = 0
                        ) j),0)

        ) MATCHING (
            PROGRAMACAO_ID,
            REQUISICAO_ID
        );

    END
end
^

SET TERM ; ^

