// 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 Pid15001MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    pub marktteilnehmer: Option<MarktteilnehmerWrapped>,
    pub nachricht: Option<Nachricht>,
    pub referenz: Option<Referenz>,
    pub waehrung: Option<Waehrung>,
}

/// PID 15001: Angebot Geräteübernahme
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid15001TransaktionStammdaten {
    /// Required (Muss). Fields: betreiberCode, codepflegeCode
    pub betreiber: Option<BetreiberWrapped>,
    /// Required (Muss). Fields: einzelpreisbasisMenge, massEinheit, preisBetrag, preisQualifier, preisSpezifikation, preisTyp
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preis: Option<Vec<Preis>>,
    /// Required (Muss). Fields: artikelNummer, artikelNummerTyp, datumBisWert, datumQualifier, datumWert, freitext1, freitextQualifier, identNummer, identQualifier, positionsnummer, produktLeistungCode
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
    /// Required (Muss). Fields: referenz, referenzQualifier
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang_referenz: Option<Vec<VorgangReferenz>>,
    /// Required (Muss). Fields: dimension, klassentyp, merkmal.code, merkmal.codepflege, merkmalCodelisteCode, merkmalCodelisteCode2, merkmalDatenWert, merkmalDatenWert2, merkmalWert, merkmalWert2, merkmalWert3, merkmalWert4
    pub vorgang_zuordnung: Option<VorgangZuordnung>,
}

impl Pid15001TransaktionStammdaten {
    /// Required entity fields for PID 15001 (Angebot Geräteübernahme).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("betreiber", &["betreiberCode", "codepflegeCode"]),
            ("preis", &["einzelpreisbasisMenge", "massEinheit", "preisBetrag", "preisQualifier", "preisSpezifikation", "preisTyp"]),
            ("vorgang", &["artikelNummer", "artikelNummerTyp", "datumBisWert", "datumQualifier", "datumWert", "freitext1", "freitextQualifier", "identNummer", "identQualifier", "positionsnummer", "produktLeistungCode"]),
            ("vorgang_referenz", &["referenz", "referenzQualifier"]),
            ("vorgang_zuordnung", &["dimension", "klassentyp", "merkmal.code", "merkmal.codepflege", "merkmalCodelisteCode", "merkmalCodelisteCode2", "merkmalDatenWert", "merkmalDatenWert2", "merkmalWert", "merkmalWert2", "merkmalWert3", "merkmalWert4"]),
        ]
    }
}

pub type Pid15001Interchange = crate::model::Interchange<
    Pid15001MessageStammdaten,
    Pid15001TransaktionStammdaten,
>;

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

/// PID 15002: Angebot Abrechnung Messstellenbetrieb MSB
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid15002TransaktionStammdaten {
    /// Required (Muss). Fields: einzelpreisbasisMenge, massEinheit, preisQualifier, preisSpezifikation, preisTyp
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preis: Option<Vec<Preis>>,
    /// Required (Muss). Fields: artikelNummer, artikelNummerTyp, positionsnummer, produktIdentifikation.funktion, produktIdentifikation.id, produktIdentifikation.typ
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
    /// Required (Muss). Fields: referenz, referenzQualifier
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang_referenz: Option<Vec<VorgangReferenz>>,
}

impl Pid15002TransaktionStammdaten {
    /// Required entity fields for PID 15002 (Angebot Abrechnung Messstellenbetrieb MSB).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("preis", &["einzelpreisbasisMenge", "massEinheit", "preisQualifier", "preisSpezifikation", "preisTyp"]),
            ("vorgang", &["artikelNummer", "artikelNummerTyp", "positionsnummer", "produktIdentifikation.funktion", "produktIdentifikation.id", "produktIdentifikation.typ"]),
            ("vorgang_referenz", &["referenz", "referenzQualifier"]),
        ]
    }
}

