use serde::{Deserialize, Serialize};
use crate::types::{Decimal3, DocumentId, MarketParticipantId, Mrid, UtcDateTime};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Codierung {
#[serde(rename = "A10")]
Gs1,
#[serde(rename = "NDE")]
Nde,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StammdatenParticipantRef {
#[serde(rename = "@Code")]
pub code: MarketParticipantId,
#[serde(rename = "@Codierung")]
pub codierung: Codierung,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum StammdatenDocType {
#[serde(rename = "Z02")]
Reduced,
#[serde(rename = "Z03")]
Enriched,
#[serde(rename = "Z04")]
NbAggregate,
#[serde(rename = "Z14")]
Bilanzkreis,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum StammdatenSenderRole {
#[serde(rename = "A18")]
GridOperator,
#[serde(rename = "A27")]
ResourceProvider,
#[serde(rename = "A39")]
DataProvider,
#[serde(rename = "Z01")]
Supplier,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum StammdatenReceiverRole {
#[serde(rename = "A08")]
BalanceResponsibleParty,
#[serde(rename = "A18")]
GridOperator,
#[serde(rename = "A39")]
DataProvider,
#[serde(rename = "Z01")]
Supplier,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Meldungsstatus {
#[serde(rename = "A14")]
Creation,
#[serde(rename = "A15")]
Update,
#[serde(rename = "A16")]
Deactivation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Regelzone {
#[serde(rename = "10YDE-ENBW-----N")]
TransnetBw,
#[serde(rename = "10YDE-EON------1")]
TennetDe,
#[serde(rename = "10YDE-RWENET---I")]
Amprion,
#[serde(rename = "10YDE-VE-------2")]
FiftyHertz,
#[serde(rename = "10YFLENSBURG---3")]
Flensburg,
#[serde(rename = "11YRBAHNSTROM--P")]
Bahnstrom,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum Energietraeger {
#[serde(rename = "B01")]
NaturalGas,
#[serde(rename = "B02")]
LigniteCoal,
#[serde(rename = "B03")]
HardCoal,
#[serde(rename = "B04")]
Oil,
#[serde(rename = "B05")]
Uranium,
#[serde(rename = "B06")]
Biomass,
#[serde(rename = "B07")]
Wind,
#[serde(rename = "B08")]
Solar,
#[serde(rename = "B09")]
RunOfRiver,
#[serde(rename = "B10")]
PumpedStorage,
#[serde(rename = "B11")]
Geothermal,
#[serde(rename = "B12")]
WasteToEnergy,
#[serde(rename = "B13")]
OtherRenewable,
#[serde(rename = "B14")]
Mixed,
#[serde(rename = "B15")]
PumpedStorageWithNaturalInflow,
#[serde(rename = "B16")]
OtherNonRenewable,
#[serde(rename = "B17")]
OtherStorage,
#[serde(rename = "B18")]
Hydrogen,
#[serde(rename = "B19")]
Offshore,
#[serde(rename = "B20")]
Battery,
#[serde(rename = "Z01")]
Eeg,
#[serde(rename = "Z02")]
Kwkg,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Bilanzierungsmodell {
#[serde(rename = "Z01")]
Planwert,
#[serde(rename = "Z02")]
Prognose,
#[serde(rename = "Z03")]
PrognoseWithPlanningData,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AbrufartAufforderungsfall {
#[serde(rename = "Z01")]
Delta,
#[serde(rename = "Z02")]
Sollwert,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum StatusDuldungsfall {
#[serde(rename = "A01")]
Yes,
#[serde(rename = "A02")]
No,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Verguetungsart {
#[serde(rename = "Z01")]
Eeg,
#[serde(rename = "Z02")]
Kwkg,
#[serde(rename = "Z03")]
Other,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NbRef {
#[serde(rename = "@Code")]
pub code: MarketParticipantId,
#[serde(rename = "@Codierung")]
pub codierung: Codierung,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BetroffenerNb {
#[serde(rename = "@Code")]
pub code: MarketParticipantId,
#[serde(rename = "@Codierung")]
pub codierung: Codierung,
#[serde(rename = "@Pos")]
pub pos: u8,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SteuerbarkeitEinheit {
#[serde(rename = "MAW")]
Megawatt,
#[serde(rename = "P1")]
Percent,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Stufen {
#[serde(rename = "Einzelstufe", default)]
pub einzelstufen: Vec<Decimal3>,
#[serde(rename = "@Einheit", default, skip_serializing_if = "Option::is_none")]
pub einheit: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Schritte {
#[serde(rename = "Einheit")]
pub einheit: SteuerbarkeitEinheit,
#[serde(rename = "Schrittweite")]
pub schrittweite: Decimal3,
#[serde(rename = "Min")]
pub min: Decimal3,
#[serde(rename = "Max")]
pub max: Decimal3,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Steuerbarkeit {
#[serde(rename = "Stufen", default, skip_serializing_if = "Option::is_none")]
pub stufen: Option<Stufen>,
#[serde(rename = "Schritte", default, skip_serializing_if = "Option::is_none")]
pub schritte: Option<Schritte>,
#[serde(
rename = "@Fixierung",
default,
skip_serializing_if = "Option::is_none"
)]
pub fixierung: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TechnischeParameter {
#[serde(
rename = "Fahrbare_Mindesterzeugungsleistung",
default,
skip_serializing_if = "Option::is_none"
)]
pub fahrbare_mindesterzeugungsleistung: Option<Decimal3>,
#[serde(
rename = "Mindestbetriebszeit",
default,
skip_serializing_if = "Option::is_none"
)]
pub mindestbetriebszeit: Option<u32>,
#[serde(
rename = "Mindeststillstandszeit",
default,
skip_serializing_if = "Option::is_none"
)]
pub mindeststillstandszeit: Option<u32>,
#[serde(
rename = "Anfahrzeit_kalt",
default,
skip_serializing_if = "Option::is_none"
)]
pub anfahrzeit_kalt: Option<u32>,
#[serde(
rename = "Anfahrzeit_warm",
default,
skip_serializing_if = "Option::is_none"
)]
pub anfahrzeit_warm: Option<u32>,
#[serde(
rename = "Hochfahrzeit_kalt",
default,
skip_serializing_if = "Option::is_none"
)]
pub hochfahrzeit_kalt: Option<u32>,
#[serde(
rename = "Hochfahrzeit_warm",
default,
skip_serializing_if = "Option::is_none"
)]
pub hochfahrzeit_warm: Option<u32>,
#[serde(
rename = "Abfahrzeit",
default,
skip_serializing_if = "Option::is_none"
)]
pub abfahrzeit: Option<u32>,
#[serde(
rename = "Lastgradient_Erhoehung",
default,
skip_serializing_if = "Option::is_none"
)]
pub lastgradient_erhoehung: Option<Lastgradient>,
#[serde(
rename = "Lastgradient_Reduzierung",
default,
skip_serializing_if = "Option::is_none"
)]
pub lastgradient_reduzierung: Option<Lastgradient>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Lastgradient {
#[serde(rename = "@Gradient")]
pub gradient: Decimal3,
#[serde(rename = "@Einheit")]
pub einheit: String,
#[serde(
rename = "Basisgroesse",
default,
skip_serializing_if = "Option::is_none"
)]
pub basisgroesse: Option<Decimal3>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum JaNein {
#[serde(rename = "A01")]
Ja,
#[serde(rename = "A02")]
Nein,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Geokoordinaten {
#[serde(rename = "@LaengeOst")]
pub laenge_ost: f64,
#[serde(rename = "@BreiteNord")]
pub breite_nord: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TrTechnischeParameter {
#[serde(
rename = "Nettonennleistung_Prod",
default,
skip_serializing_if = "Option::is_none"
)]
pub nettonennleistung_prod: Option<Decimal3>,
#[serde(
rename = "Nettonennleistung_Verb",
default,
skip_serializing_if = "Option::is_none"
)]
pub nettonennleistung_verb: Option<Decimal3>,
#[serde(
rename = "Nettoengpassleistung_Prod",
default,
skip_serializing_if = "Option::is_none"
)]
pub nettoengpassleistung_prod: Option<Decimal3>,
#[serde(
rename = "Nettoengpassleistung_Verb",
default,
skip_serializing_if = "Option::is_none"
)]
pub nettoengpassleistung_verb: Option<Decimal3>,
#[serde(
rename = "Bruttonennleistung",
default,
skip_serializing_if = "Option::is_none"
)]
pub bruttonennleistung: Option<Decimal3>,
#[serde(
rename = "Wechselrichterleistung_kumuliert",
default,
skip_serializing_if = "Option::is_none"
)]
pub wechselrichterleistung_kumuliert: Option<Decimal3>,
#[serde(
rename = "Absenkung_70",
default,
skip_serializing_if = "Option::is_none"
)]
pub absenkung_70: Option<JaNein>,
#[serde(
rename = "Anlagentyp",
default,
skip_serializing_if = "Option::is_none"
)]
pub anlagentyp: Option<String>,
#[serde(
rename = "Nabenhoehe",
default,
skip_serializing_if = "Option::is_none"
)]
pub nabenhoehe: Option<Decimal3>,
#[serde(
rename = "Geokoordinaten",
default,
skip_serializing_if = "Option::is_none"
)]
pub geokoordinaten: Option<Geokoordinaten>,
#[serde(
rename = "Wirkungsgrad_Speicher",
default,
skip_serializing_if = "Option::is_none"
)]
pub wirkungsgrad_speicher: Option<Decimal3>,
#[serde(
rename = "Nutzbarer_Energieinhalt_Speichers",
default,
skip_serializing_if = "Option::is_none"
)]
pub nutzbarer_energieinhalt_speichers: Option<Decimal3>,
#[serde(
rename = "Wirkleistung_Einspeichern_max",
default,
skip_serializing_if = "Option::is_none"
)]
pub wirkleistung_einspeichern_max: Option<Decimal3>,
#[serde(
rename = "Wirkleistung_Ausspeichern_max",
default,
skip_serializing_if = "Option::is_none"
)]
pub wirkleistung_ausspeichern_max: Option<Decimal3>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Abrechnungsmodell {
#[serde(rename = "Z01")]
Pauschal,
#[serde(rename = "Z02")]
Spitz,
#[serde(rename = "Z03")]
SpitzLight,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Betrieb {
#[serde(
rename = "Stilllegung_vorlaeufig_erreicht",
default,
skip_serializing_if = "Option::is_none"
)]
pub stilllegung_vorlaeufig_erreicht: Option<JaNein>,
#[serde(
rename = "Stilllegung_endgueltig_erreicht",
default,
skip_serializing_if = "Option::is_none"
)]
pub stilllegung_endgueltig_erreicht: Option<JaNein>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Tranche {
#[serde(rename = "@Code")]
pub code: String,
#[serde(rename = "Bilanzkreis_Tranche")]
pub bilanzkreis: String,
#[serde(rename = "Lieferant_Tranche")]
pub lieferant: StammdatenParticipantRef,
#[serde(rename = "Tranchengroesse")]
pub tranchengroesse: Tranchengroesse,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Tranchengroesse {
#[serde(rename = "@Einheit")]
pub einheit: String,
#[serde(rename = "@Groesse")]
pub groesse: Decimal3,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CodeRef {
#[serde(rename = "@Code")]
pub code: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Marktlokation {
#[serde(rename = "@Code")]
pub code: String,
#[serde(rename = "@Lieferrichtung")]
pub lieferrichtung: String,
#[serde(
rename = "Bilanzkreis_Marktlokation",
default,
skip_serializing_if = "Option::is_none"
)]
pub bilanzkreis: Option<String>,
#[serde(rename = "Tranche", default, skip_serializing_if = "Vec::is_empty")]
pub tranchen: Vec<Tranche>,
#[serde(rename = "Spannungsebene_Marktlokation")]
pub spannungsebene: CodeRef,
#[serde(
rename = "Umspannung_Marktlokation",
default,
skip_serializing_if = "Option::is_none"
)]
pub umspannung: Option<CodeRef>,
#[serde(rename = "Messlokation")]
pub messlokationen: Vec<CodeRef>,
#[serde(
rename = "Lieferant_Marktlokation",
default,
skip_serializing_if = "Option::is_none"
)]
pub lieferant: Option<StammdatenParticipantRef>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnthaltenesTr {
#[serde(rename = "MaStR-Nr", default, skip_serializing_if = "Option::is_none")]
pub ma_str_nr: Option<String>,
#[serde(rename = "Klarname", default, skip_serializing_if = "Option::is_none")]
pub klarname: Option<String>,
#[serde(rename = "Typ")]
pub typ: String,
#[serde(
rename = "Code_Kraftwerk",
default,
skip_serializing_if = "Option::is_none"
)]
pub code_kraftwerk: Option<String>,
#[serde(
rename = "Zuordnung_Speicher",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub zuordnung_speicher: Vec<StammdatenParticipantRef>,
#[serde(
rename = "Marktlokation",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub marktlokationen: Vec<Marktlokation>,
#[serde(
rename = "EEG_Anlagenschluessel",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub eeg_anlagenschluessel: Vec<String>,
#[serde(rename = "Abrechnungsmodell")]
pub abrechnungsmodell: Abrechnungsmodell,
#[serde(
rename = "Betreiber_TR",
default,
skip_serializing_if = "Option::is_none"
)]
pub betreiber_tr: Option<StammdatenParticipantRef>,
#[serde(rename = "Betrieb", default, skip_serializing_if = "Option::is_none")]
pub betrieb: Option<Betrieb>,
#[serde(
rename = "Technische_Parameter",
default,
skip_serializing_if = "Option::is_none"
)]
pub technische_parameter: Option<TrTechnischeParameter>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SrObjekt {
#[serde(rename = "Klarname", default, skip_serializing_if = "Option::is_none")]
pub klarname: Option<String>,
#[serde(rename = "Anschluss_Netzbetreiber")]
pub anschluss_netzbetreiber: NbRef,
#[serde(
rename = "Anweisender_Netzbetreiber",
default,
skip_serializing_if = "Option::is_none"
)]
pub anweisender_netzbetreiber: Option<NbRef>,
#[serde(
rename = "Betroffene_Netzbetreiber",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub betroffene_netzbetreiber: Vec<BetroffenerNb>,
#[serde(
rename = "Weitere_betroffene_Netzbetreiber",
default,
skip_serializing_if = "Vec::is_empty"
)]
pub weitere_betroffene_netzbetreiber: Vec<NbRef>,
#[serde(
rename = "Einsatzverantwortlicher",
default,
skip_serializing_if = "Option::is_none"
)]
pub einsatzverantwortlicher: Option<StammdatenParticipantRef>,
#[serde(
rename = "Energietraeger",
default,
skip_serializing_if = "Option::is_none"
)]
pub energietraeger: Option<Energietraeger>,
#[serde(
rename = "Verguetungsart",
default,
skip_serializing_if = "Option::is_none"
)]
pub verguetungsart: Option<Verguetungsart>,
#[serde(
rename = "Status_Duldungsfall",
default,
skip_serializing_if = "Option::is_none"
)]
pub status_duldungsfall: Option<StatusDuldungsfall>,
#[serde(
rename = "Steuerbarkeit",
default,
skip_serializing_if = "Option::is_none"
)]
pub steuerbarkeit: Option<Steuerbarkeit>,
#[serde(
rename = "Abrufart_Aufforderungsfall",
default,
skip_serializing_if = "Option::is_none"
)]
pub abrufart_aufforderungsfall: Option<AbrufartAufforderungsfall>,
#[serde(rename = "Bilanzierungsmodell")]
pub bilanzierungsmodell: Bilanzierungsmodell,
#[serde(
rename = "Individuelle_Quote",
default,
skip_serializing_if = "Option::is_none"
)]
pub individuelle_quote: Option<IndividuelleQuote>,
#[serde(
rename = "Bearbeitungszeit_EIV",
default,
skip_serializing_if = "Option::is_none"
)]
pub bearbeitungszeit_eiv: Option<Decimal3>,
#[serde(rename = "Regelzone")]
pub regelzone: Regelzone,
#[serde(
rename = "Technische_Parameter",
default,
skip_serializing_if = "Option::is_none"
)]
pub technische_parameter: Option<TechnischeParameter>,
#[serde(rename = "Enthaltene_TR")]
pub enthaltene_tr: Vec<EnthaltenesTr>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Quote {
#[serde(rename = "@Einheit")]
pub einheit: String,
#[serde(rename = "@Wert")]
pub wert: Decimal3,
#[serde(rename = "Bilanzkreis_Ausgleichsfahrplan")]
pub bilanzkreis_ausgleichsfahrplan: String,
#[serde(rename = "Lieferant")]
pub lieferant: StammdatenParticipantRef,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IndividuelleQuote {
#[serde(rename = "Quote")]
pub quoten: Vec<Quote>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Existenzende {
#[serde(rename = "Objektreferenz")]
pub objektreferenzen: Vec<StammdatenParticipantRef>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AnfordernderNetzbetreiber {
#[serde(rename = "Bilanzkreis_anfNB")]
pub bilanzkreis: String,
#[serde(rename = "Marktpartner_ID")]
pub marktpartner_id: StammdatenParticipantRef,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BilanzkreisAusgleichsfahrplanAnfNb {
#[serde(rename = "SR_Objekt_Referenz")]
pub sr_objekt_referenz: StammdatenParticipantRef,
#[serde(rename = "anfordernder_Netzbetreiber")]
pub anfordernde_netzbetreiber: Vec<AnfordernderNetzbetreiber>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename = "Stammdaten")]
pub struct Stammdaten {
#[serde(rename = "DocumentIdentification")]
pub document_identification: DocumentId,
#[serde(rename = "DocumentType")]
pub document_type: StammdatenDocType,
#[serde(rename = "Erstellungszeitpunkt")]
pub erstellungszeitpunkt: UtcDateTime,
#[serde(rename = "Sender")]
pub sender: StammdatenParticipantRef,
#[serde(rename = "Senderrolle")]
pub senderrolle: StammdatenSenderRole,
#[serde(rename = "Empfaenger")]
pub empfaenger: StammdatenParticipantRef,
#[serde(rename = "Empfaengerrolle")]
pub empfaengerrolle: StammdatenReceiverRole,
#[serde(
rename = "RefDokumentID",
default,
skip_serializing_if = "Option::is_none"
)]
pub ref_dokument_id: Option<Mrid>,
#[serde(
rename = "OriginalSender",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_sender: Option<StammdatenParticipantRef>,
#[serde(
rename = "OriginalDokumentID",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_dokument_id: Option<Mrid>,
#[serde(
rename = "OriginalErstellungszeitpunkt",
default,
skip_serializing_if = "Option::is_none"
)]
pub original_erstellungszeitpunkt: Option<UtcDateTime>,
#[serde(rename = "Gueltig_ab")]
pub gueltig_ab: UtcDateTime,
#[serde(rename = "Meldungsstatus")]
pub meldungsstatus: Meldungsstatus,
#[serde(rename = "SR_Objekt", default)]
pub sr_objekte: Vec<SrObjekt>,
#[serde(
rename = "Existenzende",
default,
skip_serializing_if = "Option::is_none"
)]
pub existenzende: Option<Existenzende>,
#[serde(
rename = "Bilanzkreis_Ausgleichsfahrplan_anfNB",
default,
skip_serializing_if = "Option::is_none"
)]
pub bilanzkreis_ausgleichsfahrplan_anf_nb: Option<BilanzkreisAusgleichsfahrplanAnfNb>,
}