ALTER PROCEDURE "DBA"."dk_lootusetu"(in id_skoop integer,in id_obj integer,in id_paring integer,in perlop date,in a_id_user integer, in a_valver smallint default 1)
BEGIN
  declare li_asutnr integer;
  declare li_old_asutnr integer;
  declare ld_arvekuup date;
  declare ld_old_arvekuup date;
  declare ls_arvenr char(20);
  declare ls_old_arvenr char(20);
  declare ld_taskuup date;
  declare ldc_summa numeric(20,6);
  declare li_id_graafik integer;
  declare ld_kuup date;
  declare ldc_osamaks numeric(20,6);
  declare li_paevi integer;
  declare li_piir1 integer;
  declare li_piir2 integer;
  declare li_tunnus smallint;
  declare ls_dk_kontod char(5000);
  declare li_paring integer;
  declare err_notfound exception for sqlstate value '02000';
  declare c_dk_kanne dynamic scroll cursor for select dk_kanne.asutnr,if (dk_kanne.crekuup is null or dk_kanne.crenr is null) then (if dk_kanne.arvekuup is null then dk_kanne.kuup else dk_kanne.arvekuup endif) else dk_kanne.crekuup endif as dk_kanne_arvekuup, if dk_kanne.crekuup is null or dk_kanne.crenr is null then if dk_kanne.arvenr is null then '' else dk_kanne.arvenr endif else dk_kanne.crenr endif as dk_kanne_arvenr, if dk_kanne.taskuup is null then dk_kanne.kuup else dk_kanne.taskuup endif,if dk_kanne.sisse=1 then dk_kanne.summa+dk_kanne.summa2 else -1*(dk_kanne.summa+dk_kanne.summa2) endif from
      dk_kanne left outer join gl_1 on(dk_kanne.id = gl_1.id) and(dk_kanne.kuup = gl_1.kuup) key left outer join dk_obj where
      ((dk_kanne.id = gl_1.id) and(dk_kanne.kuup = gl_1.kuup) or id_paring = 0) and(dk_kanne.objnr = id_obj or id_obj = 0) and(dk_obj.skoop = id_skoop or id_skoop = 0) and dk_obj.spank=0 and dk_kanne.asutnr > 0 and dk_kanne.kuup <= perlop;
  declare c_gl_dk_arved dynamic scroll cursor for select asutnr,arvekuup,arvenr,taskuup,arvestatud from gl_dk_arved;
  declare c_dk_graafik_rida dynamic scroll cursor for select kuup,osamaks from dk_graafik_rida where id_graafik=li_id_graafik and osamaks<>0;
  declare c_kp_kanne dynamic scroll cursor for select kp_kanne.asutnr,if kp_kanne.arvekuup is null then kp_kanne.kuup else kp_kanne.arvekuup endif, if kp_kanne.arvenr is null then '' else kp_kanne.arvenr endif,if kp_kanne.sisse=1 then kp_kanne.summa else -1*(kp_kanne.summa) endif from
      kp_kanne left outer join gl_1 on(kp_kanne.id = gl_1.id) and(kp_kanne.kuup = gl_1.kuup),kp_obj where
      ((kp_kanne.id = gl_1.id) and(kp_kanne.kuup = gl_1.kuup) or id_paring = 0) and(kp_kanne.objnr = kp_obj.objnr) and locate(ls_dk_kontod,';'+"Left"(kp_kanne.konto+Space(7),7)+';') > 0 and(kp_obj.skoop = id_skoop or id_skoop = 0) and kp_kanne.asutnr > 0 and kp_kanne.kuup <= perlop;
  declare c_gl_dk_lootusetu dynamic scroll cursor for select taskuup,arvestatud-laekunud from gl_dk_lootusetu where gl_dk_lootusetu.asutnr=li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr order by taskuup;
  declare c_gl_dk_compute dynamic scroll cursor for select asutnr,arvekuup,arvenr,taskuup,saldo,paevi from gl_dk_lootusetu order by asutnr,arvekuup,arvenr,taskuup;
  delete from gl_dk_arved;
  delete from gl_dk_lootusetu;
  if id_obj > 0 then
    select dk_obj.skoop into id_skoop from dk_obj where dk_obj.objnr = id_obj
  end if;
  set li_paring=set_gl_1(id_paring);
  select t_user.tr_dk_lootusetu_piir1,t_user.tr_dk_lootusetu_piir2 into li_piir1,li_piir2 from t_user where t_user.id_user=a_id_user;
  open c_dk_kanne;
  dk_kanne_loop: loop
    fetch next c_dk_kanne into li_asutnr,ld_arvekuup,ls_arvenr,ld_taskuup,ldc_summa;
    if sqlstate = err_notfound then -- kui eof
      leave dk_kanne_loop
    end if;
    if exists(select 1 from gl_dk_arved where gl_dk_arved.asutnr = li_asutnr and gl_dk_arved.arvekuup=ld_arvekuup and gl_dk_arved.arvenr=ls_arvenr) then
      update gl_dk_arved set arvestatud=arvestatud+ldc_summa,taskuup=if taskuup>ld_taskuup then taskuup else ld_taskuup endif where gl_dk_arved.asutnr = li_asutnr and gl_dk_arved.arvekuup=ld_arvekuup and gl_dk_arved.arvenr=ls_arvenr
    else
      insert into gl_dk_arved( asutnr,arvekuup,arvenr,taskuup,arvestatud) values( li_asutnr,ld_arvekuup,ls_arvenr,ld_taskuup,ldc_summa) 
    end if
  end loop dk_kanne_loop;
  close c_dk_kanne;
  open c_gl_dk_arved;
  gl_dk_arved_loop: loop
    fetch next c_gl_dk_arved into li_asutnr,ld_arvekuup,ls_arvenr,ld_taskuup,ldc_summa;
    if sqlstate = err_notfound then -- kui eof
      leave gl_dk_arved_loop
    end if;
    set li_id_graafik=0;
    select first "id" into li_id_graafik from dk_graafik where dk_graafik.asutnr=li_asutnr and dk_graafik.arvekuup=ld_arvekuup and dk_graafik.arvenr=ls_arvenr;
    if li_id_graafik > 0 then
      open c_dk_graafik_rida;
      dk_graafik_rida_loop: loop
        fetch next c_dk_graafik_rida into ld_kuup,ldc_osamaks;
        if sqlstate = err_notfound then -- kui eof
          leave dk_graafik_rida_loop
        end if;
        set ldc_summa=ldc_summa-ldc_osamaks;
        if exists(select 1 from gl_dk_lootusetu where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup = ld_kuup) then
          update gl_dk_lootusetu set arvestatud=arvestatud+ldc_osamaks where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup = ld_kuup
        else
          insert into gl_dk_lootusetu( asutnr,arvekuup,arvenr,taskuup,arvestatud) values( li_asutnr,ld_arvekuup,ls_arvenr,ld_kuup,ldc_osamaks) 
        end if
      end loop dk_graafik_rida_loop;
      close c_dk_graafik_rida;
    end if;
    if ldc_summa<>0 then
      if exists(select 1 from gl_dk_lootusetu where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup = ld_taskuup) then
        update gl_dk_lootusetu set arvestatud=arvestatud+ldc_summa where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup = ld_taskuup
      else
        insert into gl_dk_lootusetu( asutnr,arvekuup,arvenr,taskuup,arvestatud) values( li_asutnr,ld_arvekuup,ls_arvenr,ld_taskuup,ldc_summa) 
      end if
    end if
  end loop gl_dk_arved_loop;
  close c_gl_dk_arved;
  set ls_dk_kontod=get_dk_kontod_koond(id_skoop,id_obj);
  set li_paring=set_gl_1_conv_dk_kp(id_paring);
  open c_kp_kanne;
  kp_kanne_loop: loop
    --  loe kassa/panga kanne
    fetch next c_kp_kanne into li_asutnr,ld_arvekuup,ls_arvenr,ldc_osamaks;
    if sqlstate = err_notfound then -- kui eof
      leave kp_kanne_loop
    end if;
    open c_gl_dk_lootusetu;
    gl_dk_lootusetu_loop: loop
      fetch next c_gl_dk_lootusetu into ld_taskuup,ldc_summa;
      if sqlstate = err_notfound then -- kui eof
        leave gl_dk_lootusetu_loop
      end if;
      if ldc_summa<ldc_osamaks then
        update gl_dk_lootusetu set laekunud=laekunud+ldc_summa where asutnr=li_asutnr and arvekuup=ld_arvekuup and arvenr=ls_arvenr and taskuup=ld_taskuup;
        set ldc_osamaks=ldc_osamaks-ldc_summa;
      else
        update gl_dk_lootusetu set laekunud=laekunud+ldc_osamaks where asutnr=li_asutnr and arvekuup=ld_arvekuup and arvenr=ls_arvenr and taskuup=ld_taskuup;
        set ldc_osamaks=0;
        leave gl_dk_lootusetu_loop
      end if;
    end loop gl_dk_lootusetu_loop;
    close c_gl_dk_lootusetu;
    if ldc_osamaks<>0 then
      if exists(select 1 from gl_dk_lootusetu where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup=ld_arvekuup) then
        update gl_dk_lootusetu set laekunud=laekunud+ldc_osamaks where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup=ld_arvekuup
      else
        insert into gl_dk_lootusetu( asutnr,arvekuup,arvenr,taskuup,laekunud) values( li_asutnr,ld_arvekuup,ls_arvenr,ld_arvekuup,ldc_osamaks) 
      end if
    end if
  end loop kp_kanne_loop;
  close c_kp_kanne;
  update gl_dk_lootusetu set paevi=datediff(day,taskuup,perlop), pikk=if years(taskuup)>years(perlop+1) then arvestatud-laekunud else 0 endif, saldo=arvestatud-laekunud;
  set ldc_osamaks=1;
  set li_tunnus=0;
  set li_old_asutnr=0;
  set ld_old_arvekuup=ymd(1950,1,1);
  set ls_old_arvenr='xyz';
  open c_gl_dk_compute;
  gl_dk_compute_loop: loop
    fetch next c_gl_dk_compute into li_asutnr,ld_arvekuup,ls_arvenr,ld_taskuup,ldc_summa,li_paevi;
    if sqlstate = err_notfound then -- kui eof
      leave gl_dk_compute_loop
    end if;
    if li_asutnr<>li_old_asutnr or ld_arvekuup<>ld_old_arvekuup or ls_arvenr<>ls_old_arvenr then
      if ldc_osamaks=0 then
        delete from gl_dk_lootusetu where gl_dk_lootusetu.asutnr = li_old_asutnr and gl_dk_lootusetu.arvekuup=ld_old_arvekuup and gl_dk_lootusetu.arvenr=ls_old_arvenr
      end if;
      set li_tunnus=0;
      set ldc_osamaks=0;
      set li_old_asutnr=li_asutnr;
      set ld_old_arvekuup=ld_arvekuup;
      set ls_old_arvenr=ls_arvenr;
    end if;
    set ldc_osamaks=ldc_osamaks+ldc_summa;
    if li_tunnus=2 or (li_paevi>li_piir2 and ldc_summa>0) then
      set li_tunnus=2
    elseif li_tunnus=1 or (li_paevi>li_piir1 and ldc_summa>0) then
      set li_tunnus=1
    end if;
    case li_tunnus when 0 then
      update gl_dk_lootusetu set summa1=ldc_summa where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup=ld_taskuup
    when 1 then
      update gl_dk_lootusetu set summa2=ldc_summa where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup=ld_taskuup
    when 2 then
      update gl_dk_lootusetu set summa3=ldc_summa where gl_dk_lootusetu.asutnr = li_asutnr and gl_dk_lootusetu.arvekuup=ld_arvekuup and gl_dk_lootusetu.arvenr=ls_arvenr and gl_dk_lootusetu.taskuup=ld_taskuup
    end case;
  end loop gl_dk_compute_loop;
  close c_gl_dk_compute;
  if ldc_osamaks=0 then
    delete from gl_dk_lootusetu where gl_dk_lootusetu.asutnr = li_old_asutnr and gl_dk_lootusetu.arvekuup=ld_old_arvekuup and gl_dk_lootusetu.arvenr=ls_old_arvenr
  end if;
END