CREATE OR REPLACE FUNCTION public.rendeles_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 = 11
       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 = 11
       AND rmf.sztornozott_bizonylat_kod = 0 AND rmf.sztornozo_bizonylat_kod = 0
       AND rm.tetel_kod = c_tetel_kod
   group by 1;

-- forgalom
c_rendelesek CURSOR (c_tetel_kod integer, c_partner_kod integer) FOR

SELECT rm.kod as sor_kod, rm.mennyiseg as rendeles, 0 as teljesules
   FROM raktar_mozgas_fej rmf
   INNER JOIN raktar_mozgas rm ON rm.fej_kod = rmf.kod
   WHERE rmf.bizonylat_fajta = 11
       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 rendeles, rm.mennyiseg as teljesules
   FROM raktar_mozgas_fej rmf
   INNER JOIN raktar_mozgas rm ON rm.fej_kod = rmf.kod
   WHERE rmf.bizonylat_fajta = 1
       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
   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_rendeles          raktar_mozgas.mennyiseg%type;
v_teljesules        raktar_mozgas.mennyiseg%type;

v_egyenleg          raktar_mozgas.mennyiseg%type;

v_rendelt           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_rendelt := 0;

      OPEN c_partnerek(tg_tetel_kod);

      FETCH c_partnerek
       INTO v_partner_kod;

      WHILE found LOOP -- erintett partnerek (beszallitok) szambavetele

         OPEN c_rendelesek(tg_tetel_kod, v_partner_kod);

         v_egyenleg := 0;

         FETCH c_rendelesek
          INTO v_sor_kod,
               v_rendeles,
               v_teljesules;

         WHILE found LOOP -- rendeles forgalom (sztornok kivetelevel)

            IF v_rendeles <> 0 THEN
               v_egyenleg := v_egyenleg + v_rendeles;
            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_rendelesek
             INTO v_sor_kod,
                  v_rendeles,
                  v_teljesules;
               
         END LOOP;

         CLOSE c_rendelesek;    

         v_rendelt := v_rendelt + v_egyenleg;
         UPDATE tetel_rendeles SET rendelt = 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 rendelt = v_rendelt 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;