ALTER PROCEDURE "dba"."pa_tastab"(in a_id_yksus integer,in a_skoop integer,in a_palgaleht integer,in a_pl_aasta 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_kulnr integer,in a_talnr integer,in a_tulnr integer,in a_objectnr integer,in a_osaknr integer,in a_suundnr integer,in a_statnr integer, in a_tas_s integer default 0, in a_t_paev integer, in a_valver smallint default 1, in a_skoopkood char(16) default '', in a_yksuskood char(16) default '')
begin
  declare ldc_summa numeric(15,2);
  declare ldc_par1 numeric(15,2);
  declare ldc_tulumaks numeric(15,2);
  declare ldc_tvtkmaks numeric(15,2);
  declare ldc_pensmaks numeric(15,2);
  declare ldc_tatkmaks numeric(15,2);
  declare ldc_sotsmaks numeric(15,2);
  declare li_tas_s integer;
  declare li_sisse smallint;
  declare li_sisse2 smallint;
  declare ls_algol char(2);
  declare ls_nimi char(50);
  declare li_lepnr integer;
  declare ls_nimi1 char(50);
  declare ls_ptk char(16);
  declare li_ptk integer;
  declare ls_talosa char(16);
  declare li_talosa integer;
  declare ls_osa char(16);
  declare li_osa integer;
  declare ls_object char(16);
  declare li_object integer;
  declare ls_osak char(16);
  declare li_osak integer;
  declare ls_suund char(16);
  declare li_suund integer;
  declare ls_stat char(16);
  declare li_stat integer;
  declare err_notfound exception for sqlstate value '02000';
  declare c_pa_tasu dynamic scroll cursor for
    select get_asulist_nimi(pa_leping.asutnr),
           pa_tasu.lepnr,
           pa_taslist.tas_s,
           pa_taslist.nimi,
           pa_taslist.sisse,
           pa_taslist.algol,
           pa_tasu.summa,
           pa_tasu.par1,
           pa_tasu.tulumaks,
           pa_tasu.tvtkmaks,
           pa_tasu.pensmaks,
           pa_tasu.tatkmaks,
           pa_tasu.sotsmaks
      from pa_tasu left outer join pa_plnr on pa_tasu.v_aasta=pa_plnr.v_aasta and pa_tasu.palgaleht=pa_plnr.palgaleht
                   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 pa_kaader on pa_leping.asutnr = pa_kaader.asutnr
                   left outer join pa_yksus on pa_tasu.yksusnr = pa_yksus.yksusnr
                   left outer join kullist on pa_yksus.kulnr = kullist.kulnr
                   left outer join tallist on pa_yksus.talnr = tallist.talnr
                   left outer join tullist on pa_yksus.tulnr = tullist.tulnr
                   left outer join objlist on pa_yksus.objectnr = objlist.objectnr
                   left outer join osaklist on pa_yksus.osaknr = osaklist.osaknr
                   left outer join suundlist on pa_yksus.suundnr = suundlist.suundnr
                   left outer join statlist on pa_yksus.statnr = statlist.statnr
                   left outer join skoobid on pa_yksus.skoop=skoobid.skoop
      where (pa_tasu.yksusnr = a_id_yksus or a_id_yksus = 0) and Left(pa_yksus.kood,Length(a_yksuskood))=a_yksuskood and
            (pa_yksus.skoop = a_skoop or a_skoop = 0) and Left(skoobid.kood,Length(a_skoopkood))=a_skoopkood and
            ((pa_tasu.palgaleht = a_palgaleht and pa_tasu.v_aasta = a_pl_aasta) or a_palgaleht = 0) and
            (pa_tasu.tas_s = a_tas_s or a_tas_s = 0) and
            (pa_plnr.t_paev = a_t_paev or a_t_paev = 0) and
            (pa_tasu.t_akuu = a_t_akuu or a_t_akuu = 0) and
            (pa_tasu.t_aasta = a_t_aasta or a_t_aasta = 2001) and
            (pa_tasu.a_akuu = a_a_akuu or a_a_akuu = 0) and(pa_tasu.a_aasta = a_a_aasta or a_a_aasta = 2001) and
            (pa_tasu.v_akuu = a_v_akuu or a_v_akuu = 0) and(pa_tasu.v_aasta = a_v_aasta or a_v_aasta = 2001) and
            ("Left"(kullist.ptk,li_ptk) = ls_ptk or a_kulnr = 0) and
            ("Left"(tallist.osa,li_talosa) = ls_talosa or a_talnr = 0) and
            ("Left"(tullist.osa,li_osa) = ls_osa or a_tulnr = 0) and
            ("Left"(objlist.object,li_object) = ls_object or a_objectnr = 0) and
            ("Left"(osaklist.osak,li_osak) = ls_osak or a_osaknr = 0) and
            ("Left"(suundlist.suund,li_suund) = ls_suund or a_suundnr = 0) and
            ("Left"(statlist.stat,li_stat) = ls_stat or a_statnr = 0);
  delete from gl_tr_tastab;
  if a_kulnr > 0 then
    select trim(kullist.ptk) into ls_ptk from kullist where kullist.kulnr = a_kulnr;
    set li_ptk=Length(ls_ptk);
    if li_ptk is null or li_ptk = 0 then
      set a_kulnr=0
    end if
  end if;
  if a_talnr > 0 then
    select trim(tallist.osa) into ls_talosa from tallist where tallist.talnr = a_talnr;
    set li_talosa=Length(ls_talosa);
    if li_talosa is null or li_talosa = 0 then
      set a_talnr=0
    end if
  end if;
  if a_tulnr > 0 then
    select trim(tullist.osa) into ls_osa from tullist where tullist.tulnr = a_tulnr;
    set li_osa=Length(ls_osa);
    if li_osa is null or li_osa = 0 then
      set a_tulnr=0
    end if
  end if;
  if a_objectnr > 0 then
    select trim(objlist.object) into ls_object from objlist where objlist.objectnr = a_objectnr;
    set li_object=Length(ls_object);
    if li_object is null or li_object = 0 then
      set a_objectnr=0
    end if
  end if;
  if a_osaknr > 0 then
    select trim(osaklist.osak) into ls_osak from osaklist where osaklist.osaknr = a_osaknr;
    set li_osak=Length(ls_osak);
    if li_osak is null or li_osak = 0 then
      set a_osaknr=0
    end if
  end if;
  if a_suundnr > 0 then
    select trim(suundlist.suund) into ls_suund from suundlist where suundlist.suundnr = a_suundnr;
    set li_suund=Length(ls_suund);
    if li_suund is null or li_suund = 0 then
      set a_suundnr=0
    end if
  end if;
  if a_statnr > 0 then
    select trim(statlist.stat) into ls_stat from statlist where statlist.statnr = a_statnr;
    set li_stat=Length(ls_stat);
    if li_stat is null or li_stat = 0 then
      set a_statnr=0
    end if
  end if;
  open c_pa_tasu;
  pa_tasu_loop: loop
    --  loe kanne
    fetch next c_pa_tasu into ls_nimi1,li_lepnr,li_tas_s,ls_nimi,li_sisse,ls_algol,ldc_summa,ldc_par1,ldc_tulumaks,ldc_tvtkmaks,ldc_pensmaks,ldc_tatkmaks,ldc_sotsmaks;
    if sqlstate = err_notfound then -- kui eof
      leave pa_tasu_loop
    end if;
    if ldc_par1 is null then
      set ldc_par1=0
    end if;
    -- summa
    if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = li_tas_s) then
      if li_sisse = 0 then
        set li_sisse2=1
      else
        set li_sisse2=5
      end if;
      insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( li_sisse2,li_lepnr,li_tas_s,ls_nimi1,ls_nimi,0) 
    end if;
    update gl_tr_tastab set summa = summa+ldc_summa where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = li_tas_s;
    -- tulumaks
    if ldc_tulumaks <> 0 and a_tas_s=0 then
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -1) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 6,li_lepnr,-1,ls_nimi1,'Tulumaks',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_tulumaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -1
      else
        update gl_tr_tastab set summa = summa-ldc_tulumaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -1
      end if
    end if;
    -- toovotja tootuskindlustus
    if ldc_tvtkmaks <> 0 and a_tas_s=0 then
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -2) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 7,li_lepnr,-2,ls_nimi1,'Töövõtja töötuskindlustus',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_tvtkmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -2
      else
        update gl_tr_tastab set summa = summa-ldc_tvtkmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -2
      end if
    end if;
    -- kogumispension
    if ldc_pensmaks <> 0 and a_tas_s=0 then
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -3) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 8,li_lepnr,-3,ls_nimi1,'Kogumispension',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_pensmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -3
      else
        update gl_tr_tastab set summa = summa-ldc_pensmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -3
      end if
    end if;
    if  a_tas_s=0 then
      -- kokku arvestatud
      if li_sisse = 0 then
        if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -5) then
          insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 3,li_lepnr,-5,ls_nimi1,'Kokku arvestatud',0) 
        end if;
        update gl_tr_tastab set summa = summa+ldc_summa where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -5
      end if;
      -- kokku kinnipeetud
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -6) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 9,li_lepnr,-6,ls_nimi1,'Kokku kinnipeetud',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_tulumaks+ldc_tvtkmaks+ldc_pensmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -6
      else
        update gl_tr_tastab set summa = summa+ldc_summa-ldc_tulumaks-ldc_tvtkmaks-ldc_pensmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -6
      end if;
      -- kassasse tasumiseks
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -7) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 10,li_lepnr,-7,ls_nimi1,'Kassasse tasumiseks',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_summa-ldc_tulumaks-ldc_tvtkmaks-ldc_pensmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -7
      else
        update gl_tr_tastab set summa = summa-ldc_summa+ldc_tulumaks+ldc_tvtkmaks+ldc_pensmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -7
      end if
    end if;
    -- tooandja tootuskindlustus
    if ldc_tatkmaks <> 0 and a_tas_s=0 then
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -11) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 11,li_lepnr,-11,ls_nimi1,'Tööandja töötuskindlustus',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_tatkmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -11
      else
        update gl_tr_tastab set summa = summa-ldc_tatkmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -11
      end if
    end if;
    -- sotsmaks
    if ldc_sotsmaks <> 0 and a_tas_s=0 then
      if not exists(select 1 from gl_tr_tastab where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -12) then
        insert into gl_tr_tastab( sisse,id1,id2,nimi1,nimi2,summa) values( 11,li_lepnr,-12,ls_nimi1,'Sotsiaalmaks',0) 
      end if;
      if li_sisse = 0 then
        update gl_tr_tastab set summa = summa+ldc_sotsmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -12
      else
        update gl_tr_tastab set summa = summa-ldc_sotsmaks where gl_tr_tastab.id1 = li_lepnr and gl_tr_tastab.id2 = -12
      end if
    end if;
  end loop pa_tasu_loop;
  close c_pa_tasu;
  delete from gl_tr_tastab where gl_tr_tastab.summa = 0
end