// Auto-generated by automapper-generator. Do not edit.

#![allow(unused_imports)]

use serde::{Deserialize, Serialize};
use super::entities::*;
use std::collections::BTreeMap;

/// Map key for Marktteilnehmer instances.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum MarktteilnehmerKey {
    /// Dokumenten-/Nachrichtenaussteller bzw. -absender
    #[serde(rename = "MS")]
    Ms,
    /// Nachrichtenempfänger
    #[serde(rename = "MR")]
    Mr,
}

impl std::fmt::Display for MarktteilnehmerKey {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Ms => write!(f, "MS"),
            Self::Mr => write!(f, "MR"),
        }
    }
}

/// Map key for Geschaeftspartner instances.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum GeschaeftspartnerKey {
    #[serde(rename = "DP")]
    Dp,
    #[serde(rename = "Z04")]
    Z04,
    #[serde(rename = "Z05")]
    Z05,
    #[serde(rename = "Z09")]
    Z09,
}

impl std::fmt::Display for GeschaeftspartnerKey {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Dp => write!(f, "DP"),
            Self::Z04 => write!(f, "Z04"),
            Self::Z05 => write!(f, "Z05"),
            Self::Z09 => write!(f, "Z09"),
        }
    }
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44001MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44001: Anmeldung NN
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44001TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textReferenz, textbezug
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: anredeCode, kundennummerAltLf, kundennummerLf, land, name1, ort, partnerrolle, postleitzahl, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    /// Required (Muss). Fields: kavGruppe, konzession.merkmal
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: befristungGrund, gueltigAb, gueltigBis, identifikationslogikCode, identifikationslogikWert, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier, volumenerfassung.wert
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44001TransaktionStammdaten {
    /// Required entity fields for PID 44001 (Anmeldung NN).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textReferenz", "textbezug"]),
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["anredeCode", "kundennummerAltLf", "kundennummerLf", "land", "name1", "ort", "partnerrolle", "postleitzahl", "referenz.id"]),
            ("konzession_daten", &["kavGruppe", "konzession.merkmal"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["befristungGrund", "gueltigAb", "gueltigBis", "identifikationslogikCode", "identifikationslogikWert", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.nummer", "geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier", "volumenerfassung.wert"]),
        ]
    }
}

