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

#![allow(unused_imports)]

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

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21000MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21000: Statusmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21000TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: bilanzierungsperiode, meldepunktId, statusaenderungZeitstempel
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: pruefidentifikator, vorgangsnummer, zeitreihenVersion
    pub vorgang: Option<Vorgang>,
}

impl Pid21000TransaktionStammdaten {
    /// Required entity fields for PID 21000 (Statusmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["bilanzierungsperiode", "meldepunktId", "statusaenderungZeitstempel"]),
            ("status", &["ebdNummer", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("vorgang", &["pruefidentifikator", "vorgangsnummer", "zeitreihenVersion"]),
        ]
    }
}

pub type Pid21000Interchange = crate::model::Interchange<
    Pid21000MessageStammdaten,
    Pid21000TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21001MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21001: Statusmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21001TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: bilanzierungsperiode, meldepunktId, statusaenderungZeitstempel
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: pruefidentifikator, vorgangsnummer, zeitreihenVersion
    pub vorgang: Option<Vorgang>,
}

impl Pid21001TransaktionStammdaten {
    /// Required entity fields for PID 21001 (Statusmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["bilanzierungsperiode", "meldepunktId", "statusaenderungZeitstempel"]),
            ("status", &["ebdNummer", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("vorgang", &["pruefidentifikator", "vorgangsnummer", "zeitreihenVersion"]),
        ]
    }
}

pub type Pid21001Interchange = crate::model::Interchange<
    Pid21001MessageStammdaten,
    Pid21001TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21002MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21002: Abweisung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21002TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: bilanzierungsperiode, meldepunktId, statusaenderungZeitstempel
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: pruefidentifikator, vorgangsnummer, zeitreihenVersion
    pub vorgang: Option<Vorgang>,
}

impl Pid21002TransaktionStammdaten {
    /// Required entity fields for PID 21002 (Abweisung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["bilanzierungsperiode", "meldepunktId", "statusaenderungZeitstempel"]),
            ("status", &["ebdNummer", "pruefschrittCode", "statusKategorie"]),
            ("vorgang", &["pruefidentifikator", "vorgangsnummer", "zeitreihenVersion"]),
        ]
    }
}

pub type Pid21002Interchange = crate::model::Interchange<
    Pid21002MessageStammdaten,
    Pid21002TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21003MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21003: Status-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21003TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: bilanzierungsperiode, meldepunktId, statusaenderungZeitstempel
    pub messlokation: Option<MesslokationWrapped>,
    pub status: Option<Status>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusCode, statusKategorie
    pub status_z03: Option<StatusZ03>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusKategorie
    pub status_z04: Option<StatusZ04>,
    /// Required (Muss). Fields: pruefidentifikator, vorgangsnummer, zeitreihenVersion
    pub vorgang: Option<Vorgang>,
}

impl Pid21003TransaktionStammdaten {
    /// Required entity fields for PID 21003 (Status-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["bilanzierungsperiode", "meldepunktId", "statusaenderungZeitstempel"]),
            ("status_z03", &["ebdNummer", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("status_z04", &["ebdNummer", "pruefschrittCode", "statusKategorie"]),
            ("vorgang", &["pruefidentifikator", "vorgangsnummer", "zeitreihenVersion"]),
        ]
    }
}

pub type Pid21003Interchange = crate::model::Interchange<
    Pid21003MessageStammdaten,
    Pid21003TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21004MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21004: Status-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21004TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: bilanzierungsperiode, meldepunktId, statusaenderungZeitstempel
    pub messlokation: Option<MesslokationWrapped>,
    pub status: Option<Status>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusKategorie
    pub status_z04: Option<StatusZ04>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusCode, statusKategorie
    pub status_z13: Option<StatusZ13>,
    /// Required (Muss). Fields: pruefidentifikator, vorgangsnummer, zeitreihenVersion
    pub vorgang: Option<Vorgang>,
}

impl Pid21004TransaktionStammdaten {
    /// Required entity fields for PID 21004 (Status-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["bilanzierungsperiode", "meldepunktId", "statusaenderungZeitstempel"]),
            ("status_z04", &["ebdNummer", "pruefschrittCode", "statusKategorie"]),
            ("status_z13", &["ebdNummer", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("vorgang", &["pruefidentifikator", "vorgangsnummer", "zeitreihenVersion"]),
        ]
    }
}

