// 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 Pid17001MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17001: Bestellung Geräteübernahmeangebot
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17001TransaktionStammdaten {
    /// Required (Muss). Fields: apnKommunikation, apnKommunikationQualifier, endpunktAdresseQualifier, endpunktGwaAdminService, endpunktGwaManagement, endpunktGwaNtp, positionsnummer, wakeUpPort, wakeUpPortQualifier, zertifikatInfo, zertifikatInfo2, zertifikatInfo3, zertifikatQualifier
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17001TransaktionStammdaten {
    /// Required entity fields for PID 17001 (Bestellung Geräteübernahmeangebot).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["apnKommunikation", "apnKommunikationQualifier", "endpunktAdresseQualifier", "endpunktGwaAdminService", "endpunktGwaManagement", "endpunktGwaNtp", "positionsnummer", "wakeUpPort", "wakeUpPortQualifier", "zertifikatInfo", "zertifikatInfo2", "zertifikatInfo3", "zertifikatQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17001Interchange = crate::model::Interchange<
    Pid17001MessageStammdaten,
    Pid17001TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17004MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17004: Anforderung von Werten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17004TransaktionStammdaten {
    /// Required (Muss). Fields: beschreibung, gueltigkeitsdatum, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17004TransaktionStammdaten {
    /// Required entity fields for PID 17004 (Anforderung von Werten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["beschreibung", "gueltigkeitsdatum", "positionsnummer"]),
        ]
    }
}

pub type Pid17004Interchange = crate::model::Interchange<
    Pid17004MessageStammdaten,
    Pid17004TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17006MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17006: Beendigung Rechnungsabwicklung MSB über LF
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17006TransaktionStammdaten {
    /// Required (Muss). Fields: beschreibung, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17006TransaktionStammdaten {
    /// Required entity fields for PID 17006 (Beendigung Rechnungsabwicklung MSB über LF).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["beschreibung", "positionsnummer"]),
        ]
    }
}

pub type Pid17006Interchange = crate::model::Interchange<
    Pid17006MessageStammdaten,
    Pid17006TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17009MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17009: Anzeige Gerätewechsel- absicht
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17009TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: exRefName, exRefWert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position_referenz: Option<Vec<PositionReferenz>>,
}

impl Pid17009TransaktionStammdaten {
    /// Required entity fields for PID 17009 (Anzeige Gerätewechsel- absicht).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code"]),
            ("position", &["positionsnummer"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17009Interchange = crate::model::Interchange<
    Pid17009MessageStammdaten,
    Pid17009TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17011MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17011: Bestellung Angebot Änderung Technik
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17011TransaktionStammdaten {
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation, produktIdentifikationQualifier, produktIdentifikationTyp
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17011TransaktionStammdaten {
    /// Required entity fields for PID 17011 (Bestellung Angebot Änderung Technik).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["handlungCode", "positionsnummer", "produktIdentifikation", "produktIdentifikationQualifier", "produktIdentifikationTyp"]),
        ]
    }
}

pub type Pid17011Interchange = crate::model::Interchange<
    Pid17011MessageStammdaten,
    Pid17011TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17101MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17101: Anfrage Stammdaten Marktlokation (Gas)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17101TransaktionStammdaten {
    /// Required (Muss). Fields: freitext, positionsnummer, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: exRefName, exRefWert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position_referenz: Option<Vec<PositionReferenz>>,
}

impl Pid17101TransaktionStammdaten {
    /// Required entity fields for PID 17101 (Anfrage Stammdaten Marktlokation (Gas)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["freitext", "positionsnummer", "textbezug"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17101Interchange = crate::model::Interchange<
    Pid17101MessageStammdaten,
    Pid17101TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17102MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17102: Anfrage von Werten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17102TransaktionStammdaten {
    /// Required (Muss). Fields: beginnZeitraum, endeZeitraum, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17102TransaktionStammdaten {
    /// Required entity fields for PID 17102 (Anfrage von Werten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["beginnZeitraum", "endeZeitraum", "positionsnummer"]),
        ]
    }
}

pub type Pid17102Interchange = crate::model::Interchange<
    Pid17102MessageStammdaten,
    Pid17102TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17103MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17103: Anforderung Brennwert / Zustandszahl
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17103TransaktionStammdaten {
    /// Required (Muss). Fields: beginnZeitraum, endeZeitraum, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17103TransaktionStammdaten {
    /// Required entity fields for PID 17103 (Anforderung Brennwert / Zustandszahl).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["beginnZeitraum", "endeZeitraum", "positionsnummer"]),
        ]
    }
}

