ALTER PROCEDURE "dba"."pa_keskpuhk"(in a_lepnr integer,in a_yksusnr integer,in a_t_akuu numeric(2),in a_t_aasta numeric(4),in a_algol char(2),in a_id_user integer default 32767,in a_puhkting smallint default 0)
begin
  declare li_asutnr integer;
  declare li_a_aasta1 numeric(4);
  declare li_a_akuu1 numeric(2);
  declare li_a_aasta2 numeric(4);
  declare li_a_akuu2 numeric(2);
  declare li_peat smallint;
  declare ld_akuup date;
  declare ld_lkuup date;
  declare ld_kuup1 date;
  declare ld_kuup2 date;
  declare li_dow smallint;
  declare li_6kuud smallint;
  declare li_6kuud_periood smallint;
  declare li_yld_puhklep smallint;
  declare li_yld_puhkisik smallint;
  delete from gl_pa_tasu;
--  select if pa_konfm.yld_puhklep is null then 0 else pa_konfm.yld_puhklep endif,if pa_konfm.yld_puhkisik is null then 0 else pa_konfm.yld_puhkisik endif into li_yld_puhklep,li_yld_puhkisik from pa_konfm where pa_konfm.id = 1;
  select if a_puhkting=1 then 0 else if t_user.pa_puhklep is null then 0 else t_user.pa_puhklep endif endif,if a_puhkting=1 then 0 else if t_user.pa_puhkisik is null then 0 else t_user.pa_puhkisik endif endif,t_user.pa_6kuud,if t_user.pa_6kuud_periood is null or t_user.pa_6kuud_periood=0 then 6 else t_user.pa_6kuud_periood endif into li_yld_puhklep,li_yld_puhkisik,li_6kuud,li_6kuud_periood from t_user where t_user.id_user=a_id_user;
  if a_t_aasta > 2000 and a_t_akuu > 0 then
    -- kui varasemad kuud nihkes
    set a_t_akuu=a_t_akuu-li_6kuud;
    a_t_akuu_loop: WHILE a_t_akuu<=0 LOOP
      set a_t_akuu=12+a_t_akuu;
      set a_t_aasta=a_t_aasta-1
    END LOOP a_t_akuu_loop;
    -- toolepingu periood
    select pa_leping.asutnr,pa_leping.kuup1,pa_leping.kuup2 into li_asutnr,ld_akuup,ld_lkuup from pa_leping where pa_leping.lepnr=a_lepnr;
    if li_yld_puhkisik = 1 then
      select min(pa_leping.kuup1) into ld_akuup from pa_leping where pa_leping.asutnr=li_asutnr and (pa_leping.kuup2 is null or pa_leping.kuup2 is not null and days(pa_leping.kuup2,1)>=ld_akuup);
      select min(pa_leping.kuup1) into ld_akuup from pa_leping where pa_leping.asutnr=li_asutnr and (pa_leping.kuup2 is null or pa_leping.kuup2 is not null and days(pa_leping.kuup2,1)>=ld_akuup);
      select min(pa_leping.kuup1) into ld_akuup from pa_leping where pa_leping.asutnr=li_asutnr and (pa_leping.kuup2 is null or pa_leping.kuup2 is not null and days(pa_leping.kuup2,1)>=ld_akuup);
      select min(pa_leping.kuup1) into ld_akuup from pa_leping where pa_leping.asutnr=li_asutnr and (pa_leping.kuup2 is null or pa_leping.kuup2 is not null and days(pa_leping.kuup2,1)>=ld_akuup);
    end if;
    -- periood lopu kuu ja aasta
    set li_a_aasta2=a_t_aasta;
    if month(ld_akuup)=a_t_akuu and years(ld_akuup)=a_t_aasta then
      set li_a_akuu2=a_t_akuu
    else
      set li_a_akuu2=a_t_akuu-1
    end if;
    if li_a_akuu2 = 0 then
      set li_a_akuu2=12;
      set li_a_aasta2=li_a_aasta2-1
    end if;
    -- perioodi alguse kuu ja aasta
    set li_a_aasta1=li_a_aasta2;
    set li_a_akuu1=li_a_akuu2-li_6kuud_periood+1;
    li_a_akuu1_loop: WHILE li_a_akuu1<=0 LOOP
      set li_a_akuu1=12+li_a_akuu1;
      set li_a_aasta1=li_a_aasta1-1
    END LOOP li_a_akuu1_loop;
    if years(ld_akuup) < li_a_aasta1 or years(ld_akuup) = li_a_aasta1 and month(ld_akuup) < li_a_akuu1 then
      set ld_akuup=YMD(li_a_aasta1,li_a_akuu1,1)
    else
      set li_a_aasta1=years(ld_akuup);
      set li_a_akuu1=month(ld_akuup)
    end if;
    if ld_lkuup is null or years(ld_lkuup) > li_a_aasta2 or years(ld_lkuup) = li_a_aasta2 and month(ld_lkuup) > li_a_akuu2 then
      set ld_lkuup=get_perlop(YMD(li_a_aasta2,li_a_akuu2,25))
    else
      set li_a_aasta2=years(ld_lkuup);
      set li_a_akuu2=month(ld_lkuup)
    end if;

    -- varasemate kuude arvestused tasuliikide ja klassifikaatorite loikes
    insert into gl_pa_tasu( tasunr,lepnr,vtas_s,vparyldnr,a_akuu,a_aasta,summa,paevi,meetnr,kulnr,talnr,objectnr,osaknr,subjectnr,suundnr,taotnr)
      select pa_tasu.tasunr,
             a_lepnr,
             if pa_tasu.vtas_s is null then pa_tasu.tas_s else pa_tasu.vtas_s endif as pa_vtas_s,
             pa_tasu.vparyldnr,
             pa_tasu.a_akuu,pa_tasu.a_aasta,
             sum((1-2*pa_taslist.sisse)*pa_tasu.summa),
             0,
             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 left outer join pa_leping on pa_tasu.lepnr = pa_leping.lepnr
        where pa_taslist.puhkkesk=1 and
             (pa_tasu.lepnr = a_lepnr or(pa_leping.asutnr = li_asutnr and li_yld_puhkisik = 1)) and
             (pa_tasu.yksusnr = a_yksusnr or li_yld_puhklep = 1) and
             (pa_tasu.a_aasta > li_a_aasta1 or(pa_tasu.a_aasta = li_a_aasta1 and pa_tasu.a_akuu >= li_a_akuu1)) and
             (pa_tasu.a_aasta < li_a_aasta2 or(pa_tasu.a_aasta = li_a_aasta2 and(pa_tasu.a_akuu <= li_a_akuu2)))
        group by pa_tasu.tasunr,pa_vtas_s,pa_tasu.vparyldnr,pa_tasu.a_akuu,pa_tasu.a_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;


    -- paevad
    per_loop: while ld_akuup <= ld_lkuup loop
      if not exists(select 1 from gl_pa_tasu where gl_pa_tasu.a_akuu = MONTH(ld_akuup) and gl_pa_tasu.a_aasta = YEARS(ld_akuup)) then
        insert into gl_pa_tasu( tasunr,lepnr,vtas_s,vparyldnr,a_akuu,a_aasta,summa,paevi) values( 0,a_lepnr,0,0,MONTH(ld_akuup),YEARS(ld_akuup),0,0)
      end if;
      set li_dow=dow(ld_akuup);
      if(a_algol='1i' or a_algol='1e'or a_algol='1p') or((a_algol='1k' or a_algol='1d') and(li_dow > 1 and li_dow < 7)) then
        if li_yld_puhkisik = 1 then
          set li_peat=pa_peat_kesk_asut(ld_akuup,li_asutnr)
        else
          set li_peat=pa_peat_kesk(ld_akuup,a_lepnr)
        end if;
        if(li_peat) = 0 then
          if a_algol='1p' or not exists(select 1 from pyhalist where pyhalist.pyhakuup = ld_akuup) then
            update first gl_pa_tasu set gl_pa_tasu.paevi = gl_pa_tasu.paevi+1 where gl_pa_tasu.a_akuu = MONTH(ld_akuup) and gl_pa_tasu.a_aasta = YEARS(ld_akuup)
          end if
        end if
      end if;
      set ld_akuup=Days(ld_akuup,1)
    end loop per_loop;
  end if
end