Skip to main content

rubo4e/generated/v202607/
marktlokation.rs

1use super::{
2    Adresse, Bilanzierungsmethode, Bo4eObject, BoTyp, Energiemenge, Energierichtung, Gasqualitaet,
3    Gebiettyp, Geokoordinaten, Geschaeftspartner, Katasteradresse, Kundentyp, Lokationszuordnung,
4    Netzebene, Sparte, Verbrauchsart, Zaehlwerk, ZusatzAttribut,
5};
6#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(not(feature = "json"), derive(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#[cfg_attr(
15    all(feature = "validate", feature = "versioned"),
16    garde(custom(crate::validation::v202607::validate_marktlokation))
17)]
18/// Object containing information about a Marktlokation
19///
20/// > **Note:** [Marktlokation JSON Schema](https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/v202607.0.0/src/bo4e_schemas/bo/Marktlokation.json)
21pub struct Marktlokation {
22    /// Bilanzierungsgebiet, dem das Netzgebiet zugeordnet ist - im Falle eines Strom Netzes
23    #[cfg_attr(feature = "serde", serde(rename = "bilanzierungsgebiet"))]
24    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
25    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
26    pub bilanzierungsgebiet: Option<String>,
27    /// Die Bilanzierungsmethode, RLM oder SLP
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    /// Geschäftspartner, dem diese Marktlokation gehört
33    #[cfg_attr(feature = "serde", serde(rename = "endkunde"))]
34    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
35    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
36    pub endkunde: Option<Box<Geschaeftspartner>>,
37    /// Kennzeichnung, ob Energie eingespeist oder entnommen (ausgespeist) wird
38    #[cfg_attr(feature = "serde", serde(rename = "energierichtung"))]
39    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
40    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
41    pub energierichtung: Option<Energierichtung>,
42    /// Die Gasqualität in diesem Netzgebiet. H-Gas oder L-Gas. Im Falle eines Gas-Netzes
43    #[cfg_attr(feature = "serde", serde(rename = "gasqualitaet"))]
44    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
45    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
46    pub gasqualitaet: Option<Gasqualitaet>,
47    /// Typ des Netzgebietes, z.B. Verteilnetz
48    #[cfg_attr(feature = "serde", serde(rename = "gebietstyp"))]
49    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
50    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
51    pub gebietstyp: Option<Gebiettyp>,
52    /// Alternativ zu einer postalischen Adresse kann hier ein Ort mittels Geokoordinaten angegeben werden
53    /// (z.B. zur Identifikation von Sendemasten).
54    #[cfg_attr(feature = "serde", serde(rename = "geoadresse"))]
55    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
56    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
57    pub geoadresse: Option<Geokoordinaten>,
58    /// Codenummer des Grundversorgers, der für diese Marktlokation zuständig ist
59    #[cfg_attr(feature = "serde", serde(rename = "grundversorgercodenr"))]
60    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
61    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
62    #[cfg_attr(feature = "validate", garde(dive))]
63    pub grundversorgercodenr: Option<crate::identifiers::MarktpartnerId>,
64    /// Eine generische ID, die für eigene Zwecke genutzt werden kann.
65    /// Z.B. könnten hier UUIDs aus einer Datenbank stehen oder URLs zu einem Backend-System.
66    #[cfg_attr(feature = "serde", serde(rename = "_id"))]
67    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
68    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
69    pub id: Option<String>,
70    /// Alternativ zu einer postalischen Adresse und Geokoordinaten kann hier eine Ortsangabe mittels Gemarkung und
71    /// Flurstück erfolgen.
72    #[cfg_attr(feature = "serde", serde(rename = "katasterinformation"))]
73    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
74    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
75    pub katasterinformation: Option<Katasteradresse>,
76    /// Kundengruppen der Marktlokation
77    #[cfg_attr(feature = "serde", serde(rename = "kundengruppen"))]
78    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
79    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
80    pub kundengruppen: Option<Vec<Kundentyp>>,
81    /// Die Adresse, an der die Energie-Lieferung oder -Einspeisung erfolgt
82    #[cfg_attr(feature = "serde", serde(rename = "lokationsadresse"))]
83    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
84    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
85    pub lokationsadresse: Option<Adresse>,
86    /// Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.
87    #[cfg_attr(feature = "serde", serde(rename = "lokationsbuendelObjektcode"))]
88    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
89    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
90    pub lokationsbuendel_objektcode: Option<String>,
91    /// Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben
92    #[cfg_attr(feature = "serde", serde(rename = "lokationszuordnungen"))]
93    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
94    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
95    pub lokationszuordnungen: Option<Vec<Box<Lokationszuordnung>>>,
96    /// für Gas. Code vom EIC, <https://www.entsog.eu/data/data-portal/codes-list>
97    #[cfg_attr(feature = "serde", serde(rename = "marktgebiet"))]
98    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
99    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
100    #[cfg_attr(feature = "validate", garde(dive))]
101    pub marktgebiet: Option<crate::identifiers::EicCode>,
102    /// Identifikationsnummer einer Marktlokation, an der Energie entweder verbraucht, oder erzeugt wird.
103    #[cfg_attr(feature = "serde", serde(rename = "marktlokationsId"))]
104    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
105    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
106    #[cfg_attr(feature = "validate", garde(dive))]
107    pub marktlokations_id: Option<crate::identifiers::MaloId>,
108    /// Codenummer des Netzbetreibers, an dessen Netz diese Marktlokation angeschlossen ist.
109    #[cfg_attr(feature = "serde", serde(rename = "netzbetreibercodenr"))]
110    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
111    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
112    #[cfg_attr(feature = "validate", garde(dive))]
113    pub netzbetreibercodenr: Option<crate::identifiers::MarktpartnerId>,
114    /// Netzebene, in der der Bezug der Energie erfolgt.
115    /// Bei Strom Spannungsebene der Lieferung, bei Gas Druckstufe.
116    /// Beispiel Strom: Niederspannung Beispiel Gas: Niederdruck.
117    #[cfg_attr(feature = "serde", serde(rename = "netzebene"))]
118    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
119    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
120    pub netzebene: Option<Netzebene>,
121    /// Die ID des Gebietes in der ene't-Datenbank
122    #[cfg_attr(feature = "serde", serde(rename = "netzgebietsnr"))]
123    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
124    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
125    pub netzgebietsnr: Option<String>,
126    /// für Strom. Code vom EIC, <https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/>
127    #[cfg_attr(feature = "serde", serde(rename = "regelzone"))]
128    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
129    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
130    #[cfg_attr(feature = "validate", garde(dive))]
131    pub regelzone: Option<crate::identifiers::EicCode>,
132    /// Sparte der Marktlokation, z.B. Gas oder Strom
133    #[cfg_attr(feature = "serde", serde(rename = "sparte"))]
134    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
135    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
136    pub sparte: Option<Sparte>,
137    /// BO type identifier — always `BoTyp::Marktlokation` for this struct.
138    #[cfg_attr(feature = "serde", serde(rename = "_typ"))]
139    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
140    #[cfg_attr(
141        feature = "builder",
142        builder(default = Some(BoTyp::Marktlokation), setter(skip))
143    )]
144    pub typ: Option<BoTyp>,
145    /// Verbrauchsart der Marktlokation.
146    #[cfg_attr(feature = "serde", serde(rename = "verbrauchsart"))]
147    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
148    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
149    pub verbrauchsart: Option<Verbrauchsart>,
150    #[cfg_attr(feature = "serde", serde(rename = "verbrauchsmengen"))]
151    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
152    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
153    pub verbrauchsmengen: Option<Vec<Box<Energiemenge>>>,
154    /// Version der BO-Struktur aka "fachliche Versionierung"
155    #[cfg_attr(feature = "serde", serde(rename = "_version"))]
156    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
157    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
158    pub version: Option<String>,
159    #[cfg_attr(feature = "serde", serde(rename = "zaehlwerke"))]
160    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
161    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
162    pub zaehlwerke: Option<Vec<Zaehlwerk>>,
163    #[cfg_attr(
164        feature = "serde",
165        serde(rename = "zaehlwerkeDerBeteiligtenMarktrolle")
166    )]
167    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
168    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
169    pub zaehlwerke_der_beteiligten_marktrolle: Option<Vec<Zaehlwerk>>,
170    #[cfg_attr(feature = "serde", serde(rename = "zusatzAttribute"))]
171    #[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
172    #[cfg_attr(feature = "builder", builder(default, setter(into)))]
173    pub zusatz_attribute: Option<Vec<ZusatzAttribut>>,
174    /// Unknown JSON fields captured during deserialization for round-trip preservation.
175    /// `None` when no unknown fields were present (zero heap allocation).
176    #[cfg_attr(feature = "json", serde(flatten))]
177    #[cfg_attr(
178        feature = "json",
179        serde(skip_serializing_if = "crate::json::ext_map_is_empty")
180    )]
181    #[cfg_attr(not(feature = "json"), serde(skip))]
182    #[cfg_attr(feature = "builder", builder(default, setter(skip)))]
183    #[doc(hidden)]
184    pub _additional: crate::LimitedExtensionMap,
185}
186impl Default for Marktlokation {
187    fn default() -> Self {
188        Self {
189            typ: Some(BoTyp::Marktlokation),
190            bilanzierungsgebiet: Default::default(),
191            bilanzierungsmethode: Default::default(),
192            endkunde: Default::default(),
193            energierichtung: Default::default(),
194            gasqualitaet: Default::default(),
195            gebietstyp: Default::default(),
196            geoadresse: Default::default(),
197            grundversorgercodenr: Default::default(),
198            id: Default::default(),
199            katasterinformation: Default::default(),
200            kundengruppen: Default::default(),
201            lokationsadresse: Default::default(),
202            lokationsbuendel_objektcode: Default::default(),
203            lokationszuordnungen: Default::default(),
204            marktgebiet: Default::default(),
205            marktlokations_id: Default::default(),
206            netzbetreibercodenr: Default::default(),
207            netzebene: Default::default(),
208            netzgebietsnr: Default::default(),
209            regelzone: Default::default(),
210            sparte: Default::default(),
211            verbrauchsart: Default::default(),
212            verbrauchsmengen: Default::default(),
213            version: Default::default(),
214            zaehlwerke: Default::default(),
215            zaehlwerke_der_beteiligten_marktrolle: Default::default(),
216            zusatz_attribute: Default::default(),
217            _additional: Default::default(),
218        }
219    }
220}
221impl Bo4eObject for Marktlokation {
222    type BoTyp = BoTyp;
223    fn bo_type(&self) -> BoTyp {
224        self.typ.unwrap_or(BoTyp::Marktlokation)
225    }
226    fn schema_version(&self) -> &'static str {
227        "v202607.0.0"
228    }
229}
230#[cfg(feature = "json")]
231impl crate::json::sealed::Sealed for Marktlokation {}
232#[cfg(feature = "json")]
233impl crate::json::Bo4eJsonExt for Marktlokation {}
234#[cfg(feature = "json")]
235impl crate::json::Bo4eExtensionData for Marktlokation {
236    fn extension_data(&self) -> &indexmap::IndexMap<String, serde_json::Value> {
237        self._additional
238            .as_map()
239            .unwrap_or(&crate::json::extension::EMPTY_EXTENSION_MAP)
240    }
241    fn has_extension_data(&self) -> bool {
242        !self._additional.is_empty()
243    }
244}
245#[cfg(feature = "json")]
246impl std::fmt::Display for Marktlokation {
247    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
248        match serde_json::to_string(self) {
249            Ok(json) => f.write_str(&json),
250            Err(e) => write!(f, "<Marktlokation: serialization error: {e}>"),
251        }
252    }
253}