pub type Pid15002Interchange = crate::model::Interchange<
    Pid15002MessageStammdaten,
    Pid15002TransaktionStammdaten,
>;

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

/// PID 15003: Angebot zur Anfrage von Werten
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid15003TransaktionStammdaten {
    /// Required (Muss). Fields: einzelpreisbasisMenge, massEinheit, preisBetrag, preisQualifier, preisSpezifikation, preisTyp
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub preis: Option<Vec<Preis>>,
    /// Required (Muss). Fields: handlungCode, obisIdentifikation.id, obisIdentifikation.typ, positionsnummer, produktIdentifikation.id, produktIdentifikation.typ, zusatzProduktIdentifikation.id, zusatzProduktIdentifikation.typ
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid15003TransaktionStammdaten {
    /// Required entity fields for PID 15003 (Angebot zur Anfrage von Werten).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("preis", &["einzelpreisbasisMenge", "massEinheit", "preisBetrag", "preisQualifier", "preisSpezifikation", "preisTyp"]),
            ("vorgang", &["handlungCode", "obisIdentifikation.id", "obisIdentifikation.typ", "positionsnummer", "produktIdentifikation.id", "produktIdentifikation.typ", "zusatzProduktIdentifikation.id", "zusatzProduktIdentifikation.typ"]),
        ]
    }
}

pub type Pid15003Interchange = crate::model::Interchange<
    Pid15003MessageStammdaten,
    Pid15003TransaktionStammdaten,
>;

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

/// PID 15004: Angebot einer Konfiguration
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid15004TransaktionStammdaten {
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation.id, produktIdentifikation.typ, zusatzProduktIdentifikation.id, zusatzProduktIdentifikation.typ
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
    /// Required (Muss). Fields: klassentyp, merkmal.code
    pub vorgang_zuordnung: Option<VorgangZuordnung>,
}

impl Pid15004TransaktionStammdaten {
    /// Required entity fields for PID 15004 (Angebot einer Konfiguration).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("vorgang", &["handlungCode", "positionsnummer", "produktIdentifikation.id", "produktIdentifikation.typ", "zusatzProduktIdentifikation.id", "zusatzProduktIdentifikation.typ"]),
            ("vorgang_zuordnung", &["klassentyp", "merkmal.code"]),
        ]
    }
}

pub type Pid15004Interchange = crate::model::Interchange<
    Pid15004MessageStammdaten,
    Pid15004TransaktionStammdaten,
>;

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

/// PID 15005: Angebot Änderung Technik
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid15005TransaktionStammdaten {
    /// Required (Muss). Fields: einzelpreisbasisMenge, massEinheit, preisBetrag, preisQualifier, preisSpezifikation, preisTyp, unverbindlichMasseinheit, unverbindlichMengeMax, unverbindlichMengeMin, verbindlichMasseinheit, verbindlichMenge
    pub preis: Option<Preis>,
    /// Required (Muss). Fields: handlungCode, positionsnummer, produktIdentifikation.id, produktIdentifikation.typ, zusatzProduktIdentifikation.id, zusatzProduktIdentifikation.typ
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
}

impl Pid15005TransaktionStammdaten {
    /// Required entity fields for PID 15005 (Angebot Änderung Technik).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("preis", &["einzelpreisbasisMenge", "massEinheit", "preisBetrag", "preisQualifier", "preisSpezifikation", "preisTyp", "unverbindlichMasseinheit", "unverbindlichMengeMax", "unverbindlichMengeMin", "verbindlichMasseinheit", "verbindlichMenge"]),
            ("vorgang", &["handlungCode", "positionsnummer", "produktIdentifikation.id", "produktIdentifikation.typ", "zusatzProduktIdentifikation.id", "zusatzProduktIdentifikation.typ"]),
        ]
    }
}

pub type Pid15005Interchange = crate::model::Interchange<
    Pid15005MessageStammdaten,
    Pid15005TransaktionStammdaten,
>;

