CREATE OR REPLACE FUNCTION get_matlar(date, int8, int8, int8) RETURNS float8 AS
'DECLARE
Query refcursor;
mosszeg float8;
mmennyiseg float8;
mcel_raktar_kod int8;
mforras_raktar_kod int8;
mdatum date;
mkod int8;
mkeszlet float8;
mkeszlertek float8;
megysegar float8;

BEGIN
	mkeszlet := 0;
	mkeszlertek := 0;
	
        OPEN Query FOR
        SELECT raktar_mozgas.netto_osszeg_huf, raktar_mozgas.mennyiseg, raktar_mozgas.cel_raktar_kod, raktar_mozgas.forras_raktar_kod, raktar_mozgas_fej.datum, raktar_mozgas.kod
	FROM raktar_mozgas_fej, raktar_mozgas 
	 WHERE (raktar_mozgas_fej.raktar_mozgas_bizonylat = raktar_mozgas.raktar_mozgas_bizonylat)
	  AND ((raktar_mozgas.cel_raktar_kod = $3) OR (raktar_mozgas.forras_raktar_kod = $3))
	  AND raktar_mozgas_fej.datum <= $1
	  AND raktar_mozgas.tetel_kod = $2
	  AND raktar_mozgas.kod <= $4
	ORDER BY raktar_mozgas_fej.datum, raktar_mozgas.kod;
   
	FETCH Query INTO mosszeg, mmennyiseg, mcel_raktar_kod, mforras_raktar_kod, mdatum, mkod;
	WHILE (FOUND) LOOP
		IF (mforras_raktar_kod = 0) and (mcel_raktar_kod = $3) THEN
			mkeszlertek := mkeszlertek + mosszeg;
			mkeszlet := mkeszlet + mmennyiseg;
		END IF;
		IF (mforras_raktar_kod = $3) and (mcel_raktar_kod = 0) THEN
			mkeszlertek := mkeszlertek - ((mkeszlertek / mkeszlet) * mmennyiseg);
			mkeszlet := mkeszlet - mmennyiseg;
		END IF;
		IF (mforras_raktar_kod <> 0) and (mforras_raktar_kod <> $3) THEN
			IF (mkod = $4) THEN
				mkeszlertek := (get_matlar(mdatum, $2, mforras_raktar_kod, mkod) * mmennyiseg);
				mkeszlet := mmennyiseg;
			ELSE
				mkeszlertek := mkeszlertek + (get_matlar(mdatum, $2, mforras_raktar_kod, mkod) * mmennyiseg);
				mkeszlet := mkeszlet + mmennyiseg;
			END IF;
		END IF;
		FETCH Query INTO mosszeg, mmennyiseg, mcel_raktar_kod, mforras_raktar_kod, mdatum, mkod;
	END LOOP;   
	CLOSE Query;
	IF mkeszlet = 0 THEN
		megysegar := 0;
	ELSE
		megysegar := mkeszlertek / mkeszlet;
	END IF;
	RETURN (megysegar);
end;'
  LANGUAGE 'plpgsql' VOLATILE;
