CREATE TABLE TBBLOQUEIO_PRODUCAO (
    ID INTEGER,
    GP_ID INTEGER,
    BLOQUEADA INTEGER,
    STATUS INTEGER);

COMMENT ON COLUMN TBBLOQUEIO_PRODUCAO.BLOQUEADA IS
'1-SIM
0-NAO';

COMMENT ON COLUMN TBBLOQUEIO_PRODUCAO.STATUS IS
'1-ATIVA
0-INATIVA';

CREATE SEQUENCE GTBBLOQUEIO_PRODUCAO;

create trigger Ttbbloqueio_producao_b01i for tbbloqueio_producao
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbbloqueio_producao,1);
end;

ALTER TABLE TBBLOQUEIO_PRODUCAO
    ADD UP INTEGER;

CREATE OR ALTER procedure spc_notificar_justificativa 
returns (
    email_notificar varchar(200),
    gp_descricao varchar(20),
    gp_id integer,
    taloes bigint,
    tempo bigint,
    eficiencia numeric(18,8))
as
declare variable titulo varchar(1000);
declare variable corpo varchar(3000);
begin
  for
    select distinct
        EMAIL_NOTIFICAR,
        GP_DESCRICAO,
        GP_ID,
    
        count(JUSTIFICATIVA_ID) as TALOES,
        avg(tempo) as TEMPO,
        avg(eficiencia) as EFICIENCIA
    FROM(
    
        select
    
            H.email_notificar, G.descricao AS gp_DESCRICAO, u.descricao as up_descricao,
            p.gp_id, p.up_id, p.estacao, p.eficiencia, datediff(hour, p.datahora_finalizado, current_timestamp) AS tempo,
            coalesce((select s.id from tbregistro_parada s where s.subvinculo_id = p.tabela_id and s.status = 119),0) AS JUSTIFICATIVA_ID
    
        from tbprogramacao p, tbbloqueio_producao H, tbgp G, tbup U
        where p.datahora_finalizado >= fn_parametro(563)
        AND (P.eficiencia < 70 OR P.eficiencia > 130)
        AND H.gp_id = P.gp_id
        AND H.up = P.up_id
        AND H.status = 1
        AND G.id = H.gp_id
        AND U.id = H.up
        and p.status = 3
        and p.eficiencia > 0
    
    ) X WHERE JUSTIFICATIVA_ID = 0
    group by 1,2,3
    order by  email_notificar, gp_DESCRICAO

  into
    EMAIL_NOTIFICAR,
    GP_DESCRICAO,
    GP_ID,
    TALOES,
    TEMPO,
    EFICIENCIA
  do begin

    TITULO =  :GP_ID||'-'||GP_DESCRICAO||', HÁ '||:TALOES||' TALÕES PENDENTES DE JUSTIFICATIVA';

    CORPO  = :TITULO||'<br><a class="msg-balao-fechar" href="'||fn_parametro(552)||'/_22020" target="_blank" >Visualizar no GC-Web</a> ';

    INSERT INTO TBEMAIL (EMAIL, USUARIO_ID, ASSUNTO, STATUS, DATAHORA,CORPO)
            VALUES (:EMAIL_NOTIFICAR, 0, :TITULO, 0, current_timestamp,:CORPO);

     suspend;
  end

end;

