← Alle Beispiele
Kraftfahrzeugsteuer

Pkw-Tarif · CO₂ + Hubraum

Mehrdimensionaler Tarif: Antriebsart, Schadstoffklasse, Hubraum, CO₂. Realistische wähle-Tiefe.

Gesetzlicher Rahmen

Das Modul bildet die Jahressteuer nach §§ 8, 9 KraftStG vollständig ab: § 8 wählt anhand der Fahrzeugart die Bemessungsgrundlage (Hubraum, CO₂ oder Gesamtgewicht), § 9 Abs. 1 liefert den Tarifbetrag, Abs. 2 die 50-%-Ermäßigung für Elektro-Nutzfahrzeuge, und §§ 3a / 3d regeln Vergünstigung und Befreiung. Progressive Tarife rechnen je angefangene 200-kg-Stufe — die kumulierten Stufenbeträge sind als auditierbare Konstanten abgeleitet.

  1. 1 § 9 Abs. 1 Tarifbetrag nach Fahrzeugart (§ 8) TarifNach9Abs1
  2. 2 § 9 Abs. 2 50 % für Elektro-Nutzfahrzeuge _Anwende9Abs2
  3. 3 § 3a / § 3d Schwerbehinderte / Elektro-Befreiung _AnwendeVerguenstigung

Quelle: KraftStG 2002, i. d. g. F. Die Zuordnung der Schadstoff-/ Erstzulassungsklasse trifft nach § 2 Abs. 2 die Zulassungsbehörde — sie geht als geprüfte Eingabe ein.

Tarifauswahl · § 9 Abs. 1

Ein wähle-Ausdruck über die Fahrzeugart bestimmt die einschlägige Nummer des § 9 Abs. 1 und delegiert an die zuständige Tariffunktion:

  • Krafträder Nr. 1 SteuerKraftrad
  • Personenkraftwagen Nr. 2 SteuerPkw
  • Wohnmobile Nr. 2a SteuerWohnmobil
  • dreirädr. / leichte vierr. Kfz Nr. 2b SteuerDreiLeichtvier
  • andere Kfz ≤ 3.500 kg Nr. 3 SteuerNr3
  • andere Kfz > 3.500 kg Nr. 4 SteuerNr4
  • Anhänger Nr. 5 SteuerAnhaenger
@Quelle("§ 9 Absatz 1 KraftStG")
fn TarifNach9Abs1(f: Fahrzeug): EuroCent = wähle (f.art) {
    falls Kraftrad        -> SteuerKraftrad(f.hubraumCcm)
    falls Pkw             -> SteuerPkw(f)
    falls Wohnmobil       -> SteuerWohnmobil(f.gesamtgewichtKg, f.wohnmobilklasse)
    falls DreiLeichtvier  -> SteuerDreiLeichtvier(f.hubraumCcm, f.dreiradGrenzwerte, f.antrieb)
    falls AndereBis3500   -> SteuerNr3(f.gesamtgewichtKg)
    falls AndereUeber3500 -> SteuerNr4(f.gesamtgewichtKg, f.nfzklasse)
    falls Anhaenger       -> SteuerAnhaenger(f.gesamtgewichtKg)
}

Die Gesamtberechnung · § 9

Der Orchestrator wendet Tarif, Elektro-Ermäßigung und Vergünstigung in gesetzlicher Reihenfolge an und legt jede Zwischengröße als eigenes Feld ab.

@Quelle("§ 9 KraftStG")
fn BerechneKraftfahrzeugsteuer(f: Fahrzeug): KraftfahrzeugsteuerErgebnis {
    var tarif: EuroCent = TarifNach9Abs1(f)
    var nachE: EuroCent = _Anwende9Abs2(f, tarif)
    var jahr: EuroCent = _AnwendeVerguenstigung(f, nachE)
    KraftfahrzeugsteuerErgebnis(
        tarifbetrag  = tarif,
        nachElektro  = nachE,
        jahressteuer = jahr,
    )
}

Das vollständige Modul

Die Implementierung ist auf vier kohäsive Dateien aufgeteilt (azyklischer Modul-Graph: typen ← Tariffunktionen ← Einstieg) — unverändert aus findsl/findsl übernommen.

Einstieg · § 9 Orchestrierung kraftst.findsl · 183 Zeilen
--
# Kraftfahrzeugsteuer — vollständiger Jahressteuer-Tarif (§§ 8, 9 KraftStG)

Bildet die **Jahressteuer** nach dem Kraftfahrzeugsteuergesetz
(KraftStG 2002, i.d.g.F.) vollständig ab:

- **§ 8 KraftStG** — Bemessungsgrundlage (Hubraum / CO₂ / zulässiges
  Gesamtgewicht je nach Fahrzeugart) → Auswahl des Tarifs.
- **§ 9 Abs. 1 KraftStG** — Steuersatz, alle Nummern:
  Nr. 1 Krafträder · Nr. 2 a/b/c Personenkraftwagen (Erstzulassung
  bis 30.6.2009 / 1.7.2009–31.12.2020 / ab 1.1.2021) · Nr. 2a
  Wohnmobile · Nr. 2b dreirädrige/leichte vierrädrige Kfz · Nr. 3
  andere Kfz ≤ 3.500 kg · Nr. 4 a/b/c/d Kfz > 3.500 kg · Nr. 5
  Anhänger.
- **§ 9 Abs. 2 KraftStG** — 50 % Ermäßigung für Elektrofahrzeuge
  (nur Beträge nach Abs. 1 Nr. 3 oder Nr. 4 Buchst. a).
- **§ 9 Abs. 3 KraftStG** — Tagessteuer für ausländische Fahrzeuge.
- **§ 9 Abs. 4 KraftStG** — Jahressteuer für rote / Oldtimer-Kennzeichen.
- **§ 3a KraftStG** — Vergünstigungen für Schwerbehinderte
  (Abs. 1 volle Befreiung · Abs. 2 50 % Ermäßigung).
- **§ 3d KraftStG** — Steuerbefreiung für Elektrofahrzeuge
  (Erstzulassung 18.5.2011–31.12.2030: 10 Jahre, längstens bis
  31.12.2035).
- **§ 9a KraftStG** — Diesel-Zuschlag: ausgelaufen (galt nur
  1.4.2007–31.3.2011); wird nicht mehr angewandt (dokumentiert).

**Progressive Tarife** (Nr. 2a/3/4) werden je angefangene 200-kg-Stufe
in der jeweiligen Gewichtsspanne berechnet; die kumulierten
Stufenbeträge sind als auditierbare Konstanten aus den Stufensätzen
abgeleitet (keine handsummierten Werte). „Je angefangene Einheit"
nutzt das Stdlib-Builtin `aufrunden`.

**Bewusst nicht modelliert (dokumentiert, außerhalb der reinen
Steuerbetragsberechnung):** Verfahren §§ 11/12 (Entrichtung,
Festsetzung), Mindestdauer/anteilige Berechnung § 5, Ausnahmekatalog
§ 3, widerrechtliche Benutzung. Die Zuordnung der Schadstoff-/
Geräusch-/Erstzulassungsklasse trifft nach § 2 Abs. 2 Nr. 2 KraftStG
**verbindlich die Zulassungsbehörde** — sie geht hier als geprüfte
Eingabe ein (nicht aus EU-Richtlinien hergeleitet).
--

// ===========================================================================
// Modul-Struktur (Implementierung auf mehrere Dateien aufgeteilt)
// ===========================================================================
// Diese Datei ist die öffentliche Einstiegsdatei (Orchestrierung der
// gesetzlichen Reihenfolge § 9 Abs. 1 Auswahl → Abs. 2 → § 3a/§ 3d →
// Gesamt) plus die § 9 Abs. 4-Konstanten (rote/Oldtimer-Kennzeichen).
// Die Tarifdetails liegen in kohäsiven Geschwisterdateien:
//   - kraftstg-typen.fin              Aufzählungen, Datensätze, Helfer
//   - kraftstg-tarif-leicht.fin       § 9 Abs. 1 Nr. 1/2/2a/2b (Konst.+Fn.)
//   - kraftstg-tarif-nutzfahrzeug.fin § 9 Abs. 1 Nr. 3/4/5     (Konst.+Fn.)
// Modul-Graph (azyklisch): kraftstg-typen ← {kraftstg-tarif-leicht,
// kraftstg-tarif-nutzfahrzeug} ← kraftstg-steuer.

verwende {
    Fahrzeug,
    KraftfahrzeugsteuerErgebnis,
    Kraftrad,
    Pkw,
    Wohnmobil,
    DreiLeichtvier,
    AndereBis3500,
    AndereUeber3500,
    Anhaenger,
    Elektro,
    MindestensS2,
    Befreit3aAbs1,
    Ermaessigt3aAbs2,
} aus "./kraftstg-typen"

verwende {
    SteuerKraftrad,
    SteuerPkw,
    SteuerWohnmobil,
    SteuerDreiLeichtvier,
} aus "./kraftstg-tarif-leicht"

verwende {
    SteuerNr3,
    SteuerNr4,
    SteuerAnhaenger,
} aus "./kraftstg-tarif-nutzfahrzeug"

// ===========================================================================
// § 9 Abs. 4 — rote / Oldtimer-Kennzeichen
// ===========================================================================

-- Rotes/Oldtimer-Kennzeichen, nur für Krafträder gültig (Jahressteuer). --
@Quelle("§ 9 Absatz 4 Nummer 1 KraftStG")
konst KZ_NUR_KRAD: EuroCent = 46,02

-- Rotes/Oldtimer-Kennzeichen, im Übrigen (Jahressteuer). --
@Quelle("§ 9 Absatz 4 Nummer 2 KraftStG")
konst KZ_UEBRIGE: EuroCent = 191,73

// ===========================================================================
// § 9 Abs. 1 — Tarifauswahl nach Fahrzeugart (§ 8 KraftStG)
// ===========================================================================

--
Tarifbetrag nach § 9 Abs. 1 KraftStG: wählt anhand der Fahrzeugart
(§ 8 KraftStG) die einschlägige Nummer.

@param f  Fahrzeug-Eingaben.
@rückgabe Steuer nach § 9 Abs. 1 KraftStG (vor Abs. 2 / § 3a / § 3d).
--
@Quelle("§ 9 Absatz 1 KraftStG")
fn TarifNach9Abs1(f: Fahrzeug): EuroCent = wähle (f.art) {
    falls Kraftrad        -> SteuerKraftrad(f.hubraumCcm)
    falls Pkw             -> SteuerPkw(f)
    falls Wohnmobil       -> SteuerWohnmobil(f.gesamtgewichtKg, f.wohnmobilklasse)
    falls DreiLeichtvier  -> SteuerDreiLeichtvier(f.hubraumCcm, f.dreiradGrenzwerte, f.antrieb)
    falls AndereBis3500   -> SteuerNr3(f.gesamtgewichtKg)
    falls AndereUeber3500 -> SteuerNr4(f.gesamtgewichtKg, f.nfzklasse)
    falls Anhaenger       -> SteuerAnhaenger(f.gesamtgewichtKg)
}

// ===========================================================================
// § 9 Abs. 2 — Elektrofahrzeug-Ermäßigung; § 3a / § 3d — Vergünstigungen
// ===========================================================================

--
50 %-Ermäßigung für Elektrofahrzeuge nach § 9 Abs. 2 KraftStG — gilt
ausschließlich für Beträge nach § 9 Abs. 1 Nr. 3 oder Nr. 4 Buchst. a
(Nutzfahrzeuge). Für alle anderen Fahrzeugarten/Klassen bleibt der
Betrag unverändert (reine Elektro-PKW sind regelmäßig nach § 3d
befreit).

