

ALTER TABLE TBTURNO_PRODUCAO
    ADD TURNO_CORRENTE2 COMPUTED BY (iif(dia_semana = extract( WEEKDAY from current_date),COMPARE_HORA(hora_inicio,hora_fim,LOCALTIME),0)),
    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 TEMPO_CORRIDO_UP (
    HORA_INICIO time,
    HORA_FIM time,
    UP_ID integer)
returns integer
AS
declare variable flag varchar(1);
declare variable hora_inicio1 time;
declare variable hora_fim1 time;
declare variable hora_inicio2 time;
declare variable hora_fim2 time;
declare variable tempo_2 integer;
declare variable tempo_1 integer;
BEGIN
    TEMPO_1 = 0;
    TEMPO_2 = 0;

    if(HORA_INICIO < HORA_FIM)then
    begin
       hora_inicio1 = HORA_INICIO;
       hora_fim1    = HORA_FIM;

       if(current_time < HORA_INICIO or current_time > HORA_FIM)then
       begin
            TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :HORA_INICIO,
                :HORA_FIM))
            ,0);
       end else
       begin
            TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                spc_calendario_up(
                :up_id,
                :HORA_INICIO,
                current_time
               ))
            ,0);
       end

    end
    else
    begin
        hora_inicio1 = HORA_INICIO;
        hora_fim1    = cast('23:59:59.999' as time);

        hora_inicio2 = cast('00:00:00' as time);

        if((select first 1 j.data_producao2 from tbturno_producao j where j.data_producao2 is not null) <> current_date)then
        begin
            hora_fim2    = HORA_FIM;
        end else
        begin
            hora_fim2    = current_time;
        end

        if((current_time >= HORA_INICIO) or ((select first 1 j.data_producao2 from tbturno_producao j where j.data_producao2 is not null) <> current_date) )then
        begin

            if(hora_fim1 < cast('23:59:59.999' as time))then
            begin
                TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_up(
                    :up_id,
                    :hora_inicio1,
                    current_time))
                ,0);
    
            end else
            begin
                
                TEMPO_1 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_up(
                    :up_id,
                    :hora_inicio1,
                    :hora_fim1))
                ,0);
    
                TEMPO_2 = coalesce((select sum(cast(PRODUTIVO as integer)) from
                    spc_calendario_up(
                    :up_id,
                    :hora_inicio2,
                    :hora_fim2))
               ,0);
    
            end
        end


       TEMPO_1 = coalesce( TEMPO_1 ,0) + coalesce( TEMPO_2 , 0);
    end

    return  TEMPO_1;


END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PARADAS_ESTACAO_V2 (
    I_GP_ID integer,
    I_UP_ID integer,
    I_ESTACAO varchar(100),
    I_DATA_INICIO date,
    I_DATA_FIM date,
    I_FLAG integer)
returns (
    TEMPO_PARADO integer,
    MOTIVO_PARADA varchar(100),
    INICIADO varchar(20),
    PARADO varchar(20),
    ESTACAO integer,
    MARCAR integer,
    TIPO integer,
    DATA_HORA timestamp,
    OPERADOR varchar(100),
    ESTACAO_DESCRICAO varchar(100),
    DATA_INICIO timestamp,
    DATA_FIM timestamp)