pub type Pid44001Interchange = crate::model::Interchange<
    Pid44001MessageStammdaten,
    Pid44001TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44002MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44002: Bestätigung Anmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44002TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: anredeCode, codelistCode, codepflegeCode, geschaeftspartnerId, kundennummerLf, land, name1, ort, partnerrolle, postleitzahl, referenz.id, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, befristungGrund, bilanzierungsbeginn, bilanzierungsende, gueltigAb, gueltigBis, marktlokationRef, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44002TransaktionStammdaten {
    /// Required entity fields for PID 44002 (Bestätigung Anmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["anredeCode", "codelistCode", "codepflegeCode", "geschaeftspartnerId", "kundennummerLf", "land", "name1", "ort", "partnerrolle", "postleitzahl", "referenz.id", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["antwortPruefschritt", "befristungGrund", "bilanzierungsbeginn", "bilanzierungsende", "gueltigAb", "gueltigBis", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44002Interchange = crate::model::Interchange<
    Pid44002MessageStammdaten,
    Pid44002TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44003MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44003: Ablehnung Anmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44003TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortDritterPruefschritt, antwortPruefschritt, befristungGrund, datumNaechsteBearbeitung, lieferbeginnInBearbeitung, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44003TransaktionStammdaten {
    /// Required entity fields for PID 44003 (Ablehnung Anmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortDritterPruefschritt", "antwortPruefschritt", "befristungGrund", "datumNaechsteBearbeitung", "lieferbeginnInBearbeitung", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44003Interchange = crate::model::Interchange<
    Pid44003MessageStammdaten,
    Pid44003TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44004MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44004: Abmeldung NN
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44004TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textReferenz, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44004TransaktionStammdaten {
    /// Required entity fields for PID 44004 (Abmeldung NN).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textReferenz", "textbezug"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44004Interchange = crate::model::Interchange<
    Pid44004MessageStammdaten,
    Pid44004TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44005MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44005: Bestätigung Abmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44005TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, bilanzierungsende, gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44005TransaktionStammdaten {
    /// Required entity fields for PID 44005 (Bestätigung Abmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "bilanzierungsende", "gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44005Interchange = crate::model::Interchange<
    Pid44005MessageStammdaten,
    Pid44005TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44006MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44006: Ablehnung Abmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44006TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44006TransaktionStammdaten {
    /// Required entity fields for PID 44006 (Ablehnung Abmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44006Interchange = crate::model::Interchange<
    Pid44006MessageStammdaten,
    Pid44006TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44007MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44007: Abmeldung NN vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44007TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: bilanzierungsende, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44007TransaktionStammdaten {
    /// Required entity fields for PID 44007 (Abmeldung NN vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["bilanzierungsende", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44007Interchange = crate::model::Interchange<
    Pid44007MessageStammdaten,
    Pid44007TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44008MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44008: Bestätigung Abmeldung vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44008TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, bilanzierungsende, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44008TransaktionStammdaten {
    /// Required entity fields for PID 44008 (Bestätigung Abmeldung vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "bilanzierungsende", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44008Interchange = crate::model::Interchange<
    Pid44008MessageStammdaten,
    Pid44008TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44009MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44009: Ablehnung Abmeldung vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44009TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44009TransaktionStammdaten {
    /// Required entity fields for PID 44009 (Ablehnung Abmeldung vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44009Interchange = crate::model::Interchange<
    Pid44009MessageStammdaten,
    Pid44009TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44010MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44010: Abmelde-anfrage des NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44010TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44010TransaktionStammdaten {
    /// Required entity fields for PID 44010 (Abmelde-anfrage des NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44010Interchange = crate::model::Interchange<
    Pid44010MessageStammdaten,
    Pid44010TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44011MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44011: Bestätigung Abmelde-anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44011TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44011TransaktionStammdaten {
    /// Required entity fields for PID 44011 (Bestätigung Abmelde-anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44011Interchange = crate::model::Interchange<
    Pid44011MessageStammdaten,
    Pid44011TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44012MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44012: Ablehnung Abmelde-anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44012TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44012TransaktionStammdaten {
    /// Required entity fields for PID 44012 (Ablehnung Abmelde-anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44012Interchange = crate::model::Interchange<
    Pid44012MessageStammdaten,
    Pid44012TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44013MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44013: Anmeldung EOG
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44013TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, region, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: befristungGrund, bilanzierungsbeginn, bilanzierungsende, gueltigAb, gueltigBis, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44013TransaktionStammdaten {
    /// Required entity fields for PID 44013 (Anmeldung EOG).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "region", "strasse"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["befristungGrund", "bilanzierungsbeginn", "bilanzierungsende", "gueltigAb", "gueltigBis", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44013Interchange = crate::model::Interchange<
    Pid44013MessageStammdaten,
    Pid44013TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44014MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44014: Bestätigung EOG Anmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44014TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, befristungGrund, bilanzierungsbeginn, bilanzierungsende, gueltigAb, gueltigBis, marktlokationRef, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44014TransaktionStammdaten {
    /// Required entity fields for PID 44014 (Bestätigung EOG Anmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["antwortPruefschritt", "befristungGrund", "bilanzierungsbeginn", "bilanzierungsende", "gueltigAb", "gueltigBis", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44014Interchange = crate::model::Interchange<
    Pid44014MessageStammdaten,
    Pid44014TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44015MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44015: Ablehnung EOG Anmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44015TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, befristungGrund, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44015TransaktionStammdaten {
    /// Required entity fields for PID 44015 (Ablehnung EOG Anmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "befristungGrund", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44015Interchange = crate::model::Interchange<
    Pid44015MessageStammdaten,
    Pid44015TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44016MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44016: Kündigung beim alten Lieferanten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44016TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: endeZum, gueltigBis, identifikationslogikCode, identifikationslogikWert, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier, volumenerfassung.wert
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44016TransaktionStammdaten {
    /// Required entity fields for PID 44016 (Kündigung beim alten Lieferanten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["endeZum", "gueltigBis", "identifikationslogikCode", "identifikationslogikWert", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.nummer", "geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier", "volumenerfassung.wert"]),
        ]
    }
}

pub type Pid44016Interchange = crate::model::Interchange<
    Pid44016MessageStammdaten,
    Pid44016TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44017MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44017: Bestätigung Kündigung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44017TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: vorjahresverbrauch
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, endeZum, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44017TransaktionStammdaten {
    /// Required entity fields for PID 44017 (Bestätigung Kündigung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("marktlokation", &["vorjahresverbrauch"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "endeZum", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44017Interchange = crate::model::Interchange<
    Pid44017MessageStammdaten,
    Pid44017TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44018MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44018: Ablehnung Kündigung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44018TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigkeitsbeginn, kuendigungsdatum, kuendigungsdatumQualifier, kuendigungsfrist, kuendigungstermin, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44018TransaktionStammdaten {
    /// Required entity fields for PID 44018 (Ablehnung Kündigung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigkeitsbeginn", "kuendigungsdatum", "kuendigungsdatumQualifier", "kuendigungsfrist", "kuendigungstermin", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44018Interchange = crate::model::Interchange<
    Pid44018MessageStammdaten,
    Pid44018TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44019MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44019: Bestands-liste zugeordnete Marktlokationenen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44019TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, bilanzierungsgebiet.wert, marktgebiet.qualifier, marktgebiet.wert, merkmal.code, merkmal.klasse, regelzone.qualifier, regelzone.wert
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: bilanzierungsbeginn, bilanzierungsende, gueltigAb, gueltigBis, pruefidentifikator, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44019TransaktionStammdaten {
    /// Required entity fields for PID 44019 (Bestands-liste zugeordnete Marktlokationenen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "bilanzierungsgebiet.wert", "marktgebiet.qualifier", "marktgebiet.wert", "merkmal.code", "merkmal.klasse", "regelzone.qualifier", "regelzone.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["bilanzierungsbeginn", "bilanzierungsende", "gueltigAb", "gueltigBis", "pruefidentifikator", "vorgangId"]),
        ]
    }
}

pub type Pid44019Interchange = crate::model::Interchange<
    Pid44019MessageStammdaten,
    Pid44019TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44020MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44020: Änderungs-meldung zur Bestands-liste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44020TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: textReferenz, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, bilanzierungsgebiet.wert, marktgebiet.qualifier, marktgebiet.wert, merkmal.code, merkmal.klasse, regelzone.qualifier, regelzone.wert
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: bilanzierungsbeginn, bilanzierungsende, gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44020TransaktionStammdaten {
    /// Required entity fields for PID 44020 (Änderungs-meldung zur Bestands-liste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["textReferenz", "textbezug"]),
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "bilanzierungsgebiet.wert", "marktgebiet.qualifier", "marktgebiet.wert", "merkmal.code", "merkmal.klasse", "regelzone.qualifier", "regelzone.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["bilanzierungsbeginn", "bilanzierungsende", "gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44020Interchange = crate::model::Interchange<
    Pid44020MessageStammdaten,
    Pid44020TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44021MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44021: Antwort auf Änderungs-meldung zur Bestands-liste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44021TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, postleitzahl
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Optional.
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, bilanzierungsgebiet.wert, marktgebiet.qualifier, marktgebiet.wert, merkmal.code, merkmal.klasse, regelzone.qualifier, regelzone.wert
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, bilanzierungsbeginn, bilanzierungsende, gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44021TransaktionStammdaten {
    /// Required entity fields for PID 44021 (Antwort auf Änderungs-meldung zur Bestands-liste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "postleitzahl"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "bilanzierungsgebiet.wert", "marktgebiet.qualifier", "marktgebiet.wert", "merkmal.code", "merkmal.klasse", "regelzone.qualifier", "regelzone.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "bilanzierungsbeginn", "bilanzierungsende", "gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44021Interchange = crate::model::Interchange<
    Pid44021MessageStammdaten,
    Pid44021TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44022MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44022: Anfrage nach Stornierung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44022TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    pub messlokation: Option<MesslokationWrapped>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: produktIdentifikation.id, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44022TransaktionStammdaten {
    /// Required entity fields for PID 44022 (Anfrage nach Stornierung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("prozessdaten", &["produktIdentifikation.id", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44022Interchange = crate::model::Interchange<
    Pid44022MessageStammdaten,
    Pid44022TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44023MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44023: Bestätigung Anfrage Stornierung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44023TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    pub messlokation: Option<MesslokationWrapped>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44023TransaktionStammdaten {
    /// Required entity fields for PID 44023 (Bestätigung Anfrage Stornierung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44023Interchange = crate::model::Interchange<
    Pid44023MessageStammdaten,
    Pid44023TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44024MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44024: Ablehnung Anfrage Stornierung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44024TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    pub messlokation: Option<MesslokationWrapped>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44024TransaktionStammdaten {
    /// Required entity fields for PID 44024 (Ablehnung Anfrage Stornierung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44024Interchange = crate::model::Interchange<
    Pid44024MessageStammdaten,
    Pid44024TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44035MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44035: Antwort auf die Geschäftsdatenanfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44035TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: text, textbezug
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: geraetenummer, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44035TransaktionStammdaten {
    /// Required entity fields for PID 44035 (Antwort auf die Geschäftsdatenanfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["text", "textbezug"]),
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["geraetenummer", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44035Interchange = crate::model::Interchange<
    Pid44035MessageStammdaten,
    Pid44035TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44036MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44036: Informationsmeldung über existierende Zuordnung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44036TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44036TransaktionStammdaten {
    /// Required entity fields for PID 44036 (Informationsmeldung über existierende Zuordnung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44036Interchange = crate::model::Interchange<
    Pid44036MessageStammdaten,
    Pid44036TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44037MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44037: Informationsmeldung zur Beendigung der Zuordnung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44037TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: bilanzierungsende, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44037TransaktionStammdaten {
    /// Required entity fields for PID 44037 (Informationsmeldung zur Beendigung der Zuordnung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["bilanzierungsende", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44037Interchange = crate::model::Interchange<
    Pid44037MessageStammdaten,
    Pid44037TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44038MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44038: Informationsmeldung zur Aufhebung einer zuk. Zuordnung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44038TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: bilanzierungsende, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44038TransaktionStammdaten {
    /// Required entity fields for PID 44038 (Informationsmeldung zur Aufhebung einer zuk. Zuordnung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["bilanzierungsende", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44038Interchange = crate::model::Interchange<
    Pid44038MessageStammdaten,
    Pid44038TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44039MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44039: Kündigung MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44039TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, postleitzahl
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: endeZum, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier, volumenerfassung.wert
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44039TransaktionStammdaten {
    /// Required entity fields for PID 44039 (Kündigung MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "postleitzahl"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["endeZum", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.nummer", "geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier", "volumenerfassung.wert"]),
        ]
    }
}

pub type Pid44039Interchange = crate::model::Interchange<
    Pid44039MessageStammdaten,
    Pid44039TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44040MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44040: Bestätigung Kündigung MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44040TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, endeZum, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier, volumenerfassung.wert
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44040TransaktionStammdaten {
    /// Required entity fields for PID 44040 (Bestätigung Kündigung MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "endeZum", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.nummer", "geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier", "volumenerfassung.wert"]),
        ]
    }
}

pub type Pid44040Interchange = crate::model::Interchange<
    Pid44040MessageStammdaten,
    Pid44040TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44041MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44041: Ablehnung Kündigung MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44041TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigkeitsbeginn, kuendigungsfrist, kuendigungstermin, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44041TransaktionStammdaten {
    /// Required entity fields for PID 44041 (Ablehnung Kündigung MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigkeitsbeginn", "kuendigungsfrist", "kuendigungstermin", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44041Interchange = crate::model::Interchange<
    Pid44041MessageStammdaten,
    Pid44041TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44042MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44042: Anmeldung MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44042TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, postleitzahl
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: lieferdatumGeplant, pruefidentifikator, transaktionsgrund, vereinbarungCode, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier, volumenerfassung.wert
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44042TransaktionStammdaten {
    /// Required entity fields for PID 44042 (Anmeldung MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "postleitzahl"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["lieferdatumGeplant", "pruefidentifikator", "transaktionsgrund", "vereinbarungCode", "vorgangId"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.nummer", "geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier", "volumenerfassung.wert"]),
        ]
    }
}

pub type Pid44042Interchange = crate::model::Interchange<
    Pid44042MessageStammdaten,
    Pid44042TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44043MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44043: Bestätigung Anmeldung MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44043TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code, merkmal.klasse
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    /// Required (Muss). Fields: messproduktCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messprodukt_daten: Option<Vec<MessproduktDatenWrapped>>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: ablesedatum, antwortPruefschritt, pruefidentifikator, referenz.id, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44043TransaktionStammdaten {
    /// Required entity fields for PID 44043 (Bestätigung Anmeldung MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code", "merkmal.klasse"]),
            ("messprodukt_daten", &["messproduktCode"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["ablesedatum", "antwortPruefschritt", "pruefidentifikator", "referenz.id", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44043Interchange = crate::model::Interchange<
    Pid44043MessageStammdaten,
    Pid44043TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44044MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44044: Ablehnung Anmeldung MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44044TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44044TransaktionStammdaten {
    /// Required entity fields for PID 44044 (Ablehnung Anmeldung MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44044Interchange = crate::model::Interchange<
    Pid44044MessageStammdaten,
    Pid44044TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44051MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44051: Ende MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44051TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44051TransaktionStammdaten {
    /// Required entity fields for PID 44051 (Ende MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44051Interchange = crate::model::Interchange<
    Pid44051MessageStammdaten,
    Pid44051TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44052MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44052: Bestätigung Ende MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44052TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44052TransaktionStammdaten {
    /// Required entity fields for PID 44052 (Bestätigung Ende MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44052Interchange = crate::model::Interchange<
    Pid44052MessageStammdaten,
    Pid44052TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44053MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44053: Ablehnung Ende MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44053TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44053TransaktionStammdaten {
    /// Required entity fields for PID 44053 (Ablehnung Ende MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44053Interchange = crate::model::Interchange<
    Pid44053MessageStammdaten,
    Pid44053TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44060MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44060: Antwort auf die Geschäftsdatenanfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44060TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    /// Required (Muss). Fields: messproduktCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messprodukt_daten: Option<Vec<MessproduktDatenWrapped>>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: geraetenummer, pruefidentifikator, referenz.id, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44060TransaktionStammdaten {
    /// Required entity fields for PID 44060 (Antwort auf die Geschäftsdatenanfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("messprodukt_daten", &["messproduktCode"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["geraetenummer", "pruefidentifikator", "referenz.id", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44060Interchange = crate::model::Interchange<
    Pid44060MessageStammdaten,
    Pid44060TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44096MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44096: Deklarationsliste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44096TransaktionStammdaten {
    /// Required (Muss).
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    pub messlokation: Option<MesslokationWrapped>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, gueltigBis, pruefidentifikator, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44096TransaktionStammdaten {
    /// Required entity fields for PID 44096 (Deklarationsliste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("deklarationsliste_daten_zuordnung", &["merkmal.code", "merkmal.klasse"]),
            ("prozessdaten", &["gueltigAb", "gueltigBis", "pruefidentifikator", "vorgangId"]),
        ]
    }
}

pub type Pid44096Interchange = crate::model::Interchange<
    Pid44096MessageStammdaten,
    Pid44096TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44097MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44097: Deklarationsliste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44097TransaktionStammdaten {
    /// Required (Muss).
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    pub messlokation: Option<MesslokationWrapped>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, gueltigBis, pruefidentifikator, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44097TransaktionStammdaten {
    /// Required entity fields for PID 44097 (Deklarationsliste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("deklarationsliste_daten_zuordnung", &["merkmal.code", "merkmal.klasse"]),
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("prozessdaten", &["gueltigAb", "gueltigBis", "pruefidentifikator", "vorgangId"]),
        ]
    }
}

pub type Pid44097Interchange = crate::model::Interchange<
    Pid44097MessageStammdaten,
    Pid44097TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44101MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44101: Stammdaten zur Messlokation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44101TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44101TransaktionStammdaten {
    /// Required entity fields for PID 44101 (Stammdaten zur Messlokation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44101Interchange = crate::model::Interchange<
    Pid44101MessageStammdaten,
    Pid44101TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44102MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44102: Aktualisierte Stammdaten zur Messlokation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44102TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, gueltigBis, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44102TransaktionStammdaten {
    /// Required entity fields for PID 44102 (Aktualisierte Stammdaten zur Messlokation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "gueltigBis", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44102Interchange = crate::model::Interchange<
    Pid44102MessageStammdaten,
    Pid44102TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44103MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44103: Stammdaten zur Markt-lokation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44103TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, bilanzierungsbeginn, bilanzierungsende, bilanzkreiszuordnungStatus, gueltigAb, gueltigBis, pruefidentifikator, statusCode, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44103TransaktionStammdaten {
    /// Required entity fields for PID 44103 (Stammdaten zur Markt-lokation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "bilanzierungsbeginn", "bilanzierungsende", "bilanzkreiszuordnungStatus", "gueltigAb", "gueltigBis", "pruefidentifikator", "statusCode", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44103Interchange = crate::model::Interchange<
    Pid44103MessageStammdaten,
    Pid44103TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44104MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44104: Aktualisierte Stammdaten zur Markt-lokation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44104TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: adresszusatz, geschaeftspartnerId, hausnummer, land, name1, name2, namenszusatz1, ort, partnerrolle, postleitzahl, region, strasse, strasseZusatz, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, bilanzierungsbeginn, bilanzierungsende, bilanzkreiszuordnungStatus, gueltigAb, gueltigBis, pruefidentifikator, statusCode, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44104TransaktionStammdaten {
    /// Required entity fields for PID 44104 (Aktualisierte Stammdaten zur Markt-lokation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["adresszusatz", "geschaeftspartnerId", "hausnummer", "land", "name1", "name2", "namenszusatz1", "ort", "partnerrolle", "postleitzahl", "region", "strasse", "strasseZusatz", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "bilanzierungsbeginn", "bilanzierungsende", "bilanzkreiszuordnungStatus", "gueltigAb", "gueltigBis", "pruefidentifikator", "statusCode", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44104Interchange = crate::model::Interchange<
    Pid44104MessageStammdaten,
    Pid44104TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44105MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44105: Ablehnung auf Stammdaten zur Markt-lokation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44105TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigkeitsbeginn, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44105TransaktionStammdaten {
    /// Required entity fields for PID 44105 (Ablehnung auf Stammdaten zur Markt-lokation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigkeitsbeginn", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44105Interchange = crate::model::Interchange<
    Pid44105MessageStammdaten,
    Pid44105TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44109MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44109: Nicht bila.rel. Änderung vom LF
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44109TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44109TransaktionStammdaten {
    /// Required entity fields for PID 44109 (Nicht bila.rel. Änderung vom LF).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44109Interchange = crate::model::Interchange<
    Pid44109MessageStammdaten,
    Pid44109TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44111MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44111: 
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44111TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44111TransaktionStammdaten {
    /// Required entity fields for PID 44111 ().
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44111Interchange = crate::model::Interchange<
    Pid44111MessageStammdaten,
    Pid44111TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44112MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44112: Nicht bila.rel. Änderung vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44112TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId, zustelldatum
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44112TransaktionStammdaten {
    /// Required entity fields for PID 44112 (Nicht bila.rel. Änderung vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("prozessdaten", &["gueltigAb", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId", "zustelldatum"]),
        ]
    }
}

pub type Pid44112Interchange = crate::model::Interchange<
    Pid44112MessageStammdaten,
    Pid44112TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44113MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44113: Nicht bila.rel. Änderung vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44113TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, referenz.id, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44113TransaktionStammdaten {
    /// Required entity fields for PID 44113 (Nicht bila.rel. Änderung vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "referenz.id", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44113Interchange = crate::model::Interchange<
    Pid44113MessageStammdaten,
    Pid44113TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44115MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44115: Antwort auf Änderung vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44115TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44115TransaktionStammdaten {
    /// Required entity fields for PID 44115 (Antwort auf Änderung vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44115Interchange = crate::model::Interchange<
    Pid44115MessageStammdaten,
    Pid44115TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44116MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44116: Änderung vom MSB mit Abhängig keiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44116TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44116TransaktionStammdaten {
    /// Required entity fields for PID 44116 (Änderung vom MSB mit Abhängig keiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44116Interchange = crate::model::Interchange<
    Pid44116MessageStammdaten,
    Pid44116TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44117MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44117: Änderung vom MSB mit Abhängig keiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44117TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44117TransaktionStammdaten {
    /// Required entity fields for PID 44117 (Änderung vom MSB mit Abhängig keiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44117Interchange = crate::model::Interchange<
    Pid44117MessageStammdaten,
    Pid44117TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44119MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44119: Antwort auf Änderung vom MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44119TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44119TransaktionStammdaten {
    /// Required entity fields for PID 44119 (Antwort auf Änderung vom MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44119Interchange = crate::model::Interchange<
    Pid44119MessageStammdaten,
    Pid44119TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44120MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44120: Bila.rel. Änderung vom LF
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44120TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss).
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44120TransaktionStammdaten {
    /// Required entity fields for PID 44120 (Bila.rel. Änderung vom LF).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("marktlokation_zuordnung", &["merkmal.code", "merkmal.klasse"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44120Interchange = crate::model::Interchange<
    Pid44120MessageStammdaten,
    Pid44120TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44121MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44121: Antwort auf Änderung vom LF
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44121TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44121TransaktionStammdaten {
    /// Required entity fields for PID 44121 (Antwort auf Änderung vom LF).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44121Interchange = crate::model::Interchange<
    Pid44121MessageStammdaten,
    Pid44121TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44123MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44123: Bila.rel. Änderung vom NB mit Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44123TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44123TransaktionStammdaten {
    /// Required entity fields for PID 44123 (Bila.rel. Änderung vom NB mit Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44123Interchange = crate::model::Interchange<
    Pid44123MessageStammdaten,
    Pid44123TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44124MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44124: Antwort auf Änderung vom NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44124TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44124TransaktionStammdaten {
    /// Required entity fields for PID 44124 (Antwort auf Änderung vom NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44124Interchange = crate::model::Interchange<
    Pid44124MessageStammdaten,
    Pid44124TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44137MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44137: Nicht bila.rel. Anfrage an LF
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44137TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, region, strasse, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44137TransaktionStammdaten {
    /// Required entity fields for PID 44137 (Nicht bila.rel. Anfrage an LF).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "region", "strasse", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44137Interchange = crate::model::Interchange<
    Pid44137MessageStammdaten,
    Pid44137TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44138MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44138: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44138TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, marktlokationRef, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44138TransaktionStammdaten {
    /// Required entity fields for PID 44138 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44138Interchange = crate::model::Interchange<
    Pid44138MessageStammdaten,
    Pid44138TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44139MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44139: Nicht bila.rel. Anfrage an NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44139TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, marktlokationRef, pruefidentifikator, transaktionsgrund, vorgangId, zustelldatum
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44139TransaktionStammdaten {
    /// Required entity fields for PID 44139 (Nicht bila.rel. Anfrage an NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("prozessdaten", &["gueltigAb", "marktlokationRef", "pruefidentifikator", "transaktionsgrund", "vorgangId", "zustelldatum"]),
        ]
    }
}

pub type Pid44139Interchange = crate::model::Interchange<
    Pid44139MessageStammdaten,
    Pid44139TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44140MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44140: Nicht bila.rel. Anfrage an NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44140TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, referenz.id, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44140TransaktionStammdaten {
    /// Required entity fields for PID 44140 (Nicht bila.rel. Anfrage an NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "referenz.id", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44140Interchange = crate::model::Interchange<
    Pid44140MessageStammdaten,
    Pid44140TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44142MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44142: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44142TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    /// Required (Muss). Fields: gemeinderabattProzent
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    /// Required (Muss). Fields: kavBetrag, kavGruppe, konzession.merkmal, obisKennzahlRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub konzession_daten: Option<Vec<KonzessionDaten>>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: bilanzierungsgebiet.qualifier, marktgebiet.qualifier, merkmal.code, merkmal.klasse, regelzone.qualifier
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, wertegranularitaet
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_marktlokation: Option<Vec<ObisDatenMarktlokationWrapped>>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigAb, marktlokationRef, pruefidentifikator, referenz.id, transaktionsgrund, transaktionsnummer, vorgangId, zustelldatum
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44142TransaktionStammdaten {
    /// Required entity fields for PID 44142 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("gemeinde_daten", &["gemeinderabattProzent"]),
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("konzession_daten", &["kavBetrag", "kavGruppe", "konzession.merkmal", "obisKennzahlRef"]),
            ("marktlokation_zuordnung", &["bilanzierungsgebiet.qualifier", "marktgebiet.qualifier", "merkmal.code", "merkmal.klasse", "regelzone.qualifier"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code"]),
            ("obis_daten_marktlokation", &["produktIdentifikation.id", "wertegranularitaet"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigAb", "marktlokationRef", "pruefidentifikator", "referenz.id", "transaktionsgrund", "transaktionsnummer", "vorgangId", "zustelldatum"]),
        ]
    }
}

pub type Pid44142Interchange = crate::model::Interchange<
    Pid44142MessageStammdaten,
    Pid44142TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44143MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44143: Anfrage an MSB mit Abhängig-keiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44143TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44143TransaktionStammdaten {
    /// Required entity fields for PID 44143 (Anfrage an MSB mit Abhängig-keiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44143Interchange = crate::model::Interchange<
    Pid44143MessageStammdaten,
    Pid44143TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44145MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44145: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44145TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44145TransaktionStammdaten {
    /// Required entity fields for PID 44145 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44145Interchange = crate::model::Interchange<
    Pid44145MessageStammdaten,
    Pid44145TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44146MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44146: Ablehnung der Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44146TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44146TransaktionStammdaten {
    /// Required entity fields for PID 44146 (Ablehnung der Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44146Interchange = crate::model::Interchange<
    Pid44146MessageStammdaten,
    Pid44146TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44147MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44147: Anfrage an MSB mit Abhängig-keiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44147TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44147TransaktionStammdaten {
    /// Required entity fields for PID 44147 (Anfrage an MSB mit Abhängig-keiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44147Interchange = crate::model::Interchange<
    Pid44147MessageStammdaten,
    Pid44147TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44148MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44148: Anfrage an MSB mit Abhängig-keiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44148TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44148TransaktionStammdaten {
    /// Required entity fields for PID 44148 (Anfrage an MSB mit Abhängig-keiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44148Interchange = crate::model::Interchange<
    Pid44148MessageStammdaten,
    Pid44148TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44149MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44149: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44149TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44149TransaktionStammdaten {
    /// Required entity fields for PID 44149 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44149Interchange = crate::model::Interchange<
    Pid44149MessageStammdaten,
    Pid44149TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44150MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44150: Bila.rel. Anfrage an LF
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44150TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss).
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44150TransaktionStammdaten {
    /// Required entity fields for PID 44150 (Bila.rel. Anfrage an LF).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("marktlokation_zuordnung", &["merkmal.code", "merkmal.klasse"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44150Interchange = crate::model::Interchange<
    Pid44150MessageStammdaten,
    Pid44150TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44151MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44151: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44151TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Optional.
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44151TransaktionStammdaten {
    /// Required entity fields for PID 44151 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("marktlokation_zuordnung", &["merkmal.code", "merkmal.klasse"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44151Interchange = crate::model::Interchange<
    Pid44151MessageStammdaten,
    Pid44151TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44152MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44152: Ablehnung der Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44152TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44152TransaktionStammdaten {
    /// Required entity fields for PID 44152 (Ablehnung der Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44152Interchange = crate::model::Interchange<
    Pid44152MessageStammdaten,
    Pid44152TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44156MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44156: Bila.rel. Anfrage an NB mit Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44156TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44156TransaktionStammdaten {
    /// Required entity fields for PID 44156 (Bila.rel. Anfrage an NB mit Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44156Interchange = crate::model::Interchange<
    Pid44156MessageStammdaten,
    Pid44156TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44157MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44157: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44157TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    /// Required (Muss).
    pub lastprofil_daten: Option<LastprofilDaten>,
    /// Required (Muss). Fields: merkmal.code, merkmal.codepflege, merkmal.klasse, merkmal.qualifier
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    /// Required (Muss). Fields: jahresmengeGesamt, kundenwert
    pub marktlokation: Option<MarktlokationWrapped>,
    /// Required (Muss). Fields: merkmal.code
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44157TransaktionStammdaten {
    /// Required entity fields for PID 44157 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("lastprofil_daten_zuordnung", &["merkmal.code", "merkmal.codepflege", "merkmal.klasse", "merkmal.qualifier"]),
            ("marktlokation", &["jahresmengeGesamt", "kundenwert"]),
            ("marktlokation_zuordnung", &["merkmal.code"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44157Interchange = crate::model::Interchange<
    Pid44157MessageStammdaten,
    Pid44157TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44159MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44159: Änderung vom MSB ohne Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44159TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, postleitzahl
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44159TransaktionStammdaten {
    /// Required entity fields for PID 44159 (Änderung vom MSB ohne Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "postleitzahl"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44159Interchange = crate::model::Interchange<
    Pid44159MessageStammdaten,
    Pid44159TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44160MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44160: Änderung vom MSB ohne Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44160TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44160TransaktionStammdaten {
    /// Required entity fields for PID 44160 (Änderung vom MSB ohne Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44160Interchange = crate::model::Interchange<
    Pid44160MessageStammdaten,
    Pid44160TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44161MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44161: Antwort auf Änderung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44161TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44161TransaktionStammdaten {
    /// Required entity fields for PID 44161 (Antwort auf Änderung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44161Interchange = crate::model::Interchange<
    Pid44161MessageStammdaten,
    Pid44161TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44162MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44162: Anfrage an MSB ohne Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44162TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44162TransaktionStammdaten {
    /// Required entity fields for PID 44162 (Anfrage an MSB ohne Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44162Interchange = crate::model::Interchange<
    Pid44162MessageStammdaten,
    Pid44162TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44163MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44163: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44163TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, region, strasse, zusatzinfo, zusatzinfoZeile2, zusatzinfoZeile3, zusatzinfoZeile4, zusatzinfoZeile5
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44163TransaktionStammdaten {
    /// Required entity fields for PID 44163 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "region", "strasse", "zusatzinfo", "zusatzinfoZeile2", "zusatzinfoZeile3", "zusatzinfoZeile4", "zusatzinfoZeile5"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44163Interchange = crate::model::Interchange<
    Pid44163MessageStammdaten,
    Pid44163TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44164MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44164: Ablehnung Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44164TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44164TransaktionStammdaten {
    /// Required entity fields for PID 44164 (Ablehnung Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44164Interchange = crate::model::Interchange<
    Pid44164MessageStammdaten,
    Pid44164TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44165MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44165: Nicht bila.rel. Anfrage an MSB ohne Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44165TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, strasse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44165TransaktionStammdaten {
    /// Required entity fields for PID 44165 (Nicht bila.rel. Anfrage an MSB ohne Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "strasse"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44165Interchange = crate::model::Interchange<
    Pid44165MessageStammdaten,
    Pid44165TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44166MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44166: Nicht bila.rel. Anfrage an MSB ohne Abhängigkeiten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44166TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, gueltigAb, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44166TransaktionStammdaten {
    /// Required entity fields for PID 44166 (Nicht bila.rel. Anfrage an MSB ohne Abhängigkeiten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44166Interchange = crate::model::Interchange<
    Pid44166MessageStammdaten,
    Pid44166TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44167MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44167: Antwort auf Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44167TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: land, name1, ort, partnerrolle, postleitzahl
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: aenderungZum, antwortPruefschritt, gueltigAb, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44167TransaktionStammdaten {
    /// Required entity fields for PID 44167 (Antwort auf Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["land", "name1", "ort", "partnerrolle", "postleitzahl"]),
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["aenderungZum", "antwortPruefschritt", "gueltigAb", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44167Interchange = crate::model::Interchange<
    Pid44167MessageStammdaten,
    Pid44167TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44168MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44168: Verpflicht-ungsanfrage / Aufforderung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44168TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code, merkmal.klasse
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    /// Required (Muss). Fields: messproduktCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messprodukt_daten: Option<Vec<MessproduktDatenWrapped>>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: ablesedatum, pruefidentifikator, referenz.id, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44168TransaktionStammdaten {
    /// Required entity fields for PID 44168 (Verpflicht-ungsanfrage / Aufforderung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code", "merkmal.klasse"]),
            ("messprodukt_daten", &["messproduktCode"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["ablesedatum", "pruefidentifikator", "referenz.id", "transaktionsgrund", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44168Interchange = crate::model::Interchange<
    Pid44168MessageStammdaten,
    Pid44168TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44169MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44169: Bestätigung Verpflicht-ungsanfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44169TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    /// Required (Muss). Fields: geschaeftspartnerId, land, name1, ort, partnerrolle, postleitzahl, region
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub geschaeftspartner: Option<BTreeMap<GeschaeftspartnerKey, GeschaeftspartnerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.nummer, kommunikationseinrichtungsTyp, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub kommunikationseinrichtung_daten: Option<Vec<KommunikationseinrichtungDaten>>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    /// Required (Muss). Fields: geraetnummer.nummer, mengenumwerter.typ, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub mengenumwerter_daten: Option<Vec<MengenumwerterDaten>>,
    /// Required (Muss). Fields: geraetnummer.nummer, referenz.id, volumenerfassung.wert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messdatenregistriergeraet_daten: Option<Vec<MessdatenregistriergeraetDaten>>,
    /// Required (Muss). Fields: meldepunktId, messlokationId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    /// Required (Muss). Fields: gmsb.qualifier, marktpartner.codeliste_code, marktpartner.qualifier, marktpartner.zuordnung, merkmal.code, merkmal.klasse
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    /// Required (Muss). Fields: messproduktCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messprodukt_daten: Option<Vec<MessproduktDatenWrapped>>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    /// Required (Muss). Fields: produktIdentifikation.id, referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub obis_daten_zaehler: Option<Vec<ObisDatenZaehlerWrapped>>,
    /// Required (Muss). Fields: merkmal.code, merkmal.klasse, merkmal.qualifier
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: ablesedatum, antwortPruefschritt, pruefidentifikator, referenz.id, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    /// Required (Muss). Fields: gatewayNummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub smartmeter_gateway_daten: Option<Vec<SmartmeterGatewayDatenWrapped>>,
    /// Required (Muss). Fields: referenz.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehler: Option<Vec<ZaehlerWrapped>>,
    /// Required (Muss). Fields: geraetnummer.qualifier, merkmal.code, volumenerfassung.qualifier
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44169TransaktionStammdaten {
    /// Required entity fields for PID 44169 (Bestätigung Verpflicht-ungsanfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geschaeftspartner", &["geschaeftspartnerId", "land", "name1", "ort", "partnerrolle", "postleitzahl", "region"]),
            ("kommunikationseinrichtung_daten", &["geraetnummer.nummer", "kommunikationseinrichtungsTyp", "referenz.id"]),
            ("mengenumwerter_daten", &["geraetnummer.nummer", "mengenumwerter.typ", "referenz.id", "volumenerfassung.wert"]),
            ("messdatenregistriergeraet_daten", &["geraetnummer.nummer", "referenz.id", "volumenerfassung.wert"]),
            ("messlokation", &["meldepunktId", "messlokationId"]),
            ("messlokation_zuordnung", &["gmsb.qualifier", "marktpartner.codeliste_code", "marktpartner.qualifier", "marktpartner.zuordnung", "merkmal.code", "merkmal.klasse"]),
            ("messprodukt_daten", &["messproduktCode"]),
            ("obis_daten_zaehler", &["produktIdentifikation.id", "referenz.id"]),
            ("obis_daten_zaehler_zuordnung", &["merkmal.code", "merkmal.klasse", "merkmal.qualifier"]),
            ("prozessdaten", &["ablesedatum", "antwortPruefschritt", "pruefidentifikator", "referenz.id", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
            ("smartmeter_gateway_daten", &["gatewayNummer"]),
            ("zaehler", &["referenz.id"]),
            ("zaehler_zuordnung", &["geraetnummer.qualifier", "merkmal.code", "volumenerfassung.qualifier"]),
        ]
    }
}

pub type Pid44169Interchange = crate::model::Interchange<
    Pid44169MessageStammdaten,
    Pid44169TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44175MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44175: Änderung der Marktlokations-struktur
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44175TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, gueltigkeitsbeginn, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44175TransaktionStammdaten {
    /// Required entity fields for PID 44175 (Änderung der Marktlokations-struktur).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["gueltigAb", "gueltigkeitsbeginn", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44175Interchange = crate::model::Interchange<
    Pid44175MessageStammdaten,
    Pid44175TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44176MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44176: Antwort auf Änderung der Marktlokations-struktur
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44176TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigAb, gueltigkeitsbeginn, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44176TransaktionStammdaten {
    /// Required entity fields for PID 44176 (Antwort auf Änderung der Marktlokations-struktur).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigAb", "gueltigkeitsbeginn", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44176Interchange = crate::model::Interchange<
    Pid44176MessageStammdaten,
    Pid44176TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44180MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44180: Anfrage der Markt-lokations-struktur
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44180TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: gueltigAb, gueltigkeitsbeginn, pruefidentifikator, transaktionsgrund, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44180TransaktionStammdaten {
    /// Required entity fields for PID 44180 (Anfrage der Markt-lokations-struktur).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["gueltigAb", "gueltigkeitsbeginn", "pruefidentifikator", "transaktionsgrund", "vorgangId"]),
        ]
    }
}

pub type Pid44180Interchange = crate::model::Interchange<
    Pid44180MessageStammdaten,
    Pid44180TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44181MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44181: Antwort auf Anfrage der Markt-lokations-struktur
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44181TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, gueltigAb, gueltigkeitsbeginn, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44181TransaktionStammdaten {
    /// Required entity fields for PID 44181 (Antwort auf Anfrage der Markt-lokations-struktur).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "gueltigAb", "gueltigkeitsbeginn", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44181Interchange = crate::model::Interchange<
    Pid44181MessageStammdaten,
    Pid44181TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44182MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44182: Ablehnung der Anfrage der Markt-lokations-struktur
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44182TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: antwortPruefschritt, pruefidentifikator, transaktionsgrund, transaktionsnummer, vorgangId
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44182TransaktionStammdaten {
    /// Required entity fields for PID 44182 (Ablehnung der Anfrage der Markt-lokations-struktur).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["antwortPruefschritt", "pruefidentifikator", "transaktionsgrund", "transaktionsnummer", "vorgangId"]),
        ]
    }
}

pub type Pid44182Interchange = crate::model::Interchange<
    Pid44182MessageStammdaten,
    Pid44182TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44183MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 44183: Ende MSB von NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid44183TransaktionStammdaten {
    pub deklarationsliste_daten: Option<DeklarationslisteDaten>,
    pub deklarationsliste_daten_zuordnung: Option<DeklarationslisteDatenZuordnung>,
    pub gemeinde_daten: Option<GemeindeDaten>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub geschaeftspartner: Option<Vec<GeschaeftspartnerWrapped>>,
    pub kommunikationseinrichtung_daten: Option<KommunikationseinrichtungDaten>,
    pub konzession_daten: Option<KonzessionDaten>,
    pub lastprofil_daten: Option<LastprofilDaten>,
    pub lastprofil_daten_zuordnung: Option<LastprofilDatenZuordnung>,
    pub marktlokation: Option<MarktlokationWrapped>,
    pub marktlokation_zuordnung: Option<MarktlokationZuordnung>,
    pub mengenumwerter_daten: Option<MengenumwerterDaten>,
    pub messdatenregistriergeraet_daten: Option<MessdatenregistriergeraetDaten>,
    /// Required (Muss). Fields: meldepunktId
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub messlokation: Option<Vec<MesslokationWrapped>>,
    pub messlokation_zuordnung: Option<MesslokationZuordnung>,
    pub messprodukt_daten: Option<MessproduktDatenWrapped>,
    pub obis_daten_marktlokation: Option<ObisDatenMarktlokationWrapped>,
    pub obis_daten_zaehler: Option<ObisDatenZaehlerWrapped>,
    pub obis_daten_zaehler_zuordnung: Option<ObisDatenZaehlerZuordnung>,
    /// Required (Muss). Fields: pruefidentifikator
    pub prozessdaten: Option<Prozessdaten>,
    pub smartmeter_gateway_daten: Option<SmartmeterGatewayDatenWrapped>,
    pub zaehler: Option<ZaehlerWrapped>,
    pub zaehler_zuordnung: Option<ZaehlerZuordnung>,
}

impl Pid44183TransaktionStammdaten {
    /// Required entity fields for PID 44183 (Ende MSB von NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["meldepunktId"]),
            ("prozessdaten", &["pruefidentifikator"]),
        ]
    }
}

pub type Pid44183Interchange = crate::model::Interchange<
    Pid44183MessageStammdaten,
    Pid44183TransaktionStammdaten,
>;

