-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- SIU-GUARANI 3
-- Version 3.0.0
-- Function:  f_escalas_de_notas_iguales(integer, integer)
-- Verifica si dos escalas de notas tienen el mismo conjunto de notas (No verifica los resultados de las notas).
--
-- Recibe:
--       1. Escala de notas 1
--       2. Escala de notas 2
--
-- Retorna: 1 - Las escalas de notas son iguales / 0 - Las escalas de notas no son iguales
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

-- DROP FUNCTION f_escalas_de_notas_iguales(integer, integer);
CREATE OR REPLACE FUNCTION f_escalas_de_notas_iguales(_escala1 integer, _escala2 integer)
  RETURNS integer AS
$BODY$

 -- Variables locales
 DECLARE _cnt_notas1 smallint;
 DECLARE _cnt_notas2 smallint;
 DECLARE _rec_notas  record;
 
BEGIN
  IF _escala1 IS NULL OR _escala2 IS NULL THEN
    Return 0;
  END IF;
  IF _escala1 = _escala2 THEN
    -- Iguales ecalas de notas
    Return 1;	
  END IF;
  
  -- Recupero la cantidad de notas de cada escala de notas.
  SELECT COUNT(*) INTO _cnt_notas1
    FROM sga_escalas_notas_det
    WHERE escala_nota = _escala1;
  SELECT COUNT(*) INTO _cnt_notas2
    FROM sga_escalas_notas_det
    WHERE escala_nota = _escala2;
  
  -- Diferente cantidad de notas.  
  IF _cnt_notas1 <> _cnt_notas2 THEN
    RETURN 0;
  END IF;
  
  -- Igual cantidad de notas, verifico que sean las mismas.
  FOR _rec_notas IN
   (SELECT a.nota FROM sga_escalas_notas_det as a WHERE a.escala_nota = _escala1
     UNION
     SELECT b.nota FROM sga_escalas_notas_det as b WHERE b.escala_nota = _escala2)
   EXCEPT
   (SELECT a.nota FROM sga_escalas_notas_det as a WHERE a.escala_nota = _escala1
     INTERSECT
     SELECT b.nota FROM sga_escalas_notas_det as b WHERE b.escala_nota = _escala2)
  LOOP
    -- No son iguales. Si retorna registros la consulta, es porque encontro notas que no estan en la otra escala de notas.
    RETURN 0;
  END LOOP;   
     
  -- Escalas de notas iguales!
  RETURN 1;
  
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
-- ++++++++++++++++++++++++++++++ Fin Function f_escalas_de_notas_iguales(integer, integer) ++++++++++++++++

-- REVOKE EXECUTE ON FUNCTION f_escalas_de_notas_iguales (integer, integer) FROM public;
GRANT EXECUTE ON FUNCTION f_escalas_de_notas_iguales(integer, integer) TO public;


/*
select * from f_escalas_de_notas_iguales(1,3);
select * from f_escalas_de_notas_iguales(3,1);
select * from f_escalas_de_notas_iguales(1,6);
select * from f_escalas_de_notas_iguales(6,1);
*/