ALTER PROCEDURE "dba"."pa_arvuta2018_sots"(in a_lepnr integer,in a_asutnr integer,in a_t_akuu numeric(2),in a_t_aasta numeric(4),in a_skoopkood char(16))
begin
  declare li_a_akuu numeric(2);
  declare li_a_aasta numeric(4);
  declare li_tasunr integer;
  declare ldc_summa3 numeric(15,2);
  declare li_sisse smallint;
  declare li_smrk smallint;
  declare li_sots smallint;
  declare ls_algol char(2);
  declare ls_vmkood char(3);
  declare ld_peralg date;
  declare ld_perlop date;
  declare ld_kuup1_lep date;
  declare ld_kuup2_lep date;
  declare li_pvi smallint;
  declare li_pvi_kuus smallint;
  declare ld_per date;
  declare ls_puhkalg char(100);
  declare ls_vmkoodid char(100);
  -- arvestuse kuu varasem maks
  declare ldc_sots_maks2 numeric(15,2);
  -- arvestuse kuu varasem maksustatav summa p - ei ole kuumaaralt
  declare ldc_sots_summa2 numeric(15,2);
  declare ldc_sots_summa2_p numeric(15,2);
  -- arvestuse kuu arvutatav maksustatav summa p - ei ole kuumaaralt
  declare ldc_sots_summa3 numeric(15,2);
  declare ldc_sots_summa3_p numeric(15,2);
  -- arvestuse kuu arvutatav maks p - puhkus
  declare ldc_sots_maks3 numeric(15,2);
  declare ldc_sots_maks3_p numeric(15,2);
  -- maksu proportsioon p - puhkus
  declare ldc_sots_prop numeric(15,6);
  declare ldc_sots_prop_p numeric(15,6);
  -- jooksva rea maks
  declare ldc_sots_maks4 numeric(15,2);
  -- maksu maar
  declare ldc_sots_maar numeric(10,3);
  declare ldc_sots_protsent numeric(10,3);
  -- viimane arvutatav rida ilma puhkuseta
  declare li_last_sots_tasunr integer;
  declare li_last_sots_sisse smallint;
  -- viimane arvutatav puhkuse rida
  declare li_last_sots_tasunr_p integer;
  declare li_last_sots_sisse_p smallint;
  declare err_notfound exception for sqlstate value '02000';
  declare c_per insensitive cursor for
    select distinct pa_tasu.a_aasta,pa_tasu.a_akuu
      from pa_tasu left outer join pa_leping on pa_tasu.lepnr = pa_leping.lepnr left outer join skoobid on pa_leping.skoop=skoobid.skoop
      where(pa_leping.asutnr = a_asutnr) and pa_tasu.t_akuu = a_t_akuu and pa_tasu.t_aasta = a_t_aasta and skoobid.kood=a_skoopkood
      order by pa_tasu.a_aasta asc,pa_tasu.a_akuu asc;
  declare c_sots_tasu dynamic scroll cursor for
    select pa_tasu.tasunr,pa_tasu.summa,pa_taslist.sisse,pa_taslist.smrk,pa_taslist.vmkood,pa_taslist.algol
      from pa_tasu left outer join pa_leping on pa_tasu.lepnr = pa_leping.lepnr left outer join pa_taslist on pa_tasu.tas_s = pa_taslist.tas_s left outer join skoobid on pa_leping.skoop=skoobid.skoop
      where pa_leping.asutnr=a_asutnr and
            pa_tasu.a_aasta=li_a_aasta and pa_tasu.a_akuu=li_a_akuu and
            pa_tasu.t_aasta=a_t_aasta and pa_tasu.t_akuu=a_t_akuu and
            pa_tasu.palgaleht is null and
            skoobid.kood=a_skoopkood;
  -- algandmed
  --set ls_puhkalg=';1b;1i;1k;1l;1o;1p;1r;1h;';
  --set ls_vmkoodid=';10;11;13;25;26;28;33;34;';
  select ';'+yld_puhkalg+';', ';'+yld_vmkoodid+';' into ls_puhkalg,ls_vmkoodid from pa_konfm where id=1;
  open c_per;
  per_loop: loop
    fetch next c_per into li_a_aasta,li_a_akuu;
    if sqlstate = err_notfound then
      leave per_loop
    end if;
    set ld_perlop=ymd(li_a_aasta,li_a_akuu,1);
    set ldc_sots_maar=get_maar(6,ld_perlop);
    set ldc_sots_protsent=get_maar(7,ld_perlop);
    set li_sots=get_pa_kaader_tun_sots(a_asutnr,ld_perlop,a_skoopkood);
    -- arvestuse kuu varasem maks, varasem maksustatav summa
    select sum(if (pa_tasu.palgaleht is not null or(pa_tasu.palgaleht is null and((pa_tasu.t_aasta = a_t_aasta and pa_tasu.t_akuu < a_t_akuu) or pa_tasu.t_aasta < a_t_aasta))) then ((-2)*pa_taslist.sisse+1)*pa_tasu.sotsmaks else 0 endif),
           sum(if pa_taslist.smrk=1 and(pa_tasu.palgaleht is not null or(pa_tasu.palgaleht is null and((pa_tasu.t_aasta = a_t_aasta and pa_tasu.t_akuu < a_t_akuu) or pa_tasu.t_aasta < a_t_aasta))) then ((-2)*pa_taslist.sisse+1)*pa_tasu.summa else 0 endif),
           sum(if pa_taslist.smrk=1 and(pa_tasu.palgaleht is not null or(pa_tasu.palgaleht is null and((pa_tasu.t_aasta = a_t_aasta and pa_tasu.t_akuu < a_t_akuu) or pa_tasu.t_aasta < a_t_aasta))) and ((pa_taslist.vmkood is not null and charindex(pa_taslist.vmkood,ls_vmkoodid)=0) or charindex(pa_taslist.algol,ls_puhkalg)>0) then ((-2)*pa_taslist.sisse+1)*pa_tasu.summa else 0 endif),
           sum(if pa_taslist.smrk=1 and(pa_tasu.palgaleht is null and pa_tasu.t_aasta = a_t_aasta and pa_tasu.t_akuu = a_t_akuu) then ((-2)*pa_taslist.sisse+1)*pa_tasu.summa else 0 endif),
           sum(if pa_taslist.smrk=1 and(pa_tasu.palgaleht is null and pa_tasu.t_aasta = a_t_aasta and pa_tasu.t_akuu = a_t_akuu) and ((pa_taslist.vmkood is not null and charindex(pa_taslist.vmkood,ls_vmkoodid)=0) or charindex(pa_taslist.algol,ls_puhkalg)>0) then ((-2)*pa_taslist.sisse+1)*pa_tasu.summa else 0 endif)
      into ldc_sots_maks2,ldc_sots_summa2,ldc_sots_summa2_p,ldc_sots_summa3,ldc_sots_summa3_p
      from pa_tasu left outer join pa_taslist on pa_tasu.tas_s = pa_taslist.tas_s left outer join pa_leping on pa_tasu.lepnr = pa_leping.lepnr left outer join skoobid on pa_leping.skoop=skoobid.skoop
      where(pa_leping.asutnr = a_asutnr) and(pa_tasu.a_aasta = li_a_aasta and pa_tasu.a_akuu = li_a_akuu) and skoobid.kood=a_skoopkood;
    if ldc_sots_maks2 is null then
      set ldc_sots_maks2=0
    end if;
    if ldc_sots_summa2 is null then
      set ldc_sots_summa2=0
    end if;
    if ldc_sots_summa2_p is null then
      set ldc_sots_summa2_p=0
    end if;
    if ldc_sots_summa3 is null then
      set ldc_sots_summa3=0
    end if;
    if ldc_sots_summa3_p is null then
      set ldc_sots_summa3_p=0
    end if;