CREATE OR ALTER trigger ttbprogramacao_b10u for tbprogramacao
active before update position 50
AS
declare variable eficiencia numeric(18,4);
begin
  if(new.tempo_realizado <> old.tempo_realizado)then
  begin

    eficiencia = coalesce((select first 1
        
            (
              (
                CAST(
                    (NULLIF(CAST(SUBSTRING(X.QUANTIDADES FROM 45 FOR 11) AS NUMERIC(15,4)), 0))
                    /
                    NULLIF(X.TEMPO_REALIZADO, 0)
                AS DOUBLE PRECISION)
                /
                CAST(
                    IIF(CAST(SUBSTRING(X.QUANTIDADES FROM 23 FOR 11) AS NUMERIC(15,4)) > 0,
                        NULLIF(CAST(SUBSTRING(X.QUANTIDADES FROM 23 FOR 11) AS NUMERIC(15,4)), 0),
                        NULLIF(CAST(SUBSTRING(X.QUANTIDADES FROM  1 FOR 11) AS NUMERIC(15,4)), 0))
                        /
                        NULLIF(X.TEMPO, 0)
                AS DOUBLE PRECISION)                    
              )
              *
              100
            ) EFICIENCIA
        
        from(
            select
            
                (SELECT
                   (LPAD(SUM(D.QUANTIDADE),11,' '        ) ||
                    LPAD(SUM(D.QUANTIDADE_PRODUCAO       ),11,' ') ||
                    LPAD(SUM(D.QUANTIDADE_ALTERN         ),11,' ') ||
                    LPAD(SUM(D.QUANTIDADE_ALTERN_PRODUCAO),11,' ') ||
                    LPAD(SUM(IIF(D.QUANTIDADE_ALTERN_PRODUCAO > 0, D.QUANTIDADE_ALTERN_PRODUCAO, D.QUANTIDADE_PRODUCAO))
                            - SUM(
                                 COALESCE(
                                    (SELECT FIRST 1 IIF(SUM(V.QUANTIDADE_ALTERNATIVA) > 0, SUM(V.QUANTIDADE_ALTERNATIVA), SUM(V.QUANTIDADE)) APROVEITAMENTO_ALOCADO
                                        FROM TBREMESSA_TALAO_VINCULO V
                                        WHERE
                                            V.STATUS <> '1' 
                                        AND V.TIPO = 'R'
                                        AND V.REMESSA_TALAO_DETALHE_ID = D.ID)
                                 ,0)
                            )
                    ,11,' '))
                FROM  VWREMESSA_TALAO_DETALHE D
                WHERE D.REMESSA_ID       = T.REMESSA_ID
                  AND D.REMESSA_TALAO_ID = T.REMESSA_TALAO_ID) QUANTIDADES,
            
                new.tempo_realizado,
                new.tempo
            
            from VWREMESSA_TALAO T
            where t.status     = 2
            AND new.TABELA_ID  = T.ID
            AND new.GP_ID      = T.GP_ID
            AND new.UP_ID      = T.UP_ID
            AND (new.ESTACAO   = T.ESTACAO OR T.ESTACAO = 0)

        ) x),0);

    new.eficiencia = eficiencia;
  end
end;

CREATE OR ALTER trigger ttbprogramacao_b11u for tbprogramacao
inactive before update position 51
AS
declare variable bloqeuar integer;
begin
  IF ( OLD.STATUS = '2' AND NEW.STATUS = '3' ) THEN
  BEGIN

     bloqeuar = coalesce((
            select
                SUM(1) AS taloes
            FROM(
                select
                    p.gp_id, p.up_id, p.estacao, p.eficiencia, datediff(hour, p.datahora_finalizado, current_timestamp) AS tempo,
                    coalesce((select s.id from tbregistro_parada s where s.subvinculo_id = p.tabela_id and s.status = 119),0) AS JUSTIFICATIVA_ID
                from tbprogramacao p, tbbloqueio_producao G
                where p.datahora_finalizado >= fn_parametro(563)
                AND (P.eficiencia < 70 OR P.eficiencia > 130)
                AND P.gp_id  = NEW.gp_id
                AND P.up_id  = NEW.up_id
                AND G.gp_id  = P.gp_id
                AND G.up     = P.up_id
                AND G.status = 1
                and p.status = 3
                and p.eficiencia > 0

            ) X
            WHERE X.tempo >= fn_parametro(564)
            AND JUSTIFICATIVA_ID = 0
     ),0);

     IF(bloqeuar > 0)THEN
     BEGIN
       exception "..." 'GP: '||NEW.gp_id||', UP:'||NEW.up_id||' BLOQUEADA PARA PRODUÇÃO, HÁ '||bloqeuar||' TALÕES PENDENTES DE JUSTIFICATIVA A MAIS DE '||fn_parametro(564)||' HORAS.';
     END

  END
end;