@param f      Fahrzeug-Eingaben.
@param betrag Tarifbetrag nach § 9 Abs. 1 KraftStG.
@rückgabe     Betrag nach § 9 Abs. 2 KraftStG.
--
@Quelle("§ 9 Absatz 2 KraftStG")
fn _Anwende9Abs2(f: Fahrzeug, betrag: EuroCent): EuroCent = wähle {
    falls f.antrieb == Elektro und f.art == AndereBis3500   -> (betrag / 2) als EuroCent
    falls f.antrieb == Elektro und f.art == AndereUeber3500
        und f.nfzklasse == MindestensS2                     -> (betrag / 2) als EuroCent
    sonst                                                   -> betrag
}

--
Anwendung der Schwerbehinderten-Vergünstigung (§ 3a KraftStG) und der
Elektrofahrzeug-Befreiung (§ 3d KraftStG) auf den Steuerbetrag.
Reihenfolge: § 3d-Befreiung und § 3a Abs. 1-Befreiung setzen die
Steuer auf 0; § 3a Abs. 2 halbiert.

@param f      Fahrzeug-Eingaben.
@param betrag Betrag nach § 9 Abs. 1/2 KraftStG.
@rückgabe     Festgesetzte Jahressteuer (0 bei Befreiung).
--
@Quelle("§ 3a KraftStG")
fn _AnwendeVerguenstigung(f: Fahrzeug, betrag: EuroCent): EuroCent = wähle {
    falls f.elektroBefreitNach3d            -> 0,00
    falls f.behinderung == Befreit3aAbs1    -> 0,00
    falls f.behinderung == Ermaessigt3aAbs2 -> (betrag / 2) als EuroCent
    sonst                                   -> betrag
}

// ===========================================================================
// Gesamtberechnung
// ===========================================================================

--
Vollständige Festsetzung der Kraftfahrzeug-Jahressteuer in der
gesetzlichen Reihenfolge: § 8 (Tarifauswahl) → § 9 Abs. 1
(Tarifbetrag) → § 9 Abs. 2 (Elektro-Ermäßigung) → § 3a / § 3d
(Vergünstigung/Befreiung). Liefert alle Zwischengrößen.

@param f  Fahrzeug-Eingaben.
@rückgabe Vollständig dokumentiertes Berechnungsergebnis.
--
@Quelle("§ 9 KraftStG")
fn BerechneKraftfahrzeugsteuer(f: Fahrzeug): KraftfahrzeugsteuerErgebnis {
    var tarif: EuroCent = TarifNach9Abs1(f)
    var nachE: EuroCent = _Anwende9Abs2(f, tarif)
    var jahr: EuroCent = _AnwendeVerguenstigung(f, nachE)
    KraftfahrzeugsteuerErgebnis(
        tarifbetrag  = tarif,
        nachElektro  = nachE,
        jahressteuer = jahr,
    )
}
Aufzählungen, Datensätze, Helfer kraftstg-typen.findsl · 225 Zeilen
--
# Kraftfahrzeugsteuer — gemeinsame Typen und Helfer

Geteiltes Vokabular des KraftStG-Moduls (aus `kraftstg-steuer`
herausgelöst, damit die Hauptdatei nicht überlang wird): die
Fahrzeug-Klassifizierungs-Aufzählungen (§§ 8, 9, 3a KraftStG), der
Eingabe-Datensatz `Fahrzeug`, der Ergebnis-Datensatz
`KraftfahrzeugsteuerErgebnis` sowie die allgemeinen Berechnungshelfer
`einheiten` (je angefangene Einheit, § 9 KraftStG) und `begrenze`
(Höchstbetrags-Kappung, § 9 Abs. 1 KraftStG).

Importiert nichts (Blatt des Modul-Graphen); wird von den Tarif-Dateien
`kraftstg-tarif-leicht`, `kraftstg-tarif-nutzfahrzeug` und vom Orchestrator
`kraftstg-steuer` genutzt.
--

// ===========================================================================
// Datenstrukturen
// ===========================================================================

--
Fahrzeugart i.S.d. § 8 / § 9 Abs. 1 KraftStG — bestimmt, welcher
Tarif (welche Nummer des § 9 Abs. 1) anzuwenden ist.

@param Kraftrad        § 9 Abs. 1 Nr. 1: Krafträder (Hubkolbenmotor).
@param Pkw             § 9 Abs. 1 Nr. 2: Personenkraftwagen (M1) mit
                       Hubkolbenmotor.
@param Wohnmobil       § 9 Abs. 1 Nr. 2a: Wohnmobile.
@param DreiLeichtvier  § 9 Abs. 1 Nr. 2b: dreirädrige und leichte
                       vierrädrige Kraftfahrzeuge.
@param AndereBis3500   § 9 Abs. 1 Nr. 3: andere Kfz bis 3.500 kg.
@param AndereUeber3500 § 9 Abs. 1 Nr. 4: Kfz über 3.500 kg.
@param Anhaenger       § 9 Abs. 1 Nr. 5: Kraftfahrzeuganhänger.
--
@Quelle("§ 8 KraftStG")
aufzählung Fahrzeugart {
    Kraftrad,
    Pkw,
    Wohnmobil,
    DreiLeichtvier,
    AndereBis3500,
    AndereUeber3500,
    Anhaenger,
}

--
Antriebsart. § 9 unterscheidet Fremdzündungsmotor (Ottomotor/Benzin)
und Selbstzündungsmotor (Dieselmotor); `Elektro` steuert die
Ermäßigung/Befreiung (§ 9 Abs. 2, § 3d KraftStG).

@param Fremdzuendung  Fremdzündungsmotor (Ottomotor).
@param Selbstzuendung Selbstzündungsmotor (Dieselmotor).
@param Elektro        Elektrofahrzeug i.S.d. § 9 Abs. 2 KraftStG.
--
@Quelle("§ 9 Absatz 1 Nummer 2 KraftStG")
aufzählung Antrieb {
    Fremdzuendung,
    Selbstzuendung,
    Elektro,
}

--
Erstzulassungs-Regime des PKW — wählt den Buchstaben des
§ 9 Abs. 1 Nr. 2 KraftStG.

@param BisJuni2009    Erstzulassung bis 30.6.2009 (Buchst. a, Hubraum
                      + Schadstoffstufe aa–ee).
@param JuliBisDez2020 Erstzulassung 1.7.2009–31.12.2020 (Buchst. b,
                      Hubraum + CO₂ über datumsabhängiger Freigrenze).
@param AbJan2021      Erstzulassung ab 1.1.2021 (Buchst. c, Hubraum +
                      progressiver CO₂-Aufschlag ab 95 g/km).
--
@Quelle("§ 9 Absatz 1 Nummer 2 KraftStG")
aufzählung Erstzulassungsregime {
    BisJuni2009,
    JuliBisDez2020,
    AbJan2021,
}

--
Schadstoffstufe aa–ee für PKW mit Erstzulassung bis 30.6.2009
(§ 9 Abs. 1 Nr. 2 Buchst. a KraftStG). Die Einstufung trifft nach
§ 2 Abs. 2 Nr. 2 KraftStG verbindlich die Zulassungsbehörde.

@param Aa Doppelbuchst. aa (günstigste Stufe).
@param Bb Doppelbuchst. bb.
@param Cc Doppelbuchst. cc.
@param Dd Doppelbuchst. dd.
@param Ee Doppelbuchst. ee (höchste Stufe, keine Voraussetzungen).
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a KraftStG")
aufzählung PkwSchadstoffstufe {
    Aa,
    Bb,
    Cc,
    Dd,
    Ee,
}

--
Schadstoffklasse für Wohnmobile (§ 9 Abs. 1 Nr. 2a KraftStG).

@param MindestensS4 mindestens Schadstoffklasse S 4 (Buchst. a).
@param S1bisS3      Schadstoffklasse S 3, S 2 oder S 1 (Buchst. b).
@param WomoSonst    Voraussetzungen a/b nicht erfüllt (Buchst. c).
--
@Quelle("§ 9 Absatz 1 Nummer 2a KraftStG")
aufzählung WohnmobilKlasse {
    MindestensS4,
    S1bisS3,
    WomoSonst,
}

--
Schadstoff-/Geräuschklasse für Kfz > 3.500 kg
(§ 9 Abs. 1 Nr. 4 KraftStG). Verbindliche Feststellung der
Zulassungsbehörde (§ 2 Abs. 2 Nr. 2 KraftStG).

@param MindestensS2 mindestens Schadstoffklasse S 2 (Buchst. a).
@param S1           Schadstoffklasse S 1 (Buchst. b).
@param G1           Geräuschklasse G 1 (Buchst. c).
@param NfzSonst     Voraussetzungen a/b/c nicht erfüllt (Buchst. d).
--
@Quelle("§ 9 Absatz 1 Nummer 4 KraftStG")
aufzählung NfzKlasse {
    MindestensS2,
    S1,
    G1,
    NfzSonst,
}

--
Schwerbehinderten-Vergünstigung nach § 3a KraftStG.

@param Keine            keine Vergünstigung.
@param Befreit3aAbs1    volle Steuerbefreiung (Merkzeichen H, Bl, aG —
                        § 3a Abs. 1 KraftStG).
@param Ermaessigt3aAbs2 50 % Ermäßigung (orangefarbener Aufdruck,
                        § 3a Abs. 2 KraftStG).
--
@Quelle("§ 3a KraftStG")
aufzählung Behinderung {
    Keine,
    Befreit3aAbs1,
    Ermaessigt3aAbs2,
}

--
Eingaben eines Fahrzeugs für die Jahressteuer-Berechnung. Nicht jedes
Feld ist für jede Fahrzeugart relevant — maßgeblich ist `art`
(§ 8 KraftStG); die übrigen Felder gelten nur im jeweiligen Tarif.

@param art                  Fahrzeugart (§ 8 KraftStG) — wählt den Tarif.
@param antrieb              Antriebsart (Fremd-/Selbstzündung/Elektro).
@param hubraumCcm           Hubraum in cm³ (Nr. 1, Nr. 2, Nr. 2b).
@param co2GrammProKm        CO₂-Emission in g/km (Nr. 2 Buchst. b/c).
@param gesamtgewichtKg      verkehrsrechtlich zulässiges Gesamtgewicht
                            in kg (Nr. 2a, 3, 4, 5).
@param erstzulassung        Erstzulassungs-Regime des PKW (Nr. 2 a/b/c).
@param pkwStufe             Schadstoffstufe aa–ee (Nr. 2 Buchst. a).
@param co2FreigrenzeNr2b    datumsabhängige CO₂-Freigrenze g/km für
                            Nr. 2 Buchst. b (120 bis 31.12.2011 / 110
                            ab 1.1.2012 / 95 ab 1.1.2014).
@param dreiradGrenzwerte    Dreirad/leichtes Vierrad: Grenzwerte
                            eingehalten? (Nr. 2b a vs. b).
@param wohnmobilklasse      Schadstoffklasse des Wohnmobils (Nr. 2a).
@param nfzklasse            Schadstoff-/Geräuschklasse > 3.500 kg (Nr. 4).
@param behinderung          Schwerbehinderten-Vergünstigung (§ 3a).
@param elektroBefreitNach3d Steuerbefreiung nach § 3d KraftStG aktiv?
                            (datumsabhängig — verbindlich extern
                            festgestellt).
