ALTER PROCEDURE "dba"."kp_dk_tasumine_perioodiline"(in a_skoop integer, in a_perlop date)
BEGIN
  declare ldc_summa numeric(15,2);
  declare ldc_summa2 numeric(15,2);
  declare ldc_makssumma numeric(15,2);
  declare ld_arvekuup date;
  declare ld_taskuup date;
  declare ls_arvenr char(20);
  declare li_asutnr integer;
  declare li_i integer;
  declare li_id integer;
  declare li_tyyp integer;
  declare ld_ataskuup date;
  declare ls_dk_kontod char(5000);
  declare err_notfound exception for sqlstate value '02000';
  declare c_kp_kanne dynamic scroll cursor for 
    select sum(((-2)*kp_kanne.sisse+1)*(kp_kanne.summa)),kp_kanne.arvekuup,kp_kanne.taskuup,kp_kanne.arvenr,kp_kanne.asutnr
      from kp_kanne left outer join kp_obj on kp_kanne.objnr=kp_obj.objnr
      where kp_kanne.arvekuup >= ld_ataskuup and kp_kanne.arvenr is not null and kp_kanne.asutnr is not null and (kp_obj.skoop=a_skoop or a_skoop=0) and locate(ls_dk_kontod,';'+"Left"(kp_kanne.konto+Space(7),7)+';') > 0
      group by  kp_kanne.arvekuup, kp_kanne.arvenr, kp_kanne.asutnr, kp_kanne.taskuup;
  declare c_gl_dk_arvetas dynamic scroll cursor for 
    select gl_dk_arvetas.tyyp,gl_dk_arvetas.makssumma,gl_dk_arvetas.arvekuup, gl_dk_arvetas.arvenr,gl_dk_arvetas.asutnr
      from gl_dk_arvetas
      where makssumma<>0 and tyyp>1;
  declare c_gl_dk_kanne dynamic scroll cursor for
    select "id","summa","summa2"
      from gl_dk_kanne
      where gl_dk_kanne.arvekuup=ld_arvekuup and gl_dk_kanne.arvenr=ls_arvenr and gl_dk_kanne.asutnr=li_asutnr
      order by taskuup asc;
  delete from gl_dk_kanne;
  delete from gl_dk_arvetas;
  select skoobid.kp_dk_taskuup into ld_ataskuup from skoobid where skoobid.skoop=a_skoop;
  set ls_dk_kontod = get_dk_kontod_spank(a_skoop,1);
  insert into gl_dk_kanne ( summa,summa2,arvekuup,arvenr,asutnr,saajanr,taskuup,meetnr,kulnr,talnr,artnr,objectnr,osaknr,subjectnr,suundnr,taotnr,panknr)
    select sum(((-2)*dk_kanne.sisse+1)*(dk_kanne.summa+dk_kanne.summa2)),0,if dk_kanne.crekuup is null or dk_kanne.crenr is null then dk_kanne.arvekuup else dk_kanne.crekuup endif as dk_arvekuup,if dk_kanne.crekuup is null or dk_kanne.crenr is null then dk_kanne.arvenr else dk_kanne.crenr endif as dk_arvenr,dk_kanne.asutnr,
           Max(dk_kanne.saajanr),
           (if dk_kanne.taskuup is null then date('2000-01-01') else dk_kanne.taskuup endif) as dk_taskuup,
           Min(dk_kanne.meetnr),
           Min(dk_kanne.kulnr),
           Min(dk_kanne.talnr),
           Min(dk_kanne.artnr),
           Min(dk_kanne.objectnr),
           Min(dk_kanne.osaknr),
           Min(dk_kanne.subjectnr),
           Min(dk_kanne.suundnr),
           Min(dk_kanne.taotnr),
           Max(dk_kanne.panknr)
      from dk_kanne left outer join dk_obj on dk_kanne.objnr=dk_obj.objnr
      where dk_arvekuup>=ld_ataskuup and dk_arvekuup<=a_perlop and dk_arvenr is not null and dk_kanne.asutnr is not null and (dk_obj.skoop=a_skoop or a_skoop=0) and dk_obj.spank=1 and dk_obj.mke=1
      group by  dk_arvekuup, dk_arvenr, dk_kanne.asutnr, dk_taskuup;
  open c_kp_kanne;
  kp_kanne_loop: loop
    fetch next c_kp_kanne into ldc_summa,ld_arvekuup,ld_taskuup,ls_arvenr,li_asutnr;
    if sqlstate = err_notfound then -- kui eof
      leave kp_kanne_loop
    end if;
    if ld_taskuup is null then
      update first gl_dk_kanne set summa2=summa2+ldc_summa where gl_dk_kanne.arvekuup=ld_arvekuup and gl_dk_kanne.arvenr=ls_arvenr and gl_dk_kanne.asutnr=li_asutnr
    else
      update first gl_dk_kanne set summa2=summa2+ldc_summa where gl_dk_kanne.arvekuup=ld_arvekuup and gl_dk_kanne.taskuup=ld_taskuup and gl_dk_kanne.arvenr=ls_arvenr and gl_dk_kanne.asutnr=li_asutnr
    end if
  end loop kp_kanne_loop;
  close c_kp_kanne;
  delete from gl_dk_kanne where summa-summa2=0;
  insert into gl_dk_arvetas ( arvesumma,makssumma,arvekuup,arvenr,asutnr,tyyp)
    select sum(summa),sum(summa2),arvekuup,arvenr,asutnr,count()
      from gl_dk_kanne
      group by  gl_dk_kanne.arvekuup, gl_dk_kanne.arvenr, gl_dk_kanne.asutnr;
  open c_gl_dk_arvetas;
  gl_dk_arvetas_loop: loop
    fetch next c_gl_dk_arvetas into li_tyyp,ldc_makssumma,ld_arvekuup,ls_arvenr,li_asutnr;
    if sqlstate = err_notfound then -- kui eof
      leave gl_dk_arvetas_loop
    end if;
    set li_i=0;
    open c_gl_dk_kanne;
     gl_dk_kanne_loop: loop
      fetch next c_gl_dk_kanne into li_id,ldc_summa,ldc_summa2;
      if sqlstate = err_notfound then -- kui eof
        leave gl_dk_kanne_loop
      end if;
      set li_i=li_i+1;
      if li_i=li_tyyp then
        update gl_dk_kanne set summa2=ldc_makssumma where "id"=li_id;
        set ldc_makssumma=0
      else
        if ldc_summa2=0 or ldc_summa2>ldc_summa then
          if ldc_summa<ldc_makssumma then
            update gl_dk_kanne set summa2=ldc_summa where "id"=li_id;
            set ldc_makssumma=ldc_makssumma-ldc_summa
          else
            update gl_dk_kanne set summa2=ldc_makssumma where "id"=li_id;
            set ldc_makssumma=0
          end if
        else
          set ldc_makssumma=ldc_makssumma-ldc_summa2
        end if
      end if
    end loop gl_dk_kanne_loop;
    close c_gl_dk_kanne;
  end loop gl_dk_arvetas_loop;
  close c_gl_dk_arvetas;
  delete from gl_dk_kanne where summa-summa2=0;
END