use rust_decimal::Decimal;
use rust_decimal::dec;
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub enum Sect19Art {
AtypischeNetznutzung,
IntensiveNetznutzung,
}
pub const BANDLAST_MINDESTARBEIT_KWH: Decimal = dec!(10_000_000);
#[must_use]
pub fn bandlast_mindestentgelt(
benutzungsstunden: Decimal,
jahresarbeit_kwh: Decimal,
) -> Option<Decimal> {
if jahresarbeit_kwh < BANDLAST_MINDESTARBEIT_KWH || benutzungsstunden < dec!(7000) {
return None;
}
Some(if benutzungsstunden >= dec!(8000) {
dec!(0.10)
} else if benutzungsstunden >= dec!(7500) {
dec!(0.15)
} else {
dec!(0.20)
})
}
pub const ATYPISCH_MINDESTENTGELT: Decimal = dec!(0.20);
#[derive(Debug, Clone, PartialEq, serde::Serialize)]
pub struct Sect19Vereinbarung {
pub art: Sect19Art,
pub vereinbarter_prozentsatz: Decimal,
pub genehmigung: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_statutory_staircase() {
let gwh10 = dec!(10_000_000);
assert_eq!(bandlast_mindestentgelt(dec!(7000), gwh10), Some(dec!(0.20)));
assert_eq!(bandlast_mindestentgelt(dec!(7499), gwh10), Some(dec!(0.20)));
assert_eq!(bandlast_mindestentgelt(dec!(7500), gwh10), Some(dec!(0.15)));
assert_eq!(bandlast_mindestentgelt(dec!(7999), gwh10), Some(dec!(0.15)));
assert_eq!(bandlast_mindestentgelt(dec!(8000), gwh10), Some(dec!(0.10)));
assert_eq!(bandlast_mindestentgelt(dec!(8760), gwh10), Some(dec!(0.10)));
}
#[test]
fn qualification_needs_hours_and_energy() {
assert_eq!(bandlast_mindestentgelt(dec!(6999), dec!(10_000_000)), None);
assert_eq!(
bandlast_mindestentgelt(dec!(8000), dec!(9_999_999)),
None,
"9.999999 GWh is below the threshold however high the utilisation"
);
}
}