#[cfg(all(feature = "versioned", feature = "decimal"))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "versioned", feature = "decimal"))))]
pub trait BetragExt {
fn wert_decimal(&self) -> Option<rust_decimal::Decimal>;
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
impl BetragExt for Option<crate::generated::v202501::Betrag> {
fn wert_decimal(&self) -> Option<rust_decimal::Decimal> {
self.as_ref().and_then(|b| b.wert)
}
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "versioned", feature = "decimal"))))]
pub trait MengeExt {
fn wert_decimal(&self) -> Option<rust_decimal::Decimal>;
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
impl MengeExt for Option<crate::generated::v202501::Menge> {
fn wert_decimal(&self) -> Option<rust_decimal::Decimal> {
self.as_ref().and_then(|m| m.wert)
}
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
#[cfg_attr(docsrs, doc(cfg(all(feature = "versioned", feature = "decimal"))))]
pub trait PreisExt {
fn wert_decimal(&self) -> Option<rust_decimal::Decimal>;
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
impl PreisExt for Option<crate::generated::v202501::Preis> {
fn wert_decimal(&self) -> Option<rust_decimal::Decimal> {
self.as_ref().and_then(|p| p.wert)
}
}
#[cfg(all(feature = "versioned", feature = "time"))]
mod zeitraum_impl {
use crate::generated::v202501::Zeitraum;
use time::Date;
impl Zeitraum {
#[must_use]
pub fn as_closed_range(&self) -> Option<(Date, Date)> {
Some((self.startdatum?, self.enddatum?))
}
#[must_use]
pub fn as_half_open_range(&self) -> Option<(Date, Option<Date>)> {
Some((self.startdatum?, self.enddatum))
}
#[must_use]
pub fn contains(&self, date: Date) -> bool {
let start_ok = self.startdatum.is_none_or(|d| date >= d);
let end_ok = self.enddatum.is_none_or(|d| date < d);
start_ok && end_ok
}
}
}
#[cfg(all(feature = "versioned", feature = "time"))]
mod rechnung_impl {
use crate::generated::v202501::Rechnung;
use time::Date;
impl Rechnung {
#[must_use]
pub fn billing_period(&self) -> Option<(Date, Date)> {
self.rechnungsperiode.as_ref()?.as_closed_range()
}
#[must_use]
pub fn period_start(&self) -> Option<Date> {
self.rechnungsperiode.as_ref()?.startdatum
}
#[must_use]
pub fn period_end(&self) -> Option<Date> {
self.rechnungsperiode.as_ref()?.enddatum
}
#[must_use]
pub fn rechnungsdatum_date(&self) -> Option<Date> {
self.rechnungsdatum
}
}
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
mod rechnung_decimal_impl {
use crate::generated::v202501::Rechnung;
impl Rechnung {
#[must_use]
pub fn gesamtnetto_decimal(&self) -> Option<rust_decimal::Decimal> {
self.gesamtnetto.as_ref()?.wert
}
#[must_use]
pub fn gesamtbrutto_decimal(&self) -> Option<rust_decimal::Decimal> {
self.gesamtbrutto.as_ref()?.wert
}
#[must_use]
pub fn gesamtsteuer_decimal(&self) -> Option<rust_decimal::Decimal> {
self.gesamtsteuer.as_ref()?.wert
}
}
}
#[cfg(feature = "versioned")]
mod rechnung_versioned_impl {
use crate::generated::v202501::{Rechnung, Rechnungsposition};
impl Rechnung {
pub fn positions(&self) -> impl Iterator<Item = &Rechnungsposition> {
self.rechnungspositionen.as_deref().into_iter().flatten()
}
}
}
#[cfg(all(feature = "versioned", feature = "time"))]
mod rechnungsposition_time_impl {
use crate::generated::v202501::Rechnungsposition;
use time::Date;
impl Rechnungsposition {
#[must_use]
pub fn lieferung_von_date(&self) -> Option<Date> {
self.lieferung_von
}
#[must_use]
pub fn lieferung_bis_date(&self) -> Option<Date> {
self.lieferung_bis
}
}
}
#[cfg(all(feature = "versioned", feature = "decimal"))]
mod rechnungsposition_decimal_impl {
use crate::generated::v202501::Rechnungsposition;
impl Rechnungsposition {
#[must_use]
pub fn teilsumme_netto_decimal(&self) -> Option<rust_decimal::Decimal> {
self.teilsumme_netto.as_ref()?.wert
}
#[must_use]
pub fn einzelpreis_decimal(&self) -> Option<rust_decimal::Decimal> {
self.einzelpreis.as_ref()?.wert
}
#[must_use]
pub fn positions_menge_decimal(&self) -> Option<rust_decimal::Decimal> {
self.positions_menge.as_ref()?.wert
}
}
}
#[cfg(all(feature = "versioned", feature = "time"))]
mod preisblatt_netznutzung_impl {
use crate::generated::v202501::PreisblattNetznutzung;
use time::Date;
impl PreisblattNetznutzung {
#[must_use]
pub fn validity(&self) -> Option<(Date, Option<Date>)> {
self.gueltigkeit.as_ref()?.as_half_open_range()
}
#[must_use]
pub fn is_valid_at(&self, date: Date) -> bool {
self.gueltigkeit.as_ref().is_some_and(|z| z.contains(date))
}
}
}