as
declare variable DATA1 timestamp;
declare variable DATA2 timestamp;
declare variable ULTIMO_REGISTRO timestamp;
declare variable DATA3 timestamp;
begin

    for
        select
            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) as DATA1,
            cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 dateadd(second,-1,tt.hora_inicio) from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp) as DATA2,
            cast((select first 1 k.data_producao2 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 cast(:i_data_inicio as date))) as timestamp) as DATA3
        from rdb$database
    into
        :data1,
        :data2,
        :data3
    do begin end

    if(:I_FLAG = 1)then
    begin
        :data1 = :data3;
        :data2 = dateadd(day,1,dateadd(minute,-1,:data3));
    end

  for
    select * from split(:I_ESTACAO,',')
  into
    :ESTACAO
  do
  begin
     :ultimo_registro = (select first 1 r.datahora_realizado_fim from tbprogramacao_requisicao r, tbprogramacao c
                    
                            where r.datahora_fim <= :data1
                            and r.datahora_inicio >= dateadd(day,-3,:data1)
                            and c.id = r.programacao_id
                            and c.estacao = :ESTACAO
                            and c.gp_id   = :i_gp_id
                            and c.up_id   = :i_up_id
                            
                            order by r.datahora_fim desc);

     if(:ultimo_registro is null)then begin :ultimo_registro = :data1; end

     DATA_HORA = :ultimo_registro;

     for
    
            select
            
                jj.*
            
            from(
                select
                    TEMPO_PARADO2 as TEMPO_PARADO,
                    MOTIVO_PARADA,
                    iif(DATAHORA2 is null, null, formatdatetime(DATAHORA2)) as INICIADO,
                    formatdatetime(DATAHORA1) as PARADO,
                    ESTACAO,
                    MARCAR,
                    tipo,
                    OPERADOR,
                    ESTACAO_DESCRICAO
                
                from(
                    select
                
                        iif((y.STATUS1 > 0) and (y.STATUS2 = 0), (select sum(cast(PRODUTIVO as integer))
                        from spc_calendario_estacao(y.up,y.estacao,y.datahora1,y.datahora2)),0) as TEMPO_PARADO2,
                    
                        y.*
                    
                    from(
                        select
                        
                            j.descricao as MOTIVO_PARADA,
                            lead(p.status) over (order by p.tabela_id,p.ID ascending) STATUS2,
                            lead(p.hora_registro) over (order by p.tabela_id,p.ID ascending) datahora2,
                            p.status as status1,
                            p.hora_registro as datahora1,
                            p.subvinculo_id as up,
                            p.tabela_id  as estacao,
                            p.vinculo_id as gp_id,
                            p.*,
                            j.marcar,
                            j.tipo,
                            o.codigo||' - '||o.nome as OPERADOR,
                            e.descricao as ESTACAO_DESCRICAO
                        
                        from
                            tbregistro_parada p,
                            tbjustificativa j,
                            tboperador o,
                            tbsub_up e

                        where p.tabela = 'ESTACAO'
                            and p.vinculo_id = :I_GP_ID
                            and p.subvinculo_id = :I_UP_ID
                            and p.tabela_id = :ESTACAO

                            and e.up_id = p.subvinculo_id
                            and e.id = p.tabela_id

                            and o.codigo = p.operador_id
                
                            AND p.hora_registro BETWEEN :DATA_HORA and :DATA2
                        
                            and j.id = p.status
                        
                            order by p.tabela_id,p.ID
                
                    ) y
                ) xx where xx.STATUS1 > 0 and xx.TEMPO_PARADO > 0
            ) jj
      into
        :TEMPO_PARADO,
        :MOTIVO_PARADA,
        :INICIADO,
        :PARADO,
        :ESTACAO,
        :MARCAR,
        :TIPO,
        :OPERADOR,
        :ESTACAO_DESCRICAO
      do
      begin

         :DATA_INICIO = :DATA1;
         :DATA_FIM    = :DATA2;
    
         suspend;
    
      end

  end


end
^

