use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub enum SubjectArea {
#[serde(rename = "ALLGEMEINER_INFORMATIONSAUSTAUSCH")]
GeneralInformationExchange,
#[serde(rename = "AN_UND_ABMELDUNG")]
RegistrationDeregistration,
#[serde(rename = "ANSPRECHPARTNER_ALLGEMEIN")]
GeneralContact,
#[serde(rename = "ANSPRECHPARTNER_BDEW_DVGW")]
BdewDvgwContact,
#[serde(rename = "ANSPRECHPARTNER_IT_TECHNIK")]
ItTechContact,
#[serde(rename = "BILANZIERUNG")]
Balancing,
#[serde(rename = "BILANZKREISKOORDINATOR")]
BalancingAreaCoordinator,
#[serde(rename = "BILANZKREISVERANTWORTLICHER")]
BalancingAreaResponsible,
#[serde(rename = "DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN")]
DataFormatsCertificatesEncryption,
#[serde(rename = "DEBITORENMANAGEMENT")]
DebtorManagement,
#[serde(rename = "DEMAND_SIDE_MANAGEMENT")]
DemandSideManagement,
#[serde(rename = "EDI_VEREINBARUNG")]
EdiAgreement,
#[serde(rename = "EDIFACT")]
Edifact,
#[serde(rename = "ENERGIEDATENMANAGEMENT")]
EnergyDataManagement,
#[serde(rename = "FAHRPLANMANAGEMENT")]
ScheduleManagement,
#[serde(rename = "ALOCAT")]
Alocat,
#[serde(rename = "APERAK")]
Aperak,
#[serde(rename = "CONTRL")]
Contrl,
#[serde(rename = "INVOIC")]
Invoic,
#[serde(rename = "MSCONS")]
Mscons,
#[serde(rename = "ORDERS")]
Orders,
#[serde(rename = "ORDERSP")]
Ordersp,
#[serde(rename = "REMADV")]
Remadv,
#[serde(rename = "UTILMD")]
Utilmd,
#[serde(rename = "GABI")]
GabiGas,
#[serde(rename = "GELI")]
GeliGas,
#[serde(rename = "GERAETERUECKGABE")]
DeviceReturn,
#[serde(rename = "GERAETEWECHSEL")]
DeviceChange,
#[serde(rename = "GPKE")]
Gpke,
#[serde(rename = "INBETRIEBNAHME")]
Commissioning,
#[serde(rename = "KAPAZITAETSMANAGEMENT")]
CapacityManagement,
#[serde(rename = "KLAERFAELLE")]
ClarificationCases,
#[serde(rename = "LASTGAENGE_RLM")]
LoadProfilesRlm,
#[serde(rename = "LIEFERANTENRAHMENVERTRAG")]
SupplierFrameworkContract,
#[serde(rename = "LIEFERANTENWECHSEL")]
SupplierSwitch,
#[serde(rename = "MABIS")]
Mabis,
#[serde(rename = "MAHNWESEN")]
Dunning,
#[serde(rename = "MARKTGEBIETSVERANTWORTLICHER")]
MarketAreaResponsible,
#[serde(rename = "MARKTKOMMUNIKATION")]
MarketCommunication,
#[serde(rename = "MEHR_MINDERMENGEN")]
MoreLessQuantities,
#[serde(rename = "MSB_MDL")]
MsbMdl,
#[serde(rename = "NETZABRECHNUNG")]
NetworkBilling,
#[serde(rename = "NETZENTGELTE")]
NetworkCharges,
#[serde(rename = "NETZMANAGEMENT")]
NetworkManagement,
#[serde(rename = "RECHT")]
Legal,
#[serde(rename = "REGULIERUNGSMANAGEMENT")]
RegulatoryManagement,
#[serde(rename = "REKLAMATIONEN")]
Complaints,
#[serde(rename = "SPERREN_ENTSPERREN_INKASSO")]
BlockingUnblockingCollection,
#[serde(rename = "STAMMDATEN")]
MasterData,
#[serde(rename = "STOERUNGSFAELLE")]
FaultCases,
#[serde(rename = "TECHNISCHE_FRAGEN")]
TechnicalQuestions,
#[serde(rename = "UMSTELLUNG_INVOIC")]
InvoicConversion,
#[serde(rename = "VERSCHLUESSELUNG_SIGNATUR")]
EncryptionSignature,
#[serde(rename = "VERTRAGSMANAGEMENT")]
ContractManagement,
#[serde(rename = "VERTRIEB")]
Sales,
#[serde(rename = "WIM")]
Wim,
#[serde(rename = "ZAEHLERSTAENDE_SLP")]
MeterReadingsSlp,
#[serde(rename = "ZAHLUNGSVERKEHR")]
PaymentTransactions,
#[serde(rename = "ZUORDNUNGSVEREINBARUNG")]
AssignmentAgreement,
#[serde(rename = "EINSPEISUNG")]
FeedIn,
#[serde(rename = "BEWEGUNGSDATEN")]
TransactionData,
}
impl SubjectArea {
pub fn german_name(&self) -> &'static str {
match self {
Self::GeneralInformationExchange => "Allgemeiner Informationsaustausch",
Self::RegistrationDeregistration => "An- und Abmeldung",
Self::GeneralContact => "Ansprechpartner Allgemein",
Self::BdewDvgwContact => "Ansprechpartner BDEW/DVGW",
Self::ItTechContact => "Ansprechpartner IT/Technik",
Self::Balancing => "Bilanzierung",
Self::BalancingAreaCoordinator => "Bilanzkreiskoordinator",
Self::BalancingAreaResponsible => "Bilanzkreisverantwortlicher",
Self::DataFormatsCertificatesEncryption => {
"Datenformate, Zertifikate, Verschlüsselungen"
}
Self::DebtorManagement => "Debitorenmanagement",
Self::DemandSideManagement => "Demand-Side-Management",
Self::EdiAgreement => "EDI-Vereinbarung",
Self::Edifact => "EDIFACT",
Self::EnergyDataManagement => "Energiedatenmanagement",
Self::ScheduleManagement => "Fahrplanmanagement",
Self::Alocat => "Format:ALOCAT",
Self::Aperak => "Format:APERAK",
Self::Contrl => "Format:CONTRL",
Self::Invoic => "Format:INVOIC",
Self::Mscons => "Format:MSCONS",
Self::Orders => "Format:ORDERS",
Self::Ordersp => "Format:ORDERSP",
Self::Remadv => "Format:REMADV",
Self::Utilmd => "Format:UTILMD",
Self::GabiGas => "GaBi Gas",
Self::GeliGas => "GeLi Gas",
Self::DeviceReturn => "Geräterückgabe",
Self::DeviceChange => "Gerätewechsel",
Self::Gpke => "GPKE",
Self::Commissioning => "Inbetriebnahme",
Self::CapacityManagement => "Kapazitätsmanagement",
Self::ClarificationCases => "Klärfälle",
Self::LoadProfilesRlm => "Lastgänge RLM",
Self::SupplierFrameworkContract => "Lieferantenrahmenvertrag",
Self::SupplierSwitch => "Lieferantenwechsel",
Self::Mabis => "MaBiS",
Self::Dunning => "Mahnwesen",
Self::MarketAreaResponsible => "Marktgebietsverantwortlicher",
Self::MarketCommunication => "Marktkommunikation",
Self::MoreLessQuantities => "Mehr-/Mindermengen",
Self::MsbMdl => "MSB - MDL",
Self::NetworkBilling => "Netzabrechnung",
Self::NetworkCharges => "Netzentgelte",
Self::NetworkManagement => "Netzmanagement",
Self::Legal => "Recht",
Self::RegulatoryManagement => "Regulierungsmanagement",
Self::Complaints => "Reklamationen",
Self::BlockingUnblockingCollection => "Sperren/Entsperren/Inkasso",
Self::MasterData => "Stammdaten",
Self::FaultCases => "Störungsfälle",
Self::TechnicalQuestions => "Technische Fragen",
Self::InvoicConversion => "Umstellung INVOIC",
Self::EncryptionSignature => "Verschlüsselung/Signatur",
Self::ContractManagement => "Vertragsmanagement",
Self::Sales => "Vertrieb",
Self::Wim => "WiM",
Self::MeterReadingsSlp => "Zählerstände SLP",
Self::PaymentTransactions => "Zahlungsverkehr",
Self::AssignmentAgreement => "Zuordnungsvereinbarung",
Self::FeedIn => "Einspeisung",
Self::TransactionData => "Bewegungsdaten",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serialize() {
assert_eq!(
serde_json::to_string(&SubjectArea::Balancing).unwrap(),
r#""BILANZIERUNG""#
);
assert_eq!(
serde_json::to_string(&SubjectArea::MasterData).unwrap(),
r#""STAMMDATEN""#
);
}
#[test]
fn test_deserialize() {
assert_eq!(
serde_json::from_str::<SubjectArea>(r#""MARKTKOMMUNIKATION""#).unwrap(),
SubjectArea::MarketCommunication
);
assert_eq!(
serde_json::from_str::<SubjectArea>(r#""VERTRIEB""#).unwrap(),
SubjectArea::Sales
);
}
#[test]
fn test_roundtrip() {
for area in [
SubjectArea::GeneralInformationExchange,
SubjectArea::Balancing,
SubjectArea::MarketCommunication,
SubjectArea::MasterData,
SubjectArea::Sales,
] {
let json = serde_json::to_string(&area).unwrap();
let parsed: SubjectArea = serde_json::from_str(&json).unwrap();
assert_eq!(area, parsed);
}
}
}