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