alter table interfaceexamerequisicao add ier_resultadoalterado smallint default 0;

insert into atualizacoes(atu_nome) values ('v18060001_260618.sql');

CREATE OR REPLACE FUNCTION situacaorequisicaoweb(integer, bigint)
  RETURNS integer AS
$BODY$
declare 
  total integer;
  prontos integer;
  filCodigo alias for $1;
  reqCodigo alias for $2;
  retorno integer;
begin
  select count(exa_codigo) into total from examerequisicao where fil_codigo = filCodigo and req_codigo = reqCodigo and exr_excluido = false;
  --raise notice 'Total %', total;
  select count(exa_codigo) into prontos from examerequisicao where fil_codigo = filCodigo and req_codigo = reqCodigo and exr_situacao in ('C', 'I', 'E', 'A') and exr_excluido = false;
  --raise notice 'Prontos %', prontos;
    
  retorno := 0; --considera como incompleta  
  if (FOUND) then
    if total = prontos then
      retorno := 2; --todos prontos
    elsif total > prontos and prontos > 0 then
      retorno := 1;  --parcial
    end if;
  end if;
  
  return retorno;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

insert into atualizacoes(atu_nome) values ('v18060002_280618.sql');


alter table parametros add par_agrupadataentregas boolean default false;

drop table loginterface cascade;

create table loginterface (
       lin_codigo           serial not null,
       fil_codigo           integer,
       int_codigo           integer,
       lin_datahora         timestamp default current_timestamp,
       lin_operacao         text
);

create unique index xpkloginterface on loginterface
(
       lin_codigo
);

create index xif1loginterface on loginterface
(
       fil_codigo,
       int_codigo
);


alter table loginterface
       add primary key (lin_codigo);




drop function fn_td_interface() cascade;

create function fn_td_interface() returns opaque as '
declare
	numrows integer;										 
begin
    delete from loginterface
      where
        loginterface.fil_codigo = old.fil_codigo and
        loginterface.int_codigo = old.int_codigo;

    delete from interfacematerial
      where
        interfacematerial.fil_codigo = old.fil_codigo and
        interfacematerial.int_codigo = old.int_codigo;

    select count(*) into numrows
      from interfaceexamerequisicao
      where
        interfaceexamerequisicao.fil_codigo = old.fil_codigo and
        interfaceexamerequisicao.int_codigo = old.int_codigo;
    if (numrows > 0) then
      raise exception ''o registro nao pode ser excluido, por estar sendo utilizado na tabela interfaceexamerequisicao.'';
    end if;

    select count(*) into numrows
      from interfacerack
      where
        interfacerack.fil_codigo = old.fil_codigo and
        interfacerack.int_codigo = old.int_codigo;
    if (numrows > 0) then
      raise exception ''o registro nao pode ser excluido, por estar sendo utilizado na tabela interfacerack.'';
    end if;

    select count(*) into numrows
      from examematinterface
      where
        examematinterface.fil_codigo = old.fil_codigo and
        examematinterface.int_codigo = old.int_codigo;
    if (numrows > 0) then
      raise exception ''o registro nao pode ser excluido, por estar sendo utilizado na tabela examematinterface.'';
    end if;


return old;
end;'
language 'plpgsql';
					
create trigger td_interface
after delete on interface
for each row execute procedure fn_td_interface();


drop function fn_ti_interface() cascade;

create function fn_ti_interface() returns opaque as '
declare
	numrows integer;
	tmp varchar;									 
begin
    select count(*) into numrows
      from setores
      where
        new.fil_codigo = setores.fil_codigo and
        new.set_codigo = setores.set_codigo;
    tmp:=''setores|'';
    
      tmp:=tmp || ''fil_codigo='' || new.fil_codigo || ''|'';
    
      tmp:=tmp || ''set_codigo='' || new.set_codigo || ''|'';
    
    tmp:=substring(tmp,1,length(tmp)-1);

    if (
      new.fil_codigo is not null and
      new.set_codigo is not null and
      numrows = 0
    ) then
      raise exception ''o registro nao pode ser inserido, pois um valor informado nao existe na tabela setores. chave para consulta:[%]'',tmp using errcode=upper(''ifkne'');
    end if;

    select count(*) into numrows
      from filiais_postocoleta
      where
        new.fil_codigo = filiais_postocoleta.fil_codigo;
    tmp:=''filiais_postocoleta|'';
    
      tmp:=tmp || ''fil_codigo='' || new.fil_codigo || ''|'';
    
    tmp:=substring(tmp,1,length(tmp)-1);

    if (
      
      numrows = 0
    ) then
      raise exception ''o registro nao pode ser inserido, pois um valor informado nao existe na tabela filiais_postocoleta. chave para consulta:[%]'',tmp using errcode=upper(''ifkne'');
    end if;


return new;
end;'
language 'plpgsql';
					
create trigger ti_interface
after insert on interface
for each row execute procedure fn_ti_interface();


drop function fn_tu_interface() cascade;

create function fn_tu_interface() returns opaque as '
declare
	numrows integer;
        tmp varchar;										 
