CREATE OR REPLACE FUNCTION atlagar_tetel(integer)
  RETURNS boolean AS
$BODY$declare

v_tetel_kod int4;

 
-- c_forgalom
c_forgalom cursor for

select rt.kod,
       rt.forras_raktar_kod,
       rt.cel_raktar_kod,
       rt.mennyiseg,
       rt.netto_osszeg_huf, 
       rf.bizonylat_fajta,
       rf.sztornozott_bizonylat_kod,
       rf.sztornozo_bizonylat_kod
  from raktar_mozgas_fej rf,
       raktar_mozgas rt
 where rf.kod = rt.fej_kod
   and rt.tetel_kod = v_tetel_kod
   and rt.csak_fobizonylat_tetel<1
 order by rf.datum,
       rf.ido,
       rt.kod;

v_kod               raktar_mozgas.kod%type;
v_forras_raktar_kod raktar_mozgas.forras_raktar_kod%type;
v_cel_raktar_kod    raktar_mozgas.cel_raktar_kod%type;
v_mennyiseg         raktar_mozgas.mennyiseg%type;
v_netto_osszeg_huf  raktar_mozgas.netto_osszeg_huf%type;
v_bizonylat_fajta   raktar_mozgas_fej.bizonylat_fajta%type;
v_sztornozott_bizonylat_kod   raktar_mozgas_fej.sztornozott_bizonylat_kod%type;
v_sztornozo_bizonylat_kod   raktar_mozgas_fej.sztornozo_bizonylat_kod%type;

v_atl_mennyiseg     tetel_raktar.atl_mennyiseg%type;
v_atl_atlagar       tetel_raktar.atl_atlagar%type;
v_uj_atlagar        tetel_raktar.atl_atlagar%type;

begin
  v_tetel_kod:=$1;

  update tetel_raktar
     set atl_mennyiseg = 0,
         atl_atlagar = 0
   where tetel_kod = v_tetel_kod;

  open c_forgalom;

    fetch c_forgalom
     into v_kod,
          v_forras_raktar_kod,
          v_cel_raktar_kod,
          v_mennyiseg,
          v_netto_osszeg_huf,
          v_bizonylat_fajta,
          v_sztornozott_bizonylat_kod,
          v_sztornozo_bizonylat_kod;

    while found loop

      if (v_forras_raktar_kod = 0) and (v_cel_raktar_kod<>0) and (v_mennyiseg < 0) then
          v_forras_raktar_kod = v_cel_raktar_kod;
          v_cel_raktar_kod = 0;
          v_mennyiseg = v_mennyiseg * -1;
          v_netto_osszeg_huf  = v_netto_osszeg_huf * -1;
      end if;

      if v_forras_raktar_kod<>0 then

        update tetel_raktar
           set atl_mennyiseg = atl_mennyiseg - v_mennyiseg
         where raktar_kod = v_forras_raktar_kod
           and tetel_kod = v_tetel_kod;

        select atl_mennyiseg,
               atl_atlagar
          into v_atl_mennyiseg,
               v_atl_atlagar
          from tetel_raktar
         where raktar_kod = v_forras_raktar_kod
           and tetel_kod = v_tetel_kod;

        update raktar_mozgas
           set forras_raktar_ujkeszlet = v_atl_mennyiseg,
               forras_raktar_atlagar = v_atl_atlagar
         where kod = v_kod
           and (forras_raktar_ujkeszlet<>v_atl_mennyiseg or forras_raktar_atlagar<>v_atl_atlagar or
                forras_raktar_ujkeszlet is null or forras_raktar_atlagar is null);
      end if;

      if v_cel_raktar_kod<>0 then

        if v_netto_osszeg_huf = 0 then
           select atl_atlagar * v_mennyiseg
             into v_netto_osszeg_huf
             from tetel_raktar
            where raktar_kod = v_forras_raktar_kod
              and tetel_kod = v_tetel_kod;
        end if;

        select atl_mennyiseg,
               atl_atlagar
          into v_atl_mennyiseg,
               v_atl_atlagar
          from tetel_raktar
         where raktar_kod = v_cel_raktar_kod
           and tetel_kod = v_tetel_kod;

        if v_atl_mennyiseg + v_mennyiseg<>0 then
           v_uj_atlagar:=((v_atl_mennyiseg * v_atl_atlagar) + v_netto_osszeg_huf) / (v_atl_mennyiseg + v_mennyiseg);
        else
           -- v_uj_atlagar:=0;
        end if;        

        update tetel_raktar
           set atl_mennyiseg = atl_mennyiseg + v_mennyiseg,
               atl_atlagar = v_uj_atlagar
         where raktar_kod = v_cel_raktar_kod
           and tetel_kod = v_tetel_kod;

        update raktar_mozgas
           set cel_raktar_ujkeszlet = v_atl_mennyiseg + v_mennyiseg,
               cel_raktar_atlagar = v_uj_atlagar
         where kod = v_kod
           and (cel_raktar_ujkeszlet<>v_atl_mennyiseg + v_mennyiseg or cel_raktar_atlagar<>v_uj_atlagar or
                cel_raktar_ujkeszlet is null or cel_raktar_atlagar is null);
      end if;

      IF (v_bizonylat_fajta = 12) AND (v_mennyiseg < 0) THEN
         SELECT foglalas_frissit(v_tetel_kod);
      END IF;            

      IF (v_bizonylat_fajta = 11) AND (v_mennyiseg < 0) THEN
         SELECT rendeles_frissit(v_tetel_kod);
      END IF;            
      

      fetch c_forgalom
       into v_kod,
            v_forras_raktar_kod,
            v_cel_raktar_kod,
            v_mennyiseg,
            v_netto_osszeg_huf,
            v_bizonylat_fajta,
            v_sztornozott_bizonylat_kod,
            v_sztornozo_bizonylat_kod;

    end loop;

    close c_forgalom;

  return true;
end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;