Skip to main content

SanktionsTyp

Enum SanktionsTyp 

Source
#[non_exhaustive]
pub enum SanktionsTyp {
Show 13 variants FernsteuerbarkeitFehlend, SpeicherAnforderungNichtErfuellt, IMssAnforderungNichtErfuellt, Sect10bVorgabenVerletzt, MastrNichtRegistriert, InbetriebnahmeVorgabeVerletzt, VolleinspeisungspflichtVerletzt, AusfallverguetungHoechstdauerUeberschritten, EinspeiseverguetungUnzulaessigeNutzung, VeraeusserungsformWechselUngueltig, VeraeusserungsformNachweispflichtVerletzt, ZuordnungsWechselNichtGemeldet, DoppelvermarktungsverbotVerletzt,
}
Expand description

§52 EEG 2023 compliance violation type.

Each type triggers a payment obligation to the NB of €10/kW/month (§52 Abs. 2). The obligation can be retroactively reduced to €2/kW/month once fulfilled (§52 Abs. 3).

Use crate::foerderdauer::calculate_pflichtzahlung to compute the penalty.

§EEG version note

§52 EEG 2023 applies to plants under current EEG 2023 rules. For old plants (commissioned before 01.01.2023) under §100 Übergangsregelung, the old §47 EEG 2021 “Vergütung = 0” rule applies instead — use sanktion: Some(SanktionAlt::VerguetungAufNull).

Variants (Non-exhaustive)§

This enum is marked as non-exhaustive
Non-exhaustive enums could have additional variants added in future. Therefore, when matching against variants of non-exhaustive enums, an extra wildcard arm must be added to account for any future variants.
§

FernsteuerbarkeitFehlend

§52 Abs. 1 Nr. 1 — Missing Fernsteuerbarkeit (§9 Abs. 1/2).

Plant ≥25 kW does not have remote control capability installed. Obligation fulfilled → reduced to €2/kW/month retroactively. Technical defect grace: 2 months waived.

§

SpeicherAnforderungNichtErfuellt

§52 Abs. 1 Nr. 2 — Missing Speicher / §9 Abs. 5 violation.

Plant does not meet the storage requirement for certain EE/KWK plants.

Rate: €10/kW/month (§52 Abs. 2). Not in the §52 Abs. 3 Nr. 1 reduction list — this violation is NOT retroactively reducible to €2/kW.

§

IMssAnforderungNichtErfuellt

§52 Abs. 1 Nr. 3 — Missing iMSys Messeinrichtung (§9 Abs. 8).

Plant not equipped with the required intelligent measurement system infrastructure.

§

Sect10bVorgabenVerletzt

§52 Abs. 1 Nr. 4 — Verstoß gegen §10b (Vorgaben zur Direktvermarktung).

§10b Abs. 1 obliges the operator of a plant over 25 kW that direct-markets to fit the technical equipment through which the Direktvermarktungsunternehmen can call up the Ist-Einspeisung and remotely curtail it, and to grant it that authority. It is not the duty to direct-market: a plant over 100 kW that stays on the Einspeisevergütung breaches nothing here — it simply has no §21 Abs. 1 Satz 1 Nr. 1 claim, which is SettlementStatus::KeinAnspruch, not a Zahlung.

Rate: €10/kW/month, reduced to €2 retroactively on cure (§52 Abs. 3 Satz 1 Nr. 1) and waived for two months on a technical defect (Satz 2).

§

MastrNichtRegistriert

§52 Abs. 1 Nr. 11 — Plant not registered in MaStR.

Required registration data not submitted per Marktstammdatenregisterverordnung. Obligation fulfilled → reduced to €2/kW/month retroactively.

EEG 2023 change: Old §47 EEG 2021 reduced Vergütung to EUR 0. §52 EEG 2023 instead charges €10/kW/month; Vergütung remains payable. Use sanktion: Some(SanktionAlt::VerguetungAufNull) for old plants (EEG ≤2021, §100 Übergangsregelung).

§

InbetriebnahmeVorgabeVerletzt

§52 Abs. 1 Nr. 9a — Post-commissioning violation of §37 Abs. 1a or §48 Abs. 6.

Plant violates the obligations that arise after commissioning under those paragraphs (§37 Abs. 1a: iMSys Nachrüstung after commissioning; §48 Abs. 6: solar Segment obligations).

Rate: always €2/kW/month (§52 Abs. 3 Nr. 2 EEG 2023). This is a permanently lower rate — NOT reduced from €10; starts at €2 for this type. nachtraeglich_erfuellt has NO effect on this type.

§

VolleinspeisungspflichtVerletzt

§52 Abs. 1 Nr. 10 — Volleinspeisung obligation violated (§48 Abs. 2a).

Plant registered for Volleinspeisung (100% grid feed-in bonus, §48 Abs. 2a EEG 2023) but does not feed all generated electricity into the grid in a calendar year.

Rate: always €2/kW/month (§52 Abs. 3 Nr. 2 EEG 2023). nachtraeglich_erfuellt has NO effect on this type.

§§52 Abs. 4 Nr. 3: calendar-year scope

This violation is assessed for all calendar months of the year in which the under-delivery occurs (not just the months of non-delivery). Include all 12 months in monate_des_verstosses.

§

AusfallverguetungHoechstdauerUeberschritten