pub type Pid17103Interchange = crate::model::Interchange<
    Pid17103MessageStammdaten,
    Pid17103TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17111MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17111: Bestellanforderung Änderung Prognosegrundlage/ Gerätekonfiguration
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17111TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmalWert
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17111TransaktionStammdaten {
    /// Required entity fields for PID 17111 (Bestellanforderung Änderung Prognosegrundlage/ Gerätekonfiguration).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code", "merkmalWert"]),
            ("position", &["positionsnummer"]),
        ]
    }
}

pub type Pid17111Interchange = crate::model::Interchange<
    Pid17111MessageStammdaten,
    Pid17111TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17112MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17112: Bestellanforderung Änderung Gerätekonfiguration
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17112TransaktionStammdaten {
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17112TransaktionStammdaten {
    /// Required entity fields for PID 17112 (Bestellanforderung Änderung Gerätekonfiguration).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid17112Interchange = crate::model::Interchange<
    Pid17112MessageStammdaten,
    Pid17112TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17113MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17113: Reklamation von Werten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17113TransaktionStammdaten {
    /// Required (Muss). Fields: beginnZeitraum, endeZeitraum, gueltigkeitsdatum, positionsnummer, produktIdentifikation.id, reklamationsgrund
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17113TransaktionStammdaten {
    /// Required entity fields for PID 17113 (Reklamation von Werten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["beginnZeitraum", "endeZeitraum", "gueltigkeitsdatum", "positionsnummer", "produktIdentifikation.id", "reklamationsgrund"]),
        ]
    }
}

pub type Pid17113Interchange = crate::model::Interchange<
    Pid17113MessageStammdaten,
    Pid17113TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17115MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17115: Sperrauftrag
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17115TransaktionStammdaten {
    /// Required (Muss). Fields: freitext, positionsnummer, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17115TransaktionStammdaten {
    /// Required entity fields for PID 17115 (Sperrauftrag).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["freitext", "positionsnummer", "textbezug"]),
        ]
    }
}

pub type Pid17115Interchange = crate::model::Interchange<
    Pid17115MessageStammdaten,
    Pid17115TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17116MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17116: Anfrage Sperrung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17116TransaktionStammdaten {
    /// Required (Muss). Fields: freitext, positionsnummer, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17116TransaktionStammdaten {
    /// Required entity fields for PID 17116 (Anfrage Sperrung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["freitext", "positionsnummer", "textbezug"]),
        ]
    }
}

pub type Pid17116Interchange = crate::model::Interchange<
    Pid17116MessageStammdaten,
    Pid17116TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17117MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17117: Entsperr- auftrag
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17117TransaktionStammdaten {
    /// Required (Muss). Fields: freitext, positionsnummer, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17117TransaktionStammdaten {
    /// Required entity fields for PID 17117 (Entsperr- auftrag).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["freitext", "positionsnummer", "textbezug"]),
        ]
    }
}

