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

#![allow(dead_code, unused_imports, non_camel_case_types)]

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

/// nameFormatCode for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NameFormatCode {
    /// Struktur von Personennamen
    #[serde(rename = "Z01")]
    StrukturPersonennamen,
    /// Struktur der Firmenbezeichnung
    #[serde(rename = "Z02")]
    StrukturFirmenbezeichnung,
}

/// partnerrolle for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Partnerrolle {
    /// Kunde des LF
    #[serde(rename = "Z09")]
    KundeLf,
}

/// masseinheit for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Masseinheit {
    /// Kilowattstunde
    #[serde(rename = "KWH")]
    Kilowattstunde,
}

/// mengeQualifier for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MengeQualifier {
    /// Erreichte Menge in dem Zeitintervall
    #[serde(rename = "136")]
    ErreichteMengeZeitintervall,
}

/// produktbeschreibung for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Produktbeschreibung {
    /// Privilegierte Energiemenge
    #[serde(rename = "Z02")]
    PrivilegierteEnergiemenge,
}

/// marktrolle for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Marktrolle {
    /// Nachrichtenempfänger
    #[serde(rename = "MR")]
    Nachrichtenempfaenger,
    /// Dokumenten-/Nachrichtenaussteller bzw. -absender
    #[serde(rename = "MS")]
    DokumentenNachrichtenausstellerAbsender,
}

/// rollencodetyp for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Rollencodetyp {
    /// GS1
    #[serde(rename = "9")]
    Gs1,
    /// DE, BDEW (Bundesverband der Energie- und Wasserwirtschaft e.V.)
    #[serde(rename = "293")]
    DeBdewBundesverbandEnergieWasserwirtschaftEV,
}

/// dokumenttyp for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Dokumenttyp {
    /// EnFG Informationen
    #[serde(rename = "Z86")]
    EnfgInformationen,
}

/// pruefidentifikator for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Pruefidentifikator {
    /// GPKE / Privilegierungsinformation nach EnFG
    #[serde(rename = "21045")]
    GpkePrivilegierungsinformationEnfg,
}

/// pruefschrittCode1 for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PruefschrittCode1 {
    /// § 21 EnFG Stromspeicher und Verlustenergie
    #[serde(rename = "ZU5")]
    Paragraph21EnfgStromspeicherVerlustenergie,
    /// § 22 EnFG elektrisch angetriebene Wärmepumpen
    #[serde(rename = "ZU6")]
    Paragraph22EnfgElektrischAngetriebeneWaermepumpen,
    /// § 23 EnFG Umlageerhebung bei Anlagen zur Verstromung von Kuppelgasen
    #[serde(rename = "ZU7")]
    Paragraph23EnfgUmlageerhebungAnlagenVerstromungKuppelgasen,
    /// §§ 25 - 27 EnFG Herstellung von Grünen Wasserstoff
    #[serde(rename = "ZU8")]
    Paragraphparagraph2527EnfgHerstellungGruenenWasserstoff,
    /// §§ 30 - 35 EnFG stromkostenintensive Unternehmen
    #[serde(rename = "ZU9")]
    Paragraphparagraph3035EnfgStromkostenintensiveUnternehmen,
    /// § 36 EnFG Herstellung von Wasserstoff in stromkostenintensiven Unternehmen
    #[serde(rename = "ZV0")]
    Paragraph36EnfgHerstellungWasserstoffStromkostenintensivenUnternehmen,
    /// § 37 EnFG Schienenbahnen
    #[serde(rename = "ZV1")]
    Paragraph37EnfgSchienenbahnen,
    /// § 38 EnFG elektrische betriebene Bussen im Linienverkehr
    #[serde(rename = "ZV2")]
    Paragraph38EnfgElektrischeBetriebeneBussenLinienverkehr,
    /// § 39 EnFG Landstromanlagen
    #[serde(rename = "ZV3")]
    Paragraph39EnfgLandstromanlagen,
}

