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

#![allow(unused_imports)]

use serde::{Deserialize, Serialize};
use super::entities::*;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33001MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
    pub waehrung: Option<Waehrung>,
}

/// PID 33001: Bestätigung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33001TransaktionStammdaten {
    /// Required (Muss). Fields: dokumentdatum, dokumentennummer, dokumenttyp, faelligerBetrag, ueberweisungsbetrag
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub dokument: Option<Vec<Dokument>>,
}

impl Pid33001TransaktionStammdaten {
    /// Required entity fields for PID 33001 (Bestätigung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("dokument", &["dokumentdatum", "dokumentennummer", "dokumenttyp", "faelligerBetrag", "ueberweisungsbetrag"]),
        ]
    }
}

pub type Pid33001Interchange = crate::model::Interchange<
    Pid33001MessageStammdaten,
    Pid33001TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33002MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
    pub waehrung: Option<Waehrung>,
}

/// PID 33002: Abweisung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33002TransaktionStammdaten {
    /// Required (Muss). Fields: ebdReferenz, pruefschrittCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub abweichung: Option<Vec<Abweichung>>,
    /// Required (Muss). Fields: abrechnungsreferenz, dokumentdatum, dokumentennummer, dokumenttyp, faelligerBetrag, ueberweisungsbetrag
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub dokument: Option<Vec<Dokument>>,
}

impl Pid33002TransaktionStammdaten {
    /// Required entity fields for PID 33002 (Abweisung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("abweichung", &["ebdReferenz", "pruefschrittCode"]),
            ("dokument", &["abrechnungsreferenz", "dokumentdatum", "dokumentennummer", "dokumenttyp", "faelligerBetrag", "ueberweisungsbetrag"]),
        ]
    }
}

pub type Pid33002Interchange = crate::model::Interchange<
    Pid33002MessageStammdaten,
    Pid33002TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33003MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
    pub waehrung: Option<Waehrung>,
}

/// PID 33003: Strom Abweisung Kopf und Summe
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33003TransaktionStammdaten {
    /// Required (Muss). Fields: abweichungsreferenz, ebdReferenz, freitext1, freitext2, freitext3, freitext4, freitext5, hinweisfreitext1, hinweisfreitext2, hinweisfreitext3, hinweisfreitext4, hinweisfreitext5, korrekturfreitext1, korrekturfreitext2, korrekturfreitext3, korrekturfreitext4, korrekturfreitext5, pruefschrittCode, referenz.typ, textFunktionAbo, textFunktionZ14, textFunktionZ16, textQualifierAbo, textQualifierZ14, textQualifierZ16, textReferenzAbo, textReferenzZ14, textReferenzZ16
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub abweichung: Option<Vec<Abweichung>>,
    /// Required (Muss). Fields: abrechnungsreferenz, dokumentdatum, dokumentennummer, dokumenttyp, faelligerBetrag, ueberweisungsbetrag
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub dokument: Option<Vec<Dokument>>,
}

impl Pid33003TransaktionStammdaten {
    /// Required entity fields for PID 33003 (Strom Abweisung Kopf und Summe).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("abweichung", &["abweichungsreferenz", "ebdReferenz", "freitext1", "freitext2", "freitext3", "freitext4", "freitext5", "hinweisfreitext1", "hinweisfreitext2", "hinweisfreitext3", "hinweisfreitext4", "hinweisfreitext5", "korrekturfreitext1", "korrekturfreitext2", "korrekturfreitext3", "korrekturfreitext4", "korrekturfreitext5", "pruefschrittCode", "referenz.typ", "textFunktionAbo", "textFunktionZ14", "textFunktionZ16", "textQualifierAbo", "textQualifierZ14", "textQualifierZ16", "textReferenzAbo", "textReferenzZ14", "textReferenzZ16"]),
            ("dokument", &["abrechnungsreferenz", "dokumentdatum", "dokumentennummer", "dokumenttyp", "faelligerBetrag", "ueberweisungsbetrag"]),
        ]
    }
}

pub type Pid33003Interchange = crate::model::Interchange<
    Pid33003MessageStammdaten,
    Pid33003TransaktionStammdaten,
>;

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33004MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
    pub waehrung: Option<Waehrung>,
}

/// PID 33004: Strom Abweisung Position
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid33004TransaktionStammdaten {
    /// Required (Muss). Fields: abrechnungsreferenz, dokumentdatum, dokumentennummer, dokumenttyp, faelligerBetrag, ueberweisungsbetrag
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub dokument: Option<Vec<Dokument>>,
    /// Required (Muss). Fields: aktionCode, positionsnummer
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub position: Option<Vec<Position>>,
    /// Required (Muss). Fields: abweichungsreferenz, ebdReferenz, freitext1, pruefschrittCode, referenzQualifier, textQualifier
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub positionsabweichung: Option<Vec<Positionsabweichung>>,
}

impl Pid33004TransaktionStammdaten {
    /// Required entity fields for PID 33004 (Strom Abweisung Position).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("dokument", &["abrechnungsreferenz", "dokumentdatum", "dokumentennummer", "dokumenttyp", "faelligerBetrag", "ueberweisungsbetrag"]),
            ("position", &["aktionCode", "positionsnummer"]),
            ("positionsabweichung", &["abweichungsreferenz", "ebdReferenz", "freitext1", "pruefschrittCode", "referenzQualifier", "textQualifier"]),
        ]
    }
}

pub type Pid33004Interchange = crate::model::Interchange<
    Pid33004MessageStammdaten,
    Pid33004TransaktionStammdaten,
>;