--
@Quelle("§ 8 KraftStG")
datensatz Fahrzeug(
    art:                  Fahrzeugart,                      // § 8 KraftStG: Tarifauswahl
    antrieb:              Antrieb,                          // Fremd-/Selbstzündung/Elektro
    hubraumCcm:           Ganzzahl             = 0,         // cm³ (Nr. 1, 2, 2b)
    co2GrammProKm:        Ganzzahl             = 0,         // g/km (Nr. 2 b/c)
    gesamtgewichtKg:      Ganzzahl             = 0,         // kg (Nr. 2a, 3, 4, 5)
    erstzulassung:        Erstzulassungsregime = AbJan2021, // PKW: § 9 Nr. 2 a/b/c
    pkwStufe:             PkwSchadstoffstufe   = Ee,        // PKW Nr. 2a: Stufe aa–ee
    co2FreigrenzeNr2b:    Ganzzahl             = 95,        // PKW Nr. 2b: Freigrenze g/km
    dreiradGrenzwerte:    Wahrheitswert        = falsch,    // Nr. 2b: Grenzwerte eingehalten?
    wohnmobilklasse:      WohnmobilKlasse      = WomoSonst, // Nr. 2a: Schadstoffklasse
    nfzklasse:            NfzKlasse            = NfzSonst,  // Nr. 4: Schadstoff-/Geräuschklasse
    behinderung:          Behinderung          = Keine,     // § 3a KraftStG
    elektroBefreitNach3d: Wahrheitswert        = falsch,    // § 3d KraftStG aktiv?
)

--
Vollständige, prüfbare Berechnung der Kraftfahrzeug-Jahressteuer.

@param tarifbetrag  Steuer nach § 9 Abs. 1 KraftStG (vor § 9
                    Abs. 2 / § 3a / § 3d).
@param nachElektro  nach Anwendung der 50 %-Ermäßigung für
                    Elektrofahrzeuge (§ 9 Abs. 2 KraftStG).
@param jahressteuer festgesetzte Jahressteuer nach Anwendung von
                    § 3a / § 3d KraftStG (0 bei Befreiung).
--
@Quelle("§ 9 KraftStG")
datensatz KraftfahrzeugsteuerErgebnis(
    tarifbetrag:  EuroCent, // § 9 Abs. 1 KraftStG
    nachElektro:  EuroCent, // § 9 Abs. 2 KraftStG
    jahressteuer: EuroCent, // nach § 3a / § 3d KraftStG
)

// ===========================================================================
// Allgemeine Helfer
// ===========================================================================