begin
  if
    (old.fil_codigo <> new.fil_codigo or 
     old.int_codigo <> new.int_codigo) then
    select count(*)
      from loginterface
      where
        loginterface.fil_codigo = old.fil_codigo and
        loginterface.int_codigo = old.int_codigo into numrows;
    if (numrows > 0) then
     raise exception ''o registro nao pode ser alterado, pois um valor esta sendo utilizado na tabela loginterface.'';
    end if;
  end if;
  if
    (old.fil_codigo <> new.fil_codigo or 
     old.int_codigo <> new.int_codigo) then
    select count(*)
      from interfacematerial
      where
        interfacematerial.fil_codigo = old.fil_codigo and
        interfacematerial.int_codigo = old.int_codigo into numrows;
    if (numrows > 0) then
     raise exception ''o registro nao pode ser alterado, pois um valor esta sendo utilizado na tabela interfacematerial.'';
    end if;
  end if;
  if
    (old.fil_codigo <> new.fil_codigo or 
     old.int_codigo <> new.int_codigo) then
    select count(*)
      from interfaceexamerequisicao
      where
        interfaceexamerequisicao.fil_codigo = old.fil_codigo and
        interfaceexamerequisicao.int_codigo = old.int_codigo into numrows;
    if (numrows > 0) then
     raise exception ''o registro nao pode ser alterado, pois um valor esta sendo utilizado na tabela interfaceexamerequisicao.'';
    end if;
  end if;
  if
    (old.fil_codigo <> new.fil_codigo or 
     old.int_codigo <> new.int_codigo) then
    select count(*)
      from interfacerack
      where
        interfacerack.fil_codigo = old.fil_codigo and
        interfacerack.int_codigo = old.int_codigo into numrows;
    if (numrows > 0) then
     raise exception ''o registro nao pode ser alterado, pois um valor esta sendo utilizado na tabela interfacerack.'';
    end if;
  end if;
  if
    (old.fil_codigo <> new.fil_codigo or 
     old.int_codigo <> new.int_codigo) then
    select count(*)
      from examematinterface
      where
        examematinterface.fil_codigo = old.fil_codigo and
        examematinterface.int_codigo = old.int_codigo into numrows;
    if (numrows > 0) then
     raise exception ''o registro nao pode ser alterado, pois um valor esta sendo utilizado na tabela examematinterface.'';
    end if;
  end if;
  select count(*) into numrows
    from setores
    where
      new.fil_codigo = setores.fil_codigo and
      new.set_codigo = setores.set_codigo;
    tmp:=''setores|'';
    
      tmp:=tmp || ''fil_codigo='' || new.fil_codigo || ''|'';
    
      tmp:=tmp || ''set_codigo='' || new.set_codigo || ''|'';
    
    tmp:=substring(tmp,1,length(tmp)-1);
  if (
    new.fil_codigo is not null and
    new.set_codigo is not null and
    numrows = 0
  ) then
    raise exception ''o registro nao pode ser alterado, pois um valor nao existe na tabela setores. chave para consulta:[%]'',tmp using errcode=upper(''ufkne'');
  end if;

  select count(*) into numrows
    from filiais_postocoleta
    where
      new.fil_codigo = filiais_postocoleta.fil_codigo;
    tmp:=''filiais_postocoleta|'';
    
      tmp:=tmp || ''fil_codigo='' || new.fil_codigo || ''|'';
    
    tmp:=substring(tmp,1,length(tmp)-1);
  if (
    
    numrows = 0
  ) then
    raise exception ''o registro nao pode ser alterado, pois um valor nao existe na tabela filiais_postocoleta. chave para consulta:[%]'',tmp using errcode=upper(''ufkne'');
  end if;


return old;
end;'
language 'plpgsql';
					
create trigger tu_interface
after update on interface
for each row execute procedure fn_tu_interface();


--drop function fn_ti_loginterface() cascade;

create function fn_ti_loginterface() returns opaque as '
declare
	numrows integer;
	tmp varchar;									 
begin
    select count(*) into numrows
      from interface
      where
        new.fil_codigo = interface.fil_codigo and
        new.int_codigo = interface.int_codigo;
    tmp:=''interface|'';
    
      tmp:=tmp || ''fil_codigo='' || new.fil_codigo || ''|'';
    
      tmp:=tmp || ''int_codigo='' || new.int_codigo || ''|'';
    
    tmp:=substring(tmp,1,length(tmp)-1);

    if (
      new.fil_codigo is not null and
      new.int_codigo is not null and
      numrows = 0
    ) then
      raise exception ''o registro nao pode ser inserido, pois um valor informado nao existe na tabela interface. chave para consulta:[%]'',tmp using errcode=upper(''ifkne'');
    end if;


return new;
end;'
language 'plpgsql';
					
create trigger ti_loginterface
after insert on loginterface
for each row execute procedure fn_ti_loginterface();


--drop function fn_tu_loginterface() cascade;

create function fn_tu_loginterface() returns opaque as '
declare
	numrows integer;
        tmp varchar;										 
begin
  select count(*) into numrows
    from interface
    where
      new.fil_codigo = interface.fil_codigo and
      new.int_codigo = interface.int_codigo;
    tmp:=''interface|'';
    
      tmp:=tmp || ''fil_codigo='' || new.fil_codigo || ''|'';
    
      tmp:=tmp || ''int_codigo='' || new.int_codigo || ''|'';
    
    tmp:=substring(tmp,1,length(tmp)-1);
  if (
    new.fil_codigo is not null and
    new.int_codigo is not null and
    numrows = 0
  ) then
    raise exception ''o registro nao pode ser alterado, pois um valor nao existe na tabela interface. chave para consulta:[%]'',tmp using errcode=upper(''ufkne'');
  end if;


return old;
end;'
language 'plpgsql';
					
create trigger tu_loginterface
after update on loginterface
for each row execute procedure fn_tu_loginterface();




insert into atualizacoes(atu_nome) values ('v18060003_050718.sql');


