use rust_decimal::Decimal;
#[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 BiomassBrennstoff {
PflanzlicheBiomasse,
BiomethanAusBiomasse,
Guelle,
Festmist,
Holzbiomasse,
Klaegas,
Deponiegas,
Grubengas,
BiogenicWaste,
}
impl BiomassBrennstoff {
#[must_use]
pub fn guellebonusanlage_eligible(self) -> bool {
matches!(self, Self::Guelle | Self::Festmist)
}
#[must_use]
pub fn has_holzbiomasse_restriction(self) -> bool {
self == Self::Holzbiomasse
}
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BiomassSettlementData {
pub hauptbrennstoff: BiomassBrennstoff,
pub guelle_anteil: Decimal,
pub ist_guellebonusanlage: bool,
pub energiepflanzen_anteil: Decimal,
pub substrate_cap_ok: bool,
}
impl BiomassSettlementData {
#[must_use]
pub fn new(
hauptbrennstoff: BiomassBrennstoff,
guelle_anteil: Decimal,
energiepflanzen_anteil: Decimal,
leistung_kw: Decimal,
) -> Self {
use rust_decimal_macros::dec;
let ist_guellebonusanlage = hauptbrennstoff.guellebonusanlage_eligible()
&& guelle_anteil >= dec!(0.80)
&& leistung_kw <= dec!(75);
let substrate_cap_ok = energiepflanzen_anteil <= dec!(0.40);
Self {
hauptbrennstoff,
guelle_anteil,
ist_guellebonusanlage,
energiepflanzen_anteil,
substrate_cap_ok,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use rust_decimal_macros::dec;
#[test]
fn guellebonusanlage_qualifies_when_criteria_met() {
let data = BiomassSettlementData::new(
BiomassBrennstoff::Guelle,
dec!(0.85), dec!(0.05), dec!(50), );
assert!(data.ist_guellebonusanlage);
assert!(data.substrate_cap_ok);
}
#[test]
fn guellebonusanlage_disqualified_by_capacity() {
let data = BiomassSettlementData::new(
BiomassBrennstoff::Guelle,
dec!(0.90), dec!(0.05),
dec!(100), );
assert!(!data.ist_guellebonusanlage, "capacity > 75 kW → no bonus");
}
#[test]
fn substrate_cap_exceeded() {
let data = BiomassSettlementData::new(
BiomassBrennstoff::PflanzlicheBiomasse,
dec!(0.0),
dec!(0.50), dec!(100),
);
assert!(!data.substrate_cap_ok);
}
}