--
Anzahl angefangener Einheiten: `wert` geteilt durch `schritt`,
aufgerundet (§ 9 KraftStG: „für je … oder einen Teil davon").

@param wert   zu zerlegende Menge (cm³ bzw. kg).
@param teiler Einheitengröße (25 / 100 / 200).
@rückgabe     Anzahl angefangener Einheiten (≥ 0).
--
@Quelle("§ 9 Absatz 1 KraftStG")
fn Einheiten(wert: Ganzzahl, teiler: Ganzzahl): Ganzzahl = wähle {
    falls wert <= 0 -> 0
    sonst           -> ((wert / teiler) als Dezimal).aufrunden()
}
§ 9 Abs. 1 Nr. 1/2/2a/2b kraftstg-tarif-leicht.findsl · 429 Zeilen
--
# Kraftfahrzeugsteuer — Tarif leichte Fahrzeuge (§ 9 Abs. 1 Nr. 1/2/2a/2b)

Konstanten **und** Tarif-Funktionen für Krafträder (Nr. 1),
Personenkraftwagen (Nr. 2 Buchst. a/b/c), Wohnmobile (Nr. 2a) und
dreirädrige/leichte vierrädrige Kfz (Nr. 2b) — aus `kraftstg-steuer`
herausgelöst. Konstanten und Logik liegen bewusst zusammen (ein
Rechtsbereich = eine Datei, minimale modulübergreifende Importe).

Einstiegsfunktionen `steuerKraftrad`, `steuerPkw`, `steuerWohnmobil`,
`steuerDreiLeichtvier` wählt der Orchestrator `kraftstg-steuer`
nach Fahrzeugart (§ 8 KraftStG) aus.
--

verwende {
    Fahrzeug,
    Antrieb,
    PkwSchadstoffstufe,
    WohnmobilKlasse,
    Einheiten,
    Fremdzuendung,
    Selbstzuendung,
    Elektro,
    BisJuni2009,
    JuliBisDez2020,
    AbJan2021,
    Aa,
    Bb,
    Cc,
    Dd,
    Ee,
    MindestensS4,
    S1bisS3,
    WomoSonst,
} aus "./kraftstg-typen"

// ===========================================================================
// § 9 Abs. 1 Nr. 1 — Krafträder
// ===========================================================================

-- Kraftrad: je angefangene 25 cm³ Hubraum 1,84 € (§ 9 Abs. 1 Nr. 1 KraftStG). --
@Quelle("§ 9 Absatz 1 Nummer 1 KraftStG")
konst KRAD_JE_25CCM: EuroCent = 1,84

// ===========================================================================
// § 9 Abs. 1 Nr. 2 — Personenkraftwagen
// ===========================================================================

-- PKW Nr. 2c (Erstzulassung ab 1.1.2021): Sockel je 100 cm³, Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_HUBRAUM_OTTO: EuroCent = 2,00

-- PKW Nr. 2c: Sockel je 100 cm³, Selbstzündung (Diesel). --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_HUBRAUM_DIESEL: EuroCent = 9,50

-- PKW Nr. 2c: CO₂-Aufschlag je g/km, Spanne über 95 bis 115 g/km. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_95_115: EuroCent = 2,00

-- PKW Nr. 2c: CO₂-Aufschlag je g/km, Spanne über 115 bis 135 g/km. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_115_135: EuroCent = 2,20

-- PKW Nr. 2c: CO₂-Aufschlag je g/km, Spanne über 135 bis 155 g/km. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_135_155: EuroCent = 2,50

-- PKW Nr. 2c: CO₂-Aufschlag je g/km, Spanne über 155 bis 175 g/km. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_155_175: EuroCent = 2,90

-- PKW Nr. 2c: CO₂-Aufschlag je g/km, Spanne über 175 bis 195 g/km. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_175_195: EuroCent = 3,40

-- PKW Nr. 2c: CO₂-Aufschlag je g/km, Spanne über 195 g/km. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_UEBER_195: EuroCent = 4,00

-- CO₂-Freibetrag: erst Emissionen ÜBER 95 g/km sind aufschlagspflichtig (Nr. 2c). --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
konst PKW_C_CO2_FREI: Ganzzahl = 95

-- PKW Nr. 2b (Erstzulassung 1.7.2009–31.12.2020): Sockel je 100 cm³ Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe b KraftStG")
konst PKW_B_HUBRAUM_OTTO: EuroCent = 2,00

-- PKW Nr. 2b: Sockel je 100 cm³ Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe b KraftStG")
konst PKW_B_HUBRAUM_DIESEL: EuroCent = 9,50

-- PKW Nr. 2b: CO₂-Aufschlag je g/km über der (datumsabhängigen) Freigrenze. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe b KraftStG")
konst PKW_B_CO2_JE_GRAMM: EuroCent = 2,00

-- PKW Nr. 2a (Erstzulassung bis 30.6.2009), je 100 cm³, Stufe aa — Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe aa KraftStG")
konst PKW_A_AA_OTTO: EuroCent = 6,75
-- Stufe aa — Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe aa KraftStG")
konst PKW_A_AA_DIESEL: EuroCent = 15,44
-- Stufe bb — Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe bb KraftStG")
konst PKW_A_BB_OTTO: EuroCent = 7,36
-- Stufe bb — Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe bb KraftStG")
konst PKW_A_BB_DIESEL: EuroCent = 16,05
-- Stufe cc — Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe cc KraftStG")
konst PKW_A_CC_OTTO: EuroCent = 15,13
-- Stufe cc — Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe cc KraftStG")
konst PKW_A_CC_DIESEL: EuroCent = 27,35
-- Stufe dd — Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe dd KraftStG")
konst PKW_A_DD_OTTO: EuroCent = 21,07
-- Stufe dd — Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe dd KraftStG")
konst PKW_A_DD_DIESEL: EuroCent = 33,29
-- Stufe ee (höchste, keine Voraussetzungen erfüllt) — Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe ee KraftStG")
konst PKW_A_EE_OTTO: EuroCent = 25,36
-- Stufe ee — Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a Doppelbuchstabe ee KraftStG")
konst PKW_A_EE_DIESEL: EuroCent = 37,58

// ===========================================================================
// § 9 Abs. 1 Nr. 2b — dreirädrige / leichte vierrädrige Kraftfahrzeuge
// ===========================================================================

-- Dreirad/leichtes Vierrad, Grenzwerte eingehalten, Fremdzündung (je 100 cm³). --
@Quelle("§ 9 Absatz 1 Nummer 2b Buchstabe a KraftStG")
konst DREIRAD_GW_OTTO: EuroCent = 21,07
-- Grenzwerte eingehalten, Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2b Buchstabe a KraftStG")
konst DREIRAD_GW_DIESEL: EuroCent = 33,29
-- Grenzwerte nicht eingehalten, Fremdzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2b Buchstabe b KraftStG")
konst DREIRAD_SONST_OTTO: EuroCent = 25,36
-- Grenzwerte nicht eingehalten, Selbstzündung. --
@Quelle("§ 9 Absatz 1 Nummer 2b Buchstabe b KraftStG")
konst DREIRAD_SONST_DIESEL: EuroCent = 37,58

// ===========================================================================
// § 9 Abs. 1 Nr. 2a — Wohnmobile (je angefangene 200 kg Gesamtgewicht)
// ===========================================================================

-- Wohnmobil ≥ Schadstoffklasse S4: bis 2.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe a KraftStG")
konst WOMO_S4_BIS_2000: EuroCent = 16,00
-- Wohnmobil ≥ S4: über 2.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe a KraftStG")
konst WOMO_S4_UEBER_2000: EuroCent = 10,00
-- Wohnmobil ≥ S4: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe a KraftStG")
konst WOMO_S4_MAX: EuroCent = 800,00
-- Wohnmobil S3/S2/S1: bis 2.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe b KraftStG")
konst WOMO_S1_BIS_2000: EuroCent = 24,00
-- Wohnmobil S3/S2/S1: über 2.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe b KraftStG")
konst WOMO_S1_UEBER_2000: EuroCent = 10,00
-- Wohnmobil S3/S2/S1: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe b KraftStG")
konst WOMO_S1_MAX: EuroCent = 1.000,00
-- Wohnmobil sonst: bis 2.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe c KraftStG")
konst WOMO_SONST_BIS_2000: EuroCent = 40,00
-- Wohnmobil sonst: über 2.000 bis 5.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe c KraftStG")
konst WOMO_SONST_2000_5000: EuroCent = 10,00
-- Wohnmobil sonst: über 5.000 bis 12.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe c KraftStG")
konst WOMO_SONST_5000_12000: EuroCent = 15,00
-- Wohnmobil sonst: über 12.000 kg je 200 kg (kein Höchstbetrag). --
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe c KraftStG")
konst WOMO_SONST_UEBER_12000: EuroCent = 25,00

// ===========================================================================
// § 9 Abs. 1 Nr. 1 — Krafträder
// ===========================================================================

--
Jahressteuer für Krafträder: je angefangene 25 cm³ Hubraum 1,84 €
(§ 9 Abs. 1 Nr. 1 KraftStG).

@param hubraumCcm Hubraum in cm³.
@rückgabe  Jahressteuer des Kraftrads.
--
@Quelle("§ 9 Absatz 1 Nummer 1 KraftStG")
fn SteuerKraftrad(hubraumCcm: Ganzzahl): EuroCent =
    KRAD_JE_25CCM * Einheiten(hubraumCcm, 25)

// ===========================================================================
// § 9 Abs. 1 Nr. 2 Buchst. c — PKW Erstzulassung ab 1.1.2021
// ===========================================================================

--
Progressiver CO₂-Aufschlag für PKW nach § 9 Abs. 1 Nr. 2 Buchst. c
KraftStG: für jedes Gramm CO₂/km über 95 g/km, gestaffelt nach dem
Emissionswert (marginal je Spanne).

@param co2 CO₂-Emission in g/km.
@rückgabe  CO₂-Aufschlag (0, wenn ≤ 95 g/km).
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
fn _Co2AufschlagNr2c(co2: Ganzzahl): EuroCent = wähle {
    falls co2 <= 95  -> 0,00
    falls co2 <= 115 -> PKW_C_CO2_95_115 * (co2 - 95)
    falls co2 <= 135 -> PKW_C_CO2_95_115 * 20
                      + PKW_C_CO2_115_135 * (co2 - 115)
    falls co2 <= 155 -> PKW_C_CO2_95_115 * 20 + PKW_C_CO2_115_135 * 20
                      + PKW_C_CO2_135_155 * (co2 - 135)
    falls co2 <= 175 -> PKW_C_CO2_95_115 * 20 + PKW_C_CO2_115_135 * 20
                      + PKW_C_CO2_135_155 * 20
                      + PKW_C_CO2_155_175 * (co2 - 155)
    falls co2 <= 195 -> PKW_C_CO2_95_115 * 20 + PKW_C_CO2_115_135 * 20
                      + PKW_C_CO2_135_155 * 20 + PKW_C_CO2_155_175 * 20
                      + PKW_C_CO2_175_195 * (co2 - 175)
    sonst            -> PKW_C_CO2_95_115 * 20 + PKW_C_CO2_115_135 * 20
                      + PKW_C_CO2_135_155 * 20 + PKW_C_CO2_155_175 * 20
                      + PKW_C_CO2_175_195 * 20
                      + PKW_C_CO2_UEBER_195 * (co2 - 195)
}

--
PKW-Hubraum-Sockel nach Antrieb (§ 9 Abs. 1 Nr. 2 Buchst. b/c
KraftStG): je angefangene 100 cm³ 2,00 € (Fremdzündung) bzw. 9,50 €
(Selbstzündung).

@param hubraumCcm Hubraum in cm³.
@param antrieb    Antriebsart.
@rückgabe  Hubraum-Sockelbetrag.
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
fn _PkwHubraumSockel(hubraumCcm: Ganzzahl, antrieb: Antrieb): EuroCent =
    wähle (antrieb) {
        falls Selbstzuendung      -> PKW_C_HUBRAUM_DIESEL * Einheiten(hubraumCcm, 100)
        falls Fremdzuendung, Elektro -> PKW_C_HUBRAUM_OTTO * Einheiten(hubraumCcm, 100)
    }

--
PKW Nr. 2 Buchst. c (Erstzulassung ab 1.1.2021): Hubraum-Sockel
zuzüglich progressivem CO₂-Aufschlag (§ 9 Abs. 1 Nr. 2 Buchst. c
KraftStG).

@param hubraumCcm Hubraum in cm³.
@param co2        CO₂-Emission in g/km.
@param antrieb    Antriebsart.
@rückgabe  Jahressteuer des PKW (Buchst. c).
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe c KraftStG")
fn _SteuerPkwC(hubraumCcm: Ganzzahl, co2: Ganzzahl, antrieb: Antrieb): EuroCent =
    _PkwHubraumSockel(hubraumCcm, antrieb) + _Co2AufschlagNr2c(co2)

--
PKW Nr. 2 Buchst. b (Erstzulassung 1.7.2009–31.12.2020):
Hubraum-Sockel zuzüglich 2,00 € je g/km CO₂ über der
datumsabhängigen Freigrenze (120 / 110 / 95 g/km).

@param hubraumCcm   Hubraum in cm³.
@param co2          CO₂-Emission in g/km.
@param freigrenze   maßgebliche CO₂-Freigrenze (g/km).
@param antrieb      Antriebsart.
@rückgabe  Jahressteuer des PKW (Buchst. b).
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe b KraftStG")
fn _SteuerPkwB(
    hubraumCcm: Ganzzahl,
    co2: Ganzzahl,
    freigrenze: Ganzzahl,
    antrieb: Antrieb,
): EuroCent =
    _PkwHubraumSockel(hubraumCcm, antrieb)
    + wähle {
        falls co2 <= freigrenze -> 0,00
        sonst                   -> PKW_B_CO2_JE_GRAMM * (co2 - freigrenze)
    }

--
PKW Nr. 2 Buchst. a (Erstzulassung bis 30.6.2009): je angefangene
100 cm³ ein nach Schadstoffstufe (aa–ee) und Antrieb gestaffelter
Satz (§ 9 Abs. 1 Nr. 2 Buchst. a KraftStG).

@param hubraumCcm Hubraum in cm³.
@param stufe      Schadstoffstufe aa–ee.
@param antrieb    Antriebsart.
@rückgabe  Jahressteuer des PKW (Buchst. a).
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a KraftStG")
fn _SteuerPkwA(hubraumCcm: Ganzzahl, stufe: PkwSchadstoffstufe, antrieb: Antrieb): EuroCent =
    _SatzPkwA(stufe, antrieb) * Einheiten(hubraumCcm, 100)

--
Stufensatz je 100 cm³ für PKW Nr. 2 Buchst. a nach Schadstoffstufe
und Antrieb. (Elektro wird wie Fremdzündung behandelt — relevant
wird der Wert für reine E-PKW ohnehin nicht, da diese nach § 3d
befreit sind.)

@param stufe   Schadstoffstufe aa–ee.
@param antrieb Antriebsart.
@rückgabe  Satz je angefangene 100 cm³.
--
@Quelle("§ 9 Absatz 1 Nummer 2 Buchstabe a KraftStG")
fn _SatzPkwA(stufe: PkwSchadstoffstufe, antrieb: Antrieb): EuroCent =
    wähle (antrieb) {
        falls Selbstzuendung -> wähle (stufe) {
            falls Aa -> PKW_A_AA_DIESEL
            falls Bb -> PKW_A_BB_DIESEL
            falls Cc -> PKW_A_CC_DIESEL
            falls Dd -> PKW_A_DD_DIESEL
            falls Ee -> PKW_A_EE_DIESEL
        }
        falls Fremdzuendung, Elektro -> wähle (stufe) {
            falls Aa -> PKW_A_AA_OTTO
            falls Bb -> PKW_A_BB_OTTO
            falls Cc -> PKW_A_CC_OTTO
            falls Dd -> PKW_A_DD_OTTO
            falls Ee -> PKW_A_EE_OTTO
        }
    }

--
Personenkraftwagen nach § 9 Abs. 1 Nr. 2 KraftStG: wählt anhand des
Erstzulassungs-Regimes Buchst. a, b oder c.

@param f Fahrzeug-Eingaben.
@rückgabe  Jahressteuer des PKW.
--
@Quelle("§ 9 Absatz 1 Nummer 2 KraftStG")
fn SteuerPkw(f: Fahrzeug): EuroCent = wähle (f.erstzulassung) {
    falls BisJuni2009    -> _SteuerPkwA(f.hubraumCcm, f.pkwStufe, f.antrieb)
    falls JuliBisDez2020 -> _SteuerPkwB(f.hubraumCcm, f.co2GrammProKm, f.co2FreigrenzeNr2b, f.antrieb)
    falls AbJan2021      -> _SteuerPkwC(f.hubraumCcm, f.co2GrammProKm, f.antrieb)
}

// ===========================================================================
// § 9 Abs. 1 Nr. 2b — dreirädrige / leichte vierrädrige Kraftfahrzeuge
// ===========================================================================

--
Dreirädrige und leichte vierrädrige Kraftfahrzeuge
(§ 9 Abs. 1 Nr. 2b KraftStG): je angefangene 100 cm³ ein nach
Grenzwert-Einhaltung und Antrieb gestaffelter Satz.

@param hubraumCcm  Hubraum in cm³.
@param grenzwerte  Grenzwerte (RL 97/24/EG Zeile A 2003) eingehalten?
@param antrieb     Antriebsart.
@rückgabe  Jahressteuer des Fahrzeugs.
--
@Quelle("§ 9 Absatz 1 Nummer 2b KraftStG")
fn SteuerDreiLeichtvier(hubraumCcm: Ganzzahl, grenzwerte: Wahrheitswert, antrieb: Antrieb): EuroCent =
    _SatzDreiLeichtvier(grenzwerte, antrieb) * Einheiten(hubraumCcm, 100)

--
Stufensatz je 100 cm³ für § 9 Abs. 1 Nr. 2b KraftStG.

@param grenzwerte Grenzwerte eingehalten?
@param antrieb    Antriebsart.
@rückgabe  Satz je angefangene 100 cm³.
--
@Quelle("§ 9 Absatz 1 Nummer 2b KraftStG")
fn _SatzDreiLeichtvier(grenzwerte: Wahrheitswert, antrieb: Antrieb): EuroCent =
    wähle {
        falls grenzwerte und antrieb == Selbstzuendung      -> DREIRAD_GW_DIESEL
        falls grenzwerte                                     -> DREIRAD_GW_OTTO
        falls antrieb == Selbstzuendung                      -> DREIRAD_SONST_DIESEL
        sonst                                                -> DREIRAD_SONST_OTTO
    }

// ===========================================================================
// § 9 Abs. 1 Nr. 2a — Wohnmobile
// ===========================================================================

--
Wohnmobil nach § 9 Abs. 1 Nr. 2a KraftStG: je angefangene 200 kg
Gesamtgewicht, progressiv nach Gewichtsspanne und Schadstoffklasse,
mit Höchstbetrag (Buchst. a/b) bzw. ohne (Buchst. c).

@param gesamtgewichtKg verkehrsrechtlich zulässiges Gesamtgewicht (kg).
@param klasse          Schadstoffklasse des Wohnmobils.
@rückgabe  Jahressteuer des Wohnmobils.
--
@Quelle("§ 9 Absatz 1 Nummer 2a KraftStG")
fn SteuerWohnmobil(gesamtgewichtKg: Ganzzahl, klasse: WohnmobilKlasse): EuroCent =
    wähle (klasse) {
        falls MindestensS4 -> _WomoZweiStufen(gesamtgewichtKg, WOMO_S4_BIS_2000, WOMO_S4_UEBER_2000).höchstens(WOMO_S4_MAX)
        falls S1bisS3      -> _WomoZweiStufen(gesamtgewichtKg, WOMO_S1_BIS_2000, WOMO_S1_UEBER_2000).höchstens(WOMO_S1_MAX)
        falls WomoSonst    -> _SteuerWohnmobilSonst(gesamtgewichtKg)
    }

--
Zwei-Stufen-Wohnmobiltarif (Buchst. a/b): bis 2.000 kg `satzBis`,
darüber `satzUeber`, je angefangene 200 kg.

@param g        Gesamtgewicht (kg).
@param satzBis  Satz je 200 kg bis 2.000 kg.
@param satzUeber Satz je 200 kg über 2.000 kg.
@rückgabe  Tarifbetrag vor Höchstbetragsbegrenzung.
--
@Quelle("§ 9 Absatz 1 Nummer 2a KraftStG")
fn _WomoZweiStufen(g: Ganzzahl, satzBis: EuroCent, satzUeber: EuroCent): EuroCent =
    wähle {
        falls g <= 2000 -> satzBis * Einheiten(g, 200)
        sonst            -> satzBis * 10 + satzUeber * Einheiten(g - 2000, 200)
    }

--
Wohnmobil Buchst. c (Voraussetzungen a/b nicht erfüllt, kein
Höchstbetrag): bis 2.000 kg 40 €, über 2.000–5.000 kg 10 €, über
5.000–12.000 kg 15 €, über 12.000 kg 25 € — je angefangene 200 kg.

@param g Gesamtgewicht (kg).
@rückgabe  Jahressteuer des Wohnmobils (Buchst. c).
--
@Quelle("§ 9 Absatz 1 Nummer 2a Buchstabe c KraftStG")
fn _SteuerWohnmobilSonst(g: Ganzzahl): EuroCent = wähle {
    falls g <= 2000  -> WOMO_SONST_BIS_2000 * Einheiten(g, 200)
    falls g <= 5000  -> WOMO_SONST_BIS_2000 * 10
                      + WOMO_SONST_2000_5000 * Einheiten(g - 2000, 200)
    falls g <= 12000 -> WOMO_SONST_BIS_2000 * 10 + WOMO_SONST_2000_5000 * 15
                      + WOMO_SONST_5000_12000 * Einheiten(g - 5000, 200)
    sonst            -> WOMO_SONST_BIS_2000 * 10 + WOMO_SONST_2000_5000 * 15
                      + WOMO_SONST_5000_12000 * 35
                      + WOMO_SONST_UEBER_12000 * Einheiten(g - 12000, 200)
}
§ 9 Abs. 1 Nr. 3/4/5 kraftstg-tarif-nutzfahrzeug.findsl · 463 Zeilen
--
# Kraftfahrzeugsteuer — Tarif Nutzfahrzeuge (§ 9 Abs. 1 Nr. 3/4/5)

Konstanten **und** Tarif-Funktionen für andere Kfz ≤ 3.500 kg (Nr. 3),
Kfz > 3.500 kg (Nr. 4 Buchst. a/b/c/d — progressive 200-kg-Stufen mit
Höchstbetrag) und Kraftfahrzeuganhänger (Nr. 5) — aus
`kraftstg-steuer` herausgelöst. Konstanten und Logik liegen bewusst
zusammen.

Einstiegsfunktionen `steuerNr3`, `steuerNr4`, `steuerAnhaenger`
wählt der Orchestrator `kraftstg-steuer` nach Fahrzeugart aus.
--

verwende {
    NfzKlasse,
    Einheiten,
    MindestensS2,
    S1,
    G1,
    NfzSonst,
} aus "./kraftstg-typen"

// ===========================================================================
// § 9 Abs. 1 Nr. 3 — andere Kfz ≤ 3.500 kg (je 200 kg, progressiv)
// ===========================================================================

-- Nr. 3: bis 2.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 3 KraftStG")
konst NR3_BIS_2000: EuroCent = 11,25
-- Nr. 3: über 2.000 bis 3.000 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 3 KraftStG")
konst NR3_2000_3000: EuroCent = 12,02
-- Nr. 3: über 3.000 bis 3.500 kg je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 3 KraftStG")
konst NR3_3000_3500: EuroCent = 12,78
-- Nr. 3: kumulierter Betrag bei genau 2.000 kg (10 Stufen × Satz). --
@Quelle("§ 9 Absatz 1 Nummer 3 KraftStG")
konst NR3_KUM_2000: EuroCent = NR3_BIS_2000 * 10
-- Nr. 3: kumulierter Betrag bei genau 3.000 kg. --
@Quelle("§ 9 Absatz 1 Nummer 3 KraftStG")
konst NR3_KUM_3000: EuroCent = NR3_KUM_2000 + NR3_2000_3000 * 5

// ===========================================================================
// § 9 Abs. 1 Nr. 4 — Kfz > 3.500 kg (je 200 kg, progressiv, mit Höchstbetrag)
//   a) ≥ S2  b) S1  c) G1  d) sonst  — 1.000-kg-Stufen = je 5 × 200 kg
// ===========================================================================

-- Nr. 4a (≥ S2): Stufensätze je 200 kg, Gewichtsspannen 2.000…> 12.000 kg. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_1: EuroCent = 6,42
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_2: EuroCent = 6,88
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_3: EuroCent = 7,31
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_4: EuroCent = 7,75
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_5: EuroCent = 8,18
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_6: EuroCent = 8,62
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_7: EuroCent = 9,36
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_8: EuroCent = 10,07
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_9: EuroCent = 10,97
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_10: EuroCent = 11,84
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_11: EuroCent = 13,01
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_12: EuroCent = 14,32
-- Nr. 4a: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_MAX: EuroCent = 556,00
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_2000: EuroCent = NR4A_1 * 10
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_3000: EuroCent = NR4A_KUM_2000 + NR4A_2 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_4000: EuroCent = NR4A_KUM_3000 + NR4A_3 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_5000: EuroCent = NR4A_KUM_4000 + NR4A_4 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_6000: EuroCent = NR4A_KUM_5000 + NR4A_5 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_7000: EuroCent = NR4A_KUM_6000 + NR4A_6 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_8000: EuroCent = NR4A_KUM_7000 + NR4A_7 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_9000: EuroCent = NR4A_KUM_8000 + NR4A_8 * 5

@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_10000: EuroCent = NR4A_KUM_9000 + NR4A_9 * 5

@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_11000: EuroCent = NR4A_KUM_10000 + NR4A_10 * 5

@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
konst NR4A_KUM_12000: EuroCent = NR4A_KUM_11000 + NR4A_11 * 5

-- Nr. 4d (Voraussetzungen a/b/c nicht erfüllt): Stufensätze je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_1: EuroCent = 11,25
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_2: EuroCent = 12,02
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_3: EuroCent = 12,78
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_4: EuroCent = 13,55
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_5: EuroCent = 14,32
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_6: EuroCent = 15,08
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_7: EuroCent = 16,36
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_8: EuroCent = 17,64
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_9: EuroCent = 19,17
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_10: EuroCent = 20,71
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_11: EuroCent = 22,75
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_12: EuroCent = 25,05
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_13: EuroCent = 27,61
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_14: EuroCent = 45,50
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_15: EuroCent = 63,40
-- Nr. 4d: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_MAX: EuroCent = 1.681,00
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_2000: EuroCent = NR4D_1 * 10
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_3000: EuroCent = NR4D_KUM_2000 + NR4D_2 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_4000: EuroCent = NR4D_KUM_3000 + NR4D_3 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_5000: EuroCent = NR4D_KUM_4000 + NR4D_4 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_6000: EuroCent = NR4D_KUM_5000 + NR4D_5 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_7000: EuroCent = NR4D_KUM_6000 + NR4D_6 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_8000: EuroCent = NR4D_KUM_7000 + NR4D_7 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_9000: EuroCent = NR4D_KUM_8000 + NR4D_8 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_10000: EuroCent = NR4D_KUM_9000 + NR4D_9 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_11000: EuroCent = NR4D_KUM_10000 + NR4D_10 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_12000: EuroCent = NR4D_KUM_11000 + NR4D_11 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_13000: EuroCent = NR4D_KUM_12000 + NR4D_12 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_14000: EuroCent = NR4D_KUM_13000 + NR4D_13 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
konst NR4D_KUM_15000: EuroCent = NR4D_KUM_14000 + NR4D_14 * 5

-- Nr. 4b (Schadstoffklasse S1): Stufensätze je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_1: EuroCent = 6,42
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_2: EuroCent = 6,88
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_3: EuroCent = 7,31

@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_4: EuroCent = 7,75

@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_5: EuroCent = 8,18
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_6: EuroCent = 8,62
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_7: EuroCent = 9,36
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_8: EuroCent = 10,07
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_9: EuroCent = 10,97
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_10: EuroCent = 11,84
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_11: EuroCent = 13,01
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_12: EuroCent = 14,32
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_13: EuroCent = 15,77
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_14: EuroCent = 26,00
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_15: EuroCent = 36,23
-- Nr. 4b: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_MAX: EuroCent = 914,00
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_2000: EuroCent = NR4B_1 * 10
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_3000: EuroCent = NR4B_KUM_2000 + NR4B_2 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_4000: EuroCent = NR4B_KUM_3000 + NR4B_3 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_5000: EuroCent = NR4B_KUM_4000 + NR4B_4 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_6000: EuroCent = NR4B_KUM_5000 + NR4B_5 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_7000: EuroCent = NR4B_KUM_6000 + NR4B_6 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_8000: EuroCent = NR4B_KUM_7000 + NR4B_7 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_9000: EuroCent = NR4B_KUM_8000 + NR4B_8 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_10000: EuroCent = NR4B_KUM_9000 + NR4B_9 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_11000: EuroCent = NR4B_KUM_10000 + NR4B_10 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_12000: EuroCent = NR4B_KUM_11000 + NR4B_11 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_13000: EuroCent = NR4B_KUM_12000 + NR4B_12 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_14000: EuroCent = NR4B_KUM_13000 + NR4B_13 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
konst NR4B_KUM_15000: EuroCent = NR4B_KUM_14000 + NR4B_14 * 5

-- Nr. 4c (Geräuschklasse G1): Stufensätze je 200 kg. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_1: EuroCent = 9,64
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_2: EuroCent = 10,30
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_3: EuroCent = 10,97
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_4: EuroCent = 11,61
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_5: EuroCent = 12,27
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_6: EuroCent = 12,94
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_7: EuroCent = 14,03
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_8: EuroCent = 15,11
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_9: EuroCent = 16,44
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_10: EuroCent = 17,74
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_11: EuroCent = 19,51
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_12: EuroCent = 21,47
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_13: EuroCent = 23,67
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_14: EuroCent = 39,01
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_15: EuroCent = 54,35
-- Nr. 4c: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_MAX: EuroCent = 1.425,00
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_2000: EuroCent = NR4C_1 * 10
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_3000: EuroCent = NR4C_KUM_2000 + NR4C_2 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_4000: EuroCent = NR4C_KUM_3000 + NR4C_3 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_5000: EuroCent = NR4C_KUM_4000 + NR4C_4 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_6000: EuroCent = NR4C_KUM_5000 + NR4C_5 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_7000: EuroCent = NR4C_KUM_6000 + NR4C_6 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_8000: EuroCent = NR4C_KUM_7000 + NR4C_7 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_9000: EuroCent = NR4C_KUM_8000 + NR4C_8 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_10000: EuroCent = NR4C_KUM_9000 + NR4C_9 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_11000: EuroCent = NR4C_KUM_10000 + NR4C_10 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_12000: EuroCent = NR4C_KUM_11000 + NR4C_11 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_13000: EuroCent = NR4C_KUM_12000 + NR4C_12 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_14000: EuroCent = NR4C_KUM_13000 + NR4C_13 * 5
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
konst NR4C_KUM_15000: EuroCent = NR4C_KUM_14000 + NR4C_14 * 5

// ===========================================================================
// § 9 Abs. 1 Nr. 5 — Kraftfahrzeuganhänger
// ===========================================================================

-- Anhänger: je angefangene 200 kg Gesamtgewicht 7,46 €. --
@Quelle("§ 9 Absatz 1 Nummer 5 KraftStG")
konst ANH_JE_200KG: EuroCent = 7,46
-- Anhänger: Höchstbetrag. --
@Quelle("§ 9 Absatz 1 Nummer 5 KraftStG")
konst ANH_MAX: EuroCent = 373,24

// ===========================================================================
// § 9 Abs. 1 Nr. 3 — andere Kfz ≤ 3.500 kg
// ===========================================================================

--
Andere Kraftfahrzeuge bis 3.500 kg (§ 9 Abs. 1 Nr. 3 KraftStG):
je angefangene 200 kg, progressiv nach Gewichtsspanne (kein
Höchstbetrag).

@param g  Gesamtgewicht (kg).
@rückgabe Jahressteuer.
--
@Quelle("§ 9 Absatz 1 Nummer 3 KraftStG")
fn SteuerNr3(g: Ganzzahl): EuroCent = wähle {
    falls g <= 2000 -> NR3_BIS_2000 * Einheiten(g, 200)
    falls g <= 3000 -> NR3_KUM_2000 + NR3_2000_3000 * Einheiten(g - 2000, 200)
    sonst           -> NR3_KUM_3000 + NR3_3000_3500 * Einheiten(g - 3000, 200)
}

// ===========================================================================
// § 9 Abs. 1 Nr. 4 — Kfz > 3.500 kg
// ===========================================================================

--
Kfz über 3.500 kg (§ 9 Abs. 1 Nr. 4 KraftStG): je angefangene 200 kg,
progressiv in 1.000-kg-Spannen, nach Schadstoff-/Geräuschklasse, mit
jeweils eigenem Höchstbetrag. Alle vier Buchstaben sind eigenständig
modelliert: a (≥ S2, Spannen bis > 12.000 kg, max 556 €), b (S1,
max 914 €), c (G1, max 1.425 €), d (sonst, max 1.681 €).

@param g      Gesamtgewicht (kg).
@param klasse Schadstoff-/Geräuschklasse.
@rückgabe     Jahressteuer.
--
@Quelle("§ 9 Absatz 1 Nummer 4 KraftStG")
fn SteuerNr4(g: Ganzzahl, klasse: NfzKlasse): EuroCent = wähle (klasse) {
    falls MindestensS2 -> _Nr4a(g).höchstens(NR4A_MAX)
    falls S1           -> _Nr4b(g).höchstens(NR4B_MAX)
    falls G1           -> _Nr4c(g).höchstens(NR4C_MAX)
    falls NfzSonst     -> _Nr4d(g).höchstens(NR4D_MAX)
}

--
Progressiver Stufentarif Buchst. a (≥ S2), je 200 kg, Spannen
2.000…> 12.000 kg (§ 9 Abs. 1 Nr. 4 Buchst. a KraftStG).

@param g  Gesamtgewicht (kg).
@rückgabe Tarifbetrag vor Höchstbetragsbegrenzung.
--
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe a KraftStG")
fn _Nr4a(g: Ganzzahl): EuroCent = wähle {
    falls g <= 2000  -> NR4A_1 * Einheiten(g, 200)
    falls g <= 3000  -> NR4A_KUM_2000 + NR4A_2 * Einheiten(g - 2000, 200)
    falls g <= 4000  -> NR4A_KUM_3000 + NR4A_3 * Einheiten(g - 3000, 200)
    falls g <= 5000  -> NR4A_KUM_4000 + NR4A_4 * Einheiten(g - 4000, 200)
    falls g <= 6000  -> NR4A_KUM_5000 + NR4A_5 * Einheiten(g - 5000, 200)
    falls g <= 7000  -> NR4A_KUM_6000 + NR4A_6 * Einheiten(g - 6000, 200)
    falls g <= 8000  -> NR4A_KUM_7000 + NR4A_7 * Einheiten(g - 7000, 200)
    falls g <= 9000  -> NR4A_KUM_8000 + NR4A_8 * Einheiten(g - 8000, 200)
    falls g <= 10000 -> NR4A_KUM_9000 + NR4A_9 * Einheiten(g - 9000, 200)
    falls g <= 11000 -> NR4A_KUM_10000 + NR4A_10 * Einheiten(g - 10000, 200)
    falls g <= 12000 -> NR4A_KUM_11000 + NR4A_11 * Einheiten(g - 11000, 200)
    sonst            -> NR4A_KUM_12000 + NR4A_12 * Einheiten(g - 12000, 200)
}

--
Progressiver Stufentarif Buchst. d (Voraussetzungen a/b/c nicht
erfüllt), je 200 kg, Spannen 2.000…> 15.000 kg
(§ 9 Abs. 1 Nr. 4 Buchst. d KraftStG).

@param g  Gesamtgewicht (kg).
@rückgabe Tarifbetrag vor Höchstbetragsbegrenzung.
--
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe d KraftStG")
fn _Nr4d(g: Ganzzahl): EuroCent = wähle {
    falls g <= 2000  -> NR4D_1 * Einheiten(g, 200)
    falls g <= 3000  -> NR4D_KUM_2000 + NR4D_2 * Einheiten(g - 2000, 200)
    falls g <= 4000  -> NR4D_KUM_3000 + NR4D_3 * Einheiten(g - 3000, 200)
    falls g <= 5000  -> NR4D_KUM_4000 + NR4D_4 * Einheiten(g - 4000, 200)
    falls g <= 6000  -> NR4D_KUM_5000 + NR4D_5 * Einheiten(g - 5000, 200)
    falls g <= 7000  -> NR4D_KUM_6000 + NR4D_6 * Einheiten(g - 6000, 200)
    falls g <= 8000  -> NR4D_KUM_7000 + NR4D_7 * Einheiten(g - 7000, 200)
    falls g <= 9000  -> NR4D_KUM_8000 + NR4D_8 * Einheiten(g - 8000, 200)
    falls g <= 10000 -> NR4D_KUM_9000 + NR4D_9 * Einheiten(g - 9000, 200)
    falls g <= 11000 -> NR4D_KUM_10000 + NR4D_10 * Einheiten(g - 10000, 200)
    falls g <= 12000 -> NR4D_KUM_11000 + NR4D_11 * Einheiten(g - 11000, 200)
    falls g <= 13000 -> NR4D_KUM_12000 + NR4D_12 * Einheiten(g - 12000, 200)
    falls g <= 14000 -> NR4D_KUM_13000 + NR4D_13 * Einheiten(g - 13000, 200)
    falls g <= 15000 -> NR4D_KUM_14000 + NR4D_14 * Einheiten(g - 14000, 200)
    sonst            -> NR4D_KUM_15000 + NR4D_15 * Einheiten(g - 15000, 200)
}

--
Progressiver Stufentarif Buchst. b (Schadstoffklasse S 1), je 200 kg,
Spannen 2.000…> 15.000 kg (§ 9 Abs. 1 Nr. 4 Buchst. b KraftStG).

@param g  Gesamtgewicht (kg).
@rückgabe Tarifbetrag vor Höchstbetragsbegrenzung.
--
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe b KraftStG")
fn _Nr4b(g: Ganzzahl): EuroCent = wähle {
    falls g <= 2000  -> NR4B_1 * Einheiten(g, 200)
    falls g <= 3000  -> NR4B_KUM_2000 + NR4B_2 * Einheiten(g - 2000, 200)
    falls g <= 4000  -> NR4B_KUM_3000 + NR4B_3 * Einheiten(g - 3000, 200)
    falls g <= 5000  -> NR4B_KUM_4000 + NR4B_4 * Einheiten(g - 4000, 200)
    falls g <= 6000  -> NR4B_KUM_5000 + NR4B_5 * Einheiten(g - 5000, 200)
    falls g <= 7000  -> NR4B_KUM_6000 + NR4B_6 * Einheiten(g - 6000, 200)
    falls g <= 8000  -> NR4B_KUM_7000 + NR4B_7 * Einheiten(g - 7000, 200)
    falls g <= 9000  -> NR4B_KUM_8000 + NR4B_8 * Einheiten(g - 8000, 200)
    falls g <= 10000 -> NR4B_KUM_9000 + NR4B_9 * Einheiten(g - 9000, 200)
    falls g <= 11000 -> NR4B_KUM_10000 + NR4B_10 * Einheiten(g - 10000, 200)
    falls g <= 12000 -> NR4B_KUM_11000 + NR4B_11 * Einheiten(g - 11000, 200)
    falls g <= 13000 -> NR4B_KUM_12000 + NR4B_12 * Einheiten(g - 12000, 200)
    falls g <= 14000 -> NR4B_KUM_13000 + NR4B_13 * Einheiten(g - 13000, 200)
    falls g <= 15000 -> NR4B_KUM_14000 + NR4B_14 * Einheiten(g - 14000, 200)
    sonst            -> NR4B_KUM_15000 + NR4B_15 * Einheiten(g - 15000, 200)
}

--
Progressiver Stufentarif Buchst. c (Geräuschklasse G 1), je 200 kg,
Spannen 2.000…> 15.000 kg (§ 9 Abs. 1 Nr. 4 Buchst. c KraftStG).

@param g  Gesamtgewicht (kg).
@rückgabe Tarifbetrag vor Höchstbetragsbegrenzung.
--
@Quelle("§ 9 Absatz 1 Nummer 4 Buchstabe c KraftStG")
fn _Nr4c(g: Ganzzahl): EuroCent = wähle {
    falls g <= 2000  -> NR4C_1 * Einheiten(g, 200)
    falls g <= 3000  -> NR4C_KUM_2000 + NR4C_2 * Einheiten(g - 2000, 200)
    falls g <= 4000  -> NR4C_KUM_3000 + NR4C_3 * Einheiten(g - 3000, 200)
    falls g <= 5000  -> NR4C_KUM_4000 + NR4C_4 * Einheiten(g - 4000, 200)
    falls g <= 6000  -> NR4C_KUM_5000 + NR4C_5 * Einheiten(g - 5000, 200)
    falls g <= 7000  -> NR4C_KUM_6000 + NR4C_6 * Einheiten(g - 6000, 200)
    falls g <= 8000  -> NR4C_KUM_7000 + NR4C_7 * Einheiten(g - 7000, 200)
    falls g <= 9000  -> NR4C_KUM_8000 + NR4C_8 * Einheiten(g - 8000, 200)
    falls g <= 10000 -> NR4C_KUM_9000 + NR4C_9 * Einheiten(g - 9000, 200)
    falls g <= 11000 -> NR4C_KUM_10000 + NR4C_10 * Einheiten(g - 10000, 200)
    falls g <= 12000 -> NR4C_KUM_11000 + NR4C_11 * Einheiten(g - 11000, 200)
    falls g <= 13000 -> NR4C_KUM_12000 + NR4C_12 * Einheiten(g - 12000, 200)
    falls g <= 14000 -> NR4C_KUM_13000 + NR4C_13 * Einheiten(g - 13000, 200)
    falls g <= 15000 -> NR4C_KUM_14000 + NR4C_14 * Einheiten(g - 14000, 200)
    sonst            -> NR4C_KUM_15000 + NR4C_15 * Einheiten(g - 15000, 200)
}

// ===========================================================================
// § 9 Abs. 1 Nr. 5 — Anhänger
// ===========================================================================

--
Kraftfahrzeuganhänger (§ 9 Abs. 1 Nr. 5 KraftStG): je angefangene
200 kg Gesamtgewicht 7,46 €, höchstens 373,24 €.

@param gesamtgewichtKg Gesamtgewicht (kg).
@rückgabe              Jahressteuer des Anhängers.
--
@Quelle("§ 9 Absatz 1 Nummer 5 KraftStG")
fn SteuerAnhaenger(gesamtgewichtKg: Ganzzahl): EuroCent =
    (ANH_JE_200KG * Einheiten(gesamtgewichtKg, 200)).höchstens(ANH_MAX)
Original im Hauptrepo examples/kraftst

Geprüft — die prüfe-Fälle

Die Sollwerte sind unabhängig aus dem Gesetzeswortlaut gerechnet — „je angefangene Einheit" als Aufrundung, die progressiven Gewichts- und CO₂-Tarife stufenweise summiert, Höchstbeträge gedeckelt.

12 prüfe-Blöcke
34 Testfälle
7 Fahrzeugarten
Testdatei anzeigen kraftst.test.findsl
--
# Akzeptanztests — Kraftfahrzeugsteuer (§§ 8, 9 KraftStG)

`prüfe`-Blöcke zur Datei `kraftstg-steuer`. Alle Sollwerte sind
unabhängig aus dem Gesetzeswortlaut gerechnet (KraftStG 2002,
i.d.g.F.): „je angefangene Einheit" = Aufrundung; progressive
Gewichts-/CO₂-Tarife stufenweise summiert; Höchstbeträge gedeckelt.

Diese Datei enthält ausschließlich die `prüfe`-Blöcke.
--

// Importe nach Quelldatei gruppiert (Modul auf mehrere Dateien
// aufgeteilt): Typen/Helfer/Aufzählungswerte aus kraftstg-typen, die
// Kraftrad-Einstiegsfunktion aus kraftstg-tarif-leicht, die öffentlichen
// Orchestrator-Funktionen aus kraftstg-steuer.
verwende {
    Einheiten,
    Fahrzeug,
    KraftfahrzeugsteuerErgebnis,
    Kraftrad,
    Pkw,
    Wohnmobil,
    AndereBis3500,
    AndereUeber3500,
    Anhaenger,
    Fremdzuendung,
    Selbstzuendung,
    Elektro,
    BisJuni2009,
    JuliBisDez2020,
    AbJan2021,
    Aa,
    Ee,
    MindestensS4,
    S1bisS3,
    WomoSonst,
    MindestensS2,
    G1,
    NfzSonst,
    Befreit3aAbs1,
    Ermaessigt3aAbs2,
} aus "./kraftstg-typen"

verwende {
    SteuerKraftrad,
} aus "./kraftstg-tarif-leicht"

verwende {
    TarifNach9Abs1,
    BerechneKraftfahrzeugsteuer,
} aus "./kraftst"

prüfe "Helfer: angefangene Einheiten (§ 9 — oder einen Teil davon)" {
    testfall "exakt teilbar" { Einheiten(2000, 200) == 10 }
    testfall "Teil davon rundet auf" { Einheiten(1598, 100) == 16 }
    testfall "knapp über Grenze" { Einheiten(601, 25) == 25 }
    testfall "0 oder negativ → 0" { Einheiten(0, 200) == 0 }
}

prüfe "§ 9 Abs. 1 Nr. 1 — Krafträder (1,84 € je 25 cm³)" {
    testfall "125 cm³ → 5 × 1,84 = 9,20 €" {
        SteuerKraftrad(125) == 9,20
    }
    testfall "600 cm³ → 24 × 1,84 = 44,16 €" {
        SteuerKraftrad(600) == 44,16
    }
    testfall "601 cm³ → 25 × 1,84 = 46,00 €" {
        SteuerKraftrad(601) == 46,00
    }
}

prüfe "§ 9 Abs. 1 Nr. 2 Buchst. c — PKW ab 1.1.2021 (Hubraum + CO₂)" {
    testfall "Benziner 1.598 cm³, 120 g/km → 32,00 + 51,00 = 83,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Fremdzuendung,
            hubraumCcm = 1598, co2GrammProKm = 120,
            erstzulassung = AbJan2021,
        )
        TarifNach9Abs1(f) == 83,00
    }
    testfall "Diesel 1.968 cm³, 150 g/km → 190,00 + 121,50 = 311,50 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Selbstzuendung,
            hubraumCcm = 1968, co2GrammProKm = 150,
            erstzulassung = AbJan2021,
        )
        TarifNach9Abs1(f) == 311,50
    }
    testfall "CO₂ genau 95 g/km → kein Aufschlag (nur Hubraum 20,00 €)" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Fremdzuendung,
            hubraumCcm = 999, co2GrammProKm = 95,
            erstzulassung = AbJan2021,
        )
        TarifNach9Abs1(f) == 20,00
    }
    testfall "alle CO₂-Bänder: 1.000 cm³, 200 g/km → 20,00 + 280,00 = 300,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Fremdzuendung,
            hubraumCcm = 1000, co2GrammProKm = 200,
            erstzulassung = AbJan2021,
        )
        TarifNach9Abs1(f) == 300,00
    }
}