SET TERM ; ^

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
            y.*,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO + iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0)) as TEMPO_EFIC,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC2,
            iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0) DIF_SETUP
        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_PREVISTO_FERRAMENTA  + TEMPO_PREVISTO_AQUECIMENTO  + TEMPO_PREVISTO_APROVACAO ) as SETUP_PREVISTO,
                (TEMPO_REALIZADO_FERRAMENTA + TEMPO_REALIZADO_AQUECIMENTO + TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
                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_producao2 from tbturno_producao k where k.turno_corrente = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y ) 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 ^ ;

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
            y.*,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO + iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0)) as TEMPO_EFIC,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC2,
            iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0) DIF_SETUP
        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_PREVISTO_FERRAMENTA  + TEMPO_PREVISTO_AQUECIMENTO  + TEMPO_PREVISTO_APROVACAO ) as SETUP_PREVISTO,
                (TEMPO_REALIZADO_FERRAMENTA + TEMPO_REALIZADO_AQUECIMENTO + TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
                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_producao2 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_producao2 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_producao2 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 ) 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 ^ ;

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
            y.*,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO + iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0)) as TEMPO_EFIC,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC2,
            iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0) DIF_SETUP
        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_PREVISTO_FERRAMENTA  + TEMPO_PREVISTO_AQUECIMENTO  + TEMPO_PREVISTO_APROVACAO ) as SETUP_PREVISTO,
                (TEMPO_REALIZADO_FERRAMENTA + TEMPO_REALIZADO_AQUECIMENTO + TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
                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_producao2 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_producao2 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_producao2 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_producao2 from tbturno_producao k where k.turno_corrente = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y ) 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 ^ ;

CREATE OR ALTER procedure SPC_PRODUCAO_PARADA (
    I_GP_ID integer,
    I_UP_ID integer,
    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),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),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),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.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_producao2 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_producao2 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_producao2 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_producao2 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 ^ ;

CREATE OR ALTER procedure SP_CONFERIR_NFE_TALAO (
    COD_BARRAS varchar(13),
    OPERADOR_ID integer,
    NOTA integer)
