// 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;

/// kommunikationsart for PID 44110
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Kommunikationsart {
    /// Elektronische Post
    #[serde(rename = "EM")]
    Email,
    /// Telefax
    #[serde(rename = "FX")]
    Telefax,
    /// Telefon
    #[serde(rename = "TE")]
    Telefon,
    /// weiteres Telefon
    #[serde(rename = "AJ")]
    WeiteresTelefon,
    /// Handy
    #[serde(rename = "AL")]
    Handy,
}

/// kontaktfunktion for PID 44110
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Kontaktfunktion {
    /// Informationskontakt
    #[serde(rename = "IC")]
    Informationskontakt,
}

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

/// rollencodetyp for PID 44110
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Rollencodetyp {
    /// GS1
    #[serde(rename = "9")]
    Gs1,
    /// DE, DVGW Service & Consult GmbH
    #[serde(rename = "332")]
    Dvgw,
}

/// pruefidentifikator for PID 44110
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Pruefidentifikator {
    /// GeLi Gas / Anmeldung NN
    #[serde(rename = "44001")]
    GeliGasAnmeldungNn,
    /// GeLi Gas / Bestätigung Anmeldung
    #[serde(rename = "44002")]
    GeliGasBestaetigungAnmeldung,
    /// GeLi Gas / Ablehnung Anmeldung
    #[serde(rename = "44003")]
    GeliGasAblehnungAnmeldung,
    /// GeLi Gas / Abmeldung NN
    #[serde(rename = "44004")]
    GeliGasAbmeldungNn,
    /// GeLi Gas / Bestätigung Abmeldung
    #[serde(rename = "44005")]
    GeliGasBestaetigungAbmeldung,
    /// GeLi Gas / Ablehnung Abmeldung
    #[serde(rename = "44006")]
    GeliGasAblehnungAbmeldung,
    /// GeLi Gas / Abmeldung NN vom NB
    #[serde(rename = "44007")]
    GeliGasAbmeldungNnNb,
    /// GeLi Gas / Bestätigung Abmeldung vom NB
    #[serde(rename = "44008")]
    GeliGasBestaetigungAbmeldungNb,
    /// GeLi Gas / Ablehnung Abmeldung vom NB
    #[serde(rename = "44009")]
    GeliGasAblehnungAbmeldungNb,
    /// GeLi Gas / Abmeldeanfrage des NB
    #[serde(rename = "44010")]
    GeliGasAbmeldeanfrageNb,
    /// GeLi Gas / Bestätigung Abmeldeanfrage
    #[serde(rename = "44011")]
    GeliGasBestaetigungAbmeldeanfrage,
    /// GeLi Gas / Ablehnung Abmeldeanfrage
    #[serde(rename = "44012")]
    GeliGasAblehnungAbmeldeanfrage,
    /// GeLi Gas / Anmeldung EoG
    #[serde(rename = "44013")]
    GeliGasAnmeldungEog,
    /// GeLi Gas / Bestätigung EoG Anmeldung
    #[serde(rename = "44014")]
    GeliGasBestaetigungEogAnmeldung,
    /// GeLi Gas / Ablehnung EoG Anmeldung
    #[serde(rename = "44015")]
    GeliGasAblehnungEogAnmeldung,
    /// GeLi Gas / Kündigung beim alten Lieferanten
    #[serde(rename = "44016")]
    GeliGasKuendigungBeimAltenLieferanten,
    /// GeLi Gas / Bestätigung Kündigung
    #[serde(rename = "44017")]
    GeliGasBestaetigungKuendigung,
    /// GeLi Gas / Ablehnung Kündigung
    #[serde(rename = "44018")]
    GeliGasAblehnungKuendigung,
    /// GeLi Gas / Bestandsliste zugeordnete Marktlokationen
    #[serde(rename = "44019")]
    GeliGasBestandslisteZugeordneteMarktlokationen,
    /// GeLi Gas / Änderungsmeldung zur Bestandsliste
    #[serde(rename = "44020")]
    GeliGasAenderungsmeldungBestandsliste,
    /// GeLi Gas / Antwort auf Änderungsmeldung zur Bestandsliste
    #[serde(rename = "44021")]
    GeliGasAntwortAenderungsmeldungBestandsliste,
    /// GeLi Gas / Anfrage nach Stornierung
    #[serde(rename = "44022")]
    GeliGasAnfrageStornierung,
    /// GeLi Gas / Bestätigung Anfrage Stornierung
    #[serde(rename = "44023")]
    GeliGasBestaetigungAnfrageStornierung,
    /// GeLi Gas / Ablehnung Anfrage Stornierung
    #[serde(rename = "44024")]
    GeliGasAblehnungAnfrageStornierung,
    /// GeLi Gas / Antwort auf die Geschäftsdatenanfrage
    #[serde(rename = "44035")]
    GeliGasAntwortGeschaeftsdatenanfrage,
    /// GeLi Gas / Informationsmeldung über existierende Zuordnung
    #[serde(rename = "44036")]
    GeliGasInformationsmeldungExistierendeZuordnung,
    /// GeLi Gas / Informationsmeldung zur Beendigung der Zuordnung
    #[serde(rename = "44037")]
    GeliGasInformationsmeldungBeendigungZuordnung,
    /// GeLi Gas / Informationsmeldung zur Aufhebung einer zuk. Zuordnung
    #[serde(rename = "44038")]
    GeliGasInformationsmeldungAufhebungZukZuordnung,
    /// WiM Gas / Kündigung MSB
    #[serde(rename = "44039")]
    WimGasKuendigungMsb,
    /// WiM Gas / Bestätigung Kündigung MSB
    #[serde(rename = "44040")]
    WimGasBestaetigungKuendigungMsb,
    /// WiM Gas / Ablehnung Kündigung MSB
    #[serde(rename = "44041")]
    WimGasAblehnungKuendigungMsb,
    /// WiM Gas / Anmeldung MSB
    #[serde(rename = "44042")]
    WimGasAnmeldungMsb,
    /// WiM Gas / Bestätigung Anmeldung MSB
    #[serde(rename = "44043")]
    WimGasBestaetigungAnmeldungMsb,
    /// WiM Gas / Ablehnung Anmeldung MSB
    #[serde(rename = "44044")]
    WimGasAblehnungAnmeldungMsb,
    /// WiM Gas / Ende MSB
    #[serde(rename = "44051")]
    WimGasEndeMsb,
    /// WiM Gas / Bestätigung Ende MSB
    #[serde(rename = "44052")]
    WimGasBestaetigungEndeMsb,
    /// WiM Gas / Ablehnung Ende MSB
    #[serde(rename = "44053")]
    WimGasAblehnungEndeMsb,
    /// WiM Gas / Antwort auf die MSB Geschäftsdatenanfrage
    #[serde(rename = "44060")]
    WimGasAntwortMsbGeschaeftsdatenanfrage,
    /// TSIMSG / Deklarationsliste an MGV
    #[serde(rename = "44096")]
    TsimsgDeklarationslisteMgv,
    /// TSIMSG / Deklarationsliste an BKV
    #[serde(rename = "44097")]
    TsimsgDeklarationslisteBkv,
    /// NBW Gas / Stammdaten zur Messlokation
    #[serde(rename = "44101")]
    NbwGasStammdatenMesslokation,
    /// NBW Gas / Aktualisierte Stammdaten zur Messlokation
    #[serde(rename = "44102")]
    NbwGasAktualisierteStammdatenMesslokation,
    /// NBW Gas / Stammdaten zur verbrauchenden Marktlokation
    #[serde(rename = "44103")]
    NbwGasStammdatenVerbrauchendenMarktlokation,
    /// NBW Gas / Aktualisierte Stammdaten zur verbrauchenden Marktlokation
    #[serde(rename = "44104")]
    NbwGasAktualisierteStammdatenVerbrauchenden,
    /// NBW Gas / Ablehnung auf Stammdaten zur verbrauchenden Marktlokation
    #[serde(rename = "44105")]
    NbwGasAblehnungStammdatenVerbrauchendenMarktlokation,
    /// SDÄ Gas / Nicht bila.rel. Änderung vom LF an NB
    #[serde(rename = "44109")]
    SdaeGasBilaRelAenderungLfNb,
    /// SDÄ Gas / Antwort auf Änderung vom LF AG an AF
    #[serde(rename = "44111")]
    SdaeGasAntwortAenderungLfAgAf,
    /// SDÄ Gas / Nicht bila.rel. Änderung vom NB an LF
    #[serde(rename = "44112")]
    SdaeGasBilaRelAenderungNbLf,
    /// SDÄ Gas / Nicht bila.rel. Änderung vom NB an MSB
    #[serde(rename = "44113")]
    SdaeGasBilaRelAenderungNbMsb,
    /// SDÄ Gas / Antwort auf Änderung vom NB AG an NB
    #[serde(rename = "44115")]
    SdaeGasAntwortAenderungNbAgNb,
    /// SDÄ Gas / Änderung vom MSB an NB
    #[serde(rename = "44116")]
    SdaeGasAenderungMsbNb,
    /// SDÄ Gas / Änderung vom MSB NB an LF
    #[serde(rename = "44117")]
    SdaeGasAenderungMsbNbLf,
    /// SDÄ Gas / Antwort auf Änderung vom MSB AG an AF
    #[serde(rename = "44119")]
    SdaeGasAntwortAenderungMsbAgAf,
    /// SDÄ Gas / Bila.rel. Änderung vom LF an NB
    #[serde(rename = "44120")]
    SdaeGasBilaRelAenderungLfNb2,
    /// SDÄ Gas / Antwort auf bila.rel. Änderung vom LF NB an LF
    #[serde(rename = "44121")]
    SdaeGasAntwortBilaRelAenderungLfNbLf,
    /// SDÄ Gas / Bila.rel. Änderung vom NB mit Abhängigkeiten NB an LF / MSB
    #[serde(rename = "44123")]
    SdaeGasBilaRelAenderungNbAbhaengigkeitenNbLfMsb,
    /// SDÄ Gas / Antwort auf bila.rel. Änderung vom NB mit Abhängigkeiten AG an NB
    #[serde(rename = "44124")]
    SdaeGasAntwortBilaRelAenderungNbAbhaengigkeitenAgNb,
    /// SDÄ Gas / Nicht bila.rel. Anfrage an LF NB [Berechtigt] an LF
    #[serde(rename = "44137")]
    SdaeGasBilaRelAnfrageLfNbBerechtigtLf,
    /// SDÄ Gas / Antwort auf nicht bila.rel. Anfrage an LF LF an NB
    #[serde(rename = "44138")]
    SdaeGasAntwortBilaRelAnfrageLfLfNb2,
    /// SDÄ Gas / Nicht bila.rel. Anfrage an NB LF an NB
    #[serde(rename = "44139")]
    SdaeGasBilaRelAnfrageNbLfNb,
    /// SDÄ Gas / Nicht bila.rel. Anfrage an NB MSB an NB
    #[serde(rename = "44140")]
    SdaeGasBilaRelAnfrageNbMsbNb,
    /// SDÄ Gas / Antwort auf nicht bila.rel. Anfrage an NB NB an AF
    #[serde(rename = "44142")]
    SdaeGasAntwortBilaRelAnfrageNbNbAf,
    /// SDÄ Gas / Anfrage an MSB mit Abhängigkeiten LF an NB
    #[serde(rename = "44143")]
    SdaeGasAnfrageMsbAbhaengigkeitenLfNb,
    /// SDÄ Gas / Antwort auf Anfrage an MSB mit Abhängigkeiten NB an AF
    #[serde(rename = "44145")]
    SdaeGasAntwortAnfrageMsbAbhaengigkeitenNbAf,
    /// SDÄ Gas / Ablehnung der Anfrage an MSB mit Abhängigkeiten NB an AF
    #[serde(rename = "44146")]
    SdaeGasAblehnungAnfrageMsbAbhaengigkeitenNbAf,
    /// SDÄ Gas / Anfrage an MSB mit Abhängigkeiten NB [Verteiler] an MSB
    #[serde(rename = "44147")]
    SdaeGasAnfrageMsbAbhaengigkeitenNbVerteilerMsb,
    /// SDÄ Gas / Anfrage an MSB mit Abhängigkeiten NB [Berechtigt] an MSB
    #[serde(rename = "44148")]
    SdaeGasAnfrageMsbAbhaengigkeitenNbBerechtigtMsb,
    /// SDÄ Gas / Antwort auf Anfrage an MSB mit Abhängigkeiten MSB an NB
    #[serde(rename = "44149")]
    SdaeGasAntwortAnfrageMsbAbhaengigkeitenMsbNb,
    /// SDÄ Gas / Bila.rel. Anfrage an LF NB an LF
    #[serde(rename = "44150")]
    SdaeGasBilaRelAnfrageLfNbLf,
    /// SDÄ Gas / Antwort auf bila.rel. Anfrage an LF LF an NB
    #[serde(rename = "44151")]
    SdaeGasAntwortBilaRelAnfrageLfLfNb,
    /// SDÄ Gas / Ablehnung der bila.rel. Anfrage an LF LF an NB
    #[serde(rename = "44152")]
    SdaeGasAblehnungBilaRelAnfrageLfLfNb,
    /// SDÄ Gas / Bila.rel. Anfrage an NB mit Abhängigkeiten
    #[serde(rename = "44156")]
    SdaeGasBilaRelAnfrageNbAbhaengigkeiten,
    /// SDÄ Gas / Antwort auf bila.rel. Anfrage an NB mit Abhängigkeiten
    #[serde(rename = "44157")]
    SdaeGasAntwortBilaRelAnfrageNbAbhaengigkeiten,
    /// SDÄ Gas / Änderung vom MSB ohne Abhängigkeiten MSB an NB
    #[serde(rename = "44159")]
    SdaeGasAenderungMsbOhneAbhaengigkeitenMsbNb,
    /// SDÄ Gas / Änderung vom MSB ohne Abhängigkeiten NB an LF / MSB
    #[serde(rename = "44160")]
    SdaeGasAenderungMsbOhneAbhaengigkeitenNbLfMsb,
    /// SDÄ Gas / Änderung vom MSB ohne Abhängigkeiten AG an AF
    #[serde(rename = "44161")]
    SdaeGasAenderungMsbOhneAbhaengigkeitenAgAf,
    /// SDÄ /Anfrage an MSB ohne Abhängigkeiten von LF / MSB an NB
    #[serde(rename = "44162")]
    SdaeAnfrageMsbOhneAbhaengigkeitenLfMsbNb,
    /// SDÄ Gas / Antwort auf Anfrage an MSB ohne Abhängigkeiten LF / MSB an NB
    #[serde(rename = "44163")]
    SdaeGasAntwortAnfrageMsbOhneAbhaengigkeitenLfMsbNb,
    /// SDÄ Gas / Ablehnung auf Anfrage an MSB ohne Abhängigkeiten LF / MSB an NB
    #[serde(rename = "44164")]
    SdaeGasAblehnungAnfrageMsbOhneAbhaengigkeitenLfMsb,
    /// SDÄ Gas /Anfrage an MSB ohne Abhängigkeiten NB [Verteiler] an MSB
    #[serde(rename = "44165")]
    SdaeGasAnfrageMsbOhneAbhaengigkeitenNbVerteilerMsb,
    /// SDÄ Gas /Anfrage an MSB ohne Abhängigkeiten NB [Berechtigter] an MSB
    #[serde(rename = "44166")]
    SdaeGasAnfrageMsbOhneAbhaengigkeitenNbBerechtigter,
    /// SDÄ Gas / Antwort auf Anfrage an MSB ohne Abhängigkeiten MSB an NB
    #[serde(rename = "44167")]
    SdaeGasAntwortAnfrageMsbOhneAbhaengigkeitenMsbNb,
    /// WiM Gas / Verpflichtungsanfrage / Aufforderung
    #[serde(rename = "44168")]
    WimGasVerpflichtungsanfrageAufforderung,
    /// WiM Gas / Bestätigung Verpflichtungsanfrage
    #[serde(rename = "44169")]
    WimGasBestaetigungVerpflichtungsanfrage,
    /// WiM Gas / Ablehnung Verpflichtungsanfrage
    #[serde(rename = "44170")]
    WimGasAblehnungVerpflichtungsanfrage,
    /// SDÄ Gas / Anfrage an MSB mit Abhängigkeit MSB an NB
    #[serde(rename = "44172")]
    SdaeGasAnfrageMsbAbhaengigkeitMsbNb,
    /// SDÄ Gas / Änderung der Marktlokationsstruktur NB an LF
    #[serde(rename = "44175")]
    SdaeGasAenderungMarktlokationsstrukturNbLf,
    /// SDÄ Gas / Antwort auf Änderung der Marktlokationsstruktur LF an NB
    #[serde(rename = "44176")]
    SdaeGasAntwortAenderungMarktlokationsstrukturLfNb,
    /// SDÄ Gas / Anfrage der komplexen Marktlokationsstruktur LF an NB
    #[serde(rename = "44180")]
    SdaeGasAnfrageKomplexenMarktlokationsstrukturLfNb,
    /// SDÄ Gas / Antwort auf Anfrage der komplexen Marktlokationsstruktur NB an LF
    #[serde(rename = "44181")]
    SdaeGasAntwortAnfrageKomplexenMarktlokationsstrukturNb,
    /// SDÄ Gas / Ablehnung der Anfrage der komplexen Marktlokationsstruktur NB an LF
    #[serde(rename = "44182")]
    SdaeGasAblehnungAnfrageKomplexenMarktlokationsstruktur,
}

