Skip to main content

rubo4e/generated/v202607/
preisblatt_hardware.rs

1use super::{
2    Bilanzierungsmethode, Bo4eObject, BoTyp, Dienstleistungstyp, Geraet, Marktteilnehmer,
3    Netzebene, Preisposition, Preisstatus, Sparte, Zeitraum, ZusatzAttribut,
4};
5#[derive(Debug, Clone, PartialEq)]
6#[cfg_attr(not(feature = "json"), derive(Eq, Hash))]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
9#[cfg_attr(feature = "validate", derive(garde::Validate))]
10#[cfg_attr(feature = "validate", garde(allow_unvalidated))]
11#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
12#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
13/// Variante des Preisblattmodells zur Abbildung der Preise für zusätzliche Hardware
14///
15/// > **Note:** [PreisblattHardware JSON Schema](https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/v202607.1.0/src/bo4e_schemas/bo/PreisblattHardware.json)
16pub struct PreisblattHardware {
17    /// Der Preis betriftt das hier angegebene Gerät, z.B. ein Tarifschaltgerät
18    #[cfg_attr(feature = "serde", serde(rename = "basisgeraet"))]
19    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
20    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
21    pub basisgeraet: Option<Box<Geraet>>,
22    /// Eine Bezeichnung für das Preisblatt
23    #[cfg_attr(feature = "serde", serde(rename = "bezeichnung"))]
24    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
25    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
26    pub bezeichnung: Option<String>,
27    /// Die Preise gelten für Marktlokationen der angebebenen Bilanzierungsmethode
28    #[cfg_attr(feature = "serde", serde(rename = "bilanzierungsmethode"))]
29    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
30    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
31    pub bilanzierungsmethode: Option<Bilanzierungsmethode>,
32    /// Der Zeitraum für den der Preis festgelegt ist
33    #[cfg_attr(feature = "serde", serde(rename = "gueltigkeit"))]
34    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
35    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
36    pub gueltigkeit: Option<Zeitraum>,
37    /// Der Netzbetreiber, der die Preise veröffentlicht hat
38    #[cfg_attr(feature = "serde", serde(rename = "herausgeber"))]
39    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
40    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
41    pub herausgeber: Option<Box<Marktteilnehmer>>,
42    /// Eine generische ID, die für eigene Zwecke genutzt werden kann.
43    /// Z.B. könnten hier UUIDs aus einer Datenbank stehen oder URLs zu einem Backend-System.
44    #[cfg_attr(feature = "serde", serde(rename = "_id"))]
45    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
46    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
47    pub id: Option<String>,
48    /// Im Preis sind die hier angegebenen Dienstleistungen enthalten, z.B. Jährliche Ablesung
49    #[cfg_attr(feature = "serde", serde(rename = "inklusiveDienstleistungen"))]
50    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
51    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
52    pub inklusive_dienstleistungen: Option<Vec<Dienstleistungstyp>>,
53    /// Im Preis sind die hier angegebenen Geräte mit enthalten, z.B. ein Wandler
54    #[cfg_attr(feature = "serde", serde(rename = "inklusiveGeraete"))]
55    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
56    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
57    pub inklusive_geraete: Option<Vec<Box<Geraet>>>,
58    /// Die Preise gelten für Messlokationen in der angebebenen Netzebene
59    #[cfg_attr(feature = "serde", serde(rename = "messebene"))]
60    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
61    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
62    pub messebene: Option<Netzebene>,
63    /// Die einzelnen Positionen, die mit dem Preisblatt abgerechnet werden können. Z.B. Arbeitspreis, Grundpreis etc
64    #[cfg_attr(feature = "serde", serde(rename = "preispositionen"))]
65    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
66    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
67    pub preispositionen: Option<Vec<Preisposition>>,
68    /// Merkmal, das anzeigt, ob es sich um vorläufige oder endgültige Preise handelt
69    #[cfg_attr(feature = "serde", serde(rename = "preisstatus"))]
70    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
71    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
72    pub preisstatus: Option<Preisstatus>,
73    /// Preisblatt gilt für angegebene Sparte
74    #[cfg_attr(feature = "serde", serde(rename = "sparte"))]
75    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
76    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
77    pub sparte: Option<Sparte>,
78    /// BO4E type discriminant — always `BoTyp::PreisblattHardware` for this struct.
79    #[cfg_attr(feature = "serde", serde(rename = "_typ"))]
80    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
81    #[cfg_attr(
82        feature = "builder",
83        builder(default = Some(BoTyp::PreisblattHardware), setter(skip))
84    )]
85    pub typ: Option<BoTyp>,
86    /// Version der BO-Struktur aka "fachliche Versionierung"
87    #[cfg_attr(feature = "serde", serde(rename = "_version"))]
88    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
89    #[cfg_attr(
90        feature = "builder",
91        builder(default = Some("202607.1.0".to_owned()), setter(into))
92    )]
93    pub version: Option<String>,
94    #[cfg_attr(feature = "serde", serde(rename = "zusatzAttribute"))]
95    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
96    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
97    pub zusatz_attribute: Option<Vec<ZusatzAttribut>>,
98    /// Unknown JSON fields captured during deserialization for round-trip preservation.
99    /// `None` when no unknown fields were present (zero heap allocation).
100    #[cfg_attr(feature = "json", serde(flatten))]
101    #[cfg_attr(
102        feature = "json",
103        serde(skip_serializing_if = "crate::json::ext_map_is_empty")
104    )]
105    #[cfg_attr(not(feature = "json"), serde(skip))]
106    #[cfg_attr(feature = "builder", builder(default, setter(skip)))]
107    #[doc(hidden)]
108    pub _additional: crate::LimitedExtensionMap,
109}
110impl Default for PreisblattHardware {
111    fn default() -> Self {
112        Self {
113            basisgeraet: Default::default(),
114            bezeichnung: Default::default(),
115            bilanzierungsmethode: Default::default(),
116            gueltigkeit: Default::default(),
117            herausgeber: Default::default(),
118            id: Default::default(),
119            inklusive_dienstleistungen: Default::default(),
120            inklusive_geraete: Default::default(),
121            messebene: Default::default(),
122            preispositionen: Default::default(),
123            preisstatus: Default::default(),
124            sparte: Default::default(),
125            typ: Some(BoTyp::PreisblattHardware),
126            version: Some("202607.1.0".to_owned()),
127            zusatz_attribute: Default::default(),
128            _additional: Default::default(),
129        }
130    }
131}
132impl Bo4eObject for PreisblattHardware {
133    type BoTyp = BoTyp;
134    fn bo_type(&self) -> BoTyp {
135        self.typ.unwrap_or(BoTyp::PreisblattHardware)
136    }
137    fn schema_version(&self) -> &'static str {
138        "202607.1.0"
139    }
140    fn schema_series(&self) -> &'static str {
141        "202607"
142    }
143}
144#[cfg(feature = "json")]
145impl crate::json::sealed::Sealed for PreisblattHardware {}
146#[cfg(feature = "json")]
147impl crate::json::Bo4eJsonExt for PreisblattHardware {}
148#[cfg(feature = "json")]
149impl crate::json::Bo4eExtensionData for PreisblattHardware {
150    fn extension_data(&self) -> &indexmap::IndexMap<String, serde_json::Value> {
151        self._additional
152            .as_map()
153            .unwrap_or(&crate::json::extension::EMPTY_EXTENSION_MAP)
154    }
155    fn has_extension_data(&self) -> bool {
156        !self._additional.is_empty()
157    }
158}
159#[cfg(feature = "json")]
160impl std::fmt::Display for PreisblattHardware {
161    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
162        match serde_json::to_string(self) {
163            Ok(json) => f.write_str(&json),
164            Err(e) => write!(f, "<PreisblattHardware: serialization error: {e}>"),
165        }
166    }
167}
168impl crate::Bo4eStrict for PreisblattHardware {
169    fn collect_unknown_enums(&self, path: &str, out: &mut Vec<String>) {
170        if let Some(v) = &self.basisgeraet {
171            crate::Bo4eStrict::collect_unknown_enums(
172                &**v,
173                &crate::strict::field_path(path, "basisgeraet"),
174                out,
175            );
176        }
177        if let Some(v) = &self.bilanzierungsmethode {
178            crate::Bo4eStrict::collect_unknown_enums(
179                v,
180                &crate::strict::field_path(path, "bilanzierungsmethode"),
181                out,
182            );
183        }
184        if let Some(v) = &self.gueltigkeit {
185            crate::Bo4eStrict::collect_unknown_enums(
186                v,
187                &crate::strict::field_path(path, "gueltigkeit"),
188                out,
189            );
190        }
191        if let Some(v) = &self.herausgeber {
192            crate::Bo4eStrict::collect_unknown_enums(
193                &**v,
194                &crate::strict::field_path(path, "herausgeber"),
195                out,
196            );
197        }
198        if let Some(items) = &self.inklusive_dienstleistungen {
199            let child = crate::strict::field_path(path, "inklusiveDienstleistungen");
200            for (i, item) in items.iter().enumerate() {
201                crate::Bo4eStrict::collect_unknown_enums(
202                    item,
203                    &crate::strict::index_path(&child, i),
204                    out,
205                );
206            }
207        }
208        if let Some(items) = &self.inklusive_geraete {
209            let child = crate::strict::field_path(path, "inklusiveGeraete");
210            for (i, item) in items.iter().enumerate() {
211                crate::Bo4eStrict::collect_unknown_enums(
212                    &**item,
213                    &crate::strict::index_path(&child, i),
214                    out,
215                );
216            }
217        }
218        if let Some(v) = &self.messebene {
219            crate::Bo4eStrict::collect_unknown_enums(
220                v,
221                &crate::strict::field_path(path, "messebene"),
222                out,
223            );
224        }
225        if let Some(items) = &self.preispositionen {
226            let child = crate::strict::field_path(path, "preispositionen");
227            for (i, item) in items.iter().enumerate() {
228                crate::Bo4eStrict::collect_unknown_enums(
229                    item,
230                    &crate::strict::index_path(&child, i),
231                    out,
232                );
233            }
234        }
235        if let Some(v) = &self.preisstatus {
236            crate::Bo4eStrict::collect_unknown_enums(
237                v,
238                &crate::strict::field_path(path, "preisstatus"),
239                out,
240            );
241        }
242        if let Some(v) = &self.sparte {
243            crate::Bo4eStrict::collect_unknown_enums(
244                v,
245                &crate::strict::field_path(path, "sparte"),
246                out,
247            );
248        }
249        if let Some(items) = &self.zusatz_attribute {
250            let child = crate::strict::field_path(path, "zusatzAttribute");
251            for (i, item) in items.iter().enumerate() {
252                crate::Bo4eStrict::collect_unknown_enums(
253                    item,
254                    &crate::strict::index_path(&child, i),
255                    out,
256                );
257            }
258        }
259    }
260}