/// pruefschrittCode2 for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PruefschrittCode2 {
    /// § 21 EnFG Stromspeicher und Verlustenergie
    #[serde(rename = "ZU5")]
    Paragraph21EnfgStromspeicherVerlustenergie,
    /// § 22 EnFG elektrisch angetriebene Wärmepumpen
    #[serde(rename = "ZU6")]
    Paragraph22EnfgElektrischAngetriebeneWaermepumpen,
    /// § 23 EnFG Umlageerhebung bei Anlagen zur Verstromung von Kuppelgasen
    #[serde(rename = "ZU7")]
    Paragraph23EnfgUmlageerhebungAnlagenVerstromungKuppelgasen,
    /// §§ 25 - 27 EnFG Herstellung von Grünen Wasserstoff
    #[serde(rename = "ZU8")]
    Paragraphparagraph2527EnfgHerstellungGruenenWasserstoff,
    /// §§ 30 - 35 EnFG stromkostenintensive Unternehmen
    #[serde(rename = "ZU9")]
    Paragraphparagraph3035EnfgStromkostenintensiveUnternehmen,
    /// § 36 EnFG Herstellung von Wasserstoff in stromkostenintensiven Unternehmen
    #[serde(rename = "ZV0")]
    Paragraph36EnfgHerstellungWasserstoffStromkostenintensivenUnternehmen,
    /// § 37 EnFG Schienenbahnen
    #[serde(rename = "ZV1")]
    Paragraph37EnfgSchienenbahnen,
    /// § 38 EnFG elektrische betriebene Bussen im Linienverkehr
    #[serde(rename = "ZV2")]
    Paragraph38EnfgElektrischeBetriebeneBussenLinienverkehr,
    /// § 39 EnFG Landstromanlagen
    #[serde(rename = "ZV3")]
    Paragraph39EnfgLandstromanlagen,
}

/// pruefschrittCode3 for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PruefschrittCode3 {
    /// § 21 EnFG Stromspeicher und Verlustenergie
    #[serde(rename = "ZU5")]
    Paragraph21EnfgStromspeicherVerlustenergie,
    /// § 22 EnFG elektrisch angetriebene Wärmepumpen
    #[serde(rename = "ZU6")]
    Paragraph22EnfgElektrischAngetriebeneWaermepumpen,
    /// § 23 EnFG Umlageerhebung bei Anlagen zur Verstromung von Kuppelgasen
    #[serde(rename = "ZU7")]
    Paragraph23EnfgUmlageerhebungAnlagenVerstromungKuppelgasen,
    /// §§ 25 - 27 EnFG Herstellung von Grünen Wasserstoff
    #[serde(rename = "ZU8")]
    Paragraphparagraph2527EnfgHerstellungGruenenWasserstoff,
    /// §§ 30 - 35 EnFG stromkostenintensive Unternehmen
    #[serde(rename = "ZU9")]
    Paragraphparagraph3035EnfgStromkostenintensiveUnternehmen,
    /// § 36 EnFG Herstellung von Wasserstoff in stromkostenintensiven Unternehmen
    #[serde(rename = "ZV0")]
    Paragraph36EnfgHerstellungWasserstoffStromkostenintensivenUnternehmen,
    /// § 37 EnFG Schienenbahnen
    #[serde(rename = "ZV1")]
    Paragraph37EnfgSchienenbahnen,
    /// § 38 EnFG elektrische betriebene Bussen im Linienverkehr
    #[serde(rename = "ZV2")]
    Paragraph38EnfgElektrischeBetriebeneBussenLinienverkehr,
    /// § 39 EnFG Landstromanlagen
    #[serde(rename = "ZV3")]
    Paragraph39EnfgLandstromanlagen,
}

