// 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 Pid25001MessageStammdaten {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub ansprechpartner: Option<Vec<Ansprechpartner>>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    pub nachricht: Option<Nachricht>,
}

/// PID 25001: Berechnungsformel
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25001TransaktionStammdaten {
    /// Required (Muss). Fields: rechenschrittIdentifikator, zeitraumRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub energiemenge: Option<Vec<Energiemenge>>,
    /// Required (Muss). Fields: meldepunktId, statusCode, vorgangsnummer, zeitscheibe.referenz
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
    /// Required (Muss). Fields: bestandteilReferenz, rechenschrittIdentifikator, rechenschrittNummer, zeitraumRef
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub rechenschritt: Option<Vec<Rechenschritt>>,
    /// Required (Muss). Fields: merkmal.code, merkmalWert
    pub rechenschritt_zuordnung: Option<RechenschrittZuordnung>,
    pub zeitscheibe: Option<Zeitscheibe>,
}

impl Pid25001TransaktionStammdaten {
    /// Required entity fields for PID 25001 (Berechnungsformel).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("energiemenge", &["rechenschrittIdentifikator", "zeitraumRef"]),
            ("prozessdaten", &["meldepunktId", "statusCode", "vorgangsnummer", "zeitscheibe.referenz"]),
            ("rechenschritt", &["bestandteilReferenz", "rechenschrittIdentifikator", "rechenschrittNummer", "zeitraumRef"]),
            ("rechenschritt_zuordnung", &["merkmal.code", "merkmalWert"]),
        ]
    }
}

pub type Pid25001Interchange = crate::model::Interchange<
    Pid25001MessageStammdaten,
    Pid25001TransaktionStammdaten,
>;

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

/// PID 25004: Übermittlung Übersicht Zählzeitdefinitionen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25004TransaktionStammdaten {
    /// Required (Muss). Fields: beantragungsnummer, fertigstellungsDatum, gueltigkeitsBeginn, statusCode, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
    /// Required (Muss). Fields: registerCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub register: Option<Vec<Register>>,
    /// Required (Muss). Fields: klassentyp, merkmal.code
    pub register_zuordnung: Option<RegisterZuordnung>,
    /// Required (Muss). Fields: aenderungsVerfahren, haeufigkeit, klassentyp, merkmal.code, prioritaet, sequenzQualifier, uebermittelbarkeit, validierungStatus
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehlzeitdefinition: Option<Vec<Zaehlzeitdefinition>>,
}

impl Pid25004TransaktionStammdaten {
    /// Required entity fields for PID 25004 (Übermittlung Übersicht Zählzeitdefinitionen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("prozessdaten", &["beantragungsnummer", "fertigstellungsDatum", "gueltigkeitsBeginn", "statusCode", "vorgangsnummer"]),
            ("register", &["registerCode"]),
            ("register_zuordnung", &["klassentyp", "merkmal.code"]),
            ("zaehlzeitdefinition", &["aenderungsVerfahren", "haeufigkeit", "klassentyp", "merkmal.code", "prioritaet", "sequenzQualifier", "uebermittelbarkeit", "validierungStatus"]),
        ]
    }
}

pub type Pid25004Interchange = crate::model::Interchange<
    Pid25004MessageStammdaten,
    Pid25004TransaktionStammdaten,
>;

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

/// PID 25005: Übermittlung einer ausgerollten Zählzeitdefinition
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25005TransaktionStammdaten {
    /// Required (Muss). Fields: beantragungsnummer, definitionCode, fertigstellungsDatum, gueltigkeitsBeginn, gueltigkeitsEnde, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
    /// Required (Muss). Fields: aenderungsZeitpunkt, registerCode, zeitpunktFormat
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub zaehlzeitaenderung: Option<Vec<Zaehlzeitaenderung>>,
}

impl Pid25005TransaktionStammdaten {
    /// Required entity fields for PID 25005 (Übermittlung einer ausgerollten Zählzeitdefinition).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("prozessdaten", &["beantragungsnummer", "definitionCode", "fertigstellungsDatum", "gueltigkeitsBeginn", "gueltigkeitsEnde", "vorgangsnummer"]),
            ("zaehlzeitaenderung", &["aenderungsZeitpunkt", "registerCode", "zeitpunktFormat"]),
        ]
    }
}

pub type Pid25005Interchange = crate::model::Interchange<
    Pid25005MessageStammdaten,
    Pid25005TransaktionStammdaten,
>;

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

/// PID 25006: Übermittlung Übersicht Schaltzeitdefinitionen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25006TransaktionStammdaten {
    /// Required (Muss). Fields: beantragungsnummer, fertigstellungsDatum, gueltigkeitsBeginn, statusCode, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
    /// Required (Muss). Fields: haeufigkeit, klassentyp, merkmal.code, sequenzQualifier, uebermittelbarkeit
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub schaltzeitdefinition: Option<Vec<Schaltzeitdefinition>>,
}