prüfe "§ 9 Abs. 1 Nr. 2 Buchst. b — PKW 1.7.2009–31.12.2020" {
    testfall "Benziner 1.390 cm³, 130 g/km, Freigrenze 110 → 28,00 + 40,00 = 68,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Fremdzuendung,
            hubraumCcm = 1390, co2GrammProKm = 130,
            erstzulassung = JuliBisDez2020, co2FreigrenzeNr2b = 110,
        )
        TarifNach9Abs1(f) == 68,00
    }
}

prüfe "§ 9 Abs. 1 Nr. 2 Buchst. a — PKW bis 30.6.2009 (Schadstoffstufe)" {
    testfall "Benziner Stufe ee, 1.600 cm³ → 16 × 25,36 = 405,76 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Fremdzuendung,
            hubraumCcm = 1600,
            erstzulassung = BisJuni2009, pkwStufe = Ee,
        )
        TarifNach9Abs1(f) == 405,76
    }
    testfall "Diesel Stufe aa, 1.900 cm³ → 19 × 15,44 = 293,36 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Pkw, antrieb = Selbstzuendung,
            hubraumCcm = 1900,
            erstzulassung = BisJuni2009, pkwStufe = Aa,
        )
        TarifNach9Abs1(f) == 293,36
    }
}