§52 Abs. 1 Nr. 5 — Ausfallvergütung Höchstdauer exceeded (§21 Abs. 1 Satz 1 Nr. 3).

Plant in Ausfallvergütung exceeds the statutory 3-month maximum.

The §10/kW Pflichtzahlung is owed for the months of the violation only — §52 Abs. 4 grants additional months solely to Nr. 7 (+3), Nr. 9 (+1), Nr. 10 (full calendar year) and Nr. 12 (+6). Nr. 5 is not listed there, so no extra months are added (adding +3 here over-charged the operator).

§

EinspeiseverguetungUnzulaessigeNutzung

§52 Abs. 1 Nr. 6 — Unzulässige Inanspruchnahme von Einspeisevergütung (§21 Abs. 2).

Plant claims Einspeisevergütung while violating the conditions of §21 Abs. 2 (e.g., plant participates in Regelenergiemarkt while on Einspeisevergütung).

§

VeraeusserungsformWechselUngueltig

§52 Abs. 1 Nr. 7 — Unzulässiger Veräußerungsform-Wechsel (§21b Abs. 2 Satz 1 zweiter Halbsatz).

Operator performs an impermissible switch of Veräußerungsform (e.g., switching when mandatory Direktvermarktung applies and return to Einspeisevergütung is blocked).

§§52 Abs. 4 Nr. 1: +3 extra months

Payment is also owed for the 3 calendar months following the violation period. Callers should add these 3 months to monate_des_verstosses.

§

VeraeusserungsformNachweispflichtVerletzt

§52 Abs. 1 Nr. 8 — Pflichtnachweis-Verletzung (§21b Abs. 3).

Operator fails to provide required evidence/documentation after a Veräußerungsform switch (§21b Abs. 3 documentation obligations).

§§52 Abs. 3 Satz 2: Technical defect grace

When technischer_defekt = true and violation occurred after 31 Dec 2023: payment waived for the violation month and the following month.

§

ZuordnungsWechselNichtGemeldet

§52 Abs. 1 Nr. 9 — Zuordnungs-/Wechselmeldung nicht übermittelt (§21c).

Operator did not notify the NB of a Veräußerungsform assignment or switch within the deadline per §21c EEG 2023.

§§52 Abs. 4 Nr. 2: +1 extra month

Payment is also owed for the 1 calendar month following the violation period. Callers should add this 1 month to monate_des_verstosses.

§

DoppelvermarktungsverbotVerletzt

§52 Abs. 1 Nr. 12 — Doppelvermarktungsverbot verletzt (§80 EEG 2023).

Strom was claimed for EEG payment AND simultaneously used in another subsidised scheme (e.g., EEG + EEG, or EEG + KWKG, or EEG + HKN). §80 prohibits double-counting.

§§52 Abs. 4 Nr. 4: +6 extra months

Payment is also owed for the 6 calendar months following the violation period. Callers should add these 6 months to monate_des_verstosses.

Implementations§

Source§

impl SanktionsTyp

Source

pub const ALL: [Self; 13]

Every variant, in the order §52 Abs. 1 lists them.

Thirteen, not twelve: Abs. 1 counts to 12 but inserts Nr. 9a between 9 and 10. The list is what a persistence layer’s CHECK constraint and a REST surface’s vocabulary are held against, so a new Pflichtverstoß cannot be added in one place and forgotten in the other.

Source

pub fn nummer(self) -> &'static str

Which Nummer of §52 Abs. 1 this is, as the statute writes it — "9a" is a Nummer of its own, which is why this is a string and not a number.

Source

pub fn as_db_str(self) -> &'static str

The stored/wire token — the SCREAMING_SNAKE_CASE serde name.

Source

pub fn from_db_str(s: &str) -> Option<Self>

Parse a stored/wire token back. None for anything not in Self::ALL.

Source

pub fn abs4_monate(self, monate_des_verstosses: u32) -> u32

§52 Abs. 4 — how many calendar months the Zahlung is owed for, given the months the breach itself lasted.

Four Nummern run past the breach: Nr. 7 „zusätzlich für die folgenden drei Kalendermonate“, Nr. 9 „zusätzlich für den folgenden Kalendermonat“, Nr. 12 „zusätzlich für die folgenden sechs Kalendermonate“ — and Nr. 10 is not an extension at all but a replacement: „für alle Kalendermonate des Kalenderjahres“.

Nr. 5 is deliberately absent. Abs. 4 does not name it, and adding three months there would charge a plant on the Ausfallvergütung a quarter it does not owe.

§Example
use eeg_billing::SanktionsTyp;

assert_eq!(SanktionsTyp::ZuordnungsWechselNichtGemeldet.abs4_monate(2), 3);
assert_eq!(SanktionsTyp::VolleinspeisungspflichtVerletzt.abs4_monate(2), 12);
assert_eq!(SanktionsTyp::AusfallverguetungHoechstdauerUeberschritten.abs4_monate(2), 2);

Trait Implementations§

Source§

impl Clone for SanktionsTyp

Source§

fn clone(&self) -> SanktionsTyp

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for SanktionsTyp

Source§

impl Debug for SanktionsTyp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for SanktionsTyp

Source§

impl Hash for SanktionsTyp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SanktionsTyp

Source§

fn eq(&self, other: &SanktionsTyp) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for SanktionsTyp

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.