Expand description
Pure multi-product retail energy billing for German markets.
§Architecture
This crate is the commercial billing engine for the Lieferant (LF). It answers: “What does the customer’s invoice look like?”
metering — "What quantities are billable?"
↓
eeg-billing — "What EEG remuneration applies?" (NB-side)
↓
energy-billing — "What does the customer's invoice look like?" (LF-side)
↓
accountingd — Payments, Ledger, Dunning§Primary API — Product::build_engine
use energy_billing::{BillingContext, BillingPeriod, GridInput, InvoiceType, MeterInput, Product, Quantities, RegulatoryRates};
use rust_decimal::dec;
use time::macros::date;
let json = r#"{"category":"STROM","arbeitspreis_ct_per_kwh":"30.0","grundpreis_ct_per_day":"8.0"}"#;
let product: Product = serde_json::from_str(json).unwrap();
let ctx = BillingContext {
malo_id: "51238696012".to_owned(),
lf_mp_id: "9900000000001".to_owned(),
rechnungsnummer: "R2026-001".to_owned(),
period: BillingPeriod::new(date!(2026-01-01), date!(2026-01-31)).unwrap(),
invoice_type: InvoiceType::Initial,
contract_id: None,
regulatory_rates: RegulatoryRates::default(),
..Default::default()
};
let quantities = Quantities {
electricity: Some(MeterInput { arbeitsmenge_kwh: dec!(500), ..Default::default() }),
..Default::default()
};
let invoice = product.build_engine(&GridInput::default(), &RegulatoryRates::default())
.bill(ctx, &quantities).unwrap();
assert!(invoice.brutto_eur > invoice.netto_eur);§Product categories
| Category | Provider | Legal basis |
|---|---|---|
STROM | ElectricityProvider | §41 EnWG |
WAERMEPUMPE | ControllableLoadProvider (§14a) | §14a EnWG |
WALLBOX | ControllableLoadProvider (§14a) | §14a EnWG |
GAS | GasProvider | §41 EnWG |
WAERME | HeatProvider | §41 EnWG; AVBFernwärmeV §24; CO2KostAufG §3; §14 WPG |
WASSER | WaterProvider | AVBWasserV; §12 Abs. 2 Nr. 1 UStG (7 %); gesplittete Abwassergebühr |
SOLAR | SolarProvider | §42a Abs. 4 EnWG (Mieterstrom-Preisdeckel) / §42b EnWG (GGV) |
EEG | EegProvider (→ eeg-billing) | §§20–21 EEG 2023 |
EINSPEISUNG | EinspeisungProvider | §20 EEG 2023 |
HEMS | HemsProvider | — |
EMOBILITY | EmobilityProvider | §41a EnWG |
ENERGIEDIENSTLEISTUNG | ServiceProvider | — |
STROM + dynamic_epex=true | DynamicElectricityProvider | §41a EnWG |
SHARING | ElectricityProvider + EnergyShareProvider | §42c EnWG |
Re-exports§
pub use context::AbschlagDeduction;pub use context::BillingContext;pub use context::BillingPeriod;pub use context::CustomerKategorie;pub use context::InvoiceType;pub use context::Rechnungsempfaenger;pub use context::SettlementForm;pub use context::Verbraucherinformationen;pub use context::Verbrauchshistorie;pub use context::Vertragsart;pub use context::Vertragsinformationen;pub use engine::BillingEngine;pub use error::EngineError;pub use invoice::Invoice;pub use invoice::TaxSubtotal;pub use invoice::VatCategory;pub use invoice::negate_rechnung_json_for_correction;pub use invoice::tax_subtotals_of;pub use position::BillingPosition;pub use position::BillingWarning;pub use position::PositionCategory;pub use position::PositionTrace;pub use position::WarningSeverity;pub use provider::BillingProvider;pub use provider::MTU_MINUTES;pub use provider::mtu_start;pub use quantities::Ablesungsart;pub use quantities::Abschlagsplan;pub use quantities::AbschlagsplanEntry;pub use quantities::Absetzung;pub use quantities::AbsetzungsGrund;pub use quantities::DayApportionment;pub use quantities::DynamicInterval;pub use quantities::EegMeterInput;pub use quantities::EmobilityMeterInput;pub use quantities::GasMeterInput;pub use quantities::GgvNutzungsplan;pub use quantities::GgvNutzungsplanEntry;pub use quantities::GgvSolarInput;pub use quantities::GridInput;pub use quantities::HemsMeterInput;pub use quantities::MeterInput;pub use quantities::MeteringMode;pub use quantities::ProsumerMeterInput;pub use quantities::Quantities;pub use quantities::Sect14aModul3Verbrauch;pub use quantities::Sect41aAnnualComparison;pub use quantities::ServiceMeterInput;pub use quantities::SolarMeterInput;pub use quantities::WaermeMeterInput;pub use quantities::WasserMeterInput;pub use rates::ERDGAS_UMRECHNUNGSFAKTOR_GJ_PER_MWH;pub use rates::RegulatoryRates;pub use rates::RoundMoney;pub use rates::behg_ct_per_kwh_for_year;pub use rates::behg_ct_per_kwh_from_price;pub use rates::energiesteuer_gas_for_year;pub use rates::erdgas_emissionsfaktor_kg_per_kwh;pub use rates::mwst_rate_for_gas_waerme_period;pub use rates::mwst_rate_for_period;pub use rates::round_money;pub use rates::steuer_stichtage_im_zeitraum;pub use rates::stromsteuer_for_year;pub use steuer::EnergiesteuerBefreiung;pub use steuer::EnergiesteuerTarif;pub use steuer::Steuerentlastung;pub use steuer::StromsteuerBefreiung;pub use steuer::StromsteuerErmaessigung;pub use steuer::StromsteuerTarif;pub use tariff::AbwasserRegime;pub use tariff::BlockTierInput;pub use tariff::ControllableLoadProduct;pub use tariff::EegProduct;pub use tariff::EinspeisungProduct;pub use tariff::ElectricityProduct;pub use tariff::EmobilityProduct;pub use tariff::EnergieQuellen;pub use tariff::GasProduct;pub use tariff::HeatProduct;pub use tariff::HemsProduct;pub use tariff::IndexedPriceConfig;pub use tariff::Product;pub use tariff::SeasonalPriceOverride;pub use tariff::ServiceProduct;pub use tariff::SharingProduct;pub use tariff::SolarProduct;pub use tariff::WaterProduct;pub use providers::ControllableLoadProvider;pub use providers::DynamicElectricityProvider;pub use providers::EegProvider;pub use providers::EinspeisungProvider;pub use providers::ElectricityProvider;pub use providers::EmobilityProvider;pub use providers::GasProvider;pub use providers::HeatProvider;pub use providers::HemsProvider;pub use providers::MwStProvider;pub use providers::ServiceProvider;pub use providers::SolarProvider;pub use providers::WaterProvider;
Modules§
- context
BillingContext— the immutable billing metadata passed to every provider.- engine
BillingEngine— the composition root for multi-product invoice generation.- error
EngineError— the typed error surface of the billing engine.- invoice
Invoice— the aggregate root of every billing run.- position
BillingPosition— the atomic unit of every energy invoice.- provider
- The
BillingProvidertrait — one implementation per product type. - providers
- Concrete
BillingProviderimplementations for all product types. - quantities
Quantities— all metered quantities for one billing period.- rates
RegulatoryRates— statutory levy rates, operator-configured.- steuer
- Verbrauchsteuerliche Begünstigungen — Befreiung, Ermäßigung, Entlastung.
- tariff
- Typed product definitions for the German retail energy market.
Structs§
- Amount
- Fixed-point monetary amount with
Pdecimal places.
Enums§
- Billing
Error - All errors produced by the billing engine.
- Rounding
Strategy - Explicit rounding strategy. Always required — no hidden defaults.
Type Aliases§
- Euro
Amount - A monetary amount in euro at 10⁻⁵-EUR resolution.