ALTER PROCEDURE "DBA"."pa_kuupalgad"(in a_skoopkood char(16),in a_skoop integer,in a_yksuskood char(16),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 ld_kups date;
  declare ld_kups1 date;
  declare ld_akuup date;
  declare ld_lkuup date;
  declare ld_akuup_tun date;
  declare ld_lkuup_tun date;
  declare ld_kuup1 date;
  declare ld_kuup2 date;
  declare ld_kuup_1 date;
  declare ld_kuup_2 date;
  declare ld_par_kuup1 date;
  declare ld_par_kuup2 date;
  declare ld_arvut_kuup1 date;
  declare ld_arvut_kuup2 date;
  declare ldc_sum1 numeric(15,2);
  declare ldc_par1 numeric(15,3);
  declare ldc_par2 numeric(15,3);
  declare ll_pvi_kuus_2a integer;
  declare ll_pvi_kuus_2c integer;
  declare ll_pvi_kuus_2d integer;
  declare ldc_par3 numeric(15,3);
  declare ldc_par3_2a numeric(15,3);
  declare ldc_par3_2c numeric(15,3);
  declare ldc_par3_2d numeric(15,3);
  declare ldc_par4 numeric(15,3);
  declare ldc_par5 numeric(15,3);
  declare ldc_tundi_paevas numeric(15,3);
  declare ldc_lyh_tundi_kuus numeric(15,3);
  declare ldc_lyh_tundi_per numeric(15,3);
  declare ll_person integer;
  declare ll_id_koht integer;
  declare li_arvuta integer;
  declare li_lisaks integer;
  declare il_userobj smallint;
  declare err_notfound exception for sqlstate value '02000';
  declare c_isik dynamic scroll cursor for
    select distinct pa_isik.lepnr, pa_isik.yksusnr
      from pa_isik left outer join pa_yksus on pa_isik.yksusnr=pa_yksus.yksusnr left outer join skoobid on pa_yksus.skoop=skoobid.skoop left outer join t_userobj on t_userobj.id_user=a_user_code and t_userobj.id_prog=5 and t_userobj.id_obj=pa_isik.yksusnr
      where Left(skoobid.kood,Length(a_skoopkood))=a_skoopkood and(pa_yksus.skoop=a_skoop or a_skoop=0) and Left(pa_yksus.kood,Length(a_yksuskood))=a_yksuskood and(pa_isik.yksusnr=a_yksusnr or a_yksusnr=0) and (t_userobj.id_obj is not null or il_userobj=0);
  declare c_paryld dynamic scroll cursor for
    select pa_paryld.paryldnr,
           pa_paryld.summa1,
           pa_paryld.akuup,
           COALESCE("pa_paryld"."lkuup","pa_isik"."kuup2",ld_kuup2) as pa_paryld_lkuup,
           pa_paryld.tas_s,
           pa_taslist.protsent/100,
           pa_taslist.algol
    from pa_paryld left outer join pa_taslist on pa_paryld.tas_s = pa_taslist.tas_s
                   LEFT OUTER JOIN "pa_isik" ON "pa_paryld"."lepnr"="pa_isik"."lepnr" AND "pa_paryld"."yksusnr"="pa_isik"."yksusnr"
    where pa_paryld.lepnr = ll_lepnr and
          pa_paryld.yksusnr=ll_yksusnr and
          pa_taslist.algol in ('2a','2c','2d','2e') and
          pa_taslist.tarif = 0 and
          pa_paryld.akuup <= ld_kuup2 and
          pa_paryld_lkuup>=ld_kuup1;
  declare c_gl_pa_leping_tun dynamic scroll cursor for
    select "gl_pa_leping_tun"."kuup1","gl_pa_leping_tun"."kuup2",if "gl_pa_leping_tun"."koht" is null then 0 else "gl_pa_leping_tun"."koht" endif, "gl_pa_leping_tun"."person"
    from "gl_pa_leping_tun"
    order by "gl_pa_leping_tun"."kuup1" asc;
  select t_user.pa_kuupalk_lisaks into li_lisaks from t_user where t_user.id_user=a_user_code;
  select count(*) into il_userobj from t_userobj where t_userobj.id_user=a_user_code and t_userobj.id_prog=5;
  set ld_akuup=ymd(a_a_aasta,a_a_akuu,1);
  set ld_lkuup=get_perlop(ld_akuup);
  set ll_pvi_kuus_2a=get_tp_arv_per(ld_akuup,ld_lkuup);
  set ll_pvi_kuus_2c=get_kp_arv_per(ld_akuup,ld_lkuup);
  set ll_pvi_kuus_2d=get_kp_arv_per_pta(ld_akuup,ld_lkuup);
  set ldc_lyh_tundi_kuus = get_lyh_tundi(ld_akuup,ld_lkuup);
  if ll_pvi_kuus_2a>0 then
    open c_isik;
    isik_loop: loop
      fetch next c_isik into ll_lepnr,ll_yksusnr;
      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 where pa_tasu.lepnr=ll_lepnr and pa_tasu.yksusnr=ll_yksusnr and pa_taslist.algol in ('2a','2c','2d') 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_tasu.yksusnr=ll_yksusnr and pa_taslist.algol in ('2a','2c','2d') 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 kuupalgad';
        set li_arvuta=1
      end if;
      call pa_gl_pa_tgraaf(0,ll_lepnr);
      if a_action = 1 then
-- vajab selgitamist
        select pa_leping.id_koht into ll_id_koht from pa_leping where pa_leping.lepnr=ll_lepnr;

-- uus tegevus
        call pa_gl_pa_leping_tun(ll_lepnr,ld_akuup,ld_lkuup);
        call pa_gl_pa_tasu(ll_lepnr,a_a_akuu,a_a_aasta);

        open c_gl_pa_leping_tun;
        gl_pa_leping_tun_loop: loop
          fetch next c_gl_pa_leping_tun into ld_akuup_tun,ld_lkuup_tun,ldc_tundi_paevas,ll_person;
          if sqlstate = err_notfound then
            leave gl_pa_leping_tun_loop
          end if;
-- ldc_par3 kohustuslik tundide (paevade) arv kuus
          if ldc_tundi_paevas=0 then
            set ldc_par3_2a = ll_pvi_kuus_2a;
            set ldc_par3_2c = ll_pvi_kuus_2c;
            set ldc_par3_2d = ll_pvi_kuus_2d;
          else
            set ldc_par3_2a = Round((ll_pvi_kuus_2a*ldc_tundi_paevas)-ldc_lyh_tundi_kuus,3);
            set ldc_par3_2c = Round((ll_pvi_kuus_2c*ldc_tundi_paevas)-ldc_lyh_tundi_kuus,3);
            set ldc_par3_2d = Round((ll_pvi_kuus_2d*ldc_tundi_paevas)-ldc_lyh_tundi_kuus,3);
          end if;

-- nihe 2 tühikut
        set ld_kuup2=cast('1900-01-01' as date);
        set ld_kups=ld_akuup_tun;
        kuu_loop: while ld_kups <= ld_lkuup_tun loop
          if pa_gl_peat(ld_kups) = 0 then
            set ld_kuup1=ld_kups;
            per_loop: while ld_kups <= ld_lkuup_tun and pa_gl_peat(ld_kups)=0 loop
              set ld_kuup2=ld_kups;
              set ld_kups=Days(ld_kups,1)
            end loop per_loop;

            if (ldc_par3_2a>0 or ldc_par3_2c>0 or ldc_par3_2d>0) and ld_kuup2>=ld_kuup1 then
              open c_paryld;
              paryld_loop: loop
                fetch next c_paryld into ll_paryldnr,ldc_par4,ld_par_kuup1,ld_par_kuup2,ll_tas_s,ldc_par5,ls_algol;
                if sqlstate = err_notfound then
                  leave paryld_loop
                end if;
                if ldc_par4 <> 0 and ldc_par4 is not null then
                  set ld_kuup_2=cast('1900-01-01' as date);
                  set ld_kups1=ld_kuup1;
                  kuu1_loop: while ld_kups1 <= ld_kuup2 loop
                    if li_lisaks=1 or pa_gl_tasu(ld_kups1,ll_tas_s,ll_paryldnr) = 0 then
                      set ld_kuup_1=ld_kups1;
                      per1_loop: while ld_kups1 <= ld_kuup2 and (li_lisaks=1 or pa_gl_tasu(ld_kups1,ll_tas_s,ll_paryldnr)=0) loop
                        set ld_kuup_2=ld_kups1;
                        set ld_kups1=Days(ld_kups1,1)
                      end loop per1_loop;
                      if ld_par_kuup1 < ld_kuup_1 then
                        set ld_arvut_kuup1=ld_kuup_1
                      else
                        set ld_arvut_kuup1=ld_par_kuup1
                      end if;
                      if ld_par_kuup2 is null or ld_par_kuup2 = cast('1900-01-01' as date) or ld_par_kuup2 > ld_kuup_2 then
                        set ld_arvut_kuup2=ld_kuup_2
                      else
                        set ld_arvut_kuup2=ld_par_kuup2
                      end if;
                      if ls_algol='2c' then
                        set ldc_par3=ldc_par3_2c;
                        set ldc_par1=get_kp_arv_per(ld_arvut_kuup1,ld_arvut_kuup2);
                      elseif ls_algol='2d' then
                        set ldc_par3=ldc_par3_2d;
                        set ldc_par1=get_kp_arv_per_pta(ld_arvut_kuup1,ld_arvut_kuup2);
                      else
                        if ls_algol='2e' then
                          set ldc_par3=1
                        else
                          set ldc_par3=ldc_par3_2a
                        end if;
                        set ldc_par1=get_tp_arv_per(ld_arvut_kuup1,ld_arvut_kuup2);
                      end if;
                      if ldc_lyh_tundi_kuus=0 then
                        set ldc_lyh_tundi_per=0
                      else
                        set ldc_lyh_tundi_per=get_lyh_tundi(ld_arvut_kuup1,ld_arvut_kuup2)
                      end if;
                      if ldc_tundi_paevas>0 then
                        set ldc_par1=Round((ldc_par1*ldc_tundi_paevas)-ldc_lyh_tundi_per,3);
                        if ldc_par1<0 then
                          set ldc_par1=0
                        end if;
                      end if;
                      if ldc_par5 is null or ldc_par5 = 0 then
                        set ldc_par5=1
                      end if;
                      if ldc_par1 > 0 and ldc_par3 > 0 then
                        set li_a_apaev=Day(ld_arvut_kuup1);
                        set li_a_lpaev=Day(ld_arvut_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 and ldc_par4 is not null then
                          set ldc_par2=Round(ldc_par4/ldc_par3,3);
                          if ldc_par3=ldc_par1 then
                            set ldc_sum1=Round((ldc_par4)*ldc_par5,2)
                          else
                            set ldc_sum1=Ceiling(((ldc_par4/ldc_par3)*ldc_par1*ldc_par5)*100)/100
                          end if;
                          if ldc_sum1 <> 0 then
                            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,ldc_par5,ldc_sum1,0,0,0,0,0,a_user_code,ll_person,ll_id_koht,'Arvuta kuupalgad') ;
                            set li_arvuta=1
                          end if
                        end if
                      end if
                    else
                      set ld_kups1=Days(ld_kups1,1)
                    end if
                  end loop kuu1_loop
                end if
              end loop paryld_loop;
              close c_paryld
            end if
          else
            set ld_kups=Days(ld_kups,1)
          end if
        end loop kuu_loop
-- nihe 2 tühikut loppeb

        end loop gl_pa_leping_tun_loop;
        close c_gl_pa_leping_tun


      end if;
      if li_arvuta = 1 then
        call pa_arvuta(ll_lepnr)
      end if
    end loop isik_loop;
    close c_isik
  end if
end