// JavaScript-Programm nach dem Programmablaufplan für die maschinelle Berechnung
// der vom Arbeitslohn einzubehaltenden Lohnsteuer, des Solidrätätszuschlags und
// der Maßstabsteuer für die Kirchenlohnsteuer 2006
// Version 20.11.2006
// Der Programmablaufplan findet sich auf den Internetseiten des BMF zum
// Herunterladen unter http://www.bundesfinanzministerium.de/cln_02/nn_304/DE/Aktuelles/BMF__Schreiben/Veroffentlichungen__zu__Steuerarten/lohnsteuer/046.html

    werte()

function werte() {   // Interne Felder, PAP 2006, S. 5ff.
    alte = 0
    anp = 0
    anteil1 = 0
    anteil2 = 0
    bmg = 0
    diff = 0
    efa = 0
    fvb = 0
    fvbz = 0
    hfvb = 0
    j = 0
    jmbg = 0
    jw = 0
    k = 0
    kennz = 0
    kfb = 0
    kztab = 0
    lstjahr = 0
    lst1 = 0
    lst2 =0
    mist = 0
    re4lzz = 0
    re4lzzv = 0
    rw = 0
    sap = 0
    solzfrei = 0
    solzj = 0
    solzmin = 0
    st = 0
    st1 = 0
    st2 = 0
    // definition tab1 usw. s. unten
    vbezb = 0
    vhb = 0
    vsp = 0
    vspn = 0
    vsp1 = 0
    vsp2 = 0
    vspkurz = 0
    vspmax1 = 0
    vspmax2 = 0
    vspo = 0
    vsprest = 0
    vspvor = 0
    x = 0
    y = 0
    zre4 = 0
    zre4vp = 0
    zre4vp1 = 0
    ztabfb = 0
    zvbez = 0
    zve = 0
    zx = 0
    zzx = 0
    hoch = 0
    vergl = 0

    tab1 = Array (0, 0.4, 0.384, 0.368, 0.352, 0.336, 0.32, 0.304, 0.288, 0.272, 0.256, 0.24, 0.224, 0.208, 0.192, 0.176, 0.16, 0.152, 0.144, 0.136, 0.128, 0.12, 0.112, 0.104, 0.096, 0.088, 0.08, 0.072, 0.064, 0.056, 0.048, 0.04, 0.032, 0.024, 0.016, 0.008, 0)
    tab2 = Array (0, 3000, 2880, 2760, 2640, 2520, 2400, 2280, 2160, 2040, 1920, 1800, 1680, 1560, 1440, 1320, 1200, 1140, 1080, 1020, 960, 900, 840, 780, 720, 660, 600, 540, 480, 420, 360, 300, 240, 180, 120, 60, 0)
    tab3= Array (0, 900, 864, 828, 792, 756, 720, 684, 648, 612, 576, 540, 504, 468, 432, 396, 360, 342, 324, 306, 288, 270, 252, 234, 216, 198, 180, 162, 144, 126, 108, 90, 72, 54, 36, 18, 0)
    tab4 = tab1
    tab5 = Array (0,1900, 1824, 1748, 1672, 1596, 1520, 1444, 1368, 1292, 1216, 1140, 1064, 988, 912, 836, 760, 722, 684, 646, 608, 570, 532, 494, 456, 418, 380, 342, 304, 266, 228, 190, 152, 114, 76, 38, 0)

    // --- Eingangsparameter  PAP 2006, S. 3ff.

    ajahr = 0
    alter1 = 0  //unnötige Konstante, da Alter mit ajahr bestimmt ist
    hinzur = 0
    jfreib = 0
    jhinzu = 0
    krv = 0
    lzz = 1
    r = 0
    re4 = 0
    sonstb = 0
    sterbe = 0
    stkl = 1
    vbez = 0
    vbezm = 0
    vbezs = 0
    vbs = 0
    vjahr = 2006
    vkapa = 0
    vmt = 0
    wfundf = 0
    zkf = 0
    zvmb = 0
    jvbez = 0
    jsonstb = 0

    // --- eigene Parameter
    gebj = 0  // Geburtsjahr
    kist = 0  // Kirchensteuersatz

    // --- Ausgangsparameter, PAP 2006, S. 5

    bk = 0
    bks = 0
    bkv = 0
    lstlzz = 0
    solzlzz = 0
    solzs = 0
    solzv = 0
    sts = 0
    stv = 0
}

  function lst2006() {  //Programmablaufplan 2006, Steuerung S.9
    mre4lzz()
    kennz = 0
    re4lzz = re4 - fvb - alte - wfundf + hinzur
    re4lzzv = re4 - fvb - alte
    mre4()
    mztabfb()
    mlstjahr()
    lstjahr = st
    jw = lstjahr * 100
    upanteil()
    lstlzz = anteil1
    if (zkf > 0) {
       ztabfb = ztabfb + kfb
       mlstjahr()
       jbmg = st
     }
     else
       jbmg = lstjahr
    msolz()
    msonst()
    mvmt()
  }

  function mre4lzz() {
  // //Freibetraege fuer Versorgungsbezuege, Altersentlastungsbetrag (§39b Abs. 2 Satz 2 EStG) PAP Seite 10

    if (vbez == 0) {
       fvbz = 0
       fvb = 0
       }
     else {
       if (vjahr < 2006)
          j = 1
        else {
          if (vjahr < 2040)
             j = vjahr - 2004
          else
             j = 36
        }

       if (lzz == 1) {
          if (sterbe + vkapa > 0) {
             vbezb = vbezm * zmvb + vbezs
             hfvb = tab2[j] * 100
             fvbz = tab3[j]
          }
            else {
             vbezb = vbezm * zmvb + vbezs
             hfvb = tab2[j] / 12 * zmvb * 100
             fvbz = Math.ceil(tab3[j] / 12 * zmvb)
          }
         }
        else {
          vbezb = vbezm * 12 + vbezs
          hfvb = tab2[j] * 100
          fvbz = tab3[j]
       }
       fvb = Math.ceil(vbez * tab1[j]*100)/100
       if (fvb > hfvb)
          fvb = hfvb
       jw = fvb
       upanteil()
       fvb = anteil2
    }

    if (alter1 == 0)
       alte = 0

    else {
       if (ajahr < 2006)
          k = 1
       else {
          if (ajahr < 2040)
             k = ajahr - 2004
          else
             k = 36
      }

       bmg = re4 - vbez
       alte = Math.ceil(bmg * tab4[k])
       jw = tab5[k] * 100
       upanteil()
       if (alte > anteil2)
          alte = anteil2
   }
 }

 function mre4() {
 //Massgeblicher Arbeitslohn fuer die Jahreslohnsteuer PAP Seite 12

    if (lzz == 1) {
       zre4 = Math.floor(re4lzz) / 100
       zre4vp = Math.floor(re4lzzv) / 100
       zvbez = Math.floor(vbez - fvb) / 100
    }
    if (lzz == 2) {
       zre4 = Math.floor((re4lzz + 0.67) * 12)/100
       zre4vp = Math.floor((re4lzzv + 0.67) * 12)/100
       zvbez = Math.floor((vbez - fvb + 0.67) * 12)/100
    }
    if (lzz == 3) {
       zre4 = Math.floor((re4lzz + 0.89) * 360 / 7)/100
       zre4vp = Math.floor((re4lzzv + 0.89) * 360 / 7)/100
       zvbez = Math.floor((vbez - fvb + 0.89) * 360 / 7)/100
    }
    if (lzz == 4) {
       zre4 = Math.floor((re4lzz + 0.56) * 360)/100
       zre4vp = Math.floor((re4lzzv + 0.56) * 360)/100
       zvbez = Math.floor((vbez - fvb + 0.56) * 360)/100
    }
    if (zre4 < 0)
        zre4 = 0

    if (zvbez <=0 || vbez<=0) //abweichend vom PAP
        zvbez = 0
}

  function mztabfb() {
  //Ermittlung der festen Tabellenfreibetraege (ohne Vorsorgepauschale) PAP Seite 13

    anp = 0
    if (vbez > 0) {
       if (zvbez < fvbz)
          fvbz = zvbez
    }
    if (stkl < 6) {
       if (zvbez > 0) {
          if (zvbez - fvbz < 102)
             anp = zvbez - fvbz
            else
             anp = 102
       }
    }
    if (stkl < 6) {
       if (zre4 > zvbez) {
          if (zre4 - zvbez < 920)
             anp = anp + zre4 - zvbez
            else
             anp = anp + 920
       }
    }

       kztab = 1
   if (stkl == 1) {
       sap = 36
       kfb = zkf * 5808
    }
    if (stkl == 2) {
       efa = 1308
       sap = 36
       kfb = zkf * 5808
    }
    if (stkl == 3) {
       kztab = 2
       sap = 72
       kfb = zkf * 5808
   }
    if (stkl == 4) {
       sap = 36
       kfb = zkf * 2904
    }
    if (stkl == 5)
       kfb = 0

    if (stkl == 6)
       kfb = 0

    ztabfb = efa + anp + sap + fvbz
 }


  function mlstjahr() { //Ermittlung der Jahreslohnsteuer, PAP S. 14

    if (stkl < 5)
       upevp()
     else
       vsp = 0

    zve = zre4 - ztabfb - vsp

    if (zve < 1) {
       zve = 0
       x = 0
     }
     else
       x = Math.floor(zve / kztab)  // auf Euro abrunden

     if (stkl < 5)
       uptab05()
     else
       mst5_6()
}

  function upevp() {
  // Vorsorgepauschale (§39b Abs. 2 Satz 6 Nr 3 EStG)PAP Seite 15

    if (krv == 1)
         vsp1 = 0
     else {
       if (zre4vp > 63000)
            zre4vp = 63000
       vsp1 = 0.24 * zre4vp
       vsp1 = vsp1 * 0.0975
    }
    vsp2 = 0.11 * zre4vp
    vhb = 1500 * kztab
    if (vsp2 > vhb)
       vsp2 = vhb
    vspn = Math.ceil(vsp1 + vsp2)  //auf Euro aufrunden
    mvsp()
    if (vspn > vsp)
       vsp = vspn
}

 function mvsp() {
 //Vorsorgepauschale (§39b Abs. 2 Satz 6 Nr 3 EStG) Vergleichsberechnung
 //fuer Guenstigerpruefung PAP Seite 16

    if (kennz == 1)
       vspo = zre4vp1 * 0.2
     else
       vspo = zre4vp * 0.2

    vspvor = 3068 * kztab
    vspmax1 = 1334 * kztab
    vspmax2 = 667 * kztab
    vspkurz = 1134 * kztab
    if (krv == 1) {
       if (vspo > vspkurz)
          vsp = vspkurz
        else
          vsp = Math.ceil(vspo)  // auf Euro aufrunden
       }
    else
       umvsp()
 }


  function umvsp() {  //Vorsorgepauschale, PAP 2006, S. 17

    if (kennz == 1)
       vspvor = vspvor - zre4vp1 * 0.16
     else
       vspvor = vspvor - zre4vp * 0.16

    if (vspvor < 0)
       vspvor = 0

    if (vspo > vspvor) {
       vsp = vspvor
       vsprest = vspo - vspvor

       if (vsprest > vspmax1) {
          vsp = vsp + vspmax1
          vsprest = Math.ceil((vsprest - vspmax1)*100) / 200   //auf Cent aufrunden
       if (vsprest > vspmax2)
          vsp = Math.ceil(vsp + vspmax2) //auf Euro aufrunden
       else
          vsp = Math.ceil(vsp + vsprest) //auf Euro aufrunden
        }
        else
            vsp = Math.ceil(vsp + vsprest) //auf Euro aufrunden
     }
     else
         vsp = Math.ceil(vspo) // auf Euro aufrunden
 }

    function mst5_6() {
    // Lohnsteuer fuer die Steuerklassen V und VI (§ 39b Abs. 2 Satz 8 EStG) PAP Seite 18

    zzx = x
    if (zzx > 25812) {
       zx = 25812
       up5_6()
       st = Math.floor(st + (zzx - 25812) * 0.42)
     }
     else {
       zx = zzx
       up5_6()
       if (zzx > 9144) {
          vergl = st
          zx = 9144
          up5_6()
          hoch = Math.floor(st + (zzx - 9144) * 0.42)
          if (hoch < vergl)
             st = hoch
           else
             st = vergl
        }
     }
  }

  function up5_6() {
    x = zx * 1.25
    uptab05()
    st1 = st
    x = zx * 0.75
    uptab05()
    st2 = st
    diff = (st1 - st2) * 2
    mist = Math.floor(zx * 0.15)
    if (mist > diff)
       st = mist
     else
       st = diff
 }

 function msolz() {   // Solidaritätszuschlag, PAP S. 19
    solzfrei = 972 * kztab
    if (jbmg > solzfrei) {
       solzj = jbmg * 5.5 / 100
       solzmin = (jbmg - solzfrei) * 20 / 100
       if (solzmin < solzj)
          solzj = solzmin
       jw = solzj * 100
       upanteil()
       solzlzz = anteil1
     }
     else
       solzlzz = 0

     if (r > 0){
       jw = jbmg * 100
       upanteil()
       bk = anteil1
       }
     else
       bk = 0
    }


 function upanteil() {  // Anteil der Jahresbeiträge für einen LZZ
                        // PAP 2006, S. 20
                        // Anteil1 abrunden, Anteil2 aufrunden
    if (lzz == 1) {
       anteil1 = jw
       anteil2 = jw
    }
    if (lzz == 2) {
       anteil1 = Math.floor(jw / 12)
       anteil2 = Math.ceil(jw / 12)
    }
    if (lzz == 3) {
       anteil1 = Math.floor(jw * 7 / 360)
       anteil2 = Math.ceil(jw * 7 / 360)
    }
    if (lzz == 4) {
       anteil1 = Math.floor(jw / 360)
       anteil2 = Math.ceil(jw / 360)
    }
  }

  function msonst() {  // Berechnung sonstiger Bezüge, PAP 2006, S. 21
    if (sonstb > 0) {
       lzz = 1
       vbez = jvbez
       re4 = jre4
       mre4lzz()
       mre4lzz2()
       mlstjahr()
       lst1 = st * 100
       vbez = jvbez + vbs
       re4 = jre4 + sonstb
       vbezs = vbezs + sterbe
       mre4lzz()
       mre4lzz2()
       mlstjahr()
       lst2 = st * 100
       sts = lst2 - lst1

       solzs = Math.floor(sts * 5.5 / 100)
       if (r > 0)
          bks = sts
        else
          bks = 0
     }
    else {
       sts = 0
       solzs = 0
       bks = 0
    }
}

 function mre4lzz2() {
     re4lzz = re4 - fvb - alte - jfreib + jhinzu
     re4lzzv = re4 - fvb - alte
     mre4()
     mztabfb()
}