as
declare variable TALAO_ID integer;
declare variable TL_REMESSA integer;
declare variable TL_QTD integer;
declare variable TL_TALAO integer;
declare variable TL_SITUACAO integer;
declare variable TL_ID integer;
declare variable TL_RESTANTES integer;
declare variable DATA_PRODUCAO date;
declare variable HORA_PRODUCAO timestamp;
declare variable TL_ESTABELECIMENTO integer;
declare variable TL_LOCALIZACAO integer;
declare variable TL_PRODUTO integer;
declare variable TL_TAMANHO integer;
declare variable T01 integer;
declare variable T02 integer;
declare variable T03 integer;
declare variable T04 integer;
declare variable T05 integer;
declare variable T06 integer;
declare variable T07 integer;
declare variable T08 integer;
declare variable T09 integer;
declare variable T10 integer;
declare variable T11 integer;
declare variable T12 integer;
declare variable T13 integer;
declare variable T14 integer;
declare variable T15 integer;
declare variable T16 integer;
declare variable T17 integer;
declare variable T18 integer;
declare variable T19 integer;
declare variable T20 integer;
declare variable TMP integer;
declare variable CONTROLE integer;
declare variable CCUSTO varchar(20);
declare variable REMESSA varchar(20);
declare variable ID_ACUMULADO integer;
begin

  TALAO_ID = cast(substring(COD_BARRAS from 3 for char_length(COD_BARRAS)) as integer);

  select
        r.remessa,
        i.remessa,
        i.remessa_acumulado_controle,
        i.situacao,
        i.quantidade_pedido,
        i.controle,
        r.estabelecimento_codigo,
        coalesce((select first 1 L.localizacao_codigo FROM tbfamilia L WHERE L.codigo = R.familia_codigo),0) AS LOCALIZACAO_CODIGO,
        i.produto_codigo,
        i.tamanho
  from tbpedido_item_processado i, tbremessa r
  where i.controle = :TALAO_ID and r.numero = i.remessa
  into REMESSA, TL_REMESSA, TL_TALAO, TL_SITUACAO, TL_QTD, TL_ID,
       TL_ESTABELECIMENTO, :TL_LOCALIZACAO, TL_PRODUTO, TL_TAMANHO;

  TL_REMESSA    = coalesce(TL_REMESSA   ,0);
  TL_TALAO      = coalesce(TL_TALAO     ,0);
  TL_SITUACAO   = coalesce(TL_SITUACAO  ,0);
  TL_QTD        = coalesce(TL_QTD       ,0);
  TL_ID         = coalesce(TL_ID        ,0);

  if(TL_ID = 0)then
  begin
    exception "..." 'Talao não encontrado';
  end

  if(not (TL_SITUACAO < 2))then
  begin
    exception "..." 'Talao em producao, produzido ou encerrado.';
  end

  if(TL_QTD <= 0)then
  begin
    exception "..." 'Talao zerado.';
  end

  select t.data_producao, t.data_producao2 + current_time from tbturno_producao t where t.turno_corrente2 = 1
  into DATA_PRODUCAO, HORA_PRODUCAO;

  if(DATA_PRODUCAO is null)then
  begin
    exception "..." 'Data de produção não encontrada';
  end

  update tbpedido_item_processado i set
    i.situacao = 3,
    i.data_producao           = :DATA_PRODUCAO,
    i.hora_producao           = :HORA_PRODUCAO,
    i.data_expedicao          = :DATA_PRODUCAO,
    i.hora_expedicao          = :HORA_PRODUCAO,
    i.quantidade_producao     = i.quantidade_pedido,
    i.quantidade_saldo        = i.quantidade_pedido,
    i.quantidade_producao_tmp = i.quantidade_pedido,
    i.operador                = :OPERADOR_ID
  where i.controle = :TL_ID;

  update tbremessa_item_processado t set
        t.situacao = 3,
        t.data_producao = :DATA_PRODUCAO,
        t.hora_producao = :HORA_PRODUCAO
  where t.remessa = :TL_REMESSA and t.controle = :TL_TALAO;

  ID_ACUMULADO = coalesce((select t.id from tbremessa_item_processado t where t.remessa = :TL_REMESSA and t.controle = :TL_TALAO),0);

  if(ID_ACUMULADO = 0)then
  begin
    exception "..." 'Talão acumulado não foi encontrado.';
  end

  update tbprogramacao t set t.status = 3 where t.remessa_id = :TL_REMESSA and t.tabela_id = :ID_ACUMULADO;

  controle = gen_id(GTbEstoque_Transacao_Item,1);

  if(tl_tamanho = 1)then begin T01 = :TL_QTD; end
  if(tl_tamanho = 2)then begin T02 = :TL_QTD; end
  if(tl_tamanho = 3)then begin T03 = :TL_QTD; end
  if(tl_tamanho = 4)then begin T04 = :TL_QTD; end
  if(tl_tamanho = 5)then begin T05 = :TL_QTD; end
  if(tl_tamanho = 6)then begin T06 = :TL_QTD; end
  if(tl_tamanho = 7)then begin T07 = :TL_QTD; end
  if(tl_tamanho = 8)then begin T08 = :TL_QTD; end
  if(tl_tamanho = 9)then begin T09 = :TL_QTD; end
  if(tl_tamanho =10)then begin T10 = :TL_QTD; end
  if(tl_tamanho =11)then begin T11 = :TL_QTD; end
  if(tl_tamanho =12)then begin T12 = :TL_QTD; end
  if(tl_tamanho =13)then begin T13 = :TL_QTD; end
  if(tl_tamanho =14)then begin T14 = :TL_QTD; end
  if(tl_tamanho =15)then begin T15 = :TL_QTD; end
  if(tl_tamanho =16)then begin T16 = :TL_QTD; end
  if(tl_tamanho =17)then begin T17 = :TL_QTD; end
  if(tl_tamanho =18)then begin T18 = :TL_QTD; end
  if(tl_tamanho =19)then begin T19 = :TL_QTD; end
  if(tl_tamanho =20)then begin T20 = :TL_QTD; end

  :ccusto = coalesce((select first 1 l.ccusto from tblocalizacao l where l.codigo = :TL_LOCALIZACAO),'');

  execute procedure SPU_ESTOQUE_SALDO4(
    :TL_ESTABELECIMENTO,
    :TL_LOCALIZACAO,
    :TL_PRODUTO,
    'E',
    :DATA_PRODUCAO,
    :TL_QTD,
    :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
    :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:t20, 
    :controle,
    (select first 1 e.numero_notafiscal from tbnfe e where e.controle = :NOTA),
    null,
    null,
    fn_parametro('SISTEMA.OPERACAO_PRODUCAO'),
    :TL_ID,
    null,
    '0',
    0,
    0,
    current_date,
    0,
    :CCUSTO,
    'Entrada registrada por conferência. NF ID:'||:NOTA||' Remessa:'||:REMESSA||' Talao:'||TL_TALAO,
    '0',
    0,
    null,
    0,
    0
  );

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SP_CONFERIR_NFE_TALAO (
    COD_BARRAS varchar(13),
    OPERADOR_ID integer,
    NOTA integer)
