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

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

/// kommunikationstyp for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Kommunikationstyp {
    /// E-Mail
    #[serde(rename = "EM")]
    ElektronischePost,
    /// Telefax
    #[serde(rename = "FX")]
    Telefax,
    /// Telefon
    #[serde(rename = "TE")]
    Telefon,
    /// weiteres Telefon
    #[serde(rename = "AJ")]
    WeiteresTelefon,
    /// Handy
    #[serde(rename = "AL")]
    Handy,
}

/// marktrolle for PID 27002
#[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 27002
#[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,
}

/// dokumentenstatus for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Dokumentenstatus {
    /// Dokument nicht verfügbar
    #[serde(rename = "11")]
    DokumentNichtVerfuegbar,
}

/// dokumenttyp for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Dokumenttyp {
    /// Ausgleichsenergiepreis
    #[serde(rename = "Z04")]
    Ausgleichsenergiepreis,
    /// Preisblatt Messstellenbetrieb
    #[serde(rename = "Z32")]
    PreisblattMessstellenbetrieb,
    /// Preisblatt Sperren / Entsperren und Verzugskosten
    #[serde(rename = "Z54")]
    PreisblattSperrenEntsperrenVerzugskosten,
    /// Preisblatt Netznutzung ohne gemeindespezifische Konzessionsabgaben
    #[serde(rename = "Z64")]
    PreisblattNetznutzungOhneGemeindespezifischeKonzessionsabgaben,
    /// Preisblatt Blindarbeit
    #[serde(rename = "Z67")]
    PreisblattBlindarbeit,
    /// Preisblatt Netznutzung: Gemeindespezifische Konzessionsabgaben
    #[serde(rename = "Z70")]
    PreisblattNetznutzungGemeindespezifischeKonzessionsabgaben,
    /// Preisblatt Konfigurationen
    #[serde(rename = "Z77")]
    PreisblattKonfigurationen,
    /// Preisblatt Technik
    #[serde(rename = "Z94")]
    PreisblattTechnik,
}

/// produktgruppenart for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Produktgruppenart {
    /// keine Gruppe genutzt
    #[serde(rename = "9")]
    KeineGruppeGenutzt,
}

/// produktIdentifikation.funktion for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PreispositionFunktion {
    /// Zusätzliche Identifikation
    #[serde(rename = "1")]
    ZusaetzlicheIdentifikation,
}

/// produktIdentifikation.typ for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PreispositionTyp {
    /// Preisschlüsselstamm
    #[serde(rename = "Z06")]
    Preisschluesselstamm,
}

/// artikelnummertyp for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Artikelnummertyp {
    /// Artikelnummer
    #[serde(rename = "Z01")]
    Artikelnummer,
    /// Artikel-ID
    #[serde(rename = "Z09")]
    ArtikelId,
}

/// beschreibungsformat for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Beschreibungsformat {
    /// Code (aus der Liste einer codepflegenden Organisation)
    #[serde(rename = "C")]
    CodeListeCodepflegendenOrganisation,
    /// Freier Text
    #[serde(rename = "F")]
    FreierText,
    /// Teilstrukturiert (Code und Text)
    #[serde(rename = "X")]
    TeilstrukturiertCodeText,
}

