Skip to main content

rubo4e/generated/v202607/
tarifpreisblatt.rs

1use super::{
2    AufAbschlag, Bo4eObject, BoTyp, Energiemix, Kundentyp, Marktteilnehmer, Preisgarantie,
3    Registeranzahl, Sparte, Tarifberechnungsparameter, Tarifeinschraenkung, Tarifmerkmal,
4    Tarifpreisposition, Tariftyp, Vertragskonditionen, Zeitraum, ZusatzAttribut,
5};
6#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(not(feature = "json"), derive(Eq, Hash))]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
10#[cfg_attr(feature = "validate", derive(garde::Validate))]
11#[cfg_attr(feature = "validate", garde(allow_unvalidated))]
12#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
13#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
14/// Tarifinformation mit Preisen, Aufschlägen und Berechnungssystematik
15///
16/// > **Note:** [Tarifpreisblatt JSON Schema](https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/v202607.1.0/src/bo4e_schemas/bo/Tarifpreisblatt.json)
17pub struct Tarifpreisblatt {
18    /// Der Marktteilnehmer (Lieferant), der diesen Tarif anbietet
19    #[cfg_attr(feature = "serde", serde(rename = "anbieter"))]
20    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
21    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
22    pub anbieter: Option<Box<Marktteilnehmer>>,
23    /// Der Name des Marktpartners, der den Tarif anbietet
24    #[cfg_attr(feature = "serde", serde(rename = "anbietername"))]
25    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
26    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
27    pub anbietername: Option<String>,
28    /// Angabe des inklusiven Zeitpunkts, ab dem der Tarif bzw. der Preis angewendet und abgerechnet wird,
29    /// z.B. "2021-07-20T18:31:48Z"
30    #[cfg_attr(feature = "serde", serde(rename = "anwendungVon"))]
31    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
32    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
33    #[cfg_attr(feature = "serde", serde(default))]
34    #[cfg_attr(
35        feature = "schemars",
36        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
37    )]
38    #[cfg_attr(
39        all(feature = "serde", feature = "time"),
40        serde(with = "time::serde::rfc3339::option")
41    )]
42    #[cfg(feature = "time")]
43    pub anwendung_von: Option<time::OffsetDateTime>,
44    /// Requires the `time` feature for the `time::OffsetDateTime` representation.
45    /// Without `time`, stores the ISO-8601 string value unchanged.
46    #[cfg_attr(feature = "serde", serde(rename = "anwendungVon"))]
47    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
48    #[cfg_attr(feature = "serde", serde(default))]
49    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
50    #[cfg_attr(
51        feature = "schemars",
52        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
53    )]
54    #[cfg(not(feature = "time"))]
55    pub anwendung_von: Option<String>,
56    /// Freitext
57    #[cfg_attr(feature = "serde", serde(rename = "bemerkung"))]
58    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
59    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
60    pub bemerkung: Option<String>,
61    /// Für die Berechnung der Kosten sind die hier abgebildeten Parameter heranzuziehen
62    #[cfg_attr(feature = "serde", serde(rename = "berechnungsparameter"))]
63    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
64    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
65    pub berechnungsparameter: Option<Tarifberechnungsparameter>,
66    /// Name des Tarifs
67    #[cfg_attr(feature = "serde", serde(rename = "bezeichnung"))]
68    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
69    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
70    pub bezeichnung: Option<String>,
71    /// Der Energiemix, der für diesen Tarif gilt
72    #[cfg_attr(feature = "serde", serde(rename = "energiemix"))]
73    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
74    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
75    pub energiemix: Option<Energiemix>,
76    /// Eine generische ID, die für eigene Zwecke genutzt werden kann.
77    /// Z.B. könnten hier UUIDs aus einer Datenbank stehen oder URLs zu einem Backend-System.
78    #[cfg_attr(feature = "serde", serde(rename = "_id"))]
79    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
80    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
81    pub id: Option<String>,
82    /// Kundentypen für den der Tarif gilt, z.B. Privatkunden
83    #[cfg_attr(feature = "serde", serde(rename = "kundentypen"))]
84    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
85    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
86    pub kundentypen: Option<Vec<Kundentyp>>,
87    /// Festlegung von Garantien für bestimmte Preisanteile
88    #[cfg_attr(feature = "serde", serde(rename = "preisgarantie"))]
89    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
90    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
91    pub preisgarantie: Option<Preisgarantie>,
92    /// Gibt an, wann der Preis zuletzt angepasst wurde
93    #[cfg_attr(feature = "serde", serde(rename = "preisstand"))]
94    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
95    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
96    #[cfg_attr(feature = "serde", serde(default))]
97    #[cfg_attr(
98        feature = "schemars",
99        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
100    )]
101    #[cfg_attr(
102        all(feature = "serde", feature = "time"),
103        serde(with = "time::serde::rfc3339::option")
104    )]
105    #[cfg(feature = "time")]
106    pub preisstand: Option<time::OffsetDateTime>,
107    /// Requires the `time` feature for the `time::OffsetDateTime` representation.
108    /// Without `time`, stores the ISO-8601 string value unchanged.
109    #[cfg_attr(feature = "serde", serde(rename = "preisstand"))]
110    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
111    #[cfg_attr(feature = "serde", serde(default))]
112    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
113    #[cfg_attr(
114        feature = "schemars",
115        schemars(schema_with = "crate::schema_helpers::opt_datetime_schema")
116    )]
117    #[cfg(not(feature = "time"))]
118    pub preisstand: Option<String>,
119    /// Die Art des Tarifes, z.B. Eintarif oder Mehrtarif
120    #[cfg_attr(feature = "serde", serde(rename = "registeranzahl"))]
121    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
122    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
123    pub registeranzahl: Option<Registeranzahl>,
124    /// Strom oder Gas, etc.
125    #[cfg_attr(feature = "serde", serde(rename = "sparte"))]
126    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
127    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
128    pub sparte: Option<Sparte>,
129    /// Auf- und Abschläge auf die Preise oder Kosten
130    #[cfg_attr(feature = "serde", serde(rename = "tarifAufAbschlaege"))]
131    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
132    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
133    pub tarif_auf_abschlaege: Option<Vec<AufAbschlag>>,
134    /// Die Bedingungen und Einschränkungen unter denen ein Tarif angewendet werden kann
135    #[cfg_attr(feature = "serde", serde(rename = "tarifeinschraenkung"))]
136    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
137    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
138    pub tarifeinschraenkung: Option<Tarifeinschraenkung>,
139    /// Weitere Merkmale des Tarifs, z.B. Festpreis oder Vorkasse
140    #[cfg_attr(feature = "serde", serde(rename = "tarifmerkmale"))]
141    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
142    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
143    pub tarifmerkmale: Option<Vec<Tarifmerkmal>>,
144    /// Die festgelegten Preise, z.B. für Arbeitspreis, Grundpreis etc.
145    #[cfg_attr(feature = "serde", serde(rename = "tarifpreise"))]
146    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
147    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
148    pub tarifpreise: Option<Vec<Tarifpreisposition>>,
149    /// Hinweis auf den Tariftyp, z.B. Grundversorgung oder Sondertarif
150    #[cfg_attr(feature = "serde", serde(rename = "tariftyp"))]
151    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
152    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
153    pub tariftyp: Option<Tariftyp>,
154    /// BO4E type discriminant — always `BoTyp::Tarifpreisblatt` for this struct.
155    #[cfg_attr(feature = "serde", serde(rename = "_typ"))]
156    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
157    #[cfg_attr(
158        feature = "builder",
159        builder(default = Some(BoTyp::Tarifpreisblatt), setter(skip))
160    )]
161    pub typ: Option<BoTyp>,
162    /// Version der BO-Struktur aka "fachliche Versionierung"
163    #[cfg_attr(feature = "serde", serde(rename = "_version"))]
164    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
165    #[cfg_attr(
166        feature = "builder",
167        builder(default = Some("202607.1.0".to_owned()), setter(into))
168    )]
169    pub version: Option<String>,
170    /// Mindestlaufzeiten und Kündigungsfristen zusammengefasst
171    #[cfg_attr(feature = "serde", serde(rename = "vertragskonditionen"))]
172    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
173    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
174    pub vertragskonditionen: Option<Vertragskonditionen>,
175    /// Internetseite auf dem der Tarif zu finden ist
176    #[cfg_attr(feature = "serde", serde(rename = "website"))]
177    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
178    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
179    pub website: Option<String>,
180    /// Angabe, in welchem Zeitraum der Tarif gültig ist
181    #[cfg_attr(feature = "serde", serde(rename = "zeitlicheGueltigkeit"))]
182    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
183    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
184    pub zeitliche_gueltigkeit: Option<Zeitraum>,
185    #[cfg_attr(feature = "serde", serde(rename = "zusatzAttribute"))]
186    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
187    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
188    pub zusatz_attribute: Option<Vec<ZusatzAttribut>>,
189    /// Unknown JSON fields captured during deserialization for round-trip preservation.
190    /// `None` when no unknown fields were present (zero heap allocation).
191    #[cfg_attr(feature = "json", serde(flatten))]
192    #[cfg_attr(
193        feature = "json",
194        serde(skip_serializing_if = "crate::json::ext_map_is_empty")
195    )]
196    #[cfg_attr(not(feature = "json"), serde(skip))]
197    #[cfg_attr(feature = "builder", builder(default, setter(skip)))]
198    #[doc(hidden)]
199    pub _additional: crate::LimitedExtensionMap,
200}
201impl Default for Tarifpreisblatt {
202    fn default() -> Self {
203        Self {
204            anbieter: Default::default(),
205            anbietername: Default::default(),
206            anwendung_von: Default::default(),
207            bemerkung: Default::default(),
208            berechnungsparameter: Default::default(),
209            bezeichnung: Default::default(),
210            energiemix: Default::default(),
211            id: Default::default(),
212            kundentypen: Default::default(),
213            preisgarantie: Default::default(),
214            preisstand: Default::default(),
215            registeranzahl: Default::default(),
216            sparte: Default::default(),
217            tarif_auf_abschlaege: Default::default(),
218            tarifeinschraenkung: Default::default(),
219            tarifmerkmale: Default::default(),
220            tarifpreise: Default::default(),
221            tariftyp: Default::default(),
222            typ: Some(BoTyp::Tarifpreisblatt),
223            version: Some("202607.1.0".to_owned()),
224            vertragskonditionen: Default::default(),
225            website: Default::default(),
226            zeitliche_gueltigkeit: Default::default(),
227            zusatz_attribute: Default::default(),
228            _additional: Default::default(),
229        }
230    }
231}
232impl Bo4eObject for Tarifpreisblatt {
233    type BoTyp = BoTyp;
234    fn bo_type(&self) -> BoTyp {
235        self.typ.unwrap_or(BoTyp::Tarifpreisblatt)
236    }
237    fn schema_version(&self) -> &'static str {
238        "202607.1.0"
239    }
240    fn schema_series(&self) -> &'static str {
241        "202607"
242    }
243}
244#[cfg(feature = "json")]
245impl crate::json::sealed::Sealed for Tarifpreisblatt {}
246#[cfg(feature = "json")]
247impl crate::json::Bo4eJsonExt for Tarifpreisblatt {}
248#[cfg(feature = "json")]
249impl crate::json::Bo4eExtensionData for Tarifpreisblatt {
250    fn extension_data(&self) -> &indexmap::IndexMap<String, serde_json::Value> {
251        self._additional
252            .as_map()
253            .unwrap_or(&crate::json::extension::EMPTY_EXTENSION_MAP)
254    }
255    fn has_extension_data(&self) -> bool {
256        !self._additional.is_empty()
257    }
258}
259#[cfg(feature = "json")]
260impl std::fmt::Display for Tarifpreisblatt {
261    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
262        match serde_json::to_string(self) {
263            Ok(json) => f.write_str(&json),
264            Err(e) => write!(f, "<Tarifpreisblatt: serialization error: {e}>"),
265        }
266    }
267}
268impl crate::Bo4eStrict for Tarifpreisblatt {
269    fn collect_unknown_enums(&self, path: &str, out: &mut Vec<String>) {
270        if let Some(v) = &self.anbieter {
271            crate::Bo4eStrict::collect_unknown_enums(
272                &**v,
273                &crate::strict::field_path(path, "anbieter"),
274                out,
275            );
276        }
277        if let Some(v) = &self.berechnungsparameter {
278            crate::Bo4eStrict::collect_unknown_enums(
279                v,
280                &crate::strict::field_path(path, "berechnungsparameter"),
281                out,
282            );
283        }
284        if let Some(v) = &self.energiemix {
285            crate::Bo4eStrict::collect_unknown_enums(
286                v,
287                &crate::strict::field_path(path, "energiemix"),
288                out,
289            );
290        }
291        if let Some(items) = &self.kundentypen {
292            let child = crate::strict::field_path(path, "kundentypen");
293            for (i, item) in items.iter().enumerate() {
294                crate::Bo4eStrict::collect_unknown_enums(
295                    item,
296                    &crate::strict::index_path(&child, i),
297                    out,
298                );
299            }
300        }
301        if let Some(v) = &self.preisgarantie {
302            crate::Bo4eStrict::collect_unknown_enums(
303                v,
304                &crate::strict::field_path(path, "preisgarantie"),
305                out,
306            );
307        }
308        if let Some(v) = &self.registeranzahl {
309            crate::Bo4eStrict::collect_unknown_enums(
310                v,
311                &crate::strict::field_path(path, "registeranzahl"),
312                out,
313            );
314        }
315        if let Some(v) = &self.sparte {
316            crate::Bo4eStrict::collect_unknown_enums(
317                v,
318                &crate::strict::field_path(path, "sparte"),
319                out,
320            );
321        }
322        if let Some(items) = &self.tarif_auf_abschlaege {
323            let child = crate::strict::field_path(path, "tarifAufAbschlaege");
324            for (i, item) in items.iter().enumerate() {
325                crate::Bo4eStrict::collect_unknown_enums(
326                    item,
327                    &crate::strict::index_path(&child, i),
328                    out,
329                );
330            }
331        }
332        if let Some(v) = &self.tarifeinschraenkung {
333            crate::Bo4eStrict::collect_unknown_enums(
334                v,
335                &crate::strict::field_path(path, "tarifeinschraenkung"),
336                out,
337            );
338        }
339        if let Some(items) = &self.tarifmerkmale {
340            let child = crate::strict::field_path(path, "tarifmerkmale");
341            for (i, item) in items.iter().enumerate() {
342                crate::Bo4eStrict::collect_unknown_enums(
343                    item,
344                    &crate::strict::index_path(&child, i),
345                    out,
346                );
347            }
348        }
349        if let Some(items) = &self.tarifpreise {
350            let child = crate::strict::field_path(path, "tarifpreise");
351            for (i, item) in items.iter().enumerate() {
352                crate::Bo4eStrict::collect_unknown_enums(
353                    item,
354                    &crate::strict::index_path(&child, i),
355                    out,
356                );
357            }
358        }
359        if let Some(v) = &self.tariftyp {
360            crate::Bo4eStrict::collect_unknown_enums(
361                v,
362                &crate::strict::field_path(path, "tariftyp"),
363                out,
364            );
365        }
366        if let Some(v) = &self.vertragskonditionen {
367            crate::Bo4eStrict::collect_unknown_enums(
368                v,
369                &crate::strict::field_path(path, "vertragskonditionen"),
370                out,
371            );
372        }
373        if let Some(v) = &self.zeitliche_gueltigkeit {
374            crate::Bo4eStrict::collect_unknown_enums(
375                v,
376                &crate::strict::field_path(path, "zeitlicheGueltigkeit"),
377                out,
378            );
379        }
380        if let Some(items) = &self.zusatz_attribute {
381            let child = crate::strict::field_path(path, "zusatzAttribute");
382            for (i, item) in items.iter().enumerate() {
383                crate::Bo4eStrict::collect_unknown_enums(
384                    item,
385                    &crate::strict::index_path(&child, i),
386                    out,
387                );
388            }
389        }
390    }
391}