pub type Pid21004Interchange = crate::model::Interchange<
    Pid21004MessageStammdaten,
    Pid21004TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21005MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21005: Status-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21005TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: bilanzierungsperiode, meldepunktId, statusaenderungZeitstempel
    pub messlokation: Option<MesslokationWrapped>,
    /// Required (Muss). Fields: ebdNummer, pruefschrittCode, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: pruefidentifikator, vorgangsnummer, zeitreihenVersion
    pub vorgang: Option<Vorgang>,
}

impl Pid21005TransaktionStammdaten {
    /// Required entity fields for PID 21005 (Status-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("messlokation", &["bilanzierungsperiode", "meldepunktId", "statusaenderungZeitstempel"]),
            ("status", &["ebdNummer", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("vorgang", &["pruefidentifikator", "vorgangsnummer", "zeitreihenVersion"]),
        ]
    }
}

pub type Pid21005Interchange = crate::model::Interchange<
    Pid21005MessageStammdaten,
    Pid21005TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21007MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21007: Statusmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21007TransaktionStammdaten {
    /// Required (Muss). Fields: codepflegeCode, identifikation, partnerrolle
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: geplantesLieferdatum, pruefidentifikator, statusCode, statusKategorie, tnQualifier, transaktionsnummer
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21007TransaktionStammdaten {
    /// Required entity fields for PID 21007 (Statusmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("betreiber", &["codepflegeCode", "identifikation", "partnerrolle"]),
            ("status", &["geplantesLieferdatum", "pruefidentifikator", "statusCode", "statusKategorie", "tnQualifier", "transaktionsnummer"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21007Interchange = crate::model::Interchange<
    Pid21007MessageStammdaten,
    Pid21007TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21010MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21010: Status-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21010TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: fertigstellungsdatum, pruefidentifikator, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21010TransaktionStammdaten {
    /// Required entity fields for PID 21010 (Status-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["fertigstellungsdatum", "pruefidentifikator", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21010Interchange = crate::model::Interchange<
    Pid21010MessageStammdaten,
    Pid21010TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21011MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21011: Status-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21011TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, adyQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21011TransaktionStammdaten {
    /// Required entity fields for PID 21011 (Status-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["acwQualifier", "adyQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21011Interchange = crate::model::Interchange<
    Pid21011MessageStammdaten,
    Pid21011TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21012MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21012: Status-meldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21012TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, adyQualifier, fertigstellungsdatum, pruefidentifikator, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21012TransaktionStammdaten {
    /// Required entity fields for PID 21012 (Status-meldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["acwQualifier", "adyQualifier", "fertigstellungsdatum", "pruefidentifikator", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21012Interchange = crate::model::Interchange<
    Pid21012MessageStammdaten,
    Pid21012TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21018MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21018: Statusmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21018TransaktionStammdaten {
    /// Required (Muss). Fields: codepflegeCode, identifikation, partnerrolle
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: fertigstellungsdatum, pruefidentifikator, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21018TransaktionStammdaten {
    /// Required entity fields for PID 21018 (Statusmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("betreiber", &["codepflegeCode", "identifikation", "partnerrolle"]),
            ("status", &["fertigstellungsdatum", "pruefidentifikator", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21018Interchange = crate::model::Interchange<
    Pid21018MessageStammdaten,
    Pid21018TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21028MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21028: Informationsmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21028TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: aenderungsdatum, ebdNummer, pruefidentifikator, pruefschrittCode, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21028TransaktionStammdaten {
    /// Required entity fields for PID 21028 (Informationsmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["aenderungsdatum", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21028Interchange = crate::model::Interchange<
    Pid21028MessageStammdaten,
    Pid21028TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21029MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21029: Vorabinfor-mation
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21029TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: aveQualifier, entsperrtermin, geplantesLieferdatum, pruefidentifikator, referenz, sperrtermin, statusCode, statusKategorie, z17Qualifier, z45Qualifier
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21029TransaktionStammdaten {
    /// Required entity fields for PID 21029 (Vorabinfor-mation).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["aveQualifier", "entsperrtermin", "geplantesLieferdatum", "pruefidentifikator", "referenz", "sperrtermin", "statusCode", "statusKategorie", "z17Qualifier", "z45Qualifier"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21029Interchange = crate::model::Interchange<
    Pid21029MessageStammdaten,
    Pid21029TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21030MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21030: iMS-Ersteinbau-zust.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21030TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, adyQualifier, ebdNummer, geplantesLieferdatum, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21030TransaktionStammdaten {
    /// Required entity fields for PID 21030 (iMS-Ersteinbau-zust.).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["acwQualifier", "adyQualifier", "ebdNummer", "geplantesLieferdatum", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21030Interchange = crate::model::Interchange<
    Pid21030MessageStammdaten,
    Pid21030TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21031MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21031: Bestandss. / Eigenausbau iMS
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21031TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, adyQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21031TransaktionStammdaten {
    /// Required entity fields for PID 21031 (Bestandss. / Eigenausbau iMS).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["acwQualifier", "adyQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21031Interchange = crate::model::Interchange<
    Pid21031MessageStammdaten,
    Pid21031TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21032MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21032: Antwort auf das Angebot
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21032TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: aagQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21032TransaktionStammdaten {
    /// Required entity fields for PID 21032 (Antwort auf das Angebot).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["aagQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21032Interchange = crate::model::Interchange<
    Pid21032MessageStammdaten,
    Pid21032TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21033MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21033: Ablehnung der Anfrage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21033TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: aavQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, sperrtermin, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21033TransaktionStammdaten {
    /// Required entity fields for PID 21033 (Ablehnung der Anfrage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["freitext1", "sendungsposition"]),
            ("status", &["aavQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "sperrtermin", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21033Interchange = crate::model::Interchange<
    Pid21033MessageStammdaten,
    Pid21033TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21035MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21035: Rückmeld. a. Liefers.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21035TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: lieferscheinDatumBis, lieferscheinDatumVon, lieferscheinPeriode, masseinheit, menge, mengeQualifier, produktbeschreibung
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21035TransaktionStammdaten {
    /// Required entity fields for PID 21035 (Rückmeld. a. Liefers.).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("lieferschein", &["lieferscheinDatumBis", "lieferscheinDatumVon", "lieferscheinPeriode", "masseinheit", "menge", "mengeQualifier", "produktbeschreibung"]),
            ("status", &["acwQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21035Interchange = crate::model::Interchange<
    Pid21035MessageStammdaten,
    Pid21035TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21036MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21036: Gerätestatus
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21036TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: fertigstellungsdatum, pruefidentifikator, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21036TransaktionStammdaten {
    /// Required entity fields for PID 21036 (Gerätestatus).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["fertigstellungsdatum", "pruefidentifikator", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21036Interchange = crate::model::Interchange<
    Pid21036MessageStammdaten,
    Pid21036TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21037MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21037: Ansicht NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21037TransaktionStammdaten {
    /// Required (Muss). Fields: kommunikationsadresse, kommunikationstyp, kontakt.name, kontaktFunktion, partnerrolle
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: aceQualifier, acwQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21037TransaktionStammdaten {
    /// Required entity fields for PID 21037 (Ansicht NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("betreiber", &["kommunikationsadresse", "kommunikationstyp", "kontakt.name", "kontaktFunktion", "partnerrolle"]),
            ("freitext", &["freitext1", "sendungsposition"]),
            ("status", &["aceQualifier", "acwQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21037Interchange = crate::model::Interchange<
    Pid21037MessageStammdaten,
    Pid21037TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21038MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21038: Ansicht BTR
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21038TransaktionStammdaten {
    /// Required (Muss). Fields: kommunikationsadresse, kommunikationstyp, kontakt.name, kontaktFunktion, partnerrolle
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21038TransaktionStammdaten {
    /// Required entity fields for PID 21038 (Ansicht BTR).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("betreiber", &["kommunikationsadresse", "kommunikationstyp", "kontakt.name", "kontaktFunktion", "partnerrolle"]),
            ("freitext", &["freitext1", "sendungsposition"]),
            ("status", &["acwQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21038Interchange = crate::model::Interchange<
    Pid21038MessageStammdaten,
    Pid21038TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21039MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21039: Auftragsstatus (Sperren)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21039TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: ebdNummer, fertigstellungsdatum, pruefidentifikator, pruefschrittCode, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21039TransaktionStammdaten {
    /// Required entity fields for PID 21039 (Auftragsstatus (Sperren)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["freitext1", "sendungsposition"]),
            ("status", &["ebdNummer", "fertigstellungsdatum", "pruefidentifikator", "pruefschrittCode", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21039Interchange = crate::model::Interchange<
    Pid21039MessageStammdaten,
    Pid21039TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21040MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21040: Info Entsperrauftrag
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21040TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: fertigstellungsdatum, pruefidentifikator, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21040TransaktionStammdaten {
    /// Required entity fields for PID 21040 (Info Entsperrauftrag).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["fertigstellungsdatum", "pruefidentifikator", "statusCode", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21040Interchange = crate::model::Interchange<
    Pid21040MessageStammdaten,
    Pid21040TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21042MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21042: Bestellung (WiM)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21042TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: agiQualifier, eingangsdatum, pruefidentifikator, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21042TransaktionStammdaten {
    /// Required entity fields for PID 21042 (Bestellung (WiM)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["agiQualifier", "eingangsdatum", "pruefidentifikator", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21042Interchange = crate::model::Interchange<
    Pid21042MessageStammdaten,
    Pid21042TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21043MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21043: Bestellungsantwort / -mitteilung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21043TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: agiQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie, statusaenderungZeitpunkt
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21043TransaktionStammdaten {
    /// Required entity fields for PID 21043 (Bestellungsantwort / -mitteilung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["freitext1", "sendungsposition"]),
            ("status", &["agiQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie", "statusaenderungZeitpunkt"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21043Interchange = crate::model::Interchange<
    Pid21043MessageStammdaten,
    Pid21043TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21044MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21044: Bestellungsbeendigung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21044TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: agiQualifier, pruefidentifikator, referenz, statusCode, statusKategorie, statusaenderungZeitpunkt
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21044TransaktionStammdaten {
    /// Required entity fields for PID 21044 (Bestellungsbeendigung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("status", &["agiQualifier", "pruefidentifikator", "referenz", "statusCode", "statusKategorie", "statusaenderungZeitpunkt"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21044Interchange = crate::model::Interchange<
    Pid21044MessageStammdaten,
    Pid21044TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21045MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21045: EnFG Informationen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21045TransaktionStammdaten {
    /// Required (Muss). Fields: nachname, nameFormatCode, partnerrolle
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    /// Required (Muss). Fields: lieferscheinDatumBis, lieferscheinDatumVon, lieferscheinPeriode, masseinheit, menge, mengeQualifier, produktbeschreibung
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: lieferdatum, pruefidentifikator, pruefschrittCode1, pruefschrittCode2, pruefschrittCode3, pruefschrittCode4, pruefschrittCode5, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: locQualifier, meldepunktId, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21045TransaktionStammdaten {
    /// Required entity fields for PID 21045 (EnFG Informationen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("betreiber", &["nachname", "nameFormatCode", "partnerrolle"]),
            ("freitext", &["freitext1", "sendungsposition"]),
            ("lieferschein", &["lieferscheinDatumBis", "lieferscheinDatumVon", "lieferscheinPeriode", "masseinheit", "menge", "mengeQualifier", "produktbeschreibung"]),
            ("status", &["lieferdatum", "pruefidentifikator", "pruefschrittCode1", "pruefschrittCode2", "pruefschrittCode3", "pruefschrittCode4", "pruefschrittCode5", "statusKategorie"]),
            ("vorgang", &["locQualifier", "meldepunktId", "vorgangsnummer"]),
        ]
    }
}

pub type Pid21045Interchange = crate::model::Interchange<
    Pid21045MessageStammdaten,
    Pid21045TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21047MessageStammdaten {
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
}

/// PID 21047: Bearbeitungs-standsmeldung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid21047TransaktionStammdaten {
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: freitext1, sendungsposition
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    /// Required (Muss). Fields: acwQualifier, ebdNummer, pruefidentifikator, pruefschrittCode, referenz, statusCode, statusKategorie
    pub status: Option<Status>,
    /// Required (Muss). Fields: vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid21047TransaktionStammdaten {
    /// Required entity fields for PID 21047 (Bearbeitungs-standsmeldung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("freitext", &["freitext1", "sendungsposition"]),
            ("status", &["acwQualifier", "ebdNummer", "pruefidentifikator", "pruefschrittCode", "referenz", "statusCode", "statusKategorie"]),
            ("vorgang", &["vorgangsnummer"]),
        ]
    }
}

pub type Pid21047Interchange = crate::model::Interchange<
    Pid21047MessageStammdaten,
    Pid21047TransaktionStammdaten,
>;