pub type Pid17117Interchange = crate::model::Interchange<
    Pid17117MessageStammdaten,
    Pid17117TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17118MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17118: Bestellung einer Konfigurations- änderung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17118TransaktionStammdaten {
    /// Required (Muss). Fields: codepflegeCode2, merkmal.qualifier, merkmalText, merkmalText2, merkmalWert, merkmalWert2
    pub merkmal_z35: Option<MerkmalZ35>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z39: Option<MerkmalZ39>,
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17118TransaktionStammdaten {
    /// Required entity fields for PID 17118 (Bestellung einer Konfigurations- änderung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal_z35", &["codepflegeCode2", "merkmal.qualifier", "merkmalText", "merkmalText2", "merkmalWert", "merkmalWert2"]),
            ("merkmal_z39", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("position", &["handlungCode", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid17118Interchange = crate::model::Interchange<
    Pid17118MessageStammdaten,
    Pid17118TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17120MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17120: Bestellung Änderung Prognosegrundlage
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17120TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmalWert
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17120TransaktionStammdaten {
    /// Required entity fields for PID 17120 (Bestellung Änderung Prognosegrundlage).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code", "merkmalWert"]),
            ("position", &["positionsnummer"]),
        ]
    }
}

pub type Pid17120Interchange = crate::model::Interchange<
    Pid17120MessageStammdaten,
    Pid17120TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17121MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17121: Bestellung Änderung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17121TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalWert, messgroesse
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: codepflegeCode2, merkmal.qualifier, merkmalText, merkmalText2, merkmalWert, merkmalWert2
    pub merkmal_z35: Option<MerkmalZ35>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalWert, messgroesse
    pub merkmal_z39: Option<MerkmalZ39>,
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation.id, produktIdentifikation2.codeListe, produktIdentifikation2.typ, produktIdentifikation3.codeListe, produktIdentifikation3.typ, produktIdentifikation4.codeListe, produktIdentifikation4.typ
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17121TransaktionStammdaten {
    /// Required entity fields for PID 17121 (Bestellung Änderung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code", "merkmal.qualifier", "merkmalWert", "messgroesse"]),
            ("merkmal_z35", &["codepflegeCode2", "merkmal.qualifier", "merkmalText", "merkmalText2", "merkmalWert", "merkmalWert2"]),
            ("merkmal_z39", &["merkmal.code", "merkmal.qualifier", "merkmalWert", "messgroesse"]),
            ("position", &["handlungCode", "positionsnummer", "produktIdentifikation.id", "produktIdentifikation2.codeListe", "produktIdentifikation2.typ", "produktIdentifikation3.codeListe", "produktIdentifikation3.typ", "produktIdentifikation4.codeListe", "produktIdentifikation4.typ"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17121Interchange = crate::model::Interchange<
    Pid17121MessageStammdaten,
    Pid17121TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17122MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17122: Reklamation einer Definition
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17122TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z39: Option<MerkmalZ39>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z52: Option<MerkmalZ52>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z53: Option<MerkmalZ53>,
    /// Required (Muss). Fields: handlungCode, positionsnummer, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17122TransaktionStammdaten {
    /// Required entity fields for PID 17122 (Reklamation einer Definition).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal_z39", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z52", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z53", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("position", &["handlungCode", "positionsnummer", "textbezug"]),
        ]
    }
}

pub type Pid17122Interchange = crate::model::Interchange<
    Pid17122MessageStammdaten,
    Pid17122TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17123MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17123: Bestellung Änderung Zählzeitdefinition
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17123TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17123TransaktionStammdaten {
    /// Required entity fields for PID 17123 (Bestellung Änderung Zählzeitdefinition).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("position", &["handlungCode", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid17123Interchange = crate::model::Interchange<
    Pid17123MessageStammdaten,
    Pid17123TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17124MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17124: Weiterleitung/Bestellung Änderung Zählzeitdefinition
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17124TransaktionStammdaten {
    /// Required (Muss). Fields: handlungCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17124TransaktionStammdaten {
    /// Required entity fields for PID 17124 (Weiterleitung/Bestellung Änderung Zählzeitdefinition).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["handlungCode"]),
        ]
    }
}

pub type Pid17124Interchange = crate::model::Interchange<
    Pid17124MessageStammdaten,
    Pid17124TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17126MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17126: Anfrage Stammdaten Messlokation (Gas)
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17126TransaktionStammdaten {
    /// Required (Muss). Fields: freitext, positionsnummer, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: exRefName, exRefWert
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position_referenz: Option<Vec<PositionReferenz>>,
}

impl Pid17126TransaktionStammdaten {
    /// Required entity fields for PID 17126 (Anfrage Stammdaten Messlokation (Gas)).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["freitext", "positionsnummer", "textbezug"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17126Interchange = crate::model::Interchange<
    Pid17126MessageStammdaten,
    Pid17126TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17128MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17128: Reklamation einer Konfiguration
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17128TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z52: Option<MerkmalZ52>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z53: Option<MerkmalZ53>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalBeschreibung, merkmalBeschreibung2, messgroesse
    pub merkmal_z54: Option<MerkmalZ54>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalBeschreibung, merkmalBeschreibung2, messgroesse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub merkmal_z60: Option<Vec<MerkmalZ60>>,
    /// Required (Muss). Fields: freitext, freitextZ17, freitextZ23, freitextZ24, handlungCode, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17128TransaktionStammdaten {
    /// Required entity fields for PID 17128 (Reklamation einer Konfiguration).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal_z52", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z53", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z54", &["merkmal.code", "merkmal.qualifier", "merkmalBeschreibung", "merkmalBeschreibung2", "messgroesse"]),
            ("merkmal_z60", &["merkmal.code", "merkmal.qualifier", "merkmalBeschreibung", "merkmalBeschreibung2", "messgroesse"]),
            ("position", &["freitext", "freitextZ17", "freitextZ23", "freitextZ24", "handlungCode", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid17128Interchange = crate::model::Interchange<
    Pid17128MessageStammdaten,
    Pid17128TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17130MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17130: Bestellung einer Konfiguration
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17130TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z52: Option<MerkmalZ52>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z53: Option<MerkmalZ53>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalBeschreibung, merkmalBeschreibung2, messgroesse
    pub merkmal_z54: Option<MerkmalZ54>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalBeschreibung, merkmalBeschreibung2, messgroesse
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub merkmal_z60: Option<Vec<MerkmalZ60>>,
    /// Required (Muss). Fields: freitextZ17, freitextZ17_2, freitextZ23, freitextZ23_2, freitextZ24, freitextZ24_2, handlungCode, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17130TransaktionStammdaten {
    /// Required entity fields for PID 17130 (Bestellung einer Konfiguration).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal_z52", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z53", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z54", &["merkmal.code", "merkmal.qualifier", "merkmalBeschreibung", "merkmalBeschreibung2", "messgroesse"]),
            ("merkmal_z60", &["merkmal.code", "merkmal.qualifier", "merkmalBeschreibung", "merkmalBeschreibung2", "messgroesse"]),
            ("position", &["freitextZ17", "freitextZ17_2", "freitextZ23", "freitextZ23_2", "freitextZ24", "freitextZ24_2", "handlungCode", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid17130Interchange = crate::model::Interchange<
    Pid17130MessageStammdaten,
    Pid17130TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17133MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17133: Bestellung Änderung Abrechnungsdaten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17133TransaktionStammdaten {
    /// Required (Muss). Fields: codepflegeCode2, merkmal.qualifier, merkmalText, merkmalText2, merkmalWert, merkmalWert2
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: freitext, handlungCode, positionsnummer, produktIdentifikation.id, textReferenzCode, textbezug
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17133TransaktionStammdaten {
    /// Required entity fields for PID 17133 (Bestellung Änderung Abrechnungsdaten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["codepflegeCode2", "merkmal.qualifier", "merkmalText", "merkmalText2", "merkmalWert", "merkmalWert2"]),
            ("position", &["freitext", "handlungCode", "positionsnummer", "produktIdentifikation.id", "textReferenzCode", "textbezug"]),
        ]
    }
}

pub type Pid17133Interchange = crate::model::Interchange<
    Pid17133MessageStammdaten,
    Pid17133TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17134MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17134: Einrichtung Konfiguration Zuordnung LF von NB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17134TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, merkmalWert, messgroesse
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z37: Option<MerkmalZ37>,
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal_z39: Option<MerkmalZ39>,
    /// Required (Muss). Fields: artikeltyp, beschreibung, einheit, handlungCode, menge, mengenQualifier, positionsnummer, produktIdentifikation.id, produktIdentifikation2.codeListe, produktIdentifikation2.typ, produktIdentifikation3.codeListe, produktIdentifikation3.typ, produktIdentifikation4.codeListe, produktIdentifikation4.typ
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17134TransaktionStammdaten {
    /// Required entity fields for PID 17134 (Einrichtung Konfiguration Zuordnung LF von NB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code", "merkmal.qualifier", "merkmalWert", "messgroesse"]),
            ("merkmal_z37", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("merkmal_z39", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("position", &["artikeltyp", "beschreibung", "einheit", "handlungCode", "menge", "mengenQualifier", "positionsnummer", "produktIdentifikation.id", "produktIdentifikation2.codeListe", "produktIdentifikation2.typ", "produktIdentifikation3.codeListe", "produktIdentifikation3.typ", "produktIdentifikation4.codeListe", "produktIdentifikation4.typ"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17134Interchange = crate::model::Interchange<
    Pid17134MessageStammdaten,
    Pid17134TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17135MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17135: Einrichtung Konfiguration Zuordnung LF von MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17135TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.code, merkmal.qualifier, messgroesse
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation.id
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17135TransaktionStammdaten {
    /// Required entity fields for PID 17135 (Einrichtung Konfiguration Zuordnung LF von MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.code", "merkmal.qualifier", "messgroesse"]),
            ("position", &["handlungCode", "positionsnummer", "produktIdentifikation.id"]),
        ]
    }
}

pub type Pid17135Interchange = crate::model::Interchange<
    Pid17135MessageStammdaten,
    Pid17135TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17201MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17201: Anforder. normierter Profile und Profil- scharen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17201TransaktionStammdaten {
    /// Required (Muss). Fields: merkmal.qualifier
    pub merkmal: Option<Merkmal>,
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17201TransaktionStammdaten {
    /// Required entity fields for PID 17201 (Anforder. normierter Profile und Profil- scharen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("merkmal", &["merkmal.qualifier"]),
            ("position", &["positionsnummer"]),
        ]
    }
}

pub type Pid17201Interchange = crate::model::Interchange<
    Pid17201MessageStammdaten,
    Pid17201TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17202MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17202: Anforder. Liefer- anten- clearing- liste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17202TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17202TransaktionStammdaten {
    /// Required entity fields for PID 17202 (Anforder. Liefer- anten- clearing- liste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17202Interchange = crate::model::Interchange<
    Pid17202MessageStammdaten,
    Pid17202TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17203MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17203: Anforder. Bilanz- kreiszu- ordnungs- liste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17203TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
}

impl Pid17203TransaktionStammdaten {
    /// Required entity fields for PID 17203 (Anforder. Bilanz- kreiszu- ordnungs- liste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
        ]
    }
}

pub type Pid17203Interchange = crate::model::Interchange<
    Pid17203MessageStammdaten,
    Pid17203TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17204MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17204: Anforder. Clearing- liste BAS
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17204TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17204TransaktionStammdaten {
    /// Required entity fields for PID 17204 (Anforder. Clearing- liste BAS).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17204Interchange = crate::model::Interchange<
    Pid17204MessageStammdaten,
    Pid17204TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17205MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17205: Anforder. Clearing- liste DZR
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17205TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17205TransaktionStammdaten {
    /// Required entity fields for PID 17205 (Anforder. Clearing- liste DZR).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17205Interchange = crate::model::Interchange<
    Pid17205MessageStammdaten,
    Pid17205TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17206MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17206: Anforderung Bilanzie- rungsgebiets clearingliste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17206TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17206TransaktionStammdaten {
    /// Required entity fields for PID 17206 (Anforderung Bilanzie- rungsgebiets clearingliste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17206Interchange = crate::model::Interchange<
    Pid17206MessageStammdaten,
    Pid17206TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17207MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17207: Ab-/Bestellung BK-SZR auf Aggre- gationsebene RZ
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17207TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
}

impl Pid17207TransaktionStammdaten {
    /// Required entity fields for PID 17207 (Ab-/Bestellung BK-SZR auf Aggre- gationsebene RZ).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
        ]
    }
}

pub type Pid17207Interchange = crate::model::Interchange<
    Pid17207MessageStammdaten,
    Pid17207TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17208MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17208: Anforderung Clearingliste ÜNB-DZR
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17208TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17208TransaktionStammdaten {
    /// Required entity fields for PID 17208 (Anforderung Clearingliste ÜNB-DZR).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17208Interchange = crate::model::Interchange<
    Pid17208MessageStammdaten,
    Pid17208TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17209MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17209: Anforderung Ausfallarbeit
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17209TransaktionStammdaten {
    /// Required (Muss). Fields: beginnZeitraum, endeZeitraum, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
}

impl Pid17209TransaktionStammdaten {
    /// Required entity fields for PID 17209 (Anforderung Ausfallarbeit).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["beginnZeitraum", "endeZeitraum", "positionsnummer"]),
        ]
    }
}

pub type Pid17209Interchange = crate::model::Interchange<
    Pid17209MessageStammdaten,
    Pid17209TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17210MessageStammdaten {
    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>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub teilnehmer_referenz: Option<Vec<TeilnehmerReferenz>>,
}

/// PID 17210: Anforderung Lieferanten- ausfallarbeits- clearingliste
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid17210TransaktionStammdaten {
    /// Required (Muss). Fields: positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: ortIdentifikator, ortQualifier
    pub position_ort: Option<PositionOrtWrapped>,
    /// Required (Muss). Fields: exRefName, exRefWert
    pub position_referenz: Option<PositionReferenz>,
}

impl Pid17210TransaktionStammdaten {
    /// Required entity fields for PID 17210 (Anforderung Lieferanten- ausfallarbeits- clearingliste).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("position", &["positionsnummer"]),
            ("position_ort", &["ortIdentifikator", "ortQualifier"]),
            ("position_referenz", &["exRefName", "exRefWert"]),
        ]
    }
}

pub type Pid17210Interchange = crate::model::Interchange<
    Pid17210MessageStammdaten,
    Pid17210TransaktionStammdaten,
>;