as
declare variable TALAO_ID integer;
declare variable TL_REMESSA integer;
declare variable TL_QTD integer;
declare variable TL_TALAO integer;
declare variable TL_SITUACAO integer;
declare variable TL_ID integer;
declare variable TL_RESTANTES integer;
declare variable DATA_PRODUCAO date;
declare variable HORA_PRODUCAO timestamp;
declare variable TL_ESTABELECIMENTO integer;
declare variable TL_LOCALIZACAO integer;
declare variable TL_PRODUTO integer;
declare variable TL_TAMANHO integer;
declare variable T01 integer;
declare variable T02 integer;
declare variable T03 integer;
declare variable T04 integer;
declare variable T05 integer;
declare variable T06 integer;
declare variable T07 integer;
declare variable T08 integer;
declare variable T09 integer;
declare variable T10 integer;
declare variable T11 integer;
declare variable T12 integer;
declare variable T13 integer;
declare variable T14 integer;
declare variable T15 integer;
declare variable T16 integer;
declare variable T17 integer;
declare variable T18 integer;
declare variable T19 integer;
declare variable T20 integer;
declare variable TMP integer;
declare variable CONTROLE integer;
declare variable CCUSTO varchar(20);
declare variable REMESSA varchar(20);
declare variable ID_ACUMULADO integer;
begin

  TALAO_ID = cast(substring(COD_BARRAS from 3 for char_length(COD_BARRAS)) as integer);

  select
        r.remessa,
        i.remessa,
        i.remessa_acumulado_controle,
        i.situacao,
        i.quantidade_pedido,
        i.controle,
        r.estabelecimento_codigo,
        coalesce((select first 1 L.localizacao_codigo FROM tbfamilia L WHERE L.codigo = R.familia_codigo),0) AS LOCALIZACAO_CODIGO,
        i.produto_codigo,
        i.tamanho
  from tbpedido_item_processado i, tbremessa r
  where i.controle = :TALAO_ID and r.numero = i.remessa
  into REMESSA, TL_REMESSA, TL_TALAO, TL_SITUACAO, TL_QTD, TL_ID,
       TL_ESTABELECIMENTO, :TL_LOCALIZACAO, TL_PRODUTO, TL_TAMANHO;

  TL_REMESSA    = coalesce(TL_REMESSA   ,0);
  TL_TALAO      = coalesce(TL_TALAO     ,0);
  TL_SITUACAO   = coalesce(TL_SITUACAO  ,0);
  TL_QTD        = coalesce(TL_QTD       ,0);
  TL_ID         = coalesce(TL_ID        ,0);

  if(TL_ID = 0)then
  begin
    exception "..." 'Talao não encontrado';
  end

  if(not (TL_SITUACAO < 2))then
  begin
    exception "..." 'Talao em producao, produzido ou encerrado.';
  end

  if(TL_QTD <= 0)then
  begin
    exception "..." 'Talao zerado.';
  end

  select t.data_producao2, t.data_producao2 + current_time from tbturno_producao t where t.turno_corrente2 = 1
  into DATA_PRODUCAO, HORA_PRODUCAO;

  if(DATA_PRODUCAO is null)then
  begin
    exception "..." 'Data de produção não encontrada';
  end

  update tbpedido_item_processado i set
    i.situacao = 3,
    i.data_producao           = :DATA_PRODUCAO,
    i.hora_producao           = :HORA_PRODUCAO,
    i.data_expedicao          = :DATA_PRODUCAO,
    i.hora_expedicao          = :HORA_PRODUCAO,
    i.quantidade_producao     = i.quantidade_pedido,
    i.quantidade_saldo        = i.quantidade_pedido,
    i.quantidade_producao_tmp = i.quantidade_pedido,
    i.operador                = :OPERADOR_ID
  where i.controle = :TL_ID;

  update tbremessa_item_processado t set
        t.situacao = 3,
        t.data_producao = :DATA_PRODUCAO,
        t.hora_producao = :HORA_PRODUCAO
  where t.remessa = :TL_REMESSA and t.controle = :TL_TALAO;

  ID_ACUMULADO = coalesce((select t.id from tbremessa_item_processado t where t.remessa = :TL_REMESSA and t.controle = :TL_TALAO),0);

  if(ID_ACUMULADO = 0)then
  begin
    exception "..." 'Talão acumulado não foi encontrado.';
  end

  update tbprogramacao t set t.status = 3 where t.remessa_id = :TL_REMESSA and t.tabela_id = :ID_ACUMULADO;

  controle = gen_id(GTbEstoque_Transacao_Item,1);

  if(tl_tamanho = 1)then begin T01 = :TL_QTD; end
  if(tl_tamanho = 2)then begin T02 = :TL_QTD; end
  if(tl_tamanho = 3)then begin T03 = :TL_QTD; end
  if(tl_tamanho = 4)then begin T04 = :TL_QTD; end
  if(tl_tamanho = 5)then begin T05 = :TL_QTD; end
  if(tl_tamanho = 6)then begin T06 = :TL_QTD; end
  if(tl_tamanho = 7)then begin T07 = :TL_QTD; end
  if(tl_tamanho = 8)then begin T08 = :TL_QTD; end
  if(tl_tamanho = 9)then begin T09 = :TL_QTD; end
  if(tl_tamanho =10)then begin T10 = :TL_QTD; end
  if(tl_tamanho =11)then begin T11 = :TL_QTD; end
  if(tl_tamanho =12)then begin T12 = :TL_QTD; end
  if(tl_tamanho =13)then begin T13 = :TL_QTD; end
  if(tl_tamanho =14)then begin T14 = :TL_QTD; end
  if(tl_tamanho =15)then begin T15 = :TL_QTD; end
  if(tl_tamanho =16)then begin T16 = :TL_QTD; end
  if(tl_tamanho =17)then begin T17 = :TL_QTD; end
  if(tl_tamanho =18)then begin T18 = :TL_QTD; end
  if(tl_tamanho =19)then begin T19 = :TL_QTD; end
  if(tl_tamanho =20)then begin T20 = :TL_QTD; end

  :ccusto = coalesce((select first 1 l.ccusto from tblocalizacao l where l.codigo = :TL_LOCALIZACAO),'');

  execute procedure SPU_ESTOQUE_SALDO4(
    :TL_ESTABELECIMENTO,
    :TL_LOCALIZACAO,
    :TL_PRODUTO,
    'E',
    :DATA_PRODUCAO,
    :TL_QTD,
    :T01,:T02,:T03,:T04,:T05,:T06,:T07,:T08,:T09,:T10,
    :T11,:T12,:T13,:T14,:T15,:T16,:T17,:T18,:T19,:t20, 
    :controle,
    (select first 1 e.numero_notafiscal from tbnfe e where e.controle = :NOTA),
    null,
    null,
    fn_parametro('SISTEMA.OPERACAO_PRODUCAO'),
    :TL_ID,
    null,
    '0',
    0,
    0,
    current_date,
    0,
    :CCUSTO,
    'Entrada registrada por conferência. NF ID:'||:NOTA||' Remessa:'||:REMESSA||' Talao:'||TL_TALAO,
    '0',
    0,
    null,
    0,
    0
  );

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_PRODUCAO_PARADA (
    I_GP_ID integer,
    I_UP_ID integer,
    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),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),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),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.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_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 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_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 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 ^ ;

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
            y.*,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO + iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0)) as TEMPO_EFIC,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC2,
            iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0) DIF_SETUP
        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_PREVISTO_FERRAMENTA  + TEMPO_PREVISTO_AQUECIMENTO  + TEMPO_PREVISTO_APROVACAO ) as SETUP_PREVISTO,
                (TEMPO_REALIZADO_FERRAMENTA + TEMPO_REALIZADO_AQUECIMENTO + TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
                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_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 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_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y ) 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 ^ ;

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
            y.*,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO + iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0)) as TEMPO_EFIC,
            ((TEMPO_REALIZADO - TEMPO_REALIZADO_FERRAMENTA - TEMPO_REALIZADO_AQUECIMENTO - TEMPO_REALIZADO_APROVACAO) + TEMPO_EXTRA + TEMPO_PARADO) as TEMPO_EFIC2,
            iif(SETUP_REALIZADO > 0 and SETUP_PREVISTO > 0, (SETUP_REALIZADO - SETUP_PREVISTO),0) DIF_SETUP
        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_PREVISTO_FERRAMENTA  + TEMPO_PREVISTO_AQUECIMENTO  + TEMPO_PREVISTO_APROVACAO ) as SETUP_PREVISTO,
                (TEMPO_REALIZADO_FERRAMENTA + TEMPO_REALIZADO_AQUECIMENTO + TEMPO_REALIZADO_APROVACAO) as SETUP_REALIZADO,
                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_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 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_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (select first 1 tt.hora_inicio from tbturno_producao  tt where tt.dia_semana = extract(weekday from (select first 2 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 1))) as timestamp)
                )
        
            ) X, TBPERFIL PF
    
            where PF.tabela = 'SKU' and  PF.id = PERFIL_SKU
        ) Y ) 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 ^ ;

