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

#![allow(unused_imports)]

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

/// 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,
    /// Lieferanschrift
    #[serde(rename = "DP")]
    Dp,
}

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"),
            Self::Dp => write!(f, "DP"),
        }
    }
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid31002MessageStammdaten {
    pub ansprechpartner: Option<Ansprechpartner>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_map_or_vec")]
    pub marktteilnehmer: Option<BTreeMap<MarktteilnehmerKey, MarktteilnehmerWrapped>>,
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub marktteilnehmer_referenz: Option<Vec<MarktteilnehmerReferenz>>,
    pub nachricht: Option<Nachricht>,
    pub rechnungssumme: Option<Rechnungssumme>,
    pub rechnungssumme_referenz: Option<RechnungssummeReferenz>,
    pub referenz: Option<Referenz>,
    pub steuersatz_summe: Option<SteuersatzSumme>,
    pub waehrung: Option<Waehrung>,
    pub zahlungsbedingungen: Option<Zahlungsbedingungen>,
}

/// PID 31002: NN-Rechnung
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Pid31002TransaktionStammdaten {
    /// Required (Muss). Fields: artikelNummerTyp, auftragsdatum, auftragsdatumFormat, lieferungszeitraumBis, lieferungszeitraumVon, mengeEinheit, mmmEinheit, mmmMenge, positionsmenge, positionsnummer, produktIdentifikation.id, zeitbezogeneMenge, zeiteinheit
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang: Option<Vec<Vorgang>>,
    /// Required (Muss). Fields: zuAbschlagCode, zuAbschlagTyp
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang_abschlag: Option<Vec<VorgangAbschlag>>,
    /// Required (Muss). Fields: betragQualifier, wert
    pub vorgang_abschlag_betrag: Option<VorgangAbschlagBetrag>,
    /// Required (Muss). Fields: prozentQualifier, prozentsatz
    pub vorgang_abschlag_prozent: Option<VorgangAbschlagProzent>,
    /// Required (Muss). Fields: betragQualifier, wert
    pub vorgang_betrag: Option<VorgangBetrag>,
    /// Required (Muss). Fields: preisEinheit, wert
    pub vorgang_preis: Option<VorgangPreis>,
    /// Required (Muss). Fields: steuerCode, steuerFunktionCode, steuerKategorie, steuerTypCode, steuersatz, veranlagungsbasis, veranlagungsbasisWert
    pub vorgang_steuersatz: Option<VorgangSteuersatz>,
    /// Required (Muss). Fields: zuAbschlagCode, zuAbschlagTyp
    #[serde(default, deserialize_with = "crate::serde_helpers::deserialize_vec_or_single")]
    pub vorgang_zuschlag: Option<Vec<VorgangZuschlag>>,
    /// Required (Muss). Fields: prozentQualifier, prozentsatz
    pub vorgang_zuschlag_prozent: Option<VorgangZuschlagProzent>,
}

impl Pid31002TransaktionStammdaten {
    /// Required entity fields for PID 31002 (NN-Rechnung).
    ///
    /// Each entry is `(entity_field, required_bo4e_fields)`.
    pub fn required_fields() -> &'static [(&'static str, &'static [&'static str])] {
        &[
            ("vorgang", &["artikelNummerTyp", "auftragsdatum", "auftragsdatumFormat", "lieferungszeitraumBis", "lieferungszeitraumVon", "mengeEinheit", "mmmEinheit", "mmmMenge", "positionsmenge", "positionsnummer", "produktIdentifikation.id", "zeitbezogeneMenge", "zeiteinheit"]),
            ("vorgang_abschlag", &["zuAbschlagCode", "zuAbschlagTyp"]),
            ("vorgang_abschlag_betrag", &["betragQualifier", "wert"]),
            ("vorgang_abschlag_prozent", &["prozentQualifier", "prozentsatz"]),
            ("vorgang_betrag", &["betragQualifier", "wert"]),
            ("vorgang_preis", &["preisEinheit", "wert"]),
            ("vorgang_steuersatz", &["steuerCode", "steuerFunktionCode", "steuerKategorie", "steuerTypCode", "steuersatz", "veranlagungsbasis", "veranlagungsbasisWert"]),
            ("vorgang_zuschlag", &["zuAbschlagCode", "zuAbschlagTyp"]),
            ("vorgang_zuschlag_prozent", &["prozentQualifier", "prozentsatz"]),
        ]
    }
}

pub type Pid31002Interchange = crate::model::Interchange<
    Pid31002MessageStammdaten,
    Pid31002TransaktionStammdaten,
>;

