Skip to main content

bo4e_core/enums/
subject_area.rs

1//! Subject area (Themengebiet) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Subject area classification for assigning contacts or responsibilities.
6///
7/// German: Themengebiet
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
10#[cfg_attr(feature = "json-schema", schemars(rename = "Themengebiet"))]
11#[non_exhaustive]
12pub enum SubjectArea {
13    /// General information exchange (Allgemeiner Informationsaustausch)
14    #[serde(rename = "ALLGEMEINER_INFORMATIONSAUSTAUSCH")]
15    GeneralInformationExchange,
16
17    /// Registration and deregistration (An- und Abmeldung)
18    #[serde(rename = "AN_UND_ABMELDUNG")]
19    RegistrationDeregistration,
20
21    /// General contact person (Ansprechpartner Allgemein)
22    #[serde(rename = "ANSPRECHPARTNER_ALLGEMEIN")]
23    GeneralContact,
24
25    /// BDEW/DVGW contact person (Ansprechpartner BDEW/DVGW)
26    #[serde(rename = "ANSPRECHPARTNER_BDEW_DVGW")]
27    BdewDvgwContact,
28
29    /// IT/Technical contact person (Ansprechpartner IT/Technik)
30    #[serde(rename = "ANSPRECHPARTNER_IT_TECHNIK")]
31    ItTechContact,
32
33    /// Balancing (Bilanzierung)
34    #[serde(rename = "BILANZIERUNG")]
35    Balancing,
36
37    /// Balancing area coordinator (Bilanzkreiskoordinator)
38    #[serde(rename = "BILANZKREISKOORDINATOR")]
39    BalancingAreaCoordinator,
40
41    /// Balancing area responsible (Bilanzkreisverantwortlicher)
42    #[serde(rename = "BILANZKREISVERANTWORTLICHER")]
43    BalancingAreaResponsible,
44
45    /// Data formats, certificates, encryption (Datenformate, Zertifikate, Verschlüsselungen)
46    #[serde(rename = "DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN")]
47    DataFormatsCertificatesEncryption,
48
49    /// Debtor management (Debitorenmanagement)
50    #[serde(rename = "DEBITORENMANAGEMENT")]
51    DebtorManagement,
52
53    /// Demand-Side-Management
54    #[serde(rename = "DEMAND_SIDE_MANAGEMENT")]
55    DemandSideManagement,
56
57    /// EDI agreement (EDI-Vereinbarung)
58    #[serde(rename = "EDI_VEREINBARUNG")]
59    EdiAgreement,
60
61    /// EDIFACT format
62    #[serde(rename = "EDIFACT")]
63    Edifact,
64
65    /// Energy data management (Energiedatenmanagement)
66    #[serde(rename = "ENERGIEDATENMANAGEMENT")]
67    EnergyDataManagement,
68
69    /// Schedule management (Fahrplanmanagement)
70    #[serde(rename = "FAHRPLANMANAGEMENT")]
71    ScheduleManagement,
72
73    /// Format: ALOCAT
74    #[serde(rename = "ALOCAT")]
75    Alocat,
76
77    /// Format: APERAK
78    #[serde(rename = "APERAK")]
79    Aperak,
80
81    /// Format: CONTRL
82    #[serde(rename = "CONTRL")]
83    Contrl,
84
85    /// Format: INVOIC
86    #[serde(rename = "INVOIC")]
87    Invoic,
88
89    /// Format: MSCONS
90    #[serde(rename = "MSCONS")]
91    Mscons,
92
93    /// Format: ORDERS
94    #[serde(rename = "ORDERS")]
95    Orders,
96
97    /// Format: ORDERSP
98    #[serde(rename = "ORDERSP")]
99    Ordersp,
100
101    /// Format: REMADV
102    #[serde(rename = "REMADV")]
103    Remadv,
104
105    /// Format: UTILMD
106    #[serde(rename = "UTILMD")]
107    Utilmd,
108
109    /// GaBi Gas
110    #[serde(rename = "GABI")]
111    GabiGas,
112
113    /// GeLi Gas
114    #[serde(rename = "GELI")]
115    GeliGas,
116
117    /// Device return (Geräterückgabe)
118    #[serde(rename = "GERAETERUECKGABE")]
119    DeviceReturn,
120
121    /// Device change (Gerätewechsel)
122    #[serde(rename = "GERAETEWECHSEL")]
123    DeviceChange,
124
125    /// GPKE (Geschäftsprozesse zur Kundenbelieferung mit Elektrizität)
126    #[serde(rename = "GPKE")]
127    Gpke,
128
129    /// Commissioning (Inbetriebnahme)
130    #[serde(rename = "INBETRIEBNAHME")]
131    Commissioning,
132
133    /// Capacity management (Kapazitätsmanagement)
134    #[serde(rename = "KAPAZITAETSMANAGEMENT")]
135    CapacityManagement,
136
137    /// Clarification cases (Klärfälle)
138    #[serde(rename = "KLAERFAELLE")]
139    ClarificationCases,
140
141    /// Load profiles RLM (Lastgänge RLM)
142    #[serde(rename = "LASTGAENGE_RLM")]
143    LoadProfilesRlm,
144
145    /// Supplier framework contract (Lieferantenrahmenvertrag)
146    #[serde(rename = "LIEFERANTENRAHMENVERTRAG")]
147    SupplierFrameworkContract,
148
149    /// Supplier switch (Lieferantenwechsel)
150    #[serde(rename = "LIEFERANTENWECHSEL")]
151    SupplierSwitch,
152
153    /// MaBiS (Marktregeln für Bilanzkreisabrechnung Strom)
154    #[serde(rename = "MABIS")]
155    Mabis,
156
157    /// Dunning (Mahnwesen)
158    #[serde(rename = "MAHNWESEN")]
159    Dunning,
160
161    /// Market area responsible (Marktgebietsverantwortlicher)
162    #[serde(rename = "MARKTGEBIETSVERANTWORTLICHER")]
163    MarketAreaResponsible,
164
165    /// Market communication (Marktkommunikation)
166    #[serde(rename = "MARKTKOMMUNIKATION")]
167    MarketCommunication,
168
169    /// More/less quantities (Mehr-/Mindermengen)
170    #[serde(rename = "MEHR_MINDERMENGEN")]
171    MoreLessQuantities,
172
173    /// MSB - MDL
174    #[serde(rename = "MSB_MDL")]
175    MsbMdl,
176
177    /// Network billing (Netzabrechnung)
178    #[serde(rename = "NETZABRECHNUNG")]
179    NetworkBilling,
180
181    /// Network charges (Netzentgelte)
182    #[serde(rename = "NETZENTGELTE")]
183    NetworkCharges,
184
185    /// Network management (Netzmanagement)
186    #[serde(rename = "NETZMANAGEMENT")]
187    NetworkManagement,
188
189    /// Legal (Recht)
190    #[serde(rename = "RECHT")]
191    Legal,
192
193    /// Regulatory management (Regulierungsmanagement)
194    #[serde(rename = "REGULIERUNGSMANAGEMENT")]
195    RegulatoryManagement,
196
197    /// Complaints (Reklamationen)
198    #[serde(rename = "REKLAMATIONEN")]
199    Complaints,
200
201    /// Blocking/unblocking/collection (Sperren/Entsperren/Inkasso)
202    #[serde(rename = "SPERREN_ENTSPERREN_INKASSO")]
203    BlockingUnblockingCollection,
204
205    /// Master data (Stammdaten)
206    #[serde(rename = "STAMMDATEN")]
207    MasterData,
208
209    /// Fault cases (Störungsfälle)
210    #[serde(rename = "STOERUNGSFAELLE")]
211    FaultCases,
212
213    /// Technical questions (Technische Fragen)
214    #[serde(rename = "TECHNISCHE_FRAGEN")]
215    TechnicalQuestions,
216
217    /// INVOIC conversion (Umstellung INVOIC)
218    #[serde(rename = "UMSTELLUNG_INVOIC")]
219    InvoicConversion,
220
221    /// Encryption/Signature (Verschlüsselung/Signatur)
222    #[serde(rename = "VERSCHLUESSELUNG_SIGNATUR")]
223    EncryptionSignature,
224
225    /// Contract management (Vertragsmanagement)
226    #[serde(rename = "VERTRAGSMANAGEMENT")]
227    ContractManagement,
228
229    /// Sales (Vertrieb)
230    #[serde(rename = "VERTRIEB")]
231    Sales,
232
233    /// WiM (Wechselprozesse im Messwesen)
234    #[serde(rename = "WIM")]
235    Wim,
236
237    /// Meter readings SLP (Zählerstände SLP)
238    #[serde(rename = "ZAEHLERSTAENDE_SLP")]
239    MeterReadingsSlp,
240
241    /// Payment transactions (Zahlungsverkehr)
242    #[serde(rename = "ZAHLUNGSVERKEHR")]
243    PaymentTransactions,
244
245    /// Assignment agreement (Zuordnungsvereinbarung)
246    #[serde(rename = "ZUORDNUNGSVEREINBARUNG")]
247    AssignmentAgreement,
248
249    /// Feed-in (Einspeisung)
250    #[serde(rename = "EINSPEISUNG")]
251    FeedIn,
252
253    /// Transaction data (Bewegungsdaten)
254    #[serde(rename = "BEWEGUNGSDATEN")]
255    TransactionData,
256}
257
258impl SubjectArea {
259    /// Returns the German name.
260    pub fn german_name(&self) -> &'static str {
261        match self {
262            Self::GeneralInformationExchange => "Allgemeiner Informationsaustausch",
263            Self::RegistrationDeregistration => "An- und Abmeldung",
264            Self::GeneralContact => "Ansprechpartner Allgemein",
265            Self::BdewDvgwContact => "Ansprechpartner BDEW/DVGW",
266            Self::ItTechContact => "Ansprechpartner IT/Technik",
267            Self::Balancing => "Bilanzierung",
268            Self::BalancingAreaCoordinator => "Bilanzkreiskoordinator",
269            Self::BalancingAreaResponsible => "Bilanzkreisverantwortlicher",
270            Self::DataFormatsCertificatesEncryption => {
271                "Datenformate, Zertifikate, Verschlüsselungen"
272            }
273            Self::DebtorManagement => "Debitorenmanagement",
274            Self::DemandSideManagement => "Demand-Side-Management",
275            Self::EdiAgreement => "EDI-Vereinbarung",
276            Self::Edifact => "EDIFACT",
277            Self::EnergyDataManagement => "Energiedatenmanagement",
278            Self::ScheduleManagement => "Fahrplanmanagement",
279            Self::Alocat => "Format:ALOCAT",
280            Self::Aperak => "Format:APERAK",
281            Self::Contrl => "Format:CONTRL",
282            Self::Invoic => "Format:INVOIC",
283            Self::Mscons => "Format:MSCONS",
284            Self::Orders => "Format:ORDERS",
285            Self::Ordersp => "Format:ORDERSP",
286            Self::Remadv => "Format:REMADV",
287            Self::Utilmd => "Format:UTILMD",
288            Self::GabiGas => "GaBi Gas",
289            Self::GeliGas => "GeLi Gas",
290            Self::DeviceReturn => "Geräterückgabe",
291            Self::DeviceChange => "Gerätewechsel",
292            Self::Gpke => "GPKE",
293            Self::Commissioning => "Inbetriebnahme",
294            Self::CapacityManagement => "Kapazitätsmanagement",
295            Self::ClarificationCases => "Klärfälle",
296            Self::LoadProfilesRlm => "Lastgänge RLM",
297            Self::SupplierFrameworkContract => "Lieferantenrahmenvertrag",
298            Self::SupplierSwitch => "Lieferantenwechsel",
299            Self::Mabis => "MaBiS",
300            Self::Dunning => "Mahnwesen",
301            Self::MarketAreaResponsible => "Marktgebietsverantwortlicher",
302            Self::MarketCommunication => "Marktkommunikation",
303            Self::MoreLessQuantities => "Mehr-/Mindermengen",
304            Self::MsbMdl => "MSB - MDL",
305            Self::NetworkBilling => "Netzabrechnung",
306            Self::NetworkCharges => "Netzentgelte",
307            Self::NetworkManagement => "Netzmanagement",
308            Self::Legal => "Recht",
309            Self::RegulatoryManagement => "Regulierungsmanagement",
310            Self::Complaints => "Reklamationen",
311            Self::BlockingUnblockingCollection => "Sperren/Entsperren/Inkasso",
312            Self::MasterData => "Stammdaten",
313            Self::FaultCases => "Störungsfälle",
314            Self::TechnicalQuestions => "Technische Fragen",
315            Self::InvoicConversion => "Umstellung INVOIC",
316            Self::EncryptionSignature => "Verschlüsselung/Signatur",
317            Self::ContractManagement => "Vertragsmanagement",
318            Self::Sales => "Vertrieb",
319            Self::Wim => "WiM",
320            Self::MeterReadingsSlp => "Zählerstände SLP",
321            Self::PaymentTransactions => "Zahlungsverkehr",
322            Self::AssignmentAgreement => "Zuordnungsvereinbarung",
323            Self::FeedIn => "Einspeisung",
324            Self::TransactionData => "Bewegungsdaten",
325        }
326    }
327}
328
329#[cfg(test)]
330mod tests {
331    use super::*;
332
333    #[test]
334    fn test_serialize() {
335        assert_eq!(
336            serde_json::to_string(&SubjectArea::Balancing).unwrap(),
337            r#""BILANZIERUNG""#
338        );
339        assert_eq!(
340            serde_json::to_string(&SubjectArea::MasterData).unwrap(),
341            r#""STAMMDATEN""#
342        );
343    }
344
345    #[test]
346    fn test_deserialize() {
347        assert_eq!(
348            serde_json::from_str::<SubjectArea>(r#""MARKTKOMMUNIKATION""#).unwrap(),
349            SubjectArea::MarketCommunication
350        );
351        assert_eq!(
352            serde_json::from_str::<SubjectArea>(r#""VERTRIEB""#).unwrap(),
353            SubjectArea::Sales
354        );
355    }
356
357    #[test]
358    fn test_roundtrip() {
359        for area in [
360            SubjectArea::GeneralInformationExchange,
361            SubjectArea::Balancing,
362            SubjectArea::MarketCommunication,
363            SubjectArea::MasterData,
364            SubjectArea::Sales,
365        ] {
366            let json = serde_json::to_string(&area).unwrap();
367            let parsed: SubjectArea = serde_json::from_str(&json).unwrap();
368            assert_eq!(area, parsed);
369        }
370    }
371}