CREATE OR ALTER procedure SPC_PARADAS_ESTACAO_V2 (
    I_GP_ID integer,
    I_UP_ID integer,
    I_ESTACAO varchar(100),
    I_DATA_INICIO date,
    I_DATA_FIM date,
    I_FLAG integer)
returns (
    TEMPO_PARADO integer,
    MOTIVO_PARADA varchar(100),
    INICIADO varchar(20),
    PARADO varchar(20),
    ESTACAO integer,
    MARCAR integer,
    TIPO integer,
    DATA_HORA timestamp,
    OPERADOR varchar(100),
    ESTACAO_DESCRICAO varchar(100),
    DATA_INICIO timestamp,
    DATA_FIM timestamp)
as
declare variable DATA1 timestamp;
declare variable DATA2 timestamp;
declare variable ULTIMO_REGISTRO timestamp;
declare variable DATA3 timestamp;
begin

    for
        select
            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) as DATA1,
            cast(dateadd(day, 1 ,cast(:i_data_fim as date)) ||' '|| (select first 1 dateadd(second,-1,tt.hora_inicio) from tbturno_producao tt where tt.dia_semana = extract(weekday from cast(:i_data_inicio as date))) as timestamp) as DATA2,
            cast((select first 1 k.data_producao2 from tbturno_producao k where k.turno_corrente2 = 1) ||' '|| (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) as DATA3
        from rdb$database
    into
        :data1,
        :data2,
        :data3
    do begin end

    if(:I_FLAG = 1)then
    begin
        :data1 = :data3;
        :data2 = dateadd(day,1,dateadd(minute,-1,:data3));
    end

  for
    select * from split(:I_ESTACAO,',')
  into
    :ESTACAO
  do
  begin
     :ultimo_registro = (select first 1 r.datahora_realizado_fim from tbprogramacao_requisicao r, tbprogramacao c
                    
                            where r.datahora_fim <= :data1
                            and r.datahora_inicio >= dateadd(day,-3,:data1)
                            and c.id = r.programacao_id
                            and c.estacao = :ESTACAO
                            and c.gp_id   = :i_gp_id
                            and c.up_id   = :i_up_id
                            
                            order by r.datahora_fim desc);

     if(:ultimo_registro is null)then begin :ultimo_registro = :data1; end

     DATA_HORA = :ultimo_registro;

     for
    
            select
            
                jj.*
            
            from(
                select
                    TEMPO_PARADO2 as TEMPO_PARADO,
                    MOTIVO_PARADA,
                    iif(DATAHORA2 is null, null, formatdatetime(DATAHORA2)) as INICIADO,
                    formatdatetime(DATAHORA1) as PARADO,
                    ESTACAO,
                    MARCAR,
                    tipo,
                    OPERADOR,
                    ESTACAO_DESCRICAO
                
                from(
                    select
                
                        iif((y.STATUS1 > 0) and (y.STATUS2 = 0), (select sum(cast(PRODUTIVO as integer))
                        from spc_calendario_estacao(y.up,y.estacao,y.datahora1,y.datahora2)),0) as TEMPO_PARADO2,
                    
                        y.*
                    
                    from(
                        select
                        
                            j.descricao as MOTIVO_PARADA,
                            lead(p.status) over (order by p.tabela_id,p.ID ascending) STATUS2,
                            lead(p.hora_registro) over (order by p.tabela_id,p.ID ascending) datahora2,
                            p.status as status1,
                            p.hora_registro as datahora1,
                            p.subvinculo_id as up,
                            p.tabela_id  as estacao,
                            p.vinculo_id as gp_id,
                            p.*,
                            j.marcar,
                            j.tipo,
                            o.codigo||' - '||o.nome as OPERADOR,
                            e.descricao as ESTACAO_DESCRICAO
                        
                        from
                            tbregistro_parada p,
                            tbjustificativa j,
                            tboperador o,
                            tbsub_up e

                        where p.tabela = 'ESTACAO'
                            and p.vinculo_id = :I_GP_ID
                            and p.subvinculo_id = :I_UP_ID
                            and p.tabela_id = :ESTACAO

                            and e.up_id = p.subvinculo_id
                            and e.id = p.tabela_id

                            and o.codigo = p.operador_id
                
                            AND p.hora_registro BETWEEN :DATA_HORA and :DATA2
                        
                            and j.id = p.status
                        
                            order by p.tabela_id,p.ID
                
                    ) y
                ) xx where xx.STATUS1 > 0 and xx.TEMPO_PARADO > 0
            ) jj
      into
        :TEMPO_PARADO,
        :MOTIVO_PARADA,
        :INICIADO,
        :PARADO,
        :ESTACAO,
        :MARCAR,
        :TIPO,
        :OPERADOR,
        :ESTACAO_DESCRICAO
      do
      begin

         :DATA_INICIO = :DATA1;
         :DATA_FIM    = :DATA2;
    
         suspend;
    
      end

  end


end
^

SET TERM ; ^

ALTER TABLE TBTURNO_PRODUCAO
    ADD TURNO_CORRENTE COMPUTED BY (iif(dia_semana = extract( WEEKDAY from current_date),COMPARE_HORA(hora_inicio,hora_fim,LOCALTIME),0)),
    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
));