--message 'summad';
--message ldc_sots_summa2;
--message ldc_sots_summa2_p;
--message ldc_sots_summa3;
--message ldc_sots_summa3_p;
--message ldc_sots_maar;
--message li_sots;

    -- kui sots.maks alates voi vahemalt kuumaaralt, kui arvestatud summa on alla kuumaara ja valjamakse kuumaaralt ja ei ole ainult puhkusetasu
    if li_sots=2 or (li_sots=1 and((ldc_sots_summa2+ldc_sots_summa3)<ldc_sots_maar) and ((ldc_sots_summa2+ldc_sots_summa3=0) or (ldc_sots_summa2+ldc_sots_summa3)<>(ldc_sots_summa2_p+ldc_sots_summa3_p))) then
--message 'maaralt';
      -- kuu paevade arv
      set ld_peralg=YMD(li_a_aasta,li_a_akuu,1);
      set ld_perlop=get_perlop(ld_peralg);
      set li_pvi_kuus=datediff(day,ld_peralg,ld_perlop) + 1;
      -- toolepingu algus ja lopp
      select Min(pa_leping.kuup1) into ld_kuup1_lep from pa_leping left outer join skoobid on pa_leping.skoop=skoobid.skoop where pa_leping.asutnr = a_asutnr and(pa_leping.kuup2 is null or pa_leping.kuup2 >= ld_peralg) and skoobid.kood=a_skoopkood;
      if exists(select 1 from pa_leping left outer join skoobid on pa_leping.skoop=skoobid.skoop where pa_leping.asutnr = a_asutnr and kuup2 is null and pa_leping.kuup1 <= ld_perlop and skoobid.kood=a_skoopkood) then
        set ld_kuup2_lep=YMD(2999,12,31)
      else
        select Max(pa_leping.kuup2) into ld_kuup2_lep from pa_leping left outer join skoobid on pa_leping.skoop=skoobid.skoop where pa_leping.asutnr = a_asutnr and pa_leping.kuup1 <= ld_perlop and skoobid.kood=a_skoopkood
      end if;
      -- tootatud paevad arv toolepingu jargi, kui toolepingu kuupaevad jaavad perioodi sisse
      if(ld_kuup1_lep > ld_peralg and ld_kuup1_lep <= ld_perlop) or(ld_kuup2_lep >= ld_peralg and ld_kuup2_lep < ld_perlop) then
        if ld_kuup1_lep > ld_peralg then
          set ld_peralg=ld_kuup1_lep
        end if;
        if ld_kuup2_lep < ld_perlop then
          set ld_perlop=ld_kuup2_lep
        end if
      end if;
      -- tool oldud paevade arvutamine
      -- kas vahemalt kuumaaralt korral on tooleping peatatud
      if li_sots=1 and exists(select 1 from pa_tgraaf left outer join pa_leping on pa_tgraaf.lepnr = pa_leping.lepnr left outer join skoobid on pa_leping.skoop=skoobid.skoop where pa_leping.asutnr = a_asutnr and pa_tgraaf.akuup <= ld_perlop and pa_tgraaf.lkuup >= ld_peralg and skoobid.kood=a_skoopkood) then
        set li_pvi=0;
        set ld_per=ld_peralg;
        kuu_loop: while ld_per <= ld_perlop loop
          if pa_peat_sots(ld_per,a_lepnr) = 0 then
            set li_pvi=li_pvi+1
          end if;
          set ld_per=Days(ld_per,1)
        end loop kuu_loop
      else
        set li_pvi=datediff(day,ld_peralg,ld_perlop) + 1
      end if;
