use rust_decimal::Decimal;
use time::Date;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "SCREAMING_SNAKE_CASE"))]
pub enum FoerderendeGrund {
Expired20Years,
Expired20YearsPlusSect51aExtension,
AuctionAwardExpired,
KwkHourLimitExhausted,
KwkYearLimitReached,
VoluntaryTermination,
Revoked,
PermanentLoss,
MastrDeregistered,
}
impl FoerderendeGrund {
#[must_use]
pub fn transitions_to_post_eeg(self) -> bool {
matches!(
self,
Self::Expired20Years | Self::Expired20YearsPlusSect51aExtension
)
}
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SanktionStatus {
pub typ: crate::model::SanktionsTyp,
pub onset_date: Date,
pub erfuellt: bool,
pub erfuellungsdatum: Option<Date>,
pub monate_aktiv: u32,
pub aktueller_satz_eur_kw: Decimal,
pub bestandsschutz: bool,
}
impl SanktionStatus {
#[must_use]
pub fn gesamtpflichtzahlung(&self, leistung_kw: Decimal) -> Decimal {
crate::foerderdauer::calculate_pflichtzahlung(&crate::model::Pflichtverstoss {
typ: self.typ,
leistung_kw,
monate_des_verstosses: self.monate_aktiv,
nachtraeglich_erfuellt: self.erfuellt,
technischer_defekt: false, })
}
}