CREATE PROCEDURE "DBA"."kp_dk_arvetasumine_perioodiline"(in a_skoop integer,in a_objnr integer,in a_asutnr integer,in a_arvekuup date,in a_arvenr char(20),in a_tassum decimal(15,2),in a_perlop date,in a_user_code integer, in a_taskuup date default null)
BEGIN
  declare li_id integer;
  declare li_dk_imp_info smallint;
  declare ldc_summa decimal(15,2);
  declare ldc_summa2 decimal(15,2);
  declare ls_konto char(7);
  declare li_saajanr integer;
  declare li_meetnr integer;
  declare li_kulnr integer;
  declare li_talnr integer;
  declare li_artnr integer;
  declare li_kb_artnr integer;
  declare li_tulnr integer;
  declare li_objectnr integer;
  declare li_osaknr integer;
  declare li_subjectnr integer;
  declare li_suundnr integer;
  declare li_taotnr integer;
  declare li_alliknr integer;
  declare li_ravonr integer;
  declare ls_viitnr char(35);
  declare ls_sarve char(30);
  declare li_panknr integer;
  declare ls_info char(250);
  declare li_id_maks integer;
  declare ls_dk_kontod char(5000);
  declare err_notfound exception for sqlstate value '02000';
  declare c_dk_kanne dynamic scroll cursor for
    select ((-2)*dk_kanne.sisse+1)*(dk_kanne.summa),
           ((-2)*dk_kanne.sisse+1)*(dk_kanne.summa2),
           if dk_kanne.saajanr is null then 0 else dk_kanne.saajanr endif,
           if dk_kanne.meetnr is null then 0 else dk_kanne.meetnr endif,
           if dk_kanne.kulnr is null then 0 else dk_kanne.kulnr endif,
           if dk_kanne.talnr is null then 0 else dk_kanne.talnr endif,if dk_kanne.artnr is null then 0 else dk_kanne.artnr endif,kblist.artnr,if dk_kanne.tulnr is null then 0 else dk_kanne.tulnr endif,if dk_kanne.objectnr is null then 0 else dk_kanne.objectnr endif,if dk_kanne.osaknr is null then 0 else dk_kanne.osaknr endif,if dk_kanne.subjectnr is null then 0 else dk_kanne.subjectnr endif,if dk_kanne.suundnr is null then 0 else dk_kanne.suundnr endif,if dk_kanne.taotnr is null then 0 else dk_kanne.taotnr endif,if dk_kanne.alliknr is null then 0 else dk_kanne.alliknr endif,if dk_kanne.ravonr is null then 0 else dk_kanne.ravonr endif,
           if dk_kanne.sarve is null then '' else dk_kanne.sarve endif,
           dk_kanne.panknr,
           if dk_kanne.viitnr is null then '' else dk_kanne.viitnr endif,
           dk_obj.djkonto,
           if li_dk_imp_info=1 then trim(dk_alus.nimi+' '+dk_kanne."info") else '' endif,
           dk_kanne.id_maks
      from dk_kanne key left outer join dk_obj,dk_kanne key left outer join dk_alus,dk_kanne key left outer join kblist
      where if dk_kanne.crekuup is null or dk_kanne.crenr is null then dk_kanne.arvekuup else dk_kanne.crekuup endif=a_arvekuup and
            if dk_kanne.crekuup is null or dk_kanne.crenr is null then dk_kanne.arvenr else dk_kanne.crenr endif=a_arvenr and
            dk_kanne.asutnr = a_asutnr and
            dk_kanne.taskuup = a_taskuup and
            (dk_obj.skoop = a_skoop or a_skoop = 0) and
            dk_obj.spank=1 and
            dk_obj.mke=1;
  declare c_kp_kanne dynamic scroll cursor for
    select ((-2)*kp_kanne.sisse+1)*(kp_kanne.summa),
           if kp_kanne.saajanr is null then 0 else kp_kanne.saajanr endif,
           if kp_kanne.meetnr is null then 0 else kp_kanne.meetnr endif,if kp_kanne.kulnr is null then 0 else kp_kanne.kulnr endif,if kp_kanne.talnr is null then 0 else kp_kanne.talnr endif,if kp_kanne.artnr is null then 0 else kp_kanne.artnr endif,if kp_kanne.tulnr is null then 0 else kp_kanne.tulnr endif,if kp_kanne.objectnr is null then 0 else kp_kanne.objectnr endif,if kp_kanne.osaknr is null then 0 else kp_kanne.osaknr endif,if kp_kanne.subjectnr is null then 0 else kp_kanne.subjectnr endif,if kp_kanne.suundnr is null then 0 else kp_kanne.suundnr endif,if kp_kanne.taotnr is null then 0 else kp_kanne.taotnr endif,if kp_kanne.alliknr is null then 0 else kp_kanne.alliknr endif,if kp_kanne.ravonr is null then 0 else kp_kanne.ravonr endif,
           if kp_kanne.sarve is null then '' else kp_kanne.sarve endif,
           if kp_kanne.viitnr is null then '' else kp_kanne.viitnr endif,
           kp_kanne.konto
      from kp_kanne key left outer join kp_obj
      where kp_kanne.arvekuup = a_arvekuup and
            kp_kanne.arvenr = a_arvenr and
            kp_kanne.asutnr = a_asutnr and
            kp_kanne.taskuup=a_taskuup and
            (kp_obj.skoop = a_skoop or a_skoop = 0) and
            locate(ls_dk_kontod,';'+"Left"(kp_kanne.konto+Space(7),7)+';') > 0;
  select t_user.kp_dk_imp_info into li_dk_imp_info from t_user where t_user.id_user = a_user_code;
  set ls_dk_kontod = get_dk_kontod_spank(a_skoop,1);
  open c_dk_kanne;
  dk_kanne_loop: loop
    fetch next c_dk_kanne into ldc_summa,ldc_summa2,li_saajanr,li_meetnr,li_kulnr,li_talnr,li_artnr,li_kb_artnr,li_tulnr,li_objectnr,li_osaknr,li_subjectnr,li_suundnr,li_taotnr,li_alliknr,li_ravonr,ls_sarve,li_panknr,ls_viitnr,ls_konto,ls_info,li_id_maks;
    if sqlstate = err_notfound then
      leave dk_kanne_loop
    end if;
    if li_kb_artnr is null then
      set ldc_summa = ldc_summa + ldc_summa2;
    else
      if ldc_summa2 <> 0 then
        insert into gl_kp_kanne( kuup,summa,sisse,konto,tulnr,kulnr,talnr,artnr,asutnr,saajanr,tulnud,objnr,objectnr,osaknr,subjectnr,suundnr,arvenr,arvekuup,user_code,viitnr,sarve,panknr,info,alliknr,ravonr,id_maks,meetnr,taotnr,taskuup) values( a_perlop,ldc_summa2,0,ls_konto,li_tulnr,li_kulnr,li_talnr,li_kb_artnr,a_asutnr,li_saajanr,'A',a_objnr,li_objectnr,li_osaknr,li_subjectnr,li_suundnr,a_arvenr,a_arvekuup,a_user_code,ls_viitnr,ls_sarve,li_panknr,ls_info,li_alliknr,li_ravonr,li_id_maks,li_meetnr,li_taotnr,a_taskuup);
      end if
    end if;
    insert into gl_kp_kanne( kuup,summa,sisse,konto,tulnr,kulnr,talnr,artnr,asutnr,saajanr,tulnud,objnr,objectnr,osaknr,subjectnr,suundnr,arvenr,arvekuup,user_code,viitnr,sarve,panknr,info,alliknr,ravonr,id_maks,meetnr,taotnr,taskuup) values( a_perlop,ldc_summa,0,ls_konto,li_tulnr,li_kulnr,li_talnr,li_artnr,a_asutnr,li_saajanr,'A',a_objnr,li_objectnr,li_osaknr,li_subjectnr,li_suundnr,a_arvenr,a_arvekuup,a_user_code,ls_viitnr,ls_sarve,li_panknr,ls_info,li_alliknr,li_ravonr,li_id_maks,li_meetnr,li_taotnr,a_taskuup)
  end loop dk_kanne_loop;
  close c_dk_kanne;
  if a_tassum <> 0 then
    open c_kp_kanne;
    kp_kanne_loop: loop
      fetch next c_kp_kanne into ldc_summa,li_saajanr,li_meetnr,li_kulnr,li_talnr,li_artnr,li_tulnr,li_objectnr,li_osaknr,li_subjectnr,li_suundnr,li_taotnr,li_alliknr,li_ravonr,ls_sarve,ls_viitnr,ls_konto;
      if sqlstate = err_notfound then
        leave kp_kanne_loop
      end if;
      set li_id=0;
      select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and saajanr=li_saajanr and konto=ls_konto and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr and objectnr=li_objectnr and osaknr=li_osaknr and subjectnr=li_subjectnr and suundnr=li_suundnr and taotnr=li_taotnr and alliknr=li_alliknr and ravonr=li_ravonr and sarve=ls_sarve and viitnr=ls_viitnr and summa >= ldc_summa;
      if li_id=0 or li_id is null then
        select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and saajanr=li_saajanr and konto=ls_konto and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr and objectnr=li_objectnr and osaknr=li_osaknr and subjectnr=li_subjectnr and suundnr=li_suundnr and taotnr=li_taotnr and alliknr=li_alliknr and ravonr=li_ravonr and viitnr=ls_viitnr and summa >= ldc_summa;
        if li_id=0 or li_id is null then
          select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and saajanr=li_saajanr and konto=ls_konto and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr and objectnr=li_objectnr and osaknr=li_osaknr and subjectnr=li_subjectnr and suundnr=li_suundnr and taotnr=li_taotnr and alliknr=li_alliknr and ravonr=li_ravonr and summa >= ldc_summa;
          if li_id=0 or li_id is null then
            select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and saajanr=li_saajanr and konto=ls_konto and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr and objectnr=li_objectnr and osaknr=li_osaknr and subjectnr=li_subjectnr and suundnr=li_suundnr and taotnr=li_taotnr and alliknr=li_alliknr and ravonr=li_ravonr;
            if li_id=0 or li_id is null then
              select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and konto=ls_konto and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr and objectnr=li_objectnr and osaknr=li_osaknr and subjectnr=li_subjectnr and suundnr=li_suundnr and taotnr=li_taotnr and alliknr=li_alliknr and ravonr=li_ravonr;
              if li_id=0 or li_id is null then
                select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr and objectnr=li_objectnr and osaknr=li_osaknr and subjectnr=li_subjectnr and suundnr=li_suundnr and taotnr=li_taotnr and alliknr=li_alliknr and ravonr=li_ravonr;
                if li_id=0 or li_id is null then
                  select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup and meetnr=li_meetnr and kulnr=li_kulnr and talnr=li_talnr and artnr=li_artnr and tulnr=li_tulnr;
                  if li_id=0 or li_id is null then
                    select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr and taskuup=a_taskuup;
                    if li_id=0 or li_id is null then
                      select first "id" into li_id from gl_kp_kanne where arvekuup=a_arvekuup and arvenr=a_arvenr and asutnr=a_asutnr;
                    end if
                  end if
                end if
              end if
            end if
          end if
        end if
      end if;
      if li_id > 0 then
        if ldc_summa<a_tassum then
          update gl_kp_kanne set summa=summa-ldc_summa where "id"=li_id;
          set a_tassum=a_tassum-ldc_summa;
        else
          update gl_kp_kanne set summa=summa-a_tassum where "id"=li_id;
          set a_tassum=0
        end if;
      end if
    end loop kp_kanne_loop;
    close c_kp_kanne;
    if li_id > 0 and a_tassum>0 then
      update gl_kp_kanne set summa=summa-a_tassum where "id"=li_id;
    end if
  end if;
END