/// produktCode for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ProduktCode {
    /// § 31 MsbG, Abs. 1 Punkt 1 Angemessenes Entgelt für mit iMS ausgestattete Mark...
    #[serde(rename = "Z15")]
    Paragraph31MsbgAbs1Punkt1AngemessenesEntgeltImsAusgestattete,
    /// § 31 MsbG, Abs. 1 Punkt 2 Nicht mehr als 200 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z16")]
    Paragraph31MsbgAbs1Punkt2NichtMehr200EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 1 Punkt 3 Nicht mehr als 170 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z17")]
    Paragraph31MsbgAbs1Punkt3NichtMehr170EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 1 Punkt 4 Nicht mehr als 130 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z18")]
    Paragraph31MsbgAbs1Punkt4NichtMehr130EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 1 Punkt 5 Nicht mehr als 100 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z19")]
    Paragraph31MsbgAbs1Punkt5NichtMehr100EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 1 Punkt 6 Nicht mehr als 100 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z20")]
    Paragraph31MsbgAbs1Punkt6NichtMehr100EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 2 Punkt 1 Nicht mehr als 100 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z21")]
    Paragraph31MsbgAbs2Punkt1NichtMehr100EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 2 Punkt 2 Nicht mehr als 130 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z22")]
    Paragraph31MsbgAbs2Punkt2NichtMehr130EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 2 Punkt 3 Nicht mehr als 200 Euro brutto jährliches Entgelt f...
    #[serde(rename = "Z23")]
    Paragraph31MsbgAbs2Punkt3NichtMehr200EuroBruttoJaehrlichesEntgelt,
    /// § 31 MsbG, Abs. 2 Punkt 4 angemessenes Entgelt für mit iMS ausgestattete Mark...
    #[serde(rename = "Z24")]
    Paragraph31MsbgAbs2Punkt4AngemessenesEntgeltImsAusgestattete,
    /// § 32 MsbG, nicht mehr als 20 Euro brutto jährlich für mit mME ausgestattete M...
    #[serde(rename = "Z25")]
    Paragraph32MsbgNichtMehr20EuroBruttoJaehrlichMmeAusgestattete,
    /// § 31 MsbG, Abs. 3 Punkt 1 Ab 2020 nicht mehr als 60 Euro brutto jährliches En...
    #[serde(rename = "Z28")]
    Paragraph31MsbgAbs3Punkt12020NichtMehr60EuroBruttoJaehrliches,
    /// § 31 MsbG, Abs. 3 Punkt 2 Ab 2020 nicht mehr als 40 Euro brutto jährliches En...
    #[serde(rename = "Z29")]
    Paragraph31MsbgAbs3Punkt22020NichtMehr40EuroBruttoJaehrliches,
    /// § 31 MsbG, Abs. 3 Punkt 3 Ab 2020 nicht mehr als 30 Euro brutto jährliches En...
    #[serde(rename = "Z30")]
    Paragraph31MsbgAbs3Punkt32020NichtMehr30EuroBruttoJaehrliches,
    /// § 31 MsbG, Abs. 3 Punkt 4 Ab 2020 nicht mehr als 23 Euro brutto jährliches En...
    #[serde(rename = "Z31")]
    Paragraph31MsbgAbs3Punkt42020NichtMehr23EuroBruttoJaehrliches,
    /// § 31 MsbG, Abs. 3 Ab 2018 nicht mehr als 60 Euro brutto jährlich für optional...
    #[serde(rename = "Z32")]
    Paragraph31MsbgAbs32018NichtMehr60EuroBruttoJaehrlichOptionalIms,
    /// Zusatzleistung
    #[serde(rename = "Z41")]
    Zusatzleistung,
}

/// spannungsebene for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Spannungsebene {
    /// Höchstspannung
    #[serde(rename = "Z08")]
    Hoechstspannung,
    /// Hochspannung
    #[serde(rename = "Z09")]
    Hochspannung,
    /// Mittelspannung
    #[serde(rename = "Z10")]
    Mittelspannung,
    /// Niederspannung
    #[serde(rename = "Z11")]
    Niederspannung,
}

/// referenzQualifier for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ReferenzQualifier {
    /// Referenznummer einer vorangegangenen Nachricht
    #[serde(rename = "ACW")]
    ReferenznummerVorangegangenenNachricht,
    /// Prüfidentifikator
    #[serde(rename = "Z13")]
    Pruefidentifikator,
}

/// waehrungCode for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum WaehrungCode {
    /// Euro
    #[serde(rename = "EUR")]
    Euro,
}

/// waehrungQualifier for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum WaehrungQualifier {
    /// Währung der Preisliste
    #[serde(rename = "8")]
    WaehrungPreisliste,
}

/// waehrungsverwendung for PID 27002
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Waehrungsverwendung {
    /// Referenzwährung
    #[serde(rename = "2")]
    Referenzwaehrung,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PreisSg40 {
    /// Optional. (n..9)
    pub einzelpreisbasis_menge: Option<String>,
    /// Required (X [31] ∧ [32]). (an..8)
    pub masseinheit: Option<String>,
    /// Required (M (([34] ∧ [55]) ⊻ ([57] ∧ [67]))∧ [512] ([908] ∧ [937])). (n..18)
    pub obere_grenze: Option<String>,
    /// Required (X [912] [513]). (n..15)
    pub preis_betrag: Option<String>,
    /// Required (X). (an..3)
    pub preis_qualifier: Option<String>,
    /// Required (unknown). ()
    pub preisart_code: Option<String>,
    /// Required (unknown). ()
    pub preisart_code2: Option<String>,
    /// Required (X ([909] ∧ [937]) (([521] ∧ [34]) ⊻ ([66] ∧ [57]))). (n..18)
    pub untere_grenze: Option<String>,
    /// Required (X). (an..8)
    pub wertebereich_masseinheit: Option<String>,
    /// Required (X). (an..3)
    pub wertebereich_qualifier: Option<String>,
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PreispositionProduktIdentifikation {
    /// Required (X). (an..3)
    pub funktion: Option<PreispositionFunktion>,
    /// Required (X ([941] ([31] ∧ [32] ∧ [40])) ⊻ ([942] ([31] ∧ [33] ∧ [45])) ⊻ ([959] ([34] ∧ [46] ∧ ([68] ⊻ [69]))) ⊻ ([959] ([57] ∧ (([46] ∧ [70]) ⊻ [71])))). (an..35)
    pub id: Option<String>,
    /// Required (X). (an..3)
    pub typ: Option<PreispositionTyp>,
}

/// Map key for Marktteilnehmer instances.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum MarktteilnehmerKey {
    /// Nachrichtenempfänger
    #[serde(rename = "MR")]
    Mr,
    /// Dokumenten-/Nachrichtenaussteller bzw. -absender
    #[serde(rename = "MS")]
    Ms,
}

impl std::fmt::Display for MarktteilnehmerKey {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Mr => write!(f, "MR"),
            Self::Ms => write!(f, "MS"),
        }
    }
}

