1use serde::{Deserialize, Serialize};
3
4use crate::types::{Decimal3, DocumentId, MarketParticipantId, Mrid, UtcDateTime};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
10pub enum Codierung {
11 #[serde(rename = "A10")]
13 Gs1,
14 #[serde(rename = "NDE")]
16 Nde,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
24pub struct StammdatenParticipantRef {
25 #[serde(rename = "@Code")]
27 pub code: MarketParticipantId,
28 #[serde(rename = "@Codierung")]
30 pub codierung: Codierung,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
37pub enum StammdatenDocType {
38 #[serde(rename = "Z02")]
40 Reduced,
41 #[serde(rename = "Z03")]
43 Enriched,
44 #[serde(rename = "Z04")]
46 NbAggregate,
47 #[serde(rename = "Z14")]
49 Bilanzkreis,
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
54pub enum StammdatenSenderRole {
55 #[serde(rename = "A18")]
57 GridOperator,
58 #[serde(rename = "A27")]
60 ResourceProvider,
61 #[serde(rename = "A39")]
63 DataProvider,
64 #[serde(rename = "Z01")]
66 Supplier,
67}
68
69#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
71pub enum StammdatenReceiverRole {
72 #[serde(rename = "A08")]
74 BalanceResponsibleParty,
75 #[serde(rename = "A18")]
77 GridOperator,
78 #[serde(rename = "A39")]
80 DataProvider,
81 #[serde(rename = "Z01")]
83 Supplier,
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
88pub enum Meldungsstatus {
89 #[serde(rename = "A14")]
91 Creation,
92 #[serde(rename = "A15")]
94 Update,
95 #[serde(rename = "A16")]
97 Deactivation,
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
102pub enum Regelzone {
103 #[serde(rename = "10YDE-ENBW-----N")]
105 TransnetBw,
106 #[serde(rename = "10YDE-EON------1")]
108 TennetDe,
109 #[serde(rename = "10YDE-RWENET---I")]
111 Amprion,
112 #[serde(rename = "10YDE-VE-------2")]
114 FiftyHertz,
115 #[serde(rename = "10YFLENSBURG---3")]
117 Flensburg,
118 #[serde(rename = "11YRBAHNSTROM--P")]
120 Bahnstrom,
121}
122
123#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
125#[non_exhaustive]
126pub enum Energietraeger {
127 #[serde(rename = "B01")]
129 NaturalGas,
130 #[serde(rename = "B02")]
132 LigniteCoal,
133 #[serde(rename = "B03")]
135 HardCoal,
136 #[serde(rename = "B04")]
138 Oil,
139 #[serde(rename = "B05")]
141 Uranium,
142 #[serde(rename = "B06")]
144 Biomass,
145 #[serde(rename = "B07")]
147 Wind,
148 #[serde(rename = "B08")]
150 Solar,
151 #[serde(rename = "B09")]
153 RunOfRiver,
154 #[serde(rename = "B10")]
156 PumpedStorage,
157 #[serde(rename = "B11")]
159 Geothermal,
160 #[serde(rename = "B12")]
162 WasteToEnergy,
163 #[serde(rename = "B13")]
165 OtherRenewable,
166 #[serde(rename = "B14")]
168 Mixed,
169 #[serde(rename = "B15")]
171 PumpedStorageWithNaturalInflow,
172 #[serde(rename = "B16")]
174 OtherNonRenewable,
175 #[serde(rename = "B17")]
177 OtherStorage,
178 #[serde(rename = "B18")]
180 Hydrogen,
181 #[serde(rename = "B19")]
183 Offshore,
184 #[serde(rename = "B20")]
186 Battery,
187 #[serde(rename = "Z01")]
189 Eeg,
190 #[serde(rename = "Z02")]
192 Kwkg,
193}
194
195#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
197pub enum Bilanzierungsmodell {
198 #[serde(rename = "Z01")]
200 Planwert,
201 #[serde(rename = "Z02")]
203 Prognose,
204 #[serde(rename = "Z03")]
206 PrognoseWithPlanningData,
207}
208
209#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
211pub enum AbrufartAufforderungsfall {
212 #[serde(rename = "Z01")]
214 Delta,
215 #[serde(rename = "Z02")]
217 Sollwert,
218}
219
220#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
222pub enum StatusDuldungsfall {
223 #[serde(rename = "A01")]
225 Yes,
226 #[serde(rename = "A02")]
228 No,
229}
230
231#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
233pub enum Verguetungsart {
234 #[serde(rename = "Z01")]
236 Eeg,
237 #[serde(rename = "Z02")]
239 Kwkg,
240 #[serde(rename = "Z03")]
242 Other,
243}
244
245#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
249pub struct NbRef {
250 #[serde(rename = "@Code")]
252 pub code: MarketParticipantId,
253 #[serde(rename = "@Codierung")]
255 pub codierung: Codierung,
256}
257
258#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
260pub struct BetroffenerNb {
261 #[serde(rename = "@Code")]
263 pub code: MarketParticipantId,
264 #[serde(rename = "@Codierung")]
266 pub codierung: Codierung,
267 #[serde(rename = "@Pos")]
269 pub pos: u8,
270}
271
272#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
276pub enum SteuerbarkeitEinheit {
277 #[serde(rename = "MAW")]
279 Megawatt,
280 #[serde(rename = "P1")]
282 Percent,
283}
284
285#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
287pub struct Stufen {
288 #[serde(rename = "Einzelstufe", default)]
290 pub einzelstufen: Vec<Decimal3>,
291 #[serde(rename = "@Einheit", default, skip_serializing_if = "Option::is_none")]
293 pub einheit: Option<String>,
294}
295
296#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
298pub struct Schritte {
299 #[serde(rename = "Einheit")]
301 pub einheit: SteuerbarkeitEinheit,
302 #[serde(rename = "Schrittweite")]
304 pub schrittweite: Decimal3,
305 #[serde(rename = "Min")]
307 pub min: Decimal3,
308 #[serde(rename = "Max")]
310 pub max: Decimal3,
311}
312
313#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
316pub struct Steuerbarkeit {
317 #[serde(rename = "Stufen", default, skip_serializing_if = "Option::is_none")]
319 pub stufen: Option<Stufen>,
320 #[serde(rename = "Schritte", default, skip_serializing_if = "Option::is_none")]
322 pub schritte: Option<Schritte>,
323 #[serde(
325 rename = "@Fixierung",
326 default,
327 skip_serializing_if = "Option::is_none"
328 )]
329 pub fixierung: Option<String>,
330}
331
332#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
339pub struct TechnischeParameter {
340 #[serde(
342 rename = "Fahrbare_Mindesterzeugungsleistung",
343 default,
344 skip_serializing_if = "Option::is_none"
345 )]
346 pub fahrbare_mindesterzeugungsleistung: Option<Decimal3>,
347 #[serde(
349 rename = "Mindestbetriebszeit",
350 default,
351 skip_serializing_if = "Option::is_none"
352 )]
353 pub mindestbetriebszeit: Option<u32>,
354 #[serde(
356 rename = "Mindeststillstandszeit",
357 default,
358 skip_serializing_if = "Option::is_none"
359 )]
360 pub mindeststillstandszeit: Option<u32>,
361 #[serde(
363 rename = "Anfahrzeit_kalt",
364 default,
365 skip_serializing_if = "Option::is_none"
366 )]
367 pub anfahrzeit_kalt: Option<u32>,
368 #[serde(
370 rename = "Anfahrzeit_warm",
371 default,
372 skip_serializing_if = "Option::is_none"
373 )]
374 pub anfahrzeit_warm: Option<u32>,
375 #[serde(
377 rename = "Hochfahrzeit_kalt",
378 default,
379 skip_serializing_if = "Option::is_none"
380 )]
381 pub hochfahrzeit_kalt: Option<u32>,
382 #[serde(
384 rename = "Hochfahrzeit_warm",
385 default,
386 skip_serializing_if = "Option::is_none"
387 )]
388 pub hochfahrzeit_warm: Option<u32>,
389 #[serde(
391 rename = "Abfahrzeit",
392 default,
393 skip_serializing_if = "Option::is_none"
394 )]
395 pub abfahrzeit: Option<u32>,
396 #[serde(
398 rename = "Lastgradient_Erhoehung",
399 default,
400 skip_serializing_if = "Option::is_none"
401 )]
402 pub lastgradient_erhoehung: Option<Decimal3>,
403 #[serde(
405 rename = "Lastgradient_Reduzierung",
406 default,
407 skip_serializing_if = "Option::is_none"
408 )]
409 pub lastgradient_reduzierung: Option<Decimal3>,
410}
411
412#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
417pub struct EnthaltenesTr {
418 #[serde(rename = "MaStR_Nr", default, skip_serializing_if = "Option::is_none")]
420 pub ma_str_nr: Option<String>,
421 #[serde(rename = "Klarname", default, skip_serializing_if = "Option::is_none")]
423 pub klarname: Option<String>,
424 #[serde(rename = "Typ", default, skip_serializing_if = "Option::is_none")]
426 pub typ: Option<String>,
427 #[serde(
429 rename = "Code_Kraftwerk",
430 default,
431 skip_serializing_if = "Option::is_none"
432 )]
433 pub code_kraftwerk: Option<String>,
434 #[serde(
436 rename = "Marktlokation",
437 default,
438 skip_serializing_if = "Option::is_none"
439 )]
440 pub marktlokation: Option<String>,
441}
442
443#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
450pub struct SrObjekt {
451 #[serde(rename = "Klarname", default, skip_serializing_if = "Option::is_none")]
453 pub klarname: Option<String>,
454 #[serde(rename = "Anschluss_Netzbetreiber")]
456 pub anschluss_netzbetreiber: NbRef,
457 #[serde(
459 rename = "Anweisender_Netzbetreiber",
460 default,
461 skip_serializing_if = "Option::is_none"
462 )]
463 pub anweisender_netzbetreiber: Option<NbRef>,
464 #[serde(
466 rename = "Betroffene_Netzbetreiber",
467 default,
468 skip_serializing_if = "Vec::is_empty"
469 )]
470 pub betroffene_netzbetreiber: Vec<BetroffenerNb>,
471 #[serde(
473 rename = "Weitere_betroffene_Netzbetreiber",
474 default,
475 skip_serializing_if = "Vec::is_empty"
476 )]
477 pub weitere_betroffene_netzbetreiber: Vec<NbRef>,
478 #[serde(
480 rename = "Energietraeger",
481 default,
482 skip_serializing_if = "Option::is_none"
483 )]
484 pub energietraeger: Option<Energietraeger>,
485 #[serde(
487 rename = "Verguetungsart",
488 default,
489 skip_serializing_if = "Option::is_none"
490 )]
491 pub verguetungsart: Option<Verguetungsart>,
492 #[serde(
494 rename = "Status_Duldungsfall",
495 default,
496 skip_serializing_if = "Option::is_none"
497 )]
498 pub status_duldungsfall: Option<StatusDuldungsfall>,
499 #[serde(
501 rename = "Steuerbarkeit",
502 default,
503 skip_serializing_if = "Option::is_none"
504 )]
505 pub steuerbarkeit: Option<Steuerbarkeit>,
506 #[serde(
508 rename = "Abrufart_Aufforderungsfall",
509 default,
510 skip_serializing_if = "Option::is_none"
511 )]
512 pub abrufart_aufforderungsfall: Option<AbrufartAufforderungsfall>,
513 #[serde(rename = "Bilanzierungsmodell")]
515 pub bilanzierungsmodell: Bilanzierungsmodell,
516 #[serde(
518 rename = "Individuelle_Quote",
519 default,
520 skip_serializing_if = "Option::is_none"
521 )]
522 pub individuelle_quote: Option<IndividuelleQuote>,
523 #[serde(rename = "Regelzone")]
525 pub regelzone: Regelzone,
526 #[serde(
528 rename = "Technische_Parameter",
529 default,
530 skip_serializing_if = "Option::is_none"
531 )]
532 pub technische_parameter: Option<TechnischeParameter>,
533 #[serde(
535 rename = "Enthaltene_TR",
536 default,
537 skip_serializing_if = "Vec::is_empty"
538 )]
539 pub enthaltene_tr: Vec<EnthaltenesTr>,
540}
541
542#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
544pub struct IndividuelleQuote {
545 #[serde(rename = "Quote", default)]
547 pub quoten: Vec<Decimal3>,
548}
549
550#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
561#[serde(rename = "Stammdaten")]
562pub struct Stammdaten {
563 #[serde(rename = "DocumentIdentification")]
565 pub document_identification: DocumentId,
566 #[serde(rename = "DocumentType")]
568 pub document_type: StammdatenDocType,
569 #[serde(rename = "Erstellungszeitpunkt")]
571 pub erstellungszeitpunkt: UtcDateTime,
572 #[serde(rename = "Sender")]
574 pub sender: StammdatenParticipantRef,
575 #[serde(rename = "Senderrolle")]
577 pub senderrolle: StammdatenSenderRole,
578 #[serde(rename = "Empfaenger")]
580 pub empfaenger: StammdatenParticipantRef,
581 #[serde(rename = "Empfaengerrolle")]
583 pub empfaengerrolle: StammdatenReceiverRole,
584 #[serde(
586 rename = "RefDokumentID",
587 default,
588 skip_serializing_if = "Option::is_none"
589 )]
590 pub ref_dokument_id: Option<Mrid>,
591 #[serde(
593 rename = "OriginalSender",
594 default,
595 skip_serializing_if = "Option::is_none"
596 )]
597 pub original_sender: Option<StammdatenParticipantRef>,
598 #[serde(
600 rename = "OriginalDokumentID",
601 default,
602 skip_serializing_if = "Option::is_none"
603 )]
604 pub original_dokument_id: Option<Mrid>,
605 #[serde(
607 rename = "OriginalErstellungszeitpunkt",
608 default,
609 skip_serializing_if = "Option::is_none"
610 )]
611 pub original_erstellungszeitpunkt: Option<UtcDateTime>,
612 #[serde(rename = "Gueltig_ab")]
614 pub gueltig_ab: UtcDateTime,
615 #[serde(rename = "Meldungsstatus")]
617 pub meldungsstatus: Meldungsstatus,
618 #[serde(rename = "SR_Objekt", default)]
620 pub sr_objekte: Vec<SrObjekt>,
621}