impl Pid25006TransaktionStammdaten {
    /// Required entity fields for PID 25006 (Übermittlung Übersicht Schaltzeitdefinitionen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("prozessdaten", &["beantragungsnummer", "fertigstellungsDatum", "gueltigkeitsBeginn", "statusCode", "vorgangsnummer"]),
            ("schaltzeitdefinition", &["haeufigkeit", "klassentyp", "merkmal.code", "sequenzQualifier", "uebermittelbarkeit"]),
        ]
    }
}

pub type Pid25006Interchange = crate::model::Interchange<
    Pid25006MessageStammdaten,
    Pid25006TransaktionStammdaten,
>;

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

/// PID 25007: Übermittlung Übersicht Leistungskurvendefinitionen
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25007TransaktionStammdaten {
    /// Required (Muss). Fields: haeufigkeit, klassentyp, merkmal.code, sequenzQualifier, uebermittelbarkeit
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub leistungskurve: Option<Vec<Leistungskurve>>,
    /// Required (Muss). Fields: beantragungsnummer, fertigstellungsDatum, gueltigkeitsBeginn, statusCode, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid25007TransaktionStammdaten {
    /// Required entity fields for PID 25007 (Übermittlung Übersicht Leistungskurvendefinitionen).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("leistungskurve", &["haeufigkeit", "klassentyp", "merkmal.code", "sequenzQualifier", "uebermittelbarkeit"]),
            ("prozessdaten", &["beantragungsnummer", "fertigstellungsDatum", "gueltigkeitsBeginn", "statusCode", "vorgangsnummer"]),
        ]
    }
}

pub type Pid25007Interchange = crate::model::Interchange<
    Pid25007MessageStammdaten,
    Pid25007TransaktionStammdaten,
>;

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

/// PID 25008: Übermittlung einer ausgerollten Schaltzeitdefinition
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25008TransaktionStammdaten {
    /// Required (Muss). Fields: beantragungsnummer, definitionCode, fertigstellungsDatum, gueltigkeitsBeginn, gueltigkeitsEnde, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
    /// Required (Muss). Fields: aenderungsZeitpunkt, klassentyp, schalthandlung
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub schaltzeitaenderung: Option<Vec<Schaltzeitaenderung>>,
}

impl Pid25008TransaktionStammdaten {
    /// Required entity fields for PID 25008 (Übermittlung einer ausgerollten Schaltzeitdefinition).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("prozessdaten", &["beantragungsnummer", "definitionCode", "fertigstellungsDatum", "gueltigkeitsBeginn", "gueltigkeitsEnde", "vorgangsnummer"]),
            ("schaltzeitaenderung", &["aenderungsZeitpunkt", "klassentyp", "schalthandlung"]),
        ]
    }
}

pub type Pid25008Interchange = crate::model::Interchange<
    Pid25008MessageStammdaten,
    Pid25008TransaktionStammdaten,
>;

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

/// PID 25009: Übermittlung einer ausgerollten Leistungskurvendefinition
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25009TransaktionStammdaten {
    /// Required (Muss). Fields: aenderungsZeitpunkt, menge
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub leistungskurvenveraenderung: Option<Vec<Leistungskurvenveraenderung>>,
    /// Required (Muss). Fields: beantragungsnummer, definitionCode, fertigstellungsDatum, gueltigkeitsBeginn, gueltigkeitsEnde, vorgangsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid25009TransaktionStammdaten {
    /// Required entity fields for PID 25009 (Übermittlung einer ausgerollten Leistungskurvendefinition).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("leistungskurvenveraenderung", &["aenderungsZeitpunkt", "menge"]),
            ("prozessdaten", &["beantragungsnummer", "definitionCode", "fertigstellungsDatum", "gueltigkeitsBeginn", "gueltigkeitsEnde", "vorgangsnummer"]),
        ]
    }
}

pub type Pid25009Interchange = crate::model::Interchange<
    Pid25009MessageStammdaten,
    Pid25009TransaktionStammdaten,
>;

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

/// PID 25010: Antwort auf Berechnungsformel
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid25010TransaktionStammdaten {
    /// Required (Muss). Fields: freitext1, pruefschrittCode, textReferenz, transaktionsreferenz, vorgangsnummer, zeitscheibe.referenz
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub prozessdaten: Option<Vec<Prozessdaten>>,
}

impl Pid25010TransaktionStammdaten {
    /// Required entity fields for PID 25010 (Antwort auf Berechnungsformel).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("prozessdaten", &["freitext1", "pruefschrittCode", "textReferenz", "transaktionsreferenz", "vorgangsnummer", "zeitscheibe.referenz"]),
        ]
    }
}

pub type Pid25010Interchange = crate::model::Interchange<
    Pid25010MessageStammdaten,
    Pid25010TransaktionStammdaten,
>;

