CREATE OR REPLACE FUNCTION foglalas_frissit(integer)
  RETURNS boolean AS
'declare

-- erintett raktarak
c_raktarak CURSOR (c_tetel_kod integer) FOR

SELECT rmf.forras_raktar_kod
   FROM raktar_mozgas_fej rmf
   INNER JOIN raktar_mozgas rm ON rm.fej_kod = rmf.kod
   WHERE rmf.bizonylat_fajta = 12
       AND rmf.sztornozott_bizonylat_kod = 0 AND rmf.sztornozo_bizonylat_kod = 0
       AND rm.tetel_kod = c_tetel_kod
   group by 1;

-- erintett partnerek
c_partnerek CURSOR (c_tetel_kod integer) FOR

SELECT rmf.partner_kod
   FROM raktar_mozgas_fej rmf
   INNER JOIN raktar_mozgas rm ON rm.fej_kod = rmf.kod
   WHERE rmf.bizonylat_fajta = 12
       AND rmf.sztornozott_bizonylat_kod = 0 AND rmf.sztornozo_bizonylat_kod = 0
       AND rm.tetel_kod = c_tetel_kod
   group by 1;

-- forgalom
c_foglalasok CURSOR (c_tetel_kod integer, c_partner_kod integer, c_raktarak_kod integer) FOR

SELECT rm.kod as sor_kod, rm.mennyiseg as foglalas, 0 as teljesules
   FROM raktar_mozgas_fej rmf
   INNER JOIN raktar_mozgas rm ON rm.fej_kod = rmf.kod
   WHERE rmf.bizonylat_fajta = 12
       AND rmf.forras_raktar_kod = c_raktarak_kod
       AND rmf.sztornozott_bizonylat_kod = 0 AND rmf.sztornozo_bizonylat_kod = 0
       AND rmf.partner_kod = c_partner_kod
       AND rm.tetel_kod = c_tetel_kod
UNION
SELECT rm.kod as sor_kod, 0 as foglalas, rm.mennyiseg as teljesules
   FROM raktar_mozgas_fej rmf
   INNER JOIN raktar_mozgas rm ON rm.fej_kod = rmf.kod
   WHERE ((rmf.bizonylat_fajta = 3) or (rmf.bizonylat_fajta = 5))
       AND rmf.cel_raktar_kod = c_raktarak_kod
       AND rmf.sztornozott_bizonylat_kod = 0 AND rmf.sztornozo_bizonylat_kod = 0
       AND rmf.partner_kod = c_partner_kod
       AND rm.tetel_kod = c_tetel_kod
       AND csak_fobizonylat_tetel <> '1'
   ORDER BY 1;
 

tg_tetel_kod        tetel_rendeles.tetel_kod%type; -- bejovo parameter (tetelkod)

v_raktar_kod        raktar_mozgas_fej.forras_raktar_kod%type;
v_partner_kod       tetel_rendeles.partner_kod%type;
v_sor_kod           raktar_mozgas.kod%type;
v_foglalas          raktar_mozgas.mennyiseg%type;
v_teljesules        raktar_mozgas.mennyiseg%type;

v_egyenleg          raktar_mozgas.mennyiseg%type;

v_foglalt           raktar_mozgas.mennyiseg%type;


begin
   tg_tetel_kod:=$1; -- bejovo parameter aktivalasa (tetelkod)

   OPEN c_raktarak(tg_tetel_kod);
   FETCH c_raktarak
    INTO v_raktar_kod;   

   WHILE found LOOP -- erintett raktarak szambavetele

      v_foglalt := 0;

      OPEN c_partnerek(tg_tetel_kod);

      FETCH c_partnerek
       INTO v_partner_kod;

      WHILE found LOOP -- erintett partnerek (beszallitok) szambavetele

         OPEN c_foglalasok(tg_tetel_kod, v_partner_kod, v_raktar_kod);

         v_egyenleg := 0;

         FETCH c_foglalasok
          INTO v_sor_kod,
               v_foglalas,
               v_teljesules;

         WHILE found LOOP -- foglalas forgalom (sztornok kivetelevel)

            IF v_foglalas <> 0 THEN
               v_egyenleg := v_egyenleg + v_foglalas;
            END IF;
            IF v_teljesules <> 0 THEN
               v_egyenleg := v_egyenleg - v_teljesules;
               IF v_egyenleg < 0 THEN 
                  v_egyenleg := 0;
               END IF;
            END IF;

            FETCH c_foglalasok
             INTO v_sor_kod,
                  v_foglalas,
                  v_teljesules;
               
         END LOOP;

         CLOSE c_foglalasok;    

         v_foglalt := v_foglalt + v_egyenleg;
         UPDATE tetel_foglalas SET foglalt = v_egyenleg WHERE raktar_kod = v_raktar_kod AND tetel_kod = tg_tetel_kod AND partner_kod = v_partner_kod;

         FETCH c_partnerek
          INTO v_partner_kod;
      
      END LOOP;

      CLOSE c_partnerek;

      UPDATE tetel_raktar SET foglalt = v_foglalt, szabad = keszlet - foglalt WHERE raktar_kod = v_raktar_kod AND tetel_kod = tg_tetel_kod;

      FETCH c_raktarak
       INTO v_raktar_kod;   

   END LOOP;

   CLOSE c_raktarak;

   RETURN true;
end;'
  LANGUAGE plpgsql VOLATILE
  COST 100;  