// 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"),
        }
    }
}

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

/// PID 13002: Zählerstand (Gas)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13002TransaktionStammdaten {
    /// Required (Muss). Fields: geraeteNummer, referenz.typ
    pub geraet: Option<Geraet>,
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ablesedatum, ablesedatumFormat, ausfuehrungszeitpunkt, beginn, ende, messwertQualifier, nutzungszeitpunkt, statusEnergiemengeGrund, statusErsatzwertGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13002TransaktionStammdaten {
    /// Required entity fields for PID 13002 (Zählerstand (Gas)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geraet", &["geraeteNummer", "referenz.typ"]),
            ("messlokation", &["lokationsId"]),
            ("messwert", &["ablesedatum", "ablesedatumFormat", "ausfuehrungszeitpunkt", "beginn", "ende", "messwertQualifier", "nutzungszeitpunkt", "statusEnergiemengeGrund", "statusErsatzwertGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13002Interchange = crate::model::Interchange<
    Pid13002MessageStammdaten,
    Pid13002TransaktionStammdaten,
>;

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

/// PID 13003: Summen-zeitreihe
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13003TransaktionStammdaten {
    /// Required (Muss). Fields: lieferdatum, lokationsId, referenzzeitraum
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13003TransaktionStammdaten {
    /// Required entity fields for PID 13003 (Summen-zeitreihe).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lieferdatum", "lokationsId", "referenzzeitraum"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13003Interchange = crate::model::Interchange<
    Pid13003MessageStammdaten,
    Pid13003TransaktionStammdaten,
>;

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

/// PID 13005: EEG-Überführungs-ZR
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13005TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, klassentypCode, lieferdatum, lokationsId, zeitreihentyp, zusatzLokation
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13005TransaktionStammdaten {
    /// Required entity fields for PID 13005 (EEG-Überführungs-ZR).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "klassentypCode", "lieferdatum", "lokationsId", "zeitreihentyp", "zusatzLokation"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13005Interchange = crate::model::Interchange<
    Pid13005MessageStammdaten,
    Pid13005TransaktionStammdaten,
>;

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

/// PID 13006: Messwert Storno
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13006TransaktionStammdaten {
    /// Required (Muss).
    pub messlokation: Option<MesslokationWrapped>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

pub type Pid13006Interchange = crate::model::Interchange<
    Pid13006MessageStammdaten,
    Pid13006TransaktionStammdaten,
>;

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

/// PID 13007: Gasbeschaffenheit
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13007TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lieferdatum, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, statusEnergiemengeGrund, statusErsatzwertGrund, statusKorrekturGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13007TransaktionStammdaten {
    /// Required entity fields for PID 13007 (Gasbeschaffenheit).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lieferdatum", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "statusEnergiemengeGrund", "statusErsatzwertGrund", "statusKorrekturGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13007Interchange = crate::model::Interchange<
    Pid13007MessageStammdaten,
    Pid13007TransaktionStammdaten,
>;

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

/// PID 13008: Lastgang (Gas)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13008TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, statusEnergiemengeGrund, statusErsatzwertGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13008TransaktionStammdaten {
    /// Required entity fields for PID 13008 (Lastgang (Gas)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "statusEnergiemengeGrund", "statusErsatzwertGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13008Interchange = crate::model::Interchange<
    Pid13008MessageStammdaten,
    Pid13008TransaktionStammdaten,
>;

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

/// PID 13009: Energiemenge (Gas)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13009TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, statusEnergiemengeGrund, statusErsatzwertGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13009TransaktionStammdaten {
    /// Required entity fields for PID 13009 (Energiemenge (Gas)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "statusEnergiemengeGrund", "statusErsatzwertGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13009Interchange = crate::model::Interchange<
    Pid13009MessageStammdaten,
    Pid13009TransaktionStammdaten,
>;

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

/// PID 13010: normiertes Profil
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13010TransaktionStammdaten {
    /// Required (Muss). Fields: lieferdatum, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13010TransaktionStammdaten {
    /// Required entity fields for PID 13010 (normiertes Profil).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lieferdatum", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13010Interchange = crate::model::Interchange<
    Pid13010MessageStammdaten,
    Pid13010TransaktionStammdaten,
>;

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

/// PID 13011: Profilschar
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13011TransaktionStammdaten {
    /// Required (Muss). Fields: gueltigkeit, lieferdatum, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id, produktIdentifikation.typ
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13011TransaktionStammdaten {
    /// Required entity fields for PID 13011 (Profilschar).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["gueltigkeit", "lieferdatum", "lokationsId"]),
            ("messwert", &["messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id", "produktIdentifikation.typ"]),
        ]
    }
}

pub type Pid13011Interchange = crate::model::Interchange<
    Pid13011MessageStammdaten,
    Pid13011TransaktionStammdaten,
>;

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

/// PID 13012: TEP vergh. Werte Referenz-messung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13012TransaktionStammdaten {
    /// Required (Muss). Fields: lieferdatum, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13012TransaktionStammdaten {
    /// Required entity fields for PID 13012 (TEP vergh. Werte Referenz-messung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lieferdatum", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13012Interchange = crate::model::Interchange<
    Pid13012MessageStammdaten,
    Pid13012TransaktionStammdaten,
>;

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

/// PID 13013: marktlokations- scharfe Allokationsliste Gas (MMMA)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13013TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId, referenzzeitraum
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: abrechnungszeitraum, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13013TransaktionStammdaten {
    /// Required entity fields for PID 13013 (marktlokations- scharfe Allokationsliste Gas (MMMA)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId", "referenzzeitraum"]),
            ("messwert", &["abrechnungszeitraum", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13013Interchange = crate::model::Interchange<
    Pid13013MessageStammdaten,
    Pid13013TransaktionStammdaten,
>;

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

/// PID 13014: marktlokations- scharfe bilanzierte Menge Strom / Gas (MMMA)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13014TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13014TransaktionStammdaten {
    /// Required entity fields for PID 13014 (marktlokations- scharfe bilanzierte Menge Strom / Gas (MMMA)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13014Interchange = crate::model::Interchange<
    Pid13014MessageStammdaten,
    Pid13014TransaktionStammdaten,
>;

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

/// PID 13015: Arbeit Leistungs-max. Kalenderjahr vor Lieferbeginn
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13015TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: abrechnungszeitraum, beginn, ende, messwertQualifier, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13015TransaktionStammdaten {
    /// Required entity fields for PID 13015 (Arbeit Leistungs-max. Kalenderjahr vor Lieferbeginn).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId"]),
            ("messwert", &["abrechnungszeitraum", "beginn", "ende", "messwertQualifier", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13015Interchange = crate::model::Interchange<
    Pid13015MessageStammdaten,
    Pid13015TransaktionStammdaten,
>;

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

/// PID 13016: Energie-menge u. Leistungs-max. (Strom)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13016TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: abrechnungszeitraum, beginn, ende, messwertQualifier, statusEnergiemengeGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id, produktIdentifikation.typ
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13016TransaktionStammdaten {
    /// Required entity fields for PID 13016 (Energie-menge u. Leistungs-max. (Strom)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId"]),
            ("messwert", &["abrechnungszeitraum", "beginn", "ende", "messwertQualifier", "statusEnergiemengeGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id", "produktIdentifikation.typ"]),
        ]
    }
}

pub type Pid13016Interchange = crate::model::Interchange<
    Pid13016MessageStammdaten,
    Pid13016TransaktionStammdaten,
>;

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

/// PID 13017: Zählerstand (Strom)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13017TransaktionStammdaten {
    /// Required (Muss). Fields: geraeteNummer, referenz.typ
    pub geraet: Option<Geraet>,
    /// Required (Muss).
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ablesedatum, ablesedatumFormat, ausfuehrungszeitpunkt, messwertQualifier, nutzungszeitpunkt, statusEnergiemengeGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13017TransaktionStammdaten {
    /// Required entity fields for PID 13017 (Zählerstand (Strom)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geraet", &["geraeteNummer", "referenz.typ"]),
            ("messwert", &["ablesedatum", "ablesedatumFormat", "ausfuehrungszeitpunkt", "messwertQualifier", "nutzungszeitpunkt", "statusEnergiemengeGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13017Interchange = crate::model::Interchange<
    Pid13017MessageStammdaten,
    Pid13017TransaktionStammdaten,
>;

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

/// PID 13018: Lastgang Messlokation, Netzkoppel-punkt, Netzlokation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13018TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, statusEnergiemengeGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13018TransaktionStammdaten {
    /// Required entity fields for PID 13018 (Lastgang Messlokation, Netzkoppel-punkt, Netzlokation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "statusEnergiemengeGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13018Interchange = crate::model::Interchange<
    Pid13018MessageStammdaten,
    Pid13018TransaktionStammdaten,
>;

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

/// PID 13019: Energie-menge (Strom)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13019TransaktionStammdaten {
    /// Required (Muss). Fields: geraeteNummer, referenz.typ
    pub geraet: Option<Geraet>,
    /// Required (Muss).
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, statusEnergiemenge, statusEnergiemengeGrund, statusKorrektur, statusKorrekturGrund, statusMesswertqualitaet, statusMesswertqualitaetGrund, statusPlausibilisierung, statusPlausibilisierungGrund, statusVerbrauch, statusVerbrauchGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13019TransaktionStammdaten {
    /// Required entity fields for PID 13019 (Energie-menge (Strom)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("geraet", &["geraeteNummer", "referenz.typ"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "statusEnergiemenge", "statusEnergiemengeGrund", "statusKorrektur", "statusKorrekturGrund", "statusMesswertqualitaet", "statusMesswertqualitaetGrund", "statusPlausibilisierung", "statusPlausibilisierungGrund", "statusVerbrauch", "statusVerbrauchGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13019Interchange = crate::model::Interchange<
    Pid13019MessageStammdaten,
    Pid13019TransaktionStammdaten,
>;

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

/// PID 13020: Ausfallarbeits-überführungszeitreihe
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13020TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lieferdatum, lokationsId, referenzzeitraum
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, einheit, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13020TransaktionStammdaten {
    /// Required entity fields for PID 13020 (Ausfallarbeits-überführungszeitreihe).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lieferdatum", "lokationsId", "referenzzeitraum"]),
            ("messwert", &["beginn", "einheit", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13020Interchange = crate::model::Interchange<
    Pid13020MessageStammdaten,
    Pid13020TransaktionStammdaten,
>;

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

/// PID 13021: Übermittlung von meteorologischen Daten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13021TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lieferdatum, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, einheit, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13021TransaktionStammdaten {
    /// Required entity fields for PID 13021 (Übermittlung von meteorologischen Daten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lieferdatum", "lokationsId"]),
            ("messwert", &["beginn", "einheit", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13021Interchange = crate::model::Interchange<
    Pid13021MessageStammdaten,
    Pid13021TransaktionStammdaten,
>;

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

/// PID 13022: Redispatch 2.0 Einzelzeitreihe Ausfallarbeit
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13022TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lieferdatum, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, einheit, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13022TransaktionStammdaten {
    /// Required entity fields for PID 13022 (Redispatch 2.0 Einzelzeitreihe Ausfallarbeit).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lieferdatum", "lokationsId"]),
            ("messwert", &["beginn", "einheit", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13022Interchange = crate::model::Interchange<
    Pid13022MessageStammdaten,
    Pid13022TransaktionStammdaten,
>;

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

/// PID 13023: Redispatch 2.0 Ausfallarbeits-summenzeitreihe
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13023TransaktionStammdaten {
    /// Required (Muss). Fields: lieferdatum, lokationsId, referenzzeitraum
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, einheit, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13023TransaktionStammdaten {
    /// Required entity fields for PID 13023 (Redispatch 2.0 Ausfallarbeits-summenzeitreihe).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lieferdatum", "lokationsId", "referenzzeitraum"]),
            ("messwert", &["beginn", "einheit", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13023Interchange = crate::model::Interchange<
    Pid13023MessageStammdaten,
    Pid13023TransaktionStammdaten,
>;

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

/// PID 13024: ...wird nicht mehr verwendet...
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13024TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13024TransaktionStammdaten {
    /// Required entity fields for PID 13024 (...wird nicht mehr verwendet...).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13024Interchange = crate::model::Interchange<
    Pid13024MessageStammdaten,
    Pid13024TransaktionStammdaten,
>;

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

/// PID 13025: Lastgang Marktlokation, Tranche
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13025TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, statusEnergiemengeGrund, statusKorrekturGrund, statusMesswertqualitaetGrund, statusPlausibilisierungGrund, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13025TransaktionStammdaten {
    /// Required entity fields for PID 13025 (Lastgang Marktlokation, Tranche).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "statusEnergiemengeGrund", "statusKorrekturGrund", "statusMesswertqualitaetGrund", "statusPlausibilisierungGrund", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13025Interchange = crate::model::Interchange<
    Pid13025MessageStammdaten,
    Pid13025TransaktionStammdaten,
>;

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

/// PID 13026: EEG-Überführungs-ZR aufgrund Ausfallarbeit
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13026TransaktionStammdaten {
    /// Required (Muss). Fields: beginn, ende, klassentypCode, lieferdatum, lokationsId, zeitreihentyp, zusatzLokation
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, einheit, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13026TransaktionStammdaten {
    /// Required entity fields for PID 13026 (EEG-Überführungs-ZR aufgrund Ausfallarbeit).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["beginn", "ende", "klassentypCode", "lieferdatum", "lokationsId", "zeitreihentyp", "zusatzLokation"]),
            ("messwert", &["beginn", "einheit", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13026Interchange = crate::model::Interchange<
    Pid13026MessageStammdaten,
    Pid13026TransaktionStammdaten,
>;

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

/// PID 13027: Werte nach Typ 2
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13027TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ausfuehrungszeitpunkt, beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13027TransaktionStammdaten {
    /// Required entity fields for PID 13027 (Werte nach Typ 2).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId"]),
            ("messwert", &["ausfuehrungszeitpunkt", "beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13027Interchange = crate::model::Interchange<
    Pid13027MessageStammdaten,
    Pid13027TransaktionStammdaten,
>;

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

/// PID 13028: Grundlage POG-Ermittlung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid13028TransaktionStammdaten {
    /// Required (Muss). Fields: lokationsId
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: beginn, ende, messwertQualifier, wert
    pub messwert: Option<Messwert>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    pub position: Option<Position>,
    /// Optional.
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid13028TransaktionStammdaten {
    /// Required entity fields for PID 13028 (Grundlage POG-Ermittlung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["lokationsId"]),
            ("messwert", &["beginn", "ende", "messwertQualifier", "wert"]),
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid13028Interchange = crate::model::Interchange<
    Pid13028MessageStammdaten,
    Pid13028TransaktionStammdaten,
>;

