CREATE PROCEDURE "DBA"."pa_puhkused"(in a_skoop integer,in a_yksusnr integer,in a_lepnr integer,in a_tas_s integer,in a_algol char(2),in a_tgraaf_akuup date,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_vparyldnr integer;
  declare ll_tas_s integer;
  declare li_a_apaev numeric(2);
  declare li_a_lpaev numeric(2);
  declare li_akuu numeric(2);
  declare li_aasta numeric(4);
  declare ld_kups date;
  declare ld_kups1 date;
  declare ld_akuup date;
  declare ld_lkuup 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 ld_lep_kuup2 date;
  declare ldc_sum1 numeric(15,2);
  declare ldc_sum2 numeric(15,2);
  declare ldc_par1 numeric(15,3);
  declare ldc_par2 numeric(15,3);
  declare ldc_par3_kuus numeric(15,3);
  declare ldc_par3 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 numeric(15,3);
  declare ll_person integer;
  declare ll_id_koht integer;
  declare li_arvuta integer;
  declare err_notfound exception for sqlstate value '02000';
  declare c_keskpuhk dynamic scroll cursor for
	select SUM("gl_pa_tasu"."summa"), "gl_pa_tasu"."vtas_s", "gl_pa_tasu"."vparyldnr"
	from "gl_pa_tasu"
	where "gl_pa_tasu"."lepnr" = a_lepnr 
	group by "gl_pa_tasu"."vtas_s", "gl_pa_tasu"."vparyldnr"
	order by "gl_pa_tasu"."vtas_s" ASC, "gl_pa_tasu"."vparyldnr" ASC;
  
  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 = a_lepnr and(pa_yksus.skoop = a_skoop or a_skoop = 0) and(pa_tasu.yksusnr = a_yksusnr or a_yksusnr = 0) and pa_taslist.algol = '1i' 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 = a_lepnr and(pa_yksus.skoop = a_skoop or a_skoop = 0) and(pa_tasu.yksusnr = a_yksusnr or a_yksusnr = 0) and pa_taslist.algol = '1i' 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 puhkused';
    set li_arvuta=1
  end if;
  if a_action = 1 then
    set ld_akuup=ymd(a_a_aasta,a_a_akuu,1);
    set ld_lkuup=get_perlop(ld_akuup);
    set a_tgraaf_akuup=get_tp_enne_kuup(a_tgraaf_akuup,2);
    set li_akuu=month(a_tgraaf_akuup);
    set li_aasta=years(a_tgraaf_akuup);
    call pa_keskpuhk(a_lepnr, a_yksusnr, li_akuu, li_aasta, a_algol, a_user_code);
    select sum(paevi) into ldc_par3 from gl_pa_tasu;
    select pa_leping.person,pa_leping.id_koht,pa_leping.kuup2 into ll_person,ll_id_koht,ld_lep_kuup2 from pa_leping where pa_leping.lepnr = a_lepnr;
    if ldc_par3>0 then
        set ld_kups=ld_akuup;
        set ld_kuup2=cast('1900-01-01' as date);
        kuu_loop: while ld_kups <= ld_lkuup loop
          if pa_peat_puhk(ld_kups,a_lepnr)=1 then
            set ld_kuup1=ld_kups;
            set li_akuu = month(ld_kups);
            set li_aasta = years(ld_kups);
            per_loop: while ld_kups<=ld_lkuup and month(ld_kups)=li_akuu and pa_peat_puhk(ld_kups,a_lepnr)=1 loop
              set ld_kuup2=ld_kups;
              set ld_kups=Days(ld_kups,1)
            end loop per_loop;
            if ld_kuup2>=ld_kuup1 then
              open c_keskpuhk;
              keskpuhk_loop: loop
                fetch next c_keskpuhk into ldc_par4,ll_tas_s,ll_vparyldnr;
                if sqlstate = err_notfound then
                  leave keskpuhk_loop
                end if;
                if ldc_par4<>0 then
                  set ldc_par1=get_kp_arv_per(ld_kuup1,ld_kuup2);
                  if ldc_par1>0 then
                    set li_a_apaev=Day(ld_kuup1);
                    set li_a_lpaev=Day(ld_kuup2);
                    set ldc_sum2=0;
                    select pa_exists_puhktasu(li_a_apaev,li_a_lpaev,li_akuu,li_aasta,a_lepnr,a_tas_s,ll_tas_s,a_yksusnr,ll_vparyldnr) into ldc_sum2;
                    set ldc_par4 = ldc_par4-ldc_sum2;
                    if ldc_par4<>0 then
                      set ldc_par2 = Round(ldc_par4/ldc_par3,3);
                      set ldc_sum1 = Round((ldc_par4/ldc_par3)*ldc_par1,2);
                      if ldc_sum1<>0 then
                        insert into pa_tasu( yksusnr,lepnr,tas_s,vtas_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( a_yksusnr,a_lepnr,a_tas_s,ll_tas_s,null,ll_vparyldnr,a_t_akuu,a_t_aasta,li_akuu,li_aasta,a_v_akuu,a_v_aasta,li_a_apaev,li_a_lpaev,ldc_par1,ldc_par2,ldc_par3,ldc_par4,1,ldc_sum1,0,0,0,0,0,a_user_code,ll_person,ll_id_koht,'Arvuta puhkused');
                        set li_arvuta=1
                      end if;
                    end if;
                  end if;
                end if;
              end loop keskpuhk_loop;
              close c_keskpuhk
            end if;
          else
            set ld_kups=Days(ld_kups,1)
          end if;
        end loop kuu_loop;
    end if;
  end if;
  if li_arvuta = 1 then
    call pa_arvuta(a_lepnr)
  end if;
end