CREATE OR REPLACE FUNCTION public.foglalas_rendezes(integer, integer)
  RETURNS boolean AS
'declare

-- c_tetelkodok
c_tetelkodok cursor (c_partner_kod integer, c_tetel_kod integer) for

select tetel_foglalas.tetel_kod
  from tetel_foglalas
 where tetel_foglalas.foglalt <> 0
   AND ((tetel_foglalas.tetel_kod = c_tetel_kod) or (c_tetel_kod = 0))
   AND ((tetel_foglalas.partner_kod = c_partner_kod) or (c_partner_kod = 0))
 group by 1;

-- c_forgalom
c_forgalom cursor (c_tetel_kod integer) for

select tetel_foglalas.partner_kod,
       tetel_foglalas.raktar_kod,
       tetel_foglalas.tetel_kod,
       tetel_foglalas.foglalt
  from tetel_foglalas
 where tetel_foglalas.foglalt <> 0
   AND ((tetel_foglalas.tetel_kod = c_tetel_kod) or (c_tetel_kod = 0))
 order by 3,1,2;

c_foglalasok cursor (c_tetel_kod integer, c_partner_kod integer) for

SELECT rm.kod as sor_kod, rm.mennyiseg
   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 rmf.partner_kod = c_partner_kod
       AND rm.tetel_kod = c_tetel_kod
   ORDER BY rmf.kelte DESC;
 

tg_tetel_kod        tetel_rendeles.tetel_kod%type;
tg_partner_kod      tetel_rendeles.partner_kod%type;

cr_tetel_kod        tetel_rendeles.tetel_kod%type;

v_sor_kod           raktar_mozgas.kod%type;
v_mennyiseg         raktar_mozgas.mennyiseg%type;
v_sor_mennyiseg     raktar_mozgas.mennyiseg%type;

v_partner_kod       tetel_foglalas.partner_kod%type;
v_raktar_kod        tetel_foglalas.raktar_kod%type;
v_tetel_kod        tetel_foglalas.tetel_kod%type;
v_foglalas_allatti_mennyiseg    tetel_foglalas.foglalt%type;


begin
   tg_tetel_kod:=$1;
   tg_partner_kod:=$2;
   
   IF (tg_tetel_kod = 0) THEN
      UPDATE raktar_mozgas 
         SET mennyiseg_szamlazva = mennyiseg 
       WHERE kod in (SELECT raktar_mozgas.kod FROM raktar_mozgas_fej, raktar_mozgas WHERE raktar_mozgas_fej.kod = raktar_mozgas.fej_kod AND bizonylat_fajta = 12);
   END IF;      

   OPEN c_tetelkodok(tg_partner_kod, tg_tetel_kod);

   FETCH c_tetelkodok
    INTO cr_tetel_kod;

   WHILE FOUND LOOP

      IF (tg_tetel_kod <> 0) THEN
         UPDATE raktar_mozgas 
            SET mennyiseg_szamlazva = mennyiseg 
          WHERE kod in (SELECT raktar_mozgas.kod FROM raktar_mozgas_fej, raktar_mozgas WHERE raktar_mozgas_fej.kod = raktar_mozgas.fej_kod AND bizonylat_fajta = 12)
            AND (tetel_kod = cr_tetel_kod);
      END IF;

      open c_forgalom(cr_tetel_kod);

      fetch c_forgalom
       into v_partner_kod, 
            v_raktar_kod,
            v_tetel_kod,
            v_foglalas_allatti_mennyiseg;

      while found loop
         open c_foglalasok(v_tetel_kod, v_partner_kod);
         fetch c_foglalasok
          into v_sor_kod,
               v_mennyiseg;

         while found loop
            if v_mennyiseg > 0 THEN
               if v_foglalas_allatti_mennyiseg > v_mennyiseg then
                  v_sor_mennyiseg = 0;
                  v_foglalas_allatti_mennyiseg = v_foglalas_allatti_mennyiseg - v_mennyiseg;
               else
                  v_sor_mennyiseg = v_mennyiseg - v_foglalas_allatti_mennyiseg;
                  v_foglalas_allatti_mennyiseg = 0;
               end if;
            END IF;
            UPDATE raktar_mozgas SET mennyiseg_szamlazva = v_sor_mennyiseg WHERE kod = v_sor_kod;

            fetch c_foglalasok
             into v_sor_kod,
                  v_mennyiseg;
         end loop;
         close c_foglalasok;    

         fetch c_forgalom
          into v_partner_kod, 
               v_raktar_kod,
               v_tetel_kod,            
               v_foglalas_allatti_mennyiseg;
      end loop;
      close c_forgalom;


      fetch c_tetelkodok
       into cr_tetel_kod;
   end loop;
   close c_tetelkodok;      


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