/// Ansprechpartner for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Ansprechpartner {
    /// Required (X). (an..3)
    pub funktionscode: Option<Funktionscode>,
    /// Required (X (([939][37]) ∨ ([940][38])) ∧ [519]). (an..512)
    pub kommunikationsadresse: Option<String>,
    /// Required (X [1P0..1]). (an..3)
    pub kommunikationstyp: Option<Kommunikationstyp>,
    /// Required (X). (an..256)
    pub kontaktname: Option<String>,
    /// Required (X). ()
    pub kontaktnummer: Option<String>,
}

/// Marktteilnehmer for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Marktteilnehmer {
    /// Required (X). (an..3)
    pub marktrolle: Option<Marktrolle>,
    /// Required (unknown). ()
    pub regelzone: Option<String>,
    /// Required (X [19]). (an..35)
    pub rollencodenummer: Option<String>,
    /// Required (X). (an..3)
    pub rollencodetyp: Option<Rollencodetyp>,
    pub ansprechpartner: Option<Ansprechpartner>,
}

/// Nachricht for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Nachricht {
    /// Required (Muss). ()
    pub antwortart: Option<String>,
    /// Optional. (an..35)
    pub betrachtungszeitraum: Option<String>,
    /// Optional. (an..70)
    pub dokumentennummer: Option<String>,
    /// Optional. (an..3)
    pub dokumentenstatus: Option<Dokumentenstatus>,
    /// Optional. (an..3)
    pub dokumenttyp: Option<Dokumenttyp>,
    /// Optional. (an..35)
    pub erstellungsdatum: Option<String>,
    /// Required (Muss). ()
    pub nachrichtenfunktion: Option<String>,
    /// Optional. (an..35)
    pub preisblattzeitraum_ende: Option<String>,
}

/// Preis for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Preis {
    pub sg40: Option<Vec<PreisSg40>>,
}

/// Preisgruppe for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Preisgruppe {
    /// Required (X). (an..3)
    pub produktgruppenart: Option<Produktgruppenart>,
}

/// Preisposition for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Preisposition {
    /// Required (X [31] ∧ [32]). (an..3)
    pub artikelnummertyp: Option<Artikelnummertyp>,
    /// Required (X ([31] ∧ [6])). (an..3)
    pub beschreibungsformat: Option<Beschreibungsformat>,
    /// Required (unknown). ()
    pub handlungscode: Option<String>,
    /// Required (X [911]). (an..6)
    pub positionsnummer: Option<String>,
    /// Required (X [4]). (an..3)
    pub produkt_code: Option<ProduktCode>,
    pub produkt_identifikation: Option<PreispositionProduktIdentifikation>,
    /// Required (X). (an..35)
    pub produkt_konfiguration: Option<String>,
    /// Required (M [3] ⊻ ([62] ∧ [522])). (an..256)
    pub produktbeschreibung: Option<String>,
    /// Required (S [63]). (an..256)
    pub produktbeschreibung2: Option<String>,
    /// Required (M [2]). (an..17)
    pub spannungsebene: Option<Spannungsebene>,
}

/// Referenz for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Referenz {
    /// Required (X). (an..3)
    pub referenz_qualifier: Option<ReferenzQualifier>,
    /// Required (X [504]). (an..70)
    pub referenz_wert: Option<String>,
}

/// Waehrung for PID 27002 — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Waehrung {
    /// Required (X). (an..3)
    pub waehrung_code: Option<WaehrungCode>,
    /// Required (X). (an..3)
    pub waehrung_qualifier: Option<WaehrungQualifier>,
    /// Required (X). (an..3)
    pub waehrungsverwendung: Option<Waehrungsverwendung>,
}

/// PID 27002 transaction — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Transaktion {
    pub preis: Option<Preis>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisgruppe: Option<Vec<Preisgruppe>>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preisposition: Option<Vec<Preisposition>>,
}

/// PID 27002 message-level — Preisblätter MSB-Leistungen.
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default, rename_all = "camelCase")]
pub struct Message {
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, Marktteilnehmer>>,
    pub nachricht: Option<Nachricht>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub referenz: Option<Vec<Referenz>>,
    pub waehrung: Option<Waehrung>,
}

/// Complete interchange for PID 27002 — Preisblätter MSB-Leistungen.
pub type Interchange = crate::model::Interchange<Message, Transaktion>;