prüfe "§ 9 Abs. 1 Nr. 2a — Wohnmobile (progressiv, gedeckelt)" {
    testfall "≥ S4, 3.000 kg → 160,00 + 50,00 = 210,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Wohnmobil, antrieb = Selbstzuendung,
            gesamtgewichtKg = 3000, wohnmobilklasse = MindestensS4,
        )
        TarifNach9Abs1(f) == 210,00
    }
    testfall "≥ S4, sehr schwer → Höchstbetrag 800,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Wohnmobil, antrieb = Selbstzuendung,
            gesamtgewichtKg = 20000, wohnmobilklasse = MindestensS4,
        )
        TarifNach9Abs1(f) == 800,00
    }
    testfall "S3–S1, 3.000 kg → 240,00 + 50,00 = 290,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Wohnmobil, antrieb = Selbstzuendung,
            gesamtgewichtKg = 3000, wohnmobilklasse = S1bisS3,
        )
        TarifNach9Abs1(f) == 290,00
    }
    testfall "sonst, 6.000 kg → 400,00 + 150,00 + 75,00 = 625,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Wohnmobil, antrieb = Selbstzuendung,
            gesamtgewichtKg = 6000, wohnmobilklasse = WomoSonst,
        )
        TarifNach9Abs1(f) == 625,00
    }
}

