use rust_decimal::Decimal;
use rust_decimal::dec;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum StromsteuerBefreiung {
ErneuerbarSelbstverbrauch,
ZurStromerzeugung,
Kleinanlage,
Notstrom,
Bordnetz,
VersteuerteEnergieerzeugnisse,
ZwischenstaatlicheEinrichtung,
}
impl StromsteuerBefreiung {
#[must_use]
pub const fn citation(self) -> &'static str {
match self {
Self::ErneuerbarSelbstverbrauch => "§ 9 Abs. 1 Nr. 1 StromStG",
Self::ZurStromerzeugung => "§ 9 Abs. 1 Nr. 2 StromStG",
Self::Kleinanlage => "§ 9 Abs. 1 Nr. 3 StromStG",
Self::Notstrom => "§ 9 Abs. 1 Nr. 4 StromStG",
Self::Bordnetz => "§ 9 Abs. 1 Nr. 5 StromStG",
Self::VersteuerteEnergieerzeugnisse => "§ 9 Abs. 1 Nr. 6 StromStG",
Self::ZwischenstaatlicheEinrichtung => "§ 9 Abs. 1 Nr. 7/8 StromStG",
}
}
#[must_use]
pub const fn description(self) -> &'static str {
match self {
Self::ErneuerbarSelbstverbrauch => {
"Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 1 StromStG — Selbstverbrauch \
erneuerbar erzeugten Stroms am Ort der Erzeugung)"
}
Self::ZurStromerzeugung => {
"Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 2 StromStG — Strom zur Stromerzeugung)"
}
Self::Kleinanlage => {
"Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 3 StromStG — Anlage bis 2 MW, \
Selbstverbrauch bzw. Belieferung im räumlichen Zusammenhang)"
}
Self::Notstrom => {
"Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 4 StromStG — Notstromanlage)"
}
Self::Bordnetz => "Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 5 StromStG — Bordnetz)",
Self::VersteuerteEnergieerzeugnisse => {
"Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 6 StromStG — Strom aus versteuerten \
Energieerzeugnissen, Anlage bis 2 MW)"
}
Self::ZwischenstaatlicheEinrichtung => {
"Stromsteuer: steuerfrei (§ 9 Abs. 1 Nr. 7/8 StromStG — Streitkräfte / \
zwischenstaatliche Einrichtung)"
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum StromsteuerErmaessigung {
Fahrstrom,
Landstrom,
}
impl StromsteuerErmaessigung {
#[must_use]
pub const fn rate_ct_per_kwh(self) -> Decimal {
match self {
Self::Fahrstrom => dec!(1.142),
Self::Landstrom => dec!(0.05),
}
}
#[must_use]
pub const fn citation(self) -> &'static str {
match self {
Self::Fahrstrom => "§ 9 Abs. 2 StromStG",
Self::Landstrom => "§ 9 Abs. 3 StromStG",
}
}
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::Fahrstrom => "Stromsteuer (ermäßigt, Fahrstrom)",
Self::Landstrom => "Stromsteuer (ermäßigt, Landstrom)",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(tag = "art", rename_all = "SCREAMING_SNAKE_CASE")]
pub enum StromsteuerTarif {
#[default]
Regel,
Befreiung { grund: StromsteuerBefreiung },
Ermaessigung { grund: StromsteuerErmaessigung },
}
impl StromsteuerTarif {
#[must_use]
pub fn rate_ct_per_kwh(self, regelsatz_ct_per_kwh: Decimal) -> Decimal {
match self {
Self::Regel => regelsatz_ct_per_kwh,
Self::Befreiung { .. } => Decimal::ZERO,
Self::Ermaessigung { grund } => grund.rate_ct_per_kwh(),
}
}
#[must_use]
pub const fn is_befreit(self) -> bool {
matches!(self, Self::Befreiung { .. })
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum EnergiesteuerBefreiung {
StofflicheVerwendung,
HerstellerbetriebEigenverbrauch,
SchiffUndLuftfahrt,
GasfoermigeBiogeneErzeugnisse,
}
impl EnergiesteuerBefreiung {
#[must_use]
pub const fn citation(self) -> &'static str {
match self {
Self::StofflicheVerwendung => "§ 25 EnergieStG",
Self::HerstellerbetriebEigenverbrauch => "§ 26 EnergieStG",
Self::SchiffUndLuftfahrt => "§ 27 EnergieStG",
Self::GasfoermigeBiogeneErzeugnisse => "§ 28 EnergieStG",
}
}
#[must_use]
pub const fn description(self) -> &'static str {
match self {
Self::StofflicheVerwendung => {
"Energiesteuer: steuerfreie Verwendung (§ 25 EnergieStG i. V. m. \
§ 24 Abs. 2 EnergieStG — Erlaubnisschein liegt vor)"
}
Self::HerstellerbetriebEigenverbrauch => {
"Energiesteuer: steuerfreie Verwendung (§ 26 EnergieStG — Eigenverbrauch \
im Herstellerbetrieb)"
}
Self::SchiffUndLuftfahrt => {
"Energiesteuer: steuerfreie Verwendung (§ 27 EnergieStG — Schiff- und Luftfahrt)"
}
Self::GasfoermigeBiogeneErzeugnisse => {
"Energiesteuer: steuerfrei (§ 28 EnergieStG — gasförmige Energieerzeugnisse \
aus Biomasse bzw. Deponie-, Klär- und Grubengas)"
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(tag = "art", rename_all = "SCREAMING_SNAKE_CASE")]
pub enum EnergiesteuerTarif {
#[default]
Regel,
Befreiung { grund: EnergiesteuerBefreiung },
}
impl EnergiesteuerTarif {
#[must_use]
pub fn rate_ct_per_kwh(self, regelsatz_ct_per_kwh: Decimal) -> Decimal {
match self {
Self::Regel => regelsatz_ct_per_kwh,
Self::Befreiung { .. } => Decimal::ZERO,
}
}
#[must_use]
pub const fn is_befreit(self) -> bool {
matches!(self, Self::Befreiung { .. })
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Steuerentlastung {
Stromsteuer9b,
Stromsteuer9a,
Stromsteuer9c,
Energiesteuer53a,
Energiesteuer54,
}
impl Steuerentlastung {
#[must_use]
pub const fn citation(self) -> &'static str {
match self {
Self::Stromsteuer9b => "§ 9b StromStG",
Self::Stromsteuer9a => "§ 9a StromStG",
Self::Stromsteuer9c => "§ 9c StromStG",
Self::Energiesteuer53a => "§ 53a EnergieStG",
Self::Energiesteuer54 => "§ 54 EnergieStG",
}
}
#[must_use]
pub const fn levy_tag(self) -> &'static str {
match self {
Self::Stromsteuer9a | Self::Stromsteuer9b | Self::Stromsteuer9c => "stromsteuer",
Self::Energiesteuer53a | Self::Energiesteuer54 => "energiesteuer_gas",
}
}
#[must_use]
pub const fn hinweis(self) -> &'static str {
match self {
Self::Stromsteuer9b => {
"Hinweis: Für die ausgewiesene Stromsteuer kommt eine Steuerentlastung nach \
§ 9b StromStG in Betracht (Antrag beim Hauptzollamt, ab 12 500 kWh/Jahr). \
Die Lieferung wird in voller Höhe versteuert."
}
Self::Stromsteuer9a => {
"Hinweis: Für die ausgewiesene Stromsteuer kommt eine Steuerentlastung nach \
§ 9a StromStG (begünstigte Prozesse und Verfahren) in Betracht — Antrag \
beim Hauptzollamt. Die Lieferung wird in voller Höhe versteuert."
}
Self::Stromsteuer9c => {
"Hinweis: Für die ausgewiesene Stromsteuer kommt eine Steuerentlastung nach \
§ 9c StromStG (öffentlicher Personennahverkehr) in Betracht — Antrag beim \
Hauptzollamt. Die Lieferung wird in voller Höhe versteuert."
}
Self::Energiesteuer53a => {
"Hinweis: Für die ausgewiesene Energiesteuer kommt eine teilweise \
Steuerentlastung nach § 53a Abs. 1/Abs. 4 EnergieStG (KWK) in Betracht — \
Antrag beim Hauptzollamt. Die Lieferung wird in voller Höhe versteuert."
}
Self::Energiesteuer54 => {
"Hinweis: Für die ausgewiesene Energiesteuer kommt eine Steuerentlastung nach \
§ 54 EnergieStG in Betracht — Antrag beim Hauptzollamt. Die Lieferung wird \
in voller Höhe versteuert."
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn only_a_befreiung_zeroes_the_levy() {
let regel = dec!(2.05);
assert_eq!(StromsteuerTarif::Regel.rate_ct_per_kwh(regel), regel);
assert_eq!(
StromsteuerTarif::Befreiung {
grund: StromsteuerBefreiung::Kleinanlage
}
.rate_ct_per_kwh(regel),
Decimal::ZERO
);
assert_eq!(
StromsteuerTarif::Ermaessigung {
grund: StromsteuerErmaessigung::Fahrstrom
}
.rate_ct_per_kwh(regel),
dec!(1.142)
);
assert_eq!(
StromsteuerTarif::Ermaessigung {
grund: StromsteuerErmaessigung::Landstrom
}
.rate_ct_per_kwh(regel),
dec!(0.05)
);
}
#[test]
fn an_entlastung_has_no_rate() {
assert_eq!(Steuerentlastung::Stromsteuer9b.citation(), "§ 9b StromStG");
assert_eq!(Steuerentlastung::Stromsteuer9b.levy_tag(), "stromsteuer");
assert_eq!(
Steuerentlastung::Energiesteuer54.levy_tag(),
"energiesteuer_gas"
);
assert!(
Steuerentlastung::Energiesteuer53a
.hinweis()
.contains("§ 53a")
);
}
#[test]
fn the_default_is_taxed() {
assert_eq!(StromsteuerTarif::default(), StromsteuerTarif::Regel);
assert_eq!(EnergiesteuerTarif::default(), EnergiesteuerTarif::Regel);
assert!(!StromsteuerTarif::default().is_befreit());
assert!(!EnergiesteuerTarif::default().is_befreit());
}
#[test]
fn tagged_serde_round_trip() {
let t = StromsteuerTarif::Befreiung {
grund: StromsteuerBefreiung::Kleinanlage,
};
let json = serde_json::to_string(&t).unwrap();
assert_eq!(json, r#"{"art":"BEFREIUNG","grund":"KLEINANLAGE"}"#);
assert_eq!(serde_json::from_str::<StromsteuerTarif>(&json).unwrap(), t);
let e = EnergiesteuerTarif::Befreiung {
grund: EnergiesteuerBefreiung::StofflicheVerwendung,
};
let json = serde_json::to_string(&e).unwrap();
assert_eq!(
json,
r#"{"art":"BEFREIUNG","grund":"STOFFLICHE_VERWENDUNG"}"#
);
assert_eq!(
serde_json::from_str::<EnergiesteuerTarif>(&json).unwrap(),
e
);
}
}