/// transaktionsgrund for PID 44110
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Transaktionsgrund {
    /// Nicht bila.rel. Änderung vom LF
    #[serde(rename = "ZE6")]
    BilaRelAenderungLf,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct KontaktKontakt {
    /// Required (X). ()
    pub name: Option<String>,
}

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

/// Kontakt for PID 44110 — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Kontakt {
    /// Required (X [1P0..1]). ()
    pub kommunikationsart: Option<Kommunikationsart>,
    /// Required (X). ()
    pub kommunikationsnummer: Option<String>,
    pub kontakt: Option<KontaktKontakt>,
    /// Required (X). ()
    pub kontaktfunktion: Option<Kontaktfunktion>,
}

/// Marktteilnehmer for PID 44110 — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Marktteilnehmer {
    /// Optional. ()
    pub codeliste_code: Option<String>,
    /// Required (X). ()
    pub marktrolle: Option<Marktrolle>,
    /// Required (X). ()
    pub rollencodenummer: Option<String>,
    /// Required (X). ()
    pub rollencodetyp: Option<Rollencodetyp>,
}

/// Messlokation for PID 44110 — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Messlokation {
    /// Required (X [950]). ()
    pub meldepunkt_id: Option<String>,
}

/// Nachricht for PID 44110 — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Nachricht {
    /// Optional. ()
    pub erstellungsdatum: Option<String>,
    /// Optional. ()
    pub nachrichtennummer: Option<String>,
    /// Optional. ()
    pub nachrichtentyp: Option<String>,
}

/// Prozessdaten for PID 44110 — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Prozessdaten {
    /// Required (X [UB2]). ()
    pub gueltig_ab: Option<String>,
    /// Required (X [UB2]). ()
    pub gueltigkeitsbeginn: Option<String>,
    /// Optional. ()
    pub pruefidentifikator: Option<Pruefidentifikator>,
    /// Optional. ()
    pub status_code: Option<String>,
    /// Required (X). ()
    pub transaktionsgrund: Option<Transaktionsgrund>,
    /// Required (X). ()
    pub vorgang_id: Option<String>,
}

/// PID 44110 transaction — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Transaktion {
    /// Required (X).
    pub messlokation: Option<Messlokation>,
    pub prozessdaten: Option<Prozessdaten>,
}

/// PID 44110 message-level — #nv# Nicht bila.rel. Änderung vom LF.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Message {
    pub kontakt: Option<Kontakt>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, Marktteilnehmer>>,
    pub nachricht: Option<Nachricht>,
}

/// Complete interchange for PID 44110 — #nv# Nicht bila.rel. Änderung vom LF.
pub type Interchange = crate::model::Interchange<Message, Transaktion>;