/// pruefschrittCode4 for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PruefschrittCode4 {
    /// § 21 EnFG Stromspeicher und Verlustenergie
    #[serde(rename = "ZU5")]
    Paragraph21EnfgStromspeicherVerlustenergie,
    /// § 22 EnFG elektrisch angetriebene Wärmepumpen
    #[serde(rename = "ZU6")]
    Paragraph22EnfgElektrischAngetriebeneWaermepumpen,
    /// § 23 EnFG Umlageerhebung bei Anlagen zur Verstromung von Kuppelgasen
    #[serde(rename = "ZU7")]
    Paragraph23EnfgUmlageerhebungAnlagenVerstromungKuppelgasen,
    /// §§ 25 - 27 EnFG Herstellung von Grünen Wasserstoff
    #[serde(rename = "ZU8")]
    Paragraphparagraph2527EnfgHerstellungGruenenWasserstoff,
    /// §§ 30 - 35 EnFG stromkostenintensive Unternehmen
    #[serde(rename = "ZU9")]
    Paragraphparagraph3035EnfgStromkostenintensiveUnternehmen,
    /// § 36 EnFG Herstellung von Wasserstoff in stromkostenintensiven Unternehmen
    #[serde(rename = "ZV0")]
    Paragraph36EnfgHerstellungWasserstoffStromkostenintensivenUnternehmen,
    /// § 37 EnFG Schienenbahnen
    #[serde(rename = "ZV1")]
    Paragraph37EnfgSchienenbahnen,
    /// § 38 EnFG elektrische betriebene Bussen im Linienverkehr
    #[serde(rename = "ZV2")]
    Paragraph38EnfgElektrischeBetriebeneBussenLinienverkehr,
    /// § 39 EnFG Landstromanlagen
    #[serde(rename = "ZV3")]
    Paragraph39EnfgLandstromanlagen,
}

/// pruefschrittCode5 for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PruefschrittCode5 {
    /// § 21 EnFG Stromspeicher und Verlustenergie
    #[serde(rename = "ZU5")]
    Paragraph21EnfgStromspeicherVerlustenergie,
    /// § 22 EnFG elektrisch angetriebene Wärmepumpen
    #[serde(rename = "ZU6")]
    Paragraph22EnfgElektrischAngetriebeneWaermepumpen,
    /// § 23 EnFG Umlageerhebung bei Anlagen zur Verstromung von Kuppelgasen
    #[serde(rename = "ZU7")]
    Paragraph23EnfgUmlageerhebungAnlagenVerstromungKuppelgasen,
    /// §§ 25 - 27 EnFG Herstellung von Grünen Wasserstoff
    #[serde(rename = "ZU8")]
    Paragraphparagraph2527EnfgHerstellungGruenenWasserstoff,
    /// §§ 30 - 35 EnFG stromkostenintensive Unternehmen
    #[serde(rename = "ZU9")]
    Paragraphparagraph3035EnfgStromkostenintensiveUnternehmen,
    /// § 36 EnFG Herstellung von Wasserstoff in stromkostenintensiven Unternehmen
    #[serde(rename = "ZV0")]
    Paragraph36EnfgHerstellungWasserstoffStromkostenintensivenUnternehmen,
    /// § 37 EnFG Schienenbahnen
    #[serde(rename = "ZV1")]
    Paragraph37EnfgSchienenbahnen,
    /// § 38 EnFG elektrische betriebene Bussen im Linienverkehr
    #[serde(rename = "ZV2")]
    Paragraph38EnfgElektrischeBetriebeneBussenLinienverkehr,
    /// § 39 EnFG Landstromanlagen
    #[serde(rename = "ZV3")]
    Paragraph39EnfgLandstromanlagen,
}

/// statusKategorie for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum StatusKategorie {
    /// Grund der Privilegierung nach EnFG
    #[serde(rename = "Z41")]
    GrundPrivilegierungEnfg,
}

/// locQualifier for PID 21045
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum LocQualifier {
    /// Meldepunkt
    #[serde(rename = "172")]
    Meldepunkt,
}

/// Betreiber for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Betreiber {
    /// Optional. (an..70)
    pub anrede: Option<String>,
    /// Optional. (an..70)
    pub beteiligter: Option<String>,
    /// Required (unknown). ()
    pub codepflege_code: Option<String>,
    /// Required (unknown). ()
    pub identifikation: Option<String>,
    /// Required (X). (an..70)
    pub nachname: Option<String>,
    /// Required (X). (an..3)
    pub name_format_code: Option<NameFormatCode>,
    /// Required (X). (an..3)
    pub partnerrolle: Option<Partnerrolle>,
    /// Optional. (an..70)
    pub titel: Option<String>,
    /// Optional. (an..70)
    pub vorname: Option<String>,
    /// Required (unknown). ()
    pub zusatzinfo: Option<String>,
}