--message 'paevi';
--message li_pvi;
      -- kui tool oldud kalendripaevi on vahem, kui kuus kalendripaevi
      if li_pvi < li_pvi_kuus then
        set ldc_sots_maar=ldc_sots_maar/30*li_pvi
      end if;
--message 'maar';
--message ldc_sots_maar;
--message ((ldc_sots_summa2+ldc_sots_summa3)-(ldc_sots_summa2_p+ldc_sots_summa3_p));
      -- maksu arvutamine, kui vahemalt kuumaaralt
      if li_sots=1 then
        -- maara vordlus ilma puhkuse summata
        if ((ldc_sots_summa2+ldc_sots_summa3)-(ldc_sots_summa2_p+ldc_sots_summa3_p))<ldc_sots_maar then
          set ldc_sots_maks3=Round((ldc_sots_maar+(ldc_sots_summa2_p+ldc_sots_summa3_p))*ldc_sots_protsent/100,2)-ldc_sots_maks2
        else
          set ldc_sots_maks3=Round((ldc_sots_summa2+ldc_sots_summa3)*ldc_sots_protsent/100,2)-ldc_sots_maks2
        end if
      else
      -- maksu arvutamine alates kuumaaralt
        if (ldc_sots_summa2+ldc_sots_summa3)>ldc_sots_maar then
          set ldc_sots_maks3=Round((ldc_sots_summa2+ldc_sots_summa3-ldc_sots_maar)*ldc_sots_protsent/100,2)-ldc_sots_maks2
        else
          set ldc_sots_maks3=0-ldc_sots_maks2
        end if
      end if
    else
      set ldc_sots_maks3=Round((ldc_sots_summa2+ldc_sots_summa3)*ldc_sots_protsent/100,2)-ldc_sots_maks2
    end if;
    -- kui maksustatav summa ei sisalda puhkuseraha
    if ldc_sots_summa3_p=0 then
      set ldc_sots_maks3_p=0
    else
      set ldc_sots_maks3_p=Round(ldc_sots_summa3_p*ldc_sots_protsent/100,2);
      -- lahutamine
      set ldc_sots_summa3=ldc_sots_summa3-ldc_sots_summa3_p;
      if ldc_sots_summa3=0 then
        set ldc_sots_maks3_p=ldc_sots_maks3;
        set ldc_sots_maks3=0
      else
        set ldc_sots_maks3=ldc_sots_maks3-ldc_sots_maks3_p
      end if
    end if;
    -- prop
    if ldc_sots_summa3 = 0 then
      set ldc_sots_prop=0
    else
      set ldc_sots_prop=ldc_sots_maks3/ldc_sots_summa3
    end if;
    -- prop puhkus
    if ldc_sots_summa3_p = 0 then
      set ldc_sots_prop_p=0
    else
      set ldc_sots_prop_p=ldc_sots_maks3_p/ldc_sots_summa3_p
    end if;
    -- sotsiaalmaksu tagasijagamine
    set li_tasunr=0;
    set li_last_sots_tasunr=0;
    open c_sots_tasu;
    sots_tasu_loop: loop
      fetch next c_sots_tasu into li_tasunr,ldc_summa3,li_sisse,li_smrk,ls_vmkood,ls_algol;
      if sqlstate = err_notfound then
        leave sots_tasu_loop
      end if;
      if (ls_vmkood is not null and charindex(ls_vmkood,ls_vmkoodid)=0) or charindex(ls_algol,ls_puhkalg)>0 then
        if li_smrk = 1 then
          set ldc_sots_maks4=Round(ldc_summa3*ldc_sots_prop_p,2);
          if li_sisse = 0 then
            set ldc_sots_maks3_p=ldc_sots_maks3_p-ldc_sots_maks4
          else
            set ldc_sots_maks3_p=ldc_sots_maks3_p+ldc_sots_maks4
          end if;
          update pa_tasu set pa_tasu.sotsmaks = ldc_sots_maks4 where pa_tasu.tasunr = li_tasunr and pa_tasu.a_aasta = li_a_aasta;
          set li_last_sots_tasunr_p=li_tasunr;
          set li_last_sots_sisse_p=li_sisse
        else
          update pa_tasu set pa_tasu.sotsmaks = 0 where pa_tasu.tasunr = li_tasunr and pa_tasu.a_aasta = li_a_aasta;
          if li_last_sots_tasunr_p = 0 then
            set li_last_sots_tasunr_p=li_tasunr;
            set li_last_sots_sisse_p=li_sisse
          end if
        end if
      else
        if li_smrk = 1 then
          set ldc_sots_maks4=Round(ldc_summa3*ldc_sots_prop,2);
          if li_sisse = 0 then
            set ldc_sots_maks3=ldc_sots_maks3-ldc_sots_maks4
          else
            set ldc_sots_maks3=ldc_sots_maks3+ldc_sots_maks4
          end if;
          update pa_tasu set pa_tasu.sotsmaks = ldc_sots_maks4 where pa_tasu.tasunr = li_tasunr and pa_tasu.a_aasta = li_a_aasta;
          set li_last_sots_tasunr=li_tasunr;
          set li_last_sots_sisse=li_sisse
        else
          update pa_tasu set pa_tasu.sotsmaks = 0 where pa_tasu.tasunr = li_tasunr and pa_tasu.a_aasta = li_a_aasta;
          if li_last_sots_tasunr = 0 then
            set li_last_sots_tasunr=li_tasunr;
            set li_last_sots_sisse=li_sisse
          end if
        end if
      end if
    end loop sots_tasu_loop;
    close c_sots_tasu;
    if ldc_sots_maks3_p <> 0 and li_last_sots_tasunr_p > 0 then
      update pa_tasu set pa_tasu.sotsmaks = pa_tasu.sotsmaks+if li_last_sots_sisse_p = 0 then ldc_sots_maks3_p else-1*ldc_sots_maks3_p endif where pa_tasu.tasunr = li_last_sots_tasunr_p and pa_tasu.a_aasta = li_a_aasta
    end if;
    if ldc_sots_maks3 <> 0 and li_last_sots_tasunr > 0 then
      update pa_tasu set pa_tasu.sotsmaks = pa_tasu.sotsmaks+if li_last_sots_sisse = 0 then ldc_sots_maks3 else-1*ldc_sots_maks3 endif where pa_tasu.tasunr = li_last_sots_tasunr and pa_tasu.a_aasta = li_a_aasta
    end if
  end loop per_loop;
  close c_per
end