CREATE TABLE IF NOT EXISTS empaud_calidad(
empleado_id INT NOT NULL,
calidad VARCHAR(9) NOT NULL,
cantidad INT NOT NULL,
CHECK (calidad IN ('mala','regular','buena','muy buena')),
PRIMARY KEY(empleado_id,calidad)
);

CREATE OR REPLACE FUNCTION audita_emp_calidad() RETURNS TRIGGER AS $$
DECLARE
vnum INT DEFAULT 0;
vempleado INT;
vcant INT DEFAULT 0;

BEGIN

IF TG_OP='INSERT' THEN

  SELECT empleado_id INTO vempleado FROM inmueble WHERE id = NEW.inmueble_id;
 
  IF vempleado IS NOT NULL THEN
   /* inmueble gestionado por un empleado */

    IF NOT EXISTS (SELECT * FROM empaud_calidad 
	     WHERE empleado_id = vempleado AND calidad = NEW.calidad) THEN 
     /* no existe una entrada para el empleado y la calidad introducidas */
      INSERT INTO empaud_calidad VALUES (vempleado,NEW.calidad,1);
    ELSE /* existe una entrada para el empleado y la calidad introducidas */
      UPDATE empaud_calidad
        SET cantidad = cantidad + 1
      WHERE empleado_id = vempleado AND calidad = NEW.calidad;
    END IF;
  END IF;
END IF;

IF TG_OP='DELETE' THEN
 
  SELECT empleado_id INTO vempleado FROM inmueble WHERE id = OLD.inmueble_id;
 
  IF vempleado IS NOT NULL THEN
   /*inmueble gestionado por un empleado */

    SELECT cantidad INTO vcant FROM empaud_calidad 
    WHERE empleado_id = vempleado AND calidad = OLD.calidad;
    IF vcant = 1 THEN 
     /* el empleado está eliminando el último dormitorio con la calidad afectada */
       DELETE FROM empaud_calidad 
       WHERE empleado_id = vempleado AND calidad = OLD.calidad;
    ELSE 
       /* el empleado no está eliminando el último dormitorio con la calidad afectada */
       UPDATE empaud_calidad
         SET cantidad = cantidad - 1
       WHERE empleado_id = vempleado AND calidad = OLD.calidad;
    END IF;
  END IF;
END IF;

IF TG_OP='UPDATE' THEN

SELECT empleado_id INTO vempleado FROM inmueble WHERE id = NEW.inmueble_id;
  IF vempleado IS NOT NULL THEN 
   /* inmueble gestionado por un empleado */
    IF NOT EXISTS (SELECT * FROM empaud_calidad 
           WHERE empleado_id = vempleado AND calidad = NEW.calidad) THEN 
     /* no existe una entrada para el empleado y la calidad introducidos */
       INSERT INTO empaud_calidad VALUES (vempleado,NEW.calidad,1);
    ELSE /* existe una entrada para el empleado y la calidad introducidos */
       UPDATE empaud_calidad
         SET cantidad = cantidad + 1
       WHERE empleado_id = vempleado AND calidad = NEW.calidad;
    END IF;
 END IF;

SELECT empleado_id INTO vempleado FROM inmueble WHERE id = OLD.inmueble_id;
  IF vempleado IS NOT NULL THEN 
   /* inmueble gestionado por un empleado */

    SELECT cantidad INTO vcant FROM empaud_calidad 
    WHERE empleado_id = vempleado AND calidad = OLD.calidad;
    IF vcant = 1 THEN 
     /* el empleado está eliminando el último dormitorio con la calidad afectada */
       DELETE FROM empaud_calidad 
       WHERE empleado_id = vempleado AND calidad = OLD.calidad;
    ELSE 
       /* el empleado no está eliminando el último dormitorio con la calidad afectada */
       UPDATE empaud_calidad
         SET cantidad = cantidad - 1
       WHERE empleado_id = vempleado AND calidad = OLD.calidad;
    END IF;
  END IF;
END IF;
RETURN NULL;
END;
$$ language plpgsql;

CREATE TRIGGER audita_emp_calidad AFTER INSERT OR UPDATE OF inmueble_id, calidad OR DELETE ON dormitorio 
FOR EACH ROW EXECUTE PROCEDURE audita_emp_calidad();