/// Freitext for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Freitext {
    /// Required (X). (an..512)
    pub freitext1: Option<String>,
    /// Optional. (an..512)
    pub freitext2: Option<String>,
    /// Optional. (an..512)
    pub freitext3: Option<String>,
    /// Optional. (an..512)
    pub freitext4: Option<String>,
    /// Optional. (an..512)
    pub freitext5: Option<String>,
    /// Required (unknown). ()
    pub freitext_code: Option<String>,
    /// Required (X [903]). (an..6)
    pub sendungsposition: Option<String>,
    /// Required (unknown). ()
    pub text_funktion: Option<String>,
}

/// Lieferschein for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Lieferschein {
    /// Required (unknown). ()
    pub dateiname: Option<String>,
    /// Required (X). (an..35)
    pub lieferschein_datum_bis: Option<String>,
    /// Required (X). (an..35)
    pub lieferschein_datum_von: Option<String>,
    /// Required (X). (an..35)
    pub lieferschein_periode: Option<String>,
    /// Required (X). (an..8)
    pub masseinheit: Option<Masseinheit>,
    /// Required (X). (an..35)
    pub menge: Option<String>,
    /// Required (X). (an..3)
    pub menge_qualifier: Option<MengeQualifier>,
    /// Required (X). (an..256)
    pub produktbeschreibung: Option<Produktbeschreibung>,
}

/// Marktteilnehmer for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Marktteilnehmer {
    /// Required (X). (an..3)
    pub marktrolle: Option<Marktrolle>,
    /// Required (X [27]). (an..35)
    pub rollencodenummer: Option<String>,
    /// Required (X). (an..3)
    pub rollencodetyp: Option<Rollencodetyp>,
}

/// Nachricht for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Nachricht {
    /// Required (X). (an..70)
    pub dokumentennummer: Option<String>,
    /// Required (X). (an..3)
    pub dokumenttyp: Option<Dokumenttyp>,
    /// Required (X [931] [494]). (an..35)
    pub erstellungsdatum: Option<String>,
}

/// Status for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Status {
    /// Required (X). (an..35)
    pub lieferdatum: Option<String>,
    /// Required (X). (an..70)
    pub pruefidentifikator: Option<Pruefidentifikator>,
    /// Required (X). (an..3)
    pub pruefschritt_code1: Option<PruefschrittCode1>,
    /// Required (X [143]). (an..3)
    pub pruefschritt_code2: Option<PruefschrittCode2>,
    /// Required (X [143]). (an..3)
    pub pruefschritt_code3: Option<PruefschrittCode3>,
    /// Required (X [143]). (an..3)
    pub pruefschritt_code4: Option<PruefschrittCode4>,
    /// Required (X [143]). (an..3)
    pub pruefschritt_code5: Option<PruefschrittCode5>,
    /// Required (unknown). ()
    pub status_code: Option<String>,
    /// Required (X). (an..3)
    pub status_kategorie: Option<StatusKategorie>,
}

/// Vorgang for PID 21045 — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Vorgang {
    /// Required (X). (an..3)
    pub loc_qualifier: Option<LocQualifier>,
    /// Required (X [950] [506]). (an..35)
    pub meldepunkt_id: Option<String>,
    /// Required (X [911]). (n..5)
    pub vorgangsnummer: Option<String>,
}

/// PID 21045 transaction — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Transaktion {
    pub betreiber: Option<Betreiber>,
    pub freitext: Option<Freitext>,
    pub lieferschein: Option<Lieferschein>,
    pub status: Option<Status>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

/// PID 21045 message-level — EnFG Informationen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Message {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub marktteilnehmer: Option<Vec<Marktteilnehmer>>,
    pub nachricht: Option<Nachricht>,
}

/// Complete interchange for PID 21045 — EnFG Informationen.
pub type Interchange = crate::model::Interchange<Message, Transaktion>;