function mvmt() {  // Berechnung der Vergütung für mehrjährige Tätigkeit
                   // PAP 2006, S. 22
    if (vmt + vkapa > 0) {
       lzz = 1
       vbez = jvbez + vbs
       re4 = jre4 + sonstb
       mre4lzz()
       mre4lzz2()
       mlstjahr()
       lst1 = st * 100
       vmt = vmt + vkapa
       vbezs = vbezs + vkapa
       vbez = vbez + vkapa
       re4 = jre4 + sonstb + vmt
       mre4lzz()
       mre4lzz2()
       kennz = 1
       zre4vp1 = zre4vp
       mlstjahr()
       lst3 = st * 100
       vbez = vbez - vkapa
       re4 = jre4 + sonstb
       mre4lzz()
       if (re4 - jfreib + jhinzu < 0) {
          re4 = re4 - jfreib + jhinzu
          jfreib = 0
          jhinzu = 0
          re4 = (re4 + vmt) / 5
          mre4lzz2()
          mlstjahr()
          lst2 = st * 100
          stv = lst2 * 5
        }
        else {
          re4 = re4 + vmt / 5
          mre4lzz2()
          mlstjahr()
          lst2 = st * 100
          stv = (lst2 - lst1) * 5
        }
       lst3 = lst3 - lst1
       if (lst3 < stv)
          stv = lst3
       solzv = Math.floor(stv * 5.5 / 100)
       if (r > 0)
          bkv = stv
        else
          bkv = 0
     }
     else {
       stv = 0
       solzv = 0
       bkv = 0
    }
 }

 function uptab05() {  //Tarifliche Einkommensteuer, PAP 2006, S. 23
    if (x < 7665)
          st = 0
        else {
        if (x < 12740) {
           y = (x - 7664) / 10000
           rw = y * 883.74
           rw = Math.floor(rw * 1000) / 1000
           rw = rw + 1500
           st = Math.floor(rw * y)
         }
         else {
           if (x < 52152) {
              y = (x - 12739) / 10000
              rw = y * 228.74
              rw = Math.floor(rw * 1000) / 1000
              rw = rw + 2397
              rw = rw * y
              st = Math.floor(rw + 989)
            }
               else
                st = Math.floor(x * 0.42 - 7914)
           }
       }
    st = st * kztab
}
