ALTER PROCEDURE "dba"."pa_juurde"(in a_skoop integer,in a_yksusnr integer,in a_t_akuu numeric(2),in a_t_aasta numeric(4),in a_a_akuu numeric(2),in a_a_aasta numeric(4),in a_v_akuu numeric(2),in a_v_aasta numeric(4),in a_user_code integer,in a_action integer)
begin
  declare ll_yksusnr integer;
  declare ll_paryldnr integer;
  declare ll_tas_s integer;
  declare ls_algol char(2);
  declare ll_lepnr integer;
  declare li_a_apaev numeric(2);
  declare li_a_lpaev numeric(2);
  declare ll_person integer;
  declare ll_id_koht integer;
  declare li_kroonides smallint;
  declare li_arvuta integer;
  declare ld_akuup date;
  declare ld_kuup1 date;
  declare ld_kuup2 date;
  declare ld_lkuup date;
  declare ldc_summa numeric(15,3);
  declare ldc_par1 numeric(15,3);
  declare ldc_par2 numeric(15,3);
  declare ldc_par3 numeric(15,3);
  declare ldc_par4 numeric(15,3);
  declare ldc_par3_tp numeric(15,3);
  declare ldc_par3_kp numeric(15,3);
  declare ldc_par3_kp_pta numeric(15,3);
  declare err_notfound exception for sqlstate value '02000';
  declare c_isik dynamic scroll cursor for
    select distinct pa_isik.lepnr,pa_leping.person,pa_leping.id_koht
      from pa_isik left outer join pa_yksus on pa_isik.yksusnr = pa_yksus.yksusnr
                   left outer join pa_leping on pa_isik.lepnr=pa_leping.lepnr
      where (pa_yksus.skoop=a_skoop or a_skoop=0) and
            (pa_isik.yksusnr = a_yksusnr or a_yksusnr = 0);
  declare c_paryld dynamic scroll cursor for
    select (if pa_paryld.summa1 is null or pa_paryld.summa1=0 then (if pa_taslist.protsent is null then 0 else pa_taslist.protsent endif) else pa_paryld.summa1 endif),
           (if pa_paryld.akuup < ld_akuup then ld_akuup else pa_paryld.akuup endif),
           (if COALESCE("pa_paryld"."lkuup","pa_isik"."kuup2","pa_leping"."kuup2") is null or COALESCE("pa_paryld"."lkuup","pa_isik"."kuup2","pa_leping"."kuup2")>ld_lkuup then ld_lkuup else COALESCE("pa_paryld"."lkuup","pa_isik"."kuup2","pa_leping"."kuup2") endif) as pa_paryld_lkuup,
           pa_paryld.paryldnr,pa_paryld.tas_s,pa_paryld.yksusnr,pa_taslist.algol
     from pa_paryld left outer join pa_taslist on pa_paryld.tas_s=pa_taslist.tas_s
                    left outer join pa_yksus on pa_paryld.yksusnr=pa_yksus.yksusnr
                    LEFT OUTER JOIN "pa_isik" ON "pa_paryld"."lepnr"="pa_isik"."lepnr" AND "pa_paryld"."yksusnr"="pa_isik"."yksusnr"
                    LEFT OUTER JOIN "pa_leping" ON "pa_paryld"."lepnr"="pa_leping"."lepnr"
     where pa_paryld.lepnr=ll_lepnr and
          (pa_yksus.skoop=a_skoop or a_skoop = 0) and
          (pa_paryld.yksusnr=a_yksusnr or a_yksusnr=0) and
          Left(pa_taslist.algol,1)='4' and
          pa_paryld.akuup<=ld_lkuup and
          pa_paryld_lkuup>=ld_akuup;
  select pa_konfm.yld_kroonides into li_kroonides from pa_konfm where pa_konfm.id = 1;
  set ld_akuup=ymd(a_a_aasta,a_a_akuu,1);
  set ld_lkuup=get_perlop(ld_akuup);
  set ldc_par3_tp=get_tp_arv_per(ld_akuup,ld_lkuup);
  set ldc_par3_kp=get_kp_arv_per(ld_akuup,ld_lkuup);
  set ldc_par3_kp_pta=get_kp_arv_per_pta(ld_akuup,ld_lkuup);
  open c_isik;
  isik_loop: loop
    fetch next c_isik into ll_lepnr,ll_person,ll_id_koht;
    if sqlstate = err_notfound then
      leave isik_loop
    end if;
    if exists(select pa_tasu.summa from pa_tasu left outer join pa_taslist on pa_tasu.tas_s = pa_taslist.tas_s left outer join pa_yksus on pa_tasu.yksusnr = pa_yksus.yksusnr where pa_tasu.lepnr = ll_lepnr and(pa_yksus.skoop = a_skoop or a_skoop = 0) and(pa_tasu.yksusnr = a_yksusnr or a_yksusnr = 0) and left(pa_taslist.algol,1) = '4' and pa_tasu.a_akuu = a_a_akuu and pa_tasu.a_aasta = a_a_aasta and pa_tasu.palgaleht is null) then
      delete from pa_tasu from pa_tasu left outer join pa_taslist on pa_tasu.tas_s = pa_taslist.tas_s left outer join pa_yksus on pa_tasu.yksusnr = pa_yksus.yksusnr where pa_tasu.lepnr = ll_lepnr and(pa_yksus.skoop = a_skoop or a_skoop = 0) and(pa_tasu.yksusnr = a_yksusnr or a_yksusnr = 0) and left(pa_taslist.algol,1) = '4' and pa_tasu.a_akuu = a_a_akuu and pa_tasu.a_aasta = a_a_aasta and pa_tasu.palgaleht is null and pa_tasu.tulnud = 'Arvuta pysiv summa';
      set li_arvuta=1
    end if;
    if a_action = 1 then
      open c_paryld;
      paryld_loop: loop
        fetch next c_paryld into ldc_par4,ld_kuup1,ld_kuup2,ll_paryldnr,ll_tas_s,ll_yksusnr,ls_algol;
        if sqlstate = err_notfound then
          leave paryld_loop
        end if;
        if ls_algol = '4a' then
          set ldc_par3 = ldc_par3_tp;
          set ldc_par1 = get_tp_arv_per(ld_kuup1,ld_kuup2)
        elseif ls_algol = '4b' then
          set ldc_par3 = ldc_par3_kp;
          set ldc_par1 = get_kp_arv_per(ld_kuup1,ld_kuup2)
        elseif ls_algol = '4c' then
          set ldc_par3 = ldc_par3_kp_pta;
          set ldc_par1 = get_kp_arv_per_pta(ld_kuup1,ld_kuup2)
        elseif ls_algol = '4d' then
          set ldc_par3 = 1;
          set ldc_par1 = get_tp_arv_per(ld_kuup1,ld_kuup2)
        elseif ls_algol = '4e' then
          set ldc_par3 = 1;
          set ldc_par1 = get_kp_arv_per(ld_kuup1,ld_kuup2)
        elseif ls_algol = '4f' then
          set ldc_par3 = 1;
          set ldc_par1 = get_kp_arv_per_pta(ld_kuup1,ld_kuup2)
        end if;
        if ldc_par1 > 0 and ldc_par3 > 0 and ldc_par4 <> 0 then
          set li_a_apaev=Day(ld_kuup1);
          set li_a_lpaev=Day(ld_kuup2);
          set ldc_par4=ldc_par4-pa_exists_kuupalk(li_a_apaev,li_a_lpaev,a_a_akuu,a_a_aasta,ll_lepnr,ll_tas_s,ll_paryldnr);
          if ldc_par4 <> 0 then
            set ldc_par2=Round(ldc_par4/ldc_par3,3);
            if li_kroonides = 1 then
               set ldc_summa=Round((ldc_par4/ldc_par3)*ldc_par1,0)
            else
               set ldc_summa=Round((ldc_par4/ldc_par3)*ldc_par1,2)
            end if;
            insert into pa_tasu( yksusnr,lepnr,tas_s,paryldnr,vparyldnr,t_akuu,t_aasta,a_akuu,a_aasta,v_akuu,v_aasta,a_apaev,a_lpaev,par1,par2,par3,par4,par5,summa,tulumaks,tvtkmaks,pensmaks,tatkmaks,sotsmaks,user_code,person,id_koht,tulnud) values( ll_yksusnr,ll_lepnr,ll_tas_s,ll_paryldnr,ll_paryldnr,a_t_akuu,a_t_aasta,a_a_akuu,a_a_aasta,a_v_akuu,a_v_aasta,li_a_apaev,li_a_lpaev,ldc_par1,ldc_par2,ldc_par3,ldc_par4,0,ldc_summa,0,0,0,0,0,a_user_code,ll_person,ll_id_koht,'Arvuta pysiv summa');
            set li_arvuta=1
          end if
        end if
      end loop paryld_loop;
      close c_paryld
    end if;
    if li_arvuta = 1 then
      call pa_arvuta(ll_lepnr)
    end if
  end loop isik_loop;
  close c_isik
end