diff --git a/BO4E.Extensions/BO4E.Extensions.csproj b/BO4E.Extensions/BO4E.Extensions.csproj index 198d361a..a4f541a2 100644 --- a/BO4E.Extensions/BO4E.Extensions.csproj +++ b/BO4E.Extensions/BO4E.Extensions.csproj @@ -30,7 +30,9 @@ - + + + True diff --git a/BO4E.Reporting/Report.cs b/BO4E.Reporting/Report.cs index 32a25160..5278af0f 100644 --- a/BO4E.Reporting/Report.cs +++ b/BO4E.Reporting/Report.cs @@ -254,6 +254,11 @@ Dictionary, List> returnData } else { + if (field is null || value is null) + { + continue; + } + var nestedValue = field.GetValue(value); if (nestedValue != null) { diff --git a/BO4E/BO/BusinessObject.cs b/BO4E/BO/BusinessObject.cs index 583e6ea5..49fce7b7 100644 --- a/BO4E/BO/BusinessObject.cs +++ b/BO4E/BO/BusinessObject.cs @@ -99,6 +99,14 @@ public abstract class BusinessObject : IUserProperties, IOptionalGuid [ProtoIgnore] public const string USER_PROPERTIES_NAME = "userProperties"; + /// + /// define common property name for gueltigkeit + /// + [Newtonsoft.Json.JsonIgnore] + [System.Text.Json.Serialization.JsonIgnore] + [ProtoIgnore] + public const string GUELTIGKEIT_PROPERTIES_NAME = "gueltigkeitszeitraum"; + /// /// generates the BO4E boTyp attribute value (class name as upper case) /// @@ -218,6 +226,37 @@ protected DateTime _TimeStamp [System.Text.Json.Serialization.JsonExtensionData] public IDictionary? UserProperties { get; set; } + /// + /// Defines the validity of a business object in terms of time (maybe multiple versions exist). + /// Background: German market communication requires for master data changes starting 03.04.2025 that business objects are ordered and aggregated by validity (in terms of time). + /// To easily group data based on this data a new zeitraum is introduced as an optional field in all business objects. + /// + [JsonProperty( + PropertyName = GUELTIGKEIT_PROPERTIES_NAME, + Required = Required.Default, + DefaultValueHandling = DefaultValueHandling.Ignore, + Order = 201 + )] + [ProtoMember(201)] + [JsonPropertyName(GUELTIGKEIT_PROPERTIES_NAME)] + [JsonPropertyOrder(201)] + public COM.Zeitraum? Gueltigkeitszeitraum { get; set; } + + /// + /// Defines a level of data quality that is attached to the business object, this can have multiple origins, you could specify a version as draft or uncomplete if this is in the state of creation. + /// Another requirement is coming from german market communictation where business objects of different quality levels need to be grouped. + /// + [JsonProperty( + PropertyName = "qualitaet", + Required = Required.Default, + DefaultValueHandling = DefaultValueHandling.Ignore, + Order = 202 + )] + [JsonPropertyName("qualitaet")] + [ProtoMember(202)] + [JsonPropertyOrder(202)] + public ENUM.Qualitaet? Qualitaet { get; set; } + /// /// true iff any of the keys in is the same as a property name of the class itself. /// Example: diff --git a/BO4E/ENUM/Qualitaet.cs b/BO4E/ENUM/Qualitaet.cs new file mode 100644 index 00000000..65b04e0f --- /dev/null +++ b/BO4E/ENUM/Qualitaet.cs @@ -0,0 +1,39 @@ +using System.Runtime.Serialization; +using ProtoBuf; + +namespace BO4E.ENUM; + +/// Qualitätsstufen eines Business-Objektes, v.a. aus Sicht Marktkommunikation +public enum Qualitaet +{ + /// Vollstaendig + [EnumMember(Value = "VOLLSTAENDIG")] + [ProtoEnum(Name = nameof(Qualitaet) + "_" + nameof(VOLLSTAENDIG))] + VOLLSTAENDIG, + + /// Informativ + /// + [EnumMember(Value = "INFORMATIV")] + [ProtoEnum(Name = nameof(Qualitaet) + "_" + nameof(INFORMATIV))] + INFORMATIV, + + /// Im System vorhanden + [EnumMember(Value = "IM_SYSTEM_VORHANDEN")] + [ProtoEnum(Name = nameof(Qualitaet) + "_" + nameof(IM_SYSTEM_VORHANDEN))] + IM_SYSTEM_VORHANDEN, + + /// Erwartet + [EnumMember(Value = "ERWARTET")] + [ProtoEnum(Name = nameof(Qualitaet) + "_" + nameof(ERWARTET))] + ERWARTET, + + /// Vorlaeufig + [EnumMember(Value = "VORLAEUFIG")] + [ProtoEnum(Name = nameof(Qualitaet) + "_" + nameof(VORLAEUFIG))] + VORLAEUFIG, + + /// Unvollstaendig + [EnumMember(Value = "UNVOLLSTAENDIG")] + [ProtoEnum(Name = nameof(Qualitaet) + "_" + nameof(UNVOLLSTAENDIG))] + UNVOLLSTAENDIG, +} diff --git a/BO4E/protobuf-files/bo4e.proto b/BO4E/protobuf-files/bo4e.proto index 14eaeb63..f1e28494 100644 --- a/BO4E/protobuf-files/bo4e.proto +++ b/BO4E/protobuf-files/bo4e.proto @@ -3,7 +3,6 @@ package bo4e; import "google/protobuf/timestamp.proto"; import "protobuf-net/bcl.proto"; // schema for protobuf-net's handling of core .NET types import "protobuf-net/protogen.proto"; // custom protobuf-net options -import "google/type/timeofday.proto"; enum AbgabeArt { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; @@ -193,6 +192,13 @@ enum BDEWArtikelnummer { BDEWArtikelnummer_ZUSATZDIENSTLEISTUNG_PARAGRAPH_35_2_5_MSBG = 50; BDEWArtikelnummer_ZUSATZDIENSTLEISTUNG_PARAGRAPH_35_3_MSBG = 51; } +message Bankverbindung { + option (.protobuf_net.msgopt).namespace = "BO4E.COM"; + string IBAN = 3; + string Kontoinhaber = 4; + string Bankkennung = 5; + string Bankname = 6; +} enum Bearbeitungsstatus { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; OFFEN = 0; @@ -323,19 +329,14 @@ enum Energierichtung { AUSSP = 0; EINSP = 1; } -enum Erzeugungsart { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - Erzeugungsart_KWK = 0; - Erzeugungsart_WIND = 1; - Erzeugungsart_SOLAR = 2; - Erzeugungsart_KERNKRAFT = 3; - Erzeugungsart_WASSER = 4; - Erzeugungsart_GEOTHERMIE = 5; - Erzeugungsart_BIOMASSE = 6; - Erzeugungsart_KOHLE = 7; - Erzeugungsart_GAS = 8; - Erzeugungsart_SONSTIGE = 9; - Erzeugungsart_SONSTIGE_EEG = 10; +message Erreichbarkeit { + option (.protobuf_net.msgopt).namespace = "BO4E.COM"; + Zeitfenster MontagErreichbarkeit = 3; + Zeitfenster DienstagErreichbarkeit = 4; + Zeitfenster MittwochErreichbarkeit = 5; + Zeitfenster DonnerstagErreichbarkeit = 6; + Zeitfenster FreitagErreichbarkeit = 7; + Zeitfenster Mittagspause = 8; } enum Fernschaltung { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; @@ -344,12 +345,9 @@ enum Fernschaltung { } enum Gasqualitaet { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - option allow_alias = true; Gasqualitaet_ZERO = 0; H_GAS = 1; L_GAS = 2; - HGAS = 1; - LGAS = 2; } enum Gebiettyp { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; @@ -524,10 +522,10 @@ message Geschaeftspartner { Adresse Partneradresse = 18; GrundlageZurVerringerungDerUmlagenNachEnfg GrundlageZurVerringerungDerUmlagenNachEnfg = 19; GrundDerPrivilegierungNachEnFG GrundDerPrivilegierungNachEnFG = 20; - string Title = 1001; Bankverbindung Bankverbindung = 21; string Steuernummer = 22; Erreichbarkeit Erreichbarkeit = 23; + string Title = 1001; } enum Geschaeftspartnerrolle { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; @@ -559,28 +557,6 @@ enum Gueltigkeitstyp { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; NICHT_IN = 0; } -message Bankverbindung { - option (.protobuf_net.msgopt).namespace = "BO4E.COM"; - string Kontonummer = 3; - string Kontoinhaber = 4; - string Bankkennung = 5; - string Bankname = 6; -} -message Erreichbarkeit { - option (.protobuf_net.msgopt).namespace = "BO4E.COM"; - Zeitfenster MontagErreichbarkeit = 3; - Zeitfenster DienstagErreichbarkeit = 4; - Zeitfenster MittwochErreichbarkeit = 5; - Zeitfenster DonnerstagErreichbarkeit = 6; - Zeitfenster FreitagErreichbarkeit = 7; - Zeitfenster Mittagspause = 8; -} -// https://github.com/googleapis/googleapis/blob/master/google/type/timeofday.proto -message Zeitfenster { - option (.protobuf_net.msgopt).namespace = "BO4E.COM"; - google.type.TimeOfDay Startzeit = 3; - google.type.TimeOfDay Endzeit = 4; -} message Hardware { option (.protobuf_net.msgopt).namespace = "BO4E.COM"; Geraetetyp Geraetetyp = 3; @@ -618,7 +594,8 @@ message Konfigurationsprodukt { string Produktcode = 1; string Leistungskurvendefinition = 2; string Schaltzeitdefinition = 3; - Marktteilnehmer Marktpartner = 4; + Marktteilnehmer AuftraggebenderMarktpartner = 4; + Marktrolle EmpfangendeMarktrolle = 5; } enum Kontaktart { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; @@ -965,17 +942,6 @@ enum Lokationstyp { MALO = 0; MELO = 1; } -message Lokationszuordnung { - option (.protobuf_net.msgopt).namespace = "BO4E.BO"; - repeated Marktlokation Marktlokationen = 11; - repeated Messlokation Messlokationen = 12; - repeated Netzlokation Netzlokationen = 13; - repeated TechnischeRessource TechnischeRessourcen = 14; - repeated SteuerbareRessource SteuerebareRessourcen = 15; - repeated Zeitraum Gueltigkeit = 16; - string Zuordnungstyp = 17; - string LokationsbuendelCode = 18; -} message Marktlokation { option (.protobuf_net.msgopt).namespace = "BO4E.BO"; string MarktlokationsId = 4; // default value could not be applied: |null| @@ -999,8 +965,8 @@ message Marktlokation { repeated Netznutzungsabrechnungsdaten Netznutzungsabrechnungsdaten = 37; Sperrstatus Sperrstatus = 38; repeated Konfigurationsprodukt Konfigurationsprodukte = 40; - repeated Lokationszuordnung Lokationszuordnungen = 41; string LokationsbuendelObjektcode = 42; + string VorgelagerteLokationsId = 43; repeated MarktpartnerDetails Marktrollen = 1021; string Regelzone = 1022; string Marktgebiet = 1023; @@ -1095,8 +1061,8 @@ message Messlokation { repeated Zaehlwerk Zaehlwerke = 1022; Betriebszustand Betriebszustand = 1023; repeated Messprodukt Messprodukte = 1024; - repeated Lokationszuordnung Lokationszuordnungen = 1025; string LokationsbuendelObjektcode = 1026; + string VorgelagerteLokationsId = 1027; } message Messlokationszuordnung { option (.protobuf_net.msgopt).namespace = "BO4E.COM"; @@ -1154,20 +1120,6 @@ enum Netzebene { MD = 8; ND = 9; } -message Netzlokation { - option (.protobuf_net.msgopt).namespace = "BO4E.BO"; - string NetzlokationsId = 4; // default value could not be applied: |null| - Sparte Sparte = 5; - Menge Netzanschlussleistung = 6; - string GrundzustaendigerMSBCodeNr = 7; - bool Steuerkanal = 8; - string ObisKennzahl = 9; - Verwendungszweck Verwendungszweck = 10; - repeated Konfigurationsprodukt Konfigurationsprodukte = 11; - Marktrolle EigenschaftMSBLokation = 12; - repeated Lokationszuordnung Lokationszuordnungen = 13; - string LokationsbuendelObjektcode = 14; -} message Netznutzungsabrechnungsdaten { option (.protobuf_net.msgopt).namespace = "BO4E.COM"; string ArtikelId = 4; @@ -1441,13 +1393,6 @@ enum Sparte { Sparte_WASSER = 4; Sparte_ABWASSER = 5; } -enum Speicherart { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - WASSERSTOFFSPEICHER = 0; - PUMPSPEICHER = 1; - BATTERIESPEICHER = 2; - SONSTIGE_SPEICHERART = 3; -} enum Sperrstatus { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; Sperrstatus_ENTSPERRT = 0; @@ -1539,16 +1484,6 @@ message StatusZusatzInformation { StatusArt Art = 1; Status Status = 2; } -message SteuerbareRessource { - option (.protobuf_net.msgopt).namespace = "BO4E.BO"; - string SteuerbareRessourceId = 10; // default value could not be applied: |null| - SteuerkanalsLeistungsbeschreibung SteuerkanalsLeistungsbeschreibung = 11; - string ZugeordnetMSBCodeNr = 12; - repeated Konfigurationsprodukt Konfigurationsprodukte = 13; - Marktrolle EigenschaftMSBLokation = 14; - repeated Lokationszuordnung Lokationszuordnungen = 15; - string LokationsbuendelObjektcode = 16; -} message Steuerbetrag { option (.protobuf_net.msgopt).namespace = "BO4E.COM"; Steuerkennzeichen Steuerkennzeichen = 3; @@ -1559,11 +1494,6 @@ message Steuerbetrag { .bcl.Decimal SteuerwertVorausgezahlt = 8; .bcl.Decimal Sondersteuersatz = 9; } -enum SteuerkanalsLeistungsbeschreibung { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - AN_AUS = 0; - GESTUFT = 1; -} enum Steuerkennzeichen { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; UST_SONDER = 0; @@ -1603,37 +1533,6 @@ enum Tarifzeit { TZ_HT = 1; TZ_NT = 2; } -message TechnischeRessource { - option (.protobuf_net.msgopt).namespace = "BO4E.BO"; - string TechnischeRessourceId = 10; // default value could not be applied: |null| - string VorgelagerteMesslokationsId = 11; - string ZugeordneteMarktlokationsId = 12; - string ZugeordneteSteuerbareRessourceId = 13; - Menge NennleistungAufnahme = 14; - Menge NennleistungAbgabe = 15; - Menge Speicherkapazitaet = 16; - TechnischeRessourceNutzung TechnischeRessourceNutzung = 17; - TechnischeRessourceVerbrauchsart Verbrauchsart = 18; - Waermenutzung Waermenutzung = 19; - EMobilitaetsart EMobilitaetsart = 20; - Erzeugungsart Erzeugungsart = 21; - Speicherart Speicherart = 22; - repeated Lokationszuordnung Lokationszuordnungen = 23; - string LokationsbuendelObjektcode = 24; -} -enum TechnischeRessourceNutzung { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - STROMVERBRAUCHSART = 0; - STROMERZEUGUNGSART = 1; - SPEICHER = 2; -} -enum TechnischeRessourceVerbrauchsart { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - KRAFT_LICHT = 0; - WAERME = 1; - E_MOBILITAET = 2; - STRASSENBELEUCHTUNG = 3; -} enum Titel { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; DR = 0; @@ -1757,7 +1656,6 @@ message Verwendungszweck { } enum Verwendungszweck { option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - option allow_alias = true; NETZNUTZUNGSABRECHNUNG = 0; BILANZKREISABRECHNUNG = 1; MEHRMINDERMENGENABRECHNUNG = 2; @@ -1765,7 +1663,6 @@ enum Verwendungszweck { BLINDARBEITABRECHNUNG_BETRIEBSFUEHRUNG = 4; UEBERMITTLUNG_AN_DAS_HKNR = 5; ERMITTLUNG_AUSGEGLICHENHEIT_BILANZKREIS = 6; - MEHRMINDERMBENGENABRECHNUNG = 2; } message Vorauszahlung { option (.protobuf_net.msgopt).namespace = "BO4E.COM"; @@ -2068,6 +1965,11 @@ enum Zeiteinheit { Zeiteinheit_HALBJAHR = 8; Zeiteinheit_JAHR = 9; } +message Zeitfenster { + option (.protobuf_net.msgopt).namespace = "BO4E.COM"; + int64 Startzeit = 3; + int64 Endzeit = 4; +} message Zeitraum { option (.protobuf_net.msgopt).namespace = "BO4E.COM"; Zeiteinheit Einheit = 3; @@ -2093,38 +1995,3 @@ message Zustaendigkeit { string Abteilung = 4; string Themengebiet = 5; } - -enum EEGVermarktungsform { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - AUSFALLVERGUETUNG = 0; - MARKTPRAEMIE = 1; - SONSTIGE = 2; - KWKG_VERGUETUNG = 3; -} - -enum FernsteuerbarkeitStatus { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - NICHT_FERNSTEUERBAR = 0; - TECHNISCH_FERNSTEUERBAR = 1; - LIEFERANT_FERNSTEUERBAR = 2; -} - -message Einspeisung { - option (.protobuf_net.msgopt).namespace = "BO4E.BO"; - string MarktlokationsId = 10; - string TrancheId = 101; - Geschaeftspartnerrolle Verguetungsempfaenger = 11; - EEGVermarktungsform EEGVermarktungsform = 12; - Landescode Landescode = 13; - FernsteuerbarkeitStatus FernsteuerbarkeitStatus = 14; -} - -enum Profilart { - option (.protobuf_net.enumopt).namespace = "BO4E.ENUM"; - option (.protobuf_net.enumopt).name = "Profilart"; - ART_STANDARDLASTPROFIL = 0; // Z02 - ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL = 1; // Z03 - ART_LASTPROFIL = 2; // Z12 - ART_STANDARDEINSPEISEPROFIL = 3; // Z04 - ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL = 4; // Z05 -} \ No newline at end of file