prüfe "§ 9 Abs. 1 Nr. 3 — andere Kfz ≤ 3.500 kg (progressiv)" {
    testfall "2.800 kg → 112,50 + 48,08 = 160,58 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereBis3500, antrieb = Selbstzuendung, gesamtgewichtKg = 2800,
        )
        TarifNach9Abs1(f) == 160,58
    }
    testfall "3.500 kg → 112,50 + 60,10 + 38,34 = 210,94 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereBis3500, antrieb = Selbstzuendung, gesamtgewichtKg = 3500,
        )
        TarifNach9Abs1(f) == 210,94
    }
}

prüfe "§ 9 Abs. 1 Nr. 4 — Kfz > 3.500 kg (a/b/c/d, gedeckelt)" {
    testfall "Buchst. a (≥ S2), 5.000 kg → 173,90 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereUeber3500, antrieb = Selbstzuendung,
            gesamtgewichtKg = 5000, nfzklasse = MindestensS2,
        )
        TarifNach9Abs1(f) == 173,90
    }
    testfall "Buchst. a, sehr schwer → Höchstbetrag 556,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereUeber3500, antrieb = Selbstzuendung,
            gesamtgewichtKg = 20000, nfzklasse = MindestensS2,
        )
        TarifNach9Abs1(f) == 556,00
    }
    testfall "Buchst. c (G1), 5.000 kg → 260,80 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereUeber3500, antrieb = Selbstzuendung,
            gesamtgewichtKg = 5000, nfzklasse = G1,
        )
        TarifNach9Abs1(f) == 260,80
    }
    testfall "Buchst. d (sonst), 5.000 kg → 304,25 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereUeber3500, antrieb = Selbstzuendung,
            gesamtgewichtKg = 5000, nfzklasse = NfzSonst,
        )
        TarifNach9Abs1(f) == 304,25
    }
    testfall "Buchst. d, sehr schwer → Höchstbetrag 1.681,00 €" {
        var f: Fahrzeug = Fahrzeug(
            art = AndereUeber3500, antrieb = Selbstzuendung,
            gesamtgewichtKg = 40000, nfzklasse = NfzSonst,
        )
        TarifNach9Abs1(f) == 1.681,00
    }
}

prüfe "§ 9 Abs. 1 Nr. 5 — Anhänger (7,46 € je 200 kg, max 373,24 €)" {
    testfall "2.000 kg → 10 × 7,46 = 74,60 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Anhaenger, antrieb = Fremdzuendung, gesamtgewichtKg = 2000,
        )
        TarifNach9Abs1(f) == 74,60
    }
    testfall "schwer → Höchstbetrag 373,24 €" {
        var f: Fahrzeug = Fahrzeug(
            art = Anhaenger, antrieb = Fremdzuendung, gesamtgewichtKg = 20000,
        )
        TarifNach9Abs1(f) == 373,24
    }
}

prüfe "§ 9 Abs. 2 — Elektro-Ermäßigung 50 % (nur Nr. 3 / Nr. 4a)" {
    testfall "E-Kfz Nr. 3, 3.000 kg → 172,60 / 2 = 86,30 €" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(art = AndereBis3500, antrieb = Elektro, gesamtgewichtKg = 3000),
        )
        e.tarifbetrag == 172,60 und e.nachElektro == 86,30 und e.jahressteuer == 86,30
    }
    testfall "E-Kfz Nr. 4a, 5.000 kg → 173,90 / 2 = 86,95 €" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(
                art = AndereUeber3500, antrieb = Elektro,
                gesamtgewichtKg = 5000, nfzklasse = MindestensS2,
            ),
        )
        e.nachElektro == 86,95
    }
    testfall "E-Kfz Nr. 4d → KEINE 50 %-Ermäßigung (nur a)" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(
                art = AndereUeber3500, antrieb = Elektro,
                gesamtgewichtKg = 5000, nfzklasse = NfzSonst,
            ),
        )
        e.nachElektro == 304,25
    }
}

prüfe "§ 3a / § 3d — Vergünstigungen / Befreiungen" {
    testfall "§ 3a Abs. 1 (H/Bl/aG) → volle Befreiung 0,00 €" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(
                art = Kraftrad, antrieb = Fremdzuendung,
                hubraumCcm = 125, behinderung = Befreit3aAbs1,
            ),
        )
        e.jahressteuer == 0,00
    }
    testfall "§ 3a Abs. 2 → 50 % (9,20 / 2 = 4,60 €)" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(
                art = Kraftrad, antrieb = Fremdzuendung,
                hubraumCcm = 125, behinderung = Ermaessigt3aAbs2,
            ),
        )
        e.tarifbetrag == 9,20 und e.jahressteuer == 4,60
    }
    testfall "§ 3d E-Befreiung aktiv → 0,00 € (trotz Tarifbetrag)" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(
                art = Pkw, antrieb = Elektro,
                hubraumCcm = 0, co2GrammProKm = 0,
                erstzulassung = AbJan2021, elektroBefreitNach3d = wahr,
            ),
        )
        e.jahressteuer == 0,00
    }
}

prüfe "Gesamtberechnung — vollständiges Ergebnis" {
    testfall "Benziner-PKW ab 2021, 1.598 cm³, 120 g/km" {
        var e: KraftfahrzeugsteuerErgebnis = BerechneKraftfahrzeugsteuer(
            Fahrzeug(
                art = Pkw, antrieb = Fremdzuendung,
                hubraumCcm = 1598, co2GrammProKm = 120,
                erstzulassung = AbJan2021,
            ),
        )
        e.tarifbetrag == 83,00 und e.nachElektro == 83,00 und e.jahressteuer == 83,00
    }
}

Generierte Artefakte

Aus demselben Modul erzeugt die Toolchain ohne weiteres Zutun ausführbaren Code, Dokumentation und Programmablaufpläne — die Steuerregel bleibt die einzige Quelle der Wahrheit.

  • findsl codegen → typisierter Java-, TypeScript- oder JavaScript-Code mit exakter Dezimalarithmetik.
  • findsl docgenHTML-, Markdown- und PDF-Doku mit Paragraphen-Verweisen aus den @Quelle-Annotationen.
  • findsl papgenProgrammablaufpläne je Funktion (Mermaid oder self-contained HTML).

Mehr dazu unter Generieren und in der CLI-Referenz.

Quelle und Generat

Alle Dateien dieses Beispiels nebeneinander: links die FinDSL-Module, daneben sämtliche Artefakte, die die Toolchain daraus erzeugt — Java, TypeScript, JavaScript, die Dokumentation (Markdown, HTML, PDF) und die Programmablaufpläne. Zum Editieren und Prüfen im Playground öffnen.

kraftst.findsl
--
# Kraftfahrzeugsteuer — vollständiger Jahressteuer-Tarif (§§ 8, 9 KraftStG)

Bildet die **Jahressteuer** nach dem Kraftfahrzeugsteuergesetz
(KraftStG 2002, i.d.g.F.) vollständig ab:

- **§ 8 KraftStG** — Bemessungsgrundlage (Hubraum / CO₂ / zulässiges
  Gesamtgewicht je nach Fahrzeugart) → Auswahl des Tarifs.
- **§ 9 Abs. 1 KraftStG** — Steuersatz, alle Nummern:
  Nr. 1 Krafträder · Nr. 2 a/b/c Personenkraftwagen (Erstzulassung
  bis 30.6.2009 / 1.7.2009–31.12.2020 / ab 1.1.2021) · Nr. 2a
  Wohnmobile · Nr. 2b dreirädrige/leichte vierrädrige Kfz · Nr. 3
  andere Kfz ≤ 3.500 kg · Nr. 4 a/b/c/d Kfz > 3.500 kg · Nr. 5
  Anhänger.
- **§ 9 Abs. 2 KraftStG** — 50 % Ermäßigung für Elektrofahrzeuge
  (nur Beträge nach Abs. 1 Nr. 3 oder Nr. 4 Buchst. a).
- **§ 9 Abs. 3 KraftStG** — Tagessteuer für ausländische Fahrzeuge.
- **§ 9 Abs. 4 KraftStG** — Jahressteuer für rote / Oldtimer-Kennzeichen.
- **§ 3a KraftStG** — Vergünstigungen für Schwerbehinderte
  (Abs. 1 volle Befreiung · Abs. 2 50 % Ermäßigung).
- **§ 3d KraftStG** — Steuerbefreiung für Elektrofahrzeuge
  (Erstzulassung 18.5.2011–31.12.2030: 10 Jahre, längstens bis
  31.12.2035).
- **§ 9a KraftStG** — Diesel-Zuschlag: ausgelaufen (galt nur
  1.4.2007–31.3.2011); wird nicht mehr angewandt (dokumentiert).

**Progressive Tarife** (Nr. 2a/3/4) werden je angefangene 200-kg-Stufe
in der jeweiligen Gewichtsspanne berechnet; die kumulierten
Stufenbeträge sind als auditierbare Konstanten aus den Stufensätzen
abgeleitet (keine handsummierten Werte). „Je angefangene Einheit"
nutzt das Stdlib-Builtin `aufrunden`.

**Bewusst nicht modelliert (dokumentiert, außerhalb der reinen
Steuerbetragsberechnung):** Verfahren §§ 11/12 (Entrichtung,
Festsetzung), Mindestdauer/anteilige Berechnung § 5, Ausnahmekatalog
§ 3, widerrechtliche Benutzung. Die Zuordnung der Schadstoff-/
Geräusch-/Erstzulassungsklasse trifft nach § 2 Abs. 2 Nr. 2 KraftStG
**verbindlich die Zulassungsbehörde** — sie geht hier als geprüfte
Eingabe ein (nicht aus EU-Richtlinien hergeleitet).
--

// ===========================================================================
// Modul-Struktur (Implementierung auf mehrere Dateien aufgeteilt)
// ===========================================================================
// Diese Datei ist die öffentliche Einstiegsdatei (Orchestrierung der
// gesetzlichen Reihenfolge § 9 Abs. 1 Auswahl → Abs. 2 → § 3a/§ 3d →
// Gesamt) plus die § 9 Abs. 4-Konstanten (rote/Oldtimer-Kennzeichen).
// Die Tarifdetails liegen in kohäsiven Geschwisterdateien:
//   - kraftstg-typen.fin              Aufzählungen, Datensätze, Helfer
//   - kraftstg-tarif-leicht.fin       § 9 Abs. 1 Nr. 1/2/2a/2b (Konst.+Fn.)
//   - kraftstg-tarif-nutzfahrzeug.fin § 9 Abs. 1 Nr. 3/4/5     (Konst.+Fn.)
// Modul-Graph (azyklisch): kraftstg-typen ← {kraftstg-tarif-leicht,
// kraftstg-tarif-nutzfahrzeug} ← kraftstg-steuer.

verwende {
    Fahrzeug,
    KraftfahrzeugsteuerErgebnis,
    Kraftrad,
    Pkw,
    Wohnmobil,
    DreiLeichtvier,
    AndereBis3500,
    AndereUeber3500,
    Anhaenger,
    Elektro,
    MindestensS2,
    Befreit3aAbs1,
    Ermaessigt3aAbs2,
} aus "./kraftstg-typen"

verwende {
    SteuerKraftrad,
    SteuerPkw,
    SteuerWohnmobil,
    SteuerDreiLeichtvier,
} aus "./kraftstg-tarif-leicht"

verwende {
    SteuerNr3,
    SteuerNr4,
    SteuerAnhaenger,
} aus "./kraftstg-tarif-nutzfahrzeug"

// ===========================================================================
// § 9 Abs. 4 — rote / Oldtimer-Kennzeichen
// ===========================================================================

-- Rotes/Oldtimer-Kennzeichen, nur für Krafträder gültig (Jahressteuer). --
@Quelle("§ 9 Absatz 4 Nummer 1 KraftStG")
konst KZ_NUR_KRAD: EuroCent = 46,02

-- Rotes/Oldtimer-Kennzeichen, im Übrigen (Jahressteuer). --
@Quelle("§ 9 Absatz 4 Nummer 2 KraftStG")
konst KZ_UEBRIGE: EuroCent = 191,73

// ===========================================================================
// § 9 Abs. 1 — Tarifauswahl nach Fahrzeugart (§ 8 KraftStG)
// ===========================================================================

--
Tarifbetrag nach § 9 Abs. 1 KraftStG: wählt anhand der Fahrzeugart
(§ 8 KraftStG) die einschlägige Nummer.

@param f  Fahrzeug-Eingaben.
@rückgabe Steuer nach § 9 Abs. 1 KraftStG (vor Abs. 2 / § 3a / § 3d).
--
@Quelle("§ 9 Absatz 1 KraftStG")
fn TarifNach9Abs1(f: Fahrzeug): EuroCent = wähle (f.art) {
    falls Kraftrad        -> SteuerKraftrad(f.hubraumCcm)
    falls Pkw             -> SteuerPkw(f)
    falls Wohnmobil       -> SteuerWohnmobil(f.gesamtgewichtKg, f.wohnmobilklasse)
    falls DreiLeichtvier  -> SteuerDreiLeichtvier(f.hubraumCcm, f.dreiradGrenzwerte, f.antrieb)
    falls AndereBis3500   -> SteuerNr3(f.gesamtgewichtKg)
    falls AndereUeber3500 -> SteuerNr4(f.gesamtgewichtKg, f.nfzklasse)
    falls Anhaenger       -> SteuerAnhaenger(f.gesamtgewichtKg)
}

// ===========================================================================
// § 9 Abs. 2 — Elektrofahrzeug-Ermäßigung; § 3a / § 3d — Vergünstigungen
// ===========================================================================

--
50 %-Ermäßigung für Elektrofahrzeuge nach § 9 Abs. 2 KraftStG — gilt
ausschließlich für Beträge nach § 9 Abs. 1 Nr. 3 oder Nr. 4 Buchst. a
(Nutzfahrzeuge). Für alle anderen Fahrzeugarten/Klassen bleibt der
Betrag unverändert (reine Elektro-PKW sind regelmäßig nach § 3d
befreit).

@param f      Fahrzeug-Eingaben.
@param betrag Tarifbetrag nach § 9 Abs. 1 KraftStG.
@rückgabe     Betrag nach § 9 Abs. 2 KraftStG.
--
@Quelle("§ 9 Absatz 2 KraftStG")
fn _Anwende9Abs2(f: Fahrzeug, betrag: EuroCent): EuroCent = wähle {
    falls f.antrieb == Elektro und f.art == AndereBis3500   -> (betrag / 2) als EuroCent
    falls f.antrieb == Elektro und f.art == AndereUeber3500
        und f.nfzklasse == MindestensS2                     -> (betrag / 2) als EuroCent
    sonst                                                   -> betrag
}

--
Anwendung der Schwerbehinderten-Vergünstigung (§ 3a KraftStG) und der
Elektrofahrzeug-Befreiung (§ 3d KraftStG) auf den Steuerbetrag.
Reihenfolge: § 3d-Befreiung und § 3a Abs. 1-Befreiung setzen die
Steuer auf 0; § 3a Abs. 2 halbiert.

@param f      Fahrzeug-Eingaben.
@param betrag Betrag nach § 9 Abs. 1/2 KraftStG.
@rückgabe     Festgesetzte Jahressteuer (0 bei Befreiung).
--
@Quelle("§ 3a KraftStG")
fn _AnwendeVerguenstigung(f: Fahrzeug, betrag: EuroCent): EuroCent = wähle {
    falls f.elektroBefreitNach3d            -> 0,00
    falls f.behinderung == Befreit3aAbs1    -> 0,00
    falls f.behinderung == Ermaessigt3aAbs2 -> (betrag / 2) als EuroCent
    sonst                                   -> betrag
}

// ===========================================================================
// Gesamtberechnung
// ===========================================================================

--
Vollständige Festsetzung der Kraftfahrzeug-Jahressteuer in der
gesetzlichen Reihenfolge: § 8 (Tarifauswahl) → § 9 Abs. 1
(Tarifbetrag) → § 9 Abs. 2 (Elektro-Ermäßigung) → § 3a / § 3d
(Vergünstigung/Befreiung). Liefert alle Zwischengrößen.

@param f  Fahrzeug-Eingaben.
@rückgabe Vollständig dokumentiertes Berechnungsergebnis.
--
@Quelle("§ 9 KraftStG")
fn BerechneKraftfahrzeugsteuer(f: Fahrzeug): KraftfahrzeugsteuerErgebnis {
    var tarif: EuroCent = TarifNach9Abs1(f)
    var nachE: EuroCent = _Anwende9Abs2(f, tarif)
    var jahr: EuroCent = _AnwendeVerguenstigung(f, nachE)
    KraftfahrzeugsteuerErgebnis(
        tarifbetrag  = tarif,
        nachElektro  = nachE,
        jahressteuer = jahr,
    )
}