ALTER PROCEDURE "DBA"."pa_kinnip_panka"(in a_lepnr integer,in a_t_akuu integer,in a_t_aasta integer)
begin
  declare ldc_summa numeric(15,2);
  declare ldc_maks_summa numeric(15,2);
  declare ldc_kinnip_summa numeric(15,2);
  declare ldc_summa1 numeric(15,3);
  declare ldc_summa2 numeric(15,3);
  declare ldc_summa3 numeric(15,3);
  declare ldc_prop numeric(15,6);
  declare ldc_protsent numeric(15,3);
  declare li_yksusnr integer;
  declare li_paryldnr integer;
  declare li_tas_s integer;
  declare err_notfound exception for sqlstate value '02000';
  declare c_paryld dynamic scroll cursor for
    select pa_paryld.summa1,pa_paryld.summa2,pa_paryld.summa3,pa_paryld.paryldnr,pa_paryld.tas_s,pa_paryld.yksusnr,if pa_taslist.protsent is null then 0 else pa_taslist.protsent endif
      from pa_paryld left outer join pa_taslist on pa_paryld.tas_s = pa_taslist.tas_s
      where pa_paryld.lepnr=a_lepnr and
            pa_taslist.algol='8o' and
           (Years(pa_paryld.akuup)<a_t_aasta or Years(pa_paryld.akuup)=a_t_aasta and Month(pa_paryld.akuup)<=a_t_akuu) and
           (pa_paryld.lkuup is null or Years(pa_paryld.lkuup)>a_t_aasta or Years(pa_paryld.lkuup)=a_t_aasta and Month(pa_paryld.lkuup)>=a_t_akuu)
      order by pa_paryld.summa1 asc,pa_paryld.summa2 asc,pa_paryld.summa3 asc;
  open c_paryld;
  paryld_loop: loop
    fetch next c_paryld into ldc_summa1,ldc_summa2,ldc_summa3,li_paryldnr,li_tas_s,li_yksusnr,ldc_protsent;
    if sqlstate = err_notfound then
      leave paryld_loop
    end if;
    -- kokku saada summa
    select sum((1-2*pa_taslist.sisse)*(pa_tasu.summa-pa_tasu.tulumaks-pa_tasu.tvtkmaks-pa_tasu.pensmaks))
      into ldc_maks_summa
      from pa_tasu left outer join pa_taslist on pa_tasu.tas_s=pa_taslist.tas_s
      where pa_tasu.lepnr=a_lepnr and
            pa_tasu.yksusnr=li_yksusnr and
            pa_tasu.t_akuu=a_t_akuu and pa_tasu.t_aasta=a_t_aasta and
            pa_tasu.palgaleht is null;
    if ldc_maks_summa is null then
      set ldc_maks_summa=0
    end if;
    -- saada summa peab olema suurem kui 0
    if ldc_maks_summa>0 then
      -- arvuta panka ylekandmisele kuuluv summa
      if ldc_summa3>0 then
        set ldc_kinnip_summa=ldc_maks_summa-ldc_summa3
      else
        if ldc_summa2>0 then
          set ldc_kinnip_summa=ldc_summa2
        else
          if ldc_summa1 > 0 then
            set ldc_kinnip_summa=ldc_maks_summa*ldc_summa1/100
          else
            set ldc_kinnip_summa=ldc_maks_summa*ldc_protsent/100
          end if
        end if
      end if;
      set ldc_kinnip_summa=Round(ldc_kinnip_summa,2);
      -- panka summa peab olema suurem kui 0
      if ldc_kinnip_summa>0 then
        -- panka summa ei saa olla suurem kui saada summa
        if ldc_kinnip_summa>ldc_maks_summa then
          set ldc_kinnip_summa=ldc_maks_summa
        end if;
        -- summa jagamise proportsioon
        set ldc_prop=ldc_kinnip_summa/ldc_maks_summa;
        insert into pa_tasu( yksusnr,lepnr,tas_s,paryldnr,summa,vtas_s,vparyldnr,t_akuu,t_aasta,a_akuu,a_aasta,v_akuu,v_aasta,a_apaev,a_lpaev,tulumaks,tvtkmaks,pensmaks,tatkmaks,sotsmaks,user_code,meetnr,kulnr,talnr,objectnr,osaknr,subjectnr,suundnr,taotnr)
          select li_yksusnr,a_lepnr,li_tas_s,li_paryldnr,
             Round(Sum(ldc_prop*(1-2*pa_taslist.sisse)*(pa_tasu.summa-pa_tasu.tulumaks-pa_tasu.tvtkmaks-pa_tasu.pensmaks)),2),
             if(pa_tasu.vtas_s is null or pa_taslist.artnr is not null) then pa_tasu.tas_s else pa_tasu.vtas_s endif as pa_vtas_s,
             pa_tasu.vparyldnr as pa_vparyldnr,
             a_t_akuu,a_t_aasta,
             pa_tasu.a_akuu,pa_tasu.a_aasta,pa_tasu.v_akuu,pa_tasu.v_aasta,
             Min(pa_tasu.a_apaev),
             Max(pa_tasu.a_lpaev),
             0,0,0,0,0,
             Max(pa_tasu.user_code),
             pa_tasu.meetnr,pa_tasu.kulnr,pa_tasu.talnr,pa_tasu.objectnr,pa_tasu.osaknr,pa_tasu.subjectnr,pa_tasu.suundnr,pa_tasu.taotnr
          from pa_tasu left outer join pa_taslist on pa_tasu.tas_s=pa_taslist.tas_s
          where pa_tasu.lepnr=a_lepnr and
            pa_tasu.yksusnr=li_yksusnr and
            pa_tasu.t_akuu=a_t_akuu and pa_tasu.t_aasta=a_t_aasta and
            pa_tasu.palgaleht is null
          group by pa_vtas_s,pa_vparyldnr,pa_tasu.a_akuu,pa_tasu.a_aasta,pa_tasu.v_akuu,pa_tasu.v_aasta,pa_tasu.meetnr,pa_tasu.kulnr,pa_tasu.talnr,pa_tasu.objectnr,pa_tasu.osaknr,pa_tasu.subjectnr,pa_tasu.suundnr,pa_tasu.taotnr;
        delete from pa_tasu where summa=0 and lepnr=a_lepnr and yksusnr=li_yksusnr and tas_s=li_tas_s and palgaleht is null;
         -- kokku kontroll
        if ldc_prop<1 then
          select Sum(pa_tasu.summa) into ldc_summa from pa_tasu where pa_tasu.yksusnr=li_yksusnr and pa_tasu.lepnr=a_lepnr and pa_tasu.paryldnr=li_paryldnr and pa_tasu.t_akuu=a_t_akuu and pa_tasu.t_aasta=a_t_aasta and palgaleht is null;
          if ldc_summa<>ldc_kinnip_summa then
            update first pa_tasu set pa_tasu.summa=pa_tasu.summa+ldc_kinnip_summa-ldc_summa where pa_tasu.yksusnr=li_yksusnr and pa_tasu.lepnr=a_lepnr and pa_tasu.paryldnr = li_paryldnr and pa_tasu.t_akuu = a_t_akuu and pa_tasu.t_aasta = a_t_aasta and pa_tasu.palgaleht is null;
          end if;
        end if;
      end if;
    end if;
  end loop paryld_